본문으로 건너뛰기
cccskills
무료GitHub에 공개

release-codexbar

Guide a macOS app release through versioning, signing, Apple notarization, update feed checks, and Homebrew updates. Includes CodexBar release scripts, published asset verification, and preparation of the next unreleased version.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

원문원문 설명 보기

CodexBar release: versioning, notarization, appcast, Homebrew, post-release bump.

연동 도구GitHub
설치 방법 보기

이럴 때 유용합니다

  • Releasing a signed and notarized macOS app
  • Verifying update feeds and published release assets
  • Updating Homebrew app and CLI packages
  • Preparing the next unreleased version

포함된 파일(1)

  • SKILL.md5.7 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

CodexBar Release

Use for releasing signed/notarized macOS apps, especially repos with Sparkle appcasts and Homebrew casks.

Start

  1. Work from the app repo unless asked otherwise.
  2. Check repo state, current version, latest tag/release, and release docs/scripts.
  3. Confirm CHANGELOG.md is complete, user-facing, deduped, and dated for the release.
  4. Prefer the repo release script; patch small script/test blockers instead of bypassing the release path.
  5. Never print key material. Keep 1Password references and local key paths as references only.
  6. Load $release-private if it exists before resolving Peter-owned credential locators.

Key Material

Use $one-password for secret handling. op only in tmux/persistent shell; no broad env, set, export -p, or secret scans.

Known App Store Connect shape:

  • fields: private_key_p8, key_id, issuer_id
  • keep all three fields from the same 1Password item; do not mix with stale values from ~/.profile
  • resolve Peter-owned item refs from $release-private

Known Sparkle key:

  • resolve the private key file from $release-private
  • pass as SPARKLE_PRIVATE_KEY_FILE

Safe env file pattern:

APP_STORE_CONNECT_API_KEY_P8=<1Password ref from release-private>
APP_STORE_CONNECT_KEY_ID=<1Password ref from release-private>
APP_STORE_CONNECT_ISSUER_ID=<1Password ref from release-private>
SPARKLE_PRIVATE_KEY_FILE=<path from release-private>

Run with op run --account my.1password.com --env-file <file> -- <script>, then delete the temp env file.

CodexBar

Paths:

  • repo: ~/Projects/codexbar
  • release script: Scripts/release.sh
  • signing/notarization: Scripts/sign-and-notarize.sh
  • appcast: Scripts/make_appcast.sh, appcast.xml
  • release assets: CodexBar-macos-universal-<version>.zip, CodexBar-macos-universal-<version>.dSYM.zip
  • packaged app: CodexBar.app
  • version file: version.env
  • changelog: CHANGELOG.md
  • Homebrew tap: ~/Projects/homebrew-tap
  • cask: ~/Projects/homebrew-tap/Casks/codexbar.rb
  • formula: ~/Projects/homebrew-tap/Formula/codexbar.rb
  • CLI release workflow: .github/workflows/release-cli.yml

Normal release:

tmux new-session -d -s codexbar-release 'op run --account my.1password.com --env-file /tmp/codexbar-release-op.env -- Scripts/release.sh'
tmux attach -t codexbar-release

If notarization fails with 401 Unauthenticated, rerun using all three App Store Connect fields from the 1Password item above. Mismatched key_id / issuer_id from ~/.profile can cause this.

If widget metadata generation times out, CODEXBAR_WIDGET_METADATA_TIMEOUT_SECONDS=600 is a known-good floor.

CodexBar CLI tarballs are not produced by Scripts/release.sh itself. The GitHub release event triggers .github/workflows/release-cli.yml, which builds and uploads:

  • CodexBarCLI-v<version>-macos-arm64.tar.gz
  • CodexBarCLI-v<version>-macos-x86_64.tar.gz
  • CodexBarCLI-v<version>-linux-aarch64.tar.gz
  • CodexBarCLI-v<version>-linux-x86_64.tar.gz
  • matching .sha256 files

If the workflow fails only in update-homebrew-tap with GitHub API rate limiting, the CLI assets may already be uploaded. Verify assets live, then update Formula/codexbar.rb manually from the tarball checksums.

Verify

Release is not done until the published chain checks out:

gh release view v<VERSION> --json tagName,name,isDraft,isPrerelease,url,assets,body
Scripts/check-release-assets.sh v<VERSION>
python3 - <<'PY'
import xml.etree.ElementTree as ET
ns={'sparkle':'http://www.andymatuschak.org/xml-namespaces/sparkle'}
root=ET.parse('appcast.xml').getroot()
item=root.find('channel').find('item')
enc=item.find('enclosure')
print(item.findtext('title'))
print(item.findtext('sparkle:version', namespaces=ns))
print(item.findtext('sparkle:shortVersionString', namespaces=ns))
print(enc.attrib.get('url'))
print(enc.attrib.get('length'))
print(bool(enc.attrib.get('{http://www.andymatuschak.org/xml-namespaces/sparkle}edSignature')))
PY
codesign --verify --deep --strict --verbose=2 CodexBar.app
spctl --assess --type execute --verbose CodexBar.app

For Homebrew:

shasum -a 256 CodexBar-macos-universal-<VERSION>.zip
cd /Users/steipete/Projects/homebrew-tap
python3 .github/scripts/update_formula.py --formula codexbar --tag v<VERSION> --repository steipete/CodexBar --artifact-template 'CodexBarCLI-{tag}-{target}.tar.gz' --target-aliases 'darwin_arm64=macos-arm64,darwin_amd64=macos-x86_64,linux_arm64=linux-aarch64,linux_amd64=linux-x86_64'
brew fetch --cask --force --retry codexbar
brew fetch --formula --force --retry steipete/tap/codexbar

Update the cask when app zip assets exist. Update the formula only when standalone CLI tarballs for that version exist.

Tap audit can be noisy from unrelated formulae; keep evidence specific to the app cask.

Closeout

  1. Create/push tag and GitHub release through the release script.
  2. Verify appcast points to the new GitHub release asset with signature and length.
  3. Update/push the Homebrew cask if the app zip changed.
  4. Bump the app repo to next patch Unreleased:
    • version.env: next MARKETING_VERSION, next BUILD_NUMBER
    • CHANGELOG.md: top ## <next> — Unreleased
  5. Commit, push, then pull --ff-only.
  6. Restart the local app from the packaged bundle and verify the running bundle version.
  7. Check no release/notary/op temp sessions or temp env files remain.

CodexBar restart:

pkill -x CodexBar || pkill -f CodexBar.app || true
cd "$(git rev-parse --show-toplevel)"
open -n CodexBar.app
/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' CodexBar.app/Contents/Info.plist
/usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' CodexBar.app/Contents/Info.plist

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

codexbar

무료

Read provider usage, limits, credits, and installation or configuration health through CodexBar. Returns JSON for enabled providers or a selected provider, while hiding secrets and leaving configuration and authentication unchanged.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Checking usage and limits across enabled providers
  • Checking credits for a selected provider
  • Diagnosing installation or configuration health
steipete/CodexBar2.3만2026년 10월 17일 업데이트

qa-test

무료

Test CodexBar against real provider services, check application settings, and verify menu contents. Use command-line checks and visual evidence to distinguish authentication problems, API mismatches, and display issues before a release.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Checking provider connections before a release
  • Investigating missing usage data or authentication failures
  • Comparing menu contents with enabled providers
steipete/CodexBar2.3만2026년 10월 17일 업데이트

steipete의 스킬 모두 보기

이 스킬의 문제 신고