Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
623 commits
Select commit Hold shift + click to select a range
37c8e8c
Gate readiness baseline resync on fresh visible menu content (#1351)
Yuxin-Qiao Jun 8, 2026
463ec91
fix: speed up merged provider switching
steipete Jun 8, 2026
1818638
Merge pull request #1355 from Yuxin-Qiao/perf/cache-localized-bundle
steipete Jun 8, 2026
c81a9f2
Merge pull request #1352 from Yuxin-Qiao/perf/hosted-chart-measure
steipete Jun 8, 2026
7e73b41
fix: handle pending menu readiness observer
steipete Jun 8, 2026
c87bc55
fix: invalidate sibling menus for readiness observer
steipete Jun 8, 2026
edc4f15
fix: preserve in-flight menu refresh handling
steipete Jun 8, 2026
6b5191e
fix: keep menu observation invalidation after readiness consume
steipete Jun 8, 2026
2bcd223
fix: track menu readiness baseline version
steipete Jun 8, 2026
534d8e8
fix: advance readiness baseline version on equal signature
steipete Jun 8, 2026
16287c0
fix: track rendered menu readiness signatures
steipete Jun 8, 2026
1b0b1d6
fix: repair equal-signature menu readiness reopen
steipete Jun 8, 2026
322c8f8
Merge pull request #1351 from Yuxin-Qiao/perf/menu-readiness-signature
steipete Jun 8, 2026
7b6b02d
Merge pull request #1354 from jskoiz/fix/defer-status-menu-quit
steipete Jun 8, 2026
8448b81
docs: update changelog for menu performance fixes
steipete Jun 8, 2026
100c8d3
style: format status controller declarations
steipete Jun 8, 2026
9778128
perf: eliminate merged menu switching hangs
steipete Jun 9, 2026
d7b58a0
docs: finalize 0.32.5 changelog
steipete Jun 9, 2026
c3a8793
style: apply release formatting
steipete Jun 9, 2026
920997c
docs: update appcast for 0.32.5
steipete Jun 9, 2026
a4f278d
chore: start 0.32.6 development
steipete Jun 9, 2026
f91d779
Add T3 Chat to the README (#1361)
Quicksaver Jun 10, 2026
6f6cb09
Fix Antigravity summaries for untracked quotas (#1369)
Martin-Hausleitner Jun 10, 2026
20004f3
fix: correct Claude usage pricing (#1372)
steipete Jun 10, 2026
e97bfb0
fix: defer tracked menu refresh rebuilds (#1376)
jangisaac-dev Jun 10, 2026
050b139
feat: support more MiMo browsers (#1350)
Yuxin-Qiao Jun 10, 2026
f51db0e
fix: add Claude web session recovery action (#1378)
LeoLin990405 Jun 10, 2026
7c0ed03
perf: reuse hosted chart submenus (#1384)
steipete Jun 10, 2026
1246ec6
Fix: schedule idle prune so cached dashboard WebViews are evicted (#1…
naoterumaker Jun 10, 2026
a317098
Fix Doubao false 100% request usage (#1383)
LeoLin990405 Jun 10, 2026
4c092ce
fix(menu): defer copy-icon click work off the NSMenu tracking loop (m…
LeoLin990405 Jun 10, 2026
2e42427
Add configurable terminal app for Open Terminal (#1225)
Yuxin-Qiao Jun 10, 2026
a6bb677
Fix Copilot unlimited chat quota display (#1320)
soumikbhatta Jun 10, 2026
f561834
Avoid repeated CodexBarCache keychain prompts in dev builds (#1271)
Yuxin-Qiao Jun 10, 2026
2eaa313
Make Augment keepalive stop idempotent (#1262)
ProspectOre Jun 10, 2026
04ac21c
Add Japanese (ja) localization (#1385)
naoterumaker Jun 10, 2026
2ed15bf
perf: defer overview provider rebuild (#1391)
steipete Jun 10, 2026
08c171b
[security] fix(providers): guard credentialed redirects (#1237)
Hinotoi-agent Jun 10, 2026
71a38c2
fix: keep Codex cost visible without quotas (#1390)
vaibhavarora14 Jun 10, 2026
cde92cf
perf: add menu chart render timing logs (#1366)
scheinms Jun 10, 2026
ee063f9
test: stabilize dashboard idle prune scheduling (#1395)
steipete Jun 10, 2026
91305ae
fix: show all daily cost models (#1396)
steipete Jun 10, 2026
f927e8a
Recycle menu card hosting views and reconcile menu content in place (…
bcssewl Jun 10, 2026
3c2d53d
Fix menu open refresh delay (#1398)
joshuavial Jun 10, 2026
eda747b
Gate switcher shortcut event peek behind session HID counters (#1397)
bcssewl Jun 10, 2026
b7772b2
Defer merged icon redraws during menu tracking (#1409)
kiranmagic7 Jun 11, 2026
0e0102c
Fix merged menu width after provider switches (#1411)
steipete Jun 11, 2026
02c9403
Decode provider status feeds off the main actor (#1406)
ProspectOre Jun 11, 2026
ad71da0
Keep codex account file reads off the menu-build path
ProspectOre Jun 10, 2026
f1c1b6c
perf: keep Codex account reconciliation off menu tracking
steipete Jun 11, 2026
febf562
Merge pull request #1401 from ProspectOre/perf/menu-account-snapshot-…
steipete Jun 11, 2026
fda0fae
Run cost-usage corpus scans off the Swift cooperative thread pool
ProspectOre Jun 10, 2026
01350b2
fix: make cost scan cancellation immediate
steipete Jun 11, 2026
e7aa652
test: isolate cost scan executor queues
steipete Jun 11, 2026
4c964cc
Merge pull request #1402 from ProspectOre/perf/cost-scan-off-cooperat…
steipete Jun 11, 2026
9d7967e
fix: keep Cost menu row width stable
steipete Jun 11, 2026
97b891f
Merge pull request #1413 from steipete/fix/cost-menu-width
steipete Jun 11, 2026
b4b1edc
chore: prepare 0.33.0 release
steipete Jun 11, 2026
6d156e7
style: apply SwiftFormat to utilization history tests
steipete Jun 11, 2026
6cf4225
docs: update appcast for 0.33.0
steipete Jun 11, 2026
2b76dc9
chore: start 0.33.1 development
steipete Jun 11, 2026
9015e94
docs: document Sparkle release key
steipete Jun 11, 2026
be4818c
feat: add Devin usage provider (#1264)
coygeek Jun 11, 2026
5745118
fix: show Cursor Full Disk Access hint first (#1419)
hhh2210 Jun 11, 2026
159d03c
fix: show Cursor legacy request quotas (#1420)
hhh2210 Jun 11, 2026
dd8cf8b
perf: reduce Codex cost refresh metadata work (#1430)
steipete Jun 11, 2026
71b93e5
Resolve codex priority turns incrementally per refresh (#1404)
ProspectOre Jun 11, 2026
67a9f43
Stabilize merged provider menu positioning (#1288)
Yuxin-Qiao Jun 11, 2026
1bb6d10
[security] fix(providers): validate sibling endpoint overrides (#1269)
Hinotoi-agent Jun 11, 2026
bea2a84
fix: reject malformed provider hosts (#1439)
steipete Jun 11, 2026
88c43ee
[security] fix(providers): reject sibling HTTP endpoint overrides (#1…
Hinotoi-agent Jun 11, 2026
3c2d23d
feat: move overview highlight with scroll wheel (#1436)
joshuavial Jun 11, 2026
894bbcb
Reload serve config per request (#1442)
enieuwy Jun 11, 2026
b5edc46
Fix overview switcher segment height (#1445)
Zihao-Qi Jun 11, 2026
5cc8a24
Clarify Claude Web reauthentication guidance (#1441)
steipete Jun 11, 2026
ad2a035
perf: skip storage footprint republish when scan is unchanged (#1416)
soohanpark Jun 11, 2026
1bae26b
Fix models.dev pricing cache churn (#1443)
steipete Jun 11, 2026
cd201b9
Add Antigravity agy CLI fallback (#1313)
enieuwy Jun 11, 2026
05e2388
docs: require released model names in fixtures
steipete Jun 11, 2026
7c279bc
fix: prefer snapshot pricing aliases (#1449)
steipete Jun 11, 2026
1912f75
fix: detect Tahoe blocked status proxy (#1446)
steipete Jun 11, 2026
05bf4d9
fix: handle unavailable Bedrock cost data (#1324)
enesteve0 Jun 11, 2026
43e32b3
fix: align provider switcher quota bars (#1453)
steipete Jun 12, 2026
2ca4c26
fix: detect current Antigravity language server (#1448)
steipete Jun 12, 2026
ff6c42d
test: gate incremental Codex cost scan performance (#1434)
steipete Jun 12, 2026
da3b758
feat: add reset time menu bar display (#1223)
Yuxin-Qiao Jun 12, 2026
ee91154
fix: honor Cursor extra usage percent display (#1450)
steipete Jun 12, 2026
9b22e65
perf: add debug main thread hang watchdog (#1437)
joshuavial Jun 12, 2026
a4af900
Fix Grok web billing status 7 auth and cookie bearer fetch
bcharleson Jun 11, 2026
ceec86c
fix: harden Grok web billing auth fallback
steipete Jun 12, 2026
8252592
fix(grok): parse raw zero-percent billing payloads
steipete Jun 12, 2026
40d58c6
fix(grok): parse zero-use current periods
steipete Jun 12, 2026
4a6fa81
fix: show unavailable Doubao quota (#1457)
steipete Jun 12, 2026
7d245b7
Merge pull request #1452 from bcharleson/upstream/grok-status7-auth-g…
steipete Jun 12, 2026
fa48afb
Harden main thread hang diagnostics (#1455)
steipete Jun 12, 2026
be6f289
fix: integrate provider quota bars (#1456)
steipete Jun 12, 2026
f759e11
fix: increase settings window height (#1459)
steipete Jun 12, 2026
d1c96c3
feat: show in-flight feedback on manual refresh
hhh2210 Jun 12, 2026
87e6e26
fix: harden manual refresh feedback lifecycle
steipete Jun 12, 2026
2ced0e6
refactor: keep status controller within lint limits
steipete Jun 12, 2026
915a9da
Merge pull request #1458 from hhh2210/feat/refresh-in-flight-feedback
steipete Jun 12, 2026
b999de0
test(menu): stabilize refresh subtitle assertion
steipete Jun 12, 2026
8e50e88
Merge pull request #1461 from steipete/fix/pr1458-ci-error-filtering
steipete Jun 12, 2026
0cdc167
feat: add Korean (한국어) localization
soohanpark Jun 12, 2026
e6cbfc1
test: verify Korean localization integration
steipete Jun 12, 2026
438ef15
fix: preserve Korean usage chart argument order
steipete Jun 12, 2026
a4a2284
test: isolate refresh placeholder account state
steipete Jun 12, 2026
3fdb549
Merge pull request #1460 from soohanpark/feat/korean-localization
steipete Jun 12, 2026
2164582
feat: track Cursor local storage
steipete Jun 11, 2026
8c3e1ff
fix: include Cursor updater and HTTP caches
steipete Jun 12, 2026
1df9a63
docs: list all Cursor storage paths
steipete Jun 12, 2026
ae159ec
fix(amp): restore usage fetching
steipete Jun 11, 2026
a4a60de
fix(amp): harden fallback and credit output
steipete Jun 12, 2026
2623fed
test(amp): cover Linux auto routing
steipete Jun 12, 2026
b4045e5
fix(amp): preserve cancellation and localize credits
steipete Jun 12, 2026
0998b2b
fix(amp): authenticate balance API with access token
steipete Jun 12, 2026
9c824ec
Merge pull request #1447 from steipete/feat/cursor-storage-footprint
steipete Jun 12, 2026
46626f7
fix(amp): redact workspace credit identities
steipete Jun 12, 2026
5ac2030
feat: add native German localization (#1245)
Yuxin-Qiao Jun 12, 2026
2cd2fe1
Merge pull request #1444 from steipete/fix/amp-usage-repair
steipete Jun 12, 2026
1b0e2f1
Fix Cursor app auth fallback
Jackie-Qin Jun 4, 2026
f29eded
Fix Cursor app auth review feedback
Jackie-Qin Jun 4, 2026
5d7c00b
Preserve Cursor cookie auth precedence
Jackie-Qin Jun 4, 2026
04d900d
fix: align Cursor app usage schema
steipete Jun 12, 2026
19bb28d
fix: preserve Cursor extra usage fallback
steipete Jun 12, 2026
80803fb
fix: harden Cursor app auth fallback
steipete Jun 12, 2026
830752f
fix(cursor): reuse app session cookie flow
steipete Jun 12, 2026
6c0b591
fix(cursor): reject stale app auth tokens
steipete Jun 12, 2026
2245211
fix(cursor): preserve selected account on transient errors
steipete Jun 12, 2026
3672f26
fix(cursor): preserve app auth failures
steipete Jun 12, 2026
aa4a25b
fix(cursor): keep cached session authoritative
steipete Jun 12, 2026
b60a510
Merge pull request #1295 from Jackie-Qin/fix/cursor-app-auth-fallback
steipete Jun 12, 2026
186c6de
feat: add Turkish localization (#1232)
ykarateke Jun 12, 2026
b9a22ef
fix: paginate OpenAI Admin usage (#1465)
rohitjavvadi Jun 12, 2026
34029c0
Fix Ollama web guard scoping (#1468)
WadydX Jun 12, 2026
7a70336
Add optional Copilot budget extras (#1273)
Quicksaver Jun 12, 2026
abaf4f7
docs: credit Copilot budget extras
steipete Jun 12, 2026
62b2d04
chore: prepare 0.34.0 release
steipete Jun 12, 2026
b1d3e40
style: apply release formatting
steipete Jun 12, 2026
7dc3d1c
build: use managed release signing keychain
steipete Jun 12, 2026
7717813
docs: update appcast for 0.34.0
steipete Jun 12, 2026
6ef1b44
build: stabilize widget package reference
steipete Jun 12, 2026
2080022
chore: start 0.34.1 development
steipete Jun 12, 2026
1dfd7d9
fix: restore native merged menu positioning
steipete Jun 12, 2026
9206642
Fix Launch at Login pending approval disable
AmrMohamad Jun 12, 2026
358f617
fix: complete launch at login state handling
steipete Jun 12, 2026
b553814
Merge pull request #1469 from AmrMohamad/codex/launch-login-requires-…
steipete Jun 12, 2026
1d7ae09
Memoize cookie cache lookups behind settings picker labels
ProspectOre Jun 12, 2026
5eaad53
Guard display-cache refreshes against newer store and clear snapshots
ProspectOre Jun 12, 2026
a1b874e
fix: guard cookie display cache invalidation
steipete Jun 12, 2026
1bfcc61
fix: harden cookie display cache failures
steipete Jun 12, 2026
a610c7a
fix: keep display cache migration race-safe
steipete Jun 13, 2026
c1f9e36
Merge pull request #1471 from ProspectOre/perf/settings-cookie-traili…
steipete Jun 13, 2026
5bfba2b
Fix package_app.sh preferring stale legacy build products
ProspectOre Jun 13, 2026
2d19528
fix: preserve universal package outputs
steipete Jun 13, 2026
0a16bb4
Merge pull request #1473 from ProspectOre/fix/package-app-stale-build…
steipete Jun 13, 2026
29f8fea
Keep switcher shortcut peeks from killing menu tracking sessions
ProspectOre Jun 12, 2026
f556704
Merge pull request #1472 from ProspectOre/fix/menu-tracking-zombie-ev…
steipete Jun 13, 2026
d57dabf
fix: prevent provider switch content flicker
steipete Jun 12, 2026
64f2201
Fix shortcut menu toggle
Zihao-Qi Jun 12, 2026
f997c3c
docs: credit shortcut menu fix
steipete Jun 13, 2026
060d19e
chore: document shortcut toggle fix
steipete Jun 13, 2026
70beaf0
chore: remove duplicate shortcut changelog
steipete Jun 13, 2026
bf7e7dc
Merge pull request #1470 from Zihao-Qi/shortcut-menu-toggle
steipete Jun 13, 2026
2c7283b
Add Kimi Code API usage source (#1424)
kiranmagic7 Jun 13, 2026
d37f9c0
fix: preserve menu bar text when pace is unavailable (#1474)
steipete Jun 13, 2026
76e684c
docs: correct Kimi release notes
steipete Jun 13, 2026
7a14e17
docs: require visible menu icon proof
steipete Jun 13, 2026
71c124e
ci: avoid duplicate pull request runs (#1475)
steipete Jun 13, 2026
a2b56ea
fix: enforce diagnostic probe timeouts (#1477)
steipete Jun 13, 2026
69831ca
fix(packaging): trust SwiftPM product paths (#1478)
steipete Jun 13, 2026
4bbe133
fix: rebuild provider switcher during menu tracking (#1479)
steipete Jun 13, 2026
581f8b0
fix: prevent tests from terminating user Codex processes (#1480)
steipete Jun 13, 2026
8adc2c7
fix: coalesce deferred menu refreshes (#1483)
steipete Jun 13, 2026
88d6360
test: avoid executable fixture spawn race (#1482)
steipete Jun 13, 2026
1d39e0c
fix: keep Settings toolbar in sync with dark mode switch (#1484)
hhh2210 Jun 13, 2026
ca94829
feat: show Xiaomi MiMo balance breakdown and token usage (#1309)
AdrianSimionov Jun 13, 2026
8e7df44
test: isolate browser cookie discovery (#1489)
steipete Jun 13, 2026
f5fa813
feat: add opt-in MiMo local usage fallback (#1284)
LeoLin990405 Jun 13, 2026
501cb51
fix: close browser cookie isolation bypass (#1491)
steipete Jun 13, 2026
2f92ee9
feat: use configured work days for weekly pace (#1451)
steipete Jun 13, 2026
532f43d
perf: remove redundant release prebuild (#1493)
ProspectOre Jun 13, 2026
87f67e3
fix: validate release dSYM paths and architectures (#1494)
ProspectOre Jun 13, 2026
620aa76
fix: verify release dSYM UUIDs (#1492)
ProspectOre Jun 14, 2026
0103e6e
Pin status-bar menus to the system appearance (fix dark menu in Light…
npapridonu Jun 14, 2026
cb934ff
fix: resolve and contain Sparkle signing paths (#1495)
ProspectOre Jun 14, 2026
7d12c4a
chore: prepare 0.35.0 release
steipete Jun 14, 2026
15c70c7
style: normalize MiMo usage tests
steipete Jun 14, 2026
9d3c354
docs: update appcast for 0.35.0
steipete Jun 14, 2026
158eafa
chore: start 0.35.1 development
steipete Jun 14, 2026
c7ab4e6
chore: update Ollama provider icon (#1497)
mattab178 Jun 14, 2026
a937443
fix(settings): make cost history days editable (#1503)
kiranmagic7 Jun 14, 2026
24ba34e
fix: prevent menu flicker and improve sidebar contrast
steipete Jun 14, 2026
83ca996
Merge remote-tracking branch 'origin/main'
steipete Jun 14, 2026
984c2d1
Improve Antigravity quota detection (#1509)
Zihao-Qi Jun 14, 2026
04a7870
fix: recognize Gemini API key auth (#1512)
steipete Jun 14, 2026
3a2b73e
fix: probe Antigravity HTTP ports on Linux (#1514)
steipete Jun 14, 2026
e6e84a6
test: cover local documentation links (#1506)
kiranmagic7 Jun 14, 2026
c818807
docs(config): sync provider id list (#1501)
kiranmagic7 Jun 14, 2026
9490a8d
Fix Antigravity quota edge handling (#1515)
steipete Jun 14, 2026
c33ecd6
test: cover provider descriptor icon resources (#1505)
kiranmagic7 Jun 14, 2026
b40c353
fix: refresh open menu usage values (#1518)
steipete Jun 14, 2026
6c409f7
fix: synchronize cookie cache test override (#1519)
steipete Jun 14, 2026
df4a5ba
docs(site): surface newer provider cards (#1504)
kiranmagic7 Jun 14, 2026
ab5ff4c
fix: fail MiMo refresh promptly (#1520)
steipete Jun 14, 2026
1033a6a
fix: retry transient Antigravity launch failures (#1522)
steipete Jun 14, 2026
2e4b355
fix: keep Command Code credits available (#1521)
steipete Jun 14, 2026
0677030
fix: shard local Swift tests (#1523)
steipete Jun 14, 2026
fe210ac
fix: bound DeepSeek optional summary wait (#1525)
steipete Jun 14, 2026
a3134da
fix: bound optional provider enrichment (#1526)
steipete Jun 14, 2026
ac8159f
fix: bound subprocess output draining (#1529)
steipete Jun 14, 2026
ae7455b
fix: keep token account menu data scoped (#1530)
steipete Jun 14, 2026
faab45e
test: characterize provider implementation registry
steipete Jun 14, 2026
30506ca
refactor: make provider registration explicit
steipete Jun 14, 2026
22a07ef
refactor: remove provider registration macros
steipete Jun 14, 2026
5c7c70e
fix: isolate runtime and test state
steipete Jun 14, 2026
bdb213f
refactor: centralize provider cookie settings
steipete Jun 14, 2026
43f7991
refactor: centralize provider environments
steipete Jun 14, 2026
6335f2a
refactor: share API token fetch strategy
steipete Jun 14, 2026
fa1a038
refactor: migrate commodity API providers
steipete Jun 14, 2026
7999774
fix: preserve usage snapshot payloads
steipete Jun 14, 2026
3cd3dd6
fix: unify icon usage projection
steipete Jun 14, 2026
0d3b09d
refactor: centralize menu session state
steipete Jun 14, 2026
bfcb395
refactor: share menu rebuild generations
steipete Jun 14, 2026
371c748
fix: dispose removed menu state
steipete Jun 14, 2026
5b8313f
refactor: extract provider refresh coordinator
steipete Jun 14, 2026
c9bf666
test: centralize app state fixtures
steipete Jun 14, 2026
605ab5f
test: finish status bar fixture migration
steipete Jun 15, 2026
b3f74ca
fix: bound CLI version output draining (#1532)
steipete Jun 15, 2026
3b5f523
Add native Italian localization support (#1248)
Yuxin-Qiao Jun 15, 2026
fc85132
Prove Claude cookie cache isolation (#1539)
ProspectOre Jun 15, 2026
6350ea1
Prove Claude OAuth ownership handoff (#1540)
ProspectOre Jun 15, 2026
2d9ddd0
Attach Copilot reset time (#1538)
Zihao-Qi Jun 15, 2026
a174d17
feat: add Indonesian (Bahasa Indonesia) localization (#1513)
StevanusPangau Jun 15, 2026
209b6c8
Fix Kiro usage command pipe hangs (#1535)
kiranmagic7 Jun 15, 2026
640cb8c
Fix Gemini fnm package discovery pipe hangs (#1536)
kiranmagic7 Jun 15, 2026
279821c
test: stabilize Antigravity readiness retry
steipete Jun 15, 2026
3263f04
test: stabilize provider readiness timing
steipete Jun 15, 2026
1d7e744
Add native Polish app language support
May 31, 2026
6eeb33d
Improve Polish translations for core settings and menu UI
May 31, 2026
63a5147
Polish quota/status and debug localization polish
May 31, 2026
96f3537
Polish: localize remaining providers screen and status labels
Jun 1, 2026
749ef58
Polish: localize remaining menu and chart copy
Jun 1, 2026
c1fc789
Tests: add language_polish to catalog and complete Polish translations
Yuxin-Qiao Jun 7, 2026
d9a1f88
Localization: complete rebase invariant parity for Polish (pl + ja ca…
Yuxin-Qiao Jun 11, 2026
b376bee
fix: complete Polish localization parity
steipete Jun 11, 2026
c819b0f
fix: complete Polish localization parity
steipete Jun 13, 2026
0ac48c5
fix: complete Polish localization
Yuxin-Qiao Jun 13, 2026
64e1a8d
fix: complete Polish localization parity
steipete Jun 15, 2026
bdb5d1f
docs: restore changelog section spacing
steipete Jun 15, 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
  •  
  •  
  •  
118 changes: 118 additions & 0 deletions .agents/skills/qa-test/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
---
name: qa-test
description: "CodexBar live QA/e2e testing: run provider usage matrix checks, validate real app config, use Peekaboo for menu proof, use Browser Use/official docs for API spec or logged-in dashboard checks, and handle 1Password credentials safely."
---

# CodexBar Live QA

Use for live provider testing, release smoke tests, menu verification, or debugging “provider works/fails” reports.

## Rules

- Work from the CodexBar repo checkout.
- Use the packaged CLI first: `CodexBar.app/Contents/Helpers/CodexBarCLI`.
- Do not use `CodexBar.app/Contents/MacOS/codexbar`; that is the app binary and may appear to hang as a CLI.
- Never run broad `env`, `set`, or secret regex dumps.
- Use `$one-password` for secrets: all `op` commands inside one persistent tmux session, service account first, no raw secret output.
- Treat browser-cookie/keychain flows as prompt-risky. Prefer CLI/API-token checks and `KeychainNoUIQuery`-safe tests unless the user explicitly requested live UI.
- For current API behavior, browse official provider docs only.

## CLI Matrix

Run the bundled script:

```bash
.agents/skills/qa-test/scripts/live_provider_matrix.sh --enabled
```

Useful modes:

```bash
.agents/skills/qa-test/scripts/live_provider_matrix.sh --provider all
.agents/skills/qa-test/scripts/live_provider_matrix.sh --providers openai,zai,deepseek
.agents/skills/qa-test/scripts/live_provider_matrix.sh --default
```

Interpretation:

- `--enabled` asks `CodexBarCLI config providers` for enabled providers, honoring `CODEXBAR_CONFIG` and default toggles.
- `--default` runs the app-facing default command with no provider override.
- `--provider all` forces every registered provider and is expected to fail for providers without sessions/keys.
- A green app config needs `--enabled` and `--default` clean; `--provider all` is a discovery/triage tool.

## Config QA

Validate config:

```bash
CodexBar.app/Contents/Helpers/CodexBarCLI config validate
stat -f '%Lp %N' "$HOME/.codexbar/config.json"
```

Redact config shape:

```bash
jq '(.providers // []) |= map(.apiKey = (if .apiKey then "<redacted>" else .apiKey end) |
.secretKey = (if .secretKey then "<redacted>" else .secretKey end) |
.cookieHeader = (if .cookieHeader then "<redacted>" else .cookieHeader end) |
(if .id == "stepfun" and has("region") then .region = "<redacted>" else . end) |
.tokenAccounts = (if .tokenAccounts then (.tokenAccounts | .accounts = (.accounts | map(.token = "<redacted>"))) else .tokenAccounts end))' \
"$HOME/.codexbar/config.json"
```

Before editing config, make a backup:

```bash
cp "$HOME/.codexbar/config.json" "$HOME/.codexbar/config.pre-qa-$(date +%Y%m%d%H%M%S).json"
chmod 600 "$HOME/.codexbar"/config.pre-qa-*.json
```

## Live Menu QA

Use Peekaboo after CLI checks:

```bash
pkill -x CodexBar || pkill -f 'CodexBar.app/Contents/MacOS/CodexBar' || true
open -n "$PWD/CodexBar.app"
peekaboo menu list-all --json | rg -i 'codexbar'
peekaboo menu click-extra --title codexbar-merged --json
screencapture -x /tmp/codexbar-live-menu.png
```

Crop top-right menu if needed:

```bash
sips --cropToHeightWidth 900 340 --cropOffset 20 2650 /tmp/codexbar-live-menu.png \
--out /tmp/codexbar-live-menu-crop.png >/dev/null
```

Verify visually with `view_image`. Confirm provider tabs/rows match enabled config and no failing provider dominates the first screen.

## Browser Use

Use `$browser-use` only when a logged-in dashboard, API key page, or provider docs need browser/profile state.

Existing Chrome path:

```bash
mcporter call chrome-devtools.list_pages --args '{}' --output text
mcporter call chrome-devtools.navigate_page --args '{"url":"https://provider.example"}' --output text
mcporter call chrome-devtools.take_snapshot --args '{}' --output text
```

If Browser Use is unavailable, say so and use web search for public official docs; do not substitute isolated Playwright for login/profile-dependent pages.

## Fix Triage

- Missing auth/session: configure key/session if available; otherwise leave provider disabled or report blocked auth.
- Wrong provider API/spec: inspect official docs, then patch fetcher/settings/tests.
- Provider key exists but live API rejects it: keep key stored if useful, disable provider if the menu would show a persistent error.
- User-facing behavior changes need `CHANGELOG.md`.
- Code fixes need focused tests, `make check`, `$autoreview`, and live CLI proof before landing.

## Known CodexBar QA Notes

- OpenAI Admin API key is the useful usage provider key. Project `OPENAI_API_KEY` values can fail legacy credit-balance fallback with 403.
- Deepgram usage requires a key/project with Management API permissions; transcription-only keys can return 403.
- Groq usage uses the Prometheus metrics API, not ordinary inference endpoints.
- MiniMax pay-as-you-go API keys and Token Plan/Coding Plan keys are different; wrong key kind can leave usage unavailable.
4 changes: 4 additions & 0 deletions .agents/skills/qa-test/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "CodexBar QA Test"
short_description: "Run live CodexBar CLI and menu QA safely."
default_prompt: "Run CodexBar live QA with CLI, Peekaboo, browser docs, and 1Password-safe credential checks."
10 changes: 10 additions & 0 deletions .agents/skills/qa-test/references/api-specs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# API Spec Pointers

Use current official docs for provider API behavior. Prefer these searches/pages before patching fetchers:

- MiniMax: `https://platform.minimax.io/docs/llms.txt`; key types differ between pay-as-you-go API keys and Token Plan/Coding Plan keys.
- Deepgram: `https://developers.deepgram.com/llms.txt`; usage/project APIs require Management permissions and project-scoped keys.
- Groq: `https://console.groq.com/docs/prometheus-metrics`; usage metrics use `https://api.groq.com/v1/metrics/prometheus`.
- LLM Proxy/LiteLLM: `https://docs.litellm.ai/`; CodexBar expects an LLM-API-Key-Proxy compatible `/v1/quota-stats` endpoint plus base URL.

When citing docs in a user-facing answer, browse the current page and include source links.
183 changes: 183 additions & 0 deletions .agents/skills/qa-test/scripts/live_provider_matrix.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
#!/usr/bin/env bash
set -u

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd)"
CLI="${CODEXBAR_CLI:-$ROOT/CodexBar.app/Contents/Helpers/CodexBarCLI}"
TIMEOUT_BIN="${TIMEOUT_BIN:-$(command -v gtimeout || command -v timeout || true)}"
WEB_TIMEOUT="${CODEXBAR_QA_WEB_TIMEOUT:-12}"
CASE_TIMEOUT="${CODEXBAR_QA_CASE_TIMEOUT:-60}"

usage() {
cat <<'USAGE'
Usage:
live_provider_matrix.sh --enabled
live_provider_matrix.sh --default
live_provider_matrix.sh --provider all
live_provider_matrix.sh --providers openai,zai,deepseek

Environment:
CODEXBAR_CLI=/path/to/CodexBarCLI
CODEXBAR_CONFIG=/path/to/config.json
CODEXBAR_QA_WEB_TIMEOUT=12
CODEXBAR_QA_CASE_TIMEOUT=60
USAGE
}

if [[ ! -x "$CLI" ]]; then
echo "missing CodexBarCLI at $CLI" >&2
exit 2
fi
if [[ -z "$TIMEOUT_BIN" ]]; then
echo "missing timeout command (install coreutils for gtimeout)" >&2
exit 2
fi
if ! command -v node >/dev/null 2>&1; then
echo "missing node" >&2
exit 2
fi

mode="${1:-}"
shift || true

providers=()
case "$mode" in
--enabled)
provider_status="$(mktemp)"
provider_err="$(mktemp)"
provider_list="$(mktemp)"
if ! "$CLI" config providers --format json --json-only >"$provider_status" 2>"$provider_err"; then
rm -f "$provider_status" "$provider_err" "$provider_list"
echo "failed to list providers via CodexBarCLI config providers" >&2
exit 2
fi
if ! node - "$provider_status" >"$provider_list" <<'NODE'; then
const fs = require("fs");
const path = process.argv[2];
const raw = fs.readFileSync(path, "utf8").trim();
const payload = JSON.parse(raw);
if (!Array.isArray(payload)) {
throw new Error("config providers output is not an array");
}
for (const item of payload) {
if (item && item.enabled === true && typeof item.provider === "string" && item.provider) {
console.log(item.provider);
}
}
NODE
rm -f "$provider_status" "$provider_err" "$provider_list"
echo "failed to parse CodexBarCLI config providers output" >&2
exit 2
fi
while IFS= read -r provider; do
[[ -n "$provider" ]] && providers+=("$provider")
done <"$provider_list"
rm -f "$provider_status" "$provider_err" "$provider_list"
if [[ "${#providers[@]}" -eq 0 ]]; then
echo "no enabled providers found via CodexBarCLI config providers" >&2
exit 2
fi
;;
--default)
providers=("__default__")
;;
--provider)
if [[ -z "${1:-}" ]]; then
echo "missing provider" >&2
exit 2
fi
providers=("${1:-}")
;;
--providers)
if [[ -z "${1:-}" ]]; then
echo "missing providers" >&2
exit 2
fi
IFS=',' read -r -a providers <<< "${1:-}"
;;
-h|--help|"")
usage
exit 0
;;
*)
echo "unknown mode: $mode" >&2
usage >&2
exit 2
;;
esac

redact_node='
const redact = s => String(s || "")
.replace(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+/g, "<email>")
.replace(/sk-[A-Za-z0-9_-]{12,}/g, "sk-REDACTED")
.replace(/gsk_[A-Za-z0-9_-]{12,}/g, "gsk_REDACTED")
.replace(/[A-Za-z0-9_-]{32,}/g, m => /[A-Za-z]/.test(m) && /[0-9]/.test(m) ? "<redacted-token>" : m);
'

run_one() {
local name="$1"
shift
local out err start end elapsed st node_status
out="$(mktemp)"
err="$(mktemp)"
start="$(date +%s)"
"$TIMEOUT_BIN" "$CASE_TIMEOUT" "$CLI" usage "$@" --format json --json-only --web-timeout "$WEB_TIMEOUT" >"$out" 2>"$err"
st=$?
end="$(date +%s)"
elapsed=$((end - start))
node - "$name" "$st" "$elapsed" "$out" "$err" <<NODE
const fs = require("fs");
$redact_node
const [name, st, elapsed, outPath, errPath] = process.argv.slice(2);
const raw = fs.readFileSync(outPath, "utf8").trim();
const err = fs.readFileSync(errPath, "utf8").trim();
let rows = [];
let formatterFailed = false;
try {
const payload = raw ? JSON.parse(raw) : [];
const arr = Array.isArray(payload) ? payload : [payload];
for (const p of arr) {
rows.push(
\`\${p.provider || name}:\${p.error ? "fail" : "ok"}:source=\${p.source || "unknown"}\` +
(p.account ? \`,account=\${redact(p.account)}\` : "") +
(p.usage ? ",usage=yes" : "") +
(p.credits ? ",credits=yes" : "") +
(p.error ? \`,error=\${redact(p.error.message).slice(0, 180)}\` : "")
);
}
} catch (error) {
formatterFailed = true;
rows.push(\`\${name}:parse-fail:error=\${redact(error.message)} stdout=\${redact(raw).slice(0, 200)} stderr=\${redact(err).slice(0, 200)}\`);
}
if (!rows.length) {
formatterFailed = true;
rows.push(\`\${name}:empty:stderr=\${redact(err).slice(0, 200)}\`);
}
console.log(\`TEST \${name} exit=\${st} elapsed=\${elapsed}s :: \${rows.join(" | ")}\`);
if (formatterFailed) process.exit(1);
NODE
node_status=$?
rm -f "$out" "$err"
if [[ "$node_status" -ne 0 ]]; then
return 1
fi
return "$st"
}

overall=0
ran=0
for provider in "${providers[@]}"; do
[[ -z "$provider" ]] && continue
ran=$((ran + 1))
if [[ "$provider" == "__default__" ]]; then
run_one default || overall=1
elif [[ "$provider" == "all" ]]; then
run_one all --provider all || overall=1
else
run_one "$provider" --provider "$provider" || overall=1
fi
done
if [[ "$ran" -eq 0 ]]; then
echo "no provider cases ran" >&2
exit 2
fi
exit "$overall"
Loading