Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build, refactor, or review SwiftUI macOS menubar apps that use Tuist.
.claude/skills/macos-menubar-tuist-app/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -1% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 20% | 0% |
Build and maintain macOS menubar apps with a Tuist-first workflow and stable launch scripts. Preserve strict architecture boundaries so networking, state, and UI remain testable and predictable.
LSUIElement = true by default.@Observable or equivalent), not in row/view presentation code.tuist run is unreliable for macOS target/device resolution.tuist xcodebuild build over raw xcodebuild in local run scripts when building generated projects.Use this placement by default:
Project.swift: app target, settings, resources, Info.plist keysSources/*Model*.swift: API/domain models and decodingSources/*Client*.swift: requests, response mapping, transport concernsSources/*Store*.swift: observable state, refresh policy, filtering, cachingSources/*Menu*View*.swift: menu composition and top-level UI stateSources/*Row*View*.swift: row rendering and lightweight interactionsrun-menubar.sh: canonical local restart/build/launch pathstop-menubar.sh: explicit stop helper when neededTuist.swift and Project.swift (or workspace manifests) exist.curl to verify endpoint shape, auth requirements, and pagination behavior.limit/page, implement full-list handling with local trimming in the store.App or menu scene declarations.tuist generate --no-open when generation is required.TUIST_SKIP_UPDATE_CHECK=1 tuist xcodebuild build ... instead of invoking raw xcodebuild directly.Run validations after edits:
bashTUIST_SKIP_UPDATE_CHECK=1 tuist xcodebuild build -scheme <TargetName> -configuration Debug
If launch workflow changed:
bash./run-menubar.sh
If shell scripts changed:
bashbash -n run-menubar.sh bash -n stop-menubar.sh ./run-menubar.sh
tuist run cannot resolve the macOS destination:Use run/stop scripts as canonical local run path.
Move derived state and filtering into the store; keep views render-only.
Relax model decoding with optional fields and defaults, then surface missing data safely in UI.
Trace root cause in model/client/store before changing row/menu presentation.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 20,190 | 23,833 | +18% | 1 | 1 | 0% | 4,341 | 6,971 | +61% | 0 | 0 | — |
case-02 | fail→fail | 18,341 | 5,247 | -71% | 1 | 1 | 0% | 3,855 | 1,356 | -65% | 0 | 0 | — |
case-03 | fail→pass | 14,255 | 12,484 | -12% | 1 | 1 | 0% | 2,658 | 3,812 | +43% | 0 | 0 | — |
case-04 | fail→fail | 11,902 | 5,998 | -50% | 1 | 1 | 0% | 2,212 | 2,178 | -2% | 0 | 0 | — |
case-05 | fail→fail | 12,653 | 8,037 | -36% | 1 | 1 | 0% | 2,337 | 2,181 | -7% | 0 | 0 | — |
case-06 | fail→fail | 12,051 | 5,051 | -58% | 1 | 1 | 0% | 1,991 | 1,862 | -6% | 0 | 0 | — |
case-07 | fail→pass | 15,123 | 5,153 | -66% | 1 | 1 | 0% | 2,169 | 1,920 | -11% | 0 | 0 | — |
case-08 | fail→pass | 10,912 | 4,966 | -54% | 1 | 1 | 0% | 2,013 | 1,984 | -1% | 0 | 0 | — |
case-09 | fail→pass | 6,827 | 3,026 | -56% | 1 | 1 | 0% | 1,309 | 1,565 | +20% | 0 | 0 | — |
case-10 | fail→pass | 13,467 | 8,769 | -35% | 1 | 1 | 0% | 2,551 | 2,796 | +10% | 0 | 0 | — |
case-11 | fail→fail | 7,041 | 2,335 | -67% | 1 | 1 | 0% | 1,151 | 1,369 | +19% | 0 | 0 | — |
case-12 | fail→fail | 12,273 | 6,524 | -47% | 1 | 1 | 0% | 2,019 | 2,165 | +7% | 0 | 0 | — |
case-13 | pass→pass | 12,706 | 6,314 | -50% | 1 | 1 | 0% | 2,191 | 2,062 | -6% | 0 | 0 | — |
case-14 | fail→fail | 12,518 | 8,132 | -35% | 1 | 1 | 0% | 2,205 | 2,486 | +13% | 0 | 0 | — |
case-15 | fail→fail | 13,141 | 9,678 | -26% | 1 | 1 | 0% | 2,591 | 3,118 | +20% | 0 | 0 | — |
case-16 | fail→fail | 2,747 | 2,188 | -20% | 1 | 1 | 0% | 392 | 1,220 | +211% | 0 | 0 | — |
case-17 | fail→pass | 16,262 | 2,758 | -83% | 1 | 1 | 0% | 2,812 | 1,276 | -55% | 0 | 0 | — |
case-18 | fail→pass | 6,524 | 2,301 | -65% | 1 | 1 | 0% | 1,231 | 1,349 | +10% | 0 | 0 | — |
case-19 | fail→fail | 8,633 | 3,396 | -61% | 1 | 1 | 0% | 1,544 | 1,549 | +0% | 0 | 0 | — |
case-20 | fail→pass | 13,028 | 10,866 | -17% | 1 | 1 | 0% | 2,145 | 3,123 | +46% | 0 | 0 | — |
case-21 | fail→fail | 7,652 | 3,878 | -49% | 1 | 1 | 0% | 1,173 | 1,609 | +37% | 0 | 0 | — |
case-22 | fail→fail | 16,474 | 11,711 | -29% | 1 | 1 | 0% | 2,833 | 2,855 | +1% | 0 | 0 | — |
case-23 | fail→fail | 10,096 | 4,537 | -55% | 1 | 1 | 0% | 1,629 | 1,733 | +6% | 0 | 0 | — |
case-24 | fail→fail | 14,485 | 9,161 | -37% | 1 | 1 | 0% | 2,665 | 2,701 | +1% | 0 | 0 | — |
case-25 | fail→fail | 10,165 | 8,625 | -15% | 1 | 1 | 0% | 2,039 | 2,813 | +38% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 25 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.