taphound 0.2.0-dev.1 → 0.2.0-dev.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. package/README.md +49 -149
  2. package/README.zh-CN.md +47 -147
  3. package/assets/skills/taphound-case-suite/SKILL.md +363 -0
  4. package/assets/skills/taphound-case-suite/schemas/base-flow-record.schema.json +22 -0
  5. package/assets/skills/taphound-case-suite/schemas/case-catalog.schema.json +26 -0
  6. package/assets/skills/taphound-case-suite/schemas/case-ledger.schema.json +158 -0
  7. package/assets/skills/taphound-case-suite/schemas/suite-input.schema.json +41 -0
  8. package/assets/skills/taphound-case-suite/schemas/transition.schema.json +61 -0
  9. package/assets/skills/taphound-case-suite/scripts/ledger.mjs +1207 -0
  10. package/assets/skills/taphound-case-suite/templates/base-flow-record.example.json +20 -0
  11. package/assets/skills/taphound-case-suite/templates/suite-input.example.json +27 -0
  12. package/assets/skills/taphound-case-suite/templates/transition.example.json +8 -0
  13. package/assets/skills/taphound-flash/SKILL.md +115 -0
  14. package/assets/skills/taphound-flash/scripts/flash.mjs +585 -0
  15. package/assets/skills/taphound-flash/templates/flash-plan.example.json +15 -0
  16. package/assets/skills/taphound-journey-brief-author/CONTEXT-GUIDE.md +471 -0
  17. package/assets/skills/taphound-journey-brief-author/SKILL.md +494 -0
  18. package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.md +96 -0
  19. package/assets/skills/taphound-journey-brief-author/prompts/brief-author-role.zh-CN.md +80 -0
  20. package/assets/skills/taphound-journey-brief-author/prompts/context-analyze-project.md +309 -0
  21. package/assets/skills/taphound-journey-brief-author/schemas/context-refresh-result.json +123 -0
  22. package/assets/skills/taphound-journey-brief-author/schemas/project-context-module.json +192 -0
  23. package/assets/skills/taphound-journey-brief-author/schemas/project-context.json +152 -0
  24. package/assets/skills/taphound-journey-brief-author/templates/project-context-module.example.json +58 -0
  25. package/assets/skills/taphound-journey-brief-author/templates/project-context.example.json +51 -0
  26. package/assets/skills/taphound-journey-brief-author/templates/taphound-journey-brief.template.md +63 -0
  27. package/assets/skills/taphound-journey-generator/SKILL.md +500 -0
  28. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/prompts/check-completion.md +3 -0
  29. package/assets/skills/taphound-journey-generator/prompts/consume-journey-brief.md +52 -0
  30. package/assets/skills/taphound-journey-generator/prompts/generate-step.md +211 -0
  31. package/assets/skills/taphound-journey-generator/prompts/select-flow.md +91 -0
  32. package/assets/skills/taphound-journey-generator/references/bridge.md +35 -0
  33. package/assets/skills/taphound-journey-generator/references/mid-session.md +44 -0
  34. package/assets/skills/taphound-journey-generator/schemas/external-flow.json +37 -0
  35. package/assets/skills/taphound-journey-generator/schemas/flow.json +28 -0
  36. package/assets/skills/taphound-journey-generator/schemas/journey-source.json +25 -0
  37. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/observe-output.json +13 -4
  38. package/assets/skills/{taphound-ai-journey → taphound-journey-generator}/schemas/proposed-step-envelope.json +127 -5
  39. package/assets/skills/taphound-journey-generator/scripts/envelope.mjs +561 -0
  40. package/assets/skills/taphound-journey-generator/templates/external-flow.example.json +22 -0
  41. package/assets/skills/taphound-journey-generator/templates/flow.example.json +22 -0
  42. package/assets/skills/taphound-journey-generator/templates/journey-source.example.json +17 -0
  43. package/assets/skills/taphound-journey-generator/templates/taphound-journey-brief.example.md +70 -0
  44. package/assets/skills/taphound-verify-change/SKILL.md +91 -0
  45. package/assets/skills/taphound-verify-change/references/accept.md +38 -0
  46. package/assets/skills/taphound-verify-change/references/preserve.md +349 -0
  47. package/assets/skills/taphound-verify-change/schemas/workflow-manifest.schema.json +295 -0
  48. package/assets/skills/taphound-verify-change/scripts/handoff.mjs +482 -0
  49. package/assets/skills/taphound-verify-change/scripts/ui-refactor.mjs +505 -0
  50. package/dist/adapters/adb/adb-adapter.d.ts +16 -2
  51. package/dist/adapters/adb/adb-adapter.js +199 -0
  52. package/dist/adapters/adb/system-uiautomator-snapshot-provider.d.ts +13 -0
  53. package/dist/adapters/adb/system-uiautomator-snapshot-provider.js +122 -0
  54. package/dist/adapters/adb/ui-automator-parser.d.ts +3 -0
  55. package/dist/adapters/adb/ui-automator-parser.js +160 -0
  56. package/dist/adapters/adb/window-topology-parser.d.ts +2 -0
  57. package/dist/adapters/adb/window-topology-parser.js +101 -0
  58. package/dist/adapters/android-cli/android-cli-adapter.d.ts +16 -8
  59. package/dist/adapters/android-cli/android-cli-adapter.js +137 -15
  60. package/dist/adapters/android-cli/android-cli-snapshot-provider.d.ts +9 -0
  61. package/dist/adapters/android-cli/android-cli-snapshot-provider.js +99 -0
  62. package/dist/adapters/android-cli/layout-parser.js +12 -8
  63. package/dist/adapters/appium/appium-doctor.d.ts +7 -0
  64. package/dist/adapters/appium/appium-doctor.js +128 -0
  65. package/dist/adapters/appium/appium-ui-snapshot-provider.d.ts +34 -0
  66. package/dist/adapters/appium/appium-ui-snapshot-provider.js +240 -0
  67. package/dist/adapters/camera/camera-probe-adapter.d.ts +18 -0
  68. package/dist/adapters/camera/camera-probe-adapter.js +286 -0
  69. package/dist/adapters/filesystem/artifact-store.js +40 -1
  70. package/dist/adapters/filesystem/context-document-writer.d.ts +15 -0
  71. package/dist/adapters/filesystem/context-document-writer.js +112 -0
  72. package/dist/adapters/filesystem/external-flow-registry.d.ts +17 -0
  73. package/dist/adapters/filesystem/external-flow-registry.js +325 -0
  74. package/dist/adapters/filesystem/generation-session-store.d.ts +17 -11
  75. package/dist/adapters/filesystem/generation-session-store.js +281 -855
  76. package/dist/adapters/filesystem/generation-store/session-lock.d.ts +29 -0
  77. package/dist/adapters/filesystem/generation-store/session-lock.js +202 -0
  78. package/dist/adapters/filesystem/generation-store/session-transitions.d.ts +24 -0
  79. package/dist/adapters/filesystem/generation-store/session-transitions.js +340 -0
  80. package/dist/adapters/filesystem/generation-store/store-files.d.ts +50 -0
  81. package/dist/adapters/filesystem/generation-store/store-files.js +363 -0
  82. package/dist/adapters/filesystem/journey-composition-store.d.ts +23 -0
  83. package/dist/adapters/filesystem/journey-composition-store.js +151 -0
  84. package/dist/adapters/filesystem/knowledge-registry.d.ts +12 -0
  85. package/dist/adapters/filesystem/knowledge-registry.js +223 -0
  86. package/dist/adapters/filesystem/project-bound-file.js +3 -5
  87. package/dist/adapters/filesystem/project-file-inspector.d.ts +2 -0
  88. package/dist/adapters/filesystem/project-file-inspector.js +57 -28
  89. package/dist/adapters/filesystem/project-identity-inspector.d.ts +7 -0
  90. package/dist/adapters/filesystem/project-identity-inspector.js +215 -0
  91. package/dist/adapters/filesystem/project-inventory-inspector.d.ts +8 -0
  92. package/dist/adapters/filesystem/project-inventory-inspector.js +93 -0
  93. package/dist/adapters/filesystem/project-module-discoverer.d.ts +6 -0
  94. package/dist/adapters/filesystem/project-module-discoverer.js +158 -0
  95. package/dist/adapters/filesystem/skill-installer.d.ts +7 -2
  96. package/dist/adapters/filesystem/skill-installer.js +40 -11
  97. package/dist/adapters/filesystem/workspace-layout.d.ts +7 -0
  98. package/dist/adapters/filesystem/workspace-layout.js +57 -0
  99. package/dist/adapters/git/node-git-diff.d.ts +17 -0
  100. package/dist/adapters/git/node-git-diff.js +114 -0
  101. package/dist/adapters/process/node-detached-process-launcher.d.ts +6 -0
  102. package/dist/adapters/process/node-detached-process-launcher.js +96 -0
  103. package/dist/adapters/process/node-process-runner.js +11 -2
  104. package/dist/adapters/prompt/inquirer-align-prompt.d.ts +27 -0
  105. package/dist/adapters/prompt/inquirer-align-prompt.js +65 -0
  106. package/dist/adapters/prompt/inquirer-generation-prompt.js +3 -0
  107. package/dist/adapters/prompt/inquirer-recorder-prompt.d.ts +9 -1
  108. package/dist/adapters/prompt/inquirer-recorder-prompt.js +63 -0
  109. package/dist/adapters/runtime/adb-runtime-backend.d.ts +67 -0
  110. package/dist/adapters/runtime/adb-runtime-backend.js +206 -0
  111. package/dist/adapters/runtime/fake-runtime-backend.d.ts +87 -0
  112. package/dist/adapters/runtime/fake-runtime-backend.js +240 -0
  113. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.d.ts +45 -0
  114. package/dist/adapters/runtime/mobile-mcp/mcp-tool-client.js +153 -0
  115. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.d.ts +23 -0
  116. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-errors.js +39 -0
  117. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.d.ts +20 -0
  118. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-responses.js +180 -0
  119. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.d.ts +78 -0
  120. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-runtime-backend.js +379 -0
  121. package/dist/adapters/runtime/mobile-mcp/mobile-mcp-tools.d.ts +46 -0
  122. package/dist/adapters/runtime/session-adb-view.d.ts +53 -0
  123. package/dist/adapters/runtime/session-adb-view.js +193 -0
  124. package/dist/adapters/runtime/session-backed-ports.d.ts +21 -0
  125. package/dist/adapters/runtime/session-backed-ports.js +43 -0
  126. package/dist/adapters/runtime/shared-session-runtime-backend.d.ts +12 -0
  127. package/dist/adapters/runtime/shared-session-runtime-backend.js +64 -0
  128. package/dist/adapters/ui/auto-ui-snapshot-provider.d.ts +8 -0
  129. package/dist/adapters/ui/auto-ui-snapshot-provider.js +48 -0
  130. package/dist/adapters/ui/device-layout-temp.d.ts +6 -0
  131. package/dist/adapters/ui/device-layout-temp.js +18 -0
  132. package/dist/adapters/ui/device-ui-environment.d.ts +13 -0
  133. package/dist/adapters/ui/device-ui-environment.js +81 -0
  134. package/dist/adapters/ui/layout-normalization.d.ts +9 -0
  135. package/dist/adapters/ui/layout-normalization.js +44 -0
  136. package/dist/adapters/ui/ui-snapshot-error.d.ts +11 -0
  137. package/dist/adapters/ui/ui-snapshot-error.js +12 -0
  138. package/dist/adapters/ui/ui-snapshot-support.d.ts +15 -0
  139. package/dist/adapters/ui/ui-snapshot-support.js +12 -0
  140. package/dist/application/align/align-service.d.ts +42 -0
  141. package/dist/application/align/align-service.js +106 -0
  142. package/dist/application/assertion/expectation-evaluator.d.ts +18 -5
  143. package/dist/application/assertion/expectation-evaluator.js +156 -18
  144. package/dist/application/assertion/guarded-expectation.d.ts +45 -0
  145. package/dist/application/assertion/guarded-expectation.js +74 -0
  146. package/dist/application/checkpoint/baseline-capturer.d.ts +26 -0
  147. package/dist/application/checkpoint/baseline-capturer.js +163 -0
  148. package/dist/application/checkpoint/baseline-error.d.ts +5 -0
  149. package/dist/application/checkpoint/baseline-error.js +8 -0
  150. package/dist/application/checkpoint/baseline-service.d.ts +31 -0
  151. package/dist/application/checkpoint/baseline-service.js +147 -0
  152. package/dist/application/checkpoint/checkpoint-evaluator.d.ts +35 -0
  153. package/dist/application/checkpoint/checkpoint-evaluator.js +415 -0
  154. package/dist/application/checkpoint/regression-comparator.d.ts +18 -0
  155. package/dist/application/checkpoint/regression-comparator.js +192 -0
  156. package/dist/application/collector/logcat-collector.d.ts +22 -1
  157. package/dist/application/collector/logcat-collector.js +103 -15
  158. package/dist/application/collector/logcat-event.d.ts +8 -0
  159. package/dist/application/collector/logcat-event.js +79 -0
  160. package/dist/application/collector/logcat-stop.d.ts +2 -0
  161. package/dist/application/collector/logcat-stop.js +11 -0
  162. package/dist/application/context/context-generator.d.ts +45 -0
  163. package/dist/application/context/context-generator.js +228 -0
  164. package/dist/application/context/context-loader.d.ts +40 -0
  165. package/dist/application/context/context-loader.js +223 -0
  166. package/dist/application/context/context-refresher.d.ts +59 -0
  167. package/dist/application/context/context-refresher.js +349 -0
  168. package/dist/application/context/context-rehasher.d.ts +36 -0
  169. package/dist/application/context/context-rehasher.js +110 -0
  170. package/dist/application/context/context-validator.d.ts +23 -1
  171. package/dist/application/context/context-validator.js +116 -9
  172. package/dist/application/context/evidence-hash.d.ts +1 -0
  173. package/dist/application/context/evidence-hash.js +125 -0
  174. package/dist/application/context/evidence-match.d.ts +9 -0
  175. package/dist/application/context/evidence-match.js +8 -0
  176. package/dist/application/context/shard-identity.d.ts +2 -0
  177. package/dist/application/context/shard-identity.js +7 -0
  178. package/dist/application/contract/contract-loader.d.ts +25 -0
  179. package/dist/application/contract/contract-loader.js +68 -0
  180. package/dist/application/contract/contract-review.d.ts +25 -0
  181. package/dist/application/contract/contract-review.js +51 -0
  182. package/dist/application/contract/contract-verifier.d.ts +53 -0
  183. package/dist/application/contract/contract-verifier.js +645 -0
  184. package/dist/application/devices/resolve-device-assignments.d.ts +21 -0
  185. package/dist/application/devices/resolve-device-assignments.js +60 -0
  186. package/dist/application/diagnosis/failure-classifier.d.ts +23 -0
  187. package/dist/application/diagnosis/failure-classifier.js +179 -0
  188. package/dist/application/doctor/doctor-service.d.ts +36 -3
  189. package/dist/application/doctor/doctor-service.js +255 -25
  190. package/dist/application/generation/generation-app-preparer.d.ts +20 -0
  191. package/dist/application/generation/generation-app-preparer.js +28 -0
  192. package/dist/application/generation/generation-config-service.d.ts +21 -0
  193. package/dist/application/generation/generation-config-service.js +53 -0
  194. package/dist/application/generation/generation-confirmation-service.d.ts +14 -3
  195. package/dist/application/generation/generation-confirmation-service.js +109 -24
  196. package/dist/application/generation/generation-context-snapshot.d.ts +6 -0
  197. package/dist/application/generation/generation-context-snapshot.js +29 -0
  198. package/dist/application/generation/generation-finalizer.d.ts +15 -9
  199. package/dist/application/generation/generation-finalizer.js +167 -70
  200. package/dist/application/generation/generation-publisher.js +12 -8
  201. package/dist/application/generation/generation-recovery-service.d.ts +35 -0
  202. package/dist/application/generation/generation-recovery-service.js +144 -0
  203. package/dist/application/generation/generation-reopen-service.d.ts +15 -0
  204. package/dist/application/generation/generation-reopen-service.js +37 -0
  205. package/dist/application/generation/generation-replace-service.d.ts +32 -0
  206. package/dist/application/generation/generation-replace-service.js +116 -0
  207. package/dist/application/generation/generation-starter.d.ts +44 -4
  208. package/dist/application/generation/generation-starter.js +175 -8
  209. package/dist/application/generation/generation-step-executor.d.ts +67 -5
  210. package/dist/application/generation/generation-step-executor.js +471 -108
  211. package/dist/application/generation/proposed-step-validator.js +96 -30
  212. package/dist/application/generation/replay-policy-loader.d.ts +16 -0
  213. package/dist/application/generation/replay-policy-loader.js +29 -0
  214. package/dist/application/generation/risk-evaluator.d.ts +4 -1
  215. package/dist/application/generation/risk-evaluator.js +118 -3
  216. package/dist/application/generation/runtime-observer.d.ts +39 -7
  217. package/dist/application/generation/runtime-observer.js +193 -24
  218. package/dist/application/impact/impact-resolver.d.ts +32 -0
  219. package/dist/application/impact/impact-resolver.js +160 -0
  220. package/dist/application/init/init-service.js +26 -13
  221. package/dist/application/interaction/action-executor.d.ts +3 -2
  222. package/dist/application/interaction/action-executor.js +11 -1
  223. package/dist/application/interaction/action-target.d.ts +17 -0
  224. package/dist/application/interaction/action-target.js +40 -0
  225. package/dist/application/interaction/external-step-runner.d.ts +153 -0
  226. package/dist/application/interaction/external-step-runner.js +332 -0
  227. package/dist/application/interaction/fallback-resolver.d.ts +6 -3
  228. package/dist/application/interaction/fallback-resolver.js +7 -5
  229. package/dist/application/interaction/scroll-to-executor.d.ts +17 -3
  230. package/dist/application/interaction/scroll-to-executor.js +118 -36
  231. package/dist/application/journey/external-flow-resolver.d.ts +25 -0
  232. package/dist/application/journey/external-flow-resolver.js +22 -0
  233. package/dist/application/journey/journey-check-service.d.ts +54 -0
  234. package/dist/application/journey/journey-check-service.js +207 -0
  235. package/dist/application/journey/journey-promoter.d.ts +26 -0
  236. package/dist/application/journey/journey-promoter.js +123 -0
  237. package/dist/application/journey/journey-resolver.d.ts +42 -0
  238. package/dist/application/journey/journey-resolver.js +239 -0
  239. package/dist/application/journey/journey-retirer.d.ts +25 -0
  240. package/dist/application/journey/journey-retirer.js +87 -0
  241. package/dist/application/knowledge/anchor-resolver.d.ts +36 -0
  242. package/dist/application/knowledge/anchor-resolver.js +110 -0
  243. package/dist/application/knowledge/knowledge-loader.d.ts +16 -0
  244. package/dist/application/knowledge/knowledge-loader.js +36 -0
  245. package/dist/application/locator/layout-failure-summary.d.ts +2 -0
  246. package/dist/application/locator/layout-failure-summary.js +67 -0
  247. package/dist/application/locator/layout-traversal.d.ts +11 -0
  248. package/dist/application/locator/layout-traversal.js +18 -0
  249. package/dist/application/locator/locator-resolver.d.ts +13 -1
  250. package/dist/application/locator/locator-resolver.js +182 -18
  251. package/dist/application/observe/observe-service.d.ts +20 -0
  252. package/dist/application/observe/observe-service.js +91 -0
  253. package/dist/application/project/project-describer.d.ts +14 -6
  254. package/dist/application/project/project-describer.js +38 -5
  255. package/dist/application/recognition/screen-detector.d.ts +28 -0
  256. package/dist/application/recognition/screen-detector.js +111 -0
  257. package/dist/application/recorder/locator-selector.js +151 -17
  258. package/dist/application/recorder/recorder-service.d.ts +16 -4
  259. package/dist/application/recorder/recorder-service.js +420 -128
  260. package/dist/application/report/report-writer.js +1 -1
  261. package/dist/application/runtime/cold-launch.d.ts +28 -0
  262. package/dist/application/runtime/cold-launch.js +59 -0
  263. package/dist/application/runtime/step-runner.d.ts +49 -4
  264. package/dist/application/runtime/step-runner.js +721 -130
  265. package/dist/application/runtime/verify-runtime.d.ts +57 -7
  266. package/dist/application/runtime/verify-runtime.js +554 -174
  267. package/dist/application/ui/cached-ui-snapshot-provider.d.ts +45 -0
  268. package/dist/application/ui/cached-ui-snapshot-provider.js +111 -0
  269. package/dist/application/ui/ui-snapshot-lifecycle.d.ts +2 -0
  270. package/dist/application/ui/ui-snapshot-lifecycle.js +8 -0
  271. package/dist/application/ui/ui-stability-probe.d.ts +3 -0
  272. package/dist/application/ui/ui-stability-probe.js +8 -0
  273. package/dist/application/wait/idle-advice.d.ts +6 -0
  274. package/dist/application/wait/idle-advice.js +27 -0
  275. package/dist/application/wait/idle-profiles.d.ts +15 -0
  276. package/dist/application/wait/idle-profiles.js +75 -0
  277. package/dist/application/wait/idle-waiter.d.ts +28 -4
  278. package/dist/application/wait/idle-waiter.js +186 -15
  279. package/dist/cli/commands/align.d.ts +3 -0
  280. package/dist/cli/commands/align.js +124 -0
  281. package/dist/cli/commands/baseline.d.ts +3 -0
  282. package/dist/cli/commands/baseline.js +130 -0
  283. package/dist/cli/commands/context.js +300 -27
  284. package/dist/cli/commands/contract.d.ts +3 -0
  285. package/dist/cli/commands/contract.js +120 -0
  286. package/dist/cli/commands/doctor.js +16 -9
  287. package/dist/cli/commands/failure.d.ts +3 -0
  288. package/dist/cli/commands/failure.js +63 -0
  289. package/dist/cli/commands/generation/lifecycle-commands.d.ts +5 -0
  290. package/dist/cli/commands/generation/lifecycle-commands.js +211 -0
  291. package/dist/cli/commands/generation/session-commands.d.ts +11 -0
  292. package/dist/cli/commands/generation/session-commands.js +472 -0
  293. package/dist/cli/commands/generation/shared.d.ts +1414 -0
  294. package/dist/cli/commands/generation/shared.js +291 -0
  295. package/dist/cli/commands/generation/step-commands.d.ts +8 -0
  296. package/dist/cli/commands/generation/step-commands.js +315 -0
  297. package/dist/cli/commands/generation.js +10 -507
  298. package/dist/cli/commands/impact.d.ts +3 -0
  299. package/dist/cli/commands/impact.js +87 -0
  300. package/dist/cli/commands/init.js +13 -6
  301. package/dist/cli/commands/journey.d.ts +3 -0
  302. package/dist/cli/commands/journey.js +382 -0
  303. package/dist/cli/commands/knowledge.d.ts +3 -0
  304. package/dist/cli/commands/knowledge.js +93 -0
  305. package/dist/cli/commands/observe.d.ts +3 -0
  306. package/dist/cli/commands/observe.js +127 -0
  307. package/dist/cli/commands/project.js +2 -1
  308. package/dist/cli/commands/record.js +18 -5
  309. package/dist/cli/commands/verify.js +273 -63
  310. package/dist/cli/dependencies.d.ts +125 -1
  311. package/dist/cli/dependencies.js +450 -51
  312. package/dist/cli/diff-verification.d.ts +41 -0
  313. package/dist/cli/diff-verification.js +192 -0
  314. package/dist/cli/main.js +49 -1
  315. package/dist/cli/output.d.ts +5 -3
  316. package/dist/cli/output.js +12 -0
  317. package/dist/cli/program.js +19 -1
  318. package/dist/cli/project-root.d.ts +1 -0
  319. package/dist/cli/project-root.js +6 -0
  320. package/dist/cli/runtime-selection.d.ts +22 -0
  321. package/dist/cli/runtime-selection.js +92 -0
  322. package/dist/cli/version.d.ts +1 -0
  323. package/dist/cli/version.js +14 -0
  324. package/dist/cli/workspace-guard.d.ts +2 -0
  325. package/dist/cli/workspace-guard.js +3 -0
  326. package/dist/domain/binding-reference.d.ts +4 -0
  327. package/dist/domain/binding-reference.js +23 -0
  328. package/dist/domain/checkpoint.d.ts +404 -0
  329. package/dist/domain/checkpoint.js +297 -0
  330. package/dist/domain/config.d.ts +107 -1
  331. package/dist/domain/config.js +52 -6
  332. package/dist/domain/contract.d.ts +413 -0
  333. package/dist/domain/contract.js +196 -0
  334. package/dist/domain/external-flow.d.ts +493 -0
  335. package/dist/domain/external-flow.js +15 -0
  336. package/dist/domain/failure-classification.d.ts +176 -0
  337. package/dist/domain/failure-classification.js +169 -0
  338. package/dist/domain/failure.d.ts +2 -1
  339. package/dist/domain/failure.js +123 -0
  340. package/dist/domain/generation.d.ts +1671 -132
  341. package/dist/domain/generation.js +202 -13
  342. package/dist/domain/geometry.d.ts +13 -0
  343. package/dist/domain/geometry.js +16 -0
  344. package/dist/domain/impact.d.ts +71 -0
  345. package/dist/domain/impact.js +76 -0
  346. package/dist/domain/init.d.ts +12 -4
  347. package/dist/domain/init.js +24 -18
  348. package/dist/domain/journey-composition.d.ts +2285 -0
  349. package/dist/domain/journey-composition.js +85 -0
  350. package/dist/domain/journey-lifecycle.d.ts +10 -0
  351. package/dist/domain/journey-lifecycle.js +9 -0
  352. package/dist/domain/journey.d.ts +2419 -212
  353. package/dist/domain/journey.js +384 -14
  354. package/dist/domain/knowledge.d.ts +165 -0
  355. package/dist/domain/knowledge.js +188 -0
  356. package/dist/domain/layout.d.ts +34 -5
  357. package/dist/domain/layout.js +64 -6
  358. package/dist/domain/locator-evidence.d.ts +3 -0
  359. package/dist/domain/locator-evidence.js +36 -0
  360. package/dist/domain/logcat-event.d.ts +54 -0
  361. package/dist/domain/logcat-event.js +40 -0
  362. package/dist/domain/observation.d.ts +33 -0
  363. package/dist/domain/observation.js +18 -0
  364. package/dist/domain/project-context.d.ts +219 -1
  365. package/dist/domain/project-context.js +209 -6
  366. package/dist/domain/proposed-step.d.ts +340 -60
  367. package/dist/domain/proposed-step.js +23 -3
  368. package/dist/domain/report.d.ts +1455 -28
  369. package/dist/domain/report.js +211 -14
  370. package/dist/domain/runtime-snapshot.d.ts +58 -1
  371. package/dist/domain/runtime-snapshot.js +14 -3
  372. package/dist/domain/runtime.d.ts +50 -0
  373. package/dist/domain/runtime.js +36 -0
  374. package/dist/domain/system-app-profiles.d.ts +6 -0
  375. package/dist/domain/system-app-profiles.js +43 -0
  376. package/dist/domain/ui-backend.d.ts +28 -0
  377. package/dist/domain/ui-backend.js +33 -0
  378. package/dist/domain/ui-cache.d.ts +11 -0
  379. package/dist/domain/ui-cache.js +10 -0
  380. package/dist/domain/window-hierarchy.d.ts +84 -0
  381. package/dist/domain/window-hierarchy.js +172 -0
  382. package/dist/domain/workflow-manifest.d.ts +77 -0
  383. package/dist/domain/workflow-manifest.js +136 -0
  384. package/dist/domain/workspace.d.ts +28 -0
  385. package/dist/domain/workspace.js +72 -0
  386. package/dist/ports/adb.d.ts +34 -1
  387. package/dist/ports/align-prompt.d.ts +11 -0
  388. package/dist/ports/align-prompt.js +6 -0
  389. package/dist/ports/anchor-resolver.d.ts +30 -0
  390. package/dist/ports/anchor-resolver.js +1 -0
  391. package/dist/ports/annotated-screen-resolver.d.ts +4 -0
  392. package/dist/ports/annotated-screen-resolver.js +1 -0
  393. package/dist/ports/camera-probe.d.ts +23 -0
  394. package/dist/ports/camera-probe.js +8 -0
  395. package/dist/ports/context-document-writer.d.ts +24 -0
  396. package/dist/ports/context-document-writer.js +1 -0
  397. package/dist/ports/detached-process-launcher.d.ts +12 -0
  398. package/dist/ports/detached-process-launcher.js +1 -0
  399. package/dist/ports/external-flow-registry.d.ts +37 -0
  400. package/dist/ports/external-flow-registry.js +1 -0
  401. package/dist/ports/generation-prompt.d.ts +2 -1
  402. package/dist/ports/generation-session-store.d.ts +12 -2
  403. package/dist/ports/git-diff.d.ts +9 -0
  404. package/dist/ports/git-diff.js +1 -0
  405. package/dist/ports/journey-composition-store.d.ts +17 -0
  406. package/dist/ports/journey-composition-store.js +1 -0
  407. package/dist/ports/knowledge-registry.d.ts +20 -0
  408. package/dist/ports/knowledge-registry.js +1 -0
  409. package/dist/ports/process-runner.d.ts +7 -0
  410. package/dist/ports/project-file-inspector.d.ts +1 -0
  411. package/dist/ports/project-identity-inspector.d.ts +24 -0
  412. package/dist/ports/project-identity-inspector.js +1 -0
  413. package/dist/ports/project-inventory-inspector.d.ts +21 -0
  414. package/dist/ports/project-inventory-inspector.js +1 -0
  415. package/dist/ports/project-module-discoverer.d.ts +26 -0
  416. package/dist/ports/project-module-discoverer.js +1 -0
  417. package/dist/ports/recorder-prompt.d.ts +10 -1
  418. package/dist/ports/runtime-backend.d.ts +89 -0
  419. package/dist/ports/runtime-backend.js +13 -0
  420. package/dist/ports/runtime-capability.d.ts +12 -0
  421. package/dist/ports/runtime-capability.js +20 -0
  422. package/dist/ports/runtime-session-ports.d.ts +25 -0
  423. package/dist/ports/runtime-session-ports.js +1 -0
  424. package/dist/ports/screenshot.d.ts +11 -0
  425. package/dist/ports/screenshot.js +1 -0
  426. package/dist/ports/skill-installer.d.ts +2 -2
  427. package/dist/ports/ui-snapshot.d.ts +35 -0
  428. package/dist/ports/ui-snapshot.js +1 -0
  429. package/dist/ports/ui-stability.d.ts +19 -0
  430. package/dist/ports/ui-stability.js +1 -0
  431. package/dist/ports/workspace-layout.d.ts +4 -0
  432. package/dist/ports/workspace-layout.js +1 -0
  433. package/dist/shared/errors.d.ts +2 -0
  434. package/dist/shared/errors.js +22 -0
  435. package/dist/shared/paths.d.ts +2 -0
  436. package/dist/shared/paths.js +24 -0
  437. package/dist/shared/strings.d.ts +2 -0
  438. package/dist/shared/strings.js +16 -0
  439. package/package.json +6 -1
  440. package/assets/skills/taphound-ai-journey/GUIDE.md +0 -862
  441. package/assets/skills/taphound-ai-journey/SKILL.md +0 -377
  442. package/assets/skills/taphound-ai-journey/prompts/analyze-project.md +0 -526
  443. package/assets/skills/taphound-ai-journey/prompts/generate-step.md +0 -109
  444. package/assets/skills/taphound-ai-journey/schemas/project-context.json +0 -81
  445. package/assets/skills/taphound-ai-journey/templates/project-context.example.json +0 -49
  446. package/dist/ports/android-cli.d.ts +0 -21
  447. /package/dist/{ports/android-cli.js → adapters/runtime/mobile-mcp/mobile-mcp-tools.js} +0 -0
@@ -0,0 +1,309 @@
1
+ # Analyze Android Project for TapHound Context
2
+
3
+ You are filling in the semantic `summary` fields of a TapHound Project Context
4
+ Bundle that Core has already scaffolded. Core owns module discovery,
5
+ identity inspection (`packageName`, `launchActivity`), evidence and inventory
6
+ hashing, and atomic writes. Your job is to read Android source files and
7
+ populate the `summary` object in each generated shard.
8
+
9
+ ## Workflow
10
+
11
+ 1. **Generate the Context skeleton** (Core does all structural work):
12
+ ```bash
13
+ taphound context generate --project <project> --json
14
+ ```
15
+ Core discovers Gradle modules, resolves `applicationId` and launch
16
+ Activity, computes evidence and inventory hashes, and writes one
17
+ `notAnalyzed` shard per module with an empty `summary`. Use `--force`
18
+ to overwrite an existing Context. Verify the reported `packageName` and
19
+ `launchActivity` match the installed app.
20
+
21
+ 2. **Read each generated shard** under `.taphound/context/modules/<module>.json`.
22
+ Each shard already has `moduleId`, `projectDir`, `inventory`, `manifest`
23
+ (with hashed evidence files), and an empty `summary`. The `manifest.files`
24
+ list tells you exactly which source files Core tracked — scan those.
25
+
26
+ 3. **Scan source files and fill `summary`** for each module (Steps 1–5 below).
27
+
28
+ 4. **Update the root index** (`.taphound/context/project-context.json`):
29
+ copy `features`, `activities`, and `status` from each shard into the
30
+ corresponding module entry. Update `interactionPolicy` based on source
31
+ evidence (Step 6).
32
+
33
+ 5. **Rehash and validate**:
34
+ ```bash
35
+ taphound context rehash \
36
+ --project <project> \
37
+ --context .taphound/context/project-context.json --json
38
+ taphound context validate \
39
+ --project <project> \
40
+ --context .taphound/context/project-context.json --json
41
+ ```
42
+ Core recomputes all shard and index hashes. If validation fails, fix the
43
+ named index or shard and rehash again.
44
+
45
+ ## Step 1: Scan Kotlin/Java Source
46
+
47
+ For each module, scan `src/main/java/` and `src/main/kotlin/` (and variant
48
+ source sets when applicable):
49
+
50
+ - Find `setContentView(R.layout.*)` to map each Activity to its layout.
51
+ - Find `findViewById<T>(R.id.*)` or view binding references
52
+ (`binding.submitButton`) to identify interactive UI elements.
53
+ - Find `setOnClickListener`, `setOnCheckedChangeListener`,
54
+ `setOnTouchListener`, etc. to determine which elements are actionable.
55
+ - Find `Log.i(tag, message)`, `Log.d(tag, ...)`, `Log.w(tag, ...)`, etc.
56
+ to identify logcat tags and message patterns usable as expectations.
57
+ - Find `startActivity(Intent(this, TargetActivity::class.java))` or
58
+ navigation component calls to predict Activity transitions.
59
+ - Find `EditText`, `TextView`, `Button`, `RecyclerView`, `ScrollView`
60
+ usages to understand what actions each screen supports.
61
+
62
+ ## Step 2: Scan Layout XML
63
+
64
+ Extract UI element information from `src/main/res/layout/` files:
65
+
66
+ - Extract `android:id="@+id/<name>"` — the `resourceId` for locators is
67
+ the bare name (e.g., `open_search`, not `id/open_search`).
68
+ - Extract `android:text` and `android:contentDescription` as fallback
69
+ locator identity fields.
70
+ - Note the widget type (Button, EditText, TextView, RecyclerView,
71
+ ScrollView, etc.) to understand what actions each element supports.
72
+
73
+ ### Complex layout structures
74
+
75
+ Real Android layouts use several composition mechanisms:
76
+
77
+ **`<include layout="@layout/foo" />`**: The included layout's views are
78
+ merged into the parent at runtime. Recursively read the included layout
79
+ file and collect its IDs as if they were in the parent. An `<include>`
80
+ may override the included root's `android:id` with its own.
81
+
82
+ **`<merge>`**: Has no ID itself. Its children are directly inlined into
83
+ the parent at inflation time. Treat its children as belonging to the
84
+ including parent.
85
+
86
+ **`<layout>` (Data Binding)**: Wraps the actual root view. Look inside
87
+ `<layout>` for the actual root view and its children. Ignore the `<data>`
88
+ section — it has no UI elements.
89
+
90
+ **`<ViewStub android:layout="@layout/foo" />`**: Lazily inflated. Its
91
+ content is NOT in the initial layout. `android:inflatedId` gives the ID
92
+ of the inflated root. Note these but understand they may not be visible
93
+ until explicitly inflated at runtime.
94
+
95
+ **Duplicate IDs across layout files**: The same `@+id/submit` can appear
96
+ in both `activity_main.xml` and `activity_search.xml`. This is normal and
97
+ NOT a conflict — each layout is independent, and only one is active at a
98
+ time. Do NOT try to deduplicate IDs across different layout files. At
99
+ runtime, TapHound's `observe` command dumps the live layout, so element
100
+ resolution always happens against the currently displayed screen.
101
+
102
+ ## Step 3: Scan Build Files
103
+
104
+ Each module has either `build.gradle.kts` (Kotlin DSL) or `build.gradle`
105
+ (Groovy DSL), never both. Core already parsed these for `applicationId`,
106
+ `namespace`, and module discovery — you do NOT need to re-parse them for
107
+ identity. However, check for:
108
+
109
+ - `buildTypes` / `productFlavors` that might affect the package name
110
+ (suffixes like `.debug`). Core uses the base `applicationId`; note if a
111
+ flavor suffix is relevant to the test Goal.
112
+ - `proguard` / `proguardFiles` rules that might strip logcat tags. If
113
+ Logcat calls are stripped in release builds, note this — it affects
114
+ expectation feasibility.
115
+
116
+ ## Step 4: Verify Completeness
117
+
118
+ Before filling in the `summary`, verify you have found ALL relevant files.
119
+ Incomplete coverage makes the Context useless for staleness detection and
120
+ leads to missing interaction policies.
121
+
122
+ ### Activity completeness
123
+
124
+ Enumerate every `<activity>` declaration across ALL module manifests
125
+ (not just the `app` module):
126
+
127
+ ```bash
128
+ find . -name "AndroidManifest.xml" -not -path "*/build/*"
129
+ find . -name "AndroidManifest.xml" -not -path "*/build/*" \
130
+ -exec grep '<activity' {} + | sed 's/.*android:name="//' | sed 's/".*//'
131
+ ```
132
+
133
+ For each Activity name found:
134
+ - If it starts with `.`, prepend the module's namespace to get the
135
+ fully qualified class name.
136
+ - Find the corresponding source file (`.kt` or `.java`) on disk.
137
+ - If the source file cannot be found (generated class, third-party
138
+ dependency), skip it but note it.
139
+
140
+ **You MUST include every Activity source file you find.** Missing
141
+ Activities means the Context cannot detect when those screens change,
142
+ and the AI agent will not know about their UI elements or Logcat tags.
143
+
144
+ ### Layout completeness
145
+
146
+ For each Activity, identify its layout via `setContentView(R.layout.<name>)`
147
+ in the source. Then find the corresponding layout XML:
148
+
149
+ ```bash
150
+ find . -path "*/res/layout/*.xml" -not -path "*/build/*"
151
+ ```
152
+
153
+ Include each layout file directly referenced by an Activity you found.
154
+ Also include layouts referenced via `<include>` from those layouts
155
+ (resolve transitively). You may EXCLUDE:
156
+ - Layout files not referenced by any Activity (e.g., item layouts for
157
+ RecyclerView adapters, preference layouts) unless they contain
158
+ interactive elements the test Goal might touch.
159
+ - Debug-only or developer-tool layouts.
160
+
161
+ ### Large project strategy
162
+
163
+ For projects with many modules (10+ Activities, 50+ layouts), use
164
+ systematic shell-based discovery rather than reading files one by one:
165
+
166
+ ```bash
167
+ find . -name "AndroidManifest.xml" -not -path "*/build/*" \
168
+ -exec grep -c '<activity' {} +
169
+ find . \( -name "*.kt" -o -name "*.java" \) -not -path "*/build/*" \
170
+ -exec grep -l "extends.*Activity\|:.*Activity(" {} +
171
+ find . -path "*/res/layout/*.xml" -not -path "*/build/*" | wc -l
172
+ ```
173
+
174
+ If the project has hundreds of Activities/layouts, keep each module as a
175
+ separate bounded analysis. Do not omit later modules and do not mark a
176
+ shard `complete` until its selected inventory categories were fully
177
+ enumerated.
178
+
179
+ ## Step 5: Populate the `summary` Object
180
+
181
+ For each module shard, fill in the `summary` object with these fields
182
+ (all required by `schemas/project-context-module.json`):
183
+
184
+ - **`features`**: Domain terms this module contributes (e.g.,
185
+ `"search"`, `"chat"`, `"camera"`).
186
+ - **`activities`**: Array of `{name, entryPoints, screens}`. `name` is
187
+ the fully qualified Activity class. `entryPoints` lists launcher or
188
+ deep-link entry Activities. `screens` lists user-visible screen names.
189
+ - **`elements`**: Array of `{screen, resourceId?, text?,
190
+ contentDescription?, actions}`. At least one identity field is required.
191
+ `actions` is the list of actions the element supports (`click`,
192
+ `longClick`, `inputText`, `swipe`, `scrollTo`, `back`, `wait`).
193
+ - **`transitions`**: Array of `{fromActivity, toActivity, actionResourceId?
194
+ | actionText?}` describing cross-Activity navigation.
195
+ - **`logcat`**: Array of `{tag, pattern, match}` where `match` is
196
+ `"literal"` or `"regex"`. Derived from `Log.i`/`Log.d` calls in source.
197
+
198
+ Set the shard `status` to:
199
+ - `"complete"`: all inventory categories fully analyzed.
200
+ - `"partial"`: some categories analyzed, others skipped (note why).
201
+ - `"unsupported"`: module has no UI-relevant code (pure logic library).
202
+
203
+ Never leave a shard as `"notAnalyzed"` after this step.
204
+
205
+ ## Step 6: Update the Root Index
206
+
207
+ Edit `.taphound/context/project-context.json`:
208
+
209
+ 1. For each module entry in `modules[]`, copy `features`, `activities`,
210
+ and `status` from the corresponding shard.
211
+
212
+ 2. Update `interactionPolicy`:
213
+ - **`allowedActions`**: List ONLY actions the UI actually supports,
214
+ derived from source evidence. A Button supports `click`/`longClick`.
215
+ An EditText supports `inputText`. A scrollable container (ScrollView,
216
+ RecyclerView) supports `swipe`/`scrollTo`. System navigation supports
217
+ `back`. Any screen supports `wait`. Do NOT list all actions blindly
218
+ — if you found no `longClick` handlers in source, do not include
219
+ `longClick`.
220
+ - **`confirmationRequiredActions`**: WARNING — this is per-action-TYPE,
221
+ not per-element. Listing `click` here means EVERY click in the entire
222
+ app will require human TTY approval during generation. Only list an
223
+ action here if ALL instances of that action in the app are potentially
224
+ dangerous (e.g., an app where every click triggers a payment). In
225
+ most apps, leave this EMPTY — the Core risk evaluator handles per-step
226
+ risk assessment at runtime.
227
+ - **`forbiddenActions`**: Actions that are dangerous by default
228
+ (payment, account deletion, password changes, installing APKs,
229
+ third-party app navigation). If none apply, leave empty.
230
+ - No action may appear in both `allowedActions` and `forbiddenActions`.
231
+ - Every action in `confirmationRequiredActions` must also be in
232
+ `allowedActions`.
233
+
234
+ 3. Do NOT modify `packageName`, `launchActivity`, `manifest.files`,
235
+ `modules[].shardPath`, `modules[].sha256`, `modules[].moduleId`,
236
+ `modules[].projectDir`, or `modules[].kind` — Core owns these.
237
+ Do NOT add or remove module entries — Core discovered them.
238
+ Do NOT modify any `sha256` or `semanticSha256` field — Core computed
239
+ them. Run `context rehash` to recompute after your edits.
240
+
241
+ ## Incremental Updates
242
+
243
+ When an existing Context is `stale`, Core's `context refresh` handles
244
+ hash maintenance. The agent only re-scans source when semantic analysis
245
+ is actually needed:
246
+
247
+ ```bash
248
+ taphound context status --project <project> \
249
+ --context .taphound/context/project-context.json --json
250
+ ```
251
+
252
+ - `"valid"`: No action needed.
253
+ - `"stale"`: Run `context refresh --json`. It returns a `blocked` array;
254
+ each block has a `code` and `resolution`:
255
+ - `pruneDeleted` → `refresh --prune-deleted`
256
+ - `acceptSourceChanges` → `refresh --accept-source-changes` (rehashes
257
+ semantic edits). Re-analyze (Steps 1–5) only when the module summary
258
+ is now wrong or new UI files were added.
259
+ - `reanalyze` → Re-scan the affected module's source (Steps 1–5),
260
+ update its `summary`, then `context rehash`.
261
+ - `"invalid"`: Run `context generate --force` and redo Steps 1–5.
262
+
263
+ The typical reconcile for routine edits + deletions:
264
+ ```bash
265
+ taphound context refresh --project <project> \
266
+ --context .taphound/context/project-context.json \
267
+ --prune-deleted --accept-source-changes --json
268
+ ```
269
+
270
+ `--module <id...>` narrows scope. `refresh` backfills `semanticSha256`,
271
+ rehashes formatting-only changes, and repairs drifted hashes. It never
272
+ removes a file for a non-deletion reason.
273
+
274
+ **Caveat**: `--accept-source-changes` does NOT re-analyze newly added
275
+ Activities or layouts into the module summary. If the Goal may reach a
276
+ new screen, re-scan that module's source (Steps 1–5) and update its
277
+ `summary`, then run `context rehash`.
278
+
279
+ ### When to regenerate instead of refresh
280
+
281
+ Run `context generate --force` and redo full analysis (Steps 1–5) when:
282
+ - A new Gradle module was added or removed (check `settings.gradle`).
283
+ - The `packageName` or `launchActivity` changed.
284
+ - The Context is `"invalid"` (structural corruption).
285
+
286
+ ## Rules
287
+
288
+ - The agent NEVER computes SHA-256 hashes manually. Core does all hashing
289
+ via `context generate` and `context rehash`.
290
+ - The agent NEVER discovers modules manually. Core parses `settings.gradle`
291
+ and falls back to filesystem scanning.
292
+ - The agent NEVER resolves `applicationId` or launch Activity manually.
293
+ Core inspects build files and manifests.
294
+ - Paths in `manifest.files` are relative to the Android project root,
295
+ use forward slashes, and must not start with `/` or contain `..`.
296
+ Core already set these — do not modify them.
297
+ - For multi-module projects, include source analysis from all modules that
298
+ contribute to the UI — not just the `app` module.
299
+ - **Completeness is mandatory**: enumerate ALL `<activity>` entries from
300
+ ALL module manifests and include each Activity's source file analysis.
301
+ - For layouts using `<include>`, `<merge>`, or `<layout>`, resolve
302
+ transitively to understand the full element set.
303
+ - `confirmationRequiredActions` is per-action-TYPE. Listing `click` makes
304
+ EVERY click require human approval. Leave empty unless ALL instances of
305
+ an action are dangerous.
306
+ - `allowedActions` must be derived from source evidence, not blanket
307
+ inclusion. If no source evidence supports an action, do not list it.
308
+ - Do not include build artifacts, generated code, or non-UI files in your
309
+ analysis — Core already excluded them from the evidence manifest.
@@ -0,0 +1,123 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://taphound.dev/schemas/context-refresh-result.json",
4
+ "title": "TapHound context refresh --json Output",
5
+ "description": "Reference shape for the JSON result of `context refresh --json`. Core recomputes evidence hashes, backfills semanticSha256, rehashes formatting-only changes, repairs drifted hashes, and prunes deleted-file entries. The status field tells the agent whether to re-analyze source.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["status", "indexHash", "acceptedSourceChanges", "scopes", "blocked", "exitCode"],
9
+ "properties": {
10
+ "status": {
11
+ "enum": ["refreshed", "unchanged", "blocked"],
12
+ "description": "refreshed: at least one scope was written. unchanged: no hashes needed repair. blocked: one or more scopes could not be auto-refreshed."
13
+ },
14
+ "indexHash": {
15
+ "$ref": "#/$defs/sha256",
16
+ "description": "SHA-256 of the root index file bytes after refresh."
17
+ },
18
+ "acceptedSourceChanges": {
19
+ "type": "boolean",
20
+ "description": "Whether --accept-source-changes was passed and semantic edits were rehashed."
21
+ },
22
+ "scopes": {
23
+ "type": "array",
24
+ "description": "One entry per module (scope=module) plus one for the root index (scope=index).",
25
+ "items": { "$ref": "#/$defs/scopeReport" }
26
+ },
27
+ "blocked": {
28
+ "type": "array",
29
+ "description": "Scopes that could not be auto-refreshed. Each block carries a resolution the agent must act on.",
30
+ "items": { "$ref": "#/$defs/block" }
31
+ },
32
+ "exitCode": {
33
+ "enum": [0, 1],
34
+ "description": "0 when status is refreshed or unchanged. 1 when status is blocked."
35
+ }
36
+ },
37
+ "$defs": {
38
+ "sha256": {
39
+ "type": "string",
40
+ "pattern": "^[a-f\\d]{64}$"
41
+ },
42
+ "scopeReport": {
43
+ "type": "object",
44
+ "additionalProperties": false,
45
+ "required": [
46
+ "scope",
47
+ "id",
48
+ "contextPath",
49
+ "written",
50
+ "semanticBackfilled",
51
+ "formattingRehashed",
52
+ "semanticChanged",
53
+ "unresolved",
54
+ "pruned",
55
+ "inventoryChanged"
56
+ ],
57
+ "properties": {
58
+ "scope": { "enum": ["index", "module"] },
59
+ "id": {
60
+ "type": "string",
61
+ "description": "Module ID for scope=module, or \"index\" for scope=index."
62
+ },
63
+ "contextPath": {
64
+ "type": "string",
65
+ "description": "Project-relative path to the shard or index file."
66
+ },
67
+ "written": {
68
+ "type": "boolean",
69
+ "description": "Whether the file was actually written (hashes changed)."
70
+ },
71
+ "semanticBackfilled": {
72
+ "type": "integer",
73
+ "minimum": 0,
74
+ "description": "Number of evidence entries where semanticSha256 was missing and has been added."
75
+ },
76
+ "formattingRehashed": {
77
+ "type": "integer",
78
+ "minimum": 0,
79
+ "description": "Number of evidence entries whose full hash changed but semantic hash did not (formatting-only edit, rehashed automatically)."
80
+ },
81
+ "semanticChanged": {
82
+ "type": "array",
83
+ "items": { "type": "string" },
84
+ "description": "Project-relative paths whose semantic hash changed. Requires --accept-source-changes to rehash; otherwise blocked."
85
+ },
86
+ "unresolved": {
87
+ "type": "array",
88
+ "items": { "type": "string" },
89
+ "description": "Project-relative paths that could not be read (deleted or moved). Requires --prune-deleted to drop; otherwise blocked."
90
+ },
91
+ "pruned": {
92
+ "type": "integer",
93
+ "minimum": 0,
94
+ "description": "Number of evidence entries pruned via --prune-deleted."
95
+ },
96
+ "inventoryChanged": {
97
+ "type": "boolean",
98
+ "description": "Whether the module's inventory pathSetSha256 changed (files added or removed). Always blocks auto-refresh; requires reanalysis."
99
+ }
100
+ }
101
+ },
102
+ "block": {
103
+ "type": "object",
104
+ "additionalProperties": false,
105
+ "required": ["code", "resolution", "message"],
106
+ "properties": {
107
+ "code": {
108
+ "enum": [
109
+ "EVIDENCE_UNRESOLVED",
110
+ "EVIDENCE_SEMANTIC_CHANGED",
111
+ "MODULE_INVENTORY_CHANGED"
112
+ ],
113
+ "description": "EVIDENCE_UNRESOLVED: file missing. EVIDENCE_SEMANTIC_CHANGED: source semantics changed. MODULE_INVENTORY_CHANGED: files added or removed."
114
+ },
115
+ "resolution": {
116
+ "enum": ["pruneDeleted", "acceptSourceChanges", "reanalyze"],
117
+ "description": "Action the agent must take: pruneDeleted → refresh --prune-deleted. acceptSourceChanges → refresh --accept-source-changes. reanalyze → re-scan source and regenerate the shard."
118
+ },
119
+ "message": { "type": "string" }
120
+ }
121
+ }
122
+ }
123
+ }
@@ -0,0 +1,192 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://taphound.dev/schemas/project-context-module.json",
4
+ "title": "TapHound Project Context Module",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "version",
9
+ "moduleId",
10
+ "projectDir",
11
+ "status",
12
+ "inventory",
13
+ "manifest",
14
+ "summary"
15
+ ],
16
+ "properties": {
17
+ "version": { "const": 2 },
18
+ "moduleId": { "type": "string", "minLength": 1 },
19
+ "projectDir": { "$ref": "#/$defs/projectPath" },
20
+ "status": { "$ref": "#/$defs/shardStatus" },
21
+ "inventory": {
22
+ "type": "object",
23
+ "additionalProperties": false,
24
+ "required": ["version", "pathSetSha256", "categories"],
25
+ "properties": {
26
+ "version": { "const": 2 },
27
+ "pathSetSha256": { "$ref": "#/$defs/sha256" },
28
+ "categories": {
29
+ "type": "array",
30
+ "minItems": 1,
31
+ "uniqueItems": true,
32
+ "items": {
33
+ "enum": ["manifests", "sources", "layouts", "navigation"]
34
+ }
35
+ }
36
+ }
37
+ },
38
+ "manifest": { "$ref": "#/$defs/manifest" },
39
+ "summary": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": [
43
+ "features",
44
+ "activities",
45
+ "elements",
46
+ "transitions",
47
+ "logcat"
48
+ ],
49
+ "properties": {
50
+ "features": {
51
+ "type": "array",
52
+ "uniqueItems": true,
53
+ "items": { "type": "string", "minLength": 1 }
54
+ },
55
+ "activities": {
56
+ "type": "array",
57
+ "items": {
58
+ "type": "object",
59
+ "additionalProperties": false,
60
+ "required": ["name", "entryPoints", "screens"],
61
+ "properties": {
62
+ "name": { "$ref": "#/$defs/qualifiedName" },
63
+ "entryPoints": {
64
+ "type": "array",
65
+ "items": { "$ref": "#/$defs/qualifiedName" }
66
+ },
67
+ "screens": {
68
+ "type": "array",
69
+ "uniqueItems": true,
70
+ "items": { "type": "string", "minLength": 1 }
71
+ }
72
+ }
73
+ }
74
+ },
75
+ "elements": {
76
+ "type": "array",
77
+ "items": {
78
+ "type": "object",
79
+ "additionalProperties": false,
80
+ "required": ["screen", "actions"],
81
+ "properties": {
82
+ "screen": { "type": "string", "minLength": 1 },
83
+ "resourceId": { "type": "string", "minLength": 1 },
84
+ "text": { "type": "string", "minLength": 1 },
85
+ "contentDescription": { "type": "string", "minLength": 1 },
86
+ "actions": {
87
+ "type": "array",
88
+ "minItems": 1,
89
+ "items": { "$ref": "#/$defs/action" }
90
+ }
91
+ },
92
+ "anyOf": [
93
+ { "required": ["resourceId"] },
94
+ { "required": ["text"] },
95
+ { "required": ["contentDescription"] }
96
+ ]
97
+ }
98
+ },
99
+ "transitions": {
100
+ "type": "array",
101
+ "items": {
102
+ "type": "object",
103
+ "additionalProperties": false,
104
+ "required": ["fromActivity", "toActivity"],
105
+ "properties": {
106
+ "fromActivity": { "$ref": "#/$defs/qualifiedName" },
107
+ "actionResourceId": { "type": "string", "minLength": 1 },
108
+ "actionText": { "type": "string", "minLength": 1 },
109
+ "toActivity": { "$ref": "#/$defs/qualifiedName" }
110
+ },
111
+ "anyOf": [
112
+ { "required": ["actionResourceId"] },
113
+ { "required": ["actionText"] }
114
+ ]
115
+ }
116
+ },
117
+ "logcat": {
118
+ "type": "array",
119
+ "items": {
120
+ "type": "object",
121
+ "additionalProperties": false,
122
+ "required": ["tag", "pattern", "match"],
123
+ "properties": {
124
+ "tag": { "type": "string", "minLength": 1 },
125
+ "pattern": { "type": "string", "minLength": 1 },
126
+ "match": { "enum": ["literal", "regex"] }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ },
133
+ "$defs": {
134
+ "qualifiedName": {
135
+ "type": "string",
136
+ "pattern": "^(?:[A-Za-z_$][\\w$]*\\.)+[A-Za-z_$][\\w$]*$"
137
+ },
138
+ "projectPath": {
139
+ "type": "string",
140
+ "minLength": 1,
141
+ "pattern": "^(?!/)(?![A-Za-z]:)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\\\]+$"
142
+ },
143
+ "sha256": {
144
+ "type": "string",
145
+ "pattern": "^[a-f\\d]{64}$"
146
+ },
147
+ "shardStatus": {
148
+ "enum": ["complete", "partial", "unsupported", "notAnalyzed"]
149
+ },
150
+ "action": {
151
+ "enum": [
152
+ "click",
153
+ "longClick",
154
+ "inputText",
155
+ "swipe",
156
+ "scrollTo",
157
+ "back",
158
+ "wait"
159
+ ]
160
+ },
161
+ "manifest": {
162
+ "type": "object",
163
+ "additionalProperties": false,
164
+ "required": ["version", "files"],
165
+ "properties": {
166
+ "version": { "const": 1 },
167
+ "files": {
168
+ "type": "array",
169
+ "minItems": 1,
170
+ "items": {
171
+ "type": "object",
172
+ "additionalProperties": false,
173
+ "required": ["path", "sha256", "confidence"],
174
+ "properties": {
175
+ "path": { "$ref": "#/$defs/projectPath" },
176
+ "sha256": { "$ref": "#/$defs/sha256" },
177
+ "semanticSha256": { "$ref": "#/$defs/sha256" },
178
+ "confidence": {
179
+ "enum": [
180
+ "sourceConfirmed",
181
+ "runtimeConfirmed",
182
+ "inferred",
183
+ "unknown"
184
+ ]
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ }