Add a new built-in exercise to Liftosaur end-to-end — image (gymvisual.com → S3), catalog registration, description page, and the LLM/MCP exercise list. Use when adding one or more built-in exercises to the app catalog.
中文简介正在准备中。当前显示原文说明。
Manually test/QA the Liftosaur app on the iOS simulator — drive the real UI, inspect live app state, and set up test data. Use when asked to test, QA, stress-test, verify a change works, reproduce a bug, or hunt for bugs in the running app.
中文简介正在准备中。当前显示原文说明。
实测评分 未实测
查看安装方法安装前可以查看交给 AI 代理的指令内容。
Drive the running app on the iOS simulator, and for anything non-trivial verify against the live app state, not just the screen. Many bugs are UI/data desyncs the screenshot won't show.
Three tools do the work:
ios-simulator MCP — drive the UI (the app is bare RN, so testIDs are queryable).scripts/dump-rn-state.js — read the live Redux state (globalThis.state).liftosaur-local MCP — set up the environment (programs, exercises, history, settings)
on the same account the simulator is signed into.Focus: $ARGUMENTS
The simulator app and the liftosaur-local MCP must be on the SAME account. The MCP's API key
is static (in ~/.claude.json → this project's mcpServers.liftosaur-local.headers), and
debugLogin rebinds that key server-side to a freshly created account — one call aligns both.
python3 -c "import json,os;c=json.load(open(os.path.expanduser('~/.claude.json')));print(c['projects']['/Users/anton/projects/liftosaur']['mcpServers']['liftosaur-local']['headers']['Authorization'].split()[-1])"
node scripts/dump-rn-state.js --eval "globalThis.state.user".
If it's already the test_ account you're mid-scenario with, skip step 3 — each debugLogin
call starts a NEW empty account.node scripts/dump-rn-state.js --eval "globalThis.debugLogin('<key>')"
# → {"userId":"test_xxxxxxxx","email":"test_xxxxxxxx@test.liftosaur.com","apiKeyBound":true}
list_programs via MCP should reflect the same empty account the sim now shows.Requires the local dev server (npm run start:server) — the sign-in bypass and key-rebind
endpoint are Utils_isLocal()-gated, and globalThis.debugLogin exists only in __DEV__
builds. This signs the simulator out of whatever account it was on (that account's local data
stays on-device; a normal sign-in restores it) — leave the sim on the test account when done
and tell the user which account you left it on.
liftosaur-local MCP (or by driving the UI).ios-simulator MCP — target by testID, never pixel-guess.dump-rn-state.js: does the live state match what the screen shows and what
you intended? A mismatch between control ↔ state ↔ intent is a bug.globalThis.debugLogin('<key>') again — brand-new empty account, MCP follows.get_booted_sim_id once (bundle id com.liftosaur.www).ui_find_element(["<testID>"]) → tap the returned frame center. testIDs surface as
AXUniqueId. Prefer semantic targeting over coordinates.ui_view — cheap screenshot for a visual/state check.ui_describe_all — full a11y tree; use sparingly, it can exceed the token limit. If it's
dumped to a file, pull the ids out:
python3 -c "import re;print('\n'.join(dict.fromkeys(re.findall(r'\"AXUniqueId\":\"([^\"]+)\"',open('FILE').read()))))"ui_type after tapping a field; ui_swipe to scroll; launch_app(..., terminate_running:true)
to relaunch. See main CLAUDE.md for idb setup.node scripts/dump-rn-state.js storage.currentProgramId # dotted path
node scripts/dump-rn-state.js --eval "Object.keys(globalThis.state)" # arbitrary expr
node scripts/dump-rn-state.js --eval "globalThis.state.storage.settings.units"
Hermes' JSON.stringify drops undefined/functions, so you get clean IState. Useful roots:
storage (programs, settings, history, stats), progress (in-progress workout),
editProgramStates (edit buffers). Needs Metro connected — a
"Fast Refresh disconnected" banner means it dropped; relaunch the app.
Same account as the sim. Read the DSL guide first — it is not guessable:
get_liftoscript_reference, then get_liftoscript_examples.
create_program / update_program (validate with run_playground BEFORE saving),
list_programs, get_program, delete_program.create_history_record, measurements, set_exercise_data.After creating/updating data via MCP, the device won't see it until it syncs — relaunch with
launch_app(bundle_id, terminate_running:true) to force a full sync, then switch to it in-app
(Me → Program) if needed.
Before driving the UI, know the testIDs and the handlers behind the feature. Fastest path:
spawn an Explore agent to grep testID= in the relevant components and report each control,
its handler, and how it serializes/writes state (with file:line). Note handler asymmetries
(one path preserves a field, a sibling resets it) — those are prime bug candidates.
Native code lives in src/components/** (.tsx using RN primitives; check for .native.tsx
variants). State shapes are in src/types.ts and src/models/state.ts.
ui_find_element frames are in full-scroll coords; taps use screen points.
The tab bar sits at ~y≥762 and overlaps list rows — scroll the target above it before tapping,
or you'll hit a footer tab.ui_type into a numeric/text field, dismiss the keypad
(its keyboard-icon) before dumping state, or the change won't be in state yet.launch_app(..., terminate_running:true).When bug-hunting, write findings to lambda/scripts/bugs/<area>-<date>.md. Per bug: severity,
numbered repro steps, a before/after state dump proving it, any UI-vs-state mismatch, and the
file:line root cause. Reproduce from a clean state before reporting, and list what you verified
working too.
A worked scenario — reuse/repeat mechanics on the Edit Program screens — including a ready-made
fixture program and the exact bugs it surfaced, is in
lambda/scripts/bugs/program-editor-bugs-2026-07-01.md. Use it as a model for structuring a run.
还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
Add a new built-in exercise to Liftosaur end-to-end — image (gymvisual.com → S3), catalog registration, description page, and the LLM/MCP exercise list. Use when adding one or more built-in exercises to the app catalog.
中文简介正在准备中。当前显示原文说明。
Add a new server-rendered page to the Liftosaur website. Use when creating new public-facing pages with routing, SSR, and client hydration.
中文简介正在准备中。当前显示原文说明。
Create a 30%-off coupon for an affiliate or creator on iOS and Android, and draft the reply that tells them how to use it. Use when asked to create, set up or send a coupon or promo code for an affiliate, influencer or creator.
中文简介正在准备中。当前显示原文说明。
Interactively investigate a production Rollbar error. Accepts an occurrence id, item id, item counter, or Rollbar URL. Fetches the error data, assesses how widespread it is, drills into affected users (events, logs, storage, captured state), and works with the developer toward a fix or ignore decision. Use for collaborative debugging; use /fix-rollbar for a straight fetch-and-fix of a single occurrence.
中文简介正在准备中。当前显示原文说明。
Investigate a user-reported issue using server logs, user events, storage snapshots, and Rollbar. Use when given a user id or email plus an issue description (e.g. from a support email).
中文简介正在准备中。当前显示原文说明。
Build a feature end to end — decide worktree vs here, design the architecture and debate it with codex, get the user's approval on a one-pass-readable plan, state the API/state contract, implement with visible diffs, then run two codex reviews (bugs + architecture) and document the result. Use when asked to build/implement/add a feature or do a refactor that involves design decisions.
中文简介正在准备中。当前显示原文说明。