harnery 0.33.0 → 0.34.0

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 (657) hide show
  1. package/dist/commander.d.ts.map +1 -1
  2. package/dist/commander.js +4 -0
  3. package/dist/commands/adapter.js +2 -2
  4. package/dist/commands/agents.d.ts +144 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +1220 -588
  7. package/dist/commands/artifacts.d.ts.map +1 -1
  8. package/dist/commands/artifacts.js +7 -6
  9. package/dist/commands/backup.d.ts +1 -1
  10. package/dist/commands/backup.d.ts.map +1 -1
  11. package/dist/commands/backup.js +29 -16
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +234 -12
  14. package/dist/commands/checkpoint.d.ts.map +1 -1
  15. package/dist/commands/checkpoint.js +3 -2
  16. package/dist/commands/claude-desktop.d.ts +1 -1
  17. package/dist/commands/claude-desktop.d.ts.map +1 -1
  18. package/dist/commands/claude-desktop.js +3 -74
  19. package/dist/commands/context.js +1 -6
  20. package/dist/commands/decision.d.ts.map +1 -1
  21. package/dist/commands/decision.js +22 -38
  22. package/dist/commands/docs.d.ts.map +1 -1
  23. package/dist/commands/docs.js +91 -28
  24. package/dist/commands/doctor.js +10 -1
  25. package/dist/commands/events.d.ts +5 -0
  26. package/dist/commands/events.d.ts.map +1 -0
  27. package/dist/commands/events.js +189 -0
  28. package/dist/commands/governor.d.ts.map +1 -1
  29. package/dist/commands/governor.js +13 -4
  30. package/dist/commands/init.d.ts +9 -2
  31. package/dist/commands/init.d.ts.map +1 -1
  32. package/dist/commands/init.js +223 -51
  33. package/dist/commands/journal.d.ts.map +1 -1
  34. package/dist/commands/journal.js +4 -13
  35. package/dist/commands/ledger-v3.d.ts +5 -0
  36. package/dist/commands/ledger-v3.d.ts.map +1 -0
  37. package/dist/commands/ledger-v3.js +91 -0
  38. package/dist/commands/presence.d.ts.map +1 -1
  39. package/dist/commands/presence.js +11 -5
  40. package/dist/commands/sync.d.ts +1 -1
  41. package/dist/commands/sync.js +1 -1
  42. package/dist/commands/web.d.ts +6 -0
  43. package/dist/commands/web.d.ts.map +1 -1
  44. package/dist/commands/web.js +67 -7
  45. package/dist/commands/work.d.ts.map +1 -1
  46. package/dist/commands/work.js +22 -5
  47. package/dist/core/adapter.d.ts +5 -0
  48. package/dist/core/adapter.d.ts.map +1 -0
  49. package/dist/core/adapter.js +1 -0
  50. package/dist/core/adapters/attest.d.ts +5 -2
  51. package/dist/core/adapters/attest.d.ts.map +1 -1
  52. package/dist/core/adapters/attest.js +8 -3
  53. package/dist/core/adapters/profiles.d.ts +6 -6
  54. package/dist/core/adapters/profiles.d.ts.map +1 -1
  55. package/dist/core/adapters/profiles.js +4 -4
  56. package/dist/core/agents/canonical-emit.d.ts +17 -15
  57. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  58. package/dist/core/agents/canonical-emit.js +22 -22
  59. package/dist/core/agents/cli.js +207 -234
  60. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  61. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  62. package/dist/core/agents/codex-archive-v3.js +110 -0
  63. package/dist/core/agents/coord-client.d.ts +19 -81
  64. package/dist/core/agents/coord-client.d.ts.map +1 -1
  65. package/dist/core/agents/coord-client.js +65 -155
  66. package/dist/core/agents/finalization.d.ts +4 -1
  67. package/dist/core/agents/finalization.d.ts.map +1 -1
  68. package/dist/core/agents/finalization.js +89 -32
  69. package/dist/core/agents/index.d.ts +4 -5
  70. package/dist/core/agents/index.d.ts.map +1 -1
  71. package/dist/core/agents/index.js +4 -5
  72. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  73. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  74. package/dist/core/agents/live-authority-v3.js +233 -0
  75. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  76. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  77. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  78. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  79. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-observation-v3.js +157 -0
  81. package/dist/core/agents/render/prompt-context.d.ts +4 -4
  82. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  83. package/dist/core/agents/render/prompt-context.js +23 -58
  84. package/dist/core/agents/render/session-context.d.ts +1 -1
  85. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  86. package/dist/core/agents/render/session-context.js +8 -32
  87. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  88. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  89. package/dist/core/agents/rules/claim-conflict.js +79 -127
  90. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  91. package/dist/core/agents/rules/commit-conflict.js +3 -18
  92. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  93. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  94. package/dist/core/agents/rules/stop-hook.js +193 -236
  95. package/dist/core/agents/session-events.d.ts +5 -7
  96. package/dist/core/agents/session-events.d.ts.map +1 -1
  97. package/dist/core/agents/session-events.js +127 -95
  98. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  99. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  100. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  101. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  102. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  103. package/dist/core/agents/session-finalizer-v3.js +734 -0
  104. package/dist/core/agents/session-name-display.d.ts +40 -0
  105. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  106. package/dist/core/agents/session-name-display.js +119 -0
  107. package/dist/core/agents/state/activity-log.d.ts +3 -3
  108. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  109. package/dist/core/agents/state/activity-log.js +7 -16
  110. package/dist/core/agents/state/heartbeat-writer.d.ts +23 -55
  111. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  112. package/dist/core/agents/state/heartbeat-writer.js +56 -228
  113. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  114. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  115. package/dist/core/agents/state/live-coordination-view.js +209 -0
  116. package/dist/core/agents/state/session-state.d.ts +4 -3
  117. package/dist/core/agents/state/session-state.d.ts.map +1 -1
  118. package/dist/core/agents/state/session-state.js +18 -9
  119. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  120. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  121. package/dist/core/agents/state/stale-sweep.js +26 -15
  122. package/dist/core/artifacts/index.d.ts.map +1 -1
  123. package/dist/core/artifacts/index.js +5 -7
  124. package/dist/core/config.d.ts +33 -2
  125. package/dist/core/config.d.ts.map +1 -1
  126. package/dist/core/config.js +98 -2
  127. package/dist/core/context/index.d.ts +1 -4
  128. package/dist/core/context/index.d.ts.map +1 -1
  129. package/dist/core/context/index.js +9 -9
  130. package/dist/core/events/span-parent.d.ts +15 -0
  131. package/dist/core/events/span-parent.d.ts.map +1 -0
  132. package/dist/core/events/span-parent.js +34 -0
  133. package/dist/core/events/v3/advance.d.ts +14 -0
  134. package/dist/core/events/v3/advance.d.ts.map +1 -0
  135. package/dist/core/events/v3/advance.js +134 -0
  136. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  137. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  138. package/dist/core/events/v3/authority-outbox.js +399 -0
  139. package/dist/core/events/v3/base-builder.d.ts +20 -0
  140. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  141. package/dist/core/events/v3/base-builder.js +29 -0
  142. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  143. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  144. package/dist/core/events/v3/base-contract.js +647 -0
  145. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  146. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  147. package/dist/core/events/v3/bootstrap.js +175 -0
  148. package/dist/core/events/v3/builder.d.ts +20 -0
  149. package/dist/core/events/v3/builder.d.ts.map +1 -0
  150. package/dist/core/events/v3/builder.js +28 -0
  151. package/dist/core/events/v3/canonical.d.ts +31 -0
  152. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  153. package/dist/core/events/v3/canonical.js +100 -0
  154. package/dist/core/events/v3/capabilities.d.ts +31 -0
  155. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  156. package/dist/core/events/v3/capabilities.js +107 -0
  157. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  158. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  159. package/dist/core/events/v3/capability-drift.js +134 -0
  160. package/dist/core/events/v3/catalog.d.ts +38 -0
  161. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  162. package/dist/core/events/v3/catalog.js +135 -0
  163. package/dist/core/events/v3/clock-order.d.ts +34 -0
  164. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  165. package/dist/core/events/v3/clock-order.js +35 -0
  166. package/dist/core/events/v3/contract.d.ts +171 -0
  167. package/dist/core/events/v3/contract.d.ts.map +1 -0
  168. package/dist/core/events/v3/contract.js +180 -0
  169. package/dist/core/events/v3/control.d.ts +111 -0
  170. package/dist/core/events/v3/control.d.ts.map +1 -0
  171. package/dist/core/events/v3/control.js +419 -0
  172. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  173. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  174. package/dist/core/events/v3/coordination-view.js +119 -0
  175. package/dist/core/events/v3/economics.d.ts +77 -0
  176. package/dist/core/events/v3/economics.d.ts.map +1 -0
  177. package/dist/core/events/v3/economics.js +274 -0
  178. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  179. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/finalization-view.js +37 -0
  181. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  182. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  183. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  184. package/dist/core/events/v3/generated.d.ts +4 -0
  185. package/dist/core/events/v3/generated.d.ts.map +1 -0
  186. package/dist/core/events/v3/generated.js +47 -0
  187. package/dist/core/events/v3/ids.d.ts +9 -0
  188. package/dist/core/events/v3/ids.d.ts.map +1 -0
  189. package/dist/core/events/v3/ids.js +25 -0
  190. package/dist/core/events/v3/index.d.ts +35 -0
  191. package/dist/core/events/v3/index.d.ts.map +1 -0
  192. package/dist/core/events/v3/index.js +33 -0
  193. package/dist/core/events/v3/latency.d.ts +63 -0
  194. package/dist/core/events/v3/latency.d.ts.map +1 -0
  195. package/dist/core/events/v3/latency.js +412 -0
  196. package/dist/core/events/v3/live-feed.d.ts +45 -0
  197. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  198. package/dist/core/events/v3/live-feed.js +246 -0
  199. package/dist/core/events/v3/live-observation.d.ts +35 -0
  200. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  201. package/dist/core/events/v3/live-observation.js +1 -0
  202. package/dist/core/events/v3/live-routing.d.ts +57 -0
  203. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-routing.js +107 -0
  205. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  206. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  207. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  208. package/dist/core/events/v3/producers/command.d.ts +50 -0
  209. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  210. package/dist/core/events/v3/producers/command.js +135 -0
  211. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  212. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  214. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  215. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/coordination.js +229 -0
  217. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  218. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/hook-base.js +424 -0
  220. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  221. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/hook.js +71 -0
  223. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  224. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/intake.js +244 -0
  226. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  227. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/recorder.js +2176 -0
  229. package/dist/core/events/v3/projection.d.ts +101 -0
  230. package/dist/core/events/v3/projection.d.ts.map +1 -0
  231. package/dist/core/events/v3/projection.js +479 -0
  232. package/dist/core/events/v3/reader.d.ts +75 -0
  233. package/dist/core/events/v3/reader.d.ts.map +1 -0
  234. package/dist/core/events/v3/reader.js +778 -0
  235. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  236. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  237. package/dist/core/events/v3/recovery-record.js +167 -0
  238. package/dist/core/events/v3/recovery.d.ts +22 -0
  239. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  240. package/dist/core/events/v3/recovery.js +227 -0
  241. package/dist/core/events/v3/span-state.d.ts +52 -0
  242. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  243. package/dist/core/events/v3/span-state.js +142 -0
  244. package/dist/core/events/v3/targets.d.ts +23 -0
  245. package/dist/core/events/v3/targets.d.ts.map +1 -0
  246. package/dist/core/events/v3/targets.js +134 -0
  247. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  248. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  249. package/dist/core/events/v3/turn-telemetry.js +168 -0
  250. package/dist/core/events/v3/validate.d.ts +9 -0
  251. package/dist/core/events/v3/validate.d.ts.map +1 -0
  252. package/dist/core/events/v3/validate.js +281 -0
  253. package/dist/core/events/v3/writer.d.ts +56 -0
  254. package/dist/core/events/v3/writer.d.ts.map +1 -0
  255. package/dist/core/events/v3/writer.js +335 -0
  256. package/dist/core/governor/index.d.ts +1 -1
  257. package/dist/core/governor/index.d.ts.map +1 -1
  258. package/dist/core/governor/index.js +1 -1
  259. package/dist/core/governor/plan-api.d.ts +2 -1
  260. package/dist/core/governor/plan-api.d.ts.map +1 -1
  261. package/dist/core/governor/plan-api.js +6 -3
  262. package/dist/core/governor/read.d.ts +1 -1
  263. package/dist/core/governor/read.d.ts.map +1 -1
  264. package/dist/core/governor/read.js +1 -1
  265. package/dist/core/governor/state.d.ts +9 -0
  266. package/dist/core/governor/state.d.ts.map +1 -1
  267. package/dist/core/governor/state.js +40 -3
  268. package/dist/core/guard/config.d.ts +5 -0
  269. package/dist/core/guard/config.d.ts.map +1 -0
  270. package/dist/core/guard/config.js +157 -0
  271. package/dist/core/guard/coordinator.d.ts +14 -0
  272. package/dist/core/guard/coordinator.d.ts.map +1 -0
  273. package/dist/core/guard/coordinator.js +173 -0
  274. package/dist/core/guard/evaluator.d.ts +4 -0
  275. package/dist/core/guard/evaluator.d.ts.map +1 -0
  276. package/dist/core/guard/evaluator.js +242 -0
  277. package/dist/core/guard/evidence-v3.d.ts +15 -0
  278. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  279. package/dist/core/guard/evidence-v3.js +171 -0
  280. package/dist/core/guard/index.d.ts +10 -0
  281. package/dist/core/guard/index.d.ts.map +1 -0
  282. package/dist/core/guard/index.js +6 -0
  283. package/dist/core/guard/live-source-v3.d.ts +40 -0
  284. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  285. package/dist/core/guard/live-source-v3.js +128 -0
  286. package/dist/core/guard/storage.d.ts +27 -0
  287. package/dist/core/guard/storage.d.ts.map +1 -0
  288. package/dist/core/guard/storage.js +140 -0
  289. package/dist/core/guard/types.d.ts +119 -0
  290. package/dist/core/guard/types.d.ts.map +1 -0
  291. package/dist/core/guard/types.js +1 -0
  292. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  293. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  294. package/dist/core/hooks/adapter/detect.js +29 -0
  295. package/dist/core/hooks/adapter/events.d.ts +7 -4
  296. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  297. package/dist/core/hooks/adapter/events.js +12 -4
  298. package/dist/core/hooks/adapter/output.d.ts +2 -2
  299. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  301. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  302. package/dist/core/hooks/adapter/parse.js +63 -25
  303. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  304. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  305. package/dist/core/hooks/adapter/wiring.js +89 -11
  306. package/dist/core/hooks/cli.d.ts +1 -1
  307. package/dist/core/hooks/cli.js +305 -444
  308. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  309. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  310. package/dist/core/hooks/effects/image-capture.js +212 -221
  311. package/dist/core/hooks/effects/index.d.ts +1 -9
  312. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  313. package/dist/core/hooks/effects/index.js +1 -24
  314. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  315. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  316. package/dist/core/hooks/events/input-hash.js +43 -0
  317. package/dist/core/hooks/index.d.ts +4 -3
  318. package/dist/core/hooks/index.d.ts.map +1 -1
  319. package/dist/core/hooks/index.js +2 -3
  320. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  321. package/dist/core/hooks/resolve/coord-root.js +1 -1
  322. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  323. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  324. package/dist/core/hooks/resolve/owner.js +51 -42
  325. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  326. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  327. package/dist/core/hooks/resolve/transcript.js +155 -14
  328. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  329. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  330. package/dist/core/hooks/session-name-presence.js +15 -15
  331. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  332. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  333. package/dist/core/journal/index.d.ts +2 -2
  334. package/dist/core/journal/index.d.ts.map +1 -1
  335. package/dist/core/journal/index.js +9 -22
  336. package/dist/core/presence/blob.d.ts +4 -3
  337. package/dist/core/presence/blob.d.ts.map +1 -1
  338. package/dist/core/presence/blob.js +45 -44
  339. package/dist/core/presence/codec-digest.d.ts +29 -0
  340. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  341. package/dist/core/presence/codec-digest.js +170 -0
  342. package/dist/core/presence/relay-client.d.ts +1 -1
  343. package/dist/core/presence/relay-client.d.ts.map +1 -1
  344. package/dist/core/presence/relay-client.js +5 -5
  345. package/dist/core/work/index.d.ts +1 -1
  346. package/dist/core/work/index.d.ts.map +1 -1
  347. package/dist/core/work/index.js +1 -1
  348. package/dist/core/work/read.d.ts +1 -1
  349. package/dist/core/work/read.d.ts.map +1 -1
  350. package/dist/core/work/read.js +1 -1
  351. package/dist/core/work/runner.d.ts.map +1 -1
  352. package/dist/core/work/runner.js +6 -0
  353. package/dist/core/work/state.d.ts +9 -0
  354. package/dist/core/work/state.d.ts.map +1 -1
  355. package/dist/core/work/state.js +17 -3
  356. package/dist/core/workflow/engine.js +24 -25
  357. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  358. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  359. package/dist/core/workflow/live-session-v3.js +86 -0
  360. package/dist/core/workflow/scope-id.d.ts +3 -0
  361. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  362. package/dist/core/workflow/scope-id.js +5 -0
  363. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  364. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  365. package/dist/core/workflow/workspaces/leases.js +53 -19
  366. package/dist/index.d.ts +1 -1
  367. package/dist/index.js +1 -1
  368. package/dist/lib/browser/client.d.ts +41 -0
  369. package/dist/lib/browser/client.d.ts.map +1 -1
  370. package/dist/lib/browser/client.js +203 -0
  371. package/dist/lib/browser/critique.d.ts +28 -2
  372. package/dist/lib/browser/critique.d.ts.map +1 -1
  373. package/dist/lib/browser/critique.js +74 -18
  374. package/dist/lib/browser/geometry.d.ts +1 -1
  375. package/dist/lib/browser/geometry.d.ts.map +1 -1
  376. package/dist/lib/browser/geometry.js +130 -6
  377. package/dist/lib/browser/index.d.ts +3 -0
  378. package/dist/lib/browser/index.d.ts.map +1 -1
  379. package/dist/lib/browser/index.js +3 -0
  380. package/dist/lib/browser/qa-plan.d.ts +174 -0
  381. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  382. package/dist/lib/browser/qa-plan.js +321 -0
  383. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  384. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  385. package/dist/lib/browser/qa-reuse.js +222 -0
  386. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  387. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  388. package/dist/lib/browser/qa-snapshot.js +171 -0
  389. package/dist/lib/browser/runts.d.ts.map +1 -1
  390. package/dist/lib/browser/runts.js +22 -1
  391. package/dist/lib/browser/tiling.d.ts +71 -0
  392. package/dist/lib/browser/tiling.d.ts.map +1 -0
  393. package/dist/lib/browser/tiling.js +118 -0
  394. package/dist/lib/claude-desktop.d.ts +0 -47
  395. package/dist/lib/claude-desktop.d.ts.map +1 -1
  396. package/dist/lib/claude-desktop.js +1 -169
  397. package/dist/lib/context/index.d.ts +0 -3
  398. package/dist/lib/context/index.d.ts.map +1 -1
  399. package/dist/lib/context/index.js +20 -42
  400. package/dist/lib/council/index.d.ts +2 -2
  401. package/dist/lib/council/index.d.ts.map +1 -1
  402. package/dist/lib/council/index.js +9 -20
  403. package/dist/lib/docs-frontmatter.d.ts +1 -6
  404. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  405. package/dist/lib/docs-frontmatter.js +12 -78
  406. package/dist/lib/docs-index.d.ts +9 -0
  407. package/dist/lib/docs-index.d.ts.map +1 -1
  408. package/dist/lib/docs-index.js +32 -3
  409. package/dist/lib/docs-lint.d.ts.map +1 -1
  410. package/dist/lib/docs-lint.js +14 -30
  411. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  412. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  413. package/dist/lib/docs-metadata-audit.js +132 -0
  414. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  415. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  416. package/dist/lib/docs-metadata-managed.js +78 -0
  417. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  418. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  419. package/dist/lib/docs-metadata-sync.js +222 -0
  420. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  421. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  422. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  423. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  424. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  425. package/dist/lib/docs-metadata-v2.js +424 -0
  426. package/dist/lib/docs-new.d.ts +11 -0
  427. package/dist/lib/docs-new.d.ts.map +1 -0
  428. package/dist/lib/docs-new.js +52 -0
  429. package/dist/lib/docs-sweep.d.ts.map +1 -1
  430. package/dist/lib/docs-sweep.js +45 -29
  431. package/dist/lib/headless/index.d.ts +98 -0
  432. package/dist/lib/headless/index.d.ts.map +1 -0
  433. package/dist/lib/headless/index.js +211 -0
  434. package/dist/lib/identities/assume.d.ts +4 -4
  435. package/dist/lib/identities/assume.d.ts.map +1 -1
  436. package/dist/lib/identities/assume.js +52 -68
  437. package/dist/lib/instructions/apply.d.ts +5 -4
  438. package/dist/lib/instructions/apply.d.ts.map +1 -1
  439. package/dist/lib/instructions/apply.js +32 -20
  440. package/dist/lib/instructions/bundle.d.ts +1 -1
  441. package/dist/lib/instructions/bundle.d.ts.map +1 -1
  442. package/dist/lib/instructions/bundle.js +1 -1
  443. package/dist/lib/instructions/splice.d.ts +0 -1
  444. package/dist/lib/instructions/splice.d.ts.map +1 -1
  445. package/dist/lib/instructions/splice.js +22 -6
  446. package/dist/lib/instructions/templates.d.ts +7 -5
  447. package/dist/lib/instructions/templates.d.ts.map +1 -1
  448. package/dist/lib/instructions/templates.js +79 -9
  449. package/package.json +26 -5
  450. package/schemas/config.schema.json +120 -2
  451. package/schemas/docs-metadata-v2.schema.json +441 -0
  452. package/schemas/event-v3.schema.json +24472 -0
  453. package/src/commander.ts +4 -0
  454. package/src/commands/adapter.ts +2 -2
  455. package/src/commands/agents.ts +1512 -592
  456. package/src/commands/artifacts.ts +7 -6
  457. package/src/commands/backup.ts +29 -21
  458. package/src/commands/browse.ts +349 -8
  459. package/src/commands/checkpoint.ts +4 -3
  460. package/src/commands/claude-desktop.ts +2 -101
  461. package/src/commands/context.ts +1 -6
  462. package/src/commands/decision.ts +27 -44
  463. package/src/commands/docs.ts +100 -33
  464. package/src/commands/doctor.ts +14 -1
  465. package/src/commands/events.ts +256 -0
  466. package/src/commands/governor.ts +18 -4
  467. package/src/commands/init.ts +253 -57
  468. package/src/commands/instructions.ts +1 -1
  469. package/src/commands/journal.ts +4 -13
  470. package/src/commands/ledger-v3.ts +111 -0
  471. package/src/commands/presence.ts +11 -10
  472. package/src/commands/sync.ts +1 -1
  473. package/src/commands/web.ts +67 -8
  474. package/src/commands/work.ts +28 -5
  475. package/src/core/adapter.ts +5 -0
  476. package/src/core/adapters/attest.ts +8 -3
  477. package/src/core/adapters/profiles.ts +4 -6
  478. package/src/core/agents/canonical-emit.ts +34 -25
  479. package/src/core/agents/cli.ts +236 -262
  480. package/src/core/agents/codex-archive-v3.ts +138 -0
  481. package/src/core/agents/coord-client.ts +75 -188
  482. package/src/core/agents/finalization.ts +120 -38
  483. package/src/core/agents/index.ts +4 -5
  484. package/src/core/agents/live-authority-v3.ts +375 -0
  485. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  486. package/src/core/agents/live-observation-v3.ts +216 -0
  487. package/src/core/agents/render/prompt-context.ts +29 -60
  488. package/src/core/agents/render/session-context.ts +10 -31
  489. package/src/core/agents/rules/claim-conflict.ts +85 -126
  490. package/src/core/agents/rules/commit-conflict.ts +3 -14
  491. package/src/core/agents/rules/stop-hook.ts +239 -293
  492. package/src/core/agents/session-events.ts +137 -104
  493. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  494. package/src/core/agents/session-finalizer-v3.ts +953 -0
  495. package/src/core/agents/session-name-display.ts +149 -0
  496. package/src/core/agents/state/activity-log.ts +6 -14
  497. package/src/core/agents/state/heartbeat-writer.ts +82 -277
  498. package/src/core/agents/state/live-coordination-view.ts +290 -0
  499. package/src/core/agents/state/session-state.ts +24 -12
  500. package/src/core/agents/state/stale-sweep.ts +40 -17
  501. package/src/core/artifacts/index.ts +4 -5
  502. package/src/core/config.ts +148 -3
  503. package/src/core/context/index.ts +9 -17
  504. package/src/core/events/span-parent.ts +46 -0
  505. package/src/core/events/v3/advance.ts +168 -0
  506. package/src/core/events/v3/authority-outbox.ts +548 -0
  507. package/src/core/events/v3/base-builder.ts +60 -0
  508. package/src/core/events/v3/base-contract.ts +882 -0
  509. package/src/core/events/v3/bootstrap.ts +226 -0
  510. package/src/core/events/v3/builder.ts +59 -0
  511. package/src/core/events/v3/canonical.ts +153 -0
  512. package/src/core/events/v3/capabilities.ts +171 -0
  513. package/src/core/events/v3/capability-drift.ts +177 -0
  514. package/src/core/events/v3/catalog.ts +202 -0
  515. package/src/core/events/v3/clock-order.ts +41 -0
  516. package/src/core/events/v3/contract.ts +365 -0
  517. package/src/core/events/v3/control.ts +576 -0
  518. package/src/core/events/v3/coordination-view.ts +193 -0
  519. package/src/core/events/v3/economics.ts +384 -0
  520. package/src/core/events/v3/finalization-view.ts +67 -0
  521. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  522. package/src/core/events/v3/generated.ts +48 -0
  523. package/src/core/events/v3/ids.ts +33 -0
  524. package/src/core/events/v3/index.ts +322 -0
  525. package/src/core/events/v3/latency.ts +551 -0
  526. package/src/core/events/v3/live-feed.ts +319 -0
  527. package/src/core/events/v3/live-observation.ts +39 -0
  528. package/src/core/events/v3/live-routing.ts +135 -0
  529. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  530. package/src/core/events/v3/producers/command.ts +201 -0
  531. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  532. package/src/core/events/v3/producers/coordination.ts +355 -0
  533. package/src/core/events/v3/producers/hook-base.ts +578 -0
  534. package/src/core/events/v3/producers/hook.ts +119 -0
  535. package/src/core/events/v3/producers/intake.ts +319 -0
  536. package/src/core/events/v3/producers/recorder.ts +2805 -0
  537. package/src/core/events/v3/projection.ts +653 -0
  538. package/src/core/events/v3/reader.ts +1127 -0
  539. package/src/core/events/v3/recovery-record.ts +244 -0
  540. package/src/core/events/v3/recovery.ts +271 -0
  541. package/src/core/events/v3/span-state.ts +187 -0
  542. package/src/core/events/v3/targets.ts +182 -0
  543. package/src/core/events/v3/turn-telemetry.ts +259 -0
  544. package/src/core/events/v3/validate.ts +361 -0
  545. package/src/core/events/v3/writer.ts +419 -0
  546. package/src/core/governor/index.ts +3 -0
  547. package/src/core/governor/plan-api.ts +10 -2
  548. package/src/core/governor/read.ts +3 -0
  549. package/src/core/governor/state.ts +52 -5
  550. package/src/core/guard/config.ts +206 -0
  551. package/src/core/guard/coordinator.ts +227 -0
  552. package/src/core/guard/evaluator.ts +343 -0
  553. package/src/core/guard/evidence-v3.ts +227 -0
  554. package/src/core/guard/index.ts +35 -0
  555. package/src/core/guard/live-source-v3.ts +204 -0
  556. package/src/core/guard/storage.ts +188 -0
  557. package/src/core/guard/types.ts +152 -0
  558. package/src/core/hooks/adapter/detect.ts +28 -1
  559. package/src/core/hooks/adapter/events.ts +14 -6
  560. package/src/core/hooks/adapter/output.ts +7 -2
  561. package/src/core/hooks/adapter/parse.ts +80 -38
  562. package/src/core/hooks/adapter/wiring.ts +119 -13
  563. package/src/core/hooks/cli.ts +351 -466
  564. package/src/core/hooks/effects/image-capture.ts +228 -238
  565. package/src/core/hooks/effects/index.ts +1 -36
  566. package/src/core/hooks/events/input-hash.ts +47 -0
  567. package/src/core/hooks/index.ts +4 -11
  568. package/src/core/hooks/resolve/coord-root.ts +1 -1
  569. package/src/core/hooks/resolve/owner.ts +52 -45
  570. package/src/core/hooks/resolve/transcript.ts +165 -14
  571. package/src/core/hooks/session-name-presence.ts +14 -15
  572. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  573. package/src/core/journal/index.ts +15 -22
  574. package/src/core/presence/blob.ts +48 -41
  575. package/src/core/presence/codec-digest.ts +215 -0
  576. package/src/core/presence/relay-client.ts +5 -5
  577. package/src/core/work/index.ts +3 -0
  578. package/src/core/work/read.ts +3 -0
  579. package/src/core/work/runner.ts +6 -0
  580. package/src/core/work/state.ts +27 -3
  581. package/src/core/workflow/engine.ts +24 -24
  582. package/src/core/workflow/live-session-v3.ts +126 -0
  583. package/src/core/workflow/scope-id.ts +6 -0
  584. package/src/core/workflow/workspaces/leases.ts +56 -19
  585. package/src/index.ts +1 -1
  586. package/src/lib/browser/client.ts +230 -0
  587. package/src/lib/browser/critique.ts +104 -27
  588. package/src/lib/browser/geometry.ts +143 -14
  589. package/src/lib/browser/index.ts +34 -0
  590. package/src/lib/browser/qa-plan.ts +501 -0
  591. package/src/lib/browser/qa-reuse.ts +306 -0
  592. package/src/lib/browser/qa-snapshot.ts +223 -0
  593. package/src/lib/browser/runts.ts +27 -2
  594. package/src/lib/browser/tiling.ts +164 -0
  595. package/src/lib/claude-desktop.ts +1 -232
  596. package/src/lib/context/index.ts +22 -46
  597. package/src/lib/council/index.ts +9 -21
  598. package/src/lib/docs-frontmatter.ts +8 -79
  599. package/src/lib/docs-index.ts +33 -3
  600. package/src/lib/docs-lint.ts +15 -29
  601. package/src/lib/docs-metadata-audit.ts +166 -0
  602. package/src/lib/docs-metadata-managed.ts +83 -0
  603. package/src/lib/docs-metadata-sync.ts +262 -0
  604. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  605. package/src/lib/docs-metadata-v2.ts +646 -0
  606. package/src/lib/docs-new.ts +63 -0
  607. package/src/lib/docs-sweep.ts +42 -28
  608. package/src/lib/headless/index.ts +287 -0
  609. package/src/lib/identities/assume.ts +67 -86
  610. package/src/lib/instructions/apply.ts +33 -20
  611. package/src/lib/instructions/bundle.ts +2 -2
  612. package/src/lib/instructions/splice.ts +21 -7
  613. package/src/lib/instructions/templates.ts +85 -13
  614. package/dist/core/agents/cli-emit.d.ts +0 -27
  615. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  616. package/dist/core/agents/cli-emit.js +0 -57
  617. package/dist/core/agents/codex-replay.d.ts +0 -29
  618. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  619. package/dist/core/agents/codex-replay.js +0 -138
  620. package/dist/core/agents/events/consume.d.ts +0 -82
  621. package/dist/core/agents/events/consume.d.ts.map +0 -1
  622. package/dist/core/agents/events/consume.js +0 -195
  623. package/dist/core/agents/events/emit.d.ts +0 -42
  624. package/dist/core/agents/events/emit.d.ts.map +0 -1
  625. package/dist/core/agents/events/emit.js +0 -75
  626. package/dist/core/agents/events/ulid.d.ts +0 -11
  627. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  628. package/dist/core/agents/events/ulid.js +0 -47
  629. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -76
  630. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  631. package/dist/core/agents/state/heartbeat-projector.js +0 -581
  632. package/dist/core/hooks/events/emit.d.ts +0 -31
  633. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  634. package/dist/core/hooks/events/emit.js +0 -93
  635. package/dist/core/hooks/events/rotate.d.ts +0 -43
  636. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  637. package/dist/core/hooks/events/rotate.js +0 -142
  638. package/dist/core/hooks/events/schema.d.ts +0 -341
  639. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  640. package/dist/core/hooks/events/schema.js +0 -12
  641. package/dist/core/hooks/events/ulid.d.ts +0 -10
  642. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  643. package/dist/core/hooks/events/ulid.js +0 -47
  644. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  645. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  646. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  647. package/src/core/agents/cli-emit.ts +0 -64
  648. package/src/core/agents/codex-replay.ts +0 -163
  649. package/src/core/agents/events/consume.ts +0 -254
  650. package/src/core/agents/events/emit.ts +0 -115
  651. package/src/core/agents/events/ulid.ts +0 -51
  652. package/src/core/agents/state/heartbeat-projector.ts +0 -645
  653. package/src/core/hooks/events/emit.ts +0 -125
  654. package/src/core/hooks/events/rotate.ts +0 -151
  655. package/src/core/hooks/events/schema.ts +0 -582
  656. package/src/core/hooks/events/ulid.ts +0 -51
  657. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -45,85 +45,12 @@ export function parseFrontmatter(text: string): ParsedFrontmatter {
45
45
  return { data, body: text.slice(m[0].length), raw: m[1]! };
46
46
  }
47
47
 
48
- /**
49
- * Kind-independent token normalization (spacing / casing / punctuation
50
- * variants). Kind-specific collapses (done -> shipped vs resolved) are applied
51
- * in `normalizeStatus`.
52
- */
53
- const GENERIC_NORMALIZE: Record<string, string> = {
54
- in_progress: "in-progress",
55
- inprogress: "in-progress",
56
- "in progress": "in-progress",
57
- "in-progress": "in-progress",
58
- wip: "in-progress",
59
- "wont-fix": "wontfix",
60
- wontfix: "wontfix",
61
- proposed: "proposed",
62
- abandoned: "abandoned",
63
- open: "open",
64
- resolved: "resolved",
65
- shipped: "shipped",
66
- };
67
-
68
- // "done"-family tokens collapse to different canonical values per kind.
69
- const DONE_FAMILY = new Set(["done", "complete", "completed", "finished"]);
70
- const KIND_NORMALIZE: Record<DocKind, Record<string, string>> = {
71
- plan: {
72
- planning: "proposed",
73
- draft: "proposed",
74
- approved: "proposed",
75
- plan: "proposed",
76
- open: "proposed",
77
- deferred: "proposed",
78
- implemented: "shipped",
79
- resolved: "shipped",
80
- fixed: "shipped",
81
- archived: "shipped",
82
- shelved: "abandoned",
83
- },
84
- issue: {
85
- "in progress": "open",
86
- in_progress: "open",
87
- "in-progress": "open",
88
- blocked: "open",
89
- mitigated: "open",
90
- fixed: "resolved",
91
- shipped: "resolved",
92
- },
93
- handoff: {
94
- "in progress": "open",
95
- in_progress: "open",
96
- "in-progress": "open",
97
- blocked: "open",
98
- fixed: "resolved",
99
- shipped: "resolved",
100
- },
101
- };
102
48
  const ALLOWED_BY_KIND: Record<DocKind, ReadonlySet<string>> = {
103
49
  plan: new Set(["proposed", "in-progress", "shipped", "abandoned"]),
104
50
  issue: new Set(["open", "resolved", "wontfix"]),
105
51
  handoff: new Set(["open", "resolved", "abandoned"]),
106
52
  };
