mise run tf:upload <app|all> <ios|macos|all> [--archive-only|--i-am-sure] | archive → export → TestFlight upload (all apps: serial archive, parallel upload) | upload gated --i-am-sure (user-owned, covers the whole batch); archive/export safe | [[local-testflight-upload]] |
mise run preflight:submission <app|all> <ios|macos|all> [--fix] | READ-ONLY ASC submission-readiness gate — releaseType, build attach, copyright, price schedule, age rating, content rights, review contact record, screenshot coverage, IAP, stray reviewSubmissions; prints PASS/BLOCK/MANUAL-VERIFY per item, exits non-zero on any BLOCK | safe (all GETs); --fix PATCHes ONLY copyright/releaseType/build-attach — never pricing, age rating, content rights, or review-contact PII | [[asc-ops-handoff]] |
mise run ck:schema <export|validate|deploy> --app <app> [--env e] | CloudKit schema export / validate / dev-deploy | prod promote = Console-only (user-owned); task prints steps + exit 2 | [[cloudkit-schema-ops]] |
mise run store:screenshots <list|sync|clean> [--app <app>] | sync ASC screenshot PREVIEWS from snapshot baselines (symlinks) | safe; PREVIEW-ONLY (not ASC-spec) | [[appstore-screenshot-pipeline]] |
mise run gen:acknowledgements [--config-path …] | regenerate Settings.bundle license page | safe; output gitignored | [[acknowledgements-generation]] |
mise run gen:settings_root | sync the shared App/Shared/Settings.bundle/Root.plist into both apps' per-app copies (#832 single-sourcing; run by tuist:generate and ci_post_clone.sh before every generate) | safe; output git-tracked (Tuist needs a physical file pre-generate) | — (#832/#837) |
mise run scan:settings_root | drift gate: both per-app Root.plist copies must stay byte-identical to the shared source (#837, required CI job in lint.yml) | safe (read-only gate) | — (#832/#837/#839) |
mise run gen:l10n_fixture | regenerate AppCompositionTests L10n fixture (byte-copy of Sudoku catalog) | safe | [[apple-dev-skills:ai-translated-localization]] |
mise run gen:privacy_fixture | regenerate SudokuAppCompositionTests PrivacyInfo fixture (byte-copy of shipping manifest, #361 group C) | safe | — (#361) |
mise run tuist:generate [--open] | resolve packages + regenerate Game.xcworkspace (tuist install + generate) | safe; run after Project.swift / package changes | [[game-factory-composition]] |
mise run new_game:scaffold <Name> | stamp a compiling game-N skeleton (copies Minesweeper at run time, renames tokens; SDD-006 #479 PR1) | safe; refuses existing destination; never touches git state | [[game-factory-composition]] |
mise run scan:l10n | L10n gate: 0 <TRANSLATE>, all 7 locales per key, + shared-code dotted-key parity (dotted keys referenced from GameAppKit/GameShellUI/SettingsUI/MonetizationUI must exist in every app catalog, #594) | safe (read-only gate) | [[apple-dev-skills:ai-translated-localization]] |
mise run scan:secrets | gitleaks over staged files | safe | [[apple-dev-skills:apple-public-repo-security]] |
mise run scan:hygiene | block secret-shaped files (.p8/.p12/.pem/.env) from history | safe | [[apple-dev-skills:apple-public-repo-security]] |
mise run scan:admob | AdMob SDK isolation gate: only LiveAdMobBridge.swift may import GoogleMobileAds | safe (read-only gate) | [[apple-dev-skills:monetization-sdk-integration]] |
mise run lint:swift [files] | SwiftLint, warn-only (lefthook pre-commit) | safe | [[apple-dev-skills:mise-tool-management]] |
mise run lint:swift_strict [files] | SwiftLint, warnings-fail (PR CI) | safe | [[apple-dev-skills:mise-tool-management]] |
mise run new_app:provisioning | render provisioning walkthrough HTML (public IDs only) | safe | [[asc-ops-handoff]] |
mise run verify:audio | check each #330 gameplay soundKey resolves to a bundled asset (stem == soundKey, resolver-ext) | safe (read-only) | — (#330) |
mise run ui:tour [--app <app>] [--udid u] [--no-build] | deep-link + screenshot every screen (home/daily/practice/board/settings) in light & dark for designer review; uses the #510 DEBUG launch hooks | safe; builds a DEBUG sim app, output gitignored under build/tour/; post-build gate refuses to simctl install if the built Info.plist still has an unresolved $(VAR) (#863) | — (#510, #863) |
mise run worktree:seed <path> | copy every gitignored file matched by .worktreeinclude (Tuist/*.xcconfig, secrets/) from the repo root into a hand-created worktree — run from the MAIN checkout, pointed at the worktree | safe; idempotent; refuses a <path> that isn't a registered git worktree | — (#863) |
mise run test:ui [<app>] [--udid u] [--no-generate] | run host-driven XCUITest E2E suites via the <App>-E2E schemes (both apps: launch smoke + full win→completion) | safe; local on-demand substitute for the per-PR CI gate while XCC quota is out (NOT a GitHub Actions gate) | — (#510 Phase 3) |
mise run watch:pr <number> [interval-s] | watch a PR until a terminal state — one stdout line on MERGED / CLOSED / DIRTY / failing checks, then exit (0 only on MERGED). Built as a Monitor-tool command: Monitor(command: "mise run watch:pr <n>"); every terminal outcome emits, so silence = still pending | safe (read-only gh polling, 45s default interval) | — |