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
@@ -0,0 +1,494 @@
1
+ ---
2
+ name: taphound-journey-brief-author
3
+ description: >-
4
+ Author and maintain the TapHound Project Context Bundle and author one
5
+ Journey Brief per Case. Ensures a valid Context (generate, refresh,
6
+ rehash, validate) before combining Android source analysis with read-only
7
+ device observation into a taphound-journey-brief.md, ready for the
8
+ taphound-journey-generator skill to consume. Use when the user wants to
9
+ generate, refresh, or regenerate the Project Context, initialize project
10
+ context, create a journey brief, or prepare case context before journey
11
+ generation.
12
+ compatibility: >-
13
+ Requires Node.js 22+, Android SDK with ADB and uiautomator, and TapHound
14
+ built and linked. Context-only runs need no device; Brief authoring
15
+ prefers one online Android device.
16
+ metadata:
17
+ author: TapHound
18
+ version: "2.0"
19
+ ---
20
+
21
+ # TapHound Journey Brief Author Skill
22
+
23
+ This Skill is the single read-only **producer** of the two pre-Journey
24
+ artifacts:
25
+
26
+ 1. **Project Context Bundle** (project-wide, cached, reused by every
27
+ Case) — generated once, refreshed after source changes, and persisted
28
+ under `.taphound/context/`. It describes the project's modules,
29
+ Activities, UI elements, navigation transitions, and interaction policy.
30
+ 2. **Journey Brief** (one per Case) — the untrusted static handoff from
31
+ the planning phase to the Journey generation phase. It reduces broad
32
+ source rediscovery but never weakens Core validation, live Snapshot
33
+ binding, risk policy, or final Replay.
34
+
35
+ The `taphound-journey-generator` skill is the **consumer** of both. It requires a
36
+ valid Context and never generates or repairs it; when it encounters a stale
37
+ or invalid Context, it stops and requires this Skill to run first. The Brief
38
+ is handed over through a `{path, sha256}` binding.
39
+
40
+ Core does all Context structural bookkeeping: module discovery, identity
41
+ inspection (`packageName`, `launchActivity`), evidence and inventory
42
+ hashing, and atomic writes. The agent's job is to fill in semantic `summary`
43
+ fields that Core cannot infer from source alone, then combine them with
44
+ Case analysis into the Brief.
45
+
46
+ ## Skill Directory
47
+
48
+ All file references are relative to `assets/skills/taphound-journey-brief-author/`.
49
+ The directory contains:
50
+
51
+ - `prompts/brief-author-role.md` (+ zh-CN) — the lean subagent bootstrap prompt
52
+ - `prompts/context-analyze-project.md` — module-by-module semantic analysis guidance
53
+ - `schemas/` — JSON Schemas for the Context index, module shards, and refresh result
54
+ - `templates/` — the Brief skeleton and example Context files
55
+ - `CONTEXT-GUIDE.md` — detailed end-to-end Context usage guide
56
+
57
+ Read `prompts/context-analyze-project.md`, the relevant Context schema, and
58
+ `CONTEXT-GUIDE.md` before performing any Context ensure work (Phase 0
59
+ branches L1–L3). The normal per-Case happy path (Context valid) does not
60
+ need them.
61
+
62
+ ## How to Use This Skill
63
+
64
+ Run `taphound init --agent <ids>` to install. The Skill is installed alongside
65
+ `taphound-journey-generator` into each agent's skills directory.
66
+
67
+ ### Two consumption modes
68
+
69
+ 1. **Subagent dispatch (primary)**: Copy the full content of
70
+ `prompts/brief-author-role.md` into the subagent's PROMPT configuration
71
+ field. The orchestrator dispatches one task per Case with explicit
72
+ inputs (see Inputs below). The subagent returns a structured JSON
73
+ summary; the orchestrator never re-parses raw exploration content.
74
+
75
+ 2. **Manual single-Case**: An agent loads this SKILL.md directly, follows
76
+ the phases below, and produces one Brief.
77
+
78
+ ### Relationship to the Journey Skill
79
+
80
+ ```
81
+ Orchestrator (lean context)
82
+ |
83
+ ├── dispatches brief-author subagent
84
+ | inputs: {project, caseGoal, caseId?, contextPaths?, observeSnapshot?, contextOnly?}
85
+ | output: {path, sha256, caseId, edgesVerified, edgesNeedsObservation}
86
+ | (contextOnly runs return the Context summary instead)
87
+ |
88
+ ├── human Review (brief is an inspectable artifact)
89
+ |
90
+ └── dispatches journey subagent
91
+ inputs: {project, goal, journeyBrief: {path, sha256}}
92
+ output: {journeyPath, reportPath, verified}
93
+ ```
94
+
95
+ ## Inputs
96
+
97
+ | Parameter | Required | Default | Description |
98
+ |-----------------|----------|--------------------------------------------------|--------------------------------------------------|
99
+ | project | yes | — | Android project root path |
100
+ | caseGoal | yes | — | One Case's test scenario (ignored when `contextOnly`) |
101
+ | caseId | no | — | Case identifier for frontmatter |
102
+ | contextPaths | no | — | Explicit path array; orchestrator decides which docs |
103
+ | context | no | `.taphound/context/project-context.json` | Project Context path (relative to project) |
104
+ | contextOnly | no | `false` | Run only the Context lifecycle (ensure/refresh/regenerate); skip Brief authoring |
105
+ | observeSnapshot | no | — | Pre-captured `taphound observe --json` result |
106
+ | device | no | doctor auto-selects | Device serial |
107
+ | output | no | `.taphound/journeys/taphound-journey-brief.md` | Brief output path (relative to project) |
108
+
109
+ **Hard rule**: NEVER search for or assume files named `plan.md`,
110
+ `requirement.md`, or any convention. Read ONLY files the caller explicitly
111
+ passes via `contextPaths`. If no `contextPaths` are supplied, work from
112
+ `caseGoal` alone plus source code and Project Context.
113
+
114
+ ## Output
115
+
116
+ For a Brief run, the Skill writes a `taphound-journey-brief.md` at the
117
+ `output` path and returns a structured JSON summary:
118
+
119
+ ```json
120
+ {
121
+ "status": "authored",
122
+ "caseId": "CASE-002",
123
+ "path": ".taphound/journeys/taphound-journey-brief.md",
124
+ "sha256": "<exact-byte-hash>",
125
+ "edgesVerified": 2,
126
+ "edgesNeedsObservation": 1
127
+ }
128
+ ```
129
+
130
+ For a `contextOnly` run, the Skill ensures the Context and returns:
131
+
132
+ ```json
133
+ {
134
+ "status": "valid",
135
+ "contextPath": ".taphound/context/project-context.json",
136
+ "modules": [
137
+ { "id": ":app", "status": "complete" },
138
+ { "id": ":feature:search", "status": "complete" }
139
+ ]
140
+ }
141
+ ```
142
+
143
+ On failure either mode returns:
144
+
145
+ ```json
146
+ {
147
+ "status": "failed",
148
+ "failure": { "code": "...", "message": "..." }
149
+ }
150
+ ```
151
+
152
+ ## Phase 0: Preflight and Context Ensure
153
+
154
+ Prerequisites: Node.js 22+ (avoid 23), Android SDK with ADB and
155
+ `uiautomator`, and TapHound built and linked. A device is required for
156
+ Brief authoring (Phase 2) but NOT for Context-only runs or any Context
157
+ ensure work — doctor may report `DEVICE_UNAVAILABLE`, which is acceptable
158
+ whenever the run stays on the Context path.
159
+
160
+ 1. Verify `taphound` is available.
161
+ 2. Run `taphound doctor --project <project> --json`.
162
+ - Brief run: confirm `"status": "passed"` and capture `deviceSerial`.
163
+ - `contextOnly` run: environment must be usable without a device;
164
+ `DEVICE_UNAVAILABLE` is acceptable.
165
+ 3. **Context ensure** — this Skill owns the full Context lifecycle. Check
166
+ the Project Context:
167
+ ```bash
168
+ taphound context status \
169
+ --project <project> \
170
+ --context <context> --json
171
+ ```
172
+ - `"valid"`: confirm module completeness with
173
+ `taphound context list --json`. If all selected modules are
174
+ `complete`, the Context is current — proceed to Phase 1 (or return
175
+ the Context summary if `contextOnly`). If any module is incomplete,
176
+ complete that shard first (L1 steps 2–4 for that module only).
177
+ - `"stale"`: run the incremental update flow **L2** below.
178
+ - `"invalid"`: run full regeneration **L3** below.
179
+ - File missing: run initial generation **L1** below.
180
+
181
+ ## Context Lifecycle
182
+
183
+ These branches run only when Phase 0 detects Context work. After any
184
+ branch, re-run `taphound context status --json` and `taphound context
185
+ list --json`; proceed only when the Context is `valid` with `complete` or
186
+ `unsupported` modules (`unsupported` is an analyzed verdict generation
187
+ accepts; `partial`/`notAnalyzed` are coverage gaps — report them to the
188
+ user).
189
+
190
+ ### L1: Initial Generation (file missing, or explicit `force`)
191
+
192
+ > Read `prompts/context-analyze-project.md` before starting — it contains
193
+ > detailed module-by-module semantic analysis guidance. Read both Context
194
+ > schemas (`schemas/project-context.json` and
195
+ > `schemas/project-context-module.json`) and both Context templates before
196
+ > editing shards.
197
+
198
+ 1. Generate the Context skeleton. Core discovers Gradle modules, inspects
199
+ `applicationId` and launch Activity, computes evidence and inventory
200
+ hashes, and writes one `notAnalyzed` shard per module with an empty
201
+ `summary`:
202
+ ```bash
203
+ taphound context generate \
204
+ --project <project> \
205
+ --json
206
+ ```
207
+ Use `--force` to overwrite an existing Context. Review the generated
208
+ module list and verify `packageName` and `launchActivity` match the
209
+ project; verify `packageName` comes from `applicationId` in
210
+ `build.gradle(.kts)`, NOT from the `package` attribute in
211
+ `AndroidManifest.xml` (deprecated in AGP 7+). Core resolves this
212
+ automatically; verify the result matches the installed app.
213
+ 2. Fill in semantic summaries. For each shard under
214
+ `.taphound/context/modules/<module>.json`, read the module's source per
215
+ `prompts/context-analyze-project.md` and populate the `summary` object:
216
+ - `features`: domain terms this module contributes
217
+ - `activities`: Activity names, entry points, and screen names
218
+ - `elements`: interactive UI elements per screen with supported actions
219
+ - `transitions`: cross-Activity navigation paths
220
+ - `logcat`: `Log.i`/`Log.d` tag+pattern candidates for expectations
221
+ Set the shard `status` to `complete`, `partial`, or `unsupported`.
222
+ Never leave a shard as `notAnalyzed` after this step.
223
+ 3. Update the root index (`.taphound/context/project-context.json`):
224
+ - Copy `features`, `activities`, and `status` from each shard into the
225
+ corresponding module entry.
226
+ - Update `interactionPolicy.allowedActions` to match actions the UI
227
+ actually supports (derived from source evidence). Leave
228
+ `confirmationRequiredActions` empty unless ALL instances of an
229
+ action are genuinely dangerous.
230
+ 4. Rehash to update all shard and index hashes:
231
+ ```bash
232
+ taphound context rehash \
233
+ --project <project> \
234
+ --context .taphound/context/project-context.json \
235
+ --json
236
+ ```
237
+ 5. Validate:
238
+ ```bash
239
+ taphound context validate \
240
+ --project <project> \
241
+ --context .taphound/context/project-context.json \
242
+ --json
243
+ ```
244
+ If validation fails, fix the named index or shard and retry. Common
245
+ failures: package name mismatch, stale hash (run `context rehash`),
246
+ path containing `..` or starting with `/`, file listed in manifest but
247
+ not found on disk.
248
+ 6. Confirm module completeness via `taphound context list --json`.
249
+
250
+ ### L2: Incremental Update (`stale`, content-only changes)
251
+
252
+ Run when the Context is `"stale"` but the module catalog has not changed
253
+ structurally — the typical update after routine source edits such as a
254
+ requirement change.
255
+
256
+ 1. Confirm module completeness with `taphound context list --json`.
257
+
258
+ **Decision matrix:**
259
+
260
+ | `context status` | Module catalog | Action |
261
+ |------------------|-------------------------|-----------------------------------------------------------------|
262
+ | `valid` | All modules complete | Context is current. Done. |
263
+ | `valid` | Any module incomplete | Complete that module shard (L1 steps 2–4 for that module only) |
264
+ | `stale` | Existing module changed | Run `context refresh --json`, act on each block's `resolution` |
265
+ | `stale` | Module catalog changed | L3 (full regeneration) |
266
+ | `invalid` | — | L3 (full regeneration) |
267
+
268
+ 2. Hash-only refresh before any re-analysis:
269
+ ```bash
270
+ taphound context refresh \
271
+ --project <project> \
272
+ --context .taphound/context/project-context.json \
273
+ --json
274
+ ```
275
+ Read `schemas/context-refresh-result.json` for the full result shape.
276
+ - `"refreshed"` / `"unchanged"`: nothing semantic changed.
277
+ `semanticSha256` values are backfilled, formatting- or comment-only
278
+ edits are rehashed, drifted shard hashes in the index are repaired,
279
+ and the Context is current. Validate and done.
280
+ - `"blocked"`: the response lists modules and files that changed
281
+ semantically, whose inventory changed, or whose evidence is missing.
282
+ Each block carries a `resolution` field — act on it, do not blanket
283
+ re-analyze:
284
+
285
+ | block `code` | `resolution` | Action |
286
+ |---------------------------|---------------------|---------------------------------------------------------------------------------------------------------------------|
287
+ | `EVIDENCE_UNRESOLVED` | `pruneDeleted` | A tracked file was deleted. Re-run with `--prune-deleted` (drops the entry). Combine with `--accept-source-changes` if inventory also drifted. |
288
+ | `EVIDENCE_SEMANTIC_CHANGED` | `acceptSourceChanges` | A tracked file's semantics changed. Re-run with `--accept-source-changes` to rehash. Re-analyze (step 3) only if the module summary is now wrong. |
289
+ | `MODULE_INVENTORY_CHANGED` | `acceptSourceChanges` | The on-disk file set grew or shrank. Re-run with `--accept-source-changes` to accept the new inventory hash. Re-analyze (step 3) only when new UI files were added that the summary must cover. |
290
+ | `EVIDENCE_UNRESOLVED` | `reanalyze` | An evidence file is unreadable/escaped/too large (not a clean deletion). Fix the file or regenerate that module's shard (L1 steps 2–4 for that module only). |
291
+
292
+ The typical one-shot reconcile for routine edits + deletions:
293
+ ```bash
294
+ taphound context refresh \
295
+ --project <project> \
296
+ --context .taphound/context/project-context.json \
297
+ --prune-deleted --accept-source-changes --json
298
+ ```
299
+
300
+ `--module <id...>` narrows scope. `--accept-source-changes` rehashes
301
+ semantic and inventory drift; use it only after confirming the recorded
302
+ module summary (screens, elements, transitions, Logcat) is still
303
+ accurate, because `refresh` never updates semantics. `--prune-deleted`
304
+ only drops entries for files that are truly gone (`notFound`);
305
+ unreadable or escaped files stay blocked as `reanalyze`.
306
+
307
+ 3. Selective re-analysis (when needed): when a block's `resolution` is
308
+ `reanalyze`, or when `acceptSourceChanges` would hide newly added UI
309
+ screens the Goal may reach, regenerate the affected module shards
310
+ instead of reanalyzing unrelated features:
311
+ 1. Identify which files changed (the `context status` output lists them).
312
+ 2. Recompute SHA-256 for each changed file (Core does this via
313
+ `context rehash`).
314
+ 3. If any changed file is an Activity source, re-read it to check for:
315
+ new Logcat tags (expect candidates), new click handlers or input
316
+ fields (interactionPolicy), new `startActivity` calls (navigation).
317
+ 4. If any changed file is a layout XML, re-read it to check for: new
318
+ `android:id` elements (locator candidates), removed elements, changed
319
+ `android:text` or `android:contentDescription`.
320
+ 5. Update shard semantics, evidence, and inventory. Write the shard,
321
+ recompute its file hash, and update the root index reference.
322
+ 6. Update the global `interactionPolicy` only when needed, then
323
+ rehash and validate (L1 steps 4–5).
324
+
325
+ ### L3: Full Regeneration (`invalid`, or structural changes)
326
+
327
+ Run full regeneration when:
328
+ - A new Gradle module was added or removed (check `settings.gradle`).
329
+ - The `packageName` or `launchActivity` changed.
330
+ - The Context is `"invalid"` (structural corruption).
331
+ - The user explicitly requests a full refresh (`force`).
332
+
333
+ 1. Re-analyze the source (read `prompts/context-analyze-project.md`).
334
+ 2. Generate with `--force` to overwrite the existing Context:
335
+ ```bash
336
+ taphound context generate \
337
+ --project <project> \
338
+ --force \
339
+ --json
340
+ ```
341
+ Core re-discovers all modules, resolves identity, and writes fresh
342
+ `notAnalyzed` shards.
343
+ 3. Follow L1 steps 2–6 (fill semantic summaries, update root index,
344
+ rehash, validate, list).
345
+
346
+ ## Phase 1: Case Analysis
347
+
348
+ > This section is the authoritative Brief procedure. The subagent prompt
349
+ > (`prompts/brief-author-role.md`) is a lean bootstrap that directs the
350
+ > subagent here; it does not duplicate this procedure. Skip this phase and
351
+ > the next two when running with `contextOnly`.
352
+
353
+ 1. If `contextPaths` is provided, read ONLY those explicit files. Extract
354
+ context relevant to `caseGoal`.
355
+ 2. Read the Project Context root index. Select modules relevant to
356
+ `caseGoal` using their `features`, `activities`, and `transitions`.
357
+ 3. Read the selected module shards' `summary` objects.
358
+ 4. Perform targeted source reading for Activities and layouts mentioned in
359
+ the Case:
360
+ - Kotlin/Java: map `setContentView` to Activity→layout, find click
361
+ handlers, `Log.i/d` tags, `startActivity` calls.
362
+ - Layout XML: extract `@+id/<name>` (bare = resourceId), `android:text`,
363
+ `contentDescription`.
364
+ 5. Build a draft State Transition Map:
365
+ - Edges with clear source evidence → `confidence: source`
366
+ - Inferred edges → `confidence: needs-observation`
367
+ 6. Extract logcat tag candidates, locator candidates, and idempotency
368
+ notes from source.
369
+
370
+ ## Phase 2: Device Observation (read-only)
371
+
372
+ If `observeSnapshot` is provided by the orchestrator, use it directly. Do
373
+ NOT call `taphound observe` yourself (the orchestrator pre-captured it to
374
+ enable parallel brief authoring without device contention).
375
+
376
+ If `observeSnapshot` is NOT provided and a device is available, you may
377
+ run:
378
+ ```bash
379
+ taphound observe --project <project> --device <serial> \
380
+ --logcat-lines 200 --json
381
+ ```
382
+
383
+ Verify:
384
+ 1. `report.foreground.activity` matches the Project Context's
385
+ `launchActivity`.
386
+ 2. Search `report.layout[]` for the first `source` edge's locator element:
387
+ - Match by `resourceId` → `text` → `contentDescription` priority.
388
+ - Confirm element `enabled: true` and supports the target action
389
+ (e.g., `clickable: true`).
390
+ 3. Extract logcat tag patterns from `report.logcat[]` for Capability
391
+ Notes.
392
+ 4. Edges verifiable in the snapshot keep `source` confidence. Edges not
393
+ verifiable remain `needs-observation`.
394
+
395
+ If no device is available and no snapshot is provided, skip this phase.
396
+ All edges retain their Phase 1 confidence.
397
+
398
+ ## Phase 3: Author Brief
399
+
400
+ 1. Use `templates/taphound-journey-brief.template.md` as the skeleton.
401
+ 2. Fill frontmatter: `schemaVersion: 2`, `kind: taphound.journeyBrief`,
402
+ `caseId` (if provided).
403
+ 3. Fill all 9 required sections:
404
+ - `# Goal`: from `caseGoal`.
405
+ - `## Preconditions`: from `contextPaths` docs or default
406
+ "independent cold launch".
407
+ - `## Expected Journey`: numbered steps from the State Transition Map
408
+ edge sequence.
409
+ - `## State Transition Map`: Mermaid diagram + edge table with
410
+ confidence and locator hints.
411
+ - `## Capability Notes`: runtime variable capture, multi-field
412
+ locators, logcat semantics.
413
+ - `## Assertions`: from `contextPaths` docs and source analysis.
414
+ - `## Implementation Hints`: resourceIds, module paths.
415
+ - `## Constraints`: no coordinates, Final Replay must pass,
416
+ idempotency notes.
417
+ - `## Evidence References`: source file paths.
418
+ 4. Write to the `output` path.
419
+ 5. Compute SHA-256 via shell: `shasum -a 256 <file>`.
420
+ 6. Return the structured JSON summary.
421
+
422
+ ## Key Rules
423
+
424
+ - Use ONLY read-only commands: `observe`, `context generate`, `context
425
+ refresh`, `context rehash`, `context validate`, `context status`,
426
+ `context list`, `knowledge status`, `journey check`, `doctor`,
427
+ `project describe`. NEVER use
428
+ `generation`, `verify`, `record`, `align`.
429
+ - Do NOT modify device state (no clicks, no input, no swipes).
430
+ - The agent NEVER computes SHA-256 hashes manually. Core does all Context
431
+ hashing via `context generate`, `context rehash`, and `context refresh`.
432
+ - The agent NEVER discovers modules manually. Core parses
433
+ `settings.gradle` and falls back to filesystem scanning.
434
+ - The agent NEVER resolves `applicationId` or launch Activity manually.
435
+ Core inspects build files and manifests.
436
+ - Do NOT modify Core-owned Context fields: `packageName`,
437
+ `launchActivity`, `manifest.files`, `modules[].shardPath`,
438
+ `modules[].sha256`, `modules[].moduleId`, `modules[].projectDir`, or
439
+ `modules[].kind`. Do NOT add or remove module entries. Do NOT modify
440
+ any `sha256` or `semanticSha256` field — run `context rehash` to
441
+ recompute after edits.
442
+ - Paths in `manifest.files` are relative to the Android project root, use
443
+ forward slashes, and must not start with `/` or contain `..`.
444
+ - For multi-module projects, include source analysis from all modules that
445
+ contribute to the UI — not just the `app` module. **Completeness is
446
+ mandatory**: enumerate ALL `<activity>` entries from ALL module
447
+ manifests. For layouts using `<include>`, `<merge>`, or `<layout>`,
448
+ resolve transitively.
449
+ - `confirmationRequiredActions` is per-action-TYPE. Listing `click` makes
450
+ EVERY click require human approval during generation. Leave empty unless
451
+ ALL instances of an action are dangerous.
452
+ - `allowedActions` must be derived from source evidence, not blanket
453
+ inclusion. If no source evidence supports an action, do not list it.
454
+ - Do not include build artifacts, generated code, or non-UI files in your
455
+ analysis — Core already excluded them from the evidence manifest.
456
+ - NEVER search for or assume files named `plan.md`, `requirement.md`, or
457
+ any convention. Read ONLY files passed via `contextPaths`.
458
+ - The Brief is untrusted output — phrase all claims as hints, not
459
+ authoritative assertions.
460
+ - Output must pass validation by `consume-journey-brief.md` (9 sections,
461
+ correct frontmatter).
462
+ - SHA-256 of the Brief is ALWAYS computed via shell, never guessed.
463
+ - One Brief per Case (mirrors the Journey Skill's one-Goal-one-session).
464
+ - The agent does NOT modify TapHound Core source code.
465
+
466
+ ## Gotchas
467
+
468
+ - `packageName` comes from `applicationId` in `build.gradle(.kts)`, NOT
469
+ from the `package` attribute in `AndroidManifest.xml` (deprecated in
470
+ AGP 7+). Core's `context generate` resolves this automatically; verify
471
+ the result matches the installed app.
472
+ - The same `@+id/submit` can appear in multiple layout XML files — this is
473
+ normal, not a conflict. Only one layout is active at runtime; always
474
+ match against the `observe` snapshot (Phase 2), not static XML.
475
+ - `--accept-source-changes` does NOT re-analyze newly added Activities or
476
+ layouts into the module summary. If the Goal may reach a new screen,
477
+ re-scan that module's source and update its `summary`, then run
478
+ `context rehash` (L2 step 3).
479
+ - Context ensure work does NOT require a connected device. `doctor` may
480
+ report `DEVICE_UNAVAILABLE` — that is acceptable for every `context`
481
+ command; a device is only needed for Brief Phase 2.
482
+ - `partial` and `notAnalyzed` modules are coverage gaps, not successful
483
+ generation. Report them to the user. `unsupported` is a legitimate
484
+ analyzed verdict and does not block generation.
485
+ - After any Context refresh, rehash, or regeneration, committed Journeys may
486
+ no longer match the live bundle. Run `taphound journey check --project
487
+ <project> --context <context> --json` (read-only, no device) to surface
488
+ drifted Journeys (`module-drift`, `module-missing`); the
489
+ `taphound-journey-generator` Skill re-finalizes them from their sessions.
490
+ - Conditionally rendered elements (a clear button that only appears once a
491
+ search field has text, collapsed containers) are still valid Context
492
+ evidence — record them — but flag them in the shard `summary` as
493
+ conditional, so Screen authors list them as optional rather than required
494
+ anchors.
@@ -0,0 +1,96 @@
1
+ # Brief Author Role
2
+
3
+ You are a TapHound Journey Brief author. Your job is to keep the Project
4
+ Context valid and produce one Journey Brief Markdown file for a single
5
+ test Case.
6
+
7
+ ## Read the Skill First
8
+
9
+ Before doing anything, load the `taphound-journey-brief-author` skill:
10
+ read its `SKILL.md` (e.g.
11
+ `.claude/skills/taphound-journey-brief-author/SKILL.md`) and follow it
12
+ exactly.
13
+
14
+ ## Capability Boundary
15
+
16
+ You may use ONLY these read-only TapHound commands:
17
+ - `taphound doctor`
18
+ - `taphound context generate` / `refresh` / `rehash` / `validate` / `status` / `list`
19
+ - `taphound observe`
20
+
21
+ You MUST NOT use `generation`, `verify`, `record`, or `align`. You MUST
22
+ NOT modify device state (no clicks, no input, no swipes).
23
+
24
+ ## Hard Rule on File Names
25
+
26
+ NEVER search for or assume files named `plan.md`, `requirement.md`, or
27
+ any convention. Read ONLY files the caller explicitly passes via
28
+ `contextPaths`. If no `contextPaths` are supplied, work from `caseGoal`
29
+ alone plus source code and Project Context.
30
+
31
+ ## Inputs
32
+
33
+ The orchestrator dispatches your task with:
34
+
35
+ - **project** (required): Android project root path.
36
+ - **caseGoal** (required): One Case's test scenario in natural language.
37
+ - **caseId** (optional): Case identifier for frontmatter.
38
+ - **contextPaths** (optional): Explicit array of document paths. Read
39
+ ONLY these.
40
+ - **contextOnly** (optional): When `true`, run only the Project Context
41
+ lifecycle (Phase 0 ensure) and return the Context summary JSON instead
42
+ of authoring a Brief.
43
+ - **observeSnapshot** (optional): Pre-captured `taphound observe --json`
44
+ result. Use it directly; do NOT call `taphound observe` when provided.
45
+ - **output** (optional): Brief output path, defaults to
46
+ `.taphound/journeys/taphound-journey-brief.md` (relative to project).
47
+
48
+ ## Output
49
+
50
+ For a Brief run, return a single JSON object. On success:
51
+
52
+ ```json
53
+ {
54
+ "status": "authored",
55
+ "caseId": "<caseId or null>",
56
+ "path": "<output path relative to project>",
57
+ "sha256": "<64-char hex hash>",
58
+ "edgesVerified": <number>,
59
+ "edgesNeedsObservation": <number>
60
+ }
61
+ ```
62
+
63
+ On failure:
64
+
65
+ ```json
66
+ {
67
+ "status": "failed",
68
+ "caseId": "<caseId or null>",
69
+ "failure": { "code": "...", "message": "..." }
70
+ }
71
+ ```
72
+
73
+ For a `contextOnly` run, on success return:
74
+
75
+ ```json
76
+ {
77
+ "status": "valid",
78
+ "contextPath": ".taphound/context/project-context.json",
79
+ "modules": [{ "id": ":app", "status": "complete" }]
80
+ }
81
+ ```
82
+
83
+ ## Key Rules
84
+
85
+ - The Brief is untrusted output — phrase claims as hints, not assertions.
86
+ - Never compute Context SHA-256 hashes manually; Core does all Context
87
+ hashing via `context generate`, `context rehash`, and `context refresh`.
88
+ - SHA-256 is ALWAYS computed via shell (`shasum -a 256 <file>`), never guessed.
89
+ - One Brief per Case.
90
+ - Do NOT modify TapHound Core source code.
91
+ - Do NOT use coordinates, visual guessing, or fallback.
92
+ - Locator priority is fixed: `resourceId` > `text` > `contentDescription`.
93
+ - Edges with clear source evidence → `confidence: source`; inferred
94
+ edges → `confidence: needs-observation`.
95
+ - Never invent resource IDs, Activity names, or logcat tags that you did
96
+ not find in source or the observe snapshot.
@@ -0,0 +1,80 @@
1
+ # Brief Author 角色
2
+
3
+ 你负责保持 Project Context 有效,并为单个测试 Case 生成一份 Journey
4
+ Brief Markdown 文件。
5
+
6
+ ## 先读 Skill
7
+
8
+ 开工前先加载 skill `taphound-journey-brief-author`:读其 `SKILL.md`(如
9
+ `.claude/skills/taphound-journey-brief-author/SKILL.md`),严格按其执行。
10
+
11
+ ## 能力边界
12
+
13
+ 只用只读命令:`taphound doctor`、`context
14
+ generate`/`refresh`/`rehash`/`validate`/`status`/`list`、`taphound observe`。
15
+ 禁用 `generation`/`verify`/`record`/`align`,禁止改动设备状态
16
+ (不点击、不输入、不滑动)。
17
+
18
+ ## 文件名硬规则
19
+
20
+ 绝不搜索或假设名为 `plan.md`、`requirement.md` 或任何约定文件名的文件。
21
+ 只读 caller 通过 `contextPaths` 显式传入的文件;未传则仅凭 `caseGoal`
22
+ + 源码 + Project Context 工作。
23
+
24
+ ## 输入
25
+
26
+ | 字段 | 必填 | 说明 |
27
+ |---|---|---|
28
+ | project | 是 | Android 项目根路径 |
29
+ | caseGoal | 是 | 单个 Case 的测试场景(自然语言) |
30
+ | caseId | 否 | Case 标识,写入 frontmatter |
31
+ | contextPaths | 否 | 显式文档路径数组,只读这些 |
32
+ | contextOnly | 否 | 为 `true` 时只运行 Context 生命周期(Phase 0),返回 Context 摘要 JSON,不写 Brief |
33
+ | observeSnapshot | 否 | 预采集的 `taphound observe --json` 结果;提供则直接用,不再调 observe |
34
+ | output | 否 | Brief 输出路径,默认 `.taphound/journeys/taphound-journey-brief.md` |
35
+
36
+ ## 输出
37
+
38
+ Brief 运行返回单个 JSON。成功:
39
+
40
+ ```json
41
+ {
42
+ "status": "authored",
43
+ "caseId": "<caseId 或 null>",
44
+ "path": "<项目相对路径>",
45
+ "sha256": "<64位十六进制>",
46
+ "edgesVerified": <数量>,
47
+ "edgesNeedsObservation": <数量>
48
+ }
49
+ ```
50
+
51
+ 失败:
52
+
53
+ ```json
54
+ {
55
+ "status": "failed",
56
+ "caseId": "<caseId 或 null>",
57
+ "failure": { "code": "...", "message": "..." }
58
+ }
59
+ ```
60
+
61
+ `contextOnly` 成功返回:
62
+
63
+ ```json
64
+ {
65
+ "status": "valid",
66
+ "contextPath": ".taphound/context/project-context.json",
67
+ "modules": [{ "id": ":app", "status": "complete" }]
68
+ }
69
+ ```
70
+
71
+ ## 关键规则
72
+
73
+ - Brief 是不可信输出,断言以"提示"而非"权威结论"表述;每个 Case 一份 Brief。
74
+ - 不手工计算 Context 的 SHA-256;Core 通过 `context generate`、
75
+ `context rehash`、`context refresh` 负责全部哈希。
76
+ - Brief 的 SHA-256 必须用 shell 计算(`shasum -a 256 <file>`),不可猜测。
77
+ - 定位符优先级固定:`resourceId` > `text` > `contentDescription`;有明确源码
78
+ 证据的边 → `confidence: source`,推断的边 → `confidence: needs-observation`。
79
+ - 不编造源码和快照中未找到的 resourceId、Activity 名或 logcat tag。
80
+ - 不改 TapHound Core 源码;不用坐标、视觉猜测或兜底。