107
- const ALL_CANONICAL = new Set(Object.values(ALLOWED_BY_KIND).flatMap((values) => [...values]));
108
-
109
- /**
110
- * Normalize a raw status token to the canonical enum for its kind.
111
- * Returns null when the token can't be mapped (caller may fail loud).
112
- */
113
- export function normalizeStatus(raw: string, kind?: DocKind): string | null {
114
- const t = raw.trim().toLowerCase();
115
- if (!t) return null;
116
- if (DONE_FAMILY.has(t)) {
117
- // plans ship; issues/handoffs resolve. Default to "shipped" when unknown.
118
- return kind === "issue" || kind === "handoff" ? "resolved" : "shipped";
119
- }
120
- const normalized = (kind ? KIND_NORMALIZE[kind][t] : undefined) ?? GENERIC_NORMALIZE[t];
121
- if (!normalized) return null;
122
- const allowed = kind ? ALLOWED_BY_KIND[kind] : ALL_CANONICAL;
123
- return allowed.has(normalized) ? normalized : null;
124
- }
125
-
126
- /** Read and normalize a doc's YAML lifecycle status, or null when absent/invalid. */
53
+ /** Read a canonical v2 lifecycle status, or null when absent or invalid. */
127
54
  export function readDocStatus(filePath: string, kind?: DocKind): string | null {
128
55
  let content: string;
129
56
  try {
@@ -137,11 +64,13 @@ export function readDocStatus(filePath: string, kind?: DocKind): string | null {
137
64
  /** Same as {@link readDocStatus} but from an in-memory string (testable). */
138
65
  export function readDocStatusFromText(content: string, kind?: DocKind): string | null {
139
66
  const { data } = parseFrontmatter(content);
140
- const yamlStatus = data.status;
141
- if (typeof yamlStatus === "string" && yamlStatus.trim()) {
142
- return normalizeStatus(yamlStatus, kind);
143
- }
144
- return null;
67
+ if (data.schema !== "harnery-doc/v2") return null;
68
+ if (kind && data.type !== kind) return null;
69
+ if (typeof data.status !== "string") return null;
70
+ if (kind) return ALLOWED_BY_KIND[kind].has(data.status) ? data.status : null;
71
+ return Object.values(ALLOWED_BY_KIND).some((allowed) => allowed.has(data.status as string))
72
+ ? data.status
73
+ : null;
145
74
  }
146
75
 
147
76
  /** Whether a doc carries a non-empty status in leading YAML frontmatter. */
@@ -30,6 +30,10 @@ import { readDocStatusFromText } from "./docs-frontmatter.ts";
30
30
  * Idempotent: safe to run on every commit. Reads the first ~30 lines of
31
31
  * each dated file to extract title and (for issues) status.
32
32
  *
33
+ * Targets: the host root, every initialized git submodule, and first-level
34
+ * in-tree packages that keep `docs/audits` or `docs/issues` without being
35
+ * git submodules. Marker rules are unchanged.
36
+ *
33
37
  * Preserves hand-written preambles. The command updates only the section
34
38
  * between `<!-- BEGIN INDEX -->` and `<!-- END INDEX -->` markers. If a
35
39
  * README exists without markers, the command refuses to overwrite it and
@@ -165,12 +169,38 @@ function buildNewReadme(kind: "audits" | "issues", body: string): string {
165
169
  return `${defaultPreamble(kind)}\n${BEGIN_MARKER}\n${body}${END_MARKER}\n`;
166
170
  }
167
171
 
168
- export async function runIndex(opts: IndexOpts): Promise<IndexResult[]> {
169
- const targets: { name: string; path: string }[] = [{ name: "(root)", path: REPO_ROOT }];
172
+ const SKIP_NESTED_DIR_NAMES = new Set(["node_modules", "dist", "target"]);
173
+
174
+ function hasIndexableDocs(path: string): boolean {
175
+ return existsSync(join(path, "docs", "audits")) || existsSync(join(path, "docs", "issues"));
176
+ }
177
+
178
+ /** Root + initialized submodules + first-level in-tree packages with docs indexes. */
179
+ export function collectIndexTargets(): { name: string; path: string }[] {
180
+ const byPath = new Map<string, { name: string; path: string }>();
181
+ const add = (name: string, path: string) => {
182
+ byPath.set(path, { name, path });
183
+ };
184
+ add("(root)", REPO_ROOT);
170
185
  for (const name of SUBMODULES) {
171
186
  if (!isSubmoduleInitialized(name)) continue;
172
- targets.push({ name, path: submodulePath(name) });
187
+ add(name, submodulePath(name));
173
188
  }
189
+ if (!existsSync(REPO_ROOT)) return [...byPath.values()];
190
+ for (const ent of readdirSync(REPO_ROOT, { withFileTypes: true })) {
191
+ if (!ent.isDirectory() && !ent.isSymbolicLink()) continue;
192
+ if (ent.name.startsWith(".")) continue;
193
+ if (SKIP_NESTED_DIR_NAMES.has(ent.name)) continue;
194
+ if (isSubmoduleInitialized(ent.name)) continue;
195
+ const child = join(REPO_ROOT, ent.name);
196
+ if (!hasIndexableDocs(child)) continue;
197
+ add(ent.name, child);
198
+ }
199
+ return [...byPath.values()];
200
+ }
201
+
202
+ export async function runIndex(opts: IndexOpts): Promise<IndexResult[]> {
203
+ const targets = collectIndexTargets();
174
204
 
175
205
  const filter = opts.repo === "." ? "(root)" : opts.repo;
176
206
  const filtered = filter ? targets.filter((t) => t.name === filter) : targets;
@@ -1,6 +1,7 @@
1
1
  import { existsSync as __existsSyncForDocs } from "node:fs";
2
2
  import { resolve as __resolveForDocs } from "node:path";
3
3
  import { hasYamlStatus } from "./docs-frontmatter.ts";
4
+ import { initDocsMetadataAuditContext, runDocsMetadataAudit } from "./docs-metadata-audit.ts";
4
5
  import { sh } from "./exec.ts";
5
6
 
6
7
  // Module-level docs context, initialized by initDocsContext() before any
@@ -22,6 +23,7 @@ export function initDocsContext(opts: {
22
23
  SUBMODULES = opts.submodules;
23
24
  EXTRA_EXCLUDED_PREFIXES = opts.extraExcludedPrefixes ?? [];
24
25
  DOCS_ROOT_ALLOWLIST = opts.docsRootAllowlist ?? [];
26
+ initDocsMetadataAuditContext({ repoRoot: opts.repoRoot, submodules: opts.submodules });
25
27
  }
26
28
 
27
29
  function submodulePath(name: string): string {
@@ -380,34 +382,6 @@ function checkChangelogNames(repoName: string, _repoPath: string, files: string[
380
382
  return violations;
381
383
  }
382
384
 
383
- /** Plans, issues, and handoffs must carry YAML lifecycle status (content check, slow). */
384
- function checkStatusHeaders(repoName: string, repoPath: string, files: string[]): Violation[] {
385
- const violations: Violation[] = [];
386
- const targetDirs = ["docs/plans/", "docs/issues/", "docs/handoffs/"];
387
- for (const rel of files) {
388
- const dirMatch = targetDirs.some((d) => rel.startsWith(d));
389
- if (!dirMatch) continue;
390
- const name = basename(rel);
391
- if (name === "README.md") continue;
392
- const full = join(repoPath, rel);
393
- if (!hasStatusHeader(full)) {
394
- const kind = rel.startsWith("docs/plans/")
395
- ? "plan"
396
- : rel.startsWith("docs/issues/")
397
- ? "issue"
398
- : "handoff";
399
- violations.push({
400
- severity: "error",
401
- repo: repoName,
402
- path: join(repoName === "(root)" ? "" : repoName, rel),
403
- rule: "missing-status-header",
404
- message: `${kind} missing status in leading YAML frontmatter`,
405
- });
406
- }
407
- }
408
- return violations;
409
- }
410
-
411
385
  /** Intentional monoliths >30KB need a declaration banner */
412
386
  function checkMonolithDeclaration(
413
387
  repoName: string,
@@ -462,10 +436,22 @@ export async function runLint(opts: LintOpts): Promise<Violation[]> {
462
436
  violations.push(...checkChangelogNames(name, path, files));
463
437
 
464
438
  if (!opts.fast) {
465
- violations.push(...checkStatusHeaders(name, path, files));
466
439
  violations.push(...checkMonolithDeclaration(name, path, files));
467
440
  }
468
441
  }
469
442
 
443
+ const metadataRows = await runDocsMetadataAudit({ repo: opts.repo });
444
+ for (const row of metadataRows) {
445
+ for (const issue of row.issues.filter((entry) => entry.severity === "error")) {
446
+ violations.push({
447
+ severity: "error",
448
+ repo: row.repo,
449
+ path: row.path,
450
+ rule: `metadata-v2:${issue.code}`,
451
+ message: issue.field ? `${issue.field}: ${issue.message}` : issue.message,
452
+ });
453
+ }
454
+ }
455
+
470
456
  return violations;
471
457
  }
@@ -0,0 +1,166 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join, relative, resolve } from "node:path";
3
+ import { parseFrontmatter } from "./docs-frontmatter.ts";
4
+ import { isManagedDocsMetadataFile, managedDocsMetadataType } from "./docs-metadata-managed.ts";
5
+ import {
6
+ type DocsMetadataProfile,
7
+ type DocsMetadataValidationIssue,
8
+ docsMetadataProfileForType,
9
+ isDocsMetadataV2,
10
+ validateDocsMetadataV2,
11
+ } from "./docs-metadata-v2.ts";
12
+ import { sh } from "./exec.ts";
13
+
14
+ let REPO_ROOT = "";
15
+ let SUBMODULES: readonly string[] = [];
16
+
17
+ export function initDocsMetadataAuditContext(opts: {
18
+ repoRoot: string;
19
+ submodules: readonly string[];
20
+ }): void {
21
+ REPO_ROOT = opts.repoRoot;
22
+ SUBMODULES = opts.submodules;
23
+ }
24
+
25
+ export interface DocsMetadataAuditOpts {
26
+ repo?: string;
27
+ }
28
+
29
+ export type DocsMetadataAuditState = "valid" | "invalid" | "legacy" | "missing";
30
+
31
+ export interface DocsMetadataAuditRow {
32
+ repo: string;
33
+ path: string;
34
+ state: DocsMetadataAuditState;
35
+ profile: DocsMetadataProfile | null;
36
+ issues: DocsMetadataValidationIssue[];
37
+ }
38
+
39
+ function isInitializedRepo(path: string): boolean {
40
+ return existsSync(join(path, ".git"));
41
+ }
42
+
43
+ async function trackedMarkdownFiles(repoPath: string): Promise<string[]> {
44
+ const result = await sh('git ls-files --cached "**/*.md" "*.md"', { cwd: repoPath });
45
+ if (result.exitCode !== 0 || !result.stdout.trim()) return [];
46
+ return result.stdout
47
+ .trim()
48
+ .split("\n")
49
+ .filter((path) => path.endsWith(".md"));
50
+ }
51
+
52
+ function auditFile(repoName: string, repoPath: string, path: string): DocsMetadataAuditRow | null {
53
+ let content: string;
54
+ try {
55
+ content = readFileSync(join(repoPath, path), "utf8");
56
+ } catch {
57
+ return {
58
+ repo: repoName,
59
+ path: join(repoName === "(root)" ? "" : repoName, path),
60
+ state: "missing",
61
+ profile: null,
62
+ issues: [
63
+ {
64
+ severity: "error",
65
+ code: "file_unreadable",
66
+ field: "",
67
+ message: "metadata file could not be read",
68
+ },
69
+ ],
70
+ };
71
+ }
72
+
73
+ const { data, raw } = parseFrontmatter(content);
74
+ const displayPath = join(repoName === "(root)" ? "" : repoName, path);
75
+ if (!isManagedDocsMetadataFile(path, data, raw !== null)) return null;
76
+ const expectedType = managedDocsMetadataType(path, data, raw !== null);
77
+ if (isDocsMetadataV2(data)) {
78
+ const result = validateDocsMetadataV2(data);
79
+ return {
80
+ repo: repoName,
81
+ path: displayPath,
82
+ state: result.valid ? "valid" : "invalid",
83
+ profile: result.profile,
84
+ issues: result.issues,
85
+ };
86
+ }
87
+
88
+ const state: DocsMetadataAuditState = raw === null ? "missing" : "legacy";
89
+ return {
90
+ repo: repoName,
91
+ path: displayPath,
92
+ state,
93
+ profile: expectedType ? docsMetadataProfileForType(expectedType) : null,
94
+ issues: [
95
+ {
96
+ severity: "error",
97
+ code: state === "missing" ? "missing_metadata" : "legacy_schema",
98
+ field: "schema",
99
+ message:
100
+ state === "missing"
101
+ ? "required document has no leading YAML metadata"
102
+ : "document still uses pre-v2 metadata",
103
+ },
104
+ ],
105
+ };
106
+ }
107
+
108
+ export async function runDocsMetadataAudit(
109
+ opts: DocsMetadataAuditOpts,
110
+ ): Promise<DocsMetadataAuditRow[]> {
111
+ const targets = [
112
+ { name: "(root)", path: REPO_ROOT },
113
+ ...SUBMODULES.map((name) => ({ name, path: resolve(REPO_ROOT, name) })).filter((target) =>
114
+ isInitializedRepo(target.path),
115
+ ),
116
+ ];
117
+ const filter = opts.repo === "." ? "(root)" : opts.repo;
118
+ const selected = filter ? targets.filter((target) => target.name === filter) : targets;
119
+ if (filter && selected.length === 0) throw new Error(`Unknown repository: ${opts.repo}`);
120
+
121
+ const rows: DocsMetadataAuditRow[] = [];
122
+ for (const target of selected) {
123
+ const files = await trackedMarkdownFiles(target.path);
124
+ for (const path of files) {
125
+ const row = auditFile(target.name, target.path, path);
126
+ if (row) rows.push(row);
127
+ }
128
+ }
129
+
130
+ return rows.sort((a, b) => a.path.localeCompare(b.path));
131
+ }
132
+
133
+ export function auditDocsMetadataText(content: string, path: string): DocsMetadataAuditRow | null {
134
+ const root = resolve("/");
135
+ const parsed = parseFrontmatter(content);
136
+ if (!isManagedDocsMetadataFile(path, parsed.data, parsed.raw !== null)) return null;
137
+ const expectedType = managedDocsMetadataType(path, parsed.data, parsed.raw !== null);
138
+ if (isDocsMetadataV2(parsed.data)) {
139
+ const result = validateDocsMetadataV2(parsed.data);
140
+ return {
141
+ repo: "(root)",
142
+ path: relative(root, resolve(root, path)),
143
+ state: result.valid ? "valid" : "invalid",
144
+ profile: result.profile,
145
+ issues: result.issues,
146
+ };
147
+ }
148
+ const state = parsed.raw === null ? "missing" : "legacy";
149
+ return {
150
+ repo: "(root)",
151
+ path,
152
+ state,
153
+ profile: expectedType ? docsMetadataProfileForType(expectedType) : null,
154
+ issues: [
155
+ {
156
+ severity: "error",
157
+ code: state === "missing" ? "missing_metadata" : "legacy_schema",
158
+ field: "schema",
159
+ message:
160
+ state === "missing"
161
+ ? "required document has no leading YAML metadata"
162
+ : "document still uses pre-v2 metadata",
163
+ },
164
+ ],
165
+ };
166
+ }
@@ -0,0 +1,83 @@
1
+ import { basename } from "node:path";
2
+ import { type DocsMetadataType, isDocsMetadataType, isDocsMetadataV2 } from "./docs-metadata-v2.ts";
3
+
4
+ function normalized(path: string): string {
5
+ return path.replaceAll("\\", "/");
6
+ }
7
+
8
+ /**
9
+ * Paths whose Markdown carries frontmatter belonging to another system:
10
+ * generated mirrors of documents that live elsewhere, vendored vendor
11
+ * specifications, and the placeholder headers inside document templates.
12
+ */
13
+ export function isExcludedDocsMetadataPath(path: string): boolean {
14
+ const rel = normalized(path);
15
+ const segments = rel.split("/");
16
+ return (
17
+ segments.includes(".wiki-data") ||
18
+ // Dashboard surfaces render from copies of other repositories' documents.
19
+ /(?:^|\/)content\/dashboards\//.test(rel) ||
20
+ /(?:^|\/)docs\/shopify\/admin-api\//.test(rel) ||
21
+ /(?:^|\/)docs\/templates\//.test(rel)
22
+ );
23
+ }
24
+
25
+ function lifecycleType(path: string): DocsMetadataType | null {
26
+ const rel = normalized(path);
27
+ if (basename(rel).toLowerCase() === "readme.md") return null;
28
+ // A repository may sit at any depth inside the host checkout, so the
29
+ // directory rules anchor on `docs/<kind>/` rather than a single optional
30
+ // path segment. A one-segment-only prefix hid every document in a
31
+ // repository nested two or more levels down.
32
+ if (/(?:^|\/)docs\/plans\//.test(rel)) return "plan";
33
+ if (/(?:^|\/)docs\/issues\//.test(rel)) return "issue";
34
+ if (/(?:^|\/)docs\/coordination\/issues\//.test(rel)) return "issue";
35
+ if (/(?:^|\/)docs\/handoffs\//.test(rel)) return "handoff";
36
+ if (/(?:^|\/)docs\/audits\//.test(rel)) return "audit";
37
+ if (/^harnery-dev\/plans\//.test(rel)) return "plan";
38
+ if (/^harnery-dev\/issues\//.test(rel)) return "issue";
39
+ return null;
40
+ }
41
+
42
+ /**
43
+ * Return the v2 type expected for a Markdown file that participates in the
44
+ * managed metadata contract. Unmanaged Markdown and unrelated YAML-frontmatter
45
+ * systems return null.
46
+ */
47
+ export function managedDocsMetadataType(
48
+ path: string,
49
+ data: Record<string, unknown>,
50
+ hasFrontmatter: boolean,
51
+ ): DocsMetadataType | null {
52
+ const rel = normalized(path);
53
+ if (isExcludedDocsMetadataPath(rel)) return null;
54
+ if (isDocsMetadataType(data.type)) return data.type;
55
+
56
+ const lifecycle = lifecycleType(rel);
57
+ if (lifecycle) return lifecycle;
58
+
59
+ const name = basename(rel).toLowerCase();
60
+ if (/(?:^|\/)docs\/runbook\.md$/.test(rel) || (hasFrontmatter && /^.+-runbook\.md$/.test(name))) {
61
+ return "runbook";
62
+ }
63
+
64
+ return null;
65
+ }
66
+
67
+ /**
68
+ * Whether a Markdown file has to satisfy the v2 contract.
69
+ *
70
+ * A file that claims the v2 schema marker is always checked, even when its
71
+ * `type` is missing or misspelled. Deciding membership from the type alone
72
+ * let a typo drop the document out of the audit entirely, so an invalid
73
+ * header reported as nothing rather than as an error.
74
+ */
75
+ export function isManagedDocsMetadataFile(
76
+ path: string,
77
+ data: Record<string, unknown>,
78
+ hasFrontmatter: boolean,
79
+ ): boolean {
80
+ if (isExcludedDocsMetadataPath(path)) return false;
81
+ if (isDocsMetadataV2(data)) return true;
82
+ return managedDocsMetadataType(path, data, hasFrontmatter) !== null;
83
+ }