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,192 @@
1
+ import { resolve } from "node:path";
2
+ import { TapHoundConfigSchema } from "../domain/config.js";
3
+ import { DEFAULT_DEVICE_ROLE, JourneySchema } from "../domain/journey.js";
4
+ import { assertArtifactDirectory, CONFIG_PATH } from "../domain/workspace.js";
5
+ import { exitCodeForFailure, failureCodeFromUnknown } from "../domain/failure.js";
6
+ import { errorMessage, failureOutput, writeJson, writeLine } from "./output.js";
7
+ import { prepareWorkspace } from "./workspace-guard.js";
8
+ function selectedScopes(scope) {
9
+ const normalized = scope ?? "p0,p1";
10
+ const tiers = [];
11
+ for (const token of normalized.split(",").map((value) => value.trim())) {
12
+ if (token === "p0" || token === "p1" || token === "p2") {
13
+ tiers.push(token);
14
+ }
15
+ }
16
+ return tiers;
17
+ }
18
+ function toolVersions(checks) {
19
+ return Object.fromEntries(checks.flatMap((check) => (check.version === undefined
20
+ || !["node", "adb", "android"].includes(check.name)
21
+ ? []
22
+ : [[check.name, check.version]])));
23
+ }
24
+ function writeFailure(dependencies, json, code, message) {
25
+ const exitCode = exitCodeForFailure(code);
26
+ const output = failureOutput(exitCode, code, message);
27
+ if (json) {
28
+ writeJson(dependencies.stdout, output);
29
+ }
30
+ else {
31
+ writeLine(dependencies.stderr, output.failure.message);
32
+ }
33
+ dependencies.setExitCode(exitCode);
34
+ }
35
+ /**
36
+ * Diff-driven verification: compute the ImpactSet for a Git change, select
37
+ * the affected Journeys by tier (p0/p1/p2), and verify each one on the
38
+ * connected device.
39
+ *
40
+ * This is the Agent-facing entry behind `verify --diff`; it never parses the app's internals — the Coding Agent
41
+ * only sees Journey names + verdicts.
42
+ */
43
+ export async function runDiffVerification(dependencies, options) {
44
+ try {
45
+ if (dependencies.gitDiff === undefined
46
+ || dependencies.impact === undefined) {
47
+ throw new Error("TapHound change verification is not configured");
48
+ }
49
+ const head = options.head ?? "HEAD";
50
+ const projectRoot = options.project;
51
+ const config = TapHoundConfigSchema.parse(await dependencies.readJson(resolve(projectRoot, options.config)));
52
+ assertArtifactDirectory(projectRoot, config.artifactsDir);
53
+ await prepareWorkspace(dependencies, projectRoot);
54
+ const changeSet = await dependencies.gitDiff.diff({
55
+ projectRoot,
56
+ base: options.base,
57
+ head
58
+ });
59
+ const impact = await dependencies.impact.resolve({
60
+ projectRoot,
61
+ packageName: config.run.packageName,
62
+ changeSet
63
+ });
64
+ const scopes = selectedScopes(options.scope);
65
+ const selected = scopes.flatMap((tier) => (impact.selectedJourneys[tier].map((entry) => ({
66
+ tier,
67
+ path: entry.id
68
+ }))));
69
+ const doctor = await dependencies.doctor.run({
70
+ packageName: config.run.packageName,
71
+ ...(config.ui?.backend === undefined
72
+ ? {}
73
+ : { requestedUiBackend: config.ui.backend }),
74
+ ...(options.device === undefined
75
+ ? {}
76
+ : { requestedDevice: options.device }),
77
+ ...(dependencies.signal === undefined
78
+ ? {}
79
+ : { signal: dependencies.signal })
80
+ });
81
+ if (doctor.status === "failed") {
82
+ const output = failureOutput(3, doctor.failureCode ?? "ENVIRONMENT_MISSING_TOOL", doctor.checks.find((check) => check.status === "failed")?.message
83
+ ?? "TapHound environment preflight failed");
84
+ if (options.json === true) {
85
+ writeJson(dependencies.stdout, output);
86
+ }
87
+ else {
88
+ writeLine(dependencies.stderr, output.failure.message);
89
+ }
90
+ dependencies.setExitCode(3);
91
+ return;
92
+ }
93
+ const deviceSerial = options.device ?? doctor.deviceSerial;
94
+ if (deviceSerial === undefined) {
95
+ throw new Error("Doctor did not select a device");
96
+ }
97
+ if (dependencies.journeyCompositionStore === undefined) {
98
+ throw new Error("TapHound change verification is not configured");
99
+ }
100
+ const results = [];
101
+ for (const entry of selected) {
102
+ const bytes = await dependencies.journeyCompositionStore.read({
103
+ projectRoot,
104
+ relativePath: entry.path
105
+ });
106
+ const journey = JourneySchema.parse(JSON.parse(bytes.toString("utf8")));
107
+ if (journey.devices.length > 1) {
108
+ writeFailure(dependencies, options.json === true, "DEVICE_ROLE_UNMAPPED", `Journey ${journey.name} declares multiple devices; map each role with --device <role>=<serial>`);
109
+ return;
110
+ }
111
+ writeLine(dependencies.stderr, `TapHound: verifying ${journey.name} (${entry.tier})`);
112
+ const result = await dependencies.verifier.verify({
113
+ config,
114
+ journey,
115
+ projectRoot,
116
+ devices: [{
117
+ role: journey.devices[0]?.role ?? DEFAULT_DEVICE_ROLE,
118
+ deviceSerial
119
+ }],
120
+ toolVersions: toolVersions(doctor.checks),
121
+ manualReplay: process.stdin.isTTY,
122
+ ...(dependencies.signal === undefined
123
+ ? {}
124
+ : { signal: dependencies.signal })
125
+ });
126
+ results.push({
127
+ path: entry.path,
128
+ name: journey.name,
129
+ selection: entry.tier,
130
+ status: result.status,
131
+ exitCode: result.exitCode,
132
+ reportPath: result.reportPath
133
+ });
134
+ }
135
+ const failed = results.find((result) => result.status !== "passed");
136
+ let overall;
137
+ let note;
138
+ if (changeSet.files.length === 0) {
139
+ overall = "passed";
140
+ note = "No changes; nothing to verify";
141
+ }
142
+ else {
143
+ overall = results.length === 0
144
+ ? "error"
145
+ : failed === undefined
146
+ ? "passed"
147
+ : "failed";
148
+ }
149
+ const exitCode = results.length === 0
150
+ ? (changeSet.files.length === 0 ? 0 : 4)
151
+ : failed === undefined
152
+ ? 0
153
+ : failed.exitCode;
154
+ const payload = {
155
+ base: options.base,
156
+ head,
157
+ impact,
158
+ results,
159
+ overall,
160
+ exitCode,
161
+ ...(note === undefined ? {} : { note })
162
+ };
163
+ if (options.json === true) {
164
+ writeJson(dependencies.stdout, payload);
165
+ }
166
+ else {
167
+ const lines = [
168
+ `TapHound verify (${options.base}...${head}):`,
169
+ ...results.map((result) => (` ${result.selection.toUpperCase()} ${result.name}: ${result.status.toUpperCase()}`)),
170
+ `overall: ${overall.toUpperCase()}`
171
+ ];
172
+ writeLine(dependencies.stdout, lines.join("\n"));
173
+ }
174
+ dependencies.setExitCode(exitCode);
175
+ }
176
+ catch (error) {
177
+ const code = failureCodeFromUnknown(error);
178
+ if (code !== undefined) {
179
+ writeFailure(dependencies, options.json === true, code, errorMessage(error));
180
+ return;
181
+ }
182
+ const output = failureOutput(4, "INTERNAL_ERROR", errorMessage(error));
183
+ if (options.json === true) {
184
+ writeJson(dependencies.stdout, output);
185
+ }
186
+ else {
187
+ writeLine(dependencies.stderr, output.failure.message);
188
+ }
189
+ dependencies.setExitCode(4);
190
+ }
191
+ }
192
+ export { CONFIG_PATH, writeFailure };
package/dist/cli/main.js CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { realpathSync } from "node:fs";
3
+ import { readFile } from "node:fs/promises";
3
4
  import { resolve } from "node:path";
4
5
  import { pathToFileURL } from "node:url";
5
6
  import { CommanderError } from "commander";
6
7
  import { createProductionDependencies } from "./dependencies.js";
8
+ import { RuntimeBackendConfigError, RuntimeBackendSelectionError, resolveRuntimeBackendChoiceFromInvocation } from "./runtime-selection.js";
7
9
  import { errorMessage, failureOutput, writeJson, writeLine } from "./output.js";
8
10
  import { createProgram } from "./program.js";
9
11
  export async function withTerminationSignal(operation, source = process) {
@@ -69,5 +71,51 @@ export async function runMain(argv, dependencies = createProductionDependencies(
69
71
  const entryPath = process.argv[1];
70
72
  if (entryPath !== undefined
71
73
  && import.meta.url === pathToFileURL(realpathSync(resolve(entryPath))).href) {
72
- await withTerminationSignal((signal) => runMain(process.argv, createProductionDependencies(signal)));
74
+ await withTerminationSignal(async (signal) => {
75
+ let dependencies;
76
+ try {
77
+ dependencies = createProductionDependencies(signal, {
78
+ runtimeBackendChoice: await resolveRuntimeBackendChoiceFromInvocation({
79
+ env: process.env,
80
+ argv: process.argv,
81
+ cwd: process.cwd(),
82
+ readConfigFile: (path) => readFile(path, "utf8")
83
+ })
84
+ });
85
+ }
86
+ catch (error) {
87
+ if (error instanceof RuntimeBackendSelectionError
88
+ || error instanceof RuntimeBackendConfigError) {
89
+ const output = failureOutput(2, "CONFIG_INVALID", error.message);
90
+ if (process.argv.includes("--json")) {
91
+ writeJson({
92
+ write: (content) => {
93
+ process.stdout.write(content);
94
+ }
95
+ }, output);
96
+ }
97
+ else {
98
+ writeLine({
99
+ write: (content) => {
100
+ process.stderr.write(content);
101
+ }
102
+ }, output.failure.message);
103
+ }
104
+ process.exitCode = 2;
105
+ return;
106
+ }
107
+ throw error;
108
+ }
109
+ try {
110
+ await runMain(process.argv, dependencies);
111
+ }
112
+ finally {
113
+ try {
114
+ await dependencies.close?.();
115
+ }
116
+ catch (error) {
117
+ process.stderr.write(`TapHound: failed to release the runtime backend: ${errorMessage(error)}\n`);
118
+ }
119
+ }
120
+ });
73
121
  }
@@ -1,9 +1,10 @@
1
1
  import type { DoctorReport } from "../application/doctor/doctor-service.js";
2
- import type { FailureCode } from "../domain/failure.js";
2
+ import type { ContextLoadError } from "../application/context/context-loader.js";
3
+ import type { FailureCode, TapHoundExitCode } from "../domain/failure.js";
3
4
  import type { TextOutput } from "./dependencies.js";
4
5
  export interface CliFailureOutput {
5
6
  status: "error";
6
- exitCode: 2 | 3 | 4;
7
+ exitCode: TapHoundExitCode;
7
8
  failure: {
8
9
  code: FailureCode;
9
10
  message: string;
@@ -11,6 +12,7 @@ export interface CliFailureOutput {
11
12
  }
12
13
  export declare function writeJson(output: TextOutput, value: unknown): void;
13
14
  export declare function writeLine(output: TextOutput, value: string): void;
14
- export declare function failureOutput(exitCode: 2 | 3 | 4, code: FailureCode, message: string): CliFailureOutput;
15
+ export declare function failureOutput(exitCode: TapHoundExitCode, code: FailureCode, message: string): CliFailureOutput;
15
16
  export declare function doctorMessage(report: DoctorReport): string;
16
17
  export declare function errorMessage(error: unknown): string;
18
+ export declare function contextLoadHint(error: ContextLoadError): string | undefined;
@@ -20,3 +20,15 @@ export function doctorMessage(report) {
20
20
  export function errorMessage(error) {
21
21
  return error instanceof Error ? error.message : String(error);
22
22
  }
23
+ export function contextLoadHint(error) {
24
+ if (error.code !== "CONTEXT_INVALID"
25
+ || (!error.message.includes("index does not exist")
26
+ && !error.message.includes("shard does not exist"))) {
27
+ return undefined;
28
+ }
29
+ return "Project Context is missing at the resolved path. Generate the "
30
+ + "committed Context first with `taphound context generate`, or pass "
31
+ + "--context with an explicit index path. For a registered local "
32
+ + "target, run `taphound local sync <id>` before retrying. See "
33
+ + "docs/agent-integration.md and docs/local-target.md.";
34
+ }
@@ -1,11 +1,20 @@
1
1
  import { Command } from "commander";
2
+ import { readCliVersion } from "./version.js";
2
3
  import { createContextCommand } from "./commands/context.js";
3
4
  import { createDoctorCommand } from "./commands/doctor.js";
4
5
  import { createGenerationCommand } from "./commands/generation.js";
5
6
  import { createInitCommand } from "./commands/init.js";
7
+ import { createJourneyCommand } from "./commands/journey.js";
8
+ import { createObserveCommand } from "./commands/observe.js";
6
9
  import { createProjectCommand } from "./commands/project.js";
7
10
  import { createRecordCommand } from "./commands/record.js";
8
11
  import { createVerifyCommand } from "./commands/verify.js";
12
+ import { createContractCommand } from "./commands/contract.js";
13
+ import { createAlignCommand } from "./commands/align.js";
14
+ import { createImpactCommand } from "./commands/impact.js";
15
+ import { createKnowledgeCommand } from "./commands/knowledge.js";
16
+ import { createBaselineCommand } from "./commands/baseline.js";
17
+ import { createFailureCommand } from "./commands/failure.js";
9
18
  import { createProductionDependencies } from "./dependencies.js";
10
19
  export function createProgram(dependencies = createProductionDependencies()) {
11
20
  const configureOutput = (command) => {
@@ -25,6 +34,7 @@ export function createProgram(dependencies = createProductionDependencies()) {
25
34
  return new Command()
26
35
  .name("taphound")
27
36
  .description("Deterministic app journey recording and verification")
37
+ .version(readCliVersion(), "-v, --version")
28
38
  .configureOutput({
29
39
  writeOut: (content) => {
30
40
  dependencies.stdout.write(content);
@@ -36,8 +46,16 @@ export function createProgram(dependencies = createProductionDependencies()) {
36
46
  .addCommand(configureOutput(createDoctorCommand(dependencies)))
37
47
  .addCommand(configureOutput(createRecordCommand(dependencies)))
38
48
  .addCommand(configureOutput(createVerifyCommand(dependencies)))
49
+ .addCommand(configureOutput(createContractCommand(dependencies)))
50
+ .addCommand(configureOutput(createObserveCommand(dependencies)))
39
51
  .addCommand(configureOutput(createProjectCommand(dependencies)))
40
52
  .addCommand(configureOutput(createContextCommand(dependencies)))
53
+ .addCommand(configureOutput(createJourneyCommand(dependencies)))
41
54
  .addCommand(configureOutput(createGenerationCommand(dependencies)))
42
- .addCommand(configureOutput(createInitCommand(dependencies)));
55
+ .addCommand(configureOutput(createKnowledgeCommand(dependencies)))
56
+ .addCommand(configureOutput(createBaselineCommand(dependencies)))
57
+ .addCommand(configureOutput(createFailureCommand(dependencies)))
58
+ .addCommand(configureOutput(createInitCommand(dependencies)))
59
+ .addCommand(configureOutput(createAlignCommand(dependencies)))
60
+ .addCommand(configureOutput(createImpactCommand(dependencies)));
43
61
  }
@@ -0,0 +1 @@
1
+ export declare function canonicalProjectRoot(cwd: string, projectRoot: string): Promise<string>;
@@ -0,0 +1,6 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ export async function canonicalProjectRoot(cwd, projectRoot) {
4
+ const absolute = resolve(cwd, projectRoot);
5
+ return realpath(absolute).catch(() => absolute);
6
+ }
@@ -0,0 +1,22 @@
1
+ import { type RuntimeBackendChoice } from "../domain/runtime.js";
2
+ export declare const RUNTIME_BACKEND_ENV_VAR = "TAPHOUND_RUNTIME_BACKEND";
3
+ export declare class RuntimeBackendSelectionError extends Error {
4
+ constructor(value: string);
5
+ }
6
+ export declare class RuntimeBackendConfigError extends Error {
7
+ constructor(path: string, value: unknown);
8
+ }
9
+ export declare function readRuntimeBackendChoice(env: Record<string, string | undefined>): RuntimeBackendChoice;
10
+ export interface RuntimeBackendInvocation {
11
+ env: Record<string, string | undefined>;
12
+ argv: readonly string[];
13
+ cwd: string;
14
+ readConfigFile: (path: string) => Promise<string>;
15
+ }
16
+ /**
17
+ * Resolves the effective runtime backend choice for one CLI invocation.
18
+ * An explicit `TAPHOUND_RUNTIME_BACKEND` wins over the config file so CI and
19
+ * experiments can override committed project state; `auto` defers to the
20
+ * config's `runtime.backend`, which itself defaults to `auto`.
21
+ */
22
+ export declare function resolveRuntimeBackendChoiceFromInvocation(invocation: RuntimeBackendInvocation): Promise<RuntimeBackendChoice>;
@@ -0,0 +1,92 @@
1
+ import { resolve } from "node:path";
2
+ import { RuntimeBackendChoiceSchema } from "../domain/runtime.js";
3
+ import { CONFIG_PATH } from "../domain/workspace.js";
4
+ export const RUNTIME_BACKEND_ENV_VAR = "TAPHOUND_RUNTIME_BACKEND";
5
+ export class RuntimeBackendSelectionError extends Error {
6
+ constructor(value) {
7
+ super(`${RUNTIME_BACKEND_ENV_VAR} must be one of ${RuntimeBackendChoiceSchema.options
8
+ .map((option) => `"${option}"`)
9
+ .join(", ")}, received "${value}"`);
10
+ this.name = "RuntimeBackendSelectionError";
11
+ }
12
+ }
13
+ export class RuntimeBackendConfigError extends Error {
14
+ constructor(path, value) {
15
+ super(`runtime.backend in ${path} must be one of ${RuntimeBackendChoiceSchema.options
16
+ .map((option) => `"${option}"`)
17
+ .join(", ")}, received ${typeof value === "string" ? `"${value}"` : String(value)}`);
18
+ this.name = "RuntimeBackendConfigError";
19
+ }
20
+ }
21
+ export function readRuntimeBackendChoice(env) {
22
+ const raw = env[RUNTIME_BACKEND_ENV_VAR];
23
+ if (raw === undefined || raw.trim() === "") {
24
+ return "auto";
25
+ }
26
+ const value = raw.trim();
27
+ const parsed = RuntimeBackendChoiceSchema.safeParse(value);
28
+ if (!parsed.success) {
29
+ throw new RuntimeBackendSelectionError(value);
30
+ }
31
+ return parsed.data;
32
+ }
33
+ function argvOptionValue(argv, name) {
34
+ const prefix = `--${name}=`;
35
+ let value;
36
+ for (let index = 0; index < argv.length; index += 1) {
37
+ const argument = argv[index];
38
+ if (argument === undefined) {
39
+ continue;
40
+ }
41
+ if (argument === `--${name}` && argv[index + 1] !== undefined) {
42
+ value = argv[index + 1] ?? undefined;
43
+ }
44
+ else if (argument.startsWith(prefix)) {
45
+ value = argument.slice(prefix.length);
46
+ }
47
+ }
48
+ return value;
49
+ }
50
+ async function configBackendChoice(invocation) {
51
+ const project = argvOptionValue(invocation.argv, "project")
52
+ ?? invocation.cwd;
53
+ const configPath = resolve(project, argvOptionValue(invocation.argv, "config") ?? CONFIG_PATH);
54
+ let text;
55
+ try {
56
+ text = await invocation.readConfigFile(configPath);
57
+ }
58
+ catch {
59
+ return "auto";
60
+ }
61
+ let parsed;
62
+ try {
63
+ parsed = JSON.parse(text);
64
+ }
65
+ catch {
66
+ return "auto";
67
+ }
68
+ const backend = parsed === null || typeof parsed !== "object"
69
+ ? undefined
70
+ : parsed.runtime?.backend;
71
+ if (backend === undefined) {
72
+ return "auto";
73
+ }
74
+ const choice = RuntimeBackendChoiceSchema.safeParse(backend);
75
+ if (!choice.success) {
76
+ throw new RuntimeBackendConfigError(configPath, backend);
77
+ }
78
+ return choice.data;
79
+ }
80
+ /**
81
+ * Resolves the effective runtime backend choice for one CLI invocation.
82
+ * An explicit `TAPHOUND_RUNTIME_BACKEND` wins over the config file so CI and
83
+ * experiments can override committed project state; `auto` defers to the
84
+ * config's `runtime.backend`, which itself defaults to `auto`.
85
+ */
86
+ export async function resolveRuntimeBackendChoiceFromInvocation(invocation) {
87
+ const fromEnv = readRuntimeBackendChoice(invocation.env);
88
+ if (fromEnv !== "auto") {
89
+ return fromEnv;
90
+ }
91
+ return configBackendChoice(invocation);
92
+ }
@@ -0,0 +1 @@
1
+ export declare function readCliVersion(): string;
@@ -0,0 +1,14 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export function readCliVersion() {
5
+ try {
6
+ const here = dirname(fileURLToPath(import.meta.url));
7
+ const pkgPath = resolve(here, "../../package.json");
8
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
9
+ return pkg.version ?? "unknown";
10
+ }
11
+ catch {
12
+ return "unknown";
13
+ }
14
+ }
@@ -0,0 +1,2 @@
1
+ import type { CliDependencies } from "./dependencies.js";
2
+ export declare function prepareWorkspace(dependencies: Pick<CliDependencies, "workspaceLayout">, projectRoot: string): Promise<void>;
@@ -0,0 +1,3 @@
1
+ export async function prepareWorkspace(dependencies, projectRoot) {
2
+ await dependencies.workspaceLayout.ensureBuildLayout(projectRoot);
3
+ }
@@ -0,0 +1,4 @@
1
+ import { z } from "zod";
2
+ export declare const BINDING_REFERENCE: RegExp;
3
+ export declare function bindingName(value: string): string | undefined;
4
+ export declare function checkBindingReferences(value: unknown, context: z.RefinementCtx, allowed: readonly (readonly (string | number)[])[], path?: (string | number)[]): void;
@@ -0,0 +1,23 @@
1
+ export const BINDING_REFERENCE = /^\$\{([a-z][a-zA-Z0-9_]{0,31})\}$/;
2
+ export function bindingName(value) {
3
+ return BINDING_REFERENCE.exec(value)?.[1];
4
+ }
5
+ export function checkBindingReferences(value, context, allowed, path = []) {
6
+ if (typeof value === "string") {
7
+ if (value.includes("${") && (bindingName(value) === undefined
8
+ || !allowed.some((candidate) => (candidate.length === path.length
9
+ && candidate.every((item, index) => item === path[index]))))) {
10
+ context.addIssue({
11
+ code: "custom",
12
+ path,
13
+ message: "Binding references are permitted only as exact values in approved fields"
14
+ });
15
+ }
16
+ return;
17
+ }
18
+ if (value === null || typeof value !== "object")
19
+ return;
20
+ for (const [key, item] of Object.entries(value)) {
21
+ checkBindingReferences(item, context, allowed, [...path, ...(Array.isArray(value) ? [Number(key)] : [key])]);
22
+ }
23
+ }