taphound 0.2.0-dev.1 → 0.2.0-dev.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -149
- package/README.zh-CN.md +47 -147
- package/assets/skills/taphound-case-suite/SKILL.md +363 -0
- package/assets/skills/taphound-case-suite/schemas/base-flow-record.schema.json +22 -0
- package/assets/skills/taphound-case-suite/schemas/case-catalog.schema.json +26 -0
- package/assets/skills/taphound-case-suite/schemas/case-ledger.schema.json +158 -0
- package/assets/skills/taphound-case-suite/schemas/suite-input.schema.json +41 -0
- package/assets/skills/taphound-case-suite/schemas/transition.schema.json +61 -0
- package/assets/skills/taphound-case-suite/scripts/ledger.mjs +1207 -0
- package/assets/skills/taphound-case-suite/templates/base-flow-record.example.json +20 -0
- package/assets/skills/taphound-case-suite/templates/suite-input.example.json +27 -0
- package/assets/skills/taphound-case-suite/templates/transition.example.json +8 -0
- package/assets/skills/taphound-flash/SKILL.md +115 -0
- package/assets/skills/taphound-flash/scripts/flash.mjs +585 -0
- package/assets/skills/taphound-flash/templates/flash-plan.example.json +15 -0
- package/assets/skills/taphound-journey-brief-author/CONTEXT-GUIDE.md +471 -0
- package/assets/skills/taphound-journey-brief-author/SKILL.md +494 -0
- package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.md +96 -0
- package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.zh-CN.md +80 -0
- package/assets/skills/taphound-journey-brief-author/prompts/context-analyze-project.md +309 -0
- package/assets/skills/taphound-journey-brief-author/schemas/context-refresh-result.json +123 -0
- package/assets/skills/taphound-journey-brief-author/schemas/project-context-module.json +192 -0
- package/assets/skills/taphound-journey-brief-author/schemas/project-context.json +152 -0
- package/assets/skills/taphound-journey-brief-author/templates/project-context-module.example.json +58 -0
- package/assets/skills/taphound-journey-brief-author/templates/project-context.example.json +51 -0
- package/assets/skills/taphound-journey-brief-author/templates/taphound-journey-brief.template.md +63 -0
- package/assets/skills/taphound-journey-generator/SKILL.md +500 -0
- package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/prompts/check-completion.md +3 -0
- package/assets/skills/taphound-journey-generator/prompts/consume-journey-brief.md +52 -0
- package/assets/skills/taphound-journey-generator/prompts/generate-step.md +211 -0
- package/assets/skills/taphound-journey-generator/prompts/select-flow.md +91 -0
- package/assets/skills/taphound-journey-generator/references/bridge.md +35 -0
- package/assets/skills/taphound-journey-generator/references/mid-session.md +44 -0
- package/assets/skills/taphound-journey-generator/schemas/external-flow.json +37 -0
- package/assets/skills/taphound-journey-generator/schemas/flow.json +28 -0
- package/assets/skills/taphound-journey-generator/schemas/journey-source.json +25 -0
- package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/observe-output.json +13 -4
- package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/proposed-step-envelope.json +127 -5
- package/assets/skills/taphound-journey-generator/scripts/envelope.mjs +561 -0
- package/assets/skills/taphound-journey-generator/templates/external-flow.example.json +22 -0
- package/assets/skills/taphound-journey-generator/templates/flow.example.json +22 -0
- package/assets/skills/taphound-journey-generator/templates/journey-source.example.json +17 -0
- package/assets/skills/taphound-journey-generator/templates/taphound-journey-brief.example.md +70 -0
- package/assets/skills/taphound-verify-change/SKILL.md +91 -0
- package/assets/skills/taphound-verify-change/references/accept.md +38 -0
- package/assets/skills/taphound-verify-change/references/preserve.md +349 -0
- package/assets/skills/taphound-verify-change/schemas/workflow-manifest.schema.json +295 -0
- package/assets/skills/taphound-verify-change/scripts/handoff.mjs +482 -0
- package/assets/skills/taphound-verify-change/scripts/ui-refactor.mjs +505 -0
- package/dist/adapters/adb/adb-adapter.d.ts +16 -2
- package/dist/adapters/adb/adb-adapter.js +199 -0
- package/dist/adapters/adb/system-uiautomator-snapshot-provider.d.ts +13 -0
- package/dist/adapters/adb/system-uiautomator-snapshot-provider.js +122 -0
- package/dist/adapters/adb/ui-automator-parser.d.ts +3 -0
- package/dist/adapters/adb/ui-automator-parser.js +160 -0
- package/dist/adapters/adb/window-topology-parser.d.ts +2 -0
- package/dist/adapters/adb/window-topology-parser.js +101 -0
- package/dist/adapters/android-cli/android-cli-adapter.d.ts +16 -8
- package/dist/adapters/android-cli/android-cli-adapter.js +137 -15
- package/dist/adapters/android-cli/android-cli-snapshot-provider.d.ts +9 -0
- package/dist/adapters/android-cli/android-cli-snapshot-provider.js +99 -0
- package/dist/adapters/android-cli/layout-parser.js +12 -8
- package/dist/adapters/appium/appium-doctor.d.ts +7 -0
- package/dist/adapters/appium/appium-doctor.js +128 -0
- package/dist/adapters/appium/appium-ui-snapshot-provider.d.ts +34 -0
- package/dist/adapters/appium/appium-ui-snapshot-provider.js +240 -0
- package/dist/adapters/camera/camera-probe-adapter.d.ts +18 -0
- package/dist/adapters/camera/camera-probe-adapter.js +286 -0
- package/dist/adapters/filesystem/artifact-store.js +40 -1
- package/dist/adapters/filesystem/context-document-writer.d.ts +15 -0
- package/dist/adapters/filesystem/context-document-writer.js +112 -0
- package/dist/adapters/filesystem/external-flow-registry.d.ts +17 -0
- package/dist/adapters/filesystem/external-flow-registry.js +325 -0
- package/dist/adapters/filesystem/generation-session-store.d.ts +17 -11
- package/dist/adapters/filesystem/generation-session-store.js +281 -855
- package/dist/adapters/filesystem/generation-store/session-lock.d.ts +29 -0
- package/dist/adapters/filesystem/generation-store/session-lock.js +202 -0
- package/dist/adapters/filesystem/generation-store/session-transitions.d.ts +24 -0
- package/dist/adapters/filesystem/generation-store/session-transitions.js +340 -0
- package/dist/adapters/filesystem/generation-store/store-files.d.ts +50 -0
- package/dist/adapters/filesystem/generation-store/store-files.js +363 -0
- package/dist/adapters/filesystem/journey-composition-store.d.ts +23 -0
- package/dist/adapters/filesystem/journey-composition-store.js +151 -0
- package/dist/adapters/filesystem/knowledge-registry.d.ts +12 -0
- package/dist/adapters/filesystem/knowledge-registry.js +223 -0
- package/dist/adapters/filesystem/project-bound-file.js +3 -5
- package/dist/adapters/filesystem/project-file-inspector.d.ts +2 -0
- package/dist/adapters/filesystem/project-file-inspector.js +57 -28
- package/dist/adapters/filesystem/project-identity-inspector.d.ts +7 -0
- package/dist/adapters/filesystem/project-identity-inspector.js +215 -0
- package/dist/adapters/filesystem/project-inventory-inspector.d.ts +8 -0
- package/dist/adapters/filesystem/project-inventory-inspector.js +93 -0
- package/dist/adapters/filesystem/project-module-discoverer.d.ts +6 -0
- package/dist/adapters/filesystem/project-module-discoverer.js +158 -0
- package/dist/adapters/filesystem/skill-installer.d.ts +7 -2
- package/dist/adapters/filesystem/skill-installer.js +40 -11
- package/dist/adapters/filesystem/workspace-layout.d.ts +7 -0
- package/dist/adapters/filesystem/workspace-layout.js +57 -0
- package/dist/adapters/git/node-git-diff.d.ts +17 -0
- package/dist/adapters/git/node-git-diff.js +114 -0
- package/dist/adapters/process/node-detached-process-launcher.d.ts +6 -0
- package/dist/adapters/process/node-detached-process-launcher.js +96 -0
- package/dist/adapters/process/node-process-runner.js +11 -2
- package/dist/adapters/prompt/inquirer-align-prompt.d.ts +27 -0
- package/dist/adapters/prompt/inquirer-align-prompt.js +65 -0
- package/dist/adapters/prompt/inquirer-generation-prompt.js +3 -0
- package/dist/adapters/prompt/inquirer-recorder-prompt.d.ts +9 -1
- package/dist/adapters/prompt/inquirer-recorder-prompt.js +63 -0
- package/dist/adapters/runtime/adb-runtime-backend.d.ts +67 -0
- package/dist/adapters/runtime/adb-runtime-backend.js +206 -0
- package/dist/adapters/runtime/fake-runtime-backend.d.ts +87 -0
- package/dist/adapters/runtime/fake-runtime-backend.js +240 -0
- package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.d.ts +45 -0
- package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.js +153 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.d.ts +23 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.js +39 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.d.ts +20 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.js +180 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.d.ts +78 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.js +379 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-tools.d.ts +46 -0
- package/dist/adapters/runtime/session-adb-view.d.ts +53 -0
- package/dist/adapters/runtime/session-adb-view.js +193 -0
- package/dist/adapters/runtime/session-backed-ports.d.ts +21 -0
- package/dist/adapters/runtime/session-backed-ports.js +43 -0
- package/dist/adapters/runtime/shared-session-runtime-backend.d.ts +12 -0
- package/dist/adapters/runtime/shared-session-runtime-backend.js +64 -0
- package/dist/adapters/ui/auto-ui-snapshot-provider.d.ts +8 -0
- package/dist/adapters/ui/auto-ui-snapshot-provider.js +48 -0
- package/dist/adapters/ui/device-layout-temp.d.ts +6 -0
- package/dist/adapters/ui/device-layout-temp.js +18 -0
- package/dist/adapters/ui/device-ui-environment.d.ts +13 -0
- package/dist/adapters/ui/device-ui-environment.js +81 -0
- package/dist/adapters/ui/layout-normalization.d.ts +9 -0
- package/dist/adapters/ui/layout-normalization.js +44 -0
- package/dist/adapters/ui/ui-snapshot-error.d.ts +11 -0
- package/dist/adapters/ui/ui-snapshot-error.js +12 -0
- package/dist/adapters/ui/ui-snapshot-support.d.ts +15 -0
- package/dist/adapters/ui/ui-snapshot-support.js +12 -0
- package/dist/application/align/align-service.d.ts +42 -0
- package/dist/application/align/align-service.js +106 -0
- package/dist/application/assertion/expectation-evaluator.d.ts +18 -5
- package/dist/application/assertion/expectation-evaluator.js +156 -18
- package/dist/application/assertion/guarded-expectation.d.ts +45 -0
- package/dist/application/assertion/guarded-expectation.js +74 -0
- package/dist/application/checkpoint/baseline-capturer.d.ts +26 -0
- package/dist/application/checkpoint/baseline-capturer.js +163 -0
- package/dist/application/checkpoint/baseline-error.d.ts +5 -0
- package/dist/application/checkpoint/baseline-error.js +8 -0
- package/dist/application/checkpoint/baseline-service.d.ts +31 -0
- package/dist/application/checkpoint/baseline-service.js +147 -0
- package/dist/application/checkpoint/checkpoint-evaluator.d.ts +35 -0
- package/dist/application/checkpoint/checkpoint-evaluator.js +415 -0
- package/dist/application/checkpoint/regression-comparator.d.ts +18 -0
- package/dist/application/checkpoint/regression-comparator.js +192 -0
- package/dist/application/collector/logcat-collector.d.ts +22 -1
- package/dist/application/collector/logcat-collector.js +103 -15
- package/dist/application/collector/logcat-event.d.ts +8 -0
- package/dist/application/collector/logcat-event.js +79 -0
- package/dist/application/collector/logcat-stop.d.ts +2 -0
- package/dist/application/collector/logcat-stop.js +11 -0
- package/dist/application/context/context-generator.d.ts +45 -0
- package/dist/application/context/context-generator.js +228 -0
- package/dist/application/context/context-loader.d.ts +40 -0
- package/dist/application/context/context-loader.js +223 -0
- package/dist/application/context/context-refresher.d.ts +59 -0
- package/dist/application/context/context-refresher.js +349 -0
- package/dist/application/context/context-rehasher.d.ts +36 -0
- package/dist/application/context/context-rehasher.js +110 -0
- package/dist/application/context/context-validator.d.ts +23 -1
- package/dist/application/context/context-validator.js +116 -9
- package/dist/application/context/evidence-hash.d.ts +1 -0
- package/dist/application/context/evidence-hash.js +125 -0
- package/dist/application/context/evidence-match.d.ts +9 -0
- package/dist/application/context/evidence-match.js +8 -0
- package/dist/application/context/shard-identity.d.ts +2 -0
- package/dist/application/context/shard-identity.js +7 -0
- package/dist/application/contract/contract-loader.d.ts +25 -0
- package/dist/application/contract/contract-loader.js +68 -0
- package/dist/application/contract/contract-review.d.ts +25 -0
- package/dist/application/contract/contract-review.js +51 -0
- package/dist/application/contract/contract-verifier.d.ts +53 -0
- package/dist/application/contract/contract-verifier.js +645 -0
- package/dist/application/devices/resolve-device-assignments.d.ts +21 -0
- package/dist/application/devices/resolve-device-assignments.js +60 -0
- package/dist/application/diagnosis/failure-classifier.d.ts +23 -0
- package/dist/application/diagnosis/failure-classifier.js +179 -0
- package/dist/application/doctor/doctor-service.d.ts +36 -3
- package/dist/application/doctor/doctor-service.js +255 -25
- package/dist/application/generation/generation-app-preparer.d.ts +20 -0
- package/dist/application/generation/generation-app-preparer.js +28 -0
- package/dist/application/generation/generation-config-service.d.ts +21 -0
- package/dist/application/generation/generation-config-service.js +53 -0
- package/dist/application/generation/generation-confirmation-service.d.ts +14 -3
- package/dist/application/generation/generation-confirmation-service.js +109 -24
- package/dist/application/generation/generation-context-snapshot.d.ts +6 -0
- package/dist/application/generation/generation-context-snapshot.js +29 -0
- package/dist/application/generation/generation-finalizer.d.ts +15 -9
- package/dist/application/generation/generation-finalizer.js +167 -70
- package/dist/application/generation/generation-publisher.js +12 -8
- package/dist/application/generation/generation-recovery-service.d.ts +35 -0
- package/dist/application/generation/generation-recovery-service.js +144 -0
- package/dist/application/generation/generation-reopen-service.d.ts +15 -0
- package/dist/application/generation/generation-reopen-service.js +37 -0
- package/dist/application/generation/generation-replace-service.d.ts +32 -0
- package/dist/application/generation/generation-replace-service.js +116 -0
- package/dist/application/generation/generation-starter.d.ts +44 -4
- package/dist/application/generation/generation-starter.js +175 -8
- package/dist/application/generation/generation-step-executor.d.ts +67 -5
- package/dist/application/generation/generation-step-executor.js +471 -108
- package/dist/application/generation/proposed-step-validator.js +96 -30
- package/dist/application/generation/replay-policy-loader.d.ts +16 -0
- package/dist/application/generation/replay-policy-loader.js +29 -0
- package/dist/application/generation/risk-evaluator.d.ts +4 -1
- package/dist/application/generation/risk-evaluator.js +118 -3
- package/dist/application/generation/runtime-observer.d.ts +39 -7
- package/dist/application/generation/runtime-observer.js +193 -24
- package/dist/application/impact/impact-resolver.d.ts +32 -0
- package/dist/application/impact/impact-resolver.js +160 -0
- package/dist/application/init/init-service.js +26 -13
- package/dist/application/interaction/action-executor.d.ts +3 -2
- package/dist/application/interaction/action-executor.js +11 -1
- package/dist/application/interaction/action-target.d.ts +17 -0
- package/dist/application/interaction/action-target.js +40 -0
- package/dist/application/interaction/external-step-runner.d.ts +153 -0
- package/dist/application/interaction/external-step-runner.js +332 -0
- package/dist/application/interaction/fallback-resolver.d.ts +6 -3
- package/dist/application/interaction/fallback-resolver.js +7 -5
- package/dist/application/interaction/scroll-to-executor.d.ts +17 -3
- package/dist/application/interaction/scroll-to-executor.js +118 -36
- package/dist/application/journey/external-flow-resolver.d.ts +25 -0
- package/dist/application/journey/external-flow-resolver.js +22 -0
- package/dist/application/journey/journey-check-service.d.ts +54 -0
- package/dist/application/journey/journey-check-service.js +207 -0
- package/dist/application/journey/journey-promoter.d.ts +26 -0
- package/dist/application/journey/journey-promoter.js +123 -0
- package/dist/application/journey/journey-resolver.d.ts +42 -0
- package/dist/application/journey/journey-resolver.js +239 -0
- package/dist/application/journey/journey-retirer.d.ts +25 -0
- package/dist/application/journey/journey-retirer.js +87 -0
- package/dist/application/knowledge/anchor-resolver.d.ts +36 -0
- package/dist/application/knowledge/anchor-resolver.js +110 -0
- package/dist/application/knowledge/knowledge-loader.d.ts +16 -0
- package/dist/application/knowledge/knowledge-loader.js +36 -0
- package/dist/application/locator/layout-failure-summary.d.ts +2 -0
- package/dist/application/locator/layout-failure-summary.js +67 -0
- package/dist/application/locator/layout-traversal.d.ts +11 -0
- package/dist/application/locator/layout-traversal.js +18 -0
- package/dist/application/locator/locator-resolver.d.ts +13 -1
- package/dist/application/locator/locator-resolver.js +182 -18
- package/dist/application/observe/observe-service.d.ts +20 -0
- package/dist/application/observe/observe-service.js +91 -0
- package/dist/application/project/project-describer.d.ts +14 -6
- package/dist/application/project/project-describer.js +38 -5
- package/dist/application/recognition/screen-detector.d.ts +28 -0
- package/dist/application/recognition/screen-detector.js +111 -0
- package/dist/application/recorder/locator-selector.js +151 -17
- package/dist/application/recorder/recorder-service.d.ts +16 -4
- package/dist/application/recorder/recorder-service.js +420 -128
- package/dist/application/report/report-writer.js +1 -1
- package/dist/application/runtime/cold-launch.d.ts +28 -0
- package/dist/application/runtime/cold-launch.js +59 -0
- package/dist/application/runtime/step-runner.d.ts +49 -4
- package/dist/application/runtime/step-runner.js +721 -130
- package/dist/application/runtime/verify-runtime.d.ts +57 -7
- package/dist/application/runtime/verify-runtime.js +554 -174
- package/dist/application/ui/cached-ui-snapshot-provider.d.ts +45 -0
- package/dist/application/ui/cached-ui-snapshot-provider.js +111 -0
- package/dist/application/ui/ui-snapshot-lifecycle.d.ts +2 -0
- package/dist/application/ui/ui-snapshot-lifecycle.js +8 -0
- package/dist/application/ui/ui-stability-probe.d.ts +3 -0
- package/dist/application/ui/ui-stability-probe.js +8 -0
- package/dist/application/wait/idle-advice.d.ts +6 -0
- package/dist/application/wait/idle-advice.js +27 -0
- package/dist/application/wait/idle-profiles.d.ts +15 -0
- package/dist/application/wait/idle-profiles.js +75 -0
- package/dist/application/wait/idle-waiter.d.ts +28 -4
- package/dist/application/wait/idle-waiter.js +186 -15
- package/dist/cli/commands/align.d.ts +3 -0
- package/dist/cli/commands/align.js +124 -0
- package/dist/cli/commands/baseline.d.ts +3 -0
- package/dist/cli/commands/baseline.js +130 -0
- package/dist/cli/commands/context.js +300 -27
- package/dist/cli/commands/contract.d.ts +3 -0
- package/dist/cli/commands/contract.js +120 -0
- package/dist/cli/commands/doctor.js +16 -9
- package/dist/cli/commands/failure.d.ts +3 -0
- package/dist/cli/commands/failure.js +63 -0
- package/dist/cli/commands/generation/lifecycle-commands.d.ts +5 -0
- package/dist/cli/commands/generation/lifecycle-commands.js +211 -0
- package/dist/cli/commands/generation/session-commands.d.ts +11 -0
- package/dist/cli/commands/generation/session-commands.js +472 -0
- package/dist/cli/commands/generation/shared.d.ts +1414 -0
- package/dist/cli/commands/generation/shared.js +291 -0
- package/dist/cli/commands/generation/step-commands.d.ts +8 -0
- package/dist/cli/commands/generation/step-commands.js +315 -0
- package/dist/cli/commands/generation.js +10 -507
- package/dist/cli/commands/impact.d.ts +3 -0
- package/dist/cli/commands/impact.js +87 -0
- package/dist/cli/commands/init.js +13 -6
- package/dist/cli/commands/journey.d.ts +3 -0
- package/dist/cli/commands/journey.js +382 -0
- package/dist/cli/commands/knowledge.d.ts +3 -0
- package/dist/cli/commands/knowledge.js +93 -0
- package/dist/cli/commands/observe.d.ts +3 -0
- package/dist/cli/commands/observe.js +127 -0
- package/dist/cli/commands/project.js +2 -1
- package/dist/cli/commands/record.js +18 -5
- package/dist/cli/commands/verify.js +273 -63
- package/dist/cli/dependencies.d.ts +125 -1
- package/dist/cli/dependencies.js +450 -51
- package/dist/cli/diff-verification.d.ts +41 -0
- package/dist/cli/diff-verification.js +192 -0
- package/dist/cli/main.js +49 -1
- package/dist/cli/output.d.ts +5 -3
- package/dist/cli/output.js +12 -0
- package/dist/cli/program.js +19 -1
- package/dist/cli/project-root.d.ts +1 -0
- package/dist/cli/project-root.js +6 -0
- package/dist/cli/runtime-selection.d.ts +22 -0
- package/dist/cli/runtime-selection.js +92 -0
- package/dist/cli/version.d.ts +1 -0
- package/dist/cli/version.js +14 -0
- package/dist/cli/workspace-guard.d.ts +2 -0
- package/dist/cli/workspace-guard.js +3 -0
- package/dist/domain/binding-reference.d.ts +4 -0
- package/dist/domain/binding-reference.js +23 -0
- package/dist/domain/checkpoint.d.ts +404 -0
- package/dist/domain/checkpoint.js +297 -0
- package/dist/domain/config.d.ts +107 -1
- package/dist/domain/config.js +52 -6
- package/dist/domain/contract.d.ts +413 -0
- package/dist/domain/contract.js +196 -0
- package/dist/domain/external-flow.d.ts +493 -0
- package/dist/domain/external-flow.js +15 -0
- package/dist/domain/failure-classification.d.ts +176 -0
- package/dist/domain/failure-classification.js +169 -0
- package/dist/domain/failure.d.ts +2 -1
- package/dist/domain/failure.js +123 -0
- package/dist/domain/generation.d.ts +1671 -132
- package/dist/domain/generation.js +202 -13
- package/dist/domain/geometry.d.ts +13 -0
- package/dist/domain/geometry.js +16 -0
- package/dist/domain/impact.d.ts +71 -0
- package/dist/domain/impact.js +76 -0
- package/dist/domain/init.d.ts +12 -4
- package/dist/domain/init.js +24 -18
- package/dist/domain/journey-composition.d.ts +2285 -0
- package/dist/domain/journey-composition.js +85 -0
- package/dist/domain/journey-lifecycle.d.ts +10 -0
- package/dist/domain/journey-lifecycle.js +9 -0
- package/dist/domain/journey.d.ts +2419 -212
- package/dist/domain/journey.js +384 -14
- package/dist/domain/knowledge.d.ts +165 -0
- package/dist/domain/knowledge.js +188 -0
- package/dist/domain/layout.d.ts +34 -5
- package/dist/domain/layout.js +64 -6
- package/dist/domain/locator-evidence.d.ts +3 -0
- package/dist/domain/locator-evidence.js +36 -0
- package/dist/domain/logcat-event.d.ts +54 -0
- package/dist/domain/logcat-event.js +40 -0
- package/dist/domain/observation.d.ts +33 -0
- package/dist/domain/observation.js +18 -0
- package/dist/domain/project-context.d.ts +219 -1
- package/dist/domain/project-context.js +209 -6
- package/dist/domain/proposed-step.d.ts +340 -60
- package/dist/domain/proposed-step.js +23 -3
- package/dist/domain/report.d.ts +1455 -28
- package/dist/domain/report.js +211 -14
- package/dist/domain/runtime-snapshot.d.ts +58 -1
- package/dist/domain/runtime-snapshot.js +14 -3
- package/dist/domain/runtime.d.ts +50 -0
- package/dist/domain/runtime.js +36 -0
- package/dist/domain/system-app-profiles.d.ts +6 -0
- package/dist/domain/system-app-profiles.js +43 -0
- package/dist/domain/ui-backend.d.ts +28 -0
- package/dist/domain/ui-backend.js +33 -0
- package/dist/domain/ui-cache.d.ts +11 -0
- package/dist/domain/ui-cache.js +10 -0
- package/dist/domain/window-hierarchy.d.ts +84 -0
- package/dist/domain/window-hierarchy.js +172 -0
- package/dist/domain/workflow-manifest.d.ts +77 -0
- package/dist/domain/workflow-manifest.js +136 -0
- package/dist/domain/workspace.d.ts +28 -0
- package/dist/domain/workspace.js +72 -0
- package/dist/ports/adb.d.ts +34 -1
- package/dist/ports/align-prompt.d.ts +11 -0
- package/dist/ports/align-prompt.js +6 -0
- package/dist/ports/anchor-resolver.d.ts +30 -0
- package/dist/ports/anchor-resolver.js +1 -0
- package/dist/ports/annotated-screen-resolver.d.ts +4 -0
- package/dist/ports/annotated-screen-resolver.js +1 -0
- package/dist/ports/camera-probe.d.ts +23 -0
- package/dist/ports/camera-probe.js +8 -0
- package/dist/ports/context-document-writer.d.ts +24 -0
- package/dist/ports/context-document-writer.js +1 -0
- package/dist/ports/detached-process-launcher.d.ts +12 -0
- package/dist/ports/detached-process-launcher.js +1 -0
- package/dist/ports/external-flow-registry.d.ts +37 -0
- package/dist/ports/external-flow-registry.js +1 -0
- package/dist/ports/generation-prompt.d.ts +2 -1
- package/dist/ports/generation-session-store.d.ts +12 -2
- package/dist/ports/git-diff.d.ts +9 -0
- package/dist/ports/git-diff.js +1 -0
- package/dist/ports/journey-composition-store.d.ts +17 -0
- package/dist/ports/journey-composition-store.js +1 -0
- package/dist/ports/knowledge-registry.d.ts +20 -0
- package/dist/ports/knowledge-registry.js +1 -0
- package/dist/ports/process-runner.d.ts +7 -0
- package/dist/ports/project-file-inspector.d.ts +1 -0
- package/dist/ports/project-identity-inspector.d.ts +24 -0
- package/dist/ports/project-identity-inspector.js +1 -0
- package/dist/ports/project-inventory-inspector.d.ts +21 -0
- package/dist/ports/project-inventory-inspector.js +1 -0
- package/dist/ports/project-module-discoverer.d.ts +26 -0
- package/dist/ports/project-module-discoverer.js +1 -0
- package/dist/ports/recorder-prompt.d.ts +10 -1
- package/dist/ports/runtime-backend.d.ts +89 -0
- package/dist/ports/runtime-backend.js +13 -0
- package/dist/ports/runtime-capability.d.ts +12 -0
- package/dist/ports/runtime-capability.js +20 -0
- package/dist/ports/runtime-session-ports.d.ts +25 -0
- package/dist/ports/runtime-session-ports.js +1 -0
- package/dist/ports/screenshot.d.ts +11 -0
- package/dist/ports/screenshot.js +1 -0
- package/dist/ports/skill-installer.d.ts +2 -2
- package/dist/ports/ui-snapshot.d.ts +35 -0
- package/dist/ports/ui-snapshot.js +1 -0
- package/dist/ports/ui-stability.d.ts +19 -0
- package/dist/ports/ui-stability.js +1 -0
- package/dist/ports/workspace-layout.d.ts +4 -0
- package/dist/ports/workspace-layout.js +1 -0
- package/dist/shared/errors.d.ts +2 -0
- package/dist/shared/errors.js +22 -0
- package/dist/shared/paths.d.ts +2 -0
- package/dist/shared/paths.js +24 -0
- package/dist/shared/strings.d.ts +2 -0
- package/dist/shared/strings.js +16 -0
- package/package.json +6 -1
- package/assets/skills/taphound-ai-journey/GUIDE.md +0 -862
- package/assets/skills/taphound-ai-journey/SKILL.md +0 -377
- package/assets/skills/taphound-ai-journey/prompts/analyze-project.md +0 -526
- package/assets/skills/taphound-ai-journey/prompts/generate-step.md +0 -109
- package/assets/skills/taphound-ai-journey/schemas/project-context.json +0 -81
- package/assets/skills/taphound-ai-journey/templates/project-context.example.json +0 -49
- package/dist/ports/android-cli.d.ts +0 -21
- /package/dist/{ports/android-cli.js → adapters/runtime/mobile-mcp/mobile-mcp-tools.js} +0 -0
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: taphound-journey-brief-author
|
|
3
|
+
description: >-
|
|
4
|
+
Author and maintain the TapHound Project Context Bundle and author one
|
|
5
|
+
Journey Brief per Case. Ensures a valid Context (generate, refresh,
|
|
6
|
+
rehash, validate) before combining Android source analysis with read-only
|
|
7
|
+
device observation into a taphound-journey-brief.md, ready for the
|
|
8
|
+
taphound-journey-generator skill to consume. Use when the user wants to
|
|
9
|
+
generate, refresh, or regenerate the Project Context, initialize project
|
|
10
|
+
context, create a journey brief, or prepare case context before journey
|
|
11
|
+
generation.
|
|
12
|
+
compatibility: >-
|
|
13
|
+
Requires Node.js 22+, Android SDK with ADB and uiautomator, and TapHound
|
|
14
|
+
built and linked. Context-only runs need no device; Brief authoring
|
|
15
|
+
prefers one online Android device.
|
|
16
|
+
metadata:
|
|
17
|
+
author: TapHound
|
|
18
|
+
version: "2.0"
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# TapHound Journey Brief Author Skill
|
|
22
|
+
|
|
23
|
+
This Skill is the single read-only **producer** of the two pre-Journey
|
|
24
|
+
artifacts:
|
|
25
|
+
|
|
26
|
+
1. **Project Context Bundle** (project-wide, cached, reused by every
|
|
27
|
+
Case) — generated once, refreshed after source changes, and persisted
|
|
28
|
+
under `.taphound/context/`. It describes the project's modules,
|
|
29
|
+
Activities, UI elements, navigation transitions, and interaction policy.
|
|
30
|
+
2. **Journey Brief** (one per Case) — the untrusted static handoff from
|
|
31
|
+
the planning phase to the Journey generation phase. It reduces broad
|
|
32
|
+
source rediscovery but never weakens Core validation, live Snapshot
|
|
33
|
+
binding, risk policy, or final Replay.
|
|
34
|
+
|
|
35
|
+
The `taphound-journey-generator` skill is the **consumer** of both. It requires a
|
|
36
|
+
valid Context and never generates or repairs it; when it encounters a stale
|
|
37
|
+
or invalid Context, it stops and requires this Skill to run first. The Brief
|
|
38
|
+
is handed over through a `{path, sha256}` binding.
|
|
39
|
+
|
|
40
|
+
Core does all Context structural bookkeeping: module discovery, identity
|
|
41
|
+
inspection (`packageName`, `launchActivity`), evidence and inventory
|
|
42
|
+
hashing, and atomic writes. The agent's job is to fill in semantic `summary`
|
|
43
|
+
fields that Core cannot infer from source alone, then combine them with
|
|
44
|
+
Case analysis into the Brief.
|
|
45
|
+
|
|
46
|
+
## Skill Directory
|
|
47
|
+
|
|
48
|
+
All file references are relative to `assets/skills/taphound-journey-brief-author/`.
|
|
49
|
+
The directory contains:
|
|
50
|
+
|
|
51
|
+
- `prompts/brief-author-role.md` (+ zh-CN) — the lean subagent bootstrap prompt
|
|
52
|
+
- `prompts/context-analyze-project.md` — module-by-module semantic analysis guidance
|
|
53
|
+
- `schemas/` — JSON Schemas for the Context index, module shards, and refresh result
|
|
54
|
+
- `templates/` — the Brief skeleton and example Context files
|
|
55
|
+
- `CONTEXT-GUIDE.md` — detailed end-to-end Context usage guide
|
|
56
|
+
|
|
57
|
+
Read `prompts/context-analyze-project.md`, the relevant Context schema, and
|
|
58
|
+
`CONTEXT-GUIDE.md` before performing any Context ensure work (Phase 0
|
|
59
|
+
branches L1–L3). The normal per-Case happy path (Context valid) does not
|
|
60
|
+
need them.
|
|
61
|
+
|
|
62
|
+
## How to Use This Skill
|
|
63
|
+
|
|
64
|
+
Run `taphound init --agent <ids>` to install. The Skill is installed alongside
|
|
65
|
+
`taphound-journey-generator` into each agent's skills directory.
|
|
66
|
+
|
|
67
|
+
### Two consumption modes
|
|
68
|
+
|
|
69
|
+
1. **Subagent dispatch (primary)**: Copy the full content of
|
|
70
|
+
`prompts/brief-author-role.md` into the subagent's PROMPT configuration
|
|
71
|
+
field. The orchestrator dispatches one task per Case with explicit
|
|
72
|
+
inputs (see Inputs below). The subagent returns a structured JSON
|
|
73
|
+
summary; the orchestrator never re-parses raw exploration content.
|
|
74
|
+
|
|
75
|
+
2. **Manual single-Case**: An agent loads this SKILL.md directly, follows
|
|
76
|
+
the phases below, and produces one Brief.
|
|
77
|
+
|
|
78
|
+
### Relationship to the Journey Skill
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
Orchestrator (lean context)
|
|
82
|
+
|
|
|
83
|
+
├── dispatches brief-author subagent
|
|
84
|
+
| inputs: {project, caseGoal, caseId?, contextPaths?, observeSnapshot?, contextOnly?}
|
|
85
|
+
| output: {path, sha256, caseId, edgesVerified, edgesNeedsObservation}
|
|
86
|
+
| (contextOnly runs return the Context summary instead)
|
|
87
|
+
|
|
|
88
|
+
├── human Review (brief is an inspectable artifact)
|
|
89
|
+
|
|
|
90
|
+
└── dispatches journey subagent
|
|
91
|
+
inputs: {project, goal, journeyBrief: {path, sha256}}
|
|
92
|
+
output: {journeyPath, reportPath, verified}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Inputs
|
|
96
|
+
|
|
97
|
+
| Parameter | Required | Default | Description |
|
|
98
|
+
|-----------------|----------|--------------------------------------------------|--------------------------------------------------|
|
|
99
|
+
| project | yes | — | Android project root path |
|
|
100
|
+
| caseGoal | yes | — | One Case's test scenario (ignored when `contextOnly`) |
|
|
101
|
+
| caseId | no | — | Case identifier for frontmatter |
|
|
102
|
+
| contextPaths | no | — | Explicit path array; orchestrator decides which docs |
|
|
103
|
+
| context | no | `.taphound/context/project-context.json` | Project Context path (relative to project) |
|
|
104
|
+
| contextOnly | no | `false` | Run only the Context lifecycle (ensure/refresh/regenerate); skip Brief authoring |
|
|
105
|
+
| observeSnapshot | no | — | Pre-captured `taphound observe --json` result |
|
|
106
|
+
| device | no | doctor auto-selects | Device serial |
|
|
107
|
+
| output | no | `.taphound/journeys/taphound-journey-brief.md` | Brief output path (relative to project) |
|
|
108
|
+
|
|
109
|
+
**Hard rule**: NEVER search for or assume files named `plan.md`,
|
|
110
|
+
`requirement.md`, or any convention. Read ONLY files the caller explicitly
|
|
111
|
+
passes via `contextPaths`. If no `contextPaths` are supplied, work from
|
|
112
|
+
`caseGoal` alone plus source code and Project Context.
|
|
113
|
+
|
|
114
|
+
## Output
|
|
115
|
+
|
|
116
|
+
For a Brief run, the Skill writes a `taphound-journey-brief.md` at the
|
|
117
|
+
`output` path and returns a structured JSON summary:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"status": "authored",
|
|
122
|
+
"caseId": "CASE-002",
|
|
123
|
+
"path": ".taphound/journeys/taphound-journey-brief.md",
|
|
124
|
+
"sha256": "<exact-byte-hash>",
|
|
125
|
+
"edgesVerified": 2,
|
|
126
|
+
"edgesNeedsObservation": 1
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
For a `contextOnly` run, the Skill ensures the Context and returns:
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"status": "valid",
|
|
135
|
+
"contextPath": ".taphound/context/project-context.json",
|
|
136
|
+
"modules": [
|
|
137
|
+
{ "id": ":app", "status": "complete" },
|
|
138
|
+
{ "id": ":feature:search", "status": "complete" }
|
|
139
|
+
]
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
On failure either mode returns:
|
|
144
|
+
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"status": "failed",
|
|
148
|
+
"failure": { "code": "...", "message": "..." }
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Phase 0: Preflight and Context Ensure
|
|
153
|
+
|
|
154
|
+
Prerequisites: Node.js 22+ (avoid 23), Android SDK with ADB and
|
|
155
|
+
`uiautomator`, and TapHound built and linked. A device is required for
|
|
156
|
+
Brief authoring (Phase 2) but NOT for Context-only runs or any Context
|
|
157
|
+
ensure work — doctor may report `DEVICE_UNAVAILABLE`, which is acceptable
|
|
158
|
+
whenever the run stays on the Context path.
|
|
159
|
+
|
|
160
|
+
1. Verify `taphound` is available.
|
|
161
|
+
2. Run `taphound doctor --project <project> --json`.
|
|
162
|
+
- Brief run: confirm `"status": "passed"` and capture `deviceSerial`.
|
|
163
|
+
- `contextOnly` run: environment must be usable without a device;
|
|
164
|
+
`DEVICE_UNAVAILABLE` is acceptable.
|
|
165
|
+
3. **Context ensure** — this Skill owns the full Context lifecycle. Check
|
|
166
|
+
the Project Context:
|
|
167
|
+
```bash
|
|
168
|
+
taphound context status \
|
|
169
|
+
--project <project> \
|
|
170
|
+
--context <context> --json
|
|
171
|
+
```
|
|
172
|
+
- `"valid"`: confirm module completeness with
|
|
173
|
+
`taphound context list --json`. If all selected modules are
|
|
174
|
+
`complete`, the Context is current — proceed to Phase 1 (or return
|
|
175
|
+
the Context summary if `contextOnly`). If any module is incomplete,
|
|
176
|
+
complete that shard first (L1 steps 2–4 for that module only).
|
|
177
|
+
- `"stale"`: run the incremental update flow **L2** below.
|
|
178
|
+
- `"invalid"`: run full regeneration **L3** below.
|
|
179
|
+
- File missing: run initial generation **L1** below.
|
|
180
|
+
|
|
181
|
+
## Context Lifecycle
|
|
182
|
+
|
|
183
|
+
These branches run only when Phase 0 detects Context work. After any
|
|
184
|
+
branch, re-run `taphound context status --json` and `taphound context
|
|
185
|
+
list --json`; proceed only when the Context is `valid` with `complete` or
|
|
186
|
+
`unsupported` modules (`unsupported` is an analyzed verdict generation
|
|
187
|
+
accepts; `partial`/`notAnalyzed` are coverage gaps — report them to the
|
|
188
|
+
user).
|
|
189
|
+
|
|
190
|
+
### L1: Initial Generation (file missing, or explicit `force`)
|
|
191
|
+
|
|
192
|
+
> Read `prompts/context-analyze-project.md` before starting — it contains
|
|
193
|
+
> detailed module-by-module semantic analysis guidance. Read both Context
|
|
194
|
+
> schemas (`schemas/project-context.json` and
|
|
195
|
+
> `schemas/project-context-module.json`) and both Context templates before
|
|
196
|
+
> editing shards.
|
|
197
|
+
|
|
198
|
+
1. Generate the Context skeleton. Core discovers Gradle modules, inspects
|
|
199
|
+
`applicationId` and launch Activity, computes evidence and inventory
|
|
200
|
+
hashes, and writes one `notAnalyzed` shard per module with an empty
|
|
201
|
+
`summary`:
|
|
202
|
+
```bash
|
|
203
|
+
taphound context generate \
|
|
204
|
+
--project <project> \
|
|
205
|
+
--json
|
|
206
|
+
```
|
|
207
|
+
Use `--force` to overwrite an existing Context. Review the generated
|
|
208
|
+
module list and verify `packageName` and `launchActivity` match the
|
|
209
|
+
project; verify `packageName` comes from `applicationId` in
|
|
210
|
+
`build.gradle(.kts)`, NOT from the `package` attribute in
|
|
211
|
+
`AndroidManifest.xml` (deprecated in AGP 7+). Core resolves this
|
|
212
|
+
automatically; verify the result matches the installed app.
|
|
213
|
+
2. Fill in semantic summaries. For each shard under
|
|
214
|
+
`.taphound/context/modules/<module>.json`, read the module's source per
|
|
215
|
+
`prompts/context-analyze-project.md` and populate the `summary` object:
|
|
216
|
+
- `features`: domain terms this module contributes
|
|
217
|
+
- `activities`: Activity names, entry points, and screen names
|
|
218
|
+
- `elements`: interactive UI elements per screen with supported actions
|
|
219
|
+
- `transitions`: cross-Activity navigation paths
|
|
220
|
+
- `logcat`: `Log.i`/`Log.d` tag+pattern candidates for expectations
|
|
221
|
+
Set the shard `status` to `complete`, `partial`, or `unsupported`.
|
|
222
|
+
Never leave a shard as `notAnalyzed` after this step.
|
|
223
|
+
3. Update the root index (`.taphound/context/project-context.json`):
|
|
224
|
+
- Copy `features`, `activities`, and `status` from each shard into the
|
|
225
|
+
corresponding module entry.
|
|
226
|
+
- Update `interactionPolicy.allowedActions` to match actions the UI
|
|
227
|
+
actually supports (derived from source evidence). Leave
|
|
228
|
+
`confirmationRequiredActions` empty unless ALL instances of an
|
|
229
|
+
action are genuinely dangerous.
|
|
230
|
+
4. Rehash to update all shard and index hashes:
|
|
231
|
+
```bash
|
|
232
|
+
taphound context rehash \
|
|
233
|
+
--project <project> \
|
|
234
|
+
--context .taphound/context/project-context.json \
|
|
235
|
+
--json
|
|
236
|
+
```
|
|
237
|
+
5. Validate:
|
|
238
|
+
```bash
|
|
239
|
+
taphound context validate \
|
|
240
|
+
--project <project> \
|
|
241
|
+
--context .taphound/context/project-context.json \
|
|
242
|
+
--json
|
|
243
|
+
```
|
|
244
|
+
If validation fails, fix the named index or shard and retry. Common
|
|
245
|
+
failures: package name mismatch, stale hash (run `context rehash`),
|
|
246
|
+
path containing `..` or starting with `/`, file listed in manifest but
|
|
247
|
+
not found on disk.
|
|
248
|
+
6. Confirm module completeness via `taphound context list --json`.
|
|
249
|
+
|
|
250
|
+
### L2: Incremental Update (`stale`, content-only changes)
|
|
251
|
+
|
|
252
|
+
Run when the Context is `"stale"` but the module catalog has not changed
|
|
253
|
+
structurally — the typical update after routine source edits such as a
|
|
254
|
+
requirement change.
|
|
255
|
+
|
|
256
|
+
1. Confirm module completeness with `taphound context list --json`.
|
|
257
|
+
|
|
258
|
+
**Decision matrix:**
|
|
259
|
+
|
|
260
|
+
| `context status` | Module catalog | Action |
|
|
261
|
+
|------------------|-------------------------|-----------------------------------------------------------------|
|
|
262
|
+
| `valid` | All modules complete | Context is current. Done. |
|
|
263
|
+
| `valid` | Any module incomplete | Complete that module shard (L1 steps 2–4 for that module only) |
|
|
264
|
+
| `stale` | Existing module changed | Run `context refresh --json`, act on each block's `resolution` |
|
|
265
|
+
| `stale` | Module catalog changed | L3 (full regeneration) |
|
|
266
|
+
| `invalid` | — | L3 (full regeneration) |
|
|
267
|
+
|
|
268
|
+
2. Hash-only refresh before any re-analysis:
|
|
269
|
+
```bash
|
|
270
|
+
taphound context refresh \
|
|
271
|
+
--project <project> \
|
|
272
|
+
--context .taphound/context/project-context.json \
|
|
273
|
+
--json
|
|
274
|
+
```
|
|
275
|
+
Read `schemas/context-refresh-result.json` for the full result shape.
|
|
276
|
+
- `"refreshed"` / `"unchanged"`: nothing semantic changed.
|
|
277
|
+
`semanticSha256` values are backfilled, formatting- or comment-only
|
|
278
|
+
edits are rehashed, drifted shard hashes in the index are repaired,
|
|
279
|
+
and the Context is current. Validate and done.
|
|
280
|
+
- `"blocked"`: the response lists modules and files that changed
|
|
281
|
+
semantically, whose inventory changed, or whose evidence is missing.
|
|
282
|
+
Each block carries a `resolution` field — act on it, do not blanket
|
|
283
|
+
re-analyze:
|
|
284
|
+
|
|
285
|
+
| block `code` | `resolution` | Action |
|
|
286
|
+
|---------------------------|---------------------|---------------------------------------------------------------------------------------------------------------------|
|
|
287
|
+
| `EVIDENCE_UNRESOLVED` | `pruneDeleted` | A tracked file was deleted. Re-run with `--prune-deleted` (drops the entry). Combine with `--accept-source-changes` if inventory also drifted. |
|
|
288
|
+
| `EVIDENCE_SEMANTIC_CHANGED` | `acceptSourceChanges` | A tracked file's semantics changed. Re-run with `--accept-source-changes` to rehash. Re-analyze (step 3) only if the module summary is now wrong. |
|
|
289
|
+
| `MODULE_INVENTORY_CHANGED` | `acceptSourceChanges` | The on-disk file set grew or shrank. Re-run with `--accept-source-changes` to accept the new inventory hash. Re-analyze (step 3) only when new UI files were added that the summary must cover. |
|
|
290
|
+
| `EVIDENCE_UNRESOLVED` | `reanalyze` | An evidence file is unreadable/escaped/too large (not a clean deletion). Fix the file or regenerate that module's shard (L1 steps 2–4 for that module only). |
|
|
291
|
+
|
|
292
|
+
The typical one-shot reconcile for routine edits + deletions:
|
|
293
|
+
```bash
|
|
294
|
+
taphound context refresh \
|
|
295
|
+
--project <project> \
|
|
296
|
+
--context .taphound/context/project-context.json \
|
|
297
|
+
--prune-deleted --accept-source-changes --json
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
`--module <id...>` narrows scope. `--accept-source-changes` rehashes
|
|
301
|
+
semantic and inventory drift; use it only after confirming the recorded
|
|
302
|
+
module summary (screens, elements, transitions, Logcat) is still
|
|
303
|
+
accurate, because `refresh` never updates semantics. `--prune-deleted`
|
|
304
|
+
only drops entries for files that are truly gone (`notFound`);
|
|
305
|
+
unreadable or escaped files stay blocked as `reanalyze`.
|
|
306
|
+
|
|
307
|
+
3. Selective re-analysis (when needed): when a block's `resolution` is
|
|
308
|
+
`reanalyze`, or when `acceptSourceChanges` would hide newly added UI
|
|
309
|
+
screens the Goal may reach, regenerate the affected module shards
|
|
310
|
+
instead of reanalyzing unrelated features:
|
|
311
|
+
1. Identify which files changed (the `context status` output lists them).
|
|
312
|
+
2. Recompute SHA-256 for each changed file (Core does this via
|
|
313
|
+
`context rehash`).
|
|
314
|
+
3. If any changed file is an Activity source, re-read it to check for:
|
|
315
|
+
new Logcat tags (expect candidates), new click handlers or input
|
|
316
|
+
fields (interactionPolicy), new `startActivity` calls (navigation).
|
|
317
|
+
4. If any changed file is a layout XML, re-read it to check for: new
|
|
318
|
+
`android:id` elements (locator candidates), removed elements, changed
|
|
319
|
+
`android:text` or `android:contentDescription`.
|
|
320
|
+
5. Update shard semantics, evidence, and inventory. Write the shard,
|
|
321
|
+
recompute its file hash, and update the root index reference.
|
|
322
|
+
6. Update the global `interactionPolicy` only when needed, then
|
|
323
|
+
rehash and validate (L1 steps 4–5).
|
|
324
|
+
|
|
325
|
+
### L3: Full Regeneration (`invalid`, or structural changes)
|
|
326
|
+
|
|
327
|
+
Run full regeneration when:
|
|
328
|
+
- A new Gradle module was added or removed (check `settings.gradle`).
|
|
329
|
+
- The `packageName` or `launchActivity` changed.
|
|
330
|
+
- The Context is `"invalid"` (structural corruption).
|
|
331
|
+
- The user explicitly requests a full refresh (`force`).
|
|
332
|
+
|
|
333
|
+
1. Re-analyze the source (read `prompts/context-analyze-project.md`).
|
|
334
|
+
2. Generate with `--force` to overwrite the existing Context:
|
|
335
|
+
```bash
|
|
336
|
+
taphound context generate \
|
|
337
|
+
--project <project> \
|
|
338
|
+
--force \
|
|
339
|
+
--json
|
|
340
|
+
```
|
|
341
|
+
Core re-discovers all modules, resolves identity, and writes fresh
|
|
342
|
+
`notAnalyzed` shards.
|
|
343
|
+
3. Follow L1 steps 2–6 (fill semantic summaries, update root index,
|
|
344
|
+
rehash, validate, list).
|
|
345
|
+
|
|
346
|
+
## Phase 1: Case Analysis
|
|
347
|
+
|
|
348
|
+
> This section is the authoritative Brief procedure. The subagent prompt
|
|
349
|
+
> (`prompts/brief-author-role.md`) is a lean bootstrap that directs the
|
|
350
|
+
> subagent here; it does not duplicate this procedure. Skip this phase and
|
|
351
|
+
> the next two when running with `contextOnly`.
|
|
352
|
+
|
|
353
|
+
1. If `contextPaths` is provided, read ONLY those explicit files. Extract
|
|
354
|
+
context relevant to `caseGoal`.
|
|
355
|
+
2. Read the Project Context root index. Select modules relevant to
|
|
356
|
+
`caseGoal` using their `features`, `activities`, and `transitions`.
|
|
357
|
+
3. Read the selected module shards' `summary` objects.
|
|
358
|
+
4. Perform targeted source reading for Activities and layouts mentioned in
|
|
359
|
+
the Case:
|
|
360
|
+
- Kotlin/Java: map `setContentView` to Activity→layout, find click
|
|
361
|
+
handlers, `Log.i/d` tags, `startActivity` calls.
|
|
362
|
+
- Layout XML: extract `@+id/<name>` (bare = resourceId), `android:text`,
|
|
363
|
+
`contentDescription`.
|
|
364
|
+
5. Build a draft State Transition Map:
|
|
365
|
+
- Edges with clear source evidence → `confidence: source`
|
|
366
|
+
- Inferred edges → `confidence: needs-observation`
|
|
367
|
+
6. Extract logcat tag candidates, locator candidates, and idempotency
|
|
368
|
+
notes from source.
|
|
369
|
+
|
|
370
|
+
## Phase 2: Device Observation (read-only)
|
|
371
|
+
|
|
372
|
+
If `observeSnapshot` is provided by the orchestrator, use it directly. Do
|
|
373
|
+
NOT call `taphound observe` yourself (the orchestrator pre-captured it to
|
|
374
|
+
enable parallel brief authoring without device contention).
|
|
375
|
+
|
|
376
|
+
If `observeSnapshot` is NOT provided and a device is available, you may
|
|
377
|
+
run:
|
|
378
|
+
```bash
|
|
379
|
+
taphound observe --project <project> --device <serial> \
|
|
380
|
+
--logcat-lines 200 --json
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Verify:
|
|
384
|
+
1. `report.foreground.activity` matches the Project Context's
|
|
385
|
+
`launchActivity`.
|
|
386
|
+
2. Search `report.layout[]` for the first `source` edge's locator element:
|
|
387
|
+
- Match by `resourceId` → `text` → `contentDescription` priority.
|
|
388
|
+
- Confirm element `enabled: true` and supports the target action
|
|
389
|
+
(e.g., `clickable: true`).
|
|
390
|
+
3. Extract logcat tag patterns from `report.logcat[]` for Capability
|
|
391
|
+
Notes.
|
|
392
|
+
4. Edges verifiable in the snapshot keep `source` confidence. Edges not
|
|
393
|
+
verifiable remain `needs-observation`.
|
|
394
|
+
|
|
395
|
+
If no device is available and no snapshot is provided, skip this phase.
|
|
396
|
+
All edges retain their Phase 1 confidence.
|
|
397
|
+
|
|
398
|
+
## Phase 3: Author Brief
|
|
399
|
+
|
|
400
|
+
1. Use `templates/taphound-journey-brief.template.md` as the skeleton.
|
|
401
|
+
2. Fill frontmatter: `schemaVersion: 2`, `kind: taphound.journeyBrief`,
|
|
402
|
+
`caseId` (if provided).
|
|
403
|
+
3. Fill all 9 required sections:
|
|
404
|
+
- `# Goal`: from `caseGoal`.
|
|
405
|
+
- `## Preconditions`: from `contextPaths` docs or default
|
|
406
|
+
"independent cold launch".
|
|
407
|
+
- `## Expected Journey`: numbered steps from the State Transition Map
|
|
408
|
+
edge sequence.
|
|
409
|
+
- `## State Transition Map`: Mermaid diagram + edge table with
|
|
410
|
+
confidence and locator hints.
|
|
411
|
+
- `## Capability Notes`: runtime variable capture, multi-field
|
|
412
|
+
locators, logcat semantics.
|
|
413
|
+
- `## Assertions`: from `contextPaths` docs and source analysis.
|
|
414
|
+
- `## Implementation Hints`: resourceIds, module paths.
|
|
415
|
+
- `## Constraints`: no coordinates, Final Replay must pass,
|
|
416
|
+
idempotency notes.
|
|
417
|
+
- `## Evidence References`: source file paths.
|
|
418
|
+
4. Write to the `output` path.
|
|
419
|
+
5. Compute SHA-256 via shell: `shasum -a 256 <file>`.
|
|
420
|
+
6. Return the structured JSON summary.
|
|
421
|
+
|
|
422
|
+
## Key Rules
|
|
423
|
+
|
|
424
|
+
- Use ONLY read-only commands: `observe`, `context generate`, `context
|
|
425
|
+
refresh`, `context rehash`, `context validate`, `context status`,
|
|
426
|
+
`context list`, `knowledge status`, `journey check`, `doctor`,
|
|
427
|
+
`project describe`. NEVER use
|
|
428
|
+
`generation`, `verify`, `record`, `align`.
|
|
429
|
+
- Do NOT modify device state (no clicks, no input, no swipes).
|
|
430
|
+
- The agent NEVER computes SHA-256 hashes manually. Core does all Context
|
|
431
|
+
hashing via `context generate`, `context rehash`, and `context refresh`.
|
|
432
|
+
- The agent NEVER discovers modules manually. Core parses
|
|
433
|
+
`settings.gradle` and falls back to filesystem scanning.
|
|
434
|
+
- The agent NEVER resolves `applicationId` or launch Activity manually.
|
|
435
|
+
Core inspects build files and manifests.
|
|
436
|
+
- Do NOT modify Core-owned Context fields: `packageName`,
|
|
437
|
+
`launchActivity`, `manifest.files`, `modules[].shardPath`,
|
|
438
|
+
`modules[].sha256`, `modules[].moduleId`, `modules[].projectDir`, or
|
|
439
|
+
`modules[].kind`. Do NOT add or remove module entries. Do NOT modify
|
|
440
|
+
any `sha256` or `semanticSha256` field — run `context rehash` to
|
|
441
|
+
recompute after edits.
|
|
442
|
+
- Paths in `manifest.files` are relative to the Android project root, use
|
|
443
|
+
forward slashes, and must not start with `/` or contain `..`.
|
|
444
|
+
- For multi-module projects, include source analysis from all modules that
|
|
445
|
+
contribute to the UI — not just the `app` module. **Completeness is
|
|
446
|
+
mandatory**: enumerate ALL `<activity>` entries from ALL module
|
|
447
|
+
manifests. For layouts using `<include>`, `<merge>`, or `<layout>`,
|
|
448
|
+
resolve transitively.
|
|
449
|
+
- `confirmationRequiredActions` is per-action-TYPE. Listing `click` makes
|
|
450
|
+
EVERY click require human approval during generation. Leave empty unless
|
|
451
|
+
ALL instances of an action are dangerous.
|
|
452
|
+
- `allowedActions` must be derived from source evidence, not blanket
|
|
453
|
+
inclusion. If no source evidence supports an action, do not list it.
|
|
454
|
+
- Do not include build artifacts, generated code, or non-UI files in your
|
|
455
|
+
analysis — Core already excluded them from the evidence manifest.
|
|
456
|
+
- NEVER search for or assume files named `plan.md`, `requirement.md`, or
|
|
457
|
+
any convention. Read ONLY files passed via `contextPaths`.
|
|
458
|
+
- The Brief is untrusted output — phrase all claims as hints, not
|
|
459
|
+
authoritative assertions.
|
|
460
|
+
- Output must pass validation by `consume-journey-brief.md` (9 sections,
|
|
461
|
+
correct frontmatter).
|
|
462
|
+
- SHA-256 of the Brief is ALWAYS computed via shell, never guessed.
|
|
463
|
+
- One Brief per Case (mirrors the Journey Skill's one-Goal-one-session).
|
|
464
|
+
- The agent does NOT modify TapHound Core source code.
|
|
465
|
+
|
|
466
|
+
## Gotchas
|
|
467
|
+
|
|
468
|
+
- `packageName` comes from `applicationId` in `build.gradle(.kts)`, NOT
|
|
469
|
+
from the `package` attribute in `AndroidManifest.xml` (deprecated in
|
|
470
|
+
AGP 7+). Core's `context generate` resolves this automatically; verify
|
|
471
|
+
the result matches the installed app.
|
|
472
|
+
- The same `@+id/submit` can appear in multiple layout XML files — this is
|
|
473
|
+
normal, not a conflict. Only one layout is active at runtime; always
|
|
474
|
+
match against the `observe` snapshot (Phase 2), not static XML.
|
|
475
|
+
- `--accept-source-changes` does NOT re-analyze newly added Activities or
|
|
476
|
+
layouts into the module summary. If the Goal may reach a new screen,
|
|
477
|
+
re-scan that module's source and update its `summary`, then run
|
|
478
|
+
`context rehash` (L2 step 3).
|
|
479
|
+
- Context ensure work does NOT require a connected device. `doctor` may
|
|
480
|
+
report `DEVICE_UNAVAILABLE` — that is acceptable for every `context`
|
|
481
|
+
command; a device is only needed for Brief Phase 2.
|
|
482
|
+
- `partial` and `notAnalyzed` modules are coverage gaps, not successful
|
|
483
|
+
generation. Report them to the user. `unsupported` is a legitimate
|
|
484
|
+
analyzed verdict and does not block generation.
|
|
485
|
+
- After any Context refresh, rehash, or regeneration, committed Journeys may
|
|
486
|
+
no longer match the live bundle. Run `taphound journey check --project
|
|
487
|
+
<project> --context <context> --json` (read-only, no device) to surface
|
|
488
|
+
drifted Journeys (`module-drift`, `module-missing`); the
|
|
489
|
+
`taphound-journey-generator` Skill re-finalizes them from their sessions.
|
|
490
|
+
- Conditionally rendered elements (a clear button that only appears once a
|
|
491
|
+
search field has text, collapsed containers) are still valid Context
|
|
492
|
+
evidence — record them — but flag them in the shard `summary` as
|
|
493
|
+
conditional, so Screen authors list them as optional rather than required
|
|
494
|
+
anchors.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Brief Author Role
|
|
2
|
+
|
|
3
|
+
You are a TapHound Journey Brief author. Your job is to keep the Project
|
|
4
|
+
Context valid and produce one Journey Brief Markdown file for a single
|
|
5
|
+
test Case.
|
|
6
|
+
|
|
7
|
+
## Read the Skill First
|
|
8
|
+
|
|
9
|
+
Before doing anything, load the `taphound-journey-brief-author` skill:
|
|
10
|
+
read its `SKILL.md` (e.g.
|
|
11
|
+
`.claude/skills/taphound-journey-brief-author/SKILL.md`) and follow it
|
|
12
|
+
exactly.
|
|
13
|
+
|
|
14
|
+
## Capability Boundary
|
|
15
|
+
|
|
16
|
+
You may use ONLY these read-only TapHound commands:
|
|
17
|
+
- `taphound doctor`
|
|
18
|
+
- `taphound context generate` / `refresh` / `rehash` / `validate` / `status` / `list`
|
|
19
|
+
- `taphound observe`
|
|
20
|
+
|
|
21
|
+
You MUST NOT use `generation`, `verify`, `record`, or `align`. You MUST
|
|
22
|
+
NOT modify device state (no clicks, no input, no swipes).
|
|
23
|
+
|
|
24
|
+
## Hard Rule on File Names
|
|
25
|
+
|
|
26
|
+
NEVER search for or assume files named `plan.md`, `requirement.md`, or
|
|
27
|
+
any convention. Read ONLY files the caller explicitly passes via
|
|
28
|
+
`contextPaths`. If no `contextPaths` are supplied, work from `caseGoal`
|
|
29
|
+
alone plus source code and Project Context.
|
|
30
|
+
|
|
31
|
+
## Inputs
|
|
32
|
+
|
|
33
|
+
The orchestrator dispatches your task with:
|
|
34
|
+
|
|
35
|
+
- **project** (required): Android project root path.
|
|
36
|
+
- **caseGoal** (required): One Case's test scenario in natural language.
|
|
37
|
+
- **caseId** (optional): Case identifier for frontmatter.
|
|
38
|
+
- **contextPaths** (optional): Explicit array of document paths. Read
|
|
39
|
+
ONLY these.
|
|
40
|
+
- **contextOnly** (optional): When `true`, run only the Project Context
|
|
41
|
+
lifecycle (Phase 0 ensure) and return the Context summary JSON instead
|
|
42
|
+
of authoring a Brief.
|
|
43
|
+
- **observeSnapshot** (optional): Pre-captured `taphound observe --json`
|
|
44
|
+
result. Use it directly; do NOT call `taphound observe` when provided.
|
|
45
|
+
- **output** (optional): Brief output path, defaults to
|
|
46
|
+
`.taphound/journeys/taphound-journey-brief.md` (relative to project).
|
|
47
|
+
|
|
48
|
+
## Output
|
|
49
|
+
|
|
50
|
+
For a Brief run, return a single JSON object. On success:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"status": "authored",
|
|
55
|
+
"caseId": "<caseId or null>",
|
|
56
|
+
"path": "<output path relative to project>",
|
|
57
|
+
"sha256": "<64-char hex hash>",
|
|
58
|
+
"edgesVerified": <number>,
|
|
59
|
+
"edgesNeedsObservation": <number>
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
On failure:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"status": "failed",
|
|
68
|
+
"caseId": "<caseId or null>",
|
|
69
|
+
"failure": { "code": "...", "message": "..." }
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
For a `contextOnly` run, on success return:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"status": "valid",
|
|
78
|
+
"contextPath": ".taphound/context/project-context.json",
|
|
79
|
+
"modules": [{ "id": ":app", "status": "complete" }]
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Key Rules
|
|
84
|
+
|
|
85
|
+
- The Brief is untrusted output — phrase claims as hints, not assertions.
|
|
86
|
+
- Never compute Context SHA-256 hashes manually; Core does all Context
|
|
87
|
+
hashing via `context generate`, `context rehash`, and `context refresh`.
|
|
88
|
+
- SHA-256 is ALWAYS computed via shell (`shasum -a 256 <file>`), never guessed.
|
|
89
|
+
- One Brief per Case.
|
|
90
|
+
- Do NOT modify TapHound Core source code.
|
|
91
|
+
- Do NOT use coordinates, visual guessing, or fallback.
|
|
92
|
+
- Locator priority is fixed: `resourceId` > `text` > `contentDescription`.
|
|
93
|
+
- Edges with clear source evidence → `confidence: source`; inferred
|
|
94
|
+
edges → `confidence: needs-observation`.
|
|
95
|
+
- Never invent resource IDs, Activity names, or logcat tags that you did
|
|
96
|
+
not find in source or the observe snapshot.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Brief Author 角色
|
|
2
|
+
|
|
3
|
+
你负责保持 Project Context 有效,并为单个测试 Case 生成一份 Journey
|
|
4
|
+
Brief Markdown 文件。
|
|
5
|
+
|
|
6
|
+
## 先读 Skill
|
|
7
|
+
|
|
8
|
+
开工前先加载 skill `taphound-journey-brief-author`:读其 `SKILL.md`(如
|
|
9
|
+
`.claude/skills/taphound-journey-brief-author/SKILL.md`),严格按其执行。
|
|
10
|
+
|
|
11
|
+
## 能力边界
|
|
12
|
+
|
|
13
|
+
只用只读命令:`taphound doctor`、`context
|
|
14
|
+
generate`/`refresh`/`rehash`/`validate`/`status`/`list`、`taphound observe`。
|
|
15
|
+
禁用 `generation`/`verify`/`record`/`align`,禁止改动设备状态
|
|
16
|
+
(不点击、不输入、不滑动)。
|
|
17
|
+
|
|
18
|
+
## 文件名硬规则
|
|
19
|
+
|
|
20
|
+
绝不搜索或假设名为 `plan.md`、`requirement.md` 或任何约定文件名的文件。
|
|
21
|
+
只读 caller 通过 `contextPaths` 显式传入的文件;未传则仅凭 `caseGoal`
|
|
22
|
+
+ 源码 + Project Context 工作。
|
|
23
|
+
|
|
24
|
+
## 输入
|
|
25
|
+
|
|
26
|
+
| 字段 | 必填 | 说明 |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| project | 是 | Android 项目根路径 |
|
|
29
|
+
| caseGoal | 是 | 单个 Case 的测试场景(自然语言) |
|
|
30
|
+
| caseId | 否 | Case 标识,写入 frontmatter |
|
|
31
|
+
| contextPaths | 否 | 显式文档路径数组,只读这些 |
|
|
32
|
+
| contextOnly | 否 | 为 `true` 时只运行 Context 生命周期(Phase 0),返回 Context 摘要 JSON,不写 Brief |
|
|
33
|
+
| observeSnapshot | 否 | 预采集的 `taphound observe --json` 结果;提供则直接用,不再调 observe |
|
|
34
|
+
| output | 否 | Brief 输出路径,默认 `.taphound/journeys/taphound-journey-brief.md` |
|
|
35
|
+
|
|
36
|
+
## 输出
|
|
37
|
+
|
|
38
|
+
Brief 运行返回单个 JSON。成功:
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"status": "authored",
|
|
43
|
+
"caseId": "<caseId 或 null>",
|
|
44
|
+
"path": "<项目相对路径>",
|
|
45
|
+
"sha256": "<64位十六进制>",
|
|
46
|
+
"edgesVerified": <数量>,
|
|
47
|
+
"edgesNeedsObservation": <数量>
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
失败:
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"status": "failed",
|
|
56
|
+
"caseId": "<caseId 或 null>",
|
|
57
|
+
"failure": { "code": "...", "message": "..." }
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
`contextOnly` 成功返回:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"status": "valid",
|
|
66
|
+
"contextPath": ".taphound/context/project-context.json",
|
|
67
|
+
"modules": [{ "id": ":app", "status": "complete" }]
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 关键规则
|
|
72
|
+
|
|
73
|
+
- Brief 是不可信输出,断言以"提示"而非"权威结论"表述;每个 Case 一份 Brief。
|
|
74
|
+
- 不手工计算 Context 的 SHA-256;Core 通过 `context generate`、
|
|
75
|
+
`context rehash`、`context refresh` 负责全部哈希。
|
|
76
|
+
- Brief 的 SHA-256 必须用 shell 计算(`shasum -a 256 <file>`),不可猜测。
|
|
77
|
+
- 定位符优先级固定:`resourceId` > `text` > `contentDescription`;有明确源码
|
|
78
|
+
证据的边 → `confidence: source`,推断的边 → `confidence: needs-observation`。
|
|
79
|
+
- 不编造源码和快照中未找到的 resourceId、Activity 名或 logcat tag。
|
|
80
|
+
- 不改 TapHound Core 源码;不用坐标、视觉猜测或兜底。
|