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
@@ -1,511 +1,7 @@
1
- import { resolve } from "node:path";
2
1
  import { Command } from "commander";
3
- import { z } from "zod";
4
- import { GenerationFinalizationError, GenerationOutputPathSchema } from "../../application/generation/generation-finalizer.js";
5
- import { GenerationOperationError } from "../../application/generation/generation-starter.js";
6
- import { TapHoundConfigSchema } from "../../domain/config.js";
7
- import { GenerationSessionIdSchema } from "../../domain/generation.js";
8
- import { ProjectContextSchema } from "../../domain/project-context.js";
9
- import { ProposedStepSchema } from "../../domain/proposed-step.js";
10
- import { RuntimeSnapshotSchema } from "../../domain/runtime-snapshot.js";
11
- import { GenerationSessionStoreError } from "../../ports/generation-session-store.js";
12
- import { GenerationPromptCancelledError } from "../../ports/generation-prompt.js";
13
- import { errorMessage, writeJson, writeLine } from "../output.js";
14
- const PlannerEnvelopeSchema = z.strictObject({
15
- version: z.literal(1),
16
- proposal: ProposedStepSchema,
17
- snapshot: RuntimeSnapshotSchema
18
- });
19
- const ManualActionSchema = z.enum([
20
- "click",
21
- "longClick",
22
- "inputText",
23
- "swipe",
24
- "scrollTo",
25
- "back",
26
- "wait"
27
- ]);
28
- function writeFailure(dependencies, options, exitCode, code, error) {
29
- const output = {
30
- status: "error",
31
- exitCode,
32
- failure: {
33
- code,
34
- message: errorMessage(error)
35
- }
36
- };
37
- if (options.json === true) {
38
- writeJson(dependencies.stdout, output);
39
- }
40
- else {
41
- writeLine(dependencies.stderr, output.failure.message);
42
- }
43
- dependencies.setExitCode(exitCode);
44
- }
45
- async function loadConfig(dependencies, options) {
46
- try {
47
- return TapHoundConfigSchema.parse(await dependencies.readJson(resolve(options.project, options.config)));
48
- }
49
- catch (error) {
50
- throw new GenerationOperationError("CONFIG_INVALID", errorMessage(error));
51
- }
52
- }
53
- function tools(checks) {
54
- return Object.fromEntries(checks.flatMap((check) => (check.status === "passed" && check.version !== undefined
55
- ? [[check.name, check.version]]
56
- : [])));
57
- }
58
- function writeSuccess(dependencies, options, output, message) {
59
- if (options.json === true) {
60
- writeJson(dependencies.stdout, output);
61
- }
62
- else {
63
- writeLine(dependencies.stdout, message);
64
- }
65
- dependencies.setExitCode(0);
66
- }
67
- function mappedFailure(dependencies, options, error) {
68
- if (error instanceof z.ZodError || error instanceof SyntaxError) {
69
- writeFailure(dependencies, options, 2, "CONTEXT_INVALID", error);
70
- return;
71
- }
72
- if (dependencies.signal?.aborted === true) {
73
- writeFailure(dependencies, options, 1, "RECOVERY_REQUIRED", "Generation command was cancelled");
74
- return;
75
- }
76
- if (error instanceof GenerationFinalizationError) {
77
- writeFailure(dependencies, options, 1, error.code, error);
78
- return;
79
- }
80
- if (error instanceof GenerationOperationError) {
81
- const exitCode = error.code === "CONFIG_INVALID"
82
- || error.code === "CONTEXT_INVALID"
83
- ? 2
84
- : 1;
85
- writeFailure(dependencies, options, exitCode, error.code, error);
86
- return;
87
- }
88
- if (error instanceof GenerationSessionStoreError) {
89
- const exitCode = error.code === "INVALID_ID"
90
- || error.code === "INVALID_SESSION"
91
- || error.code === "INVALID_REVISION"
92
- ? 2
93
- : error.code === "IO_ERROR" || error.code === "LOCK_TIMEOUT"
94
- ? 4
95
- : 1;
96
- writeFailure(dependencies, options, exitCode, error.code, error);
97
- return;
98
- }
99
- if (error instanceof GenerationPromptCancelledError) {
100
- writeFailure(dependencies, options, 1, "RECOVERY_REQUIRED", error);
101
- return;
102
- }
103
- if (error instanceof Error
104
- && error.message.includes("requires local TTY")) {
105
- writeFailure(dependencies, options, 1, "RISK_CONFIRMATION_REQUIRED", error);
106
- return;
107
- }
108
- writeFailure(dependencies, options, 4, "INTERNAL_ERROR", error);
109
- }
110
- async function executeApproved(dependencies, options, runtime, input) {
111
- const result = await runtime.executor.execute({
112
- ...input,
113
- ...(dependencies.signal === undefined
114
- ? {}
115
- : { signal: dependencies.signal })
116
- });
117
- if (result.status !== "succeeded") {
118
- writeFailure(dependencies, options, 1, result.failure.code, result.failure.message);
119
- return;
120
- }
121
- const session = await runtime.readSession(input.generationId);
122
- writeSuccess(dependencies, options, {
123
- status: "succeeded",
124
- exitCode: 0,
125
- generationId: input.generationId,
126
- revision: session.revision,
127
- stepIndex: session.candidateSteps.length - 1,
128
- step: result.step,
129
- source: input.source
130
- }, `Generation step ${String(session.candidateSteps.length - 1)} succeeded`);
131
- }
132
- function requireRuntime(dependencies, projectRoot, config) {
133
- if (dependencies.generationRuntime === undefined) {
134
- throw new Error("Generation command runtime is unavailable");
135
- }
136
- return dependencies.generationRuntime({ projectRoot, config });
137
- }
138
- async function assertRuntimeConfig(runtime, generationId) {
139
- await runtime.assertConfigIdentity(generationId);
140
- }
141
- function createStartCommand(dependencies) {
142
- return new Command("start")
143
- .description("Start a Core-owned generation session")
144
- .option("--project <path>", "Android project root", dependencies.cwd())
145
- .option("--config <path>", "TapHound config path", "taphound.config.json")
146
- .requiredOption("--context <path>", "Project Context path")
147
- .option("--device <serial>", "Select an online Android device")
148
- .option("--json", "Emit one machine-readable JSON value")
149
- .action(async (options) => {
150
- let config;
151
- try {
152
- config = TapHoundConfigSchema.parse(await dependencies.readJson(resolve(options.project, options.config)));
153
- }
154
- catch (error) {
155
- writeFailure(dependencies, options, 2, "CONFIG_INVALID", error);
156
- return;
157
- }
158
- let context;
159
- try {
160
- context = ProjectContextSchema.parse(await dependencies.readJson(resolve(options.project, options.context)));
161
- }
162
- catch (error) {
163
- writeFailure(dependencies, options, 2, "CONTEXT_INVALID", error);
164
- return;
165
- }
166
- try {
167
- const doctor = await dependencies.doctor.run({
168
- packageName: config.run.packageName,
169
- ...(options.device === undefined
170
- ? {}
171
- : { requestedDevice: options.device }),
172
- ...(dependencies.signal === undefined
173
- ? {}
174
- : { signal: dependencies.signal })
175
- });
176
- if (doctor.status === "failed") {
177
- writeFailure(dependencies, options, 3, doctor.failureCode ?? "ENVIRONMENT_MISSING_TOOL", doctor.checks.find((check) => check.status === "failed")?.message
178
- ?? "TapHound environment preflight failed");
179
- return;
180
- }
181
- const deviceSerial = options.device ?? doctor.deviceSerial;
182
- if (deviceSerial === undefined) {
183
- throw new Error("Doctor did not select a device");
184
- }
185
- const project = await dependencies.projectDescriber.describe({
186
- projectRoot: options.project,
187
- config,
188
- ...(dependencies.signal === undefined
189
- ? {}
190
- : { signal: dependencies.signal })
191
- });
192
- const session = await dependencies.generationStarter.start({
193
- projectRoot: options.project,
194
- config,
195
- context,
196
- project,
197
- deviceSerial
198
- });
199
- const output = {
200
- status: "started",
201
- exitCode: 0,
202
- generationId: session.id,
203
- revision: session.revision,
204
- bindings: session.bindings,
205
- variables: session.variables,
206
- target: session.target
207
- };
208
- if (options.json === true) {
209
- writeJson(dependencies.stdout, output);
210
- }
211
- else {
212
- writeLine(dependencies.stdout, `Generation started: ${session.id}`);
213
- }
214
- dependencies.setExitCode(0);
215
- }
216
- catch (error) {
217
- if (error instanceof GenerationOperationError) {
218
- const exitCode = error.code === "CONTEXT_STALE" ? 1 : 2;
219
- writeFailure(dependencies, options, exitCode, error.code, error);
220
- return;
221
- }
222
- mappedFailure(dependencies, options, error);
223
- }
224
- });
225
- }
226
- function createObserveCommand(dependencies) {
227
- return new Command("observe")
228
- .description("Observe and bind authoritative runtime state")
229
- .option("--project <path>", "Android project root", dependencies.cwd())
230
- .option("--config <path>", "TapHound config path", "taphound.config.json")
231
- .requiredOption("--session <id>", "Generation session id")
232
- .option("--json", "Emit one machine-readable JSON value")
233
- .action(async (options) => {
234
- try {
235
- const generationId = GenerationSessionIdSchema.parse(options.session);
236
- const config = await loadConfig(dependencies, options);
237
- const observation = dependencies.generationRuntime === undefined
238
- ? await dependencies.runtimeObserver.observe({
239
- projectRoot: options.project,
240
- generationId,
241
- ...(dependencies.signal === undefined
242
- ? {}
243
- : { signal: dependencies.signal })
244
- })
245
- : await (async () => {
246
- const runtime = requireRuntime(dependencies, options.project, config);
247
- await assertRuntimeConfig(runtime, generationId);
248
- return runtime.observer.observe({
249
- generationId,
250
- ...(dependencies.signal === undefined
251
- ? {}
252
- : { signal: dependencies.signal })
253
- });
254
- })();
255
- const output = {
256
- status: "observed",
257
- exitCode: 0,
258
- ...observation.binding,
259
- snapshot: observation.snapshot
260
- };
261
- if (options.json === true) {
262
- writeJson(dependencies.stdout, output);
263
- }
264
- else {
265
- writeLine(dependencies.stdout, `Generation observed at revision ${String(observation.binding.baseRevision)}`);
266
- }
267
- dependencies.setExitCode(0);
268
- }
269
- catch (error) {
270
- if (error instanceof GenerationOperationError) {
271
- mappedFailure(dependencies, options, error);
272
- return;
273
- }
274
- if (error instanceof GenerationSessionStoreError
275
- && (error.code === "REVISION_CONFLICT"
276
- || error.code === "INVALID_TRANSITION")) {
277
- writeFailure(dependencies, options, 1, "SNAPSHOT_STALE", error);
278
- return;
279
- }
280
- mappedFailure(dependencies, options, error);
281
- }
282
- });
283
- }
284
- function addCommonOptions(command, dependencies) {
285
- return command
286
- .option("--project <path>", "Android project root", dependencies.cwd())
287
- .option("--config <path>", "TapHound config path", "taphound.config.json")
288
- .requiredOption("--session <id>", "Generation session id")
289
- .option("--json", "Emit one machine-readable JSON value");
290
- }
291
- function createStepCommand(dependencies) {
292
- return addCommonOptions(new Command("step")
293
- .description("Accept and execute one strict planner proposal")
294
- .requiredOption("--input <path>", "Strict proposal envelope path"), dependencies).action(async (options) => {
295
- try {
296
- const generationId = GenerationSessionIdSchema.parse(options.session);
297
- const config = await loadConfig(dependencies, options);
298
- const runtime = requireRuntime(dependencies, options.project, config);
299
- await assertRuntimeConfig(runtime, generationId);
300
- let envelope;
301
- try {
302
- envelope = PlannerEnvelopeSchema.parse(await dependencies.readJson(resolve(options.project, options.input)));
303
- }
304
- catch (error) {
305
- throw new GenerationOperationError("CONTEXT_INVALID", errorMessage(error));
306
- }
307
- const confirmation = await runtime.confirmation.request({
308
- generationId,
309
- proposal: envelope.proposal,
310
- snapshot: envelope.snapshot,
311
- source: "planner"
312
- });
313
- if (confirmation.status === "confirmationRequired") {
314
- const session = await runtime.readSession(generationId);
315
- writeSuccess(dependencies, options, {
316
- status: "confirmationRequired",
317
- exitCode: 0,
318
- generationId,
319
- revision: session.revision,
320
- challenge: confirmation.challenge
321
- }, `Confirmation required: ${confirmation.challenge.challengeId}`);
322
- return;
323
- }
324
- await executeApproved(dependencies, options, runtime, {
325
- generationId,
326
- proposal: confirmation.proposal,
327
- snapshot: envelope.snapshot,
328
- source: "planner"
329
- });
330
- }
331
- catch (error) {
332
- mappedFailure(dependencies, options, error);
333
- }
334
- });
335
- }
336
- function createConfirmCommand(dependencies) {
337
- return addCommonOptions(new Command("confirm")
338
- .description("Approve and execute Core-owned challenge evidence")
339
- .requiredOption("--challenge <id>", "Core confirmation challenge id"), dependencies).action(async (options) => {
340
- try {
341
- const generationId = GenerationSessionIdSchema.parse(options.session);
342
- const challengeId = GenerationSessionIdSchema.parse(options.challenge);
343
- const config = await loadConfig(dependencies, options);
344
- const runtime = requireRuntime(dependencies, options.project, config);
345
- await assertRuntimeConfig(runtime, generationId);
346
- const approved = await runtime.confirmation.confirmStored({
347
- generationId,
348
- challengeId,
349
- ...(dependencies.signal === undefined
350
- ? {}
351
- : { signal: dependencies.signal })
352
- });
353
- await executeApproved(dependencies, options, runtime, {
354
- generationId,
355
- proposal: approved.proposal,
356
- snapshot: approved.snapshot,
357
- source: approved.source
358
- });
359
- }
360
- catch (error) {
361
- mappedFailure(dependencies, options, error);
362
- }
363
- });
364
- }
365
- function createManualCommand(dependencies) {
366
- return addCommonOptions(new Command("manual")
367
- .description("Build one local TTY manual override proposal")
368
- .requiredOption("--action <action>", "Exact ProposedStep action"), dependencies).action(async (options) => {
369
- try {
370
- const generationId = GenerationSessionIdSchema.parse(options.session);
371
- const action = ManualActionSchema.parse(options.action);
372
- const config = await loadConfig(dependencies, options);
373
- const runtime = requireRuntime(dependencies, options.project, config);
374
- await assertRuntimeConfig(runtime, generationId);
375
- const existing = await runtime.confirmation.findPendingManual({
376
- generationId,
377
- action
378
- });
379
- if (existing !== null) {
380
- const session = await runtime.readSession(generationId);
381
- writeSuccess(dependencies, options, {
382
- status: "confirmationRequired",
383
- exitCode: 0,
384
- generationId,
385
- revision: session.revision,
386
- challenge: existing.challenge
387
- }, `Confirmation required: ${existing.challenge.challengeId}`);
388
- return;
389
- }
390
- const observation = await runtime.observer.observe({
391
- generationId,
392
- ...(dependencies.signal === undefined
393
- ? {}
394
- : { signal: dependencies.signal })
395
- });
396
- const confirmation = await runtime.confirmation.requestManual({
397
- generationId,
398
- snapshot: observation.snapshot,
399
- manual: {
400
- action,
401
- binding: observation.binding,
402
- before: observation.snapshot.activity,
403
- layout: observation.snapshot.layout
404
- },
405
- ...(dependencies.signal === undefined
406
- ? {}
407
- : { signal: dependencies.signal })
408
- });
409
- if (confirmation.status === "confirmationRequired") {
410
- const session = await runtime.readSession(generationId);
411
- writeSuccess(dependencies, options, {
412
- status: "confirmationRequired",
413
- exitCode: 0,
414
- generationId,
415
- revision: session.revision,
416
- challenge: confirmation.challenge
417
- }, `Confirmation required: ${confirmation.challenge.challengeId}`);
418
- return;
419
- }
420
- await executeApproved(dependencies, options, runtime, {
421
- generationId,
422
- proposal: confirmation.proposal,
423
- snapshot: observation.snapshot,
424
- source: "manualOverride"
425
- });
426
- }
427
- catch (error) {
428
- mappedFailure(dependencies, options, error);
429
- }
430
- });
431
- }
432
- function createFinalizeCommand(dependencies) {
433
- return addCommonOptions(new Command("finalize")
434
- .description("Verify and publish a generated Journey")
435
- .requiredOption("--context <path>", "Project Context path")
436
- .requiredOption("--output <path>", "Project-relative Journey output")
437
- .option("--name <name>", "Generated Journey name")
438
- .option("--device <serial>", "Select an online Android device"), dependencies).action(async (options) => {
439
- try {
440
- const generationId = GenerationSessionIdSchema.parse(options.session);
441
- const config = await loadConfig(dependencies, options);
442
- let context;
443
- try {
444
- context = ProjectContextSchema.parse(await dependencies.readJson(resolve(options.project, options.context)));
445
- }
446
- catch (error) {
447
- throw new GenerationOperationError("CONTEXT_INVALID", errorMessage(error));
448
- }
449
- const outputPath = GenerationOutputPathSchema.parse(options.output);
450
- const name = options.name === undefined
451
- ? undefined
452
- : z.string().trim().min(1).parse(options.name);
453
- const doctor = await dependencies.doctor.run({
454
- packageName: config.run.packageName,
455
- ...(options.device === undefined
456
- ? {}
457
- : { requestedDevice: options.device }),
458
- ...(dependencies.signal === undefined
459
- ? {}
460
- : { signal: dependencies.signal })
461
- });
462
- if (doctor.status === "failed") {
463
- writeFailure(dependencies, options, 3, doctor.failureCode ?? "ENVIRONMENT_MISSING_TOOL", doctor.checks.find((check) => check.status === "failed")?.message
464
- ?? "TapHound environment preflight failed");
465
- return;
466
- }
467
- const deviceSerial = options.device ?? doctor.deviceSerial;
468
- if (deviceSerial === undefined) {
469
- writeFailure(dependencies, options, 3, "DEVICE_UNAVAILABLE", "Doctor did not select a device");
470
- return;
471
- }
472
- const project = await dependencies.projectDescriber.describe({
473
- projectRoot: options.project,
474
- config,
475
- ...(dependencies.signal === undefined
476
- ? {}
477
- : { signal: dependencies.signal })
478
- });
479
- const runtime = requireRuntime(dependencies, options.project, config);
480
- const result = await runtime.finalizer.finalize({
481
- generationId,
482
- projectRoot: options.project,
483
- config,
484
- context,
485
- project,
486
- outputPath,
487
- ...(name === undefined ? {} : { name }),
488
- deviceSerial,
489
- toolVersions: tools(doctor.checks),
490
- ...(dependencies.signal === undefined
491
- ? {}
492
- : { signal: dependencies.signal })
493
- });
494
- writeSuccess(dependencies, options, {
495
- status: "verified",
496
- exitCode: 0,
497
- generationId,
498
- bundlePath: result.bundlePath,
499
- journeyPath: result.journeyPath,
500
- metaPath: result.metaPath,
501
- replayed: result.replayed
502
- }, `Generation verified: ${result.journeyPath}`);
503
- }
504
- catch (error) {
505
- mappedFailure(dependencies, options, error);
506
- }
507
- });
508
- }
2
+ import { createFinalizeCommand, createRecoverCommand, createReopenCommand } from "./generation/lifecycle-commands.js";
3
+ import { createArchiveCommand, createConfigCommand, createListCommand, createObserveCommand, createStartCommand, createStatusCommand } from "./generation/session-commands.js";
4
+ import { createBridgeCommand, createConfirmCommand, createManualCommand, createStepCommand } from "./generation/step-commands.js";
509
5
  export function createGenerationCommand(dependencies) {
510
6
  return new Command("generation")
511
7
  .description("Manage deterministic generation sessions")
@@ -514,5 +10,12 @@ export function createGenerationCommand(dependencies) {
514
10
  .addCommand(createStepCommand(dependencies))
515
11
  .addCommand(createConfirmCommand(dependencies))
516
12
  .addCommand(createManualCommand(dependencies))
13
+ .addCommand(createBridgeCommand(dependencies))
14
+ .addCommand(createStatusCommand(dependencies))
15
+ .addCommand(createRecoverCommand(dependencies))
16
+ .addCommand(createReopenCommand(dependencies))
17
+ .addCommand(createArchiveCommand(dependencies))
18
+ .addCommand(createConfigCommand(dependencies))
19
+ .addCommand(createListCommand(dependencies))
517
20
  .addCommand(createFinalizeCommand(dependencies));
518
21
  }
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { CliDependencies } from "../dependencies.js";
3
+ export declare function createImpactCommand(dependencies: CliDependencies): Command;
@@ -0,0 +1,87 @@
1
+ import { resolve } from "node:path";
2
+ import { Command } from "commander";
3
+ import { TapHoundConfigSchema } from "../../domain/config.js";
4
+ import { CONFIG_PATH } from "../../domain/workspace.js";
5
+ import { exitCodeForFailure, failureCodeFromUnknown } from "../../domain/failure.js";
6
+ import { failureOutput, writeJson, writeLine } from "../output.js";
7
+ function summarize(impact) {
8
+ const lines = [
9
+ `TapHound impact: ${impact.base}...${impact.head}`,
10
+ `affected modules: ${impact.affectedModules.join(", ") || "(none)"}`,
11
+ `affected features: ${impact.affectedFeatures.join(", ") || "(none)"}`,
12
+ `affected screens: ${impact.affectedScreens.join(", ") || "(none)"}`,
13
+ `affected anchors: ${impact.affectedAnchors.join(", ") || "(none)"}`,
14
+ "[P0]",
15
+ ...impact.selectedJourneys.p0.map((entry) => ` ${entry.id} — ${entry.reason}`),
16
+ "[P1]",
17
+ ...impact.selectedJourneys.p1.map((entry) => ` ${entry.id} — ${entry.reason}`),
18
+ "[P2]",
19
+ ...impact.selectedJourneys.p2.map((entry) => ` ${entry.id} — ${entry.reason}`),
20
+ "skipped",
21
+ ...impact.skippedJourneys.map((entry) => ` ${entry.id} — ${entry.reason}`)
22
+ ];
23
+ return lines.join("\n");
24
+ }
25
+ function writeFailure(dependencies, json, code, message) {
26
+ const exitCode = exitCodeForFailure(code);
27
+ const output = failureOutput(exitCode, code, message);
28
+ if (json) {
29
+ writeJson(dependencies.stdout, output);
30
+ }
31
+ else {
32
+ writeLine(dependencies.stderr, output.failure.message);
33
+ }
34
+ dependencies.setExitCode(exitCode);
35
+ }
36
+ export function createImpactCommand(dependencies) {
37
+ return new Command("impact")
38
+ .description("Compute which Knowledge and Journeys a Git change affects")
39
+ .option("--project <path>", "Android project root", dependencies.cwd())
40
+ .option("--config <path>", "TapHound config path", CONFIG_PATH)
41
+ .option("--base <ref>", "Base Git ref", "origin/main")
42
+ .option("--head <ref>", "Head Git ref, or WORKTREE for uncommitted changes", "HEAD")
43
+ .option("--json", "Emit one machine-readable JSON value")
44
+ .action(async (options) => {
45
+ try {
46
+ if (dependencies.gitDiff === undefined
47
+ || dependencies.impact === undefined) {
48
+ throw new Error("TapHound impact is not configured");
49
+ }
50
+ const config = TapHoundConfigSchema.parse(await dependencies.readJson(resolve(options.project, options.config)));
51
+ const changeSet = await dependencies.gitDiff.diff({
52
+ projectRoot: options.project,
53
+ base: options.base,
54
+ head: options.head ?? "HEAD"
55
+ });
56
+ const impact = await dependencies.impact.resolve({
57
+ projectRoot: options.project,
58
+ packageName: config.run.packageName,
59
+ changeSet
60
+ });
61
+ if (options.json === true) {
62
+ writeJson(dependencies.stdout, impact);
63
+ }
64
+ else {
65
+ writeLine(dependencies.stdout, summarize(impact));
66
+ }
67
+ }
68
+ catch (error) {
69
+ const message = error instanceof Error
70
+ ? error.message
71
+ : String(error);
72
+ const code = failureCodeFromUnknown(error);
73
+ if (code !== undefined) {
74
+ writeFailure(dependencies, options.json === true, code, message);
75
+ return;
76
+ }
77
+ const output = failureOutput(2, "CONFIG_INVALID", message);
78
+ if (options.json === true) {
79
+ writeJson(dependencies.stdout, output);
80
+ }
81
+ else {
82
+ writeLine(dependencies.stderr, output.failure.message);
83
+ }
84
+ dependencies.setExitCode(2);
85
+ }
86
+ });
87
+ }
@@ -1,5 +1,5 @@
1
1
  import { Command } from "commander";
2
- import { SkillPayloadMissingError } from "../../adapters/filesystem/skill-installer.js";
2
+ import { SkillPayloadMissingError, NoSkillsFoundError } from "../../adapters/filesystem/skill-installer.js";
3
3
  import { NoAgentsSelectedError, UnknownAgentError, parseAgentIds } from "../../domain/init.js";
4
4
  import { InitPromptCancelledError } from "../../ports/init-prompt.js";
5
5
  import { errorMessage, writeJson, writeLine } from "../output.js";
@@ -26,10 +26,13 @@ function writeInitSuccess(dependencies, options, result) {
26
26
  }
27
27
  else {
28
28
  const agentList = result.agents.join(", ");
29
- const pathList = result.paths.join("\n ");
30
- let message = `Installed TapHound Skill for: ${agentList}\n ${pathList}`;
31
- if (result.skipped !== undefined && result.skipped.length > 0) {
32
- message += `\n Skipped (already installed): ${result.skipped.join(", ")}`;
29
+ let message = `Installed TapHound Skills for: ${agentList}`;
30
+ for (const skill of result.skills) {
31
+ const pathList = skill.paths.join("\n ");
32
+ message += `\n ${skill.name}:\n ${pathList}`;
33
+ if (skill.skipped !== undefined && skill.skipped.length > 0) {
34
+ message += `\n Skipped (already installed): ${skill.skipped.join(", ")}`;
35
+ }
33
36
  }
34
37
  writeLine(dependencies.stdout, message);
35
38
  }
@@ -37,7 +40,7 @@ function writeInitSuccess(dependencies, options, result) {
37
40
  }
38
41
  export function createInitCommand(dependencies) {
39
42
  return new Command("init")
40
- .description("Install the TapHound AI Journey Skill for AI agents")
43
+ .description("Install TapHound Skills for AI agents")
41
44
  .option("--global", "Install to user-level directories instead of project-level")
42
45
  .option("--agent <ids>", "Comma-separated agent IDs (non-interactive)")
43
46
  .option("--json", "Emit one machine-readable JSON value")
@@ -94,6 +97,10 @@ export function createInitCommand(dependencies) {
94
97
  writeInitFailure(dependencies, options, 2, "SKILL_PAYLOAD_MISSING", error);
95
98
  return;
96
99
  }
100
+ if (error instanceof NoSkillsFoundError) {
101
+ writeInitFailure(dependencies, options, 2, "NO_SKILLS_FOUND", error);
102
+ return;
103
+ }
97
104
  if (error instanceof NoAgentsSelectedError) {
98
105
  writeInitFailure(dependencies, options, 2, "NO_AGENTS_SELECTED", error);
99
106
  return;
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ import type { CliDependencies } from "../dependencies.js";
3
+ export declare function createJourneyCommand(dependencies: CliDependencies): Command;