Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
972 commits
Select commit Hold shift + click to select a range
f642907
build: allow slow widget metadata builds
steipete May 15, 2026
3132250
docs: update appcast for 0.26.1
steipete May 15, 2026
3be1586
Start 0.26.2 development
steipete May 15, 2026
e3b80b1
Harden CodexBar CLI release assets
steipete May 15, 2026
0727018
test: isolate switcher refresh test from background refresh
steipete May 15, 2026
450bb8d
test: make switcher refresh test deterministic
steipete May 15, 2026
1763979
fix: preserve usage after transient timeouts
steipete May 15, 2026
cee403b
feat: reuse inline usage dashboards
steipete May 15, 2026
91cf1a3
fix: show Claude spend limit metric
steipete May 15, 2026
0a59284
test: cover Claude Team dashboard URL
steipete May 15, 2026
d16b41b
fix: fall back for Ollama browser sessions
steipete May 15, 2026
e059a78
fix: wait for Claude usage values
steipete May 15, 2026
b222db2
fix: clarify Claude session pace text
steipete May 15, 2026
a3f3e2a
test: keep Claude dashboard regression compact
steipete May 15, 2026
ffe10d5
fix: preserve Claude data across transient refresh failures
steipete May 15, 2026
ebc9ba4
feat: add ElevenLabs usage provider
steipete May 15, 2026
6304fec
fix: avoid widget metadata timeout during dev restarts
steipete May 15, 2026
38ed2aa
fix: shorten OpenAI provider label
steipete May 15, 2026
60f4a4e
Prefer Codex last token usage for cost scanning (#968)
Ifan24 May 16, 2026
bf4424b
Clarify unofficial Kimi K2 provider (#967)
mturac May 16, 2026
d5f1c58
fix: separate Claude plan utilization history
steipete May 16, 2026
aa8977e
feat: add Claude Admin API usage source
steipete May 16, 2026
0348028
feat: add Grok provider support
taibaran May 16, 2026
23a89fb
feat: add config API key CLI (#978)
steipete May 16, 2026
d93cfc9
test: include Grok in provider order expectation
steipete May 16, 2026
567ac94
fix(grok): treat expired credentials as missing in fetch (#976)
taibaran May 16, 2026
c6392ed
fix: label Claude extra usage monthly cap (#980)
steipete May 16, 2026
a80d7ba
test: stabilize status menu switcher refresh (#983)
steipete May 16, 2026
53d675f
Block OpenCode Go redirect cookie leakage (#979)
steipete May 16, 2026
be0ceed
ci: run push CI on slash branches (#981)
steipete May 16, 2026
6498d20
fix: improve managed Codex login recovery (#982)
steipete May 16, 2026
6a1eae2
feat(grok): add web billing fallback (#987)
steipete May 16, 2026
8132f7c
feat(cli): add provider config toggles
steipete May 16, 2026
a75d276
fix: recover missing menu bar status item
steipete May 16, 2026
645ca83
MiniMax: fix remains-to-used mapping and add quota-style usage cards …
Yuxin-Qiao May 16, 2026
eef4e1f
Localize provider storage setting
tanish19078 May 16, 2026
7c59f8e
docs: credit provider storage localization
steipete May 16, 2026
f6a0f70
Document ElevenLabs provider
tanish19078 May 16, 2026
8c29b3b
docs: polish ElevenLabs setup docs
steipete May 16, 2026
e5eb944
fix(cli): validate serve host headers
steipete May 16, 2026
fcbd46f
fix: recover status item after display changes
steipete May 16, 2026
f86abe2
docs: refresh landing page provider logos
steipete May 16, 2026
f934467
fix: harden provider timeout handling
steipete May 16, 2026
654c98a
chore: start 0.27.0 development
steipete May 16, 2026
f23a478
fix: accept OpenAI cost string values
steipete May 16, 2026
7b19aa1
fix: stabilize refresh menu row
steipete May 16, 2026
150c5ab
docs: point Linux users at codexbar-waybar
Marouan-chak May 16, 2026
7291084
feat: add Kiro overage menu bar modes
raflyazf May 16, 2026
ee96d84
feat: show quota warning account
raflyazf May 17, 2026
f62bb8c
feat: add shared provider HTTP transport
serezha93 May 17, 2026
ad33b32
refactor: centralize provider HTTP responses
steipete May 17, 2026
d78a770
fix: dedupe copied Claude transcript history
steipete May 17, 2026
9a369ad
feat: add Deepgram usage tracking
steipete May 17, 2026
3ce4101
fix: bound provider HTTP timeouts
steipete May 17, 2026
1e80b73
fix: fall back from blank localized strings
steipete May 17, 2026
d24664b
feat: show OpenCode Zen balance
steipete May 17, 2026
51d6c12
fix: reduce idle menu CPU
steipete May 17, 2026
9cd91d6
fix: improve overview menu responsiveness
steipete May 17, 2026
af202b4
feat: add MiniMax billing summaries
steipete May 17, 2026
52b5c0c
fix: harden subprocess timeouts
steipete May 17, 2026
2c687f8
fix: keep provider HTTP stubs testable
steipete May 17, 2026
faf0be9
test: future-proof provider order expectation
steipete May 17, 2026
e736582
fix: keep CI Linux builds portable
steipete May 17, 2026
ddfc7f5
fix: expose URLSession response helper on Linux
steipete May 17, 2026
eed34a7
fix: improve Codex account switcher state
steipete May 17, 2026
860bab6
perf: skip unchanged provider icon redraws
steipete May 17, 2026
eab99cc
build: keep release builds warning-free
steipete May 17, 2026
f30d264
docs: reorder 0.27 changelog
steipete May 17, 2026
a86b3f8
docs: refresh provider and CLI docs
steipete May 17, 2026
fce9c0d
docs: finalize 0.27.0 changelog
steipete May 17, 2026
036b497
Fix Codex cost attribution for long turn contexts
hhh2210 May 18, 2026
a18dd4a
fix: rebuild menu after switching with submenu open
steipete May 18, 2026
dd2b3cc
Add Codex JSONL shape benchmark (#1017)
hhh2210 May 18, 2026
599c017
[codex] Show weekly pace detail in Codex menu (#1009)
zhulijin1991 May 18, 2026
2f13f3e
fix: export all Codex accounts from CLI
steipete May 18, 2026
d715648
feat: expand provider usage tracking
steipete May 18, 2026
0008cc5
fix(ui): collapse duplicate utilization tabs (#1027)
ngutman May 18, 2026
69de57b
perf: speed up Codex cost scanner
steipete May 18, 2026
5d75d9c
docs: prepare 0.27.0 changelog
steipete May 18, 2026
c20d4f4
docs: finalize 0.27.0 changelog
steipete May 18, 2026
20d93e4
docs: update appcast for 0.27.0
steipete May 18, 2026
f57bd16
style: apply release formatting
steipete May 18, 2026
fd0072a
fix: build Codex cost scanner on Linux
steipete May 18, 2026
60caff2
chore: start 0.27.1 development
steipete May 18, 2026
7e97d2b
ci: update Homebrew cask during releases
steipete May 18, 2026
5aded29
fix: auto-invalidate Codex cost cache
steipete May 19, 2026
235c425
fix: prevent Claude URL handler registration
steipete May 20, 2026
ff1a169
Reduce OpenAI dashboard scrape payload
jb510 May 18, 2026
5aca0cd
docs: add OpenAI scrape changelog
steipete May 20, 2026
354e0b6
Fix Claude usage loading stalls
rohitjavvadi May 18, 2026
ef2e35f
Fix auto Claude CLI timeout retry
rohitjavvadi May 18, 2026
1dd2804
fix: harden Claude CLI loading retry
steipete May 20, 2026
8e8b740
fix: avoid blocked Codex CLI auto launch
steipete May 20, 2026
bdba75f
fix: wait for manual Codex token refresh
steipete May 20, 2026
a541828
fix: detect Antigravity 2 language server
steipete May 20, 2026
daaa271
feat: add Azure OpenAI provider
steipete May 20, 2026
3ee8743
feat: add Spanish and Catalan localizations
seifreed May 20, 2026
d8b6892
docs: add merge vision
steipete May 20, 2026
f3315bb
Fix fork roadmap upstream strategy link (#1029)
ankitvd6 May 20, 2026
9838c63
docs: surface Disable Keychain Access toggle as escape hatch for repe…
joymadhu49 May 20, 2026
2b58004
Fix ElevenLabs progress contrast (#1055)
vyctorbrzezowski May 20, 2026
3c71183
Fix LLM Proxy fractional reset times (#1022)
rohitjavvadi May 20, 2026
b3bc7ee
fix: clarify missing CLI guidance (#1030)
rohitjavvadi May 20, 2026
f18494f
fix: support antigravity 2 oauth discovery (#1053)
vyctorbrzezowski May 20, 2026
ff21e8e
Add GNOME Shell extension link on README (#1064)
jaimegh-es May 20, 2026
2c8d83c
fix: honor Codex OAuth source for credits refresh (#1054)
soumikbhatta May 20, 2026
1564ca5
docs: update changelog
steipete May 20, 2026
85d7588
fix: avoid recounting repeated Codex token snapshots
steipete May 20, 2026
2e4cb42
fix: verify stale Antigravity cloud quotas
steipete May 20, 2026
09c02de
Remove obsolete peak-hours indicator (#1025)
rohitjavvadi May 20, 2026
305b6eb
fix: avoid linux libxml2 runtime link
steipete May 20, 2026
995b4bf
docs: start 0.28.0 changelog
steipete May 20, 2026
e3aa3b8
Fix stable menu action rows (#1072)
MadanChaollaPark May 21, 2026
0e280a4
fix: recover menu bar icon after display unplug
steipete May 21, 2026
9857e1d
Add Ollama API key support (#1087)
steipete May 21, 2026
7e78f3d
Fix Antigravity OAuth client discovery (#1090)
steipete May 21, 2026
bef9269
fix: localize provider detail strings (#1092)
steipete May 21, 2026
95dabbd
Fix OpenAI dashboard reset-line parser for Wednesday and Saturday
m1qaweb May 21, 2026
d9b607b
fix: clean up PTY child process trees (#1093)
steipete May 21, 2026
cea20ca
MiniMax: add tests for coding plan title propagation (#1083)
Yuxin-Qiao May 21, 2026
5586914
fix: accept first click in Codex account switcher (#1079)
ptstory May 21, 2026
668f6be
MiniMax: filter failed billing records from history aggregation (#1089)
Yuxin-Qiao May 21, 2026
4daacac
build: use shared mac release tooling
steipete May 21, 2026
26dad69
build: add mac release manifest
steipete May 21, 2026
53a7f22
Restore full-width provider switcher quota bars (#1094)
bcharleson May 21, 2026
d5bf269
perf: suppress redundant icon observer callbacks (#1081)
ptstory May 21, 2026
4bf5ccb
provider: t3.chat (#1091)
Quicksaver May 21, 2026
823157f
chore: prepare 0.28.0 release
steipete May 21, 2026
d692462
ci: match release precheck test mode
steipete May 22, 2026
38afd81
fix: stabilize OpenAI webview idle teardown
steipete May 22, 2026
4502b52
test: stabilize codex account refresh tests
steipete May 22, 2026
608852a
fix: stabilize OpenAI webview expiry scheduling
steipete May 22, 2026
855945a
fix: stabilize OpenAI webview navigation timers
steipete May 22, 2026
2db843a
docs: update appcast for 0.28.0
steipete May 22, 2026
edc6fcb
chore: start 0.28.1 development
steipete May 22, 2026
d34f98d
test: cover Kimi primary-only icon progress
Yuxin-Qiao May 22, 2026
84bd294
feat: show OpenCode renewal dates
Yuxin-Qiao May 22, 2026
dadaf07
docs: note OpenCode renewal dates
steipete May 22, 2026
c305858
fix: retry menu bar display recovery
steipete May 22, 2026
c2d52ff
fix: preserve Codex account snapshots on network failure
steipete May 22, 2026
25100c5
UsageStore: preserve snapshots for more network failures (#1101)
Yuxin-Qiao May 22, 2026
e7ea877
docs: thank snapshot preservation contributor
steipete May 22, 2026
b2bc921
Add Alibaba Token Plan provider (#1098)
YanxinXue May 22, 2026
b020dff
docs: note Alibaba token plan provider
steipete May 22, 2026
69da0e3
fix: derive signing team id from certificate ou
steipete May 22, 2026
573652a
i18n: improve Simplified Chinese localization (#1059)
narallee May 22, 2026
2593686
docs: thank Chinese localization contributor
steipete May 22, 2026
123fe84
feat: add aur package for arch linux (#1036)
Herbrant May 22, 2026
68a6b23
docs: note Tahoe widget VM verification
steipete May 22, 2026
fd4878b
fix: harden Alibaba token plan endpoint overrides
YanxinXue May 22, 2026
97f9ecb
fix: avoid quote cleanup crash in settings readers
m1qaweb May 22, 2026
097d502
docs: update changelog for settings quote fix
steipete May 22, 2026
cdb6acb
feat: show Codex standard and fast cost splits
iam-brain May 22, 2026
9aed16d
chore: prepare 0.29.0 release
steipete May 22, 2026
4f79445
style: format Alibaba token plan cookie headers
steipete May 22, 2026
bffa0fa
test: stabilize Codex RPC stub startup
steipete May 22, 2026
41a0c96
test: relax JSONL benchmark ratio guard
steipete May 22, 2026
86e643a
test: stabilize subprocess timeout bound
steipete May 22, 2026
e92ba0b
test: isolate flaky release tests
steipete May 22, 2026
98dbc0f
test: wait longer for historical pace writes
steipete May 22, 2026
a383026
test: relax subprocess timeout stress bound
steipete May 22, 2026
f61469c
docs: update appcast for 0.29.0
steipete May 22, 2026
17b0651
chore: start 0.29.1 development
steipete May 22, 2026
de7c25b
Show extra-usage spend text in menu bar for Claude/Cursor (#1107)
Yuxin-Qiao May 22, 2026
c2b63a0
perf: background credits and dashboard fetch for regular refreshes (#…
ptstory May 22, 2026
e9b7e25
Display: add workday segmentation for weekly progress bars (#1102)
Yuxin-Qiao May 22, 2026
7754035
fix: read OpenCode Go usage from local data (#1021)
sopenlaz0 May 22, 2026
11f9206
Claude: normalize OAuth extra usage spend limit from minor units (#1114)
Yuxin-Qiao May 23, 2026
2dc7aa0
Add Noctalia integration (#1115)
rayoplateado May 23, 2026
2ff00f6
Provider switcher: compact multi-row layout (#1113)
Yuxin-Qiao May 23, 2026
e79badf
fix: use Groq logo for Groq provider icon (#1112)
kiankyars May 23, 2026
94f831a
Retry transient OpenAI usage failures (#1117)
steipete May 23, 2026
22cf7d4
fix: preserve menu bar item identity
lederniermagicien May 23, 2026
126dc92
fix: handle Claude CLI subscription usage output
Yuxin-Qiao May 23, 2026
3c0dbe9
feat: add Traditional Chinese localization
ilyaliao May 24, 2026
4f60fd1
fix(codex): handle non-app spctl assessment
hhh2210 May 24, 2026
f4a2a6a
chore(skills): add repo release skill
steipete May 25, 2026
ef2a145
docs(skills): defer private release locators
steipete May 25, 2026
49919c6
Fix Codex fork overcount when parent logs are missing
jskoiz May 26, 2026
6d0df07
Keep legacy credentials when config save fails
RajvardhanPatil07 May 26, 2026
c644f68
Make Grok usage labels follow reset windows
kiankyars May 26, 2026
5d74e37
docs: finalize 0.29.1 changelog
steipete May 26, 2026
6c4855f
test: stabilize background refresh coalescing tests
steipete May 26, 2026
6cc3fbb
test: harden OpenAI web refresh scheduling test
steipete May 26, 2026
333d584
docs: update appcast for 0.29.1
steipete May 26, 2026
7c75157
chore: start 0.29.2 development
steipete May 26, 2026
2deb0f5
Improve Simplified Chinese (zh-Hans) localization for visible UI (#1145)
Yuxin-Qiao May 26, 2026
bba6453
Improve Traditional Chinese localization wording (#1158)
jack24254029 May 26, 2026
a56340c
Harden Release CLI manual dispatch (#1154)
jskoiz May 26, 2026
8fccb45
fix: unify provider cost cards (#1163)
LeoLin990405 May 26, 2026
9045495
fix: handle provider switcher shortcuts in open menu (#1157)
anirudhvee May 26, 2026
996dd5b
test: add provider label metadata characterization (#1135)
Yuxin-Qiao May 26, 2026
3be413f
fix: update Alibaba Token Plan usage API (#1142)
YanxinXue May 26, 2026
87cea91
feat: enable Ollama pace prediction (#1136)
bdamokos May 26, 2026
6253587
fix: polish Simplified Chinese localization (#1165)
fanfanci May 26, 2026
1890469
fix: refresh expired StepFun tokens
LeoLin990405 May 26, 2026
45b68c3
fix: prevent Codex fork replay overcount
xx205 May 26, 2026
807d07d
feat: scope OpenAI usage by project
mstallone May 26, 2026
92598f8
feat: add DeepSeek usage summaries
steipete May 27, 2026
6665d02
fix: repair hidden menu bar visibility defaults
steipete May 27, 2026
a001d10
Fix Codex CLI login guidance
jskoiz May 27, 2026
3429750
docs: credit Codex CLI login guidance
steipete May 27, 2026
9bd6b7e
Show tertiary widget usage rows
LeoLin990405 May 27, 2026
84d8f50
docs: credit tertiary widget rows
steipete May 27, 2026
352f0b1
Expose Antigravity per-model quota windows
guhyun9454 May 27, 2026
1f00e75
docs: credit Antigravity quota windows
steipete May 27, 2026
83ffae3
fix: soften quota warning markers
steipete May 27, 2026
78c8c0b
Add redacted MiniMax diagnostic export foundation (#1128)
Yuxin-Qiao May 27, 2026
487a78c
fix: build widget as app extension
steipete May 27, 2026
589b77c
fix: clean up AppKit state on quit
steipete May 27, 2026
a8005ba
chore: prepare 0.30.0 release
steipete May 27, 2026
2c8021b
test: harden release gate timing
steipete May 27, 2026
81cf30a
docs: update appcast for 0.30.0
steipete May 27, 2026
79f61e6
chore: start 0.30.1 development
steipete May 27, 2026
83ed8e4
feat: generalize diagnostic exports
steipete May 27, 2026
08a7ef4
Update Homebrew cask install command
SSakutaro May 27, 2026
63d9373
fix: stop display-change recovery retry churn
diazdesandi May 28, 2026
db80733
Fix provider sidebar trailing control spacing (#1183)
Yuxin-Qiao May 28, 2026
0a0e8ca
Improve Claude OAuth 429 rate limit handling (#1179)
LeoLin990405 May 28, 2026
9f5813e
docs: update 0.30.0 release notes
steipete May 28, 2026
f96201e
chore: release 0.30.1
steipete May 28, 2026
14b2b25
docs: update appcast for 0.30.1
steipete May 28, 2026
dcd4316
chore: start 0.30.2 development
steipete May 28, 2026
529e255
fix: coalesce visible menu rebuilds
steipete May 28, 2026
afe4e80
feat: show Codex Spark usage
LeoLin990405 May 28, 2026
c6ad990
fix: hide obsolete Claude Design quota lane
steipete May 28, 2026
e2c2912
test: guard keychain prompt safety
steipete May 28, 2026
c3bc1ad
feat: support Bedrock AWS profile auth (#1190)
oleksandr-soldatov May 28, 2026
ff2fc13
feat: localize popup and provider settings UI (#1181)
jack24254029 May 28, 2026
857f4fa
fix: surface managed Codex login output
steipete May 28, 2026
f82ac6a
Merge remote-tracking branch 'origin/main' into update-official-codex…
steipete May 28, 2026
666a77e
docs: thank Homebrew cask contributor
steipete May 28, 2026
1137192
Merge pull request #1189 from SSakutaro/update-official-codexbar-cask
steipete May 28, 2026
ca63a8e
fix: make cost usage scans cancellation-aware
steipete May 28, 2026
61d5a21
Complete Brazilian Portuguese (pt-BR) localization
ManuzimFerreira May 27, 2026
2dec771
docs: update changelog for pt-BR localization
steipete May 28, 2026
1115d2d
Merge pull request #1188 from ManuzimFerreira/complete-pt-br-localiza…
steipete May 28, 2026
97e3b58
Add Swedish localization
May 27, 2026
84154de
docs: update changelog for Swedish localization
steipete May 28, 2026
8579740
Merge pull request #1186 from yeager/add-swedish-localization
steipete May 28, 2026
fd33445
fix: show Spark weekly Codex quota
steipete May 28, 2026
78ffa5e
chore: prepare 0.31.0 release
steipete May 28, 2026
24b96c0
test: stabilize release precheck
steipete May 28, 2026
56261df
test: stabilize open menu refresh test
steipete May 28, 2026
f83fb70
docs: update appcast for 0.31.0
steipete May 28, 2026
6fe0105
chore: start 0.31.1 development
steipete May 28, 2026
118f660
Merge upstream/main into fork (sync to upstream 0.31.1)
johnlarkin1 May 29, 2026
eb255ab
fix: normalize merged Sources to upstream baseline + macOS 26.4 compi…
johnlarkin1 May 29, 2026
e87e80d
feat: re-apply color-coded icons + separator style on upstream 0.31.1
johnlarkin1 May 29, 2026
07a8d45
test: add coverage for color-coded icons and separator style
johnlarkin1 May 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
141 changes: 141 additions & 0 deletions .agents/skills/release-codexbar/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
---
name: release-codexbar
description: "CodexBar release: versioning, notarization, appcast, Homebrew, post-release bump."
---

# 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:

```text
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:

```bash
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:

```bash
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:

```bash
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:

```bash
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
```
52 changes: 44 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,17 @@ name: CI

on:
push:
branches: ["*"]
branches: ["**"]
pull_request:

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
lint-build-test:
runs-on: macos-latest
runs-on: macos-15-intel
timeout-minutes: 70
steps:
- uses: actions/checkout@v6

Expand Down Expand Up @@ -36,9 +41,12 @@ jobs:
run: ./Scripts/lint.sh lint

- name: Swift Test
run: swift test --no-parallel
timeout-minutes: 60
run: |
python3 Scripts/ci_swift_test_by_suite.py --group-size 1 --timeout 120

build-linux-cli:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
Expand All @@ -57,11 +65,39 @@ jobs:
uname -a
uname -m

- name: Setup Swift 6.2.1
uses: swift-actions/setup-swift@v3
with:
swift-version: "6.2.1"
skip-verify-signature: true
- name: Install Swift 6.2.1 via swiftly
shell: bash
run: |
set -euo pipefail

if ! command -v gpg >/dev/null 2>&1; then
sudo apt-get update
sudo apt-get install -y ca-certificates gpg
fi

SWIFTLY_ARCH="$(uname -m)"
SWIFTLY_HOME_DIR="$HOME/.local/share/swiftly"
SWIFTLY_BIN_DIR="$HOME/.local/bin"
POST_INSTALL_SCRIPT="$(mktemp)"

mkdir -p "$SWIFTLY_BIN_DIR"
curl -fsSL "https://download.swift.org/swiftly/linux/swiftly-${SWIFTLY_ARCH}.tar.gz" -o /tmp/swiftly.tar.gz
tar -xzf /tmp/swiftly.tar.gz -C /tmp
/tmp/swiftly init --assume-yes --skip-install

. "$SWIFTLY_HOME_DIR/env.sh"
echo "$SWIFTLY_BIN_DIR" >> "$GITHUB_PATH"
echo "SWIFTLY_HOME_DIR=$SWIFTLY_HOME_DIR" >> "$GITHUB_ENV"
echo "SWIFTLY_BIN_DIR=$SWIFTLY_BIN_DIR" >> "$GITHUB_ENV"

swiftly install 6.2.1 --use --assume-yes --post-install-file "$POST_INSTALL_SCRIPT"
if [[ -s "$POST_INSTALL_SCRIPT" ]]; then
sudo apt-get update
sudo bash "$POST_INSTALL_SCRIPT"
fi

hash -r
swift --version

- name: Build CodexBarCLI (release, static Swift stdlib)
run: swift build -c release --product CodexBarCLI --static-swift-stdlib
Expand Down
Loading