Asi magic-todo-watch-deploy
Build, deploy, and manage the MagicTodoWatch iOS/watchOS voice-to-task pipeline app. Use when building for device or simulator, fixing Xcode project issues, or running the 7-world backend pipeline.
install
source · Clone the upstream repo
git clone https://github.com/plurigrid/asi
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/plurigrid/asi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/asi/skills/magic-todo-watch-deploy" ~/.claude/skills/plurigrid-asi-magic-todo-watch-deploy && rm -rf "$T"
manifest:
plugins/asi/skills/magic-todo-watch-deploy/SKILL.mdsource content
MagicTodoWatch Deploy
Project Location
- Source:
/Users/alice/worlds/w/MagicTodoWatch/ - jj repo:
/Users/alice/worlds/magic-todo-watch/ - GitHub:
(private)monaduck1069/magic-todo-watch - Bundle ID:
com.monaduck1069.MagicTodoWatch - Watch Bundle:
com.monaduck1069.MagicTodoWatch.watchkitapp - Team:
FLLV2L2D4K - Device (#ee2b49):
00008150-00123D3E0C46401C
Xcode Setup
Xcode is at
/Users/alice/Downloads/Xcode.app. xcode-select points at CommandLineTools, so ALL xcodebuild/xcrun commands need:
DEVELOPER_DIR=/Users/alice/Downloads/Xcode.app/Contents/Developer
For xcrun (simctl, devicectl):
DEVELOPER_DIR=/Users/alice/Downloads/Xcode.app/Contents/Developer /usr/bin/xcrun simctl ...
For xcodebuild:
DEVELOPER_DIR=/Users/alice/Downloads/Xcode.app/Contents/Developer /Users/alice/Downloads/Xcode.app/Contents/Developer/usr/bin/xcodebuild ...
Build & Deploy to Physical Device
XC="DEVELOPER_DIR=/Users/alice/Downloads/Xcode.app/Contents/Developer /Users/alice/Downloads/Xcode.app/Contents/Developer/usr/bin/xcodebuild" DC="DEVELOPER_DIR=/Users/alice/Downloads/Xcode.app/Contents/Developer /Users/alice/Downloads/Xcode.app/Contents/Developer/usr/bin/devicectl" PROJ="-project /Users/alice/worlds/w/MagicTodoWatch/MagicTodoWatch.xcodeproj" DEVICE="id=00008150-00123D3E0C46401C" # Build (includes embedded watch app) $XC $PROJ -scheme MagicTodoWatch -configuration Debug -destination "$DEVICE" -allowProvisioningUpdates clean build # Install APP_PATH=$(ls -d ~/Library/Developer/Xcode/DerivedData/MagicTodoWatch-*/Build/Products/Debug-iphoneos/MagicTodoWatch.app | head -1) $DC device install app --device 00008150-00123D3E0C46401C "$APP_PATH" # Launch (phone must be unlocked) $DC device process launch --device 00008150-00123D3E0C46401C com.monaduck1069.MagicTodoWatch
Build & Deploy to Simulators
SIMCTL="DEVELOPER_DIR=/Users/alice/Downloads/Xcode.app/Contents/Developer /usr/bin/xcrun simctl" IPHONE_SIM=E7F1ADC6-21F1-4BA4-944A-B99D693571B3 # iPhone 17 WATCH_SIM=FE8B667A-A976-4F71-9CE6-F1C7414F5C25 # Apple Watch Series 10 46mm # Boot $SIMCTL boot $IPHONE_SIM $SIMCTL boot $WATCH_SIM # Build for sim $XC $PROJ -scheme MagicTodoWatch -destination "id=$IPHONE_SIM" -allowProvisioningUpdates build # Install $SIMCTL install $IPHONE_SIM ~/Library/Developer/Xcode/DerivedData/MagicTodoWatch-*/Build/Products/Debug-iphonesimulator/MagicTodoWatch.app $SIMCTL install $WATCH_SIM ~/Library/Developer/Xcode/DerivedData/MagicTodoWatch-*/Build/Products/Debug-watchsimulator/MagicTodoWatchWatch.app # Launch $SIMCTL launch $IPHONE_SIM com.monaduck1069.MagicTodoWatch $SIMCTL launch $WATCH_SIM com.monaduck1069.MagicTodoWatch.watchkitapp # Open Simulator.app open /Users/alice/Downloads/Xcode.app/Contents/Developer/Applications/Simulator.app
Architecture
Watch (watchOS 10+) Phone (iOS 17+) ┌──────────────────┐ ┌──────────────────────────┐ │ AudioCaptureMgr │─── PCM chunks ──→│ PhoneSessionManager │ │ LiveTranscriber │ (WCSession) │ ├─ SFSpeechRecognizer │ │ WatchSessionMgr │←── transcripts ──│ ├─ TodoProcessor │ │ WatchContentView │ + todos │ │ ├─ LocalModelService│ └──────────────────┘ │ │ └─ regex fallback │ │ └─ CaptureBufferBridge │ │ └─ JSON → Files app │ └──────────────────────────┘ │ ~/Documents/capture-buffer/ │ ┌────────────▼─────────────┐ │ Desktop Pipeline │ │ p/orchestrate.py │ │ W→T→A→M→P→E↔C │ └──────────────────────────┘
Key Files (iOS Target)
| File | Role |
|---|---|
| WCSessionDelegate, SFSpeech, main coordinator |
| 3-stage extraction chain (NLP → regex → MLX) |
| NLTagger POS/NER on-device extraction |
| JSON export to App Group + Files app |
| Voice memo audio bridge |
Key Files (watchOS Target)
| File | Role |
|---|---|
| AVAudioEngine mic capture |
| Float32→Int16 conversion, chunked send |
| WCSession send/receive |
Common Issues & Fixes
"cannot find 'X' in scope"
File exists but isn't in
project.pbxproj. Add three entries:
- PBXBuildFile (Sources reference)
- PBXFileReference (file declaration)
- PBXGroup children (directory listing)
- PBXSourcesBuildPhase files (compile list)
Python 3.9 compat
Pipeline scripts must work on system Python 3.9.6. Use
from __future__ import annotations instead of X | None union syntax.
Empty entitlements
Both
App.entitlements and Watch.entitlements MUST contain group.com.magictodo.capture App Group for CaptureBufferBridge to work.
Phone locked during launch
devicectl device process launch fails with "Locked" — phone must be unlocked first. Install still works while locked.
7-World Pipeline
# Dry-run the orchestrator python3 /Users/alice/worlds/p/orchestrate.py --dry-run --verbose # Run arena forge conversion python3 /Users/alice/worlds/p/task_to_arena.py /Users/alice/worlds/p/capture-buffer-canonical.org --dry-run # Regenerate olog from arena python3 /Users/alice/worlds/p/task-olog-export.py --input /Users/alice/worlds/p/arena_forge.json --output /Users/alice/worlds/p/task-olog.json --pretty
jj Workflow
JJ=/nix/store/jjyhca8bymk8zvgc65q5cy19wm9pqkmd-jujutsu-0.38.0/bin/jj cd /Users/alice/worlds/magic-todo-watch $JJ status $JJ log $JJ describe -m "description" $JJ new $JJ bookmark set main -r @- $JJ git push --bookmark main
App Icon
Generate with Swift (renders emoji to 1024x1024 PNG):
# See /tmp/gen_icon.swift — renders emoji onto rounded-rect background # Output: App/Assets.xcassets/AppIcon.appiconset/icon_1024.png /usr/bin/swift /tmp/gen_icon.swift