Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
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
4c9e6a8
feat: add provider search
steipete May 29, 2026
b3c0d57
docs: update changelog for provider search
steipete May 29, 2026
01528f5
fix: add Opus 4.8 Claude pricing fallback
devYRPauli May 29, 2026
9674523
fix: preserve Codex web credits-only refresh
soumikbhatta May 29, 2026
06b7de1
fix: bound serve requests and coalesce cache misses
enieuwy May 29, 2026
72716d9
fix: bound OpenAI WebKit refresh lifecycle
steipete May 30, 2026
5ce38b6
fix: retry startup status after offline launch
steipete May 30, 2026
e6d61a8
Harden menu bar status item placement
pdurlej May 29, 2026
8545c76
fix: preserve menu bar placement on upgrade
steipete May 30, 2026
d7db992
fix: refresh cold-start menu readiness
steipete May 30, 2026
4a2ef3a
fix: parse updated Augment auggie status
bcharleson May 30, 2026
a509408
docs: update changelog for Augment parser fix
steipete May 30, 2026
cdd7e34
fix: require HTTPS for provider redirect cookies
Hinotoi-agent May 30, 2026
190d883
docs: update changelog for redirect cookie fix
steipete May 30, 2026
1cc54a0
fix: preserve Claude web usage on auth flakes
LeoLin990405 May 30, 2026
3631312
docs: update changelog for Claude web resilience
steipete May 30, 2026
5dec44e
fix: filter noisy Antigravity model quotas
guhyun9454 May 30, 2026
d2d1fc3
docs: update changelog for Antigravity quota filtering
steipete May 30, 2026
dbc944d
fix: harden CLI installer privilege boundary
Hinotoi-agent May 30, 2026
c566197
docs: update changelog for CLI installer hardening
steipete May 30, 2026
e7d9326
fix: isolate notarization temp files
Hinotoi-agent May 30, 2026
c28e3bb
docs: update changelog for notarization temp hardening
steipete May 30, 2026
482f1da
Fix menu tracking background rebuild stalls (#1233)
steipete May 30, 2026
ddb8054
chore: prepare 0.32.0 release
steipete May 30, 2026
d7a8b38
style: apply SwiftFormat to CLI server
steipete May 31, 2026
041bf4a
test: stabilize release precheck
steipete May 31, 2026
44e4d16
chore: normalize widget project package name
steipete May 31, 2026
1351961
docs: update appcast for 0.32.0
steipete May 31, 2026
6106ca0
chore: open 0.32.1 development
steipete May 31, 2026
d5a5796
fix: defer menu refresh until close
steipete May 31, 2026
e7a96dc
fix: cache codex account reconciliation
steipete May 31, 2026
3488587
fix: preserve Claude CLI token ownership
RajvardhanPatil07 May 31, 2026
07ed3fa
fix: reduce CodexBar menu refresh work
steipete May 31, 2026
07ee69b
chore: finalize 0.32.1 changelog
steipete May 31, 2026
37bc49f
docs: update appcast for 0.32.1
steipete May 31, 2026
c81f2d1
sync: merge upstream v0.32.1
RajvardhanPatil07 May 31, 2026
145f4dc
Fix mobile CI lint blockers
RajvardhanPatil07 May 31, 2026
5c34c1c
Fix parser audit checkout depth
RajvardhanPatil07 May 31, 2026
d3acc86
Show Swift test list failures
RajvardhanPatil07 May 31, 2026
a80b482
Import sync redaction for debug logs
RajvardhanPatil07 May 31, 2026
68ec964
Stabilize Codex dashboard backfill test
RajvardhanPatil07 Jun 1, 2026
c8c98de
Avoid flaky dashboard backfill test hang
RajvardhanPatil07 Jun 1, 2026
05d4787
Stabilize dashboard ambiguity tests
RajvardhanPatil07 Jun 1, 2026
6054add
Stabilize stale dashboard completion test
RajvardhanPatil07 Jun 1, 2026
ff46f0d
Stabilize dashboard account switch guard test
RajvardhanPatil07 Jun 1, 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
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ jobs:
timeout-minutes: 70
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Select Xcode 26.1.1 (if present) or fallback to default
run: |
Expand Down
39 changes: 31 additions & 8 deletions .github/workflows/release-cli.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
workflow_dispatch:
inputs:
tag:
description: "Release tag to upload assets to (for example, v0.24)."
description: "Release tag/version to package for manual artifact builds; manual runs do not publish."
required: false
type: string

Expand Down Expand Up @@ -69,6 +69,20 @@ jobs:
uname -m
swift --version

- name: Validate release tag
if: github.event_name == 'release' || inputs.tag != ''
shell: bash
run: |
set -euo pipefail
if [[ -z "$RELEASE_TAG" ]]; then
echo "Missing release tag." >&2
exit 1
fi
if [[ ! "$RELEASE_TAG" =~ ^v[0-9A-Za-z._-]+$ ]]; then
echo "Invalid release tag: $RELEASE_TAG" >&2
exit 1
fi

- name: Install Swift 6.2.1 via swiftly
if: matrix.platform == 'linux'
shell: bash
Expand Down Expand Up @@ -211,7 +225,7 @@ jobs:
echo "asset=$ASSET" >> "$GITHUB_OUTPUT"

- name: Upload release assets
if: github.event_name == 'release' || inputs.tag != ''
if: github.event_name == 'release'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
shell: bash
Expand All @@ -223,7 +237,7 @@ jobs:
gh release upload "$TAG" "$OUT_DIR/$ASSET" "$OUT_DIR/$ASSET.sha256" --clobber

- name: Upload workflow artifact (manual runs)
if: github.event_name != 'release' && inputs.tag == ''
if: github.event_name == 'workflow_dispatch'
uses: actions/upload-artifact@v6
with:
name: codexbar-cli-${{ matrix.name }}
Expand All @@ -234,24 +248,32 @@ jobs:
update-homebrew-tap:
runs-on: ubuntu-latest
needs: build-cli
if: github.event_name == 'release' || inputs.tag != ''
if: github.event_name == 'release'
steps:
- name: Resolve release tag
id: release
env:
RELEASE_TAG: ${{ github.ref_name }}
shell: bash
run: |
set -euo pipefail
tag="${{ inputs.tag || github.ref_name }}"
tag="${RELEASE_TAG}"
if [[ -z "$tag" ]]; then
echo "Missing release tag." >&2
exit 1
fi
if [[ ! "$tag" =~ ^v[0-9A-Za-z._-]+$ ]]; then
echo "Invalid release tag: $tag" >&2
exit 1
fi
echo "tag=$tag" >> "$GITHUB_OUTPUT"
echo "request_id=codexbar-${tag}-${GITHUB_RUN_ID}" >> "$GITHUB_OUTPUT"

- name: Dispatch tap update
env:
GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
RELEASE_TAG: ${{ steps.release.outputs.tag }}
REQUEST_ID: ${{ steps.release.outputs.request_id }}
shell: bash
run: |
set -euo pipefail
Expand All @@ -260,13 +282,13 @@ jobs:
if gh workflow run update-formula.yml \
--repo steipete/homebrew-tap \
-f formula=codexbar \
-f tag="${{ steps.release.outputs.tag }}" \
-f tag="$RELEASE_TAG" \
-f repository=steipete/CodexBar \
-f artifact_template='CodexBarCLI-{tag}-{target}.tar.gz' \
-f target_aliases='darwin_arm64=macos-arm64,darwin_amd64=macos-x86_64,linux_arm64=linux-aarch64,linux_amd64=linux-x86_64' \
-f cask=codexbar \
-f cask_artifact='CodexBar-macos-universal-{version}.zip' \
-f request_id="${{ steps.release.outputs.request_id }}"; then
-f request_id="$REQUEST_ID"; then
exit 0
fi
if [[ "$attempt" -eq 6 ]]; then
Expand All @@ -279,6 +301,7 @@ jobs:
- name: Wait for tap update
env:
GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
REQUEST_ID: ${{ steps.release.outputs.request_id }}
shell: bash
run: |
set -euo pipefail
Expand All @@ -288,7 +311,7 @@ jobs:
--repo steipete/homebrew-tap \
--workflow update-formula.yml \
--json databaseId,displayTitle \
--jq '.[] | select(.displayTitle | contains("${{ steps.release.outputs.request_id }}")) | .databaseId' 2>/tmp/codexbar-tap-run-list.err \
--jq '.[] | select(.displayTitle | contains(env.REQUEST_ID)) | .databaseId' 2>/tmp/codexbar-tap-run-list.err \
| head -n1 || true
)"
if [[ -n "$run_id" ]]; then
Expand Down
6 changes: 6 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ This is the complete development workflow for any AI agent working on CodexBar M

---

## Mac Upstream Testing Guardrails

- Never run checks or ad-hoc validation that can display macOS Keychain prompts unless explicitly requested.
- Prefer parser, provider, and state/model tests over live app-bundle flows when behavior is CLI-testable.
- Use `KeychainNoUIQuery` or stubs for credential paths; do not touch real provider accounts during routine validation.

## Development Lifecycle

Every feature or fix follows these 7 steps in order:
Expand Down
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
# Changelog

## 0.32.1.1 (Mobile 1.9.0 · build 76.1) — 2026-05-31 — upstream v0.32.1 sync

Syncs the Mac app to upstream v0.32.1 while keeping the paired iOS companion at 1.9.0. This release folds in upstream v0.29.1 through v0.32.1.

### Upstream highlights

- Claude OAuth now keeps Claude CLI-owned refresh tokens delegated to Claude Code when CLI storage is present, preventing forced re-login after refresh-token rotation (#1161, #1239).
- Claude usage refreshes preserve cached credentials during rate limits and transient unauthorized responses.
- Provider security is tightened by requiring HTTPS before reattaching imported cookies on redirects.
- Menu-bar startup and open-menu refresh work is deferred/coalesced to reduce focus freezes, keychain prompts, and WebKit CPU spikes.
- Upstream provider/UI additions include provider search, Spark quota lanes, DeepSeek web-session cost summaries, Alibaba Token Plan endpoint updates, and localization updates.

### Compatibility

- iPhone companion remains iOS 1.9.0. No CloudKit schema deploy is required for this sync by itself.
- The Sparkle appcast is not updated in this merge commit; it should be regenerated only after the signed release artifacts are created.

## 0.29.0.1 (Mobile 1.9.0 · build 68.1) — 2026-05-27 — upstream v0.29.0 + iOS 1.9.0

Syncs the Mac app to upstream CodexBar v0.29.0 and ships the paired iOS 1.9.0 companion. Three new providers — Azure OpenAI, Alibaba Token Plan (Bailian), and T3 Chat — plus the upstream v0.28.0 + v0.29.0 fixes.
Expand Down
17 changes: 17 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,23 @@ let package = Package(
platforms: [
.macOS(.v14),
],
products: {
var products: [Product] = [
.library(name: "CodexBarCore", targets: ["CodexBarCore"]),
.executable(name: "CodexBarCLI", targets: ["CodexBarCLI"]),
]

#if os(macOS)
products.append(contentsOf: [
.executable(name: "CodexBar", targets: ["CodexBar"]),
.executable(name: "CodexBarClaudeWatchdog", targets: ["CodexBarClaudeWatchdog"]),
.executable(name: "CodexBarWidget", targets: ["CodexBarWidget"]),
.executable(name: "CodexBarClaudeWebProbe", targets: ["CodexBarClaudeWebProbe"]),
])
#endif

return products
}(),
dependencies: [
.package(url: "https://github.com/sparkle-project/Sparkle", from: "2.9.1"),
.package(url: "https://github.com/steipete/Commander", from: "0.2.1"),
Expand Down
10 changes: 8 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Download: <https://github.com/steipete/CodexBar/releases>

### Homebrew
```bash
brew install --cask steipete/tap/codexbar
brew install --cask codexbar
```

### Linux (CLI only)
Expand Down Expand Up @@ -84,6 +84,10 @@ See [CLI configuration](docs/cli-configuration.md) for the full flow.
- [OpenAI](docs/openai.md) — Admin API key usage/cost graphs with legacy credit-balance fallback.
- [Claude](docs/claude.md) — OAuth API, browser cookies, or CLI PTY fallback; session and weekly usage where available.
- [Cursor](docs/cursor.md) — Browser session cookies for plan + usage + billing resets.
- [OpenCode](docs/opencode.md) — Browser cookies for workspace subscription usage.
- [OpenCode Go](docs/opencode.md) — Browser cookies for Go usage windows.
- [Alibaba Coding Plan](docs/alibaba-coding-plan.md) — Web cookies or API key for coding-plan quotas.
- [Alibaba Token Plan](docs/alibaba-token-plan.md) — Bailian browser/manual cookies for token-plan credits.
- [Gemini](docs/gemini.md) — OAuth-backed quota API using Gemini CLI credentials (no browser cookies).
- [Antigravity](docs/antigravity.md) — Local language server probe (experimental); no external auth.
- [Droid](docs/factory.md) — Browser cookies + WorkOS token flows for Factory usage + billing.
Expand Down Expand Up @@ -113,7 +117,7 @@ See [CLI configuration](docs/cli-configuration.md) for the full flow.
- [Crof](docs/crof.md) — API key for dollar credit balance and request quota tracking.
- [Command Code](docs/command-code.md) — Browser cookies for monthly USD credits from Command Code billing.
- [StepFun](docs/stepfun.md) — Username + password login for Step Plan rate limits (5‑hour + weekly windows) and subscription plan name.
- [AWS Bedrock](docs/bedrock.md) — AWS credentials for Cost Explorer usage and monthly budget tracking.
- [AWS Bedrock](docs/bedrock.md) — AWS access keys or a named AWS profile (SSO/assume-role via the AWS CLI) for Cost Explorer usage and monthly budget tracking.
- [Grok](docs/grok.md) — Grok CLI billing RPC plus grok.com browser-session fallback.
- [GroqCloud](docs/groqcloud.md) — API key for Enterprise Prometheus request/token/cache-hit metrics.
- [LLM Proxy](docs/llm-proxy.md) — API key + base URL for aggregate proxy quota stats and provider breakdowns.
Expand Down Expand Up @@ -205,6 +209,8 @@ Dev loop:

## Linux desktop integration?
- [codexbar-waybar](https://github.com/Marouan-chak/codexbar-waybar) — Waybar custom module + GTK4 popover for Hyprland / Sway / other Wayland compositors, built on top of the bundled Linux CLI.
- [Codexbar GNOME](https://extensions.gnome.org/extension/9841/codexbar/) — GNOME Shell extension that brings CodexBar usage into the desktop panel.
- [noctalia-codex-usage](https://github.com/rayoplateado/noctalia-codex-usage) — Noctalia/Quickshell plugin that shows Codex 5-hour and weekly usage limits, built on top of the bundled Linux CLI.

## Credits
Inspired by [ccusage](https://github.com/ryoppippi/ccusage) (MIT), specifically the cost usage tracking.
Expand Down
12 changes: 11 additions & 1 deletion Scripts/ci_swift_test_by_suite.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,17 @@ def run_command(command: list[str], timeout: int | None = None) -> int:


def swift_test_list() -> list[str]:
result = subprocess.run(["swift", "test", "list"], check=True, capture_output=True, text=True)
result = subprocess.run(["swift", "test", "list"], check=False, capture_output=True, text=True)
if result.returncode != 0:
print("swift test list failed", file=sys.stderr, flush=True)
if result.stdout:
print("stdout:", file=sys.stderr, flush=True)
print(result.stdout, file=sys.stderr, flush=True)
if result.stderr:
print("stderr:", file=sys.stderr, flush=True)
print(result.stderr, file=sys.stderr, flush=True)
returncode = result.returncode
raise subprocess.CalledProcessError(returncode, result.args, output=result.stdout, stderr=result.stderr)
suites: set[str] = set()
for line in result.stdout.splitlines():
if "/" not in line:
Expand Down
4 changes: 2 additions & 2 deletions Scripts/mac-release
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ if [[ -n "${MAC_RELEASE_TOOL:-}" ]]; then
fi

for candidate in \
"$ROOT/../agent-scripts/skills/mac-app-release/scripts/mac-release" \
"$HOME/Projects/agent-scripts/skills/mac-app-release/scripts/mac-release"; do
"$ROOT/../agent-scripts/skills/release-mac-app/scripts/mac-release" \
"$HOME/Projects/agent-scripts/skills/release-mac-app/scripts/mac-release"; do
if [[ -x "$candidate" ]]; then
exec "$candidate" "$@"
fi
Expand Down
Loading