一键导入
ios-run
Triggers on /ios-run only. Builds the current Flutter project on the dev's Mac over SSH and runs it on a connected iPhone, or builds a TestFlight .ipa.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Triggers on /ios-run only. Builds the current Flutter project on the dev's Mac over SSH and runs it on a connected iPhone, or builds a TestFlight .ipa.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Triggers on /clockify-reconciliator <project> only. Adds descriptions to description-less Clockify entries for a configured project, splitting large blocks into 1-3h chunks using git commits from configured repos.
Triggers on /work-recap only. Dispatches to a named recap variant (e.g. zirtue weekly, zirtue daily). Each variant lives in a subfolder under this skill.
Triggers on /schedule-once only. Schedules a SINGLE future run of a Claude prompt (or a raw shell command) on THIS machine via Windows Task Scheduler, as a self-deleting one-time task. The local, one-shot counterpart to the cloud /schedule and the recurring /cron-run. PC must be on and logged in at fire time; Claude Code itself need not be open. Also supports list and cancel.
Triggers on /create-pr only. Drafts a human-light PR for the current branch, scales the body to the diff, suggests visuals, previews locally, and creates it on approval.
Triggers on /autopilot only. Dev is AFK and wants maximum autonomous progress with heavy but purposeful token use. Never block - delegate aggressively to subagents to keep main context lean, resolve real judgment calls via a BOUNDED /iterate-it (capped per run), auto-answer any nested skill's question instead of hanging, log decisions, park true hard-stops, and grind the task to a verified finish.
Triggers on /batch-todos only. Dedupes ai_todos, classifies survivors as EASY (auto-execute) or HARD (dev picks), shows dry-run confirmation, batches all EASY todos, then surfaces the HARD queue.
| name | ios-run |
| description | Triggers on /ios-run only. Builds the current Flutter project on the dev's Mac over SSH and runs it on a connected iPhone, or builds a TestFlight .ipa. |
| argument-hint | [run|ipa] [--logs] [--upload] [--device <name>] |
Build the current Flutter project on the Mac over SSH and run it on a connected iPhone (or make a TestFlight .ipa).
Drives the dev's Mac as a headless iOS build box from the Windows PC. The PC has no rsync and cannot deploy to an iPhone directly, so all building/installing happens on the Mac (iPhone plugged into the Mac via USB) and is triggered over SSH. Deploys via Flutter, which handles iOS 16 and 17+ (Apple's devicectl is iOS-17-only, so it is NOT used). Stateless, idempotent, fail-loud. Flutter projects only.
The dev runs /ios-run from inside a Flutter project directory on the PC to see that project running on the physical iPhone, or to produce an uploadable .ipa. Never auto-fires.
| Invocation | What it does |
|---|---|
/ios-run or /ios-run run | sync, build profile, install on the iPhone; tap the app to open it |
/ios-run run --logs | sync, build profile, flutter run --profile in the foreground (launches + streams logs, Ctrl-C to stop; the AOT app persists) |
/ios-run ipa | sync, flutter build ipa, print the .ipa path for Transporter |
/ios-run ipa --upload | same, then upload via xcrun altool (needs APPLE_ID + APP_SPECIFIC_PASSWORD set on the Mac) |
... --device <name> | required only when more than one iPhone is connected |
From the project root, via the Bash tool (git-bash provides ssh + tar):
bash ~/.claude/skills/ios-run/ios-run.sh <run|ipa> [--logs] [--upload] [--device <name>]
Builds are slow (the first pod install + xcodebuild can take a few minutes), so run it with run_in_background: true and read the output file when it completes. Then relay the result: OK ... on success, or a plain-English FAIL: ... line with the remediation.
The skill assumes these are done. Each maps to a FAIL: message that names the fix if missing:
ssh-keygen -t ed25519), install on the Mac (ssh-copy-id josipmuzic@<host>). Without it every call would hang on a password prompt; BatchMode=yes turns that into a clean failure with the remediation.security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k <login-pw> ~/Library/Keychains/login.keychain-db. Lets codesign tools use the signing key without a GUI prompt.~/.config/ios-run/keychain-pw (chmod 600). An SSH session is a separate security session where the login keychain is locked; the skill unlocks it in-session from this file before building. Tradeoff: the login password sits in a 600 file (acceptable for a personal box; a dedicated signing keychain is the more-secure alternative).Tries, in order: Tailscale IP, Tailscale hostname, then LAN IP, as user josipmuzic. Every SSH call uses -o BatchMode=yes -o ConnectTimeout=8. To change machines, edit the HOSTS / SSH_USER vars at the top of ios-run.sh.
| FAIL message | Fix |
|---|---|
Mac unreachable on any host | Wake the Mac / open the lid (closed-lid MacBook sleeps; no wake-on-LAN), check Tailscale, re-run |
SSH key auth not working | Run the printed ssh-copy-id josipmuzic@<host> once |
.env missing on Mac after sync | The project's gitignored .env did not sync; confirm it exists locally |
No iPhone detected by Flutter | Plug the iPhone into the Mac via USB, unlock it, trust the computer |
Multiple iOS devices connected | Re-run with --device <name> (script lists the names) |
keychain unlock failed / errSecInternalComponent in build | Wrong/missing password in ~/.config/ios-run/keychain-pw, or step 2/3 of setup not done |
flutter build ... failed (signing?) | Register the iPhone UDID at developer.apple.com, or let Xcode auto-manage signing for the Runner target |
another /ios-run in progress | Wait, or clear a stale ~/projects/<project>/.ios-run.lock on the Mac |
tar-over-SSH from native Windows (WSL2 does not share the Windows SSH keys or the Tailscale route).ios/ tree (Xcode project, Podfile, signing) and the gitignored .env always sync (only ios/Pods, build artifacts, and VCS/IDE junk are excluded), with a post-sync assertion.~/development/flutter/bin) and Homebrew (/opt/homebrew/bin, for pod) explicitly rather than relying on the login shell.caffeinate -dimsu is child-scoped to each remote command; a PID lock file with a trap cleanup prevents overlapping runs.Verified working end-to-end (2026-06-09): built + signed (team 32T22K9BPH) + installed the Journeys app on a physical iPhone 11 (iOS 16.1.2) over Tailscale. The path to get there pinned down the iOS-16 device path (Flutter, not devicectl), the non-interactive PATH, and the SSH-session keychain unlock.
Debug-mode hot reload, native/React-Native projects, wake-on-LAN, auto-launch in default run (use --logs to launch, or tap the app). Hot reload is a planned v2 (needs a persistent remote flutter run session plus a file-watcher).