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,363 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: taphound-case-suite
|
|
3
|
+
description: >-
|
|
4
|
+
Persist and orchestrate a multi-Case TapHound Journey generation suite.
|
|
5
|
+
Freezes the user-approved Case catalog, maintains an atomic revisioned
|
|
6
|
+
Case Ledger and human-readable status, plans verified Base Flow reuse,
|
|
7
|
+
and dispatches exactly one Case at a time to the Journey Brief Author
|
|
8
|
+
and Journey Generator Skills. Use when a regression plan contains
|
|
9
|
+
multiple Cases or must survive context compaction, agent restart, or
|
|
10
|
+
interrupted generation sessions.
|
|
11
|
+
compatibility: >-
|
|
12
|
+
Requires Node.js 22+, TapHound's taphound-journey-brief-author and
|
|
13
|
+
taphound-journey-generator Skills, and the public TapHound CLI.
|
|
14
|
+
metadata:
|
|
15
|
+
author: TapHound
|
|
16
|
+
version: "1.0"
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# TapHound Case Suite
|
|
20
|
+
|
|
21
|
+
This Workflow Skill owns durable **multi-Case orchestration**. It never
|
|
22
|
+
executes a Journey step itself and never reads or writes Core generation
|
|
23
|
+
bundles. It dispatches one Case at a time to:
|
|
24
|
+
|
|
25
|
+
- `taphound-journey-brief-author` for one Case Brief;
|
|
26
|
+
- `taphound-journey-generator` for one generation session and final Replay.
|
|
27
|
+
|
|
28
|
+
The Case catalog and Ledger on disk are the Source of Truth. Chat history is
|
|
29
|
+
not a requirement store. Never reconstruct missing Cases from memory,
|
|
30
|
+
resource IDs, source hints, or a prior conversation summary.
|
|
31
|
+
|
|
32
|
+
## Skill payload
|
|
33
|
+
|
|
34
|
+
All paths below are relative to this installed Skill:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
taphound-case-suite/
|
|
38
|
+
├── SKILL.md
|
|
39
|
+
├── scripts/ledger.mjs
|
|
40
|
+
├── schemas/
|
|
41
|
+
│ ├── suite-input.schema.json
|
|
42
|
+
│ ├── case-catalog.schema.json
|
|
43
|
+
│ ├── case-ledger.schema.json
|
|
44
|
+
│ ├── transition.schema.json
|
|
45
|
+
│ └── base-flow-record.schema.json
|
|
46
|
+
└── templates/
|
|
47
|
+
├── suite-input.example.json
|
|
48
|
+
├── transition.example.json
|
|
49
|
+
└── base-flow-record.example.json
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Use `node <skill>/scripts/ledger.mjs help` for the helper contract.
|
|
53
|
+
|
|
54
|
+
## Durable suite directory
|
|
55
|
+
|
|
56
|
+
The caller chooses an explicit project-relative suite directory. A normal
|
|
57
|
+
layout is:
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
doc/development/<suite-id>/
|
|
61
|
+
├── cases.json # frozen user-approved Case catalog
|
|
62
|
+
├── case-ledger.json # mutable, revisioned orchestration state
|
|
63
|
+
├── STATUS.md # generated human view; never the Source of Truth
|
|
64
|
+
└── briefs/
|
|
65
|
+
└── <case-id>/taphound-journey-brief.md
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`cases.json` is immutable after initialization. To change requirements,
|
|
69
|
+
archive the old Suite and initialize a new Suite ID. Do not edit
|
|
70
|
+
`case-ledger.json` or `STATUS.md` by hand; use the helper so revision checks,
|
|
71
|
+
transition rules, hashes, and the single-active-Case invariant are enforced.
|
|
72
|
+
|
|
73
|
+
The suite directory is committed project material. Runtime reports and
|
|
74
|
+
generation bundles remain under `.taphound/build/` and may be referenced by
|
|
75
|
+
path and hash, but raw Logcat, screenshots, captured values, credentials, and
|
|
76
|
+
personal data must never be copied into the catalog or Ledger.
|
|
77
|
+
|
|
78
|
+
## Phase 0: Freeze the Case catalog
|
|
79
|
+
|
|
80
|
+
Require the complete user-approved Case list before execution. Each Case needs:
|
|
81
|
+
|
|
82
|
+
- stable `id`;
|
|
83
|
+
- explicit `order`;
|
|
84
|
+
- title;
|
|
85
|
+
- exact `sourceText` preserving the user's requirement;
|
|
86
|
+
- `risk`: `readOnly`, `stateChanging`, or `external`;
|
|
87
|
+
- dependency Case IDs;
|
|
88
|
+
- optional planned Base Flow name.
|
|
89
|
+
|
|
90
|
+
If the original list is unavailable, a source-derived proposal is allowed only
|
|
91
|
+
as a draft presented to the user. Initialize the Suite only after approval.
|
|
92
|
+
Never silently fill gaps.
|
|
93
|
+
|
|
94
|
+
Create an input from `templates/suite-input.example.json`, then:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
node <skill>/scripts/ledger.mjs init \
|
|
98
|
+
--input /tmp/taphound-suite-input.json \
|
|
99
|
+
--out <project>/doc/development/<suite-id>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Initialization canonicalizes `projectRoot`, validates dependency cycles and
|
|
103
|
+
ordering, writes the frozen catalog, records its exact-byte SHA-256 in the
|
|
104
|
+
Ledger, and creates `STATUS.md`. Existing suite files are never overwritten.
|
|
105
|
+
|
|
106
|
+
## Phase 1: Resume from disk
|
|
107
|
+
|
|
108
|
+
At the start of every agent invocation, including after context compaction:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
node <skill>/scripts/ledger.mjs validate --suite <suite-directory>
|
|
112
|
+
node <skill>/scripts/ledger.mjs status --suite <suite-directory>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
For machine-readable details about one Case only:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
node <skill>/scripts/ledger.mjs status \
|
|
119
|
+
--suite <suite-directory> --case <case-id>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Without `--case`, the summary JSON remains the stable suite-level contract.
|
|
123
|
+
|
|
124
|
+
Then:
|
|
125
|
+
|
|
126
|
+
1. Read `cases.json` and `case-ledger.json`.
|
|
127
|
+
2. If one Case is nonterminal and not `pending`, resume that Case first.
|
|
128
|
+
3. Reconcile a stored `generationId` with:
|
|
129
|
+
```bash
|
|
130
|
+
taphound generation status \
|
|
131
|
+
--project <project> --session <generationId> --json
|
|
132
|
+
```
|
|
133
|
+
4. Follow the recorded `nextAction`; never infer that an interrupted action is
|
|
134
|
+
safe to repeat.
|
|
135
|
+
5. Only when no Case is active, select the lowest-order eligible `pending`
|
|
136
|
+
Case whose dependencies are `verified`.
|
|
137
|
+
|
|
138
|
+
The helper uses optimistic concurrency. Every transition requires the current
|
|
139
|
+
`expectedRevision`; a stale agent fails instead of overwriting newer work.
|
|
140
|
+
If an agent process was killed while holding the short-lived helper lock,
|
|
141
|
+
first confirm no update process is running, then use:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
node <skill>/scripts/ledger.mjs recover-lock --suite <suite-directory>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The helper removes the lock only when its recorded local PID no longer exists;
|
|
148
|
+
it never breaks a live writer's lock.
|
|
149
|
+
|
|
150
|
+
## Phase 2: Plan order and Base Flows
|
|
151
|
+
|
|
152
|
+
Order Cases by deterministic prerequisites, not by convenience:
|
|
153
|
+
|
|
154
|
+
1. stable cold-launch and entry coverage;
|
|
155
|
+
2. shallow read-only Cases;
|
|
156
|
+
3. same-page controls and navigation;
|
|
157
|
+
4. asynchronous/WebView Cases;
|
|
158
|
+
5. state-changing Cases;
|
|
159
|
+
6. external/cross-package Cases.
|
|
160
|
+
|
|
161
|
+
Keep user-declared `order` authoritative. Dependencies may delay a Case, but
|
|
162
|
+
the Skill must not reorder or rewrite the catalog silently.
|
|
163
|
+
|
|
164
|
+
Cluster Cases by repeated navigation prefix. A Base Flow is eligible only when:
|
|
165
|
+
|
|
166
|
+
- it begins at a stable Activity reachable after cold launch;
|
|
167
|
+
- it contains only shared deterministic navigation;
|
|
168
|
+
- it contains no Case-specific business action or assertion;
|
|
169
|
+
- its Activity boundaries compose exactly;
|
|
170
|
+
- a Journey Source that includes the Flow was resolved;
|
|
171
|
+
- the resolution manifest binds the exact Flow hash and resolved Journey hash;
|
|
172
|
+
- an independent Replay of that resolved Journey passed;
|
|
173
|
+
- all file and report hashes are recorded in the Ledger.
|
|
174
|
+
|
|
175
|
+
Record a verified Flow:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
node <skill>/scripts/ledger.mjs record-flow \
|
|
179
|
+
--suite <suite-directory> \
|
|
180
|
+
--input /tmp/taphound-flow-record.json
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Use `templates/base-flow-record.example.json`. The helper validates the Flow
|
|
184
|
+
name/file, resolution manifest, resolved Journey, exact hashes, passed report,
|
|
185
|
+
project confinement, and revision.
|
|
186
|
+
Never modify a bound Flow while a generation session is active.
|
|
187
|
+
|
|
188
|
+
## Phase 3: One Case at a time
|
|
189
|
+
|
|
190
|
+
The device policy is serial. On one device, never run two active Cases or two
|
|
191
|
+
generation sessions concurrently. Separate devices are outside v1; initialize
|
|
192
|
+
separate Suites instead of bypassing this invariant.
|
|
193
|
+
|
|
194
|
+
### 3.1 Claim
|
|
195
|
+
|
|
196
|
+
Transition the selected Case:
|
|
197
|
+
|
|
198
|
+
```text
|
|
199
|
+
pending → briefing
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Use `templates/transition.example.json` and:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
node <skill>/scripts/ledger.mjs transition \
|
|
206
|
+
--suite <suite-directory> \
|
|
207
|
+
--input /tmp/taphound-transition.json
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### 3.2 Brief
|
|
211
|
+
|
|
212
|
+
Dispatch exactly one Case to `taphound-journey-brief-author` with:
|
|
213
|
+
|
|
214
|
+
- `caseId`;
|
|
215
|
+
- exact catalog `sourceText` as `caseGoal`;
|
|
216
|
+
- explicit context paths only;
|
|
217
|
+
- output
|
|
218
|
+
`<suite>/briefs/<case-id>/taphound-journey-brief.md`.
|
|
219
|
+
|
|
220
|
+
After authoring, compute its exact hash and transition:
|
|
221
|
+
|
|
222
|
+
```text
|
|
223
|
+
briefing → briefReady
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
The transition must carry `brief: {path, sha256}`. Paths stored in the Ledger
|
|
227
|
+
are project-relative. Set `sha256` to the literal string `compute` to make the
|
|
228
|
+
helper hash the exact file bytes at `path` and store the result; omitting the
|
|
229
|
+
field is still invalid.
|
|
230
|
+
|
|
231
|
+
### 3.3 Generation
|
|
232
|
+
|
|
233
|
+
Before generation:
|
|
234
|
+
|
|
235
|
+
- ensure Project Context is valid;
|
|
236
|
+
- list Flows;
|
|
237
|
+
- if the Case plans a Base Flow, require the Ledger to contain the same Flow
|
|
238
|
+
in `verified` state;
|
|
239
|
+
- pass the bound Brief path/hash to the Generator.
|
|
240
|
+
|
|
241
|
+
Start one session and transition:
|
|
242
|
+
|
|
243
|
+
```text
|
|
244
|
+
briefReady → generating
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Record `generation: {id, baseFlow?}`. After every public CLI command, write the
|
|
248
|
+
new failure/next action to the Ledger before doing more work.
|
|
249
|
+
|
|
250
|
+
The Journey Generator remains authoritative for observe/step/confirmation,
|
|
251
|
+
`recover`, `reopen`, replacement, and finalization semantics.
|
|
252
|
+
|
|
253
|
+
### 3.4 Final Replay and independent Replay
|
|
254
|
+
|
|
255
|
+
After candidate steps are complete:
|
|
256
|
+
|
|
257
|
+
```text
|
|
258
|
+
generating → verificationPending
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Run `generation finalize`. A generated Journey is not Suite-complete yet.
|
|
262
|
+
Run one independent standard `taphound verify` against the exported Journey
|
|
263
|
+
and strict generated Replay policy.
|
|
264
|
+
|
|
265
|
+
Only then transition:
|
|
266
|
+
|
|
267
|
+
```text
|
|
268
|
+
verificationPending → verified
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
The transition must provide:
|
|
272
|
+
|
|
273
|
+
- Journey path/hash;
|
|
274
|
+
- generation meta path/hash (`status: verified`);
|
|
275
|
+
- finalization report path/hash (`status: passed`);
|
|
276
|
+
- independent report path/hash (`status: passed`, different `runId`).
|
|
277
|
+
|
|
278
|
+
Each of the four entries accepts `sha256: "compute"`, so the transition input
|
|
279
|
+
can name the paths and let the helper compute the exact file hashes. The stored
|
|
280
|
+
Ledger always holds the resolved hex digests, and every later `validate` still
|
|
281
|
+
fails with `CASE_SUITE_STALE` when a recorded artifact changes.
|
|
282
|
+
|
|
283
|
+
The helper reads and hashes all four artifacts. Agent prose, screenshots, a
|
|
284
|
+
successful last step, or a finalization report without independent Replay can
|
|
285
|
+
never mark a Case `verified`.
|
|
286
|
+
|
|
287
|
+
## Failure and recovery states
|
|
288
|
+
|
|
289
|
+
Allowed states:
|
|
290
|
+
|
|
291
|
+
```text
|
|
292
|
+
pending
|
|
293
|
+
briefing
|
|
294
|
+
briefReady
|
|
295
|
+
generating
|
|
296
|
+
recoveryRequired
|
|
297
|
+
verificationPending
|
|
298
|
+
verificationFailed
|
|
299
|
+
blocked
|
|
300
|
+
deferred
|
|
301
|
+
verified
|
|
302
|
+
archived
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Important paths:
|
|
306
|
+
|
|
307
|
+
- interrupted action or verification:
|
|
308
|
+
`generating|verificationPending → recoveryRequired`;
|
|
309
|
+
- deterministic final Replay failure:
|
|
310
|
+
`verificationPending → verificationFailed`;
|
|
311
|
+
- tool/environment/context blocker:
|
|
312
|
+
current state → `blocked`;
|
|
313
|
+
- intentionally postponed work:
|
|
314
|
+
any nonterminal state → `deferred`;
|
|
315
|
+
- user abandonment:
|
|
316
|
+
nonterminal state → `archived`.
|
|
317
|
+
|
|
318
|
+
`recoveryRequired` must record `failure` and `nextAction`. Obtain explicit user
|
|
319
|
+
approval before Core `generation recover --decision retry`.
|
|
320
|
+
`verificationFailed` resumes only after audited `generation reopen`.
|
|
321
|
+
When entering `blocked`, the helper records the exact prior state; it may
|
|
322
|
+
resume only to that state. `blocked` remains the current Case and continues to
|
|
323
|
+
occupy the active slot. A `deferred` Case records `failure`, `nextAction`, and
|
|
324
|
+
the state it must resume; it does not occupy the active slot, so multiple Cases
|
|
325
|
+
may be deferred. Deferring an already blocked or recovery-required Case
|
|
326
|
+
preserves the original interrupted state rather than replacing it with the
|
|
327
|
+
wrapper state. A deferred Case may resume only to its recorded state (or be
|
|
328
|
+
archived); resuming an active state rechecks dependencies and the single-active
|
|
329
|
+
Case rule. `verified` and `archived` are terminal.
|
|
330
|
+
|
|
331
|
+
One blocked or otherwise active Case remains the Suite's current Case. Do not
|
|
332
|
+
skip it merely to make the completion count increase; explicitly defer,
|
|
333
|
+
archive, or resolve it.
|
|
334
|
+
|
|
335
|
+
## Completion and handoff
|
|
336
|
+
|
|
337
|
+
The Suite is complete only when every Case is `verified` or explicitly
|
|
338
|
+
`archived`. `STATUS.md` shows checkboxes and evidence links, but all automation
|
|
339
|
+
must read `case-ledger.json`.
|
|
340
|
+
|
|
341
|
+
To hand work to another Agent, provide only:
|
|
342
|
+
|
|
343
|
+
- absolute suite directory;
|
|
344
|
+
- project path if it is not already canonical in `cases.json`;
|
|
345
|
+
- device availability.
|
|
346
|
+
|
|
347
|
+
The receiving Agent validates and resumes from disk. It does not need the
|
|
348
|
+
previous conversation or a re-posted Case list.
|
|
349
|
+
|
|
350
|
+
## Hard rules
|
|
351
|
+
|
|
352
|
+
- Never use chat history as the only Case store.
|
|
353
|
+
- Never guess a missing Case.
|
|
354
|
+
- Never edit the frozen catalog after initialization.
|
|
355
|
+
- Never manually edit the Ledger or generated status.
|
|
356
|
+
- Never run two Cases on one device concurrently.
|
|
357
|
+
- Never auto-approve confirmation or recovery.
|
|
358
|
+
- Never call a Case done before finalization plus independent Replay.
|
|
359
|
+
- Never put raw Logcat, screenshots, captured values, secrets, or user content
|
|
360
|
+
in Suite files.
|
|
361
|
+
- Never treat a Base Flow as verified without a passing independent report and
|
|
362
|
+
recorded hashes.
|
|
363
|
+
- Never read or write `.taphound/build/generations` directly.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://taphound.dev/schemas/base-flow-record-v1.json",
|
|
4
|
+
"title": "TapHound Verified Base Flow Record",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"version", "expectedRevision", "name", "path", "sha256",
|
|
9
|
+
"exitActivity", "journey", "resolutionManifest", "report"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"version": { "const": 1 },
|
|
13
|
+
"expectedRevision": { "type": "integer", "minimum": 0 },
|
|
14
|
+
"name": { "type": "string", "minLength": 1 },
|
|
15
|
+
"path": { "type": "string", "minLength": 1 },
|
|
16
|
+
"sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
17
|
+
"exitActivity": { "type": "string", "minLength": 1 },
|
|
18
|
+
"journey": { "$ref": "case-ledger-v1.json#/$defs/artifact" },
|
|
19
|
+
"resolutionManifest": { "$ref": "case-ledger-v1.json#/$defs/artifact" },
|
|
20
|
+
"report": { "$ref": "case-ledger-v1.json#/$defs/artifact" }
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://taphound.dev/schemas/case-catalog-v1.json",
|
|
4
|
+
"title": "TapHound Frozen Case Catalog",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"version", "kind", "suiteId", "title", "projectRoot",
|
|
9
|
+
"contextPath", "createdAt", "cases"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"version": { "const": 1 },
|
|
13
|
+
"kind": { "const": "taphound.caseCatalog" },
|
|
14
|
+
"suiteId": { "type": "string", "minLength": 1 },
|
|
15
|
+
"title": { "type": "string", "minLength": 1 },
|
|
16
|
+
"projectRoot": { "type": "string", "minLength": 1 },
|
|
17
|
+
"deviceSerial": { "type": "string", "minLength": 1 },
|
|
18
|
+
"contextPath": { "type": "string", "minLength": 1 },
|
|
19
|
+
"createdAt": { "type": "string", "format": "date-time" },
|
|
20
|
+
"cases": {
|
|
21
|
+
"type": "array",
|
|
22
|
+
"minItems": 1,
|
|
23
|
+
"items": { "$ref": "case-suite-input-v1.json#/$defs/case" }
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://taphound.dev/schemas/case-ledger-v1.json",
|
|
4
|
+
"title": "TapHound Case Suite Ledger",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"version", "kind", "suiteId", "revision", "catalog",
|
|
9
|
+
"devicePolicy", "baseFlows", "cases", "updatedAt"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"version": { "const": 1 },
|
|
13
|
+
"kind": { "const": "taphound.caseLedger" },
|
|
14
|
+
"suiteId": { "type": "string", "minLength": 1 },
|
|
15
|
+
"revision": { "type": "integer", "minimum": 0 },
|
|
16
|
+
"catalog": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"additionalProperties": false,
|
|
19
|
+
"required": ["path", "sha256"],
|
|
20
|
+
"properties": {
|
|
21
|
+
"path": { "const": "cases.json" },
|
|
22
|
+
"sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"devicePolicy": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"additionalProperties": false,
|
|
28
|
+
"required": ["concurrency"],
|
|
29
|
+
"properties": {
|
|
30
|
+
"concurrency": { "const": "serial" },
|
|
31
|
+
"deviceSerial": { "type": "string", "minLength": 1 }
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"baseFlows": {
|
|
35
|
+
"type": "array",
|
|
36
|
+
"items": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"additionalProperties": false,
|
|
39
|
+
"required": [
|
|
40
|
+
"name", "status", "path", "sha256", "exitActivity",
|
|
41
|
+
"journey", "resolutionManifest", "report", "recordedAt"
|
|
42
|
+
],
|
|
43
|
+
"properties": {
|
|
44
|
+
"name": { "type": "string", "minLength": 1 },
|
|
45
|
+
"status": { "const": "verified" },
|
|
46
|
+
"path": { "type": "string", "minLength": 1 },
|
|
47
|
+
"sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
48
|
+
"exitActivity": { "type": "string", "minLength": 1 },
|
|
49
|
+
"journey": { "$ref": "#/$defs/artifact" },
|
|
50
|
+
"resolutionManifest": { "$ref": "#/$defs/artifact" },
|
|
51
|
+
"report": { "$ref": "#/$defs/artifact" },
|
|
52
|
+
"recordedAt": { "type": "string", "format": "date-time" }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"cases": {
|
|
57
|
+
"type": "array",
|
|
58
|
+
"minItems": 1,
|
|
59
|
+
"items": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"additionalProperties": false,
|
|
62
|
+
"required": [
|
|
63
|
+
"id", "order", "title", "sourceSha256", "risk", "dependsOn",
|
|
64
|
+
"status", "history"
|
|
65
|
+
],
|
|
66
|
+
"properties": {
|
|
67
|
+
"id": { "type": "string", "minLength": 1 },
|
|
68
|
+
"order": { "type": "integer", "minimum": 1 },
|
|
69
|
+
"title": { "type": "string", "minLength": 1 },
|
|
70
|
+
"sourceSha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
71
|
+
"risk": { "enum": ["readOnly", "stateChanging", "external"] },
|
|
72
|
+
"dependsOn": { "type": "array", "items": { "type": "string" } },
|
|
73
|
+
"plannedBaseFlow": { "type": "string", "minLength": 1 },
|
|
74
|
+
"status": {
|
|
75
|
+
"enum": [
|
|
76
|
+
"pending", "briefing", "briefReady", "generating",
|
|
77
|
+
"recoveryRequired", "verificationPending",
|
|
78
|
+
"verificationFailed", "blocked", "deferred", "verified", "archived"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"resumeStatus": {
|
|
82
|
+
"enum": [
|
|
83
|
+
"pending", "briefing", "briefReady", "generating",
|
|
84
|
+
"recoveryRequired", "verificationPending",
|
|
85
|
+
"verificationFailed", "blocked", "deferred", "verified", "archived"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
"brief": { "$ref": "#/$defs/artifact" },
|
|
89
|
+
"generation": {
|
|
90
|
+
"type": "object",
|
|
91
|
+
"additionalProperties": false,
|
|
92
|
+
"required": ["id"],
|
|
93
|
+
"properties": {
|
|
94
|
+
"id": { "type": "string", "minLength": 1 },
|
|
95
|
+
"baseFlow": { "type": "string", "minLength": 1 }
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"failure": {
|
|
99
|
+
"type": "object",
|
|
100
|
+
"additionalProperties": false,
|
|
101
|
+
"required": ["code", "message"],
|
|
102
|
+
"properties": {
|
|
103
|
+
"code": { "type": "string", "minLength": 1 },
|
|
104
|
+
"message": { "type": "string", "minLength": 1, "maxLength": 1000 }
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"nextAction": { "type": "string", "minLength": 1, "maxLength": 1000 },
|
|
108
|
+
"completion": {
|
|
109
|
+
"type": "object",
|
|
110
|
+
"additionalProperties": false,
|
|
111
|
+
"required": ["journey", "meta", "finalReport", "independentReport"],
|
|
112
|
+
"properties": {
|
|
113
|
+
"journey": { "$ref": "#/$defs/artifact" },
|
|
114
|
+
"meta": { "$ref": "#/$defs/artifact" },
|
|
115
|
+
"finalReport": { "$ref": "#/$defs/artifact" },
|
|
116
|
+
"independentReport": { "$ref": "#/$defs/artifact" }
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"history": {
|
|
120
|
+
"type": "array",
|
|
121
|
+
"items": {
|
|
122
|
+
"type": "object",
|
|
123
|
+
"additionalProperties": false,
|
|
124
|
+
"required": ["to", "at", "reason"],
|
|
125
|
+
"properties": {
|
|
126
|
+
"from": { "type": "string", "minLength": 1 },
|
|
127
|
+
"to": { "type": "string", "minLength": 1 },
|
|
128
|
+
"at": { "type": "string", "format": "date-time" },
|
|
129
|
+
"reason": { "type": "string", "minLength": 1, "maxLength": 500 }
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
"allOf": [{
|
|
135
|
+
"if": {
|
|
136
|
+
"properties": { "status": { "const": "deferred" } },
|
|
137
|
+
"required": ["status"]
|
|
138
|
+
},
|
|
139
|
+
"then": {
|
|
140
|
+
"required": ["resumeStatus", "failure", "nextAction"]
|
|
141
|
+
}
|
|
142
|
+
}]
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"updatedAt": { "type": "string", "format": "date-time" }
|
|
146
|
+
},
|
|
147
|
+
"$defs": {
|
|
148
|
+
"artifact": {
|
|
149
|
+
"type": "object",
|
|
150
|
+
"additionalProperties": false,
|
|
151
|
+
"required": ["path", "sha256"],
|
|
152
|
+
"properties": {
|
|
153
|
+
"path": { "type": "string", "minLength": 1 },
|
|
154
|
+
"sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://taphound.dev/schemas/case-suite-input-v1.json",
|
|
4
|
+
"title": "TapHound Case Suite Input",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["version", "suiteId", "title", "projectRoot", "cases"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"version": { "const": 1 },
|
|
10
|
+
"suiteId": { "type": "string", "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$" },
|
|
11
|
+
"title": { "type": "string", "minLength": 1, "maxLength": 200 },
|
|
12
|
+
"projectRoot": { "type": "string", "minLength": 1 },
|
|
13
|
+
"deviceSerial": { "type": "string", "minLength": 1 },
|
|
14
|
+
"contextPath": { "type": "string", "minLength": 1 },
|
|
15
|
+
"cases": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"minItems": 1,
|
|
18
|
+
"items": { "$ref": "#/$defs/case" }
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"$defs": {
|
|
22
|
+
"case": {
|
|
23
|
+
"type": "object",
|
|
24
|
+
"additionalProperties": false,
|
|
25
|
+
"required": ["id", "order", "title", "sourceText", "risk", "dependsOn"],
|
|
26
|
+
"properties": {
|
|
27
|
+
"id": { "type": "string", "pattern": "^[A-Z][A-Z0-9_-]{0,63}$" },
|
|
28
|
+
"order": { "type": "integer", "minimum": 1 },
|
|
29
|
+
"title": { "type": "string", "minLength": 1, "maxLength": 200 },
|
|
30
|
+
"sourceText": { "type": "string", "minLength": 1, "maxLength": 10000 },
|
|
31
|
+
"risk": { "enum": ["readOnly", "stateChanging", "external"] },
|
|
32
|
+
"dependsOn": {
|
|
33
|
+
"type": "array",
|
|
34
|
+
"uniqueItems": true,
|
|
35
|
+
"items": { "type": "string", "pattern": "^[A-Z][A-Z0-9_-]{0,63}$" }
|
|
36
|
+
},
|
|
37
|
+
"plannedBaseFlow": { "type": "string", "minLength": 1, "maxLength": 200 }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://taphound.dev/schemas/case-transition-v1.json",
|
|
4
|
+
"title": "TapHound Case Ledger Transition",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"version", "expectedRevision", "caseId", "from", "to", "reason"
|
|
9
|
+
],
|
|
10
|
+
"properties": {
|
|
11
|
+
"version": { "const": 1 },
|
|
12
|
+
"expectedRevision": { "type": "integer", "minimum": 0 },
|
|
13
|
+
"caseId": { "type": "string", "minLength": 1 },
|
|
14
|
+
"from": {
|
|
15
|
+
"enum": [
|
|
16
|
+
"pending", "briefing", "briefReady", "generating",
|
|
17
|
+
"recoveryRequired", "verificationPending", "verificationFailed",
|
|
18
|
+
"blocked", "deferred", "verified", "archived"
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
"to": {
|
|
22
|
+
"enum": [
|
|
23
|
+
"pending", "briefing", "briefReady", "generating",
|
|
24
|
+
"recoveryRequired", "verificationPending", "verificationFailed",
|
|
25
|
+
"blocked", "deferred", "verified", "archived"
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
"reason": { "type": "string", "minLength": 1, "maxLength": 500 },
|
|
29
|
+
"brief": { "$ref": "case-ledger-v1.json#/$defs/artifact" },
|
|
30
|
+
"generation": {
|
|
31
|
+
"type": "object",
|
|
32
|
+
"additionalProperties": false,
|
|
33
|
+
"required": ["id"],
|
|
34
|
+
"properties": {
|
|
35
|
+
"id": { "type": "string", "minLength": 1 },
|
|
36
|
+
"baseFlow": { "type": "string", "minLength": 1 }
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"failure": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"additionalProperties": false,
|
|
42
|
+
"required": ["code", "message"],
|
|
43
|
+
"properties": {
|
|
44
|
+
"code": { "type": "string", "minLength": 1 },
|
|
45
|
+
"message": { "type": "string", "minLength": 1, "maxLength": 1000 }
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"nextAction": { "type": "string", "minLength": 1, "maxLength": 1000 },
|
|
49
|
+
"completion": {
|
|
50
|
+
"type": "object",
|
|
51
|
+
"additionalProperties": false,
|
|
52
|
+
"required": ["journey", "meta", "finalReport", "independentReport"],
|
|
53
|
+
"properties": {
|
|
54
|
+
"journey": { "$ref": "case-ledger-v1.json#/$defs/artifact" },
|
|
55
|
+
"meta": { "$ref": "case-ledger-v1.json#/$defs/artifact" },
|
|
56
|
+
"finalReport": { "$ref": "case-ledger-v1.json#/$defs/artifact" },
|
|
57
|
+
"independentReport": { "$ref": "case-ledger-v1.json#/$defs/artifact" }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|