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,30 @@
|
|
|
1
|
+
import type { DisplayViewport } from "../domain/geometry.js";
|
|
2
|
+
import type { LayoutElement } from "../domain/layout.js";
|
|
3
|
+
import type { AnchorCandidateKind } from "../domain/knowledge.js";
|
|
4
|
+
export interface AnchorResolution {
|
|
5
|
+
status: "found" | "notFound" | "ambiguous" | "visualOnly";
|
|
6
|
+
point?: {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
};
|
|
10
|
+
bounds?: {
|
|
11
|
+
left: number;
|
|
12
|
+
top: number;
|
|
13
|
+
right: number;
|
|
14
|
+
bottom: number;
|
|
15
|
+
};
|
|
16
|
+
element?: LayoutElement;
|
|
17
|
+
message?: string;
|
|
18
|
+
resolvedBy?: {
|
|
19
|
+
kind: AnchorCandidateKind;
|
|
20
|
+
confidence: "primary" | "fallback";
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface AnchorResolverPort {
|
|
24
|
+
resolve: (input: {
|
|
25
|
+
anchorId: string;
|
|
26
|
+
layout: readonly LayoutElement[];
|
|
27
|
+
viewport?: DisplayViewport | undefined;
|
|
28
|
+
signal?: AbortSignal | undefined;
|
|
29
|
+
}) => Promise<AnchorResolution>;
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { FailureCode } from "../domain/failure.js";
|
|
2
|
+
export type CameraProbeFailureCode = Extract<FailureCode, `ALIGN_CAMERA_${string}` | `ALIGN_SHUTTER_${string}` | `ALIGN_CONFIRM_${string}`>;
|
|
3
|
+
export declare class CameraProbeError extends Error {
|
|
4
|
+
readonly code: CameraProbeFailureCode;
|
|
5
|
+
readonly name = "CameraProbeError";
|
|
6
|
+
constructor(code: CameraProbeFailureCode, message: string);
|
|
7
|
+
}
|
|
8
|
+
export interface CameraProbeResult {
|
|
9
|
+
packageName: string;
|
|
10
|
+
activityName: string;
|
|
11
|
+
shutterResourceId: string;
|
|
12
|
+
shutterContentDescription?: string | undefined;
|
|
13
|
+
confirmResourceId?: string | undefined;
|
|
14
|
+
confirmContentDescription?: string | undefined;
|
|
15
|
+
confirmActivityName?: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
export interface CameraProbeInput {
|
|
18
|
+
deviceSerial: string;
|
|
19
|
+
signal?: AbortSignal | undefined;
|
|
20
|
+
}
|
|
21
|
+
export interface CameraProbePort {
|
|
22
|
+
probe: (input: CameraProbeInput) => Promise<CameraProbeResult>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type ContextDocumentWrite = {
|
|
2
|
+
status: "written";
|
|
3
|
+
sha256: string;
|
|
4
|
+
} | {
|
|
5
|
+
status: "escape";
|
|
6
|
+
} | {
|
|
7
|
+
status: "unwritable";
|
|
8
|
+
message: string;
|
|
9
|
+
};
|
|
10
|
+
export interface ContextDocumentBatchEntry {
|
|
11
|
+
readonly relativePath: string;
|
|
12
|
+
readonly document: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface ContextDocumentWriter {
|
|
15
|
+
writeContextDocument: (input: {
|
|
16
|
+
projectRoot: string;
|
|
17
|
+
relativePath: string;
|
|
18
|
+
document: unknown;
|
|
19
|
+
}) => Promise<ContextDocumentWrite>;
|
|
20
|
+
writeContextDocumentBatch?: (input: {
|
|
21
|
+
projectRoot: string;
|
|
22
|
+
documents: readonly ContextDocumentBatchEntry[];
|
|
23
|
+
}) => Promise<readonly ContextDocumentWrite[]>;
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface DetachedProcessInput {
|
|
2
|
+
executable: string;
|
|
3
|
+
args: readonly string[];
|
|
4
|
+
cwd: string;
|
|
5
|
+
stdoutPath: string;
|
|
6
|
+
stderrPath: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DetachedProcessLauncher {
|
|
9
|
+
launch: (input: DetachedProcessInput) => Promise<{
|
|
10
|
+
pid: number;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CommandEvent } from "../domain/diagnostics.js";
|
|
2
|
+
import type { UiBackendId } from "../domain/ui-backend.js";
|
|
3
|
+
/** Receives UI backend timing facts; never error text. */
|
|
4
|
+
export interface UiCaptureObserver {
|
|
5
|
+
captured: (backend: UiBackendId, durationMs: number, error?: unknown) => void;
|
|
6
|
+
sessionRecovered: (backend: UiBackendId, succeeded: boolean) => void;
|
|
7
|
+
}
|
|
8
|
+
/** The local, Git-ignored diagnostics journal of one host project. */
|
|
9
|
+
export interface DiagnosticsJournal {
|
|
10
|
+
append: (projectRoot: string, event: CommandEvent) => Promise<void>;
|
|
11
|
+
/** Raw journal lines, oldest first, including the rotated file. */
|
|
12
|
+
readLines: (projectRoot: string) => Promise<readonly string[]>;
|
|
13
|
+
/** A per-project random salt that never leaves the host. */
|
|
14
|
+
salt: (projectRoot: string) => Promise<Buffer>;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ExternalFlow } from "../domain/external-flow.js";
|
|
2
|
+
export interface ExternalFlowRecord {
|
|
3
|
+
bytes: Buffer;
|
|
4
|
+
flow: ExternalFlow;
|
|
5
|
+
source: "builtin" | "project";
|
|
6
|
+
path: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ExternalFlowCatalogEntry {
|
|
9
|
+
name: string;
|
|
10
|
+
source: "builtin" | "project";
|
|
11
|
+
path: string;
|
|
12
|
+
status: "valid" | "invalid";
|
|
13
|
+
escapedPackageName?: string | undefined;
|
|
14
|
+
stepCount?: number | undefined;
|
|
15
|
+
failure?: {
|
|
16
|
+
code: string;
|
|
17
|
+
message: string;
|
|
18
|
+
} | undefined;
|
|
19
|
+
}
|
|
20
|
+
export interface WriteExternalFlowInput {
|
|
21
|
+
projectRoot: string;
|
|
22
|
+
name: string;
|
|
23
|
+
flow: ExternalFlow;
|
|
24
|
+
force?: boolean | undefined;
|
|
25
|
+
}
|
|
26
|
+
export interface WriteExternalFlowResult {
|
|
27
|
+
path: string;
|
|
28
|
+
overwritten: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface ExternalFlowRegistry {
|
|
31
|
+
read: (input: {
|
|
32
|
+
projectRoot: string;
|
|
33
|
+
name: string;
|
|
34
|
+
}) => Promise<ExternalFlowRecord>;
|
|
35
|
+
list: (projectRoot: string) => Promise<readonly ExternalFlowCatalogEntry[]>;
|
|
36
|
+
write: (input: WriteExternalFlowInput) => Promise<WriteExternalFlowResult>;
|
|
37
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -2,8 +2,9 @@ import type { PendingConfirmation } from "../domain/generation.js";
|
|
|
2
2
|
import type { Expectation } from "../domain/journey.js";
|
|
3
3
|
import type { LayoutElement } from "../domain/layout.js";
|
|
4
4
|
import type { ProposalBinding, ProposedStep } from "../domain/proposed-step.js";
|
|
5
|
+
export type ManualAction = Exclude<ProposedStep["action"], "bridge">;
|
|
5
6
|
export interface ManualProposalInput {
|
|
6
|
-
action:
|
|
7
|
+
action: ManualAction;
|
|
7
8
|
binding: ProposalBinding;
|
|
8
9
|
before: string;
|
|
9
10
|
expect?: Expectation | undefined;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { GenerationInFlight, GenerationSession, PendingConfirmation } from "../domain/generation.js";
|
|
1
|
+
import type { GenerationInFlight, GenerationSession, PendingConfirmation, VerificationPhase } from "../domain/generation.js";
|
|
2
2
|
export declare const GENERATION_SESSION_STORE_ERROR_CODES: readonly ["INVALID_ID", "INVALID_SESSION", "INVALID_REVISION", "SESSION_ALREADY_EXISTS", "SESSION_NOT_FOUND", "SESSION_PUBLISHED", "REVISION_CONFLICT", "INVALID_TRANSITION", "LOCK_TIMEOUT", "INVALID_EVIDENCE_PATH", "INVALID_EVIDENCE", "EVIDENCE_NOT_FOUND", "EVIDENCE_ALREADY_EXISTS", "SESSION_NOT_PUBLISHABLE", "PUBLISH_DESTINATION_EXISTS", "IO_ERROR"];
|
|
3
3
|
export type GenerationSessionStoreErrorCode = typeof GENERATION_SESSION_STORE_ERROR_CODES[number];
|
|
4
4
|
export declare class GenerationSessionStoreError extends Error {
|
|
@@ -19,14 +19,24 @@ export interface GenerationSessionStore {
|
|
|
19
19
|
beginStep: (id: string, expectedRevision: number, inFlight: GenerationInFlight, approvedConfirmation?: PendingConfirmation) => Promise<GenerationSession>;
|
|
20
20
|
completeStep: (id: string, expectedRevision: number, expectedInFlight: GenerationInFlight, next: GenerationSession) => Promise<void>;
|
|
21
21
|
recover: (id: string, expectedRevision: number, next: GenerationSession) => Promise<void>;
|
|
22
|
-
beginVerification: (id: string, expectedRevision: number, attemptId: string
|
|
22
|
+
beginVerification: (id: string, expectedRevision: number, attemptId: string, owner?: {
|
|
23
|
+
pid: number;
|
|
24
|
+
startedAt: string;
|
|
25
|
+
}) => Promise<GenerationSession>;
|
|
26
|
+
updateVerificationPhase: (id: string, attemptId: string, phase: VerificationPhase) => Promise<void>;
|
|
27
|
+
abortVerification: (id: string, expectedRevision: number) => Promise<GenerationSession>;
|
|
23
28
|
completeVerification: (id: string, expectedRevision: number, next: GenerationSession) => Promise<void>;
|
|
24
29
|
failVerification: (id: string, expectedRevision: number, next: GenerationSession) => Promise<void>;
|
|
30
|
+
recoverVerification: (id: string, expectedRevision: number, next: GenerationSession) => Promise<void>;
|
|
31
|
+
reopenVerification: (id: string, expectedRevision: number, next: GenerationSession) => Promise<void>;
|
|
32
|
+
archive: (id: string, expectedRevision: number, next: GenerationSession) => Promise<void>;
|
|
33
|
+
list: () => Promise<readonly GenerationSession[]>;
|
|
25
34
|
markBundlePublishable: (id: string, expectedRevision: number, next: GenerationSession) => Promise<void>;
|
|
26
35
|
writeEvidence: (id: string, relativePath: string, value: unknown) => Promise<void>;
|
|
27
36
|
writeTextEvidence: (id: string, relativePath: string, value: string) => Promise<void>;
|
|
28
37
|
produceEvidence: (id: string, relativePath: string, produce: (temporaryPath: string) => Promise<void>) => Promise<void>;
|
|
29
38
|
readEvidence: (id: string, relativePath: string) => Promise<Buffer>;
|
|
39
|
+
evidenceReference: (id: string, relativePath: string) => Promise<string>;
|
|
30
40
|
listEvidence: (id: string) => Promise<readonly GenerationEvidenceFile[]>;
|
|
31
41
|
publish: (id: string) => Promise<string>;
|
|
32
42
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface JourneyCompositionStore {
|
|
2
|
+
read: (input: {
|
|
3
|
+
projectRoot: string;
|
|
4
|
+
relativePath: string;
|
|
5
|
+
}) => Promise<Buffer>;
|
|
6
|
+
listFlowPaths: (projectRoot: string) => Promise<readonly string[]>;
|
|
7
|
+
listJourneyPaths: (projectRoot: string) => Promise<readonly string[]>;
|
|
8
|
+
readJourneyMeta: (input: {
|
|
9
|
+
projectRoot: string;
|
|
10
|
+
journeyPath: string;
|
|
11
|
+
}) => Promise<Buffer | null>;
|
|
12
|
+
writeText: (input: {
|
|
13
|
+
projectRoot: string;
|
|
14
|
+
relativePath: string;
|
|
15
|
+
content: string;
|
|
16
|
+
}) => Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AnchorDefinition, KnowledgeBundleIndex, ScreenDefinition } from "../domain/knowledge.js";
|
|
2
|
+
export interface LoadedKnowledgeBundle {
|
|
3
|
+
index: KnowledgeBundleIndex;
|
|
4
|
+
indexSha256: string;
|
|
5
|
+
knowledgeHash: string;
|
|
6
|
+
anchors: AnchorDefinition[];
|
|
7
|
+
screens: ScreenDefinition[];
|
|
8
|
+
}
|
|
9
|
+
export interface KnowledgeRehashResult {
|
|
10
|
+
indexPath: string;
|
|
11
|
+
knowledgeHash: string;
|
|
12
|
+
revision: number;
|
|
13
|
+
changed: boolean;
|
|
14
|
+
anchors: number;
|
|
15
|
+
screens: number;
|
|
16
|
+
}
|
|
17
|
+
export interface KnowledgeRegistryPort {
|
|
18
|
+
load: (projectRoot: string) => Promise<LoadedKnowledgeBundle>;
|
|
19
|
+
rehash: (projectRoot: string, packageName: string) => Promise<KnowledgeRehashResult>;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -14,11 +14,18 @@ export interface CommandResult {
|
|
|
14
14
|
durationMs: number;
|
|
15
15
|
timedOut: boolean;
|
|
16
16
|
cancelled: boolean;
|
|
17
|
+
terminationRequested?: boolean | undefined;
|
|
17
18
|
spawnError?: string | undefined;
|
|
18
19
|
}
|
|
19
20
|
export interface StreamHandlers {
|
|
20
21
|
onStdoutLine?(line: string): void;
|
|
21
22
|
onStderrLine?(line: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Long-lived streams may disable aggregate capture while still consuming
|
|
25
|
+
* complete lines through the callbacks above.
|
|
26
|
+
*/
|
|
27
|
+
captureStdout?: boolean | undefined;
|
|
28
|
+
captureStderr?: boolean | undefined;
|
|
22
29
|
}
|
|
23
30
|
export interface RunningCommand {
|
|
24
31
|
/** Resolves undefined once the stream remains alive through startup. */
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type ProjectIdentityInspection = {
|
|
2
|
+
readonly status: "inspected";
|
|
3
|
+
readonly packageName: string;
|
|
4
|
+
readonly launchActivity: string;
|
|
5
|
+
} | {
|
|
6
|
+
readonly status: "rootNotFound";
|
|
7
|
+
} | {
|
|
8
|
+
readonly status: "rootNotDirectory";
|
|
9
|
+
} | {
|
|
10
|
+
readonly status: "moduleNotFound";
|
|
11
|
+
} | {
|
|
12
|
+
readonly status: "manifestNotFound";
|
|
13
|
+
} | {
|
|
14
|
+
readonly status: "manifestUnreadable";
|
|
15
|
+
} | {
|
|
16
|
+
readonly status: "identityNotFound";
|
|
17
|
+
readonly message: string;
|
|
18
|
+
};
|
|
19
|
+
export interface ProjectIdentityInspector {
|
|
20
|
+
inspectIdentity: (input: {
|
|
21
|
+
readonly projectRoot: string;
|
|
22
|
+
readonly moduleDir: string;
|
|
23
|
+
}) => Promise<ProjectIdentityInspection>;
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type ProjectInventoryCategory = "manifests" | "sources" | "layouts" | "navigation";
|
|
2
|
+
export type ProjectInventoryInspection = {
|
|
3
|
+
status: "rootNotFound";
|
|
4
|
+
} | {
|
|
5
|
+
status: "rootUnreadable";
|
|
6
|
+
} | {
|
|
7
|
+
status: "rootNotDirectory";
|
|
8
|
+
} | {
|
|
9
|
+
status: "escape";
|
|
10
|
+
} | {
|
|
11
|
+
status: "inspected";
|
|
12
|
+
paths: string[];
|
|
13
|
+
pathSetSha256: string;
|
|
14
|
+
};
|
|
15
|
+
export interface ProjectInventoryInspector {
|
|
16
|
+
inspectProjectInventory: (input: {
|
|
17
|
+
projectRoot: string;
|
|
18
|
+
projectDir: string;
|
|
19
|
+
categories: ProjectInventoryCategory[];
|
|
20
|
+
}) => Promise<ProjectInventoryInspection>;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface DiscoveredModule {
|
|
2
|
+
readonly id: string;
|
|
3
|
+
readonly projectDir: string;
|
|
4
|
+
readonly kind: "application" | "feature" | "library";
|
|
5
|
+
readonly dependsOn: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export type ProjectModuleDiscovery = {
|
|
8
|
+
readonly status: "discovered";
|
|
9
|
+
readonly modules: readonly DiscoveredModule[];
|
|
10
|
+
} | {
|
|
11
|
+
readonly status: "rootNotFound";
|
|
12
|
+
} | {
|
|
13
|
+
readonly status: "rootNotDirectory";
|
|
14
|
+
} | {
|
|
15
|
+
readonly status: "noSettingsFile";
|
|
16
|
+
} | {
|
|
17
|
+
readonly status: "noApplicationModule";
|
|
18
|
+
} | {
|
|
19
|
+
readonly status: "discoveryFailed";
|
|
20
|
+
readonly message: string;
|
|
21
|
+
};
|
|
22
|
+
export interface ProjectModuleDiscoverer {
|
|
23
|
+
discoverModules: (input: {
|
|
24
|
+
readonly projectRoot: string;
|
|
25
|
+
}) => Promise<ProjectModuleDiscovery>;
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import type { BridgeScenario } from "../domain/journey.js";
|
|
2
|
+
export type RecorderAction = "click" | "longClick" | "inputText" | "swipe" | "scrollTo" | "back" | "wait" | "bridgeTrigger" | "finish" | "cancel";
|
|
3
|
+
export type ExternalStepAction = "click" | "longClick" | "inputText" | "swipe" | "scrollTo" | "back" | "wait" | "finishExternal";
|
|
2
4
|
export type ScrollDecision = {
|
|
3
5
|
kind: "select";
|
|
4
6
|
id: string;
|
|
@@ -26,4 +28,11 @@ export interface RecorderPromptPort {
|
|
|
26
28
|
notifyFailure: (message: string) => Promise<void>;
|
|
27
29
|
selectScrollContainer: (choices: readonly RecorderTargetChoice[]) => Promise<string>;
|
|
28
30
|
scrollTargetDecision: (choices: readonly RecorderTargetChoice[]) => Promise<ScrollDecision>;
|
|
31
|
+
selectBridgeScenario: () => Promise<BridgeScenario>;
|
|
32
|
+
inputBridgeDescription: (scenario: BridgeScenario) => Promise<string>;
|
|
33
|
+
inputBridgeReturnTimeoutMs: () => Promise<number>;
|
|
34
|
+
selectExternalStepAction: () => Promise<ExternalStepAction>;
|
|
35
|
+
notifyExternalEscape: (escapedPackageName: string) => Promise<void>;
|
|
36
|
+
notifyExternalReturn: () => Promise<void>;
|
|
37
|
+
notifyBridgeNoEscape: () => Promise<void>;
|
|
29
38
|
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { ForegroundComponent } from "../domain/activity.js";
|
|
2
|
+
import type { AppProcess } from "../domain/app-process.js";
|
|
3
|
+
import type { Point } from "../domain/geometry.js";
|
|
4
|
+
import type { DeviceInfo, RuntimeBackendDescriptor, RuntimeCapabilities } from "../domain/runtime.js";
|
|
5
|
+
import type { WindowTopology } from "../domain/window-hierarchy.js";
|
|
6
|
+
import type { UiBackendSelection } from "../domain/ui-backend.js";
|
|
7
|
+
import type { DeviceIdentity } from "./adb.js";
|
|
8
|
+
import type { AnnotatedScreenResolverPort } from "./annotated-screen-resolver.js";
|
|
9
|
+
import type { CommandResult, RunningCommand } from "./process-runner.js";
|
|
10
|
+
import type { UiSnapshotProvider } from "./ui-snapshot.js";
|
|
11
|
+
import type { UiStabilityProbe } from "./ui-stability.js";
|
|
12
|
+
export interface OpenRuntimeSessionOptions {
|
|
13
|
+
deviceSerial: string;
|
|
14
|
+
signal?: AbortSignal | undefined;
|
|
15
|
+
}
|
|
16
|
+
export interface OpenRuntimeUiSnapshotsOptions {
|
|
17
|
+
timeoutMs?: number | undefined;
|
|
18
|
+
backend?: UiBackendSelection | undefined;
|
|
19
|
+
cacheEnabled?: boolean | undefined;
|
|
20
|
+
signal?: AbortSignal | undefined;
|
|
21
|
+
}
|
|
22
|
+
export interface RuntimeAppQuery {
|
|
23
|
+
packageName: string;
|
|
24
|
+
signal?: AbortSignal | undefined;
|
|
25
|
+
timeoutMs?: number | undefined;
|
|
26
|
+
}
|
|
27
|
+
export interface RuntimeLaunchOptions extends RuntimeAppQuery {
|
|
28
|
+
activity: string;
|
|
29
|
+
}
|
|
30
|
+
export interface RuntimeLogcatStreamOptions {
|
|
31
|
+
onStdoutLine: (line: string) => void;
|
|
32
|
+
onStderrLine?: ((line: string) => void) | undefined;
|
|
33
|
+
signal?: AbortSignal | undefined;
|
|
34
|
+
}
|
|
35
|
+
export interface RuntimeDumpLogcatOptions {
|
|
36
|
+
maxLines: number;
|
|
37
|
+
signal?: AbortSignal | undefined;
|
|
38
|
+
timeoutMs?: number | undefined;
|
|
39
|
+
}
|
|
40
|
+
export interface RuntimeScreenshotOptions {
|
|
41
|
+
outputPath: string;
|
|
42
|
+
annotate?: boolean | undefined;
|
|
43
|
+
signal?: AbortSignal | undefined;
|
|
44
|
+
timeoutMs?: number | undefined;
|
|
45
|
+
}
|
|
46
|
+
export interface RuntimeIntentOptions {
|
|
47
|
+
action: string;
|
|
48
|
+
signal?: AbortSignal | undefined;
|
|
49
|
+
timeoutMs?: number | undefined;
|
|
50
|
+
}
|
|
51
|
+
export interface RuntimeSession {
|
|
52
|
+
readonly descriptor: RuntimeBackendDescriptor;
|
|
53
|
+
readonly deviceSerial: string;
|
|
54
|
+
openUiSnapshots(options?: OpenRuntimeUiSnapshotsOptions): Promise<UiSnapshotProvider>;
|
|
55
|
+
isInstalled(app: RuntimeAppQuery): Promise<boolean>;
|
|
56
|
+
launchApp(options: RuntimeLaunchOptions): Promise<CommandResult>;
|
|
57
|
+
forceStop(app: RuntimeAppQuery): Promise<CommandResult>;
|
|
58
|
+
readonly currentActivity: ((app: RuntimeAppQuery) => Promise<string>) | undefined;
|
|
59
|
+
readonly deviceIdentity: ((app: RuntimeAppQuery) => Promise<DeviceIdentity>) | undefined;
|
|
60
|
+
readonly foregroundComponent: ((app: RuntimeAppQuery) => Promise<ForegroundComponent>) | undefined;
|
|
61
|
+
readonly appProcesses: ((app: RuntimeAppQuery) => Promise<readonly AppProcess[]>) | undefined;
|
|
62
|
+
readonly windowTopology: ((app: RuntimeAppQuery) => Promise<WindowTopology>) | undefined;
|
|
63
|
+
tap(point: Point, signal?: AbortSignal): Promise<CommandResult>;
|
|
64
|
+
longClick(point: Point, durationMs: number, signal?: AbortSignal): Promise<CommandResult>;
|
|
65
|
+
swipe(from: Point, to: Point, durationMs: number, signal?: AbortSignal): Promise<CommandResult>;
|
|
66
|
+
back(signal?: AbortSignal): Promise<CommandResult>;
|
|
67
|
+
inputText(text: string, signal?: AbortSignal): Promise<CommandResult>;
|
|
68
|
+
readonly startLogcat: ((options: RuntimeLogcatStreamOptions) => RunningCommand) | undefined;
|
|
69
|
+
readonly dumpLogcat: ((options: RuntimeDumpLogcatOptions) => Promise<CommandResult>) | undefined;
|
|
70
|
+
captureScreenshot(options: RuntimeScreenshotOptions): Promise<CommandResult>;
|
|
71
|
+
readonly annotatedScreens: AnnotatedScreenResolverPort | undefined;
|
|
72
|
+
readonly uiStability: UiStabilityProbe;
|
|
73
|
+
readonly startActivityByIntent: ((options: RuntimeIntentOptions) => Promise<CommandResult>) | undefined;
|
|
74
|
+
close(): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
export interface RuntimeBackend {
|
|
77
|
+
readonly descriptor: RuntimeBackendDescriptor;
|
|
78
|
+
readonly capabilities: RuntimeCapabilities;
|
|
79
|
+
listDevices(signal?: AbortSignal): Promise<readonly DeviceInfo[]>;
|
|
80
|
+
openSession(options: OpenRuntimeSessionOptions): Promise<RuntimeSession>;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The session-opening slice of `RuntimeBackend`. Application services that
|
|
84
|
+
* borrow a `RuntimeSession` per run depend on this type so backends can be
|
|
85
|
+
* shared or replaced without exposing the full backend interface.
|
|
86
|
+
*/
|
|
87
|
+
export type RuntimeSessionOpener = Pick<RuntimeBackend, "openSession">;
|
|
88
|
+
/** Borrows one session for `use` and always closes it. */
|
|
89
|
+
export declare function withRuntimeSession<T>(sessions: RuntimeSessionOpener, deviceSerial: string, signal: AbortSignal | undefined, use: (session: RuntimeSession) => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Borrows one session for `use` and always closes it. */
|
|
2
|
+
export async function withRuntimeSession(sessions, deviceSerial, signal, use) {
|
|
3
|
+
const session = await sessions.openSession({
|
|
4
|
+
deviceSerial,
|
|
5
|
+
...(signal === undefined ? {} : { signal })
|
|
6
|
+
});
|
|
7
|
+
try {
|
|
8
|
+
return await use(session);
|
|
9
|
+
}
|
|
10
|
+
finally {
|
|
11
|
+
await session.close();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FailureCode } from "../domain/failure.js";
|
|
2
|
+
export interface RuntimeCapabilityError extends Error {
|
|
3
|
+
code: FailureCode;
|
|
4
|
+
}
|
|
5
|
+
export declare function isRuntimeCapabilityError(error: unknown): error is RuntimeCapabilityError;
|
|
6
|
+
/**
|
|
7
|
+
* Fail-closed rejection for capability-gated RuntimeSession members. The
|
|
8
|
+
* error carries `RUNTIME_CAPABILITY_MISSING` so CLI consumers surface the
|
|
9
|
+
* coded failure instead of a generic internal error, and the message names
|
|
10
|
+
* the escape hatches that select a capable backend.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runtimeCapabilityMissing(backendId: string, member: string): RuntimeCapabilityError;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function isRuntimeCapabilityError(error) {
|
|
2
|
+
return (error !== null
|
|
3
|
+
&& typeof error === "object"
|
|
4
|
+
&& "code" in error
|
|
5
|
+
&& error.code === "RUNTIME_CAPABILITY_MISSING");
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Fail-closed rejection for capability-gated RuntimeSession members. The
|
|
9
|
+
* error carries `RUNTIME_CAPABILITY_MISSING` so CLI consumers surface the
|
|
10
|
+
* coded failure instead of a generic internal error, and the message names
|
|
11
|
+
* the escape hatches that select a capable backend.
|
|
12
|
+
*/
|
|
13
|
+
export function runtimeCapabilityMissing(backendId, member) {
|
|
14
|
+
const error = new Error(`Runtime backend "${backendId}" does not support ${member}. `
|
|
15
|
+
+ "Select a backend with this capability through runtime.backend in "
|
|
16
|
+
+ ".taphound/config.json or the TAPHOUND_RUNTIME_BACKEND environment "
|
|
17
|
+
+ 'variable (for example "adb").');
|
|
18
|
+
error.code = "RUNTIME_CAPABILITY_MISSING";
|
|
19
|
+
return error;
|
|
20
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AdbPort } from "./adb.js";
|
|
2
|
+
import type { AnnotatedScreenResolverPort } from "./annotated-screen-resolver.js";
|
|
3
|
+
import type { RuntimeSession } from "./runtime-backend.js";
|
|
4
|
+
import type { ScreenshotPort } from "./screenshot.js";
|
|
5
|
+
import type { UiStabilityProbe } from "./ui-stability.js";
|
|
6
|
+
/**
|
|
7
|
+
* Legacy port views over one borrowed `RuntimeSession`.
|
|
8
|
+
*
|
|
9
|
+
* Level 1 session-first orchestrators borrow one session per run and feed
|
|
10
|
+
* their unchanged `AdbPort`-shaped helpers through these views so the whole
|
|
11
|
+
* run flows through a single session. Level 2 retypes the helpers onto
|
|
12
|
+
* `Pick<RuntimeSession, ...>` and deletes the views.
|
|
13
|
+
*/
|
|
14
|
+
export interface RuntimeSessionPortViews {
|
|
15
|
+
adb: AdbPort;
|
|
16
|
+
screenshots: ScreenshotPort;
|
|
17
|
+
annotatedScreens: AnnotatedScreenResolverPort;
|
|
18
|
+
uiStability: UiStabilityProbe;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Builds the legacy port views for one borrowed session. Implementations
|
|
22
|
+
* live in the runtime adapters; application services depend on this factory
|
|
23
|
+
* type only.
|
|
24
|
+
*/
|
|
25
|
+
export type RuntimeSessionPortViewsFactory = (session: RuntimeSession) => RuntimeSessionPortViews;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CommandResult } from "./process-runner.js";
|
|
2
|
+
export interface ScreenshotOptions {
|
|
3
|
+
deviceSerial: string;
|
|
4
|
+
outputPath: string;
|
|
5
|
+
annotate?: boolean | undefined;
|
|
6
|
+
signal?: AbortSignal | undefined;
|
|
7
|
+
timeoutMs?: number | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface ScreenshotPort {
|
|
10
|
+
capture: (options: ScreenshotOptions) => Promise<CommandResult>;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -3,6 +3,6 @@ export interface SkillInstallResult {
|
|
|
3
3
|
readonly skipped: boolean;
|
|
4
4
|
}
|
|
5
5
|
export interface SkillInstallerPort {
|
|
6
|
-
|
|
7
|
-
installTo: (targetDir: string) => Promise<SkillInstallResult>;
|
|
6
|
+
listSkillNames: () => Promise<readonly string[]>;
|
|
7
|
+
installTo: (skillName: string, targetDir: string) => Promise<SkillInstallResult>;
|
|
8
8
|
}
|