taphound 0.2.0-dev.1 → 0.2.0-dev.12
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 +507 -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 +578 -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 +357 -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 +42 -0
- package/dist/adapters/appium/appium-ui-snapshot-provider.js +309 -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/diagnostics-journal.d.ts +17 -0
- package/dist/adapters/filesystem/diagnostics-journal.js +130 -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/diagnostics/diagnostics-exporter.d.ts +29 -0
- package/dist/application/diagnostics/diagnostics-exporter.js +283 -0
- package/dist/application/diagnostics/ui-capture-telemetry.d.ts +16 -0
- package/dist/application/diagnostics/ui-capture-telemetry.js +81 -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.d.ts +5 -0
- package/dist/application/report/report-writer.js +17 -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 +577 -175
- 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/observed-ui-snapshot-provider.d.ts +15 -0
- package/dist/application/ui/observed-ui-snapshot-provider.js +66 -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 +9 -0
- package/dist/application/ui/ui-stability-probe.js +24 -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 +201 -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/diagnose.d.ts +3 -0
- package/dist/cli/commands/diagnose.js +84 -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 +326 -64
- package/dist/cli/dependencies.d.ts +136 -1
- package/dist/cli/dependencies.js +504 -52
- package/dist/cli/diagnostics-recorder.d.ts +31 -0
- package/dist/cli/diagnostics-recorder.js +82 -0
- package/dist/cli/diff-verification.d.ts +41 -0
- package/dist/cli/diff-verification.js +192 -0
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.js +107 -2
- package/dist/cli/output.d.ts +5 -3
- package/dist/cli/output.js +12 -0
- package/dist/cli/program.js +21 -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/diagnostics.d.ts +1396 -0
- package/dist/domain/diagnostics.js +193 -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/verify-receipt.d.ts +17 -0
- package/dist/domain/verify-receipt.js +17 -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 +30 -0
- package/dist/domain/workspace.js +74 -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/diagnostics.d.ts +15 -0
- package/dist/ports/diagnostics.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 +7 -2
- 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,309 @@
|
|
|
1
|
+
# Analyze Android Project for TapHound Context
|
|
2
|
+
|
|
3
|
+
You are filling in the semantic `summary` fields of a TapHound Project Context
|
|
4
|
+
Bundle that Core has already scaffolded. Core owns module discovery,
|
|
5
|
+
identity inspection (`packageName`, `launchActivity`), evidence and inventory
|
|
6
|
+
hashing, and atomic writes. Your job is to read Android source files and
|
|
7
|
+
populate the `summary` object in each generated shard.
|
|
8
|
+
|
|
9
|
+
## Workflow
|
|
10
|
+
|
|
11
|
+
1. **Generate the Context skeleton** (Core does all structural work):
|
|
12
|
+
```bash
|
|
13
|
+
taphound context generate --project <project> --json
|
|
14
|
+
```
|
|
15
|
+
Core discovers Gradle modules, resolves `applicationId` and launch
|
|
16
|
+
Activity, computes evidence and inventory hashes, and writes one
|
|
17
|
+
`notAnalyzed` shard per module with an empty `summary`. Use `--force`
|
|
18
|
+
to overwrite an existing Context. Verify the reported `packageName` and
|
|
19
|
+
`launchActivity` match the installed app.
|
|
20
|
+
|
|
21
|
+
2. **Read each generated shard** under `.taphound/context/modules/<module>.json`.
|
|
22
|
+
Each shard already has `moduleId`, `projectDir`, `inventory`, `manifest`
|
|
23
|
+
(with hashed evidence files), and an empty `summary`. The `manifest.files`
|
|
24
|
+
list tells you exactly which source files Core tracked — scan those.
|
|
25
|
+
|
|
26
|
+
3. **Scan source files and fill `summary`** for each module (Steps 1–5 below).
|
|
27
|
+
|
|
28
|
+
4. **Update the root index** (`.taphound/context/project-context.json`):
|
|
29
|
+
copy `features`, `activities`, and `status` from each shard into the
|
|
30
|
+
corresponding module entry. Update `interactionPolicy` based on source
|
|
31
|
+
evidence (Step 6).
|
|
32
|
+
|
|
33
|
+
5. **Rehash and validate**:
|
|
34
|
+
```bash
|
|
35
|
+
taphound context rehash \
|
|
36
|
+
--project <project> \
|
|
37
|
+
--context .taphound/context/project-context.json --json
|
|
38
|
+
taphound context validate \
|
|
39
|
+
--project <project> \
|
|
40
|
+
--context .taphound/context/project-context.json --json
|
|
41
|
+
```
|
|
42
|
+
Core recomputes all shard and index hashes. If validation fails, fix the
|
|
43
|
+
named index or shard and rehash again.
|
|
44
|
+
|
|
45
|
+
## Step 1: Scan Kotlin/Java Source
|
|
46
|
+
|
|
47
|
+
For each module, scan `src/main/java/` and `src/main/kotlin/` (and variant
|
|
48
|
+
source sets when applicable):
|
|
49
|
+
|
|
50
|
+
- Find `setContentView(R.layout.*)` to map each Activity to its layout.
|
|
51
|
+
- Find `findViewById<T>(R.id.*)` or view binding references
|
|
52
|
+
(`binding.submitButton`) to identify interactive UI elements.
|
|
53
|
+
- Find `setOnClickListener`, `setOnCheckedChangeListener`,
|
|
54
|
+
`setOnTouchListener`, etc. to determine which elements are actionable.
|
|
55
|
+
- Find `Log.i(tag, message)`, `Log.d(tag, ...)`, `Log.w(tag, ...)`, etc.
|
|
56
|
+
to identify logcat tags and message patterns usable as expectations.
|
|
57
|
+
- Find `startActivity(Intent(this, TargetActivity::class.java))` or
|
|
58
|
+
navigation component calls to predict Activity transitions.
|
|
59
|
+
- Find `EditText`, `TextView`, `Button`, `RecyclerView`, `ScrollView`
|
|
60
|
+
usages to understand what actions each screen supports.
|
|
61
|
+
|
|
62
|
+
## Step 2: Scan Layout XML
|
|
63
|
+
|
|
64
|
+
Extract UI element information from `src/main/res/layout/` files:
|
|
65
|
+
|
|
66
|
+
- Extract `android:id="@+id/<name>"` — the `resourceId` for locators is
|
|
67
|
+
the bare name (e.g., `open_search`, not `id/open_search`).
|
|
68
|
+
- Extract `android:text` and `android:contentDescription` as fallback
|
|
69
|
+
locator identity fields.
|
|
70
|
+
- Note the widget type (Button, EditText, TextView, RecyclerView,
|
|
71
|
+
ScrollView, etc.) to understand what actions each element supports.
|
|
72
|
+
|
|
73
|
+
### Complex layout structures
|
|
74
|
+
|
|
75
|
+
Real Android layouts use several composition mechanisms:
|
|
76
|
+
|
|
77
|
+
**`<include layout="@layout/foo" />`**: The included layout's views are
|
|
78
|
+
merged into the parent at runtime. Recursively read the included layout
|
|
79
|
+
file and collect its IDs as if they were in the parent. An `<include>`
|
|
80
|
+
may override the included root's `android:id` with its own.
|
|
81
|
+
|
|
82
|
+
**`<merge>`**: Has no ID itself. Its children are directly inlined into
|
|
83
|
+
the parent at inflation time. Treat its children as belonging to the
|
|
84
|
+
including parent.
|
|
85
|
+
|
|
86
|
+
**`<layout>` (Data Binding)**: Wraps the actual root view. Look inside
|
|
87
|
+
`<layout>` for the actual root view and its children. Ignore the `<data>`
|
|
88
|
+
section — it has no UI elements.
|
|
89
|
+
|
|
90
|
+
**`<ViewStub android:layout="@layout/foo" />`**: Lazily inflated. Its
|
|
91
|
+
content is NOT in the initial layout. `android:inflatedId` gives the ID
|
|
92
|
+
of the inflated root. Note these but understand they may not be visible
|
|
93
|
+
until explicitly inflated at runtime.
|
|
94
|
+
|
|
95
|
+
**Duplicate IDs across layout files**: The same `@+id/submit` can appear
|
|
96
|
+
in both `activity_main.xml` and `activity_search.xml`. This is normal and
|
|
97
|
+
NOT a conflict — each layout is independent, and only one is active at a
|
|
98
|
+
time. Do NOT try to deduplicate IDs across different layout files. At
|
|
99
|
+
runtime, TapHound's `observe` command dumps the live layout, so element
|
|
100
|
+
resolution always happens against the currently displayed screen.
|
|
101
|
+
|
|
102
|
+
## Step 3: Scan Build Files
|
|
103
|
+
|
|
104
|
+
Each module has either `build.gradle.kts` (Kotlin DSL) or `build.gradle`
|
|
105
|
+
(Groovy DSL), never both. Core already parsed these for `applicationId`,
|
|
106
|
+
`namespace`, and module discovery — you do NOT need to re-parse them for
|
|
107
|
+
identity. However, check for:
|
|
108
|
+
|
|
109
|
+
- `buildTypes` / `productFlavors` that might affect the package name
|
|
110
|
+
(suffixes like `.debug`). Core uses the base `applicationId`; note if a
|
|
111
|
+
flavor suffix is relevant to the test Goal.
|
|
112
|
+
- `proguard` / `proguardFiles` rules that might strip logcat tags. If
|
|
113
|
+
Logcat calls are stripped in release builds, note this — it affects
|
|
114
|
+
expectation feasibility.
|
|
115
|
+
|
|
116
|
+
## Step 4: Verify Completeness
|
|
117
|
+
|
|
118
|
+
Before filling in the `summary`, verify you have found ALL relevant files.
|
|
119
|
+
Incomplete coverage makes the Context useless for staleness detection and
|
|
120
|
+
leads to missing interaction policies.
|
|
121
|
+
|
|
122
|
+
### Activity completeness
|
|
123
|
+
|
|
124
|
+
Enumerate every `<activity>` declaration across ALL module manifests
|
|
125
|
+
(not just the `app` module):
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
find . -name "AndroidManifest.xml" -not -path "*/build/*"
|
|
129
|
+
find . -name "AndroidManifest.xml" -not -path "*/build/*" \
|
|
130
|
+
-exec grep '<activity' {} + | sed 's/.*android:name="//' | sed 's/".*//'
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
For each Activity name found:
|
|
134
|
+
- If it starts with `.`, prepend the module's namespace to get the
|
|
135
|
+
fully qualified class name.
|
|
136
|
+
- Find the corresponding source file (`.kt` or `.java`) on disk.
|
|
137
|
+
- If the source file cannot be found (generated class, third-party
|
|
138
|
+
dependency), skip it but note it.
|
|
139
|
+
|
|
140
|
+
**You MUST include every Activity source file you find.** Missing
|
|
141
|
+
Activities means the Context cannot detect when those screens change,
|
|
142
|
+
and the AI agent will not know about their UI elements or Logcat tags.
|
|
143
|
+
|
|
144
|
+
### Layout completeness
|
|
145
|
+
|
|
146
|
+
For each Activity, identify its layout via `setContentView(R.layout.<name>)`
|
|
147
|
+
in the source. Then find the corresponding layout XML:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
find . -path "*/res/layout/*.xml" -not -path "*/build/*"
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Include each layout file directly referenced by an Activity you found.
|
|
154
|
+
Also include layouts referenced via `<include>` from those layouts
|
|
155
|
+
(resolve transitively). You may EXCLUDE:
|
|
156
|
+
- Layout files not referenced by any Activity (e.g., item layouts for
|
|
157
|
+
RecyclerView adapters, preference layouts) unless they contain
|
|
158
|
+
interactive elements the test Goal might touch.
|
|
159
|
+
- Debug-only or developer-tool layouts.
|
|
160
|
+
|
|
161
|
+
### Large project strategy
|
|
162
|
+
|
|
163
|
+
For projects with many modules (10+ Activities, 50+ layouts), use
|
|
164
|
+
systematic shell-based discovery rather than reading files one by one:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
find . -name "AndroidManifest.xml" -not -path "*/build/*" \
|
|
168
|
+
-exec grep -c '<activity' {} +
|
|
169
|
+
find . \( -name "*.kt" -o -name "*.java" \) -not -path "*/build/*" \
|
|
170
|
+
-exec grep -l "extends.*Activity\|:.*Activity(" {} +
|
|
171
|
+
find . -path "*/res/layout/*.xml" -not -path "*/build/*" | wc -l
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
If the project has hundreds of Activities/layouts, keep each module as a
|
|
175
|
+
separate bounded analysis. Do not omit later modules and do not mark a
|
|
176
|
+
shard `complete` until its selected inventory categories were fully
|
|
177
|
+
enumerated.
|
|
178
|
+
|
|
179
|
+
## Step 5: Populate the `summary` Object
|
|
180
|
+
|
|
181
|
+
For each module shard, fill in the `summary` object with these fields
|
|
182
|
+
(all required by `schemas/project-context-module.json`):
|
|
183
|
+
|
|
184
|
+
- **`features`**: Domain terms this module contributes (e.g.,
|
|
185
|
+
`"search"`, `"chat"`, `"camera"`).
|
|
186
|
+
- **`activities`**: Array of `{name, entryPoints, screens}`. `name` is
|
|
187
|
+
the fully qualified Activity class. `entryPoints` lists launcher or
|
|
188
|
+
deep-link entry Activities. `screens` lists user-visible screen names.
|
|
189
|
+
- **`elements`**: Array of `{screen, resourceId?, text?,
|
|
190
|
+
contentDescription?, actions}`. At least one identity field is required.
|
|
191
|
+
`actions` is the list of actions the element supports (`click`,
|
|
192
|
+
`longClick`, `inputText`, `swipe`, `scrollTo`, `back`, `wait`).
|
|
193
|
+
- **`transitions`**: Array of `{fromActivity, toActivity, actionResourceId?
|
|
194
|
+
| actionText?}` describing cross-Activity navigation.
|
|
195
|
+
- **`logcat`**: Array of `{tag, pattern, match}` where `match` is
|
|
196
|
+
`"literal"` or `"regex"`. Derived from `Log.i`/`Log.d` calls in source.
|
|
197
|
+
|
|
198
|
+
Set the shard `status` to:
|
|
199
|
+
- `"complete"`: all inventory categories fully analyzed.
|
|
200
|
+
- `"partial"`: some categories analyzed, others skipped (note why).
|
|
201
|
+
- `"unsupported"`: module has no UI-relevant code (pure logic library).
|
|
202
|
+
|
|
203
|
+
Never leave a shard as `"notAnalyzed"` after this step.
|
|
204
|
+
|
|
205
|
+
## Step 6: Update the Root Index
|
|
206
|
+
|
|
207
|
+
Edit `.taphound/context/project-context.json`:
|
|
208
|
+
|
|
209
|
+
1. For each module entry in `modules[]`, copy `features`, `activities`,
|
|
210
|
+
and `status` from the corresponding shard.
|
|
211
|
+
|
|
212
|
+
2. Update `interactionPolicy`:
|
|
213
|
+
- **`allowedActions`**: List ONLY actions the UI actually supports,
|
|
214
|
+
derived from source evidence. A Button supports `click`/`longClick`.
|
|
215
|
+
An EditText supports `inputText`. A scrollable container (ScrollView,
|
|
216
|
+
RecyclerView) supports `swipe`/`scrollTo`. System navigation supports
|
|
217
|
+
`back`. Any screen supports `wait`. Do NOT list all actions blindly
|
|
218
|
+
— if you found no `longClick` handlers in source, do not include
|
|
219
|
+
`longClick`.
|
|
220
|
+
- **`confirmationRequiredActions`**: WARNING — this is per-action-TYPE,
|
|
221
|
+
not per-element. Listing `click` here means EVERY click in the entire
|
|
222
|
+
app will require human TTY approval during generation. Only list an
|
|
223
|
+
action here if ALL instances of that action in the app are potentially
|
|
224
|
+
dangerous (e.g., an app where every click triggers a payment). In
|
|
225
|
+
most apps, leave this EMPTY — the Core risk evaluator handles per-step
|
|
226
|
+
risk assessment at runtime.
|
|
227
|
+
- **`forbiddenActions`**: Actions that are dangerous by default
|
|
228
|
+
(payment, account deletion, password changes, installing APKs,
|
|
229
|
+
third-party app navigation). If none apply, leave empty.
|
|
230
|
+
- No action may appear in both `allowedActions` and `forbiddenActions`.
|
|
231
|
+
- Every action in `confirmationRequiredActions` must also be in
|
|
232
|
+
`allowedActions`.
|
|
233
|
+
|
|
234
|
+
3. Do NOT modify `packageName`, `launchActivity`, `manifest.files`,
|
|
235
|
+
`modules[].shardPath`, `modules[].sha256`, `modules[].moduleId`,
|
|
236
|
+
`modules[].projectDir`, or `modules[].kind` — Core owns these.
|
|
237
|
+
Do NOT add or remove module entries — Core discovered them.
|
|
238
|
+
Do NOT modify any `sha256` or `semanticSha256` field — Core computed
|
|
239
|
+
them. Run `context rehash` to recompute after your edits.
|
|
240
|
+
|
|
241
|
+
## Incremental Updates
|
|
242
|
+
|
|
243
|
+
When an existing Context is `stale`, Core's `context refresh` handles
|
|
244
|
+
hash maintenance. The agent only re-scans source when semantic analysis
|
|
245
|
+
is actually needed:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
taphound context status --project <project> \
|
|
249
|
+
--context .taphound/context/project-context.json --json
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
- `"valid"`: No action needed.
|
|
253
|
+
- `"stale"`: Run `context refresh --json`. It returns a `blocked` array;
|
|
254
|
+
each block has a `code` and `resolution`:
|
|
255
|
+
- `pruneDeleted` → `refresh --prune-deleted`
|
|
256
|
+
- `acceptSourceChanges` → `refresh --accept-source-changes` (rehashes
|
|
257
|
+
semantic edits). Re-analyze (Steps 1–5) only when the module summary
|
|
258
|
+
is now wrong or new UI files were added.
|
|
259
|
+
- `reanalyze` → Re-scan the affected module's source (Steps 1–5),
|
|
260
|
+
update its `summary`, then `context rehash`.
|
|
261
|
+
- `"invalid"`: Run `context generate --force` and redo Steps 1–5.
|
|
262
|
+
|
|
263
|
+
The typical reconcile for routine edits + deletions:
|
|
264
|
+
```bash
|
|
265
|
+
taphound context refresh --project <project> \
|
|
266
|
+
--context .taphound/context/project-context.json \
|
|
267
|
+
--prune-deleted --accept-source-changes --json
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
`--module <id...>` narrows scope. `refresh` backfills `semanticSha256`,
|
|
271
|
+
rehashes formatting-only changes, and repairs drifted hashes. It never
|
|
272
|
+
removes a file for a non-deletion reason.
|
|
273
|
+
|
|
274
|
+
**Caveat**: `--accept-source-changes` does NOT re-analyze newly added
|
|
275
|
+
Activities or layouts into the module summary. If the Goal may reach a
|
|
276
|
+
new screen, re-scan that module's source (Steps 1–5) and update its
|
|
277
|
+
`summary`, then run `context rehash`.
|
|
278
|
+
|
|
279
|
+
### When to regenerate instead of refresh
|
|
280
|
+
|
|
281
|
+
Run `context generate --force` and redo full analysis (Steps 1–5) when:
|
|
282
|
+
- A new Gradle module was added or removed (check `settings.gradle`).
|
|
283
|
+
- The `packageName` or `launchActivity` changed.
|
|
284
|
+
- The Context is `"invalid"` (structural corruption).
|
|
285
|
+
|
|
286
|
+
## Rules
|
|
287
|
+
|
|
288
|
+
- The agent NEVER computes SHA-256 hashes manually. Core does all hashing
|
|
289
|
+
via `context generate` and `context rehash`.
|
|
290
|
+
- The agent NEVER discovers modules manually. Core parses `settings.gradle`
|
|
291
|
+
and falls back to filesystem scanning.
|
|
292
|
+
- The agent NEVER resolves `applicationId` or launch Activity manually.
|
|
293
|
+
Core inspects build files and manifests.
|
|
294
|
+
- Paths in `manifest.files` are relative to the Android project root,
|
|
295
|
+
use forward slashes, and must not start with `/` or contain `..`.
|
|
296
|
+
Core already set these — do not modify them.
|
|
297
|
+
- For multi-module projects, include source analysis from all modules that
|
|
298
|
+
contribute to the UI — not just the `app` module.
|
|
299
|
+
- **Completeness is mandatory**: enumerate ALL `<activity>` entries from
|
|
300
|
+
ALL module manifests and include each Activity's source file analysis.
|
|
301
|
+
- For layouts using `<include>`, `<merge>`, or `<layout>`, resolve
|
|
302
|
+
transitively to understand the full element set.
|
|
303
|
+
- `confirmationRequiredActions` is per-action-TYPE. Listing `click` makes
|
|
304
|
+
EVERY click require human approval. Leave empty unless ALL instances of
|
|
305
|
+
an action are dangerous.
|
|
306
|
+
- `allowedActions` must be derived from source evidence, not blanket
|
|
307
|
+
inclusion. If no source evidence supports an action, do not list it.
|
|
308
|
+
- Do not include build artifacts, generated code, or non-UI files in your
|
|
309
|
+
analysis — Core already excluded them from the evidence manifest.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://taphound.dev/schemas/context-refresh-result.json",
|
|
4
|
+
"title": "TapHound context refresh --json Output",
|
|
5
|
+
"description": "Reference shape for the JSON result of `context refresh --json`. Core recomputes evidence hashes, backfills semanticSha256, rehashes formatting-only changes, repairs drifted hashes, and prunes deleted-file entries. The status field tells the agent whether to re-analyze source.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["status", "indexHash", "acceptedSourceChanges", "scopes", "blocked", "exitCode"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"status": {
|
|
11
|
+
"enum": ["refreshed", "unchanged", "blocked"],
|
|
12
|
+
"description": "refreshed: at least one scope was written. unchanged: no hashes needed repair. blocked: one or more scopes could not be auto-refreshed."
|
|
13
|
+
},
|
|
14
|
+
"indexHash": {
|
|
15
|
+
"$ref": "#/$defs/sha256",
|
|
16
|
+
"description": "SHA-256 of the root index file bytes after refresh."
|
|
17
|
+
},
|
|
18
|
+
"acceptedSourceChanges": {
|
|
19
|
+
"type": "boolean",
|
|
20
|
+
"description": "Whether --accept-source-changes was passed and semantic edits were rehashed."
|
|
21
|
+
},
|
|
22
|
+
"scopes": {
|
|
23
|
+
"type": "array",
|
|
24
|
+
"description": "One entry per module (scope=module) plus one for the root index (scope=index).",
|
|
25
|
+
"items": { "$ref": "#/$defs/scopeReport" }
|
|
26
|
+
},
|
|
27
|
+
"blocked": {
|
|
28
|
+
"type": "array",
|
|
29
|
+
"description": "Scopes that could not be auto-refreshed. Each block carries a resolution the agent must act on.",
|
|
30
|
+
"items": { "$ref": "#/$defs/block" }
|
|
31
|
+
},
|
|
32
|
+
"exitCode": {
|
|
33
|
+
"enum": [0, 1],
|
|
34
|
+
"description": "0 when status is refreshed or unchanged. 1 when status is blocked."
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"$defs": {
|
|
38
|
+
"sha256": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"pattern": "^[a-f\\d]{64}$"
|
|
41
|
+
},
|
|
42
|
+
"scopeReport": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"additionalProperties": false,
|
|
45
|
+
"required": [
|
|
46
|
+
"scope",
|
|
47
|
+
"id",
|
|
48
|
+
"contextPath",
|
|
49
|
+
"written",
|
|
50
|
+
"semanticBackfilled",
|
|
51
|
+
"formattingRehashed",
|
|
52
|
+
"semanticChanged",
|
|
53
|
+
"unresolved",
|
|
54
|
+
"pruned",
|
|
55
|
+
"inventoryChanged"
|
|
56
|
+
],
|
|
57
|
+
"properties": {
|
|
58
|
+
"scope": { "enum": ["index", "module"] },
|
|
59
|
+
"id": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"description": "Module ID for scope=module, or \"index\" for scope=index."
|
|
62
|
+
},
|
|
63
|
+
"contextPath": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"description": "Project-relative path to the shard or index file."
|
|
66
|
+
},
|
|
67
|
+
"written": {
|
|
68
|
+
"type": "boolean",
|
|
69
|
+
"description": "Whether the file was actually written (hashes changed)."
|
|
70
|
+
},
|
|
71
|
+
"semanticBackfilled": {
|
|
72
|
+
"type": "integer",
|
|
73
|
+
"minimum": 0,
|
|
74
|
+
"description": "Number of evidence entries where semanticSha256 was missing and has been added."
|
|
75
|
+
},
|
|
76
|
+
"formattingRehashed": {
|
|
77
|
+
"type": "integer",
|
|
78
|
+
"minimum": 0,
|
|
79
|
+
"description": "Number of evidence entries whose full hash changed but semantic hash did not (formatting-only edit, rehashed automatically)."
|
|
80
|
+
},
|
|
81
|
+
"semanticChanged": {
|
|
82
|
+
"type": "array",
|
|
83
|
+
"items": { "type": "string" },
|
|
84
|
+
"description": "Project-relative paths whose semantic hash changed. Requires --accept-source-changes to rehash; otherwise blocked."
|
|
85
|
+
},
|
|
86
|
+
"unresolved": {
|
|
87
|
+
"type": "array",
|
|
88
|
+
"items": { "type": "string" },
|
|
89
|
+
"description": "Project-relative paths that could not be read (deleted or moved). Requires --prune-deleted to drop; otherwise blocked."
|
|
90
|
+
},
|
|
91
|
+
"pruned": {
|
|
92
|
+
"type": "integer",
|
|
93
|
+
"minimum": 0,
|
|
94
|
+
"description": "Number of evidence entries pruned via --prune-deleted."
|
|
95
|
+
},
|
|
96
|
+
"inventoryChanged": {
|
|
97
|
+
"type": "boolean",
|
|
98
|
+
"description": "Whether the module's inventory pathSetSha256 changed (files added or removed). Always blocks auto-refresh; requires reanalysis."
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
"block": {
|
|
103
|
+
"type": "object",
|
|
104
|
+
"additionalProperties": false,
|
|
105
|
+
"required": ["code", "resolution", "message"],
|
|
106
|
+
"properties": {
|
|
107
|
+
"code": {
|
|
108
|
+
"enum": [
|
|
109
|
+
"EVIDENCE_UNRESOLVED",
|
|
110
|
+
"EVIDENCE_SEMANTIC_CHANGED",
|
|
111
|
+
"MODULE_INVENTORY_CHANGED"
|
|
112
|
+
],
|
|
113
|
+
"description": "EVIDENCE_UNRESOLVED: file missing. EVIDENCE_SEMANTIC_CHANGED: source semantics changed. MODULE_INVENTORY_CHANGED: files added or removed."
|
|
114
|
+
},
|
|
115
|
+
"resolution": {
|
|
116
|
+
"enum": ["pruneDeleted", "acceptSourceChanges", "reanalyze"],
|
|
117
|
+
"description": "Action the agent must take: pruneDeleted → refresh --prune-deleted. acceptSourceChanges → refresh --accept-source-changes. reanalyze → re-scan source and regenerate the shard."
|
|
118
|
+
},
|
|
119
|
+
"message": { "type": "string" }
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://taphound.dev/schemas/project-context-module.json",
|
|
4
|
+
"title": "TapHound Project Context Module",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"version",
|
|
9
|
+
"moduleId",
|
|
10
|
+
"projectDir",
|
|
11
|
+
"status",
|
|
12
|
+
"inventory",
|
|
13
|
+
"manifest",
|
|
14
|
+
"summary"
|
|
15
|
+
],
|
|
16
|
+
"properties": {
|
|
17
|
+
"version": { "const": 2 },
|
|
18
|
+
"moduleId": { "type": "string", "minLength": 1 },
|
|
19
|
+
"projectDir": { "$ref": "#/$defs/projectPath" },
|
|
20
|
+
"status": { "$ref": "#/$defs/shardStatus" },
|
|
21
|
+
"inventory": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"additionalProperties": false,
|
|
24
|
+
"required": ["version", "pathSetSha256", "categories"],
|
|
25
|
+
"properties": {
|
|
26
|
+
"version": { "const": 2 },
|
|
27
|
+
"pathSetSha256": { "$ref": "#/$defs/sha256" },
|
|
28
|
+
"categories": {
|
|
29
|
+
"type": "array",
|
|
30
|
+
"minItems": 1,
|
|
31
|
+
"uniqueItems": true,
|
|
32
|
+
"items": {
|
|
33
|
+
"enum": ["manifests", "sources", "layouts", "navigation"]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"manifest": { "$ref": "#/$defs/manifest" },
|
|
39
|
+
"summary": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"additionalProperties": false,
|
|
42
|
+
"required": [
|
|
43
|
+
"features",
|
|
44
|
+
"activities",
|
|
45
|
+
"elements",
|
|
46
|
+
"transitions",
|
|
47
|
+
"logcat"
|
|
48
|
+
],
|
|
49
|
+
"properties": {
|
|
50
|
+
"features": {
|
|
51
|
+
"type": "array",
|
|
52
|
+
"uniqueItems": true,
|
|
53
|
+
"items": { "type": "string", "minLength": 1 }
|
|
54
|
+
},
|
|
55
|
+
"activities": {
|
|
56
|
+
"type": "array",
|
|
57
|
+
"items": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"additionalProperties": false,
|
|
60
|
+
"required": ["name", "entryPoints", "screens"],
|
|
61
|
+
"properties": {
|
|
62
|
+
"name": { "$ref": "#/$defs/qualifiedName" },
|
|
63
|
+
"entryPoints": {
|
|
64
|
+
"type": "array",
|
|
65
|
+
"items": { "$ref": "#/$defs/qualifiedName" }
|
|
66
|
+
},
|
|
67
|
+
"screens": {
|
|
68
|
+
"type": "array",
|
|
69
|
+
"uniqueItems": true,
|
|
70
|
+
"items": { "type": "string", "minLength": 1 }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"elements": {
|
|
76
|
+
"type": "array",
|
|
77
|
+
"items": {
|
|
78
|
+
"type": "object",
|
|
79
|
+
"additionalProperties": false,
|
|
80
|
+
"required": ["screen", "actions"],
|
|
81
|
+
"properties": {
|
|
82
|
+
"screen": { "type": "string", "minLength": 1 },
|
|
83
|
+
"resourceId": { "type": "string", "minLength": 1 },
|
|
84
|
+
"text": { "type": "string", "minLength": 1 },
|
|
85
|
+
"contentDescription": { "type": "string", "minLength": 1 },
|
|
86
|
+
"actions": {
|
|
87
|
+
"type": "array",
|
|
88
|
+
"minItems": 1,
|
|
89
|
+
"items": { "$ref": "#/$defs/action" }
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"anyOf": [
|
|
93
|
+
{ "required": ["resourceId"] },
|
|
94
|
+
{ "required": ["text"] },
|
|
95
|
+
{ "required": ["contentDescription"] }
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"transitions": {
|
|
100
|
+
"type": "array",
|
|
101
|
+
"items": {
|
|
102
|
+
"type": "object",
|
|
103
|
+
"additionalProperties": false,
|
|
104
|
+
"required": ["fromActivity", "toActivity"],
|
|
105
|
+
"properties": {
|
|
106
|
+
"fromActivity": { "$ref": "#/$defs/qualifiedName" },
|
|
107
|
+
"actionResourceId": { "type": "string", "minLength": 1 },
|
|
108
|
+
"actionText": { "type": "string", "minLength": 1 },
|
|
109
|
+
"toActivity": { "$ref": "#/$defs/qualifiedName" }
|
|
110
|
+
},
|
|
111
|
+
"anyOf": [
|
|
112
|
+
{ "required": ["actionResourceId"] },
|
|
113
|
+
{ "required": ["actionText"] }
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"logcat": {
|
|
118
|
+
"type": "array",
|
|
119
|
+
"items": {
|
|
120
|
+
"type": "object",
|
|
121
|
+
"additionalProperties": false,
|
|
122
|
+
"required": ["tag", "pattern", "match"],
|
|
123
|
+
"properties": {
|
|
124
|
+
"tag": { "type": "string", "minLength": 1 },
|
|
125
|
+
"pattern": { "type": "string", "minLength": 1 },
|
|
126
|
+
"match": { "enum": ["literal", "regex"] }
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"$defs": {
|
|
134
|
+
"qualifiedName": {
|
|
135
|
+
"type": "string",
|
|
136
|
+
"pattern": "^(?:[A-Za-z_$][\\w$]*\\.)+[A-Za-z_$][\\w$]*$"
|
|
137
|
+
},
|
|
138
|
+
"projectPath": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"minLength": 1,
|
|
141
|
+
"pattern": "^(?!/)(?![A-Za-z]:)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\\\]+$"
|
|
142
|
+
},
|
|
143
|
+
"sha256": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"pattern": "^[a-f\\d]{64}$"
|
|
146
|
+
},
|
|
147
|
+
"shardStatus": {
|
|
148
|
+
"enum": ["complete", "partial", "unsupported", "notAnalyzed"]
|
|
149
|
+
},
|
|
150
|
+
"action": {
|
|
151
|
+
"enum": [
|
|
152
|
+
"click",
|
|
153
|
+
"longClick",
|
|
154
|
+
"inputText",
|
|
155
|
+
"swipe",
|
|
156
|
+
"scrollTo",
|
|
157
|
+
"back",
|
|
158
|
+
"wait"
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
"manifest": {
|
|
162
|
+
"type": "object",
|
|
163
|
+
"additionalProperties": false,
|
|
164
|
+
"required": ["version", "files"],
|
|
165
|
+
"properties": {
|
|
166
|
+
"version": { "const": 1 },
|
|
167
|
+
"files": {
|
|
168
|
+
"type": "array",
|
|
169
|
+
"minItems": 1,
|
|
170
|
+
"items": {
|
|
171
|
+
"type": "object",
|
|
172
|
+
"additionalProperties": false,
|
|
173
|
+
"required": ["path", "sha256", "confidence"],
|
|
174
|
+
"properties": {
|
|
175
|
+
"path": { "$ref": "#/$defs/projectPath" },
|
|
176
|
+
"sha256": { "$ref": "#/$defs/sha256" },
|
|
177
|
+
"semanticSha256": { "$ref": "#/$defs/sha256" },
|
|
178
|
+
"confidence": {
|
|
179
|
+
"enum": [
|
|
180
|
+
"sourceConfirmed",
|
|
181
|
+
"runtimeConfirmed",
|
|
182
|
+
"inferred",
|
|
183
|
+
"unknown"
|
|
184
|
+
]
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|