taphound 0.2.0-dev.1 → 0.2.0-dev.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (467) 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 +507 -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 +578 -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 +357 -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 +42 -0
  66. package/dist/adapters/appium/appium-ui-snapshot-provider.js +309 -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/diagnostics-journal.d.ts +17 -0
  73. package/dist/adapters/filesystem/diagnostics-journal.js +130 -0
  74. package/dist/adapters/filesystem/external-flow-registry.d.ts +17 -0
  75. package/dist/adapters/filesystem/external-flow-registry.js +325 -0
  76. package/dist/adapters/filesystem/generation-session-store.d.ts +17 -11
  77. package/dist/adapters/filesystem/generation-session-store.js +281 -855
  78. package/dist/adapters/filesystem/generation-store/session-lock.d.ts +29 -0
  79. package/dist/adapters/filesystem/generation-store/session-lock.js +202 -0
  80. package/dist/adapters/filesystem/generation-store/session-transitions.d.ts +24 -0
  81. package/dist/adapters/filesystem/generation-store/session-transitions.js +340 -0
  82. package/dist/adapters/filesystem/generation-store/store-files.d.ts +50 -0
  83. package/dist/adapters/filesystem/generation-store/store-files.js +363 -0
  84. package/dist/adapters/filesystem/journey-composition-store.d.ts +23 -0
  85. package/dist/adapters/filesystem/journey-composition-store.js +151 -0
  86. package/dist/adapters/filesystem/knowledge-registry.d.ts +12 -0
  87. package/dist/adapters/filesystem/knowledge-registry.js +223 -0
  88. package/dist/adapters/filesystem/project-bound-file.js +3 -5
  89. package/dist/adapters/filesystem/project-file-inspector.d.ts +2 -0
  90. package/dist/adapters/filesystem/project-file-inspector.js +57 -28
  91. package/dist/adapters/filesystem/project-identity-inspector.d.ts +7 -0
  92. package/dist/adapters/filesystem/project-identity-inspector.js +215 -0
  93. package/dist/adapters/filesystem/project-inventory-inspector.d.ts +8 -0
  94. package/dist/adapters/filesystem/project-inventory-inspector.js +93 -0
  95. package/dist/adapters/filesystem/project-module-discoverer.d.ts +6 -0
  96. package/dist/adapters/filesystem/project-module-discoverer.js +158 -0
  97. package/dist/adapters/filesystem/skill-installer.d.ts +7 -2
  98. package/dist/adapters/filesystem/skill-installer.js +40 -11
  99. package/dist/adapters/filesystem/workspace-layout.d.ts +7 -0
  100. package/dist/adapters/filesystem/workspace-layout.js +57 -0
  101. package/dist/adapters/git/node-git-diff.d.ts +17 -0
  102. package/dist/adapters/git/node-git-diff.js +114 -0
  103. package/dist/adapters/process/node-detached-process-launcher.d.ts +6 -0
  104. package/dist/adapters/process/node-detached-process-launcher.js +96 -0
  105. package/dist/adapters/process/node-process-runner.js +11 -2
  106. package/dist/adapters/prompt/inquirer-align-prompt.d.ts +27 -0
  107. package/dist/adapters/prompt/inquirer-align-prompt.js +65 -0
  108. package/dist/adapters/prompt/inquirer-generation-prompt.js +3 -0
  109. package/dist/adapters/prompt/inquirer-recorder-prompt.d.ts +9 -1
  110. package/dist/adapters/prompt/inquirer-recorder-prompt.js +63 -0
  111. package/dist/adapters/runtime/adb-runtime-backend.d.ts +67 -0
  112. package/dist/adapters/runtime/adb-runtime-backend.js +206 -0
  113. package/dist/adapters/runtime/fake-runtime-backend.d.ts +87 -0
  114. package/dist/adapters/runtime/fake-runtime-backend.js +240 -0
  115. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.d.ts +45 -0
  116. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.js +153 -0
  117. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.d.ts +23 -0
  118. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.js +39 -0
  119. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.d.ts +20 -0
  120. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.js +180 -0
  121. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.d.ts +78 -0
  122. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.js +379 -0
  123. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-tools.d.ts +46 -0
  124. package/dist/adapters/runtime/session-adb-view.d.ts +53 -0
  125. package/dist/adapters/runtime/session-adb-view.js +193 -0
  126. package/dist/adapters/runtime/session-backed-ports.d.ts +21 -0
  127. package/dist/adapters/runtime/session-backed-ports.js +43 -0
  128. package/dist/adapters/runtime/shared-session-runtime-backend.d.ts +12 -0
  129. package/dist/adapters/runtime/shared-session-runtime-backend.js +64 -0
  130. package/dist/adapters/ui/auto-ui-snapshot-provider.d.ts +8 -0
  131. package/dist/adapters/ui/auto-ui-snapshot-provider.js +48 -0
  132. package/dist/adapters/ui/device-layout-temp.d.ts +6 -0
  133. package/dist/adapters/ui/device-layout-temp.js +18 -0
  134. package/dist/adapters/ui/device-ui-environment.d.ts +13 -0
  135. package/dist/adapters/ui/device-ui-environment.js +81 -0
  136. package/dist/adapters/ui/layout-normalization.d.ts +9 -0
  137. package/dist/adapters/ui/layout-normalization.js +44 -0
  138. package/dist/adapters/ui/ui-snapshot-error.d.ts +11 -0
  139. package/dist/adapters/ui/ui-snapshot-error.js +12 -0
  140. package/dist/adapters/ui/ui-snapshot-support.d.ts +15 -0
  141. package/dist/adapters/ui/ui-snapshot-support.js +12 -0
  142. package/dist/application/align/align-service.d.ts +42 -0
  143. package/dist/application/align/align-service.js +106 -0
  144. package/dist/application/assertion/expectation-evaluator.d.ts +18 -5
  145. package/dist/application/assertion/expectation-evaluator.js +156 -18
  146. package/dist/application/assertion/guarded-expectation.d.ts +45 -0
  147. package/dist/application/assertion/guarded-expectation.js +74 -0
  148. package/dist/application/checkpoint/baseline-capturer.d.ts +26 -0
  149. package/dist/application/checkpoint/baseline-capturer.js +163 -0
  150. package/dist/application/checkpoint/baseline-error.d.ts +5 -0
  151. package/dist/application/checkpoint/baseline-error.js +8 -0
  152. package/dist/application/checkpoint/baseline-service.d.ts +31 -0
  153. package/dist/application/checkpoint/baseline-service.js +147 -0
  154. package/dist/application/checkpoint/checkpoint-evaluator.d.ts +35 -0
  155. package/dist/application/checkpoint/checkpoint-evaluator.js +415 -0
  156. package/dist/application/checkpoint/regression-comparator.d.ts +18 -0
  157. package/dist/application/checkpoint/regression-comparator.js +192 -0
  158. package/dist/application/collector/logcat-collector.d.ts +22 -1
  159. package/dist/application/collector/logcat-collector.js +103 -15
  160. package/dist/application/collector/logcat-event.d.ts +8 -0
  161. package/dist/application/collector/logcat-event.js +79 -0
  162. package/dist/application/collector/logcat-stop.d.ts +2 -0
  163. package/dist/application/collector/logcat-stop.js +11 -0
  164. package/dist/application/context/context-generator.d.ts +45 -0
  165. package/dist/application/context/context-generator.js +228 -0
  166. package/dist/application/context/context-loader.d.ts +40 -0
  167. package/dist/application/context/context-loader.js +223 -0
  168. package/dist/application/context/context-refresher.d.ts +59 -0
  169. package/dist/application/context/context-refresher.js +349 -0
  170. package/dist/application/context/context-rehasher.d.ts +36 -0
  171. package/dist/application/context/context-rehasher.js +110 -0
  172. package/dist/application/context/context-validator.d.ts +23 -1
  173. package/dist/application/context/context-validator.js +116 -9
  174. package/dist/application/context/evidence-hash.d.ts +1 -0
  175. package/dist/application/context/evidence-hash.js +125 -0
  176. package/dist/application/context/evidence-match.d.ts +9 -0
  177. package/dist/application/context/evidence-match.js +8 -0
  178. package/dist/application/context/shard-identity.d.ts +2 -0
  179. package/dist/application/context/shard-identity.js +7 -0
  180. package/dist/application/contract/contract-loader.d.ts +25 -0
  181. package/dist/application/contract/contract-loader.js +68 -0
  182. package/dist/application/contract/contract-review.d.ts +25 -0
  183. package/dist/application/contract/contract-review.js +51 -0
  184. package/dist/application/contract/contract-verifier.d.ts +53 -0
  185. package/dist/application/contract/contract-verifier.js +645 -0
  186. package/dist/application/devices/resolve-device-assignments.d.ts +21 -0
  187. package/dist/application/devices/resolve-device-assignments.js +60 -0
  188. package/dist/application/diagnosis/failure-classifier.d.ts +23 -0
  189. package/dist/application/diagnosis/failure-classifier.js +179 -0
  190. package/dist/application/diagnostics/diagnostics-exporter.d.ts +29 -0
  191. package/dist/application/diagnostics/diagnostics-exporter.js +283 -0
  192. package/dist/application/diagnostics/ui-capture-telemetry.d.ts +16 -0
  193. package/dist/application/diagnostics/ui-capture-telemetry.js +81 -0
  194. package/dist/application/doctor/doctor-service.d.ts +36 -3
  195. package/dist/application/doctor/doctor-service.js +255 -25
  196. package/dist/application/generation/generation-app-preparer.d.ts +20 -0
  197. package/dist/application/generation/generation-app-preparer.js +28 -0
  198. package/dist/application/generation/generation-config-service.d.ts +21 -0
  199. package/dist/application/generation/generation-config-service.js +53 -0
  200. package/dist/application/generation/generation-confirmation-service.d.ts +14 -3
  201. package/dist/application/generation/generation-confirmation-service.js +109 -24
  202. package/dist/application/generation/generation-context-snapshot.d.ts +6 -0
  203. package/dist/application/generation/generation-context-snapshot.js +29 -0
  204. package/dist/application/generation/generation-finalizer.d.ts +15 -9
  205. package/dist/application/generation/generation-finalizer.js +167 -70
  206. package/dist/application/generation/generation-publisher.js +12 -8
  207. package/dist/application/generation/generation-recovery-service.d.ts +35 -0
  208. package/dist/application/generation/generation-recovery-service.js +144 -0
  209. package/dist/application/generation/generation-reopen-service.d.ts +15 -0
  210. package/dist/application/generation/generation-reopen-service.js +37 -0
  211. package/dist/application/generation/generation-replace-service.d.ts +32 -0
  212. package/dist/application/generation/generation-replace-service.js +116 -0
  213. package/dist/application/generation/generation-starter.d.ts +44 -4
  214. package/dist/application/generation/generation-starter.js +175 -8
  215. package/dist/application/generation/generation-step-executor.d.ts +67 -5
  216. package/dist/application/generation/generation-step-executor.js +471 -108
  217. package/dist/application/generation/proposed-step-validator.js +96 -30
  218. package/dist/application/generation/replay-policy-loader.d.ts +16 -0
  219. package/dist/application/generation/replay-policy-loader.js +29 -0
  220. package/dist/application/generation/risk-evaluator.d.ts +4 -1
  221. package/dist/application/generation/risk-evaluator.js +118 -3
  222. package/dist/application/generation/runtime-observer.d.ts +39 -7
  223. package/dist/application/generation/runtime-observer.js +193 -24
  224. package/dist/application/impact/impact-resolver.d.ts +32 -0
  225. package/dist/application/impact/impact-resolver.js +160 -0
  226. package/dist/application/init/init-service.js +26 -13
  227. package/dist/application/interaction/action-executor.d.ts +3 -2
  228. package/dist/application/interaction/action-executor.js +11 -1
  229. package/dist/application/interaction/action-target.d.ts +17 -0
  230. package/dist/application/interaction/action-target.js +40 -0
  231. package/dist/application/interaction/external-step-runner.d.ts +153 -0
  232. package/dist/application/interaction/external-step-runner.js +332 -0
  233. package/dist/application/interaction/fallback-resolver.d.ts +6 -3
  234. package/dist/application/interaction/fallback-resolver.js +7 -5
  235. package/dist/application/interaction/scroll-to-executor.d.ts +17 -3
  236. package/dist/application/interaction/scroll-to-executor.js +118 -36
  237. package/dist/application/journey/external-flow-resolver.d.ts +25 -0
  238. package/dist/application/journey/external-flow-resolver.js +22 -0
  239. package/dist/application/journey/journey-check-service.d.ts +54 -0
  240. package/dist/application/journey/journey-check-service.js +207 -0
  241. package/dist/application/journey/journey-promoter.d.ts +26 -0
  242. package/dist/application/journey/journey-promoter.js +123 -0
  243. package/dist/application/journey/journey-resolver.d.ts +42 -0
  244. package/dist/application/journey/journey-resolver.js +239 -0
  245. package/dist/application/journey/journey-retirer.d.ts +25 -0
  246. package/dist/application/journey/journey-retirer.js +87 -0
  247. package/dist/application/knowledge/anchor-resolver.d.ts +36 -0
  248. package/dist/application/knowledge/anchor-resolver.js +110 -0
  249. package/dist/application/knowledge/knowledge-loader.d.ts +16 -0
  250. package/dist/application/knowledge/knowledge-loader.js +36 -0
  251. package/dist/application/locator/layout-failure-summary.d.ts +2 -0
  252. package/dist/application/locator/layout-failure-summary.js +67 -0
  253. package/dist/application/locator/layout-traversal.d.ts +11 -0
  254. package/dist/application/locator/layout-traversal.js +18 -0
  255. package/dist/application/locator/locator-resolver.d.ts +13 -1
  256. package/dist/application/locator/locator-resolver.js +182 -18
  257. package/dist/application/observe/observe-service.d.ts +20 -0
  258. package/dist/application/observe/observe-service.js +91 -0
  259. package/dist/application/project/project-describer.d.ts +14 -6
  260. package/dist/application/project/project-describer.js +38 -5
  261. package/dist/application/recognition/screen-detector.d.ts +28 -0
  262. package/dist/application/recognition/screen-detector.js +111 -0
  263. package/dist/application/recorder/locator-selector.js +151 -17
  264. package/dist/application/recorder/recorder-service.d.ts +16 -4
  265. package/dist/application/recorder/recorder-service.js +420 -128
  266. package/dist/application/report/report-writer.d.ts +5 -0
  267. package/dist/application/report/report-writer.js +17 -1
  268. package/dist/application/runtime/cold-launch.d.ts +28 -0
  269. package/dist/application/runtime/cold-launch.js +59 -0
  270. package/dist/application/runtime/step-runner.d.ts +49 -4
  271. package/dist/application/runtime/step-runner.js +721 -130
  272. package/dist/application/runtime/verify-runtime.d.ts +57 -7
  273. package/dist/application/runtime/verify-runtime.js +577 -175
  274. package/dist/application/ui/cached-ui-snapshot-provider.d.ts +45 -0
  275. package/dist/application/ui/cached-ui-snapshot-provider.js +111 -0
  276. package/dist/application/ui/observed-ui-snapshot-provider.d.ts +15 -0
  277. package/dist/application/ui/observed-ui-snapshot-provider.js +66 -0
  278. package/dist/application/ui/ui-snapshot-lifecycle.d.ts +2 -0
  279. package/dist/application/ui/ui-snapshot-lifecycle.js +8 -0
  280. package/dist/application/ui/ui-stability-probe.d.ts +9 -0
  281. package/dist/application/ui/ui-stability-probe.js +24 -0
  282. package/dist/application/wait/idle-advice.d.ts +6 -0
  283. package/dist/application/wait/idle-advice.js +27 -0
  284. package/dist/application/wait/idle-profiles.d.ts +15 -0
  285. package/dist/application/wait/idle-profiles.js +75 -0
  286. package/dist/application/wait/idle-waiter.d.ts +28 -4
  287. package/dist/application/wait/idle-waiter.js +201 -15
  288. package/dist/cli/commands/align.d.ts +3 -0
  289. package/dist/cli/commands/align.js +124 -0
  290. package/dist/cli/commands/baseline.d.ts +3 -0
  291. package/dist/cli/commands/baseline.js +130 -0
  292. package/dist/cli/commands/context.js +300 -27
  293. package/dist/cli/commands/contract.d.ts +3 -0
  294. package/dist/cli/commands/contract.js +120 -0
  295. package/dist/cli/commands/diagnose.d.ts +3 -0
  296. package/dist/cli/commands/diagnose.js +84 -0
  297. package/dist/cli/commands/doctor.js +16 -9
  298. package/dist/cli/commands/failure.d.ts +3 -0
  299. package/dist/cli/commands/failure.js +63 -0
  300. package/dist/cli/commands/generation/lifecycle-commands.d.ts +5 -0
  301. package/dist/cli/commands/generation/lifecycle-commands.js +211 -0
  302. package/dist/cli/commands/generation/session-commands.d.ts +11 -0
  303. package/dist/cli/commands/generation/session-commands.js +472 -0
  304. package/dist/cli/commands/generation/shared.d.ts +1414 -0
  305. package/dist/cli/commands/generation/shared.js +291 -0
  306. package/dist/cli/commands/generation/step-commands.d.ts +8 -0
  307. package/dist/cli/commands/generation/step-commands.js +315 -0
  308. package/dist/cli/commands/generation.js +10 -507
  309. package/dist/cli/commands/impact.d.ts +3 -0
  310. package/dist/cli/commands/impact.js +87 -0
  311. package/dist/cli/commands/init.js +13 -6
  312. package/dist/cli/commands/journey.d.ts +3 -0
  313. package/dist/cli/commands/journey.js +382 -0
  314. package/dist/cli/commands/knowledge.d.ts +3 -0
  315. package/dist/cli/commands/knowledge.js +93 -0
  316. package/dist/cli/commands/observe.d.ts +3 -0
  317. package/dist/cli/commands/observe.js +127 -0
  318. package/dist/cli/commands/project.js +2 -1
  319. package/dist/cli/commands/record.js +18 -5
  320. package/dist/cli/commands/verify.js +326 -64
  321. package/dist/cli/dependencies.d.ts +136 -1
  322. package/dist/cli/dependencies.js +504 -52
  323. package/dist/cli/diagnostics-recorder.d.ts +31 -0
  324. package/dist/cli/diagnostics-recorder.js +82 -0
  325. package/dist/cli/diff-verification.d.ts +41 -0
  326. package/dist/cli/diff-verification.js +192 -0
  327. package/dist/cli/main.d.ts +1 -1
  328. package/dist/cli/main.js +107 -2
  329. package/dist/cli/output.d.ts +5 -3
  330. package/dist/cli/output.js +12 -0
  331. package/dist/cli/program.js +21 -1
  332. package/dist/cli/project-root.d.ts +1 -0
  333. package/dist/cli/project-root.js +6 -0
  334. package/dist/cli/runtime-selection.d.ts +22 -0
  335. package/dist/cli/runtime-selection.js +92 -0
  336. package/dist/cli/version.d.ts +1 -0
  337. package/dist/cli/version.js +14 -0
  338. package/dist/cli/workspace-guard.d.ts +2 -0
  339. package/dist/cli/workspace-guard.js +3 -0
  340. package/dist/domain/binding-reference.d.ts +4 -0
  341. package/dist/domain/binding-reference.js +23 -0
  342. package/dist/domain/checkpoint.d.ts +404 -0
  343. package/dist/domain/checkpoint.js +297 -0
  344. package/dist/domain/config.d.ts +107 -1
  345. package/dist/domain/config.js +52 -6
  346. package/dist/domain/contract.d.ts +413 -0
  347. package/dist/domain/contract.js +196 -0
  348. package/dist/domain/diagnostics.d.ts +1396 -0
  349. package/dist/domain/diagnostics.js +193 -0
  350. package/dist/domain/external-flow.d.ts +493 -0
  351. package/dist/domain/external-flow.js +15 -0
  352. package/dist/domain/failure-classification.d.ts +176 -0
  353. package/dist/domain/failure-classification.js +169 -0
  354. package/dist/domain/failure.d.ts +2 -1
  355. package/dist/domain/failure.js +123 -0
  356. package/dist/domain/generation.d.ts +1671 -132
  357. package/dist/domain/generation.js +202 -13
  358. package/dist/domain/geometry.d.ts +13 -0
  359. package/dist/domain/geometry.js +16 -0
  360. package/dist/domain/impact.d.ts +71 -0
  361. package/dist/domain/impact.js +76 -0
  362. package/dist/domain/init.d.ts +12 -4
  363. package/dist/domain/init.js +24 -18
  364. package/dist/domain/journey-composition.d.ts +2285 -0
  365. package/dist/domain/journey-composition.js +85 -0
  366. package/dist/domain/journey-lifecycle.d.ts +10 -0
  367. package/dist/domain/journey-lifecycle.js +9 -0
  368. package/dist/domain/journey.d.ts +2419 -212
  369. package/dist/domain/journey.js +384 -14
  370. package/dist/domain/knowledge.d.ts +165 -0
  371. package/dist/domain/knowledge.js +188 -0
  372. package/dist/domain/layout.d.ts +34 -5
  373. package/dist/domain/layout.js +64 -6
  374. package/dist/domain/locator-evidence.d.ts +3 -0
  375. package/dist/domain/locator-evidence.js +36 -0
  376. package/dist/domain/logcat-event.d.ts +54 -0
  377. package/dist/domain/logcat-event.js +40 -0
  378. package/dist/domain/observation.d.ts +33 -0
  379. package/dist/domain/observation.js +18 -0
  380. package/dist/domain/project-context.d.ts +219 -1
  381. package/dist/domain/project-context.js +209 -6
  382. package/dist/domain/proposed-step.d.ts +340 -60
  383. package/dist/domain/proposed-step.js +23 -3
  384. package/dist/domain/report.d.ts +1455 -28
  385. package/dist/domain/report.js +211 -14
  386. package/dist/domain/runtime-snapshot.d.ts +58 -1
  387. package/dist/domain/runtime-snapshot.js +14 -3
  388. package/dist/domain/runtime.d.ts +50 -0
  389. package/dist/domain/runtime.js +36 -0
  390. package/dist/domain/system-app-profiles.d.ts +6 -0
  391. package/dist/domain/system-app-profiles.js +43 -0
  392. package/dist/domain/ui-backend.d.ts +28 -0
  393. package/dist/domain/ui-backend.js +33 -0
  394. package/dist/domain/ui-cache.d.ts +11 -0
  395. package/dist/domain/ui-cache.js +10 -0
  396. package/dist/domain/verify-receipt.d.ts +17 -0
  397. package/dist/domain/verify-receipt.js +17 -0
  398. package/dist/domain/window-hierarchy.d.ts +84 -0
  399. package/dist/domain/window-hierarchy.js +172 -0
  400. package/dist/domain/workflow-manifest.d.ts +77 -0
  401. package/dist/domain/workflow-manifest.js +136 -0
  402. package/dist/domain/workspace.d.ts +30 -0
  403. package/dist/domain/workspace.js +74 -0
  404. package/dist/ports/adb.d.ts +34 -1
  405. package/dist/ports/align-prompt.d.ts +11 -0
  406. package/dist/ports/align-prompt.js +6 -0
  407. package/dist/ports/anchor-resolver.d.ts +30 -0
  408. package/dist/ports/anchor-resolver.js +1 -0
  409. package/dist/ports/annotated-screen-resolver.d.ts +4 -0
  410. package/dist/ports/annotated-screen-resolver.js +1 -0
  411. package/dist/ports/camera-probe.d.ts +23 -0
  412. package/dist/ports/camera-probe.js +8 -0
  413. package/dist/ports/context-document-writer.d.ts +24 -0
  414. package/dist/ports/context-document-writer.js +1 -0
  415. package/dist/ports/detached-process-launcher.d.ts +12 -0
  416. package/dist/ports/detached-process-launcher.js +1 -0
  417. package/dist/ports/diagnostics.d.ts +15 -0
  418. package/dist/ports/diagnostics.js +1 -0
  419. package/dist/ports/external-flow-registry.d.ts +37 -0
  420. package/dist/ports/external-flow-registry.js +1 -0
  421. package/dist/ports/generation-prompt.d.ts +2 -1
  422. package/dist/ports/generation-session-store.d.ts +12 -2
  423. package/dist/ports/git-diff.d.ts +9 -0
  424. package/dist/ports/git-diff.js +1 -0
  425. package/dist/ports/journey-composition-store.d.ts +17 -0
  426. package/dist/ports/journey-composition-store.js +1 -0
  427. package/dist/ports/knowledge-registry.d.ts +20 -0
  428. package/dist/ports/knowledge-registry.js +1 -0
  429. package/dist/ports/process-runner.d.ts +7 -0
  430. package/dist/ports/project-file-inspector.d.ts +1 -0
  431. package/dist/ports/project-identity-inspector.d.ts +24 -0
  432. package/dist/ports/project-identity-inspector.js +1 -0
  433. package/dist/ports/project-inventory-inspector.d.ts +21 -0
  434. package/dist/ports/project-inventory-inspector.js +1 -0
  435. package/dist/ports/project-module-discoverer.d.ts +26 -0
  436. package/dist/ports/project-module-discoverer.js +1 -0
  437. package/dist/ports/recorder-prompt.d.ts +10 -1
  438. package/dist/ports/runtime-backend.d.ts +89 -0
  439. package/dist/ports/runtime-backend.js +13 -0
  440. package/dist/ports/runtime-capability.d.ts +12 -0
  441. package/dist/ports/runtime-capability.js +20 -0
  442. package/dist/ports/runtime-session-ports.d.ts +25 -0
  443. package/dist/ports/runtime-session-ports.js +1 -0
  444. package/dist/ports/screenshot.d.ts +11 -0
  445. package/dist/ports/screenshot.js +1 -0
  446. package/dist/ports/skill-installer.d.ts +2 -2
  447. package/dist/ports/ui-snapshot.d.ts +35 -0
  448. package/dist/ports/ui-snapshot.js +1 -0
  449. package/dist/ports/ui-stability.d.ts +19 -0
  450. package/dist/ports/ui-stability.js +1 -0
  451. package/dist/ports/workspace-layout.d.ts +4 -0
  452. package/dist/ports/workspace-layout.js +1 -0
  453. package/dist/shared/errors.d.ts +2 -0
  454. package/dist/shared/errors.js +22 -0
  455. package/dist/shared/paths.d.ts +2 -0
  456. package/dist/shared/paths.js +24 -0
  457. package/dist/shared/strings.d.ts +2 -0
  458. package/dist/shared/strings.js +16 -0
  459. package/package.json +7 -2
  460. package/assets/skills/taphound-ai-journey/GUIDE.md +0 -862
  461. package/assets/skills/taphound-ai-journey/SKILL.md +0 -377
  462. package/assets/skills/taphound-ai-journey/prompts/analyze-project.md +0 -526
  463. package/assets/skills/taphound-ai-journey/prompts/generate-step.md +0 -109
  464. package/assets/skills/taphound-ai-journey/schemas/project-context.json +0 -81
  465. package/assets/skills/taphound-ai-journey/templates/project-context.example.json +0 -49
  466. package/dist/ports/android-cli.d.ts +0 -21
  467. /package/dist/{ports/android-cli.js → adapters/runtime/mobile-mcp/mobile-mcp-tools.js} +0 -0
@@ -1,18 +1,42 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { z } from "zod";
3
+ import { UiBackendDescriptorSchema } from "./ui-backend.js";
4
+ import { IdlePolicySchema } from "./config.js";
3
5
  import { JourneyStepSchema } from "./journey.js";
6
+ import { FlowNameSchema } from "./journey-composition.js";
4
7
  import { ProjectRelativePathSchema } from "./project-context.js";
5
8
  import { InteractionPolicySchema } from "./project-context.js";
9
+ import { ContextSelectionSchema } from "./project-context.js";
6
10
  import { ProposedStepSchema } from "./proposed-step.js";
7
11
  import { RuntimeSnapshotSchema } from "./runtime-snapshot.js";
8
12
  export const GENERATION_ERROR_CODES = [
9
13
  "CONFIG_INVALID",
10
14
  "CONTEXT_INVALID",
11
15
  "CONTEXT_STALE",
16
+ "BRIEF_INVALID",
17
+ "KNOWLEDGE_INVALID",
18
+ "KNOWLEDGE_STALE",
19
+ "ANCHOR_AMBIGUOUS",
20
+ "FLOW_INVALID",
21
+ "FLOW_REPLAY_FAILED",
22
+ "APP_LAUNCH_FAILED",
12
23
  "SNAPSHOT_STALE",
13
24
  "PACKAGE_ESCAPE",
25
+ "BRIDGE_NO_ESCAPE",
26
+ "SCENARIO_PACKAGE_MISMATCH",
27
+ "BRIDGE_NOT_RETURNED",
28
+ "EXTERNAL_FLOW_NOT_FOUND",
29
+ "EXTERNAL_FLOW_STALE",
30
+ "EXTERNAL_LOCATOR_STRICTNESS",
31
+ "EXTERNAL_PACKAGE_MISMATCH",
32
+ "EXTERNAL_ACTIVITY_MISMATCH",
33
+ "EXTERNAL_STEP_FAILED",
14
34
  "APP_CRASHED",
35
+ "IDLE_TIMEOUT",
36
+ "WINDOW_HIERARCHY_INCOMPLETE",
15
37
  "ACTION_UNSUPPORTED",
38
+ "LOCATOR_NOT_FOUND",
39
+ "LOCATOR_AMBIGUOUS",
16
40
  "RISK_CONFIRMATION_REQUIRED",
17
41
  "ACTION_FORBIDDEN",
18
42
  "EXPECT_UNSUPPORTED",
@@ -24,6 +48,29 @@ export const GENERATION_ERROR_CODES = [
24
48
  ];
25
49
  export const GenerationErrorCodeSchema = z.enum(GENERATION_ERROR_CODES);
26
50
  const Sha256Schema = z.string().regex(/^[a-f\d]{64}$/);
51
+ export const GenerationStepSourceSchema = z.enum([
52
+ "flow",
53
+ "planner",
54
+ "manualOverride"
55
+ ]);
56
+ export const GenerationBaseFlowSchema = z.strictObject({
57
+ name: FlowNameSchema,
58
+ resolutionSha256: Sha256Schema,
59
+ journeySha256: Sha256Schema,
60
+ verificationReportSha256: Sha256Schema,
61
+ verificationRunId: z.string().min(1),
62
+ stepCount: z.number().int().positive()
63
+ });
64
+ export const GenerationSourceBriefSchema = z.strictObject({
65
+ path: ProjectRelativePathSchema,
66
+ sha256: Sha256Schema
67
+ });
68
+ export const GenerationExternalFlowBindingSchema = z.strictObject({
69
+ name: FlowNameSchema,
70
+ flowSha256: Sha256Schema,
71
+ escapedPackageName: z.string().regex(/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+$/),
72
+ stepCount: z.number().int().positive()
73
+ });
27
74
  export const GenerationSessionIdSchema = z.string().regex(/^[A-Za-z\d](?:[A-Za-z\d._-]*[A-Za-z\d])?$/, "Generation session id must be a safe directory name");
28
75
  const LiteralSchema = z.string().refine((value) => !value.includes("${") && !value.includes("}"), "Generation variable bindings must be literal");
29
76
  export const GenerationVariablesSchema = z.strictObject({
@@ -39,7 +86,30 @@ export const GenerationInFlightSchema = z.strictObject({
39
86
  stepIndex: z.number().int().nonnegative(),
40
87
  snapshotHash: Sha256Schema,
41
88
  proposalHash: Sha256Schema,
42
- attemptId: GenerationSessionIdSchema
89
+ attemptId: GenerationSessionIdSchema,
90
+ confirmation: z.strictObject({
91
+ challengeId: GenerationSessionIdSchema,
92
+ approvalMode: z.enum(["localTty", "delegated"])
93
+ }).optional()
94
+ });
95
+ export const ConfirmationReasonSchema = z.strictObject({
96
+ rule: z.enum([
97
+ "policyActionRequiresConfirmation",
98
+ "actionNotAllowlisted",
99
+ "semanticSideEffect"
100
+ ]),
101
+ message: z.string().trim().min(1),
102
+ category: z.enum(["hardCommit", "destructive", "account"]).optional(),
103
+ matchedTerm: z.string().trim().min(1).optional()
104
+ }).superRefine((reason, context) => {
105
+ const semantic = reason.rule === "semanticSideEffect";
106
+ if (semantic !== (reason.category !== undefined)
107
+ || semantic !== (reason.matchedTerm !== undefined)) {
108
+ context.addIssue({
109
+ code: "custom",
110
+ message: "category and matchedTerm belong to the semanticSideEffect rule"
111
+ });
112
+ }
43
113
  });
44
114
  export const PendingConfirmationSchema = z.strictObject({
45
115
  challengeId: GenerationSessionIdSchema,
@@ -48,18 +118,50 @@ export const PendingConfirmationSchema = z.strictObject({
48
118
  snapshotHash: Sha256Schema,
49
119
  evidenceHash: Sha256Schema,
50
120
  actionSummary: z.string().trim().min(1),
121
+ reason: ConfirmationReasonSchema.optional(),
51
122
  expiresAt: z.iso.datetime(),
52
- status: z.enum(["pending", "approved"])
123
+ status: z.enum(["pending", "approved"]),
124
+ approvalMode: z.enum(["localTty", "delegated"]).optional()
53
125
  });
54
126
  const GenerationFailureSchema = z.strictObject({
55
127
  code: GenerationErrorCodeSchema,
56
128
  message: z.string().trim().min(1)
57
129
  });
130
+ export const VerificationPhaseSchema = z.discriminatedUnion("stage", [
131
+ z.strictObject({ stage: z.literal("preparing") }),
132
+ z.strictObject({
133
+ stage: z.literal("replaying"),
134
+ stepIndex: z.number().int().nonnegative(),
135
+ stepCount: z.number().int().positive()
136
+ }).superRefine((phase, context) => {
137
+ if (phase.stepIndex >= phase.stepCount) {
138
+ context.addIssue({
139
+ code: "custom",
140
+ path: ["stepIndex"],
141
+ message: "Replaying phase step index must stay within the step count"
142
+ });
143
+ }
144
+ }),
145
+ z.strictObject({ stage: z.literal("collecting") })
146
+ ]);
147
+ export function verificationPhaseLabel(phase) {
148
+ switch (phase.stage) {
149
+ case "preparing":
150
+ return "preparing device replay";
151
+ case "replaying":
152
+ return `replaying step ${String(phase.stepIndex + 1)}/${String(phase.stepCount)}`;
153
+ case "collecting":
154
+ return "collecting final evidence";
155
+ }
156
+ }
58
157
  const VerificationSchema = z.discriminatedUnion("status", [
59
158
  z.strictObject({ status: z.literal("notRun") }),
60
159
  z.strictObject({
61
160
  status: z.literal("running"),
62
- attemptId: GenerationSessionIdSchema
161
+ attemptId: GenerationSessionIdSchema,
162
+ ownerPid: z.number().int().positive().optional(),
163
+ startedAt: z.iso.datetime().optional(),
164
+ phase: VerificationPhaseSchema.optional()
63
165
  }),
64
166
  z.strictObject({
65
167
  status: z.literal("passed"),
@@ -73,6 +175,12 @@ const VerificationSchema = z.discriminatedUnion("status", [
73
175
  failure: GenerationFailureSchema
74
176
  })
75
177
  ]);
178
+ const VerificationHistoryEntrySchema = z.strictObject({
179
+ failedRevision: NonnegativeSafeIntegerSchema,
180
+ reopenedAt: z.iso.datetime(),
181
+ reason: z.string().trim().min(1).max(500),
182
+ failure: GenerationFailureSchema
183
+ });
76
184
  const PublicationSchema = z.discriminatedUnion("status", [
77
185
  z.strictObject({ status: z.literal("notRun") }),
78
186
  z.strictObject({
@@ -84,16 +192,16 @@ const PublicationSchema = z.discriminatedUnion("status", [
84
192
  failure: GenerationFailureSchema
85
193
  })
86
194
  ]);
87
- export const GenerationSessionSchema = z.strictObject({
88
- version: z.literal(1),
195
+ const GenerationSessionFields = {
89
196
  id: GenerationSessionIdSchema,
90
197
  revision: NonnegativeSafeIntegerSchema,
91
- state: z.enum(["active", "recoveryRequired"]),
198
+ state: z.enum(["active", "recoveryRequired", "archived"]),
92
199
  bindings: z.strictObject({
93
200
  projectHash: Sha256Schema,
94
201
  configHash: Sha256Schema,
95
202
  contextHash: Sha256Schema,
96
- snapshotHash: Sha256Schema.nullable()
203
+ snapshotHash: Sha256Schema.nullable(),
204
+ uiBackend: UiBackendDescriptorSchema
97
205
  }),
98
206
  target: z.strictObject({
99
207
  packageName: z.string().regex(/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+$/),
@@ -101,13 +209,23 @@ export const GenerationSessionSchema = z.strictObject({
101
209
  resetStrategy: z.literal("processOnly"),
102
210
  interactionPolicy: InteractionPolicySchema
103
211
  }),
212
+ contextSelection: ContextSelectionSchema,
213
+ idlePolicy: IdlePolicySchema.optional(),
104
214
  variables: GenerationVariablesSchema,
215
+ baseFlow: GenerationBaseFlowSchema.optional(),
216
+ sourceBrief: GenerationSourceBriefSchema.optional(),
217
+ externalFlows: z.array(GenerationExternalFlowBindingSchema),
105
218
  candidateSteps: z.array(JourneyStepSchema),
106
- candidateSources: z.array(z.enum(["planner", "manualOverride"])),
219
+ candidateSources: z.array(GenerationStepSourceSchema),
107
220
  inFlight: GenerationInFlightSchema.nullable(),
108
221
  pendingConfirmation: PendingConfirmationSchema.nullable(),
109
222
  verification: VerificationSchema,
223
+ verificationHistory: z.array(VerificationHistoryEntrySchema),
110
224
  publication: PublicationSchema
225
+ };
226
+ export const GenerationSessionSchema = z.strictObject({
227
+ version: z.literal(1),
228
+ ...GenerationSessionFields
111
229
  }).superRefine((session, context) => {
112
230
  if (session.candidateSources.length !== session.candidateSteps.length) {
113
231
  context.addIssue({
@@ -116,6 +234,28 @@ export const GenerationSessionSchema = z.strictObject({
116
234
  message: "Candidate provenance must align exactly with candidate steps"
117
235
  });
118
236
  }
237
+ const flowStepCount = session.candidateSources.filter((source) => source === "flow").length;
238
+ if ((session.baseFlow === undefined && flowStepCount !== 0)
239
+ || (session.baseFlow !== undefined
240
+ && (flowStepCount !== session.baseFlow.stepCount
241
+ || session.candidateSources.slice(0, flowStepCount).some((source) => source !== "flow")))) {
242
+ context.addIssue({
243
+ code: "custom",
244
+ path: ["baseFlow"],
245
+ message: "Base Flow provenance must be a contiguous candidate prefix"
246
+ });
247
+ }
248
+ const externalFlowNames = new Set();
249
+ for (const [index, flow] of session.externalFlows.entries()) {
250
+ if (externalFlowNames.has(flow.name)) {
251
+ context.addIssue({
252
+ code: "custom",
253
+ path: ["externalFlows", index, "name"],
254
+ message: "External flow bindings must be unique"
255
+ });
256
+ }
257
+ externalFlowNames.add(flow.name);
258
+ }
119
259
  if (session.state === "recoveryRequired" && session.inFlight === null) {
120
260
  context.addIssue({
121
261
  code: "custom",
@@ -165,7 +305,18 @@ export const GenerationSessionSchema = z.strictObject({
165
305
  message: "Publication can only start after passed verification"
166
306
  });
167
307
  }
308
+ if (session.state === "archived"
309
+ && (session.inFlight !== null || session.pendingConfirmation !== null)) {
310
+ context.addIssue({
311
+ code: "custom",
312
+ path: ["state"],
313
+ message: "Archived sessions must not carry in-flight work or pending confirmation"
314
+ });
315
+ }
168
316
  });
317
+ export function isGenerationConfirmationExpired(challenge, now) {
318
+ return now.getTime() >= new Date(challenge.expiresAt).getTime();
319
+ }
169
320
  export const GenerationConfirmationEvidenceSchema = z.strictObject({
170
321
  version: z.literal(1),
171
322
  proposal: ProposedStepSchema,
@@ -207,21 +358,55 @@ const BundleRelativePathSchema = z.string().min(1).superRefine((path, context) =
207
358
  });
208
359
  export const GenerationMetaSchema = z.strictObject({
209
360
  version: z.literal(1),
210
- status: z.literal("verified"),
361
+ status: z.enum(["verified", "promoted"]),
362
+ promotion: z.strictObject({
363
+ promotedAt: z.iso.datetime(),
364
+ reason: z.string().trim().min(1)
365
+ }).optional(),
366
+ retired: z.strictObject({
367
+ retiredAt: z.iso.datetime(),
368
+ reason: z.string().trim().min(1)
369
+ }).optional(),
211
370
  generationId: GenerationSessionIdSchema,
212
371
  journeyPath: ProjectRelativePathSchema,
372
+ journeySha256: Sha256Schema,
213
373
  bindings: z.strictObject({
214
374
  projectHash: Sha256Schema,
215
375
  configHash: Sha256Schema,
216
- contextHash: Sha256Schema
376
+ contextHash: Sha256Schema,
377
+ uiBackend: UiBackendDescriptorSchema
217
378
  }),
379
+ replayPolicy: z.strictObject({
380
+ generatedReplayPolicy: z.boolean(),
381
+ requireFocusedInput: z.boolean(),
382
+ idle: IdlePolicySchema
383
+ }),
384
+ contextSelection: ContextSelectionSchema,
218
385
  verification: z.strictObject({
219
386
  reportPath: BundleRelativePathSchema,
220
387
  reportSha256: Sha256Schema,
221
388
  runId: z.string().min(1),
222
389
  runs: z.literal(1)
223
390
  }),
391
+ baseFlow: GenerationBaseFlowSchema.optional(),
392
+ sourceBrief: GenerationSourceBriefSchema.optional(),
393
+ externalFlows: z.array(GenerationExternalFlowBindingSchema),
224
394
  manualOverrideStepIndexes: z.array(z.number().int().nonnegative())
395
+ }).superRefine((meta, context) => {
396
+ if (meta.status === "verified" && meta.promotion !== undefined) {
397
+ context.addIssue({
398
+ code: "custom",
399
+ path: ["promotion"],
400
+ message: "Only promoted Journeys carry promotion details"
401
+ });
402
+ }
403
+ if (meta.status === "promoted" && meta.promotion === undefined) {
404
+ context.addIssue({
405
+ code: "custom",
406
+ path: ["promotion"],
407
+ message: "Promoted Journeys require promotion details"
408
+ });
409
+ }
225
410
  });
226
411
  export const GenerationReportSchema = z.strictObject({
227
412
  version: z.literal(1),
@@ -229,7 +414,7 @@ export const GenerationReportSchema = z.strictObject({
229
414
  status: z.literal("verified"),
230
415
  steps: z.array(z.strictObject({
231
416
  index: z.number().int().nonnegative(),
232
- source: z.enum(["planner", "manualOverride"])
417
+ source: GenerationStepSourceSchema
233
418
  })).min(1)
234
419
  }).superRefine((report, context) => {
235
420
  for (const [index, step] of report.steps.entries()) {
@@ -277,10 +462,14 @@ export function generationCoreIdentity(session) {
277
462
  bindings: {
278
463
  projectHash: session.bindings.projectHash,
279
464
  configHash: session.bindings.configHash,
280
- contextHash: session.bindings.contextHash
465
+ contextHash: session.bindings.contextHash,
466
+ uiBackend: session.bindings.uiBackend
281
467
  },
282
468
  target: session.target,
283
- variables: session.variables
469
+ contextSelection: session.contextSelection,
470
+ variables: session.variables,
471
+ ...(session.baseFlow === undefined ? {} : { baseFlow: session.baseFlow }),
472
+ externalFlows: session.externalFlows
284
473
  };
285
474
  }
286
475
  export function bindGenerationVariables(input) {
@@ -0,0 +1,13 @@
1
+ import { z } from "zod";
2
+ export declare const PointSchema: z.ZodObject<{
3
+ x: z.ZodNumber;
4
+ y: z.ZodNumber;
5
+ }, z.core.$strict>;
6
+ export type Point = z.infer<typeof PointSchema>;
7
+ export declare const DisplayViewportSchema: z.ZodObject<{
8
+ width: z.ZodNumber;
9
+ height: z.ZodNumber;
10
+ rotation: z.ZodUnion<readonly [z.ZodLiteral<0>, z.ZodLiteral<90>, z.ZodLiteral<180>, z.ZodLiteral<270>]>;
11
+ coordinateSpace: z.ZodLiteral<"physicalDisplayPixels">;
12
+ }, z.core.$strict>;
13
+ export type DisplayViewport = z.infer<typeof DisplayViewportSchema>;
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ export const PointSchema = z.strictObject({
3
+ x: z.number().int().nonnegative(),
4
+ y: z.number().int().nonnegative()
5
+ });
6
+ export const DisplayViewportSchema = z.strictObject({
7
+ width: z.number().int().positive(),
8
+ height: z.number().int().positive(),
9
+ rotation: z.union([
10
+ z.literal(0),
11
+ z.literal(90),
12
+ z.literal(180),
13
+ z.literal(270)
14
+ ]),
15
+ coordinateSpace: z.literal("physicalDisplayPixels")
16
+ });
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ export declare const ChangedFileStatusSchema: z.ZodEnum<{
3
+ added: "added";
4
+ modified: "modified";
5
+ deleted: "deleted";
6
+ renamed: "renamed";
7
+ }>;
8
+ export declare const ChangedFileSchema: z.ZodObject<{
9
+ path: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
10
+ status: z.ZodEnum<{
11
+ added: "added";
12
+ modified: "modified";
13
+ deleted: "deleted";
14
+ renamed: "renamed";
15
+ }>;
16
+ oldPath: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
17
+ }, z.core.$strict>;
18
+ export declare const ChangeSetSchema: z.ZodObject<{
19
+ version: z.ZodLiteral<1>;
20
+ base: z.ZodString;
21
+ head: z.ZodString;
22
+ files: z.ZodArray<z.ZodObject<{
23
+ path: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
24
+ status: z.ZodEnum<{
25
+ added: "added";
26
+ modified: "modified";
27
+ deleted: "deleted";
28
+ renamed: "renamed";
29
+ }>;
30
+ oldPath: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
31
+ }, z.core.$strict>>;
32
+ }, z.core.$strict>;
33
+ export declare const JourneySelectionSchema: z.ZodObject<{
34
+ id: z.ZodString;
35
+ reason: z.ZodString;
36
+ }, z.core.$strict>;
37
+ export declare const ImpactSetSchema: z.ZodObject<{
38
+ version: z.ZodLiteral<1>;
39
+ base: z.ZodString;
40
+ head: z.ZodString;
41
+ affectedModules: z.ZodArray<z.ZodString>;
42
+ affectedFeatures: z.ZodArray<z.ZodString>;
43
+ affectedScreens: z.ZodArray<z.ZodString>;
44
+ affectedAnchors: z.ZodArray<z.ZodString>;
45
+ selectedJourneys: z.ZodObject<{
46
+ p0: z.ZodArray<z.ZodObject<{
47
+ id: z.ZodString;
48
+ reason: z.ZodString;
49
+ }, z.core.$strict>>;
50
+ p1: z.ZodArray<z.ZodObject<{
51
+ id: z.ZodString;
52
+ reason: z.ZodString;
53
+ }, z.core.$strict>>;
54
+ p2: z.ZodArray<z.ZodObject<{
55
+ id: z.ZodString;
56
+ reason: z.ZodString;
57
+ }, z.core.$strict>>;
58
+ }, z.core.$strict>;
59
+ skippedJourneys: z.ZodArray<z.ZodObject<{
60
+ id: z.ZodString;
61
+ reason: z.ZodString;
62
+ }, z.core.$strict>>;
63
+ provenance: z.ZodObject<{
64
+ contextHash: z.ZodString;
65
+ knowledgeHash: z.ZodString;
66
+ }, z.core.$strict>;
67
+ }, z.core.$strict>;
68
+ export type ChangeSet = z.infer<typeof ChangeSetSchema>;
69
+ export type ChangedFile = z.infer<typeof ChangedFileSchema>;
70
+ export type ImpactSet = z.infer<typeof ImpactSetSchema>;
71
+ export type JourneySelection = z.infer<typeof JourneySelectionSchema>;
@@ -0,0 +1,76 @@
1
+ import { z } from "zod";
2
+ import { KnowledgeIdSchema } from "./knowledge.js";
3
+ import { ProjectRelativePathSchema } from "./project-context.js";
4
+ export const ChangedFileStatusSchema = z.enum([
5
+ "added",
6
+ "modified",
7
+ "deleted",
8
+ "renamed"
9
+ ]);
10
+ export const ChangedFileSchema = z.strictObject({
11
+ path: ProjectRelativePathSchema,
12
+ status: ChangedFileStatusSchema,
13
+ oldPath: ProjectRelativePathSchema.optional()
14
+ }).superRefine((file, context) => {
15
+ if (file.status === "renamed" && file.oldPath === undefined) {
16
+ context.addIssue({
17
+ code: "custom",
18
+ path: ["oldPath"],
19
+ message: "A renamed file must declare its old path"
20
+ });
21
+ }
22
+ if (file.oldPath === file.path) {
23
+ context.addIssue({
24
+ code: "custom",
25
+ path: ["oldPath"],
26
+ message: "A renamed file cannot keep its own path"
27
+ });
28
+ }
29
+ });
30
+ export const ChangeSetSchema = z.strictObject({
31
+ version: z.literal(1),
32
+ base: z.string().trim().min(1),
33
+ head: z.string().trim().min(1),
34
+ files: z.array(ChangedFileSchema).min(1)
35
+ }).superRefine((changeSet, context) => {
36
+ const allPaths = new Set();
37
+ for (const [index, file] of changeSet.files.entries()) {
38
+ const candidates = [
39
+ file.path,
40
+ ...(file.oldPath === undefined ? [] : [file.oldPath])
41
+ ];
42
+ for (const path of candidates) {
43
+ if (allPaths.has(path)) {
44
+ context.addIssue({
45
+ code: "custom",
46
+ path: ["files", index, "path"],
47
+ message: `ChangeSet path ${path} appears more than once`
48
+ });
49
+ }
50
+ allPaths.add(path);
51
+ }
52
+ }
53
+ });
54
+ export const JourneySelectionSchema = z.strictObject({
55
+ id: z.string().trim().min(1),
56
+ reason: z.string().trim().min(1)
57
+ });
58
+ export const ImpactSetSchema = z.strictObject({
59
+ version: z.literal(1),
60
+ base: z.string().trim().min(1),
61
+ head: z.string().trim().min(1),
62
+ affectedModules: z.array(z.string().trim().min(1)),
63
+ affectedFeatures: z.array(z.string().trim().min(1)),
64
+ affectedScreens: z.array(KnowledgeIdSchema),
65
+ affectedAnchors: z.array(KnowledgeIdSchema),
66
+ selectedJourneys: z.strictObject({
67
+ p0: z.array(JourneySelectionSchema),
68
+ p1: z.array(JourneySelectionSchema),
69
+ p2: z.array(JourneySelectionSchema)
70
+ }),
71
+ skippedJourneys: z.array(JourneySelectionSchema),
72
+ provenance: z.strictObject({
73
+ contextHash: z.string().regex(/^[a-f\d]{64}$/),
74
+ knowledgeHash: z.string().regex(/^[a-f\d]{64}$/)
75
+ })
76
+ });
@@ -1,5 +1,4 @@
1
1
  import { z } from "zod";
2
- export declare const SKILL_DIRECTORY_NAME = "taphound-ai-journey";
3
2
  export declare const AGENT_IDS: readonly ["claude", "codex", "cursor", "droid", "other"];
4
3
  export type AgentId = (typeof AGENT_IDS)[number];
5
4
  export declare const AgentIdSchema: z.ZodEnum<{
@@ -26,17 +25,26 @@ export declare class NoAgentsSelectedError extends Error {
26
25
  constructor();
27
26
  }
28
27
  export interface TargetPath {
28
+ readonly skillName: string;
29
29
  readonly absolutePath: string;
30
30
  readonly relativePath: string;
31
31
  readonly agents: AgentId[];
32
32
  readonly skipped: boolean;
33
33
  }
34
- export declare function resolveTargetPaths(agents: readonly AgentId[], global: boolean, cwd: string, homedir: string): TargetPath[];
34
+ export declare function resolveTargetPaths(skillNames: readonly string[], agents: readonly AgentId[], global: boolean, cwd: string, homedir: string): TargetPath[];
35
+ export interface SkillInstallGroup {
36
+ readonly name: string;
37
+ readonly paths: string[];
38
+ readonly skipped: string[];
39
+ }
35
40
  export declare const InitResultSchema: z.ZodObject<{
36
41
  status: z.ZodLiteral<"installed">;
37
42
  exitCode: z.ZodLiteral<0>;
38
43
  agents: z.ZodArray<z.ZodString>;
39
- paths: z.ZodArray<z.ZodString>;
40
- skipped: z.ZodOptional<z.ZodArray<z.ZodString>>;
44
+ skills: z.ZodArray<z.ZodObject<{
45
+ name: z.ZodString;
46
+ paths: z.ZodArray<z.ZodString>;
47
+ skipped: z.ZodOptional<z.ZodArray<z.ZodString>>;
48
+ }, z.core.$strict>>;
41
49
  }, z.core.$strict>;
42
50
  export type InitResult = z.infer<typeof InitResultSchema>;
@@ -1,6 +1,5 @@
1
1
  import { resolve } from "node:path";
2
2
  import { z } from "zod";
3
- export const SKILL_DIRECTORY_NAME = "taphound-ai-journey";
4
3
  export const AGENT_IDS = [
5
4
  "claude",
6
5
  "codex",
@@ -77,28 +76,32 @@ export class NoAgentsSelectedError extends Error {
77
76
  this.name = "NoAgentsSelectedError";
78
77
  }
79
78
  }
80
- export function resolveTargetPaths(agents, global, cwd, homedir) {
79
+ export function resolveTargetPaths(skillNames, agents, global, cwd, homedir) {
81
80
  if (agents.length === 0) {
82
81
  throw new NoAgentsSelectedError();
83
82
  }
84
83
  const map = new Map();
85
- for (const id of agents) {
86
- const definition = findAgentDefinition(id);
87
- const baseDir = global ? definition.globalPath : definition.projectPath;
88
- const relativePath = `${baseDir}/${SKILL_DIRECTORY_NAME}`;
89
- const absolutePath = resolve(global ? homedir : cwd, relativePath);
90
- const existing = map.get(absolutePath);
91
- if (existing === undefined) {
92
- map.set(absolutePath, {
93
- relativePath,
94
- agents: [id]
95
- });
96
- }
97
- else {
98
- existing.agents.push(id);
84
+ for (const skillName of skillNames) {
85
+ for (const id of agents) {
86
+ const definition = findAgentDefinition(id);
87
+ const baseDir = global ? definition.globalPath : definition.projectPath;
88
+ const relativePath = `${baseDir}/${skillName}`;
89
+ const absolutePath = resolve(global ? homedir : cwd, relativePath);
90
+ const existing = map.get(absolutePath);
91
+ if (existing === undefined) {
92
+ map.set(absolutePath, {
93
+ skillName,
94
+ relativePath,
95
+ agents: [id]
96
+ });
97
+ }
98
+ else {
99
+ existing.agents.push(id);
100
+ }
99
101
  }
100
102
  }
101
103
  return [...map.entries()].map(([absolutePath, entry]) => ({
104
+ skillName: entry.skillName,
102
105
  absolutePath,
103
106
  relativePath: entry.relativePath,
104
107
  agents: entry.agents,
@@ -109,6 +112,9 @@ export const InitResultSchema = z.strictObject({
109
112
  status: z.literal("installed"),
110
113
  exitCode: z.literal(0),
111
114
  agents: z.array(z.string()),
112
- paths: z.array(z.string()),
113
- skipped: z.array(z.string()).optional()
115
+ skills: z.array(z.strictObject({
116
+ name: z.string(),
117
+ paths: z.array(z.string()),
118
+ skipped: z.array(z.string()).optional()
119
+ }))
114
120
  });