Agent Skills: MagicTodoWatch 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.

UncategorizedID: plurigrid/asi/magic-todo-watch-deploy

Install this agent skill to your local

pnpm dlx add-skill https://github.com/plurigrid/asi/tree/HEAD/plugins/asi/skills/magic-todo-watch-deploy

Skill Files

Browse the full folder contents for magic-todo-watch-deploy.

Download Skill

Loading file tree…

plugins/asi/skills/magic-todo-watch-deploy/SKILL.md

Skill Metadata

Name
magic-todo-watch-deploy
Description
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.

MagicTodoWatch Deploy

Project Location

  • Source: /Users/alice/worlds/w/MagicTodoWatch/
  • jj repo: /Users/alice/worlds/magic-todo-watch/
  • GitHub: monaduck1069/magic-todo-watch (private)
  • 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 | |------|------| | App/Services/PhoneSessionManager.swift | WCSessionDelegate, SFSpeech, main coordinator | | App/Services/TodoProcessor.swift | 3-stage extraction chain (NLP → regex → MLX) | | App/Services/LocalModelService.swift | NLTagger POS/NER on-device extraction | | App/Services/CaptureBufferBridge.swift | JSON export to App Group + Files app | | App/Services/VoiceMemoBridge.swift | Voice memo audio bridge |

Key Files (watchOS Target)

| File | Role | |------|------| | Watch/Services/AudioCaptureManager.swift | AVAudioEngine mic capture | | Watch/Services/LiveTranscriber.swift | Float32→Int16 conversion, chunked send | | Watch/Services/WatchSessionManager.swift | WCSession send/receive |

Common Issues & Fixes

"cannot find 'X' in scope"

File exists but isn't in project.pbxproj. Add three entries:

  1. PBXBuildFile (Sources reference)
  2. PBXFileReference (file declaration)
  3. PBXGroup children (directory listing)
  4. 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