Loading...
Loading...
Compare original and translation side by side
plugins/expo/skills/bun/private/tmp/expo-skill-eval-<skill-name>/iteration-N//private/tmp/expo-skill-eval-expo-ui/iteration-4/plugins/expo/skills/AskUserQuestionclaude -pexpoAskUserQuestionplugins/expo/skills/SKILL_PATH = plugins/expo/skills/<skill>/SKILL.md--plugin-dir plugins/expoclaude -pexpo/pluginclaude -p--plugin-direxpoexpo:expo-uiSKILL_PATH--plugin-direxpoexpo-skill-evalexpoexpo/pluginclaude plugin listAskUserQuestionSKILL.mdreferences/references/runtime-matrix.mdevals/evals.jsonpromptAskUserQuestionclaude -preference_imageAskUserQuestionreferences/runtime-matrix.md| Option | What it does | When to suggest as default |
|---|---|---|
| Runtime + screenshots | Full pipeline: fixture → executor → static gate → run the app on iOS/Android and screenshot it. The runner (Expo Go or dev build) is a separate question — don't name it here. | Default for any skill that renders an app screen (the |
| Trigger accuracy | Run realistic prompts via | Always useful as a standalone check. |
| Code checks (no device) | | Default for |
| Present these as ONE multi-select question — "What do you want to verify?" These are grading dimensions (how to judge what gets built) — distinct from the Prompts phase (what to build). The user may pick any combination. When a prompt is an uploaded screenshot (see Prompts), include "Runtime + screenshots" so the harness captures the generated app and the grader can score it against the target. |
references/runtime-matrix.mdbash /abs/path/expo-skill-eval/scripts/latest-sdk.sh56bunnpm view expo dist-tags --jsonJSON.parsesemverAskUserQuestion<sdk>make-fixture.shruntime.sdkexpo startexpo start/dev/nullInput is required, but 'npx expo' is in non-interactive modeAskUserQuestionexpo start --iosexpo start --android@expo/uiexpo run:iosexpo run:androidstatic-onlyexpo runclean-fixture.shclean-fixture.shnode_modulesiosandroid.expodistEXPO_SKILL_EVAL_RUNNERexpo-godev-buildruntime.modeexpo-godev-buildAskUserQuestion@expo/uiHostRowColumnButtonListuse-dom@expo/ui/swift-ui@expo/ui/jetpack-composesnapshot-web.shexpo start --webexpo runruntime.platformsrun_snapshots.pyclaude -pAskUserQuestion--dangerously-skip-permissions--dangerously-skip-permissions/private/tmp/expo-skill-eval-*--permission-mode acceptEditsclaude -pAskUserQuestiongenerate_viewer.pyviewer.htmlbun/private/tmp/expo-skill-eval-<skill-name>/iteration-N//private/tmp/expo-skill-eval-expo-ui/iteration-4/<workspace>/iteration-N/evals.jsonruntime{
"id": 1,
"prompt": "Build me a settings screen with a dark mode toggle and a list of options",
"expected_output": "Working Expo Router screen",
"expectations": [
"Uses Expo Router file-based routing",
"TypeScript compiles with no errors"
],
"runtime": {
"mode": "expo-go",
"platforms": ["ios", "android"],
"sdk": "56"
},
"visual_expectations": [
"No red error screen or Expo Go error overlay on any platform",
"A settings screen with a visible toggle control is rendered"
]
}runtime.mode"expo-go"expo start --<platform>"dev-build"expo run:<platform>"static-only"references/runtime-matrix.mddev-buildstatic-onlyruntime.platformsiosandroidweb["ios", "android"]runtime.sdkreference_imagereference_image{
"prompt": "Build an app whose UI matches the attached reference screenshot.",
"reference_image": "/abs/path/to/target.png",
"runtime": { "mode": "expo-go", "platforms": ["ios"], "sdk": "56" },
"visual_expectations": ["Matches the reference's layout, components, and color treatment"]
}AskUserQuestionclaude -pskip-permissionsaccept-editsexpoAskUserQuestionplugins/expo/skills/SKILL_PATH = plugins/expo/skills/<skill>/SKILL.md--plugin-dir plugins/expoclaude -pexpo/pluginclaude -p--plugin-direxpoexpo:expo-uiSKILL_PATH--plugin-direxpoexpo-skill-evalexpoexpo/pluginclaude plugin listAskUserQuestionSKILL.mdreferences/references/runtime-matrix.mdevals/evals.jsonpromptAskUserQuestionclaude -preference_imageAskUserQuestionreferences/runtime-matrix.md| 选项 | 功能 | 何时建议设为默认 |
|---|---|---|
| 运行时+截图 | 完整流水线:测试夹具 → 执行器 → 静态检查 → 在iOS/Android上运行应用并截图。运行环境(Expo Go或开发构建版)是单独的问题——此处无需提及。 | 默认选项适用于任何渲染应用界面的技能( |
| 触发准确性 | 通过 | 始终适合作为独立检查项。 |
| 代码检查(无需设备) | 执行 | 默认选项适用于 |
| 将这些作为一个多选问题呈现——*“你想要验证哪些内容?”*这些是评分维度(判断构建内容的标准)——与提示词阶段(构建内容)不同。用户可选择任意组合。当提示词为上传截图时(见提示词部分),需包含“运行时+截图”**选项,以便harness捕获生成的应用并让评分器与目标截图对比打分。 |
references/runtime-matrix.mdbash /abs/path/expo-skill-eval/scripts/latest-sdk.sh56bunnpm view expo dist-tags --jsonJSON.parsesemverAskUserQuestion<sdk>make-fixture.shruntime.sdkexpo startexpo start/dev/nullInput is required, but 'npx expo' is in non-interactive modeAskUserQuestionexpo start --iosexpo start --android@expo/uiexpo run:iosexpo run:androidstatic-onlyexpo runclean-fixture.shclean-fixture.shnode_modulesiosandroid.expodistEXPO_SKILL_EVAL_RUNNERexpo-godev-buildruntime.modeexpo-godev-buildAskUserQuestion@expo/uiHostRowColumnButtonListuse-dom@expo/ui/swift-ui@expo/ui/jetpack-composesnapshot-web.shexpo start --webexpo runruntime.platformsrun_snapshots.pyclaude -pAskUserQuestion--dangerously-skip-permissions--dangerously-skip-permissions/private/tmp/expo-skill-eval-*--permission-mode acceptEditsclaude -pAskUserQuestiongenerate_viewer.pyviewer.htmlpython3 <orchestrator>Writepython3 /private/tmp/expo-skill-eval-<skill>/<phase>.pypython3scripts/*.shsubprocess.run(["bash", "<scripts>/<name>.sh", …])python3python3ReadGlobGrepmkdirlscattailechobash …/scripts/<name>.sh …… & echo "$!"wait&echowaitrun_in_backgroundpython3 <orchestrator> 2>&1 | tee <ws>/…log&Writeallowed-toolsBashReadWriteEditevals.json<workspace>/iteration-N/evals.jsonruntime{
"id": 1,
"prompt": "Build me a settings screen with a dark mode toggle and a list of options",
"expected_output": "Working Expo Router screen",
"expectations": [
"Uses Expo Router file-based routing",
"TypeScript compiles with no errors"
],
"runtime": {
"mode": "expo-go",
"platforms": ["ios", "android"],
"sdk": "56"
},
"visual_expectations": [
"No red error screen or Expo Go error overlay on any platform",
"A settings screen with a visible toggle control is rendered"
]
}runtime.mode"expo-go"expo start --<platform>"dev-build"expo run:<platform>"static-only"references/runtime-matrix.mddev-buildstatic-onlyruntime.platformsiosandroidweb["ios", "android"]runtime.sdkreference_imagereference_image{
"prompt": "Build an app whose UI matches the attached reference screenshot.",
"reference_image": "/abs/path/to/target.png",
"runtime": { "mode": "expo-go", "platforms": ["ios"], "sdk": "56" },
"visual_expectations": ["Matches the reference's layout, components, and color treatment"]
}mkdirmkdirmkdir"$WORKSPACE/…"bash /abs/path/expo-skill-eval/scripts/make-workspace.sh /private/tmp/expo-skill-eval-<skill> iteration-N <num-evals>trigger-evals/scratchiteration-N/eval-<i>/{with_skill,without_skill}/outputsBash(bash *expo-skill-eval/scripts/*)mkdirmake-fixture.shos.makedirsWritemkdirpython3 <orchestrator>Writepython3 /private/tmp/expo-skill-eval-<skill>/<phase>.pypython3scripts/*.shsubprocess.run(["bash", "<scripts>/<name>.sh", …])python3python3ReadGlobGrepmkdirlscattailechobash …/scripts/<name>.sh …… & echo "$!"wait&echowaitpython3 <orchestrator> 2>&1 | tee <ws>/…logrun_in_backgroundWriteallowed-toolsBashReadWriteEditevals.jsonrun_trigger_eval_real.pytrigger-evals/"should_trigger": trueclaude -p <query>--output-format=stream-json --verbose --include-partial-messagesCLAUDECODESkillRead--include-partial-messages--output-format=stream-json--verbose--plugin-dirclaude -p--plugin-dir--plugin-dir <plugin-root><plugin-root>plugins/expo.claude-plugin/plugin.json--plugin-dir /Users/.../skills/plugins/exposcratch/plugins/expo<plugin>:<skill>expo:expo-uiexpo/pluginexpoexpo:expo-uiSKILL_PATH--plugin-dirtrigger-evals/scratch/--dangerously-skip-permissionsSkillReadmkdirmkdirmkdir"$WORKSPACE/…"bash /abs/path/expo-skill-eval/scripts/make-workspace.sh /private/tmp/expo-skill-eval-<skill> iteration-N <num-evals>trigger-evals/scratchiteration-N/eval-<i>/{with_skill,without_skill}/outputsBash(bash *expo-skill-eval/scripts/*)mkdirmake-fixture.shos.makedirsWritemkdirscripts/make-fixture.sh <app-path> <sdk> [clean|full]scripts/make-fixture.sh <workspace>/iteration-N/eval-X/<config>/app <sdk> # blank app (default)
scripts/make-fixture.sh <workspace>/iteration-N/eval-X/<config>/app <sdk> full # keep example tabsbunx create-expo-app -t default@sdk-<version>~/.cache/expo-skill-eval/fixtures/cleanreset-projectfullgit diffmake-fixture.sh~/.cache/expo-skill-eval/fixtures/bunx create-expo-appEEXISTsubprocess.run(["bash", "<scripts>/make-fixture.sh", app, sdk, variant])sdkclaude -pThreadPoolExecutormake-fixture.sh A & make-fixture.sh B & wait&waittrigger-evals/run_trigger_eval_real.py"should_trigger": trueclaude -p <query>--output-format=stream-json --verbose --include-partial-messagesCLAUDECODESkillRead--include-partial-messages--output-format=stream-json--verbose--plugin-dirclaude -p--plugin-dir--plugin-dir <plugin-root><plugin-root>.claude-plugin/plugin.jsonplugins/expo--plugin-dir /Users/.../skills/plugins/exposcratch/plugins/expo<plugin>:<skill>expo:expo-uiexpo/pluginexpoexpo:expo-uiSKILL_PATH--plugin-dirtrigger-evals/scratch/--dangerously-skip-permissionsSkillReadclaude -pAgentAgentclaude -p/private/tmp/expo-skill-eval-<skill>/run_executors.pysubprocess.run(["bash", "<scripts>/make-fixture.sh", app, sdk, variant], …)claude -pThreadPoolExecutorpython3reference_image<path>claude -p<app-path>lspackage.jsonapp.jsonsrc/app/app/claude -pCLAUDECODEenv = {k: v for k, v in os.environ.items() if k != "CLAUDECODE"}claude -p--dangerously-skip-permissions--permission-mode acceptEditsclaude -p--plugin-dirSKILL_PATHscripts/make-fixture.sh <app-path> <sdk> [clean|full]scripts/make-fixture.sh <workspace>/iteration-N/eval-X/<config>/app <sdk> # 空白应用(默认)
scripts/make-fixture.sh <workspace>/iteration-N/eval-X/<config>/app <sdk> full # 保留示例标签页bunx create-expo-app -t default@sdk-<version>~/.cache/expo-skill-eval/fixtures/cleanreset-projectfullgit diffmake-fixture.sh~/.cache/expo-skill-eval/fixtures/bunx create-expo-appEEXISTsubprocess.run(["bash", "<scripts>/make-fixture.sh", app, sdk, variant])sdkThreadPoolExecutorclaude -pmake-fixture.sh A & make-fixture.sh B & wait&waitrun_static.pypython3subprocess.run(["bash", "<scripts>/check-static.sh", app, "ios,android"], capture_output=True, …)ThreadPoolExecutor&waiteval-<i>/<config>/static.jsoncheck-static.shtsc --noEmitexpo lintexpo exportclaude -pAgentAgentclaude -p/private/tmp/expo-skill-eval-<skill>/run_executors.pysubprocess.run(["bash", "<scripts>/make-fixture.sh", app, sdk, variant], …)ThreadPoolExecutorclaude -ppython3reference_image<path>claude -p<app-path>lspackage.jsonapp.jsonsrc/app/app/claude -pCLAUDECODEenv = {k: v for k, v in os.environ.items() if k != "CLAUDECODE"}claude -p--dangerously-skip-permissions--permission-mode acceptEditsclaude -p--plugin-dirSKILL_PATHrun_snapshots.pypython3os.makedirsoutputs/subprocess.run(["bash", "<scripts>/snapshot-<platform>.sh", app, f"{outputs}/<platform>.png", port], env={**os.environ, "EXPO_SKILL_EVAL_RUNNER": runner}, …)80818082expo run:ios/android --port Noutputs/dev-buildsubprocess.run(["bash", "<scripts>/clean-fixture.sh", app])expo run:<platform>clean-fixture.shnode_modulesiosandroid.expodistgit diffexpo-gorunnerexpo-godev-buildEXPO_SKILL_EVAL_RUNNERexpo-goexpo start --<platform>dev-buildexpo run:<platform> --port <port>dev-buildEXPO_SKILL_EVAL_BUNDLE_TIMEOUTmake-fixture.shexpo-dev-clientexpo run/snapshot-<platform>.shlsofkillpkillofflineadb emu kill-gpu hosthostSIGABRTGPU_MODEsnapshot-android.shguestswiftshader_indirectsnapshot-web.shplatforms<name>.metro.logxcrun simctl launchadb shell am start -n <pkg>/.MainActivitypython3 /abs/path/expo-skill-eval/scripts/generate_viewer.py /private/tmp/expo-skill-eval-<skill>viewer.htmliteration-N/webbrowser.openopenBash(open:*)run_static.pypython3ThreadPoolExecutorsubprocess.run(["bash", "<scripts>/check-static.sh", app, "ios,android"], capture_output=True, …)&waiteval-<i>/<config>/static.jsoncheck-static.shtsc --noEmitexpo lintexpo exportagents/visual-grader.mdstatic.jsonreference_imagereference_imagereferences/design-rubric.mdgit diffreference_matchqualitygrading.json{
"score": 8.5,
"max_score": 9,
"expectations": [
{"text": "...", "passed": true, "evidence": "..."}
],
"reference_match": {
"score": 7, "max": 10,
"evidence": "ios.png vs target.png: same two-section grouped list + toggle; accent color differs (blue vs target's green); row spacing tighter than target"
},
"quality": {
"dimensions": [
{"name": "Layout & hierarchy", "score": 2, "max": 3, "evidence": "ios.png: …"}
],
"subtotal": 17,
"max": 24,
"summary": "…"
},
"user_notes_summary": {"needs_review": false, "notes": ""}
}expectationsreference_matchqualityreferences/design-rubric.mdrun_snapshots.pypython3outputs/subprocess.run(["bash", "<scripts>/snapshot-<platform>.sh", app, f"{outputs}/<platform>.png", port], env={**os.environ, "EXPO_SKILL_EVAL_RUNNER": runner}, …)80818082expo run:ios/android --port Noutputs/dev-buildsubprocess.run(["bash", "<scripts>/clean-fixture.sh", app])expo run:<platform>clean-fixture.shnode_modulesiosandroid.expodistgit diffexpo-gorunnerexpo-godev-buildEXPO_SKILL_EVAL_RUNNERexpo-goexpo start --<platform>dev-buildexpo run:<platform> --port <port>dev-buildEXPO_SKILL_EVAL_BUNDLE_TIMEOUTmake-fixture.shexpo-dev-clientexpo run/snapshot-<platform>.shlsofkillpkillofflineadb emu kill-gpu hosthostSIGABRTsnapshot-android.shGPU_MODEguestswiftshader_indirectplatformssnapshot-web.sh<name>.metro.logxcrun simctl launchadb shell am start -n <pkg>/.MainActivitypython3 /abs/path/expo-skill-eval/scripts/generate_viewer.py /private/tmp/expo-skill-eval-<skill>iteration-N/viewer.htmlwebbrowser.openopenBash(open:*)runtime.mode: "static-only"snapshot-ios.shsimctlsnapshot-android.shsnapshot-web.shbunxagents/visual-grader.mdstatic.jsonreference_imagereference_imagereferences/design-rubric.mdgit diffreference_matchqualitygrading.json{
"score": 8.5,
"max_score": 9,
"expectations": [
{"text": "...", "passed": true, "evidence": "..."}
],
"reference_match": {
"score": 7, "max": 10,
"evidence": "ios.png vs target.png: same two-section grouped list + toggle; accent color differs (blue vs target's green); row spacing tighter than target"
},
"quality": {
"dimensions": [
{"name": "Layout & hierarchy", "score": 2, "max": 3, "evidence": "ios.png: …"}
],
"subtotal": 17,
"max": 24,
"summary": "…"
},
"user_notes_summary": {"needs_review": false, "notes": ""}
}expectationsreference_matchqualityreferences/design-rubric.md/private/tmp/expo-skill-eval-<skill-name>/iteration-N/ReadWriteEditBashallowed-toolsBash(...)Bash(python3 /private/tmp/expo-skill-eval-*)/tmpBash(python3 *expo-skill-eval/scripts/*)scripts/generate_viewer.pyBash(tee /private/tmp/expo-skill-eval-*)/tmppython3 … 2>&1 | tee <workspace>/…logBash(bash *expo-skill-eval/scripts/*)scripts/*.shpython3 -c …bash -c …tee /etc/…bash <dir>/run.shbash -c …bunxxcrun simctladbgitmkdirexpomkdirlsfindcatgrepmkdir "$WORKSPACE/…"make-workspace.shos.makedirsReadGlobGrep*/Bash(python3 /private/tmp/expo-skill-eval-*)python3 /private/tmp/expo-skill-eval-x/run.py 2>&1Bash(bash *expo-skill-eval/scripts/*)bash /any/abs/path/expo-skill-eval/scripts/foo.sh args**:*Bash(python3:*)Bash(python3 /path-:*)|&&||;&ReadWriteEditBashReadWriteallowed-toolsReadWriteEdit…/expo-skill-eval-*/**/tmp/private/tmpWriteEditevals.json/reload-skillsallowed-tools/reload-skillsbash /abs/path/expo-skill-eval/scripts/snapshot-ios.sh arg1 arg2Bash(bash *expo-skill-eval/scripts/*)&&&||;waittailheadechobash …/scripts/…… 2>&1 | tee <workspace>/…logteepython3 /…/expo-skill-eval-*subprocessThreadPoolExecutorReadGlobGrepcatlsgreptee/private/tmp/expo-skill-eval-<skill>/iteration-N/**/ios.pngfindlscatfind … -exec …-exec-exec rmfindlscat/private/tmp/expo-skill-eval-<skill>/aggregate.pypython3Bash(python3 /private/tmp/expo-skill-eval-*)scripts/generate_viewer.pyBash(python3 *expo-skill-eval/scripts/*)WriteWriteEditpython3 … 2>&1 | tee <workspace>/…logteeReadpython3 -c …-cexpo:expo-uigrading.jsontiming.jsoneval-<N>/<config>/run-1/python3static-onlyreferences/runtime-matrix.md@expo/uicurltiming.json--output-format=stream-json --verboseclaude -pmessage_startmessage_deltaruntime.mode: "static-only"snapshot-ios.shsimctlsnapshot-android.shsnapshot-web.shbunxscripts/generate_viewer.pypython3 /abs/path/expo-skill-eval/scripts/generate_viewer.py /private/tmp/expo-skill-eval-<skill>/private/tmp/expo-skill-eval-<skill>/viewer.htmlwebbrowser.openiteration-*localStorage<iteration>/evals.jsondata:grading.jsonreference_matchqualityreference_matchqualitytrigger-evals/trigger_results.json/private/tmp/expo-skill-eval-<skill-name>/iteration-N/ReadWriteEditBashallowed-toolsBash(...)Bash(python3 /private/tmp/expo-skill-eval-*)/tmpBash(python3 *expo-skill-eval/scripts/*)scripts/generate_viewer.pyBash(tee /private/tmp/expo-skill-eval-*)/tmppython3 … 2>&1 | tee <workspace>/…logBash(bash *expo-skill-eval/scripts/*)scripts/*.shpython3 -c …bash -c …tee /etc/…bash <dir>/run.shbash -c …bunxxcrun simctladbgitmkdirexpomkdirlsfindcatgrepmkdir "$WORKSPACE/…"make-workspace.shos.makedirsReadGlobGrep*/Bash(python3 /private/tmp/expo-skill-eval-*)python3 /private/tmp/expo-skill-eval-x/run.py 2>&1Bash(bash *expo-skill-eval/scripts/*)bash /any/abs/path/expo-skill-eval/scripts/foo.sh args**:*Bash(python3:*)Bash(python3 /path-:*)|&&||;&ReadWriteEditBashReadWriteallowed-toolsReadWriteEdit…/expo-skill-eval-*/**/tmp/private/tmpWriteEditevals.json/reload-skillsallowed-tools/reload-skillsbash /abs/path/expo-skill-eval/scripts/snapshot-ios.sh arg1 arg2Bash(bash *expo-skill-eval/scripts/*)&&&||;waittailheadechobash …/scripts/…… 2>&1 | tee <workspace>/…logteepython3 /…/expo-skill-eval-*subprocessThreadPoolExecutorReadGlobGrepcatlsgreptee/private/tmp/expo-skill-eval-<skill>/iteration-N/**/ios.pngfindlscatfind … -exec …-exec-exec rmfindlscat/private/tmp/expo-skill-eval-<skill>/aggregate.pypython3Bash(python3 /private/tmp/expo-skill-eval-*)scripts/generate_viewer.pyBash(python3 *expo-skill-eval/scripts/*)WriteWriteEditpython3 … 2>&1 | tee <workspace>/…logteeReadpython3 -c …-cexpo:expo-uigrading.jsontiming.jsoneval-<N>/<config>/run-1/python3static-onlyreferences/runtime-matrix.md@expo/uicurltiming.jsonclaude -p--output-format=stream-json --verbosemessage_startmessage_deltaviewer.htmlArtifact<!doctype html>…<head></head><body><style><script>data:<title><!DOCTYPE>/<html>/<head>/<body>--artifactpython3 /abs/path/expo-skill-eval/scripts/generate_viewer.py /private/tmp/expo-skill-eval-<skill> --artifactviewer_artifact.htmlArtifactfavicon: "📊"scripts/generate_viewer.pypython3 /abs/path/expo-skill-eval/scripts/generate_viewer.py /private/tmp/expo-skill-eval-<skill>/private/tmp/expo-skill-eval-<skill>/viewer.htmlwebbrowser.openiteration-*localStorage<iteration>/evals.jsondata:grading.jsonreference_matchqualityreference_matchqualitytrigger-evals/trigger_results.jsonreferences/runtime-matrix.mdagents/visual-grader.mdviewer.htmlArtifact<!doctype html>…<head></head><body><style><script>data:<title><!DOCTYPE>/<html>/<head>/<body>--artifactpython3 /abs/path/expo-skill-eval/scripts/generate_viewer.py /private/tmp/expo-skill-eval-<skill> --artifactviewer_artifact.htmlArtifactfavicon: "📊"references/runtime-matrix.mdagents/visual-grader.md