current work #
2025-08-10: faster app dev loop (iOS simulator) #
Goal: cut the change-and-see cycle on js/app (expo 55, dev client, iOS sim).
what changed #
js/app/package.json: addedstart:fast(metro without-ccache clear) anddev:ios(launches dev client on the sim via deep link, no native build).js/app/scripts/dev-ios.sh: boots a sim if needed, verifies metro on :38081, verifies the dev client is installed, then deep-linkstv.aquareum.dev://expo-development-client/?url=…(format confirmed from@expo/cliUrlCreator source). HonorsSP_METRO_PORT/SP_APP_SCHEME/SP_BUNDLE_OVERRIDEto matchapp.config.ts.js/app/README.md: rewritten with daily loop vs one-time setup vs native rebuild triggers, plus the i18n watch gotcha.
verified #
- metro-not-running gate prints hint, exits 1.
- full happy path: booted iPhone 17 Pro sim, dev client (
tv.aquareum.dev) installed, deep link opened, metro received the iOS bundle request from the app.
notes / side observations (not fixed) #
- metro logs are noisy with
exportsresolution warnings (lucide-react-native, @formatjs polyfills,@streamplace/componentssubpath). pre-existing. js/apppackage.jsoni18n:*scripts point at a nonexistentsrc/i18n; real FTL sources live injs/i18n(README documentspnpm -F @streamplace/i18n compile:watch).
2025-08-10 (later): agent visual feedback loop (maestro) #
Added a scriptable UI-capture loop so the agent can see its own work on the sim.
js/app/maestro/home.yaml— shell sweep (Home -> Videos -> Go Live -> Settings), taps real tab labels, asserts visibility per stop.js/app/maestro/stream.yaml— taps the firstLIVE, .*card, captures player, backs out.js/app/scripts/ui-shoot.sh—pnpm app ui:shoot <flow>: relaunches app, records run.mp4 (simctl recordVideo, needs--display internal), runs the maestro flow from insideartifacts/<flow>so screenshots land there, dumps end-state hierarchy.json. Deterministic output dir, wiped per run..gitignore:artifacts/.- README: "Visual feedback for the agent" section.
Learned: maestro text selectors are regex by default (no regex: true prop);
takeScreenshot names are relative to maestro's cwd; simctl recordVideo fails
with SimRenderServer error 2 unless --display internal and errors "Host
recording is already in progress" if a previous recorder is still running
(kill with SIGINT, not SIGKILL). Verified both flows end to end on the sim.
Left running after session: metro on :38081 (background job), sim booted.
2025-08-10 (even later): streamplace-app skill #
Created .claude/skills/streamplace-app/SKILL.md — project-scoped skill encoding
the app dev loop + maestro visual feedback workflow. Description covers trigger
words (app UI, visual verification, screenshots, expo).
Git mechanics: ~/.gitignore_global ignores .claude/, so added negations to
repo .gitignore (!.claude/ + !.claude/skills/**) and re-ignored
/.claude/settings.local.json. Skill verified trackable.
Skill loading: discovered at session start from ~/.claude/skills/ (user) and
.claude/skills/ (project). Won't appear in the skill list until the next
session — could not verify discovery mid-session. Fallback if it doesn't show:
move to ~/.claude/skills/streamplace-app/.
2025-08-10 (night): maestro install prompt in ui-shoot.sh #
ui-shoot.sh now locates maestro before doing anything: command -v maestro,
falling back to ~/.maestro/bin/maestro (official installer's home), and if
both miss, prints the official install command and interactively offers to run
it (non-TTY runs exit 1 with the hint — no hanging for agents/CI). Replaced
bare maestro calls with $MAESTRO. Verified: syntax, missing branch (message
- exit 1), home-fallback full run (5 screenshots + video + tree). Did NOT test the interactive "y" install path (would reinstall maestro via curl|bash). README + skill updated with the behavior.