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.
Files changed (447) hide show
  1. package/README.md +49 -149
  2. package/README.zh-CN.md +47 -147
  3. package/assets/skills/taphound-case-suite/SKILL.md +363 -0
  4. package/assets/skills/taphound-case-suite/schemas/base-flow-record.schema.json +22 -0
  5. package/assets/skills/taphound-case-suite/schemas/case-catalog.schema.json +26 -0
  6. package/assets/skills/taphound-case-suite/schemas/case-ledger.schema.json +158 -0
  7. package/assets/skills/taphound-case-suite/schemas/suite-input.schema.json +41 -0
  8. package/assets/skills/taphound-case-suite/schemas/transition.schema.json +61 -0
  9. package/assets/skills/taphound-case-suite/scripts/ledger.mjs +1207 -0
  10. package/assets/skills/taphound-case-suite/templates/base-flow-record.example.json +20 -0
  11. package/assets/skills/taphound-case-suite/templates/suite-input.example.json +27 -0
  12. package/assets/skills/taphound-case-suite/templates/transition.example.json +8 -0
  13. package/assets/skills/taphound-flash/SKILL.md +115 -0
  14. package/assets/skills/taphound-flash/scripts/flash.mjs +585 -0
  15. package/assets/skills/taphound-flash/templates/flash-plan.example.json +15 -0
  16. package/assets/skills/taphound-journey-brief-author/CONTEXT-GUIDE.md +471 -0
  17. package/assets/skills/taphound-journey-brief-author/SKILL.md +494 -0
  18. package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.md +96 -0
  19. package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.zh-CN.md +80 -0
  20. package/assets/skills/taphound-journey-brief-author/prompts/context-analyze-project.md +309 -0
  21. package/assets/skills/taphound-journey-brief-author/schemas/context-refresh-result.json +123 -0
  22. package/assets/skills/taphound-journey-brief-author/schemas/project-context-module.json +192 -0
  23. package/assets/skills/taphound-journey-brief-author/schemas/project-context.json +152 -0
  24. package/assets/skills/taphound-journey-brief-author/templates/project-context-module.example.json +58 -0
  25. package/assets/skills/taphound-journey-brief-author/templates/project-context.example.json +51 -0
  26. package/assets/skills/taphound-journey-brief-author/templates/taphound-journey-brief.template.md +63 -0
  27. package/assets/skills/taphound-journey-generator/SKILL.md +500 -0
  28. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/prompts/check-completion.md +3 -0
  29. package/assets/skills/taphound-journey-generator/prompts/consume-journey-brief.md +52 -0
  30. package/assets/skills/taphound-journey-generator/prompts/generate-step.md +211 -0
  31. package/assets/skills/taphound-journey-generator/prompts/select-flow.md +91 -0
  32. package/assets/skills/taphound-journey-generator/references/bridge.md +35 -0
  33. package/assets/skills/taphound-journey-generator/references/mid-session.md +44 -0
  34. package/assets/skills/taphound-journey-generator/schemas/external-flow.json +37 -0
  35. package/assets/skills/taphound-journey-generator/schemas/flow.json +28 -0
  36. package/assets/skills/taphound-journey-generator/schemas/journey-source.json +25 -0
  37. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/observe-output.json +13 -4
  38. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/proposed-step-envelope.json +127 -5
  39. package/assets/skills/taphound-journey-generator/scripts/envelope.mjs +561 -0
  40. package/assets/skills/taphound-journey-generator/templates/external-flow.example.json +22 -0
  41. package/assets/skills/taphound-journey-generator/templates/flow.example.json +22 -0
  42. package/assets/skills/taphound-journey-generator/templates/journey-source.example.json +17 -0
  43. package/assets/skills/taphound-journey-generator/templates/taphound-journey-brief.example.md +70 -0
  44. package/assets/skills/taphound-verify-change/SKILL.md +91 -0
  45. package/assets/skills/taphound-verify-change/references/accept.md +38 -0
  46. package/assets/skills/taphound-verify-change/references/preserve.md +349 -0
  47. package/assets/skills/taphound-verify-change/schemas/workflow-manifest.schema.json +295 -0
  48. package/assets/skills/taphound-verify-change/scripts/handoff.mjs +482 -0
  49. package/assets/skills/taphound-verify-change/scripts/ui-refactor.mjs +505 -0
  50. package/dist/adapters/adb/adb-adapter.d.ts +16 -2
  51. package/dist/adapters/adb/adb-adapter.js +199 -0
  52. package/dist/adapters/adb/system-uiautomator-snapshot-provider.d.ts +13 -0
  53. package/dist/adapters/adb/system-uiautomator-snapshot-provider.js +122 -0
  54. package/dist/adapters/adb/ui-automator-parser.d.ts +3 -0
  55. package/dist/adapters/adb/ui-automator-parser.js +160 -0
  56. package/dist/adapters/adb/window-topology-parser.d.ts +2 -0
  57. package/dist/adapters/adb/window-topology-parser.js +101 -0
  58. package/dist/adapters/android-cli/android-cli-adapter.d.ts +16 -8
  59. package/dist/adapters/android-cli/android-cli-adapter.js +137 -15
  60. package/dist/adapters/android-cli/android-cli-snapshot-provider.d.ts +9 -0
  61. package/dist/adapters/android-cli/android-cli-snapshot-provider.js +99 -0
  62. package/dist/adapters/android-cli/layout-parser.js +12 -8
  63. package/dist/adapters/appium/appium-doctor.d.ts +7 -0
  64. package/dist/adapters/appium/appium-doctor.js +128 -0
  65. package/dist/adapters/appium/appium-ui-snapshot-provider.d.ts +34 -0
  66. package/dist/adapters/appium/appium-ui-snapshot-provider.js +240 -0
  67. package/dist/adapters/camera/camera-probe-adapter.d.ts +18 -0
  68. package/dist/adapters/camera/camera-probe-adapter.js +286 -0
  69. package/dist/adapters/filesystem/artifact-store.js +40 -1
  70. package/dist/adapters/filesystem/context-document-writer.d.ts +15 -0
  71. package/dist/adapters/filesystem/context-document-writer.js +112 -0
  72. package/dist/adapters/filesystem/external-flow-registry.d.ts +17 -0
  73. package/dist/adapters/filesystem/external-flow-registry.js +325 -0
  74. package/dist/adapters/filesystem/generation-session-store.d.ts +17 -11
  75. package/dist/adapters/filesystem/generation-session-store.js +281 -855
  76. package/dist/adapters/filesystem/generation-store/session-lock.d.ts +29 -0
  77. package/dist/adapters/filesystem/generation-store/session-lock.js +202 -0
  78. package/dist/adapters/filesystem/generation-store/session-transitions.d.ts +24 -0
  79. package/dist/adapters/filesystem/generation-store/session-transitions.js +340 -0
  80. package/dist/adapters/filesystem/generation-store/store-files.d.ts +50 -0
  81. package/dist/adapters/filesystem/generation-store/store-files.js +363 -0
  82. package/dist/adapters/filesystem/journey-composition-store.d.ts +23 -0
  83. package/dist/adapters/filesystem/journey-composition-store.js +151 -0
  84. package/dist/adapters/filesystem/knowledge-registry.d.ts +12 -0
  85. package/dist/adapters/filesystem/knowledge-registry.js +223 -0
  86. package/dist/adapters/filesystem/project-bound-file.js +3 -5
  87. package/dist/adapters/filesystem/project-file-inspector.d.ts +2 -0
  88. package/dist/adapters/filesystem/project-file-inspector.js +57 -28
  89. package/dist/adapters/filesystem/project-identity-inspector.d.ts +7 -0
  90. package/dist/adapters/filesystem/project-identity-inspector.js +215 -0
  91. package/dist/adapters/filesystem/project-inventory-inspector.d.ts +8 -0
  92. package/dist/adapters/filesystem/project-inventory-inspector.js +93 -0
  93. package/dist/adapters/filesystem/project-module-discoverer.d.ts +6 -0
  94. package/dist/adapters/filesystem/project-module-discoverer.js +158 -0
  95. package/dist/adapters/filesystem/skill-installer.d.ts +7 -2
  96. package/dist/adapters/filesystem/skill-installer.js +40 -11
  97. package/dist/adapters/filesystem/workspace-layout.d.ts +7 -0
  98. package/dist/adapters/filesystem/workspace-layout.js +57 -0
  99. package/dist/adapters/git/node-git-diff.d.ts +17 -0
  100. package/dist/adapters/git/node-git-diff.js +114 -0
  101. package/dist/adapters/process/node-detached-process-launcher.d.ts +6 -0
  102. package/dist/adapters/process/node-detached-process-launcher.js +96 -0
  103. package/dist/adapters/process/node-process-runner.js +11 -2
  104. package/dist/adapters/prompt/inquirer-align-prompt.d.ts +27 -0
  105. package/dist/adapters/prompt/inquirer-align-prompt.js +65 -0
  106. package/dist/adapters/prompt/inquirer-generation-prompt.js +3 -0
  107. package/dist/adapters/prompt/inquirer-recorder-prompt.d.ts +9 -1
  108. package/dist/adapters/prompt/inquirer-recorder-prompt.js +63 -0
  109. package/dist/adapters/runtime/adb-runtime-backend.d.ts +67 -0
  110. package/dist/adapters/runtime/adb-runtime-backend.js +206 -0
  111. package/dist/adapters/runtime/fake-runtime-backend.d.ts +87 -0
  112. package/dist/adapters/runtime/fake-runtime-backend.js +240 -0
  113. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.d.ts +45 -0
  114. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.js +153 -0
  115. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.d.ts +23 -0
  116. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.js +39 -0
  117. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.d.ts +20 -0
  118. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.js +180 -0
  119. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.d.ts +78 -0
  120. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.js +379 -0
  121. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-tools.d.ts +46 -0
  122. package/dist/adapters/runtime/session-adb-view.d.ts +53 -0
  123. package/dist/adapters/runtime/session-adb-view.js +193 -0
  124. package/dist/adapters/runtime/session-backed-ports.d.ts +21 -0
  125. package/dist/adapters/runtime/session-backed-ports.js +43 -0
  126. package/dist/adapters/runtime/shared-session-runtime-backend.d.ts +12 -0
  127. package/dist/adapters/runtime/shared-session-runtime-backend.js +64 -0
  128. package/dist/adapters/ui/auto-ui-snapshot-provider.d.ts +8 -0
  129. package/dist/adapters/ui/auto-ui-snapshot-provider.js +48 -0
  130. package/dist/adapters/ui/device-layout-temp.d.ts +6 -0
  131. package/dist/adapters/ui/device-layout-temp.js +18 -0
  132. package/dist/adapters/ui/device-ui-environment.d.ts +13 -0
  133. package/dist/adapters/ui/device-ui-environment.js +81 -0
  134. package/dist/adapters/ui/layout-normalization.d.ts +9 -0
  135. package/dist/adapters/ui/layout-normalization.js +44 -0
  136. package/dist/adapters/ui/ui-snapshot-error.d.ts +11 -0
  137. package/dist/adapters/ui/ui-snapshot-error.js +12 -0
  138. package/dist/adapters/ui/ui-snapshot-support.d.ts +15 -0
  139. package/dist/adapters/ui/ui-snapshot-support.js +12 -0
  140. package/dist/application/align/align-service.d.ts +42 -0
  141. package/dist/application/align/align-service.js +106 -0
  142. package/dist/application/assertion/expectation-evaluator.d.ts +18 -5
  143. package/dist/application/assertion/expectation-evaluator.js +156 -18
  144. package/dist/application/assertion/guarded-expectation.d.ts +45 -0
  145. package/dist/application/assertion/guarded-expectation.js +74 -0
  146. package/dist/application/checkpoint/baseline-capturer.d.ts +26 -0
  147. package/dist/application/checkpoint/baseline-capturer.js +163 -0
  148. package/dist/application/checkpoint/baseline-error.d.ts +5 -0
  149. package/dist/application/checkpoint/baseline-error.js +8 -0
  150. package/dist/application/checkpoint/baseline-service.d.ts +31 -0
  151. package/dist/application/checkpoint/baseline-service.js +147 -0
  152. package/dist/application/checkpoint/checkpoint-evaluator.d.ts +35 -0
  153. package/dist/application/checkpoint/checkpoint-evaluator.js +415 -0
  154. package/dist/application/checkpoint/regression-comparator.d.ts +18 -0
  155. package/dist/application/checkpoint/regression-comparator.js +192 -0
  156. package/dist/application/collector/logcat-collector.d.ts +22 -1
  157. package/dist/application/collector/logcat-collector.js +103 -15
  158. package/dist/application/collector/logcat-event.d.ts +8 -0
  159. package/dist/application/collector/logcat-event.js +79 -0
  160. package/dist/application/collector/logcat-stop.d.ts +2 -0
  161. package/dist/application/collector/logcat-stop.js +11 -0
  162. package/dist/application/context/context-generator.d.ts +45 -0
  163. package/dist/application/context/context-generator.js +228 -0
  164. package/dist/application/context/context-loader.d.ts +40 -0
  165. package/dist/application/context/context-loader.js +223 -0
  166. package/dist/application/context/context-refresher.d.ts +59 -0
  167. package/dist/application/context/context-refresher.js +349 -0
  168. package/dist/application/context/context-rehasher.d.ts +36 -0
  169. package/dist/application/context/context-rehasher.js +110 -0
  170. package/dist/application/context/context-validator.d.ts +23 -1
  171. package/dist/application/context/context-validator.js +116 -9
  172. package/dist/application/context/evidence-hash.d.ts +1 -0
  173. package/dist/application/context/evidence-hash.js +125 -0
  174. package/dist/application/context/evidence-match.d.ts +9 -0
  175. package/dist/application/context/evidence-match.js +8 -0
  176. package/dist/application/context/shard-identity.d.ts +2 -0
  177. package/dist/application/context/shard-identity.js +7 -0
  178. package/dist/application/contract/contract-loader.d.ts +25 -0
  179. package/dist/application/contract/contract-loader.js +68 -0
  180. package/dist/application/contract/contract-review.d.ts +25 -0
  181. package/dist/application/contract/contract-review.js +51 -0
  182. package/dist/application/contract/contract-verifier.d.ts +53 -0
  183. package/dist/application/contract/contract-verifier.js +645 -0
  184. package/dist/application/devices/resolve-device-assignments.d.ts +21 -0
  185. package/dist/application/devices/resolve-device-assignments.js +60 -0
  186. package/dist/application/diagnosis/failure-classifier.d.ts +23 -0
  187. package/dist/application/diagnosis/failure-classifier.js +179 -0
  188. package/dist/application/doctor/doctor-service.d.ts +36 -3
  189. package/dist/application/doctor/doctor-service.js +255 -25
  190. package/dist/application/generation/generation-app-preparer.d.ts +20 -0
  191. package/dist/application/generation/generation-app-preparer.js +28 -0
  192. package/dist/application/generation/generation-config-service.d.ts +21 -0
  193. package/dist/application/generation/generation-config-service.js +53 -0
  194. package/dist/application/generation/generation-confirmation-service.d.ts +14 -3
  195. package/dist/application/generation/generation-confirmation-service.js +109 -24
  196. package/dist/application/generation/generation-context-snapshot.d.ts +6 -0
  197. package/dist/application/generation/generation-context-snapshot.js +29 -0
  198. package/dist/application/generation/generation-finalizer.d.ts +15 -9
  199. package/dist/application/generation/generation-finalizer.js +167 -70
  200. package/dist/application/generation/generation-publisher.js +12 -8
  201. package/dist/application/generation/generation-recovery-service.d.ts +35 -0
  202. package/dist/application/generation/generation-recovery-service.js +144 -0
  203. package/dist/application/generation/generation-reopen-service.d.ts +15 -0
  204. package/dist/application/generation/generation-reopen-service.js +37 -0
  205. package/dist/application/generation/generation-replace-service.d.ts +32 -0
  206. package/dist/application/generation/generation-replace-service.js +116 -0
  207. package/dist/application/generation/generation-starter.d.ts +44 -4
  208. package/dist/application/generation/generation-starter.js +175 -8
  209. package/dist/application/generation/generation-step-executor.d.ts +67 -5
  210. package/dist/application/generation/generation-step-executor.js +471 -108
  211. package/dist/application/generation/proposed-step-validator.js +96 -30
  212. package/dist/application/generation/replay-policy-loader.d.ts +16 -0
  213. package/dist/application/generation/replay-policy-loader.js +29 -0
  214. package/dist/application/generation/risk-evaluator.d.ts +4 -1
  215. package/dist/application/generation/risk-evaluator.js +118 -3
  216. package/dist/application/generation/runtime-observer.d.ts +39 -7
  217. package/dist/application/generation/runtime-observer.js +193 -24
  218. package/dist/application/impact/impact-resolver.d.ts +32 -0
  219. package/dist/application/impact/impact-resolver.js +160 -0
  220. package/dist/application/init/init-service.js +26 -13
  221. package/dist/application/interaction/action-executor.d.ts +3 -2
  222. package/dist/application/interaction/action-executor.js +11 -1
  223. package/dist/application/interaction/action-target.d.ts +17 -0
  224. package/dist/application/interaction/action-target.js +40 -0
  225. package/dist/application/interaction/external-step-runner.d.ts +153 -0
  226. package/dist/application/interaction/external-step-runner.js +332 -0
  227. package/dist/application/interaction/fallback-resolver.d.ts +6 -3
  228. package/dist/application/interaction/fallback-resolver.js +7 -5
  229. package/dist/application/interaction/scroll-to-executor.d.ts +17 -3
  230. package/dist/application/interaction/scroll-to-executor.js +118 -36
  231. package/dist/application/journey/external-flow-resolver.d.ts +25 -0
  232. package/dist/application/journey/external-flow-resolver.js +22 -0
  233. package/dist/application/journey/journey-check-service.d.ts +54 -0
  234. package/dist/application/journey/journey-check-service.js +207 -0
  235. package/dist/application/journey/journey-promoter.d.ts +26 -0
  236. package/dist/application/journey/journey-promoter.js +123 -0
  237. package/dist/application/journey/journey-resolver.d.ts +42 -0
  238. package/dist/application/journey/journey-resolver.js +239 -0
  239. package/dist/application/journey/journey-retirer.d.ts +25 -0
  240. package/dist/application/journey/journey-retirer.js +87 -0
  241. package/dist/application/knowledge/anchor-resolver.d.ts +36 -0
  242. package/dist/application/knowledge/anchor-resolver.js +110 -0
  243. package/dist/application/knowledge/knowledge-loader.d.ts +16 -0
  244. package/dist/application/knowledge/knowledge-loader.js +36 -0
  245. package/dist/application/locator/layout-failure-summary.d.ts +2 -0
  246. package/dist/application/locator/layout-failure-summary.js +67 -0
  247. package/dist/application/locator/layout-traversal.d.ts +11 -0
  248. package/dist/application/locator/layout-traversal.js +18 -0
  249. package/dist/application/locator/locator-resolver.d.ts +13 -1
  250. package/dist/application/locator/locator-resolver.js +182 -18
  251. package/dist/application/observe/observe-service.d.ts +20 -0
  252. package/dist/application/observe/observe-service.js +91 -0
  253. package/dist/application/project/project-describer.d.ts +14 -6
  254. package/dist/application/project/project-describer.js +38 -5
  255. package/dist/application/recognition/screen-detector.d.ts +28 -0
  256. package/dist/application/recognition/screen-detector.js +111 -0
  257. package/dist/application/recorder/locator-selector.js +151 -17
  258. package/dist/application/recorder/recorder-service.d.ts +16 -4
  259. package/dist/application/recorder/recorder-service.js +420 -128
  260. package/dist/application/report/report-writer.js +1 -1
  261. package/dist/application/runtime/cold-launch.d.ts +28 -0
  262. package/dist/application/runtime/cold-launch.js +59 -0
  263. package/dist/application/runtime/step-runner.d.ts +49 -4
  264. package/dist/application/runtime/step-runner.js +721 -130
  265. package/dist/application/runtime/verify-runtime.d.ts +57 -7
  266. package/dist/application/runtime/verify-runtime.js +554 -174
  267. package/dist/application/ui/cached-ui-snapshot-provider.d.ts +45 -0
  268. package/dist/application/ui/cached-ui-snapshot-provider.js +111 -0
  269. package/dist/application/ui/ui-snapshot-lifecycle.d.ts +2 -0
  270. package/dist/application/ui/ui-snapshot-lifecycle.js +8 -0
  271. package/dist/application/ui/ui-stability-probe.d.ts +3 -0
  272. package/dist/application/ui/ui-stability-probe.js +8 -0
  273. package/dist/application/wait/idle-advice.d.ts +6 -0
  274. package/dist/application/wait/idle-advice.js +27 -0
  275. package/dist/application/wait/idle-profiles.d.ts +15 -0
  276. package/dist/application/wait/idle-profiles.js +75 -0
  277. package/dist/application/wait/idle-waiter.d.ts +28 -4
  278. package/dist/application/wait/idle-waiter.js +186 -15
  279. package/dist/cli/commands/align.d.ts +3 -0
  280. package/dist/cli/commands/align.js +124 -0
  281. package/dist/cli/commands/baseline.d.ts +3 -0
  282. package/dist/cli/commands/baseline.js +130 -0
  283. package/dist/cli/commands/context.js +300 -27
  284. package/dist/cli/commands/contract.d.ts +3 -0
  285. package/dist/cli/commands/contract.js +120 -0
  286. package/dist/cli/commands/doctor.js +16 -9
  287. package/dist/cli/commands/failure.d.ts +3 -0
  288. package/dist/cli/commands/failure.js +63 -0
  289. package/dist/cli/commands/generation/lifecycle-commands.d.ts +5 -0
  290. package/dist/cli/commands/generation/lifecycle-commands.js +211 -0
  291. package/dist/cli/commands/generation/session-commands.d.ts +11 -0
  292. package/dist/cli/commands/generation/session-commands.js +472 -0
  293. package/dist/cli/commands/generation/shared.d.ts +1414 -0
  294. package/dist/cli/commands/generation/shared.js +291 -0
  295. package/dist/cli/commands/generation/step-commands.d.ts +8 -0
  296. package/dist/cli/commands/generation/step-commands.js +315 -0
  297. package/dist/cli/commands/generation.js +10 -507
  298. package/dist/cli/commands/impact.d.ts +3 -0
  299. package/dist/cli/commands/impact.js +87 -0
  300. package/dist/cli/commands/init.js +13 -6
  301. package/dist/cli/commands/journey.d.ts +3 -0
  302. package/dist/cli/commands/journey.js +382 -0
  303. package/dist/cli/commands/knowledge.d.ts +3 -0
  304. package/dist/cli/commands/knowledge.js +93 -0
  305. package/dist/cli/commands/observe.d.ts +3 -0
  306. package/dist/cli/commands/observe.js +127 -0
  307. package/dist/cli/commands/project.js +2 -1
  308. package/dist/cli/commands/record.js +18 -5
  309. package/dist/cli/commands/verify.js +273 -63
  310. package/dist/cli/dependencies.d.ts +125 -1
  311. package/dist/cli/dependencies.js +450 -51
  312. package/dist/cli/diff-verification.d.ts +41 -0
  313. package/dist/cli/diff-verification.js +192 -0
  314. package/dist/cli/main.js +49 -1
  315. package/dist/cli/output.d.ts +5 -3
  316. package/dist/cli/output.js +12 -0
  317. package/dist/cli/program.js +19 -1
  318. package/dist/cli/project-root.d.ts +1 -0
  319. package/dist/cli/project-root.js +6 -0
  320. package/dist/cli/runtime-selection.d.ts +22 -0
  321. package/dist/cli/runtime-selection.js +92 -0
  322. package/dist/cli/version.d.ts +1 -0
  323. package/dist/cli/version.js +14 -0
  324. package/dist/cli/workspace-guard.d.ts +2 -0
  325. package/dist/cli/workspace-guard.js +3 -0
  326. package/dist/domain/binding-reference.d.ts +4 -0
  327. package/dist/domain/binding-reference.js +23 -0
  328. package/dist/domain/checkpoint.d.ts +404 -0
  329. package/dist/domain/checkpoint.js +297 -0
  330. package/dist/domain/config.d.ts +107 -1
  331. package/dist/domain/config.js +52 -6
  332. package/dist/domain/contract.d.ts +413 -0
  333. package/dist/domain/contract.js +196 -0
  334. package/dist/domain/external-flow.d.ts +493 -0
  335. package/dist/domain/external-flow.js +15 -0
  336. package/dist/domain/failure-classification.d.ts +176 -0
  337. package/dist/domain/failure-classification.js +169 -0
  338. package/dist/domain/failure.d.ts +2 -1
  339. package/dist/domain/failure.js +123 -0
  340. package/dist/domain/generation.d.ts +1671 -132
  341. package/dist/domain/generation.js +202 -13
  342. package/dist/domain/geometry.d.ts +13 -0
  343. package/dist/domain/geometry.js +16 -0
  344. package/dist/domain/impact.d.ts +71 -0
  345. package/dist/domain/impact.js +76 -0
  346. package/dist/domain/init.d.ts +12 -4
  347. package/dist/domain/init.js +24 -18
  348. package/dist/domain/journey-composition.d.ts +2285 -0
  349. package/dist/domain/journey-composition.js +85 -0
  350. package/dist/domain/journey-lifecycle.d.ts +10 -0
  351. package/dist/domain/journey-lifecycle.js +9 -0
  352. package/dist/domain/journey.d.ts +2419 -212
  353. package/dist/domain/journey.js +384 -14
  354. package/dist/domain/knowledge.d.ts +165 -0
  355. package/dist/domain/knowledge.js +188 -0
  356. package/dist/domain/layout.d.ts +34 -5
  357. package/dist/domain/layout.js +64 -6
  358. package/dist/domain/locator-evidence.d.ts +3 -0
  359. package/dist/domain/locator-evidence.js +36 -0
  360. package/dist/domain/logcat-event.d.ts +54 -0
  361. package/dist/domain/logcat-event.js +40 -0
  362. package/dist/domain/observation.d.ts +33 -0
  363. package/dist/domain/observation.js +18 -0
  364. package/dist/domain/project-context.d.ts +219 -1
  365. package/dist/domain/project-context.js +209 -6
  366. package/dist/domain/proposed-step.d.ts +340 -60
  367. package/dist/domain/proposed-step.js +23 -3
  368. package/dist/domain/report.d.ts +1455 -28
  369. package/dist/domain/report.js +211 -14
  370. package/dist/domain/runtime-snapshot.d.ts +58 -1
  371. package/dist/domain/runtime-snapshot.js +14 -3
  372. package/dist/domain/runtime.d.ts +50 -0
  373. package/dist/domain/runtime.js +36 -0
  374. package/dist/domain/system-app-profiles.d.ts +6 -0
  375. package/dist/domain/system-app-profiles.js +43 -0
  376. package/dist/domain/ui-backend.d.ts +28 -0
  377. package/dist/domain/ui-backend.js +33 -0
  378. package/dist/domain/ui-cache.d.ts +11 -0
  379. package/dist/domain/ui-cache.js +10 -0
  380. package/dist/domain/window-hierarchy.d.ts +84 -0
  381. package/dist/domain/window-hierarchy.js +172 -0
  382. package/dist/domain/workflow-manifest.d.ts +77 -0
  383. package/dist/domain/workflow-manifest.js +136 -0
  384. package/dist/domain/workspace.d.ts +28 -0
  385. package/dist/domain/workspace.js +72 -0
  386. package/dist/ports/adb.d.ts +34 -1
  387. package/dist/ports/align-prompt.d.ts +11 -0
  388. package/dist/ports/align-prompt.js +6 -0
  389. package/dist/ports/anchor-resolver.d.ts +30 -0
  390. package/dist/ports/anchor-resolver.js +1 -0
  391. package/dist/ports/annotated-screen-resolver.d.ts +4 -0
  392. package/dist/ports/annotated-screen-resolver.js +1 -0
  393. package/dist/ports/camera-probe.d.ts +23 -0
  394. package/dist/ports/camera-probe.js +8 -0
  395. package/dist/ports/context-document-writer.d.ts +24 -0
  396. package/dist/ports/context-document-writer.js +1 -0
  397. package/dist/ports/detached-process-launcher.d.ts +12 -0
  398. package/dist/ports/detached-process-launcher.js +1 -0
  399. package/dist/ports/external-flow-registry.d.ts +37 -0
  400. package/dist/ports/external-flow-registry.js +1 -0
  401. package/dist/ports/generation-prompt.d.ts +2 -1
  402. package/dist/ports/generation-session-store.d.ts +12 -2
  403. package/dist/ports/git-diff.d.ts +9 -0
  404. package/dist/ports/git-diff.js +1 -0
  405. package/dist/ports/journey-composition-store.d.ts +17 -0
  406. package/dist/ports/journey-composition-store.js +1 -0
  407. package/dist/ports/knowledge-registry.d.ts +20 -0
  408. package/dist/ports/knowledge-registry.js +1 -0
  409. package/dist/ports/process-runner.d.ts +7 -0
  410. package/dist/ports/project-file-inspector.d.ts +1 -0
  411. package/dist/ports/project-identity-inspector.d.ts +24 -0
  412. package/dist/ports/project-identity-inspector.js +1 -0
  413. package/dist/ports/project-inventory-inspector.d.ts +21 -0
  414. package/dist/ports/project-inventory-inspector.js +1 -0
  415. package/dist/ports/project-module-discoverer.d.ts +26 -0
  416. package/dist/ports/project-module-discoverer.js +1 -0
  417. package/dist/ports/recorder-prompt.d.ts +10 -1
  418. package/dist/ports/runtime-backend.d.ts +89 -0
  419. package/dist/ports/runtime-backend.js +13 -0
  420. package/dist/ports/runtime-capability.d.ts +12 -0
  421. package/dist/ports/runtime-capability.js +20 -0
  422. package/dist/ports/runtime-session-ports.d.ts +25 -0
  423. package/dist/ports/runtime-session-ports.js +1 -0
  424. package/dist/ports/screenshot.d.ts +11 -0
  425. package/dist/ports/screenshot.js +1 -0
  426. package/dist/ports/skill-installer.d.ts +2 -2
  427. package/dist/ports/ui-snapshot.d.ts +35 -0
  428. package/dist/ports/ui-snapshot.js +1 -0
  429. package/dist/ports/ui-stability.d.ts +19 -0
  430. package/dist/ports/ui-stability.js +1 -0
  431. package/dist/ports/workspace-layout.d.ts +4 -0
  432. package/dist/ports/workspace-layout.js +1 -0
  433. package/dist/shared/errors.d.ts +2 -0
  434. package/dist/shared/errors.js +22 -0
  435. package/dist/shared/paths.d.ts +2 -0
  436. package/dist/shared/paths.js +24 -0
  437. package/dist/shared/strings.d.ts +2 -0
  438. package/dist/shared/strings.js +16 -0
  439. package/package.json +6 -1
  440. package/assets/skills/taphound-ai-journey/GUIDE.md +0 -862
  441. package/assets/skills/taphound-ai-journey/SKILL.md +0 -377
  442. package/assets/skills/taphound-ai-journey/prompts/analyze-project.md +0 -526
  443. package/assets/skills/taphound-ai-journey/prompts/generate-step.md +0 -109
  444. package/assets/skills/taphound-ai-journey/schemas/project-context.json +0 -81
  445. package/assets/skills/taphound-ai-journey/templates/project-context.example.json +0 -49
  446. package/dist/ports/android-cli.d.ts +0 -21
  447. /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 configuredPackageName(dependencies, options) {
7
+ async function configuredConfig(dependencies, options) {
6
8
  try {
7
- return TapHoundConfigSchema.parse(await dependencies.readJson(resolve(options.project, options.config))).run.packageName;
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", "taphound.config.json")
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 packageName = await configuredPackageName(dependencies, options);
25
+ const config = await configuredConfig(dependencies, options);
23
26
  const report = await dependencies.doctor.run({
24
- ...(packageName === undefined ? {} : { packageName }),
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 (options.json === true) {
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 output = failureOutput(4, "INTERNAL_ERROR", errorMessage(error));
42
- if (options.json === true) {
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(4);
55
+ dependencies.setExitCode(exitCodeForFailure(code));
49
56
  }
50
57
  });
51
58
  }
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { CliDependencies } from "../dependencies.js";
3
+ export declare function createFailureCommand(dependencies: CliDependencies): Command;
@@ -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;