taphound 0.2.0-dev.1 → 0.2.0-dev.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -149
- package/README.zh-CN.md +47 -147
- package/assets/skills/taphound-case-suite/SKILL.md +363 -0
- package/assets/skills/taphound-case-suite/schemas/base-flow-record.schema.json +22 -0
- package/assets/skills/taphound-case-suite/schemas/case-catalog.schema.json +26 -0
- package/assets/skills/taphound-case-suite/schemas/case-ledger.schema.json +158 -0
- package/assets/skills/taphound-case-suite/schemas/suite-input.schema.json +41 -0
- package/assets/skills/taphound-case-suite/schemas/transition.schema.json +61 -0
- package/assets/skills/taphound-case-suite/scripts/ledger.mjs +1207 -0
- package/assets/skills/taphound-case-suite/templates/base-flow-record.example.json +20 -0
- package/assets/skills/taphound-case-suite/templates/suite-input.example.json +27 -0
- package/assets/skills/taphound-case-suite/templates/transition.example.json +8 -0
- package/assets/skills/taphound-flash/SKILL.md +115 -0
- package/assets/skills/taphound-flash/scripts/flash.mjs +585 -0
- package/assets/skills/taphound-flash/templates/flash-plan.example.json +15 -0
- package/assets/skills/taphound-journey-brief-author/CONTEXT-GUIDE.md +471 -0
- package/assets/skills/taphound-journey-brief-author/SKILL.md +494 -0
- package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.md +96 -0
- package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.zh-CN.md +80 -0
- package/assets/skills/taphound-journey-brief-author/prompts/context-analyze-project.md +309 -0
- package/assets/skills/taphound-journey-brief-author/schemas/context-refresh-result.json +123 -0
- package/assets/skills/taphound-journey-brief-author/schemas/project-context-module.json +192 -0
- package/assets/skills/taphound-journey-brief-author/schemas/project-context.json +152 -0
- package/assets/skills/taphound-journey-brief-author/templates/project-context-module.example.json +58 -0
- package/assets/skills/taphound-journey-brief-author/templates/project-context.example.json +51 -0
- package/assets/skills/taphound-journey-brief-author/templates/taphound-journey-brief.template.md +63 -0
- package/assets/skills/taphound-journey-generator/SKILL.md +500 -0
- package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/prompts/check-completion.md +3 -0
- package/assets/skills/taphound-journey-generator/prompts/consume-journey-brief.md +52 -0
- package/assets/skills/taphound-journey-generator/prompts/generate-step.md +211 -0
- package/assets/skills/taphound-journey-generator/prompts/select-flow.md +91 -0
- package/assets/skills/taphound-journey-generator/references/bridge.md +35 -0
- package/assets/skills/taphound-journey-generator/references/mid-session.md +44 -0
- package/assets/skills/taphound-journey-generator/schemas/external-flow.json +37 -0
- package/assets/skills/taphound-journey-generator/schemas/flow.json +28 -0
- package/assets/skills/taphound-journey-generator/schemas/journey-source.json +25 -0
- package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/observe-output.json +13 -4
- package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/proposed-step-envelope.json +127 -5
- package/assets/skills/taphound-journey-generator/scripts/envelope.mjs +561 -0
- package/assets/skills/taphound-journey-generator/templates/external-flow.example.json +22 -0
- package/assets/skills/taphound-journey-generator/templates/flow.example.json +22 -0
- package/assets/skills/taphound-journey-generator/templates/journey-source.example.json +17 -0
- package/assets/skills/taphound-journey-generator/templates/taphound-journey-brief.example.md +70 -0
- package/assets/skills/taphound-verify-change/SKILL.md +91 -0
- package/assets/skills/taphound-verify-change/references/accept.md +38 -0
- package/assets/skills/taphound-verify-change/references/preserve.md +349 -0
- package/assets/skills/taphound-verify-change/schemas/workflow-manifest.schema.json +295 -0
- package/assets/skills/taphound-verify-change/scripts/handoff.mjs +482 -0
- package/assets/skills/taphound-verify-change/scripts/ui-refactor.mjs +505 -0
- package/dist/adapters/adb/adb-adapter.d.ts +16 -2
- package/dist/adapters/adb/adb-adapter.js +199 -0
- package/dist/adapters/adb/system-uiautomator-snapshot-provider.d.ts +13 -0
- package/dist/adapters/adb/system-uiautomator-snapshot-provider.js +122 -0
- package/dist/adapters/adb/ui-automator-parser.d.ts +3 -0
- package/dist/adapters/adb/ui-automator-parser.js +160 -0
- package/dist/adapters/adb/window-topology-parser.d.ts +2 -0
- package/dist/adapters/adb/window-topology-parser.js +101 -0
- package/dist/adapters/android-cli/android-cli-adapter.d.ts +16 -8
- package/dist/adapters/android-cli/android-cli-adapter.js +137 -15
- package/dist/adapters/android-cli/android-cli-snapshot-provider.d.ts +9 -0
- package/dist/adapters/android-cli/android-cli-snapshot-provider.js +99 -0
- package/dist/adapters/android-cli/layout-parser.js +12 -8
- package/dist/adapters/appium/appium-doctor.d.ts +7 -0
- package/dist/adapters/appium/appium-doctor.js +128 -0
- package/dist/adapters/appium/appium-ui-snapshot-provider.d.ts +34 -0
- package/dist/adapters/appium/appium-ui-snapshot-provider.js +240 -0
- package/dist/adapters/camera/camera-probe-adapter.d.ts +18 -0
- package/dist/adapters/camera/camera-probe-adapter.js +286 -0
- package/dist/adapters/filesystem/artifact-store.js +40 -1
- package/dist/adapters/filesystem/context-document-writer.d.ts +15 -0
- package/dist/adapters/filesystem/context-document-writer.js +112 -0
- package/dist/adapters/filesystem/external-flow-registry.d.ts +17 -0
- package/dist/adapters/filesystem/external-flow-registry.js +325 -0
- package/dist/adapters/filesystem/generation-session-store.d.ts +17 -11
- package/dist/adapters/filesystem/generation-session-store.js +281 -855
- package/dist/adapters/filesystem/generation-store/session-lock.d.ts +29 -0
- package/dist/adapters/filesystem/generation-store/session-lock.js +202 -0
- package/dist/adapters/filesystem/generation-store/session-transitions.d.ts +24 -0
- package/dist/adapters/filesystem/generation-store/session-transitions.js +340 -0
- package/dist/adapters/filesystem/generation-store/store-files.d.ts +50 -0
- package/dist/adapters/filesystem/generation-store/store-files.js +363 -0
- package/dist/adapters/filesystem/journey-composition-store.d.ts +23 -0
- package/dist/adapters/filesystem/journey-composition-store.js +151 -0
- package/dist/adapters/filesystem/knowledge-registry.d.ts +12 -0
- package/dist/adapters/filesystem/knowledge-registry.js +223 -0
- package/dist/adapters/filesystem/project-bound-file.js +3 -5
- package/dist/adapters/filesystem/project-file-inspector.d.ts +2 -0
- package/dist/adapters/filesystem/project-file-inspector.js +57 -28
- package/dist/adapters/filesystem/project-identity-inspector.d.ts +7 -0
- package/dist/adapters/filesystem/project-identity-inspector.js +215 -0
- package/dist/adapters/filesystem/project-inventory-inspector.d.ts +8 -0
- package/dist/adapters/filesystem/project-inventory-inspector.js +93 -0
- package/dist/adapters/filesystem/project-module-discoverer.d.ts +6 -0
- package/dist/adapters/filesystem/project-module-discoverer.js +158 -0
- package/dist/adapters/filesystem/skill-installer.d.ts +7 -2
- package/dist/adapters/filesystem/skill-installer.js +40 -11
- package/dist/adapters/filesystem/workspace-layout.d.ts +7 -0
- package/dist/adapters/filesystem/workspace-layout.js +57 -0
- package/dist/adapters/git/node-git-diff.d.ts +17 -0
- package/dist/adapters/git/node-git-diff.js +114 -0
- package/dist/adapters/process/node-detached-process-launcher.d.ts +6 -0
- package/dist/adapters/process/node-detached-process-launcher.js +96 -0
- package/dist/adapters/process/node-process-runner.js +11 -2
- package/dist/adapters/prompt/inquirer-align-prompt.d.ts +27 -0
- package/dist/adapters/prompt/inquirer-align-prompt.js +65 -0
- package/dist/adapters/prompt/inquirer-generation-prompt.js +3 -0
- package/dist/adapters/prompt/inquirer-recorder-prompt.d.ts +9 -1
- package/dist/adapters/prompt/inquirer-recorder-prompt.js +63 -0
- package/dist/adapters/runtime/adb-runtime-backend.d.ts +67 -0
- package/dist/adapters/runtime/adb-runtime-backend.js +206 -0
- package/dist/adapters/runtime/fake-runtime-backend.d.ts +87 -0
- package/dist/adapters/runtime/fake-runtime-backend.js +240 -0
- package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.d.ts +45 -0
- package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.js +153 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.d.ts +23 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.js +39 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.d.ts +20 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.js +180 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.d.ts +78 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.js +379 -0
- package/dist/adapters/runtime/mobile-mcp/mobile-mcp-tools.d.ts +46 -0
- package/dist/adapters/runtime/session-adb-view.d.ts +53 -0
- package/dist/adapters/runtime/session-adb-view.js +193 -0
- package/dist/adapters/runtime/session-backed-ports.d.ts +21 -0
- package/dist/adapters/runtime/session-backed-ports.js +43 -0
- package/dist/adapters/runtime/shared-session-runtime-backend.d.ts +12 -0
- package/dist/adapters/runtime/shared-session-runtime-backend.js +64 -0
- package/dist/adapters/ui/auto-ui-snapshot-provider.d.ts +8 -0
- package/dist/adapters/ui/auto-ui-snapshot-provider.js +48 -0
- package/dist/adapters/ui/device-layout-temp.d.ts +6 -0
- package/dist/adapters/ui/device-layout-temp.js +18 -0
- package/dist/adapters/ui/device-ui-environment.d.ts +13 -0
- package/dist/adapters/ui/device-ui-environment.js +81 -0
- package/dist/adapters/ui/layout-normalization.d.ts +9 -0
- package/dist/adapters/ui/layout-normalization.js +44 -0
- package/dist/adapters/ui/ui-snapshot-error.d.ts +11 -0
- package/dist/adapters/ui/ui-snapshot-error.js +12 -0
- package/dist/adapters/ui/ui-snapshot-support.d.ts +15 -0
- package/dist/adapters/ui/ui-snapshot-support.js +12 -0
- package/dist/application/align/align-service.d.ts +42 -0
- package/dist/application/align/align-service.js +106 -0
- package/dist/application/assertion/expectation-evaluator.d.ts +18 -5
- package/dist/application/assertion/expectation-evaluator.js +156 -18
- package/dist/application/assertion/guarded-expectation.d.ts +45 -0
- package/dist/application/assertion/guarded-expectation.js +74 -0
- package/dist/application/checkpoint/baseline-capturer.d.ts +26 -0
- package/dist/application/checkpoint/baseline-capturer.js +163 -0
- package/dist/application/checkpoint/baseline-error.d.ts +5 -0
- package/dist/application/checkpoint/baseline-error.js +8 -0
- package/dist/application/checkpoint/baseline-service.d.ts +31 -0
- package/dist/application/checkpoint/baseline-service.js +147 -0
- package/dist/application/checkpoint/checkpoint-evaluator.d.ts +35 -0
- package/dist/application/checkpoint/checkpoint-evaluator.js +415 -0
- package/dist/application/checkpoint/regression-comparator.d.ts +18 -0
- package/dist/application/checkpoint/regression-comparator.js +192 -0
- package/dist/application/collector/logcat-collector.d.ts +22 -1
- package/dist/application/collector/logcat-collector.js +103 -15
- package/dist/application/collector/logcat-event.d.ts +8 -0
- package/dist/application/collector/logcat-event.js +79 -0
- package/dist/application/collector/logcat-stop.d.ts +2 -0
- package/dist/application/collector/logcat-stop.js +11 -0
- package/dist/application/context/context-generator.d.ts +45 -0
- package/dist/application/context/context-generator.js +228 -0
- package/dist/application/context/context-loader.d.ts +40 -0
- package/dist/application/context/context-loader.js +223 -0
- package/dist/application/context/context-refresher.d.ts +59 -0
- package/dist/application/context/context-refresher.js +349 -0
- package/dist/application/context/context-rehasher.d.ts +36 -0
- package/dist/application/context/context-rehasher.js +110 -0
- package/dist/application/context/context-validator.d.ts +23 -1
- package/dist/application/context/context-validator.js +116 -9
- package/dist/application/context/evidence-hash.d.ts +1 -0
- package/dist/application/context/evidence-hash.js +125 -0
- package/dist/application/context/evidence-match.d.ts +9 -0
- package/dist/application/context/evidence-match.js +8 -0
- package/dist/application/context/shard-identity.d.ts +2 -0
- package/dist/application/context/shard-identity.js +7 -0
- package/dist/application/contract/contract-loader.d.ts +25 -0
- package/dist/application/contract/contract-loader.js +68 -0
- package/dist/application/contract/contract-review.d.ts +25 -0
- package/dist/application/contract/contract-review.js +51 -0
- package/dist/application/contract/contract-verifier.d.ts +53 -0
- package/dist/application/contract/contract-verifier.js +645 -0
- package/dist/application/devices/resolve-device-assignments.d.ts +21 -0
- package/dist/application/devices/resolve-device-assignments.js +60 -0
- package/dist/application/diagnosis/failure-classifier.d.ts +23 -0
- package/dist/application/diagnosis/failure-classifier.js +179 -0
- package/dist/application/doctor/doctor-service.d.ts +36 -3
- package/dist/application/doctor/doctor-service.js +255 -25
- package/dist/application/generation/generation-app-preparer.d.ts +20 -0
- package/dist/application/generation/generation-app-preparer.js +28 -0
- package/dist/application/generation/generation-config-service.d.ts +21 -0
- package/dist/application/generation/generation-config-service.js +53 -0
- package/dist/application/generation/generation-confirmation-service.d.ts +14 -3
- package/dist/application/generation/generation-confirmation-service.js +109 -24
- package/dist/application/generation/generation-context-snapshot.d.ts +6 -0
- package/dist/application/generation/generation-context-snapshot.js +29 -0
- package/dist/application/generation/generation-finalizer.d.ts +15 -9
- package/dist/application/generation/generation-finalizer.js +167 -70
- package/dist/application/generation/generation-publisher.js +12 -8
- package/dist/application/generation/generation-recovery-service.d.ts +35 -0
- package/dist/application/generation/generation-recovery-service.js +144 -0
- package/dist/application/generation/generation-reopen-service.d.ts +15 -0
- package/dist/application/generation/generation-reopen-service.js +37 -0
- package/dist/application/generation/generation-replace-service.d.ts +32 -0
- package/dist/application/generation/generation-replace-service.js +116 -0
- package/dist/application/generation/generation-starter.d.ts +44 -4
- package/dist/application/generation/generation-starter.js +175 -8
- package/dist/application/generation/generation-step-executor.d.ts +67 -5
- package/dist/application/generation/generation-step-executor.js +471 -108
- package/dist/application/generation/proposed-step-validator.js +96 -30
- package/dist/application/generation/replay-policy-loader.d.ts +16 -0
- package/dist/application/generation/replay-policy-loader.js +29 -0
- package/dist/application/generation/risk-evaluator.d.ts +4 -1
- package/dist/application/generation/risk-evaluator.js +118 -3
- package/dist/application/generation/runtime-observer.d.ts +39 -7
- package/dist/application/generation/runtime-observer.js +193 -24
- package/dist/application/impact/impact-resolver.d.ts +32 -0
- package/dist/application/impact/impact-resolver.js +160 -0
- package/dist/application/init/init-service.js +26 -13
- package/dist/application/interaction/action-executor.d.ts +3 -2
- package/dist/application/interaction/action-executor.js +11 -1
- package/dist/application/interaction/action-target.d.ts +17 -0
- package/dist/application/interaction/action-target.js +40 -0
- package/dist/application/interaction/external-step-runner.d.ts +153 -0
- package/dist/application/interaction/external-step-runner.js +332 -0
- package/dist/application/interaction/fallback-resolver.d.ts +6 -3
- package/dist/application/interaction/fallback-resolver.js +7 -5
- package/dist/application/interaction/scroll-to-executor.d.ts +17 -3
- package/dist/application/interaction/scroll-to-executor.js +118 -36
- package/dist/application/journey/external-flow-resolver.d.ts +25 -0
- package/dist/application/journey/external-flow-resolver.js +22 -0
- package/dist/application/journey/journey-check-service.d.ts +54 -0
- package/dist/application/journey/journey-check-service.js +207 -0
- package/dist/application/journey/journey-promoter.d.ts +26 -0
- package/dist/application/journey/journey-promoter.js +123 -0
- package/dist/application/journey/journey-resolver.d.ts +42 -0
- package/dist/application/journey/journey-resolver.js +239 -0
- package/dist/application/journey/journey-retirer.d.ts +25 -0
- package/dist/application/journey/journey-retirer.js +87 -0
- package/dist/application/knowledge/anchor-resolver.d.ts +36 -0
- package/dist/application/knowledge/anchor-resolver.js +110 -0
- package/dist/application/knowledge/knowledge-loader.d.ts +16 -0
- package/dist/application/knowledge/knowledge-loader.js +36 -0
- package/dist/application/locator/layout-failure-summary.d.ts +2 -0
- package/dist/application/locator/layout-failure-summary.js +67 -0
- package/dist/application/locator/layout-traversal.d.ts +11 -0
- package/dist/application/locator/layout-traversal.js +18 -0
- package/dist/application/locator/locator-resolver.d.ts +13 -1
- package/dist/application/locator/locator-resolver.js +182 -18
- package/dist/application/observe/observe-service.d.ts +20 -0
- package/dist/application/observe/observe-service.js +91 -0
- package/dist/application/project/project-describer.d.ts +14 -6
- package/dist/application/project/project-describer.js +38 -5
- package/dist/application/recognition/screen-detector.d.ts +28 -0
- package/dist/application/recognition/screen-detector.js +111 -0
- package/dist/application/recorder/locator-selector.js +151 -17
- package/dist/application/recorder/recorder-service.d.ts +16 -4
- package/dist/application/recorder/recorder-service.js +420 -128
- package/dist/application/report/report-writer.js +1 -1
- package/dist/application/runtime/cold-launch.d.ts +28 -0
- package/dist/application/runtime/cold-launch.js +59 -0
- package/dist/application/runtime/step-runner.d.ts +49 -4
- package/dist/application/runtime/step-runner.js +721 -130
- package/dist/application/runtime/verify-runtime.d.ts +57 -7
- package/dist/application/runtime/verify-runtime.js +554 -174
- package/dist/application/ui/cached-ui-snapshot-provider.d.ts +45 -0
- package/dist/application/ui/cached-ui-snapshot-provider.js +111 -0
- package/dist/application/ui/ui-snapshot-lifecycle.d.ts +2 -0
- package/dist/application/ui/ui-snapshot-lifecycle.js +8 -0
- package/dist/application/ui/ui-stability-probe.d.ts +3 -0
- package/dist/application/ui/ui-stability-probe.js +8 -0
- package/dist/application/wait/idle-advice.d.ts +6 -0
- package/dist/application/wait/idle-advice.js +27 -0
- package/dist/application/wait/idle-profiles.d.ts +15 -0
- package/dist/application/wait/idle-profiles.js +75 -0
- package/dist/application/wait/idle-waiter.d.ts +28 -4
- package/dist/application/wait/idle-waiter.js +186 -15
- package/dist/cli/commands/align.d.ts +3 -0
- package/dist/cli/commands/align.js +124 -0
- package/dist/cli/commands/baseline.d.ts +3 -0
- package/dist/cli/commands/baseline.js +130 -0
- package/dist/cli/commands/context.js +300 -27
- package/dist/cli/commands/contract.d.ts +3 -0
- package/dist/cli/commands/contract.js +120 -0
- package/dist/cli/commands/doctor.js +16 -9
- package/dist/cli/commands/failure.d.ts +3 -0
- package/dist/cli/commands/failure.js +63 -0
- package/dist/cli/commands/generation/lifecycle-commands.d.ts +5 -0
- package/dist/cli/commands/generation/lifecycle-commands.js +211 -0
- package/dist/cli/commands/generation/session-commands.d.ts +11 -0
- package/dist/cli/commands/generation/session-commands.js +472 -0
- package/dist/cli/commands/generation/shared.d.ts +1414 -0
- package/dist/cli/commands/generation/shared.js +291 -0
- package/dist/cli/commands/generation/step-commands.d.ts +8 -0
- package/dist/cli/commands/generation/step-commands.js +315 -0
- package/dist/cli/commands/generation.js +10 -507
- package/dist/cli/commands/impact.d.ts +3 -0
- package/dist/cli/commands/impact.js +87 -0
- package/dist/cli/commands/init.js +13 -6
- package/dist/cli/commands/journey.d.ts +3 -0
- package/dist/cli/commands/journey.js +382 -0
- package/dist/cli/commands/knowledge.d.ts +3 -0
- package/dist/cli/commands/knowledge.js +93 -0
- package/dist/cli/commands/observe.d.ts +3 -0
- package/dist/cli/commands/observe.js +127 -0
- package/dist/cli/commands/project.js +2 -1
- package/dist/cli/commands/record.js +18 -5
- package/dist/cli/commands/verify.js +273 -63
- package/dist/cli/dependencies.d.ts +125 -1
- package/dist/cli/dependencies.js +450 -51
- package/dist/cli/diff-verification.d.ts +41 -0
- package/dist/cli/diff-verification.js +192 -0
- package/dist/cli/main.js +49 -1
- package/dist/cli/output.d.ts +5 -3
- package/dist/cli/output.js +12 -0
- package/dist/cli/program.js +19 -1
- package/dist/cli/project-root.d.ts +1 -0
- package/dist/cli/project-root.js +6 -0
- package/dist/cli/runtime-selection.d.ts +22 -0
- package/dist/cli/runtime-selection.js +92 -0
- package/dist/cli/version.d.ts +1 -0
- package/dist/cli/version.js +14 -0
- package/dist/cli/workspace-guard.d.ts +2 -0
- package/dist/cli/workspace-guard.js +3 -0
- package/dist/domain/binding-reference.d.ts +4 -0
- package/dist/domain/binding-reference.js +23 -0
- package/dist/domain/checkpoint.d.ts +404 -0
- package/dist/domain/checkpoint.js +297 -0
- package/dist/domain/config.d.ts +107 -1
- package/dist/domain/config.js +52 -6
- package/dist/domain/contract.d.ts +413 -0
- package/dist/domain/contract.js +196 -0
- package/dist/domain/external-flow.d.ts +493 -0
- package/dist/domain/external-flow.js +15 -0
- package/dist/domain/failure-classification.d.ts +176 -0
- package/dist/domain/failure-classification.js +169 -0
- package/dist/domain/failure.d.ts +2 -1
- package/dist/domain/failure.js +123 -0
- package/dist/domain/generation.d.ts +1671 -132
- package/dist/domain/generation.js +202 -13
- package/dist/domain/geometry.d.ts +13 -0
- package/dist/domain/geometry.js +16 -0
- package/dist/domain/impact.d.ts +71 -0
- package/dist/domain/impact.js +76 -0
- package/dist/domain/init.d.ts +12 -4
- package/dist/domain/init.js +24 -18
- package/dist/domain/journey-composition.d.ts +2285 -0
- package/dist/domain/journey-composition.js +85 -0
- package/dist/domain/journey-lifecycle.d.ts +10 -0
- package/dist/domain/journey-lifecycle.js +9 -0
- package/dist/domain/journey.d.ts +2419 -212
- package/dist/domain/journey.js +384 -14
- package/dist/domain/knowledge.d.ts +165 -0
- package/dist/domain/knowledge.js +188 -0
- package/dist/domain/layout.d.ts +34 -5
- package/dist/domain/layout.js +64 -6
- package/dist/domain/locator-evidence.d.ts +3 -0
- package/dist/domain/locator-evidence.js +36 -0
- package/dist/domain/logcat-event.d.ts +54 -0
- package/dist/domain/logcat-event.js +40 -0
- package/dist/domain/observation.d.ts +33 -0
- package/dist/domain/observation.js +18 -0
- package/dist/domain/project-context.d.ts +219 -1
- package/dist/domain/project-context.js +209 -6
- package/dist/domain/proposed-step.d.ts +340 -60
- package/dist/domain/proposed-step.js +23 -3
- package/dist/domain/report.d.ts +1455 -28
- package/dist/domain/report.js +211 -14
- package/dist/domain/runtime-snapshot.d.ts +58 -1
- package/dist/domain/runtime-snapshot.js +14 -3
- package/dist/domain/runtime.d.ts +50 -0
- package/dist/domain/runtime.js +36 -0
- package/dist/domain/system-app-profiles.d.ts +6 -0
- package/dist/domain/system-app-profiles.js +43 -0
- package/dist/domain/ui-backend.d.ts +28 -0
- package/dist/domain/ui-backend.js +33 -0
- package/dist/domain/ui-cache.d.ts +11 -0
- package/dist/domain/ui-cache.js +10 -0
- package/dist/domain/window-hierarchy.d.ts +84 -0
- package/dist/domain/window-hierarchy.js +172 -0
- package/dist/domain/workflow-manifest.d.ts +77 -0
- package/dist/domain/workflow-manifest.js +136 -0
- package/dist/domain/workspace.d.ts +28 -0
- package/dist/domain/workspace.js +72 -0
- package/dist/ports/adb.d.ts +34 -1
- package/dist/ports/align-prompt.d.ts +11 -0
- package/dist/ports/align-prompt.js +6 -0
- package/dist/ports/anchor-resolver.d.ts +30 -0
- package/dist/ports/anchor-resolver.js +1 -0
- package/dist/ports/annotated-screen-resolver.d.ts +4 -0
- package/dist/ports/annotated-screen-resolver.js +1 -0
- package/dist/ports/camera-probe.d.ts +23 -0
- package/dist/ports/camera-probe.js +8 -0
- package/dist/ports/context-document-writer.d.ts +24 -0
- package/dist/ports/context-document-writer.js +1 -0
- package/dist/ports/detached-process-launcher.d.ts +12 -0
- package/dist/ports/detached-process-launcher.js +1 -0
- package/dist/ports/external-flow-registry.d.ts +37 -0
- package/dist/ports/external-flow-registry.js +1 -0
- package/dist/ports/generation-prompt.d.ts +2 -1
- package/dist/ports/generation-session-store.d.ts +12 -2
- package/dist/ports/git-diff.d.ts +9 -0
- package/dist/ports/git-diff.js +1 -0
- package/dist/ports/journey-composition-store.d.ts +17 -0
- package/dist/ports/journey-composition-store.js +1 -0
- package/dist/ports/knowledge-registry.d.ts +20 -0
- package/dist/ports/knowledge-registry.js +1 -0
- package/dist/ports/process-runner.d.ts +7 -0
- package/dist/ports/project-file-inspector.d.ts +1 -0
- package/dist/ports/project-identity-inspector.d.ts +24 -0
- package/dist/ports/project-identity-inspector.js +1 -0
- package/dist/ports/project-inventory-inspector.d.ts +21 -0
- package/dist/ports/project-inventory-inspector.js +1 -0
- package/dist/ports/project-module-discoverer.d.ts +26 -0
- package/dist/ports/project-module-discoverer.js +1 -0
- package/dist/ports/recorder-prompt.d.ts +10 -1
- package/dist/ports/runtime-backend.d.ts +89 -0
- package/dist/ports/runtime-backend.js +13 -0
- package/dist/ports/runtime-capability.d.ts +12 -0
- package/dist/ports/runtime-capability.js +20 -0
- package/dist/ports/runtime-session-ports.d.ts +25 -0
- package/dist/ports/runtime-session-ports.js +1 -0
- package/dist/ports/screenshot.d.ts +11 -0
- package/dist/ports/screenshot.js +1 -0
- package/dist/ports/skill-installer.d.ts +2 -2
- package/dist/ports/ui-snapshot.d.ts +35 -0
- package/dist/ports/ui-snapshot.js +1 -0
- package/dist/ports/ui-stability.d.ts +19 -0
- package/dist/ports/ui-stability.js +1 -0
- package/dist/ports/workspace-layout.d.ts +4 -0
- package/dist/ports/workspace-layout.js +1 -0
- package/dist/shared/errors.d.ts +2 -0
- package/dist/shared/errors.js +22 -0
- package/dist/shared/paths.d.ts +2 -0
- package/dist/shared/paths.js +24 -0
- package/dist/shared/strings.d.ts +2 -0
- package/dist/shared/strings.js +16 -0
- package/package.json +6 -1
- package/assets/skills/taphound-ai-journey/GUIDE.md +0 -862
- package/assets/skills/taphound-ai-journey/SKILL.md +0 -377
- package/assets/skills/taphound-ai-journey/prompts/analyze-project.md +0 -526
- package/assets/skills/taphound-ai-journey/prompts/generate-step.md +0 -109
- package/assets/skills/taphound-ai-journey/schemas/project-context.json +0 -81
- package/assets/skills/taphound-ai-journey/templates/project-context.example.json +0 -49
- package/dist/ports/android-cli.d.ts +0 -21
- /package/dist/{ports/android-cli.js → adapters/runtime/mobile-mcp/mobile-mcp-tools.js} +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { exitCodeForFailure, failureCodeFromUnknown } from "../../domain/failure.js";
|
|
4
|
+
import { ContractReviewInputSchema, ContractVerdictViewSchema } from "../../domain/contract.js";
|
|
5
|
+
import { failureOutput, writeJson, writeLine } from "../output.js";
|
|
6
|
+
import { prepareWorkspace } from "../workspace-guard.js";
|
|
7
|
+
function writeFailure(dependencies, json, code, message) {
|
|
8
|
+
const exitCode = exitCodeForFailure(code);
|
|
9
|
+
const output = failureOutput(exitCode, code, message);
|
|
10
|
+
if (json) {
|
|
11
|
+
writeJson(dependencies.stdout, output);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
writeLine(dependencies.stderr, output.failure.message);
|
|
15
|
+
}
|
|
16
|
+
dependencies.setExitCode(exitCode);
|
|
17
|
+
}
|
|
18
|
+
export function createContractCommand(dependencies) {
|
|
19
|
+
const command = new Command("contract")
|
|
20
|
+
.description("Validate an Acceptance Contract without touching a device")
|
|
21
|
+
.option("--project <path>", "Android project root", dependencies.cwd())
|
|
22
|
+
.option("--contract <path>", "Acceptance Contract path")
|
|
23
|
+
.option("--json", "Emit one machine-readable JSON value")
|
|
24
|
+
.action(async (options) => {
|
|
25
|
+
const json = options.json === true;
|
|
26
|
+
if (options.contract === undefined) {
|
|
27
|
+
writeFailure(dependencies, json, "CONTRACT_INVALID", "Missing required option '--contract'");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (dependencies.contractLoader === undefined) {
|
|
31
|
+
writeFailure(dependencies, json, "CONFIG_INVALID", "TapHound contract validation is not configured");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const contractPath = resolve(options.project, options.contract);
|
|
35
|
+
try {
|
|
36
|
+
await prepareWorkspace(dependencies, options.project);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
writeFailure(dependencies, json, failureCodeFromUnknown(error) ?? "CONFIG_INVALID", error instanceof Error ? error.message : String(error));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const loaded = await dependencies.contractLoader.load({
|
|
44
|
+
projectRoot: options.project,
|
|
45
|
+
contractPath
|
|
46
|
+
});
|
|
47
|
+
if (json) {
|
|
48
|
+
writeJson(dependencies.stdout, {
|
|
49
|
+
status: "valid",
|
|
50
|
+
contractId: loaded.contract.id,
|
|
51
|
+
contractSha256: loaded.contractSha256,
|
|
52
|
+
journeySha256: loaded.contract.journey.sha256,
|
|
53
|
+
journeyPath: loaded.journeyPath
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
writeLine(dependencies.stdout, `TapHound contract: ${loaded.contract.id} is valid (${loaded.contractSha256.slice(0, 12)}...)`);
|
|
58
|
+
}
|
|
59
|
+
dependencies.setExitCode(0);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
writeFailure(dependencies, json, failureCodeFromUnknown(error) ?? "CONTRACT_INVALID", error instanceof Error ? error.message : String(error));
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
command.addCommand(createContractReviewCommand(dependencies));
|
|
66
|
+
return command;
|
|
67
|
+
}
|
|
68
|
+
function createContractReviewCommand(dependencies) {
|
|
69
|
+
const command = new Command("review")
|
|
70
|
+
.description("Merge reviewer findings into a Verdict (never overwrites fail/invalid)")
|
|
71
|
+
.requiredOption("--verdict <path>", "Verdict JSON path (verdict.json)")
|
|
72
|
+
.requiredOption("--findings <path>", "Reviewer findings JSON path")
|
|
73
|
+
.option("--json", "Emit one machine-readable JSON value")
|
|
74
|
+
.action(async (options) => {
|
|
75
|
+
// `--project` and `--json` are also declared on the parent command;
|
|
76
|
+
// commander routes them to the parent when both are declared, so fall
|
|
77
|
+
// back to the parent's values.
|
|
78
|
+
const parentOpts = command.parent?.opts() ?? {};
|
|
79
|
+
const project = parentOpts.project
|
|
80
|
+
?? dependencies.cwd();
|
|
81
|
+
const json = options.json === true
|
|
82
|
+
|| parentOpts.json === true;
|
|
83
|
+
if (dependencies.contractReview === undefined) {
|
|
84
|
+
writeFailure(dependencies, json, "CONFIG_INVALID", "TapHound contract review is not configured");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const verdictPath = resolve(project, options.verdict);
|
|
88
|
+
const findingsPath = resolve(project, options.findings);
|
|
89
|
+
try {
|
|
90
|
+
await prepareWorkspace(dependencies, project);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
writeFailure(dependencies, json, failureCodeFromUnknown(error) ?? "CONFIG_INVALID", error instanceof Error ? error.message : String(error));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const verdict = ContractVerdictViewSchema.parse(await dependencies.readJson(verdictPath));
|
|
98
|
+
const review = ContractReviewInputSchema.parse(await dependencies.readJson(findingsPath));
|
|
99
|
+
const merged = await dependencies.contractReview.merge({
|
|
100
|
+
view: verdict,
|
|
101
|
+
review
|
|
102
|
+
});
|
|
103
|
+
await dependencies.contractReview.writeVerdict({
|
|
104
|
+
verdictPath,
|
|
105
|
+
view: merged.view
|
|
106
|
+
});
|
|
107
|
+
if (json) {
|
|
108
|
+
writeJson(dependencies.stdout, merged.view);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
writeLine(dependencies.stdout, `TapHound contract review: ${merged.view.verdict.toUpperCase()} (findings applied: ${String(merged.applied)})`);
|
|
112
|
+
}
|
|
113
|
+
dependencies.setExitCode(merged.view.verdict === "pass" ? 0 : 1);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
writeFailure(dependencies, json, failureCodeFromUnknown(error) ?? "CONTRACT_INVALID", error instanceof Error ? error.message : String(error));
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return command;
|
|
120
|
+
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { resolve } from "node:path";
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { TapHoundConfigSchema } from "../../domain/config.js";
|
|
4
|
+
import { CONFIG_PATH } from "../../domain/workspace.js";
|
|
5
|
+
import { exitCodeForFailure, failureCodeFromUnknown } from "../../domain/failure.js";
|
|
4
6
|
import { doctorMessage, errorMessage, failureOutput, writeJson, writeLine } from "../output.js";
|
|
5
|
-
async function
|
|
7
|
+
async function configuredConfig(dependencies, options) {
|
|
6
8
|
try {
|
|
7
|
-
return TapHoundConfigSchema.parse(await dependencies.readJson(resolve(options.project, options.config)))
|
|
9
|
+
return TapHoundConfigSchema.parse(await dependencies.readJson(resolve(options.project, options.config)));
|
|
8
10
|
}
|
|
9
11
|
catch {
|
|
10
12
|
return undefined;
|
|
@@ -14,14 +16,18 @@ export function createDoctorCommand(dependencies) {
|
|
|
14
16
|
return new Command("doctor")
|
|
15
17
|
.description("Check TapHound tools, permissions, application, and device")
|
|
16
18
|
.option("--project <path>", "Android project root", dependencies.cwd())
|
|
17
|
-
.option("--config <path>", "TapHound config path",
|
|
19
|
+
.option("--config <path>", "TapHound config path", CONFIG_PATH)
|
|
18
20
|
.option("--device <serial>", "Select an online Android device")
|
|
19
21
|
.option("--json", "Emit machine-readable JSON")
|
|
20
22
|
.action(async (options) => {
|
|
23
|
+
const json = options.json === true;
|
|
21
24
|
try {
|
|
22
|
-
const
|
|
25
|
+
const config = await configuredConfig(dependencies, options);
|
|
23
26
|
const report = await dependencies.doctor.run({
|
|
24
|
-
...(
|
|
27
|
+
...(config === undefined ? {} : { packageName: config.run.packageName }),
|
|
28
|
+
...(config?.ui?.backend === undefined
|
|
29
|
+
? {}
|
|
30
|
+
: { requestedUiBackend: config.ui.backend }),
|
|
25
31
|
...(options.device === undefined
|
|
26
32
|
? {}
|
|
27
33
|
: { requestedDevice: options.device }),
|
|
@@ -29,7 +35,7 @@ export function createDoctorCommand(dependencies) {
|
|
|
29
35
|
? {}
|
|
30
36
|
: { signal: dependencies.signal })
|
|
31
37
|
});
|
|
32
|
-
if (
|
|
38
|
+
if (json) {
|
|
33
39
|
writeJson(dependencies.stdout, report);
|
|
34
40
|
}
|
|
35
41
|
else {
|
|
@@ -38,14 +44,15 @@ export function createDoctorCommand(dependencies) {
|
|
|
38
44
|
dependencies.setExitCode(report.status === "passed" ? 0 : 3);
|
|
39
45
|
}
|
|
40
46
|
catch (error) {
|
|
41
|
-
const
|
|
42
|
-
|
|
47
|
+
const code = failureCodeFromUnknown(error) ?? "INTERNAL_ERROR";
|
|
48
|
+
const output = failureOutput(exitCodeForFailure(code), code, errorMessage(error));
|
|
49
|
+
if (json) {
|
|
43
50
|
writeJson(dependencies.stdout, output);
|
|
44
51
|
}
|
|
45
52
|
else {
|
|
46
53
|
writeLine(dependencies.stderr, output.failure.message);
|
|
47
54
|
}
|
|
48
|
-
dependencies.setExitCode(
|
|
55
|
+
dependencies.setExitCode(exitCodeForFailure(code));
|
|
49
56
|
}
|
|
50
57
|
});
|
|
51
58
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { exitCodeForFailure, failureCodeFromUnknown } from "../../domain/failure.js";
|
|
4
|
+
import { failureOutput, writeJson, writeLine } from "../output.js";
|
|
5
|
+
import { prepareWorkspace } from "../workspace-guard.js";
|
|
6
|
+
function writeFailure(dependencies, json, code, message) {
|
|
7
|
+
const exitCode = exitCodeForFailure(code);
|
|
8
|
+
const output = failureOutput(exitCode, code, message);
|
|
9
|
+
if (json) {
|
|
10
|
+
writeJson(dependencies.stdout, output);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
writeLine(dependencies.stderr, output.failure.message);
|
|
14
|
+
}
|
|
15
|
+
dependencies.setExitCode(exitCode);
|
|
16
|
+
}
|
|
17
|
+
export function createFailureCommand(dependencies) {
|
|
18
|
+
const command = new Command("failure")
|
|
19
|
+
.description("Classify Verification failures into structured reports")
|
|
20
|
+
.addCommand(createClassifyCommand(dependencies));
|
|
21
|
+
return command;
|
|
22
|
+
}
|
|
23
|
+
function createClassifyCommand(dependencies) {
|
|
24
|
+
return new Command("classify")
|
|
25
|
+
.description("Classify a failed Verification report (offline, deterministic)")
|
|
26
|
+
.option("--project <path>", "Android project root", dependencies.cwd())
|
|
27
|
+
.requiredOption("--report <path>", "Verification report.json path")
|
|
28
|
+
.option("--json", "Emit one machine-readable JSON value")
|
|
29
|
+
.action(async (options) => {
|
|
30
|
+
const json = options.json === true;
|
|
31
|
+
if (dependencies.failureClassifier === undefined) {
|
|
32
|
+
writeFailure(dependencies, json, "CONFIG_INVALID", "TapHound failure classification is not configured");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
await prepareWorkspace(dependencies, options.project);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
writeFailure(dependencies, json, failureCodeFromUnknown(error) ?? "CONFIG_INVALID", error instanceof Error ? error.message : String(error));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const classification = await dependencies.failureClassifier.classify(resolve(options.project, options.report));
|
|
44
|
+
if (json) {
|
|
45
|
+
writeJson(dependencies.stdout, classification);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
writeLine(dependencies.stdout, `Failure classification: ${classification.type} (${classification.stage}) [${classification.code}]`);
|
|
49
|
+
if (classification.expected !== undefined) {
|
|
50
|
+
writeLine(dependencies.stdout, ` expected: ${classification.expected}`);
|
|
51
|
+
}
|
|
52
|
+
if (classification.actual !== undefined) {
|
|
53
|
+
writeLine(dependencies.stdout, ` actual: ${classification.actual}`);
|
|
54
|
+
}
|
|
55
|
+
writeLine(dependencies.stdout, ` evidence: ${classification.evidenceRefs.join(", ") || "(none)"}`);
|
|
56
|
+
}
|
|
57
|
+
dependencies.setExitCode(0);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
writeFailure(dependencies, json, failureCodeFromUnknown(error) ?? "CONFIG_INVALID", error instanceof Error ? error.message : String(error));
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import type { CliDependencies } from "../../dependencies.js";
|
|
3
|
+
export declare function createFinalizeCommand(dependencies: CliDependencies): Command;
|
|
4
|
+
export declare function createRecoverCommand(dependencies: CliDependencies): Command;
|
|
5
|
+
export declare function createReopenCommand(dependencies: CliDependencies): Command;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// `generation` subcommands that verify and recover a session: finalize, recover, and reopen.
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { GenerationOutputPathSchema } from "../../../application/generation/generation-finalizer.js";
|
|
6
|
+
import { GenerationOperationError } from "../../../application/generation/generation-starter.js";
|
|
7
|
+
import { GenerationSessionIdSchema } from "../../../domain/generation.js";
|
|
8
|
+
import { JOBS_DIR } from "../../../domain/workspace.js";
|
|
9
|
+
import { writeLine } from "../../output.js";
|
|
10
|
+
import { addCommonOptions, assertRuntimeConfig, generationConfig, mappedFailure, requireRuntime, tools, writeFailure, writeSuccess } from "./shared.js";
|
|
11
|
+
export function createFinalizeCommand(dependencies) {
|
|
12
|
+
return addCommonOptions(new Command("finalize")
|
|
13
|
+
.description("Verify and publish a generated Journey")
|
|
14
|
+
.requiredOption("--output <path>", "Journey output under .taphound/journeys")
|
|
15
|
+
.option("--name <name>", "Generated Journey name")
|
|
16
|
+
.option("--device <serial>", "Select an online Android device")
|
|
17
|
+
.option("--detach", "Run verification in a detached process and return immediately"), dependencies).action(async (options) => {
|
|
18
|
+
try {
|
|
19
|
+
const generationId = GenerationSessionIdSchema.parse(options.session);
|
|
20
|
+
const { projectRoot, config } = await generationConfig(dependencies, options);
|
|
21
|
+
const outputPath = GenerationOutputPathSchema.parse(options.output);
|
|
22
|
+
const name = options.name === undefined
|
|
23
|
+
? undefined
|
|
24
|
+
: z.string().trim().min(1).parse(options.name);
|
|
25
|
+
const runtime = requireRuntime(dependencies, projectRoot, config);
|
|
26
|
+
await assertRuntimeConfig(runtime, generationId);
|
|
27
|
+
const context = await runtime.readContextSnapshot(generationId);
|
|
28
|
+
if (options.detach === true) {
|
|
29
|
+
if (dependencies.detachedProcess === undefined
|
|
30
|
+
|| dependencies.cliEntryPath === undefined
|
|
31
|
+
|| dependencies.createDetachedJobId === undefined) {
|
|
32
|
+
throw new Error("Detached finalization is unavailable");
|
|
33
|
+
}
|
|
34
|
+
const jobId = dependencies.createDetachedJobId();
|
|
35
|
+
const jobHome = projectRoot;
|
|
36
|
+
const outputJobPath = `${JOBS_DIR}/${generationId}/${jobId}-output.json`;
|
|
37
|
+
const progressJobPath = `${JOBS_DIR}/${generationId}/${jobId}-progress.log`;
|
|
38
|
+
const args = [
|
|
39
|
+
dependencies.cliEntryPath,
|
|
40
|
+
"generation",
|
|
41
|
+
"finalize",
|
|
42
|
+
"--project",
|
|
43
|
+
projectRoot,
|
|
44
|
+
"--config",
|
|
45
|
+
options.config,
|
|
46
|
+
"--session",
|
|
47
|
+
generationId,
|
|
48
|
+
"--output",
|
|
49
|
+
options.output,
|
|
50
|
+
...(options.name === undefined ? [] : ["--name", options.name]),
|
|
51
|
+
...(options.device === undefined
|
|
52
|
+
? []
|
|
53
|
+
: ["--device", options.device]),
|
|
54
|
+
"--json"
|
|
55
|
+
];
|
|
56
|
+
const launched = await dependencies.detachedProcess.launch({
|
|
57
|
+
executable: process.execPath,
|
|
58
|
+
args,
|
|
59
|
+
cwd: jobHome,
|
|
60
|
+
stdoutPath: resolve(jobHome, outputJobPath),
|
|
61
|
+
stderrPath: resolve(jobHome, progressJobPath)
|
|
62
|
+
});
|
|
63
|
+
writeSuccess(dependencies, options, {
|
|
64
|
+
status: "finalizationStarted",
|
|
65
|
+
exitCode: 0,
|
|
66
|
+
generationId,
|
|
67
|
+
jobId,
|
|
68
|
+
ownerPid: launched.pid,
|
|
69
|
+
outputPath: outputJobPath,
|
|
70
|
+
progressPath: progressJobPath
|
|
71
|
+
}, `Generation finalization started: ${generationId}`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const verdict = await dependencies.contextValidator.validate({
|
|
75
|
+
context,
|
|
76
|
+
projectRoot,
|
|
77
|
+
config
|
|
78
|
+
});
|
|
79
|
+
if (verdict.status !== "valid") {
|
|
80
|
+
writeLine(dependencies.stderr, `TapHound warning: live project context drifted from the session snapshot (${verdict.reason.code}: ${verdict.reason.message}); the session snapshot remains authoritative`);
|
|
81
|
+
}
|
|
82
|
+
const doctor = await dependencies.doctor.run({
|
|
83
|
+
packageName: config.run.packageName,
|
|
84
|
+
skipPermissionProbe: true,
|
|
85
|
+
...(config.ui?.backend === undefined
|
|
86
|
+
? {}
|
|
87
|
+
: { requestedUiBackend: config.ui.backend }),
|
|
88
|
+
...(options.device === undefined
|
|
89
|
+
? {}
|
|
90
|
+
: { requestedDevice: options.device }),
|
|
91
|
+
...(dependencies.signal === undefined
|
|
92
|
+
? {}
|
|
93
|
+
: { signal: dependencies.signal })
|
|
94
|
+
});
|
|
95
|
+
if (doctor.status === "failed") {
|
|
96
|
+
writeFailure(dependencies, options, 3, doctor.failureCode ?? "ENVIRONMENT_MISSING_TOOL", doctor.checks.find((check) => check.status === "failed")?.message
|
|
97
|
+
?? "TapHound environment preflight failed");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const deviceSerial = options.device ?? doctor.deviceSerial;
|
|
101
|
+
if (deviceSerial === undefined) {
|
|
102
|
+
writeFailure(dependencies, options, 3, "DEVICE_UNAVAILABLE", "Doctor did not select a device");
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const project = await dependencies.projectDescriber.describe({
|
|
106
|
+
projectRoot: projectRoot,
|
|
107
|
+
config,
|
|
108
|
+
...(dependencies.signal === undefined
|
|
109
|
+
? {}
|
|
110
|
+
: { signal: dependencies.signal })
|
|
111
|
+
});
|
|
112
|
+
const result = await runtime.finalizer.finalize({
|
|
113
|
+
generationId,
|
|
114
|
+
projectRoot: projectRoot,
|
|
115
|
+
config,
|
|
116
|
+
context,
|
|
117
|
+
project,
|
|
118
|
+
outputPath,
|
|
119
|
+
...(name === undefined ? {} : { name }),
|
|
120
|
+
deviceSerial,
|
|
121
|
+
manualReplay: process.stdin.isTTY,
|
|
122
|
+
toolVersions: tools(doctor.checks),
|
|
123
|
+
...(dependencies.signal === undefined
|
|
124
|
+
? {}
|
|
125
|
+
: { signal: dependencies.signal })
|
|
126
|
+
});
|
|
127
|
+
writeSuccess(dependencies, options, {
|
|
128
|
+
status: "verified",
|
|
129
|
+
exitCode: 0,
|
|
130
|
+
generationId,
|
|
131
|
+
bundlePath: result.bundlePath,
|
|
132
|
+
journeyPath: result.journeyPath,
|
|
133
|
+
metaPath: result.metaPath,
|
|
134
|
+
replayed: result.replayed
|
|
135
|
+
}, `Generation verified: ${result.journeyPath}`);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
mappedFailure(dependencies, options, error);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
export function createRecoverCommand(dependencies) {
|
|
143
|
+
return addCommonOptions(new Command("recover")
|
|
144
|
+
.description("Explicitly reactivate an interrupted in-flight step")
|
|
145
|
+
.requiredOption("--decision <decision>", "Recovery decision; retry acknowledges the action may have executed"), dependencies).action(async (options) => {
|
|
146
|
+
try {
|
|
147
|
+
if (options.decision !== "retry") {
|
|
148
|
+
throw new GenerationOperationError("CONFIG_INVALID", "generation recover currently requires --decision retry");
|
|
149
|
+
}
|
|
150
|
+
const generationId = GenerationSessionIdSchema.parse(options.session);
|
|
151
|
+
const { projectRoot, config } = await generationConfig(dependencies, options);
|
|
152
|
+
const runtime = requireRuntime(dependencies, projectRoot, config);
|
|
153
|
+
await assertRuntimeConfig(runtime, generationId);
|
|
154
|
+
const before = await runtime.recovery.status(generationId);
|
|
155
|
+
if (!before.recovery.available) {
|
|
156
|
+
throw new GenerationOperationError("RECOVERY_REQUIRED", "Generation session has no recoverable in-flight step");
|
|
157
|
+
}
|
|
158
|
+
const session = await runtime.recovery.retry(generationId);
|
|
159
|
+
const recoveryKind = before.recovery.kind;
|
|
160
|
+
const nextAction = recoveryKind === "verification"
|
|
161
|
+
? "generation finalize"
|
|
162
|
+
: "retry the interrupted generation step";
|
|
163
|
+
writeSuccess(dependencies, options, {
|
|
164
|
+
status: "recovered",
|
|
165
|
+
exitCode: 0,
|
|
166
|
+
generationId,
|
|
167
|
+
revision: session.revision,
|
|
168
|
+
recoveryKind,
|
|
169
|
+
nextAction,
|
|
170
|
+
actionMayHaveExecuted: before.recovery.actionMayHaveExecuted,
|
|
171
|
+
previousAttemptOutcome: before.recovery.attemptOutcome
|
|
172
|
+
}, recoveryKind === "verification"
|
|
173
|
+
? `Generation ${generationId} verification recovered. Rerun generation finalize to verify again.`
|
|
174
|
+
: `Generation ${generationId} recovered. Explicitly retry the interrupted generation step.`);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
mappedFailure(dependencies, options, error);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
export function createReopenCommand(dependencies) {
|
|
182
|
+
return addCommonOptions(new Command("reopen")
|
|
183
|
+
.description("Reopen a deterministically failed verification for audited step repair")
|
|
184
|
+
.requiredOption("--reason <text>", "Reason for reopening the failed verification"), dependencies).action(async (options) => {
|
|
185
|
+
try {
|
|
186
|
+
const generationId = GenerationSessionIdSchema.parse(options.session);
|
|
187
|
+
const { projectRoot, config } = await generationConfig(dependencies, options);
|
|
188
|
+
const runtime = requireRuntime(dependencies, projectRoot, config);
|
|
189
|
+
await assertRuntimeConfig(runtime, generationId);
|
|
190
|
+
const session = await runtime.reopen.reopen({
|
|
191
|
+
generationId,
|
|
192
|
+
reason: options.reason
|
|
193
|
+
});
|
|
194
|
+
writeSuccess(dependencies, options, {
|
|
195
|
+
status: "reopened",
|
|
196
|
+
exitCode: 0,
|
|
197
|
+
generationId,
|
|
198
|
+
revision: session.revision,
|
|
199
|
+
verification: session.verification,
|
|
200
|
+
preservedFailure: session.verificationHistory.at(-1),
|
|
201
|
+
nextAction: {
|
|
202
|
+
command: "generation step --replace <index>",
|
|
203
|
+
then: "generation finalize"
|
|
204
|
+
}
|
|
205
|
+
}, `Generation ${generationId} reopened. Repair with generation step --replace <index>, then rerun generation finalize.`);
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
mappedFailure(dependencies, options, error);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type GenerationSession } from "../../../domain/generation.js";
|
|
3
|
+
import type { CliDependencies } from "../../dependencies.js";
|
|
4
|
+
export declare function createStartCommand(dependencies: CliDependencies): Command;
|
|
5
|
+
export declare function createObserveCommand(dependencies: CliDependencies): Command;
|
|
6
|
+
export declare function createStatusCommand(dependencies: CliDependencies): Command;
|
|
7
|
+
export declare function createArchiveCommand(dependencies: CliDependencies): Command;
|
|
8
|
+
export declare function idlePolicyText(policy: NonNullable<GenerationSession["idlePolicy"]>): string;
|
|
9
|
+
export declare function createConfigCommand(dependencies: CliDependencies): Command;
|
|
10
|
+
export declare function generationListText(sessions: readonly GenerationSession[]): string;
|
|
11
|
+
export declare function createListCommand(dependencies: CliDependencies): Command;
|