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
@@ -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.js";
4
+ import { initDocsMetadataAuditContext, runDocsMetadataAudit } from "./docs-metadata-audit.js";
4
5
  import { sh } from "./exec.js";
5
6
  // Module-level docs context, initialized by initDocsContext() before any
6
7
  // other function in this file is called. Consumers pass repo metadata
@@ -15,6 +16,7 @@ export function initDocsContext(opts) {
15
16
  SUBMODULES = opts.submodules;
16
17
  EXTRA_EXCLUDED_PREFIXES = opts.extraExcludedPrefixes ?? [];
17
18
  DOCS_ROOT_ALLOWLIST = opts.docsRootAllowlist ?? [];
19
+ initDocsMetadataAuditContext({ repoRoot: opts.repoRoot, submodules: opts.submodules });
18
20
  }
19
21
  function submodulePath(name) {
20
22
  return __resolveForDocs(REPO_ROOT, name);
@@ -351,35 +353,6 @@ function checkChangelogNames(repoName, _repoPath, files) {
351
353
  }
352
354
  return violations;
353
355
  }
354
- /** Plans, issues, and handoffs must carry YAML lifecycle status (content check, slow). */
355
- function checkStatusHeaders(repoName, repoPath, files) {
356
- const violations = [];
357
- const targetDirs = ["docs/plans/", "docs/issues/", "docs/handoffs/"];
358
- for (const rel of files) {
359
- const dirMatch = targetDirs.some((d) => rel.startsWith(d));
360
- if (!dirMatch)
361
- continue;
362
- const name = basename(rel);
363
- if (name === "README.md")
364
- continue;
365
- const full = join(repoPath, rel);
366
- if (!hasStatusHeader(full)) {
367
- const kind = rel.startsWith("docs/plans/")
368
- ? "plan"
369
- : rel.startsWith("docs/issues/")
370
- ? "issue"
371
- : "handoff";
372
- violations.push({
373
- severity: "error",
374
- repo: repoName,
375
- path: join(repoName === "(root)" ? "" : repoName, rel),
376
- rule: "missing-status-header",
377
- message: `${kind} missing status in leading YAML frontmatter`,
378
- });
379
- }
380
- }
381
- return violations;
382
- }
383
356
  /** Intentional monoliths >30KB need a declaration banner */
384
357
  function checkMonolithDeclaration(repoName, repoPath, files) {
385
358
  const violations = [];
@@ -434,9 +407,20 @@ export async function runLint(opts) {
434
407
  violations.push(...checkDatedDirs(name, path, files));
435
408
  violations.push(...checkChangelogNames(name, path, files));
436
409
  if (!opts.fast) {
437
- violations.push(...checkStatusHeaders(name, path, files));
438
410
  violations.push(...checkMonolithDeclaration(name, path, files));
439
411
  }
440
412
  }
413
+ const metadataRows = await runDocsMetadataAudit({ repo: opts.repo });
414
+ for (const row of metadataRows) {
415
+ for (const issue of row.issues.filter((entry) => entry.severity === "error")) {
416
+ violations.push({
417
+ severity: "error",
418
+ repo: row.repo,
419
+ path: row.path,
420
+ rule: `metadata-v2:${issue.code}`,
421
+ message: issue.field ? `${issue.field}: ${issue.message}` : issue.message,
422
+ });
423
+ }
424
+ }
441
425
  return violations;
442
426
  }
@@ -0,0 +1,19 @@
1
+ import { type DocsMetadataProfile, type DocsMetadataValidationIssue } from "./docs-metadata-v2.js";
2
+ export declare function initDocsMetadataAuditContext(opts: {
3
+ repoRoot: string;
4
+ submodules: readonly string[];
5
+ }): void;
6
+ export interface DocsMetadataAuditOpts {
7
+ repo?: string;
8
+ }
9
+ export type DocsMetadataAuditState = "valid" | "invalid" | "legacy" | "missing";
10
+ export interface DocsMetadataAuditRow {
11
+ repo: string;
12
+ path: string;
13
+ state: DocsMetadataAuditState;
14
+ profile: DocsMetadataProfile | null;
15
+ issues: DocsMetadataValidationIssue[];
16
+ }
17
+ export declare function runDocsMetadataAudit(opts: DocsMetadataAuditOpts): Promise<DocsMetadataAuditRow[]>;
18
+ export declare function auditDocsMetadataText(content: string, path: string): DocsMetadataAuditRow | null;
19
+ //# sourceMappingURL=docs-metadata-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-metadata-audit.d.ts","sourceRoot":"","sources":["../../src/lib/docs-metadata-audit.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAIjC,MAAM,uBAAuB,CAAC;AAM/B,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,GAAG,IAAI,CAGP;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEhF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,2BAA2B,EAAE,CAAC;CACvC;AAuED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAqBjC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAiChG"}
@@ -0,0 +1,132 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join, relative, resolve } from "node:path";
3
+ import { parseFrontmatter } from "./docs-frontmatter.js";
4
+ import { isManagedDocsMetadataFile, managedDocsMetadataType } from "./docs-metadata-managed.js";
5
+ import { docsMetadataProfileForType, isDocsMetadataV2, validateDocsMetadataV2, } from "./docs-metadata-v2.js";
6
+ import { sh } from "./exec.js";
7
+ let REPO_ROOT = "";
8
+ let SUBMODULES = [];
9
+ export function initDocsMetadataAuditContext(opts) {
10
+ REPO_ROOT = opts.repoRoot;
11
+ SUBMODULES = opts.submodules;
12
+ }
13
+ function isInitializedRepo(path) {
14
+ return existsSync(join(path, ".git"));
15
+ }
16
+ async function trackedMarkdownFiles(repoPath) {
17
+ const result = await sh('git ls-files --cached "**/*.md" "*.md"', { cwd: repoPath });
18
+ if (result.exitCode !== 0 || !result.stdout.trim())
19
+ return [];
20
+ return result.stdout
21
+ .trim()
22
+ .split("\n")
23
+ .filter((path) => path.endsWith(".md"));
24
+ }
25
+ function auditFile(repoName, repoPath, path) {
26
+ let content;
27
+ try {
28
+ content = readFileSync(join(repoPath, path), "utf8");
29
+ }
30
+ catch {
31
+ return {
32
+ repo: repoName,
33
+ path: join(repoName === "(root)" ? "" : repoName, path),
34
+ state: "missing",
35
+ profile: null,
36
+ issues: [
37
+ {
38
+ severity: "error",
39
+ code: "file_unreadable",
40
+ field: "",
41
+ message: "metadata file could not be read",
42
+ },
43
+ ],
44
+ };
45
+ }
46
+ const { data, raw } = parseFrontmatter(content);
47
+ const displayPath = join(repoName === "(root)" ? "" : repoName, path);
48
+ if (!isManagedDocsMetadataFile(path, data, raw !== null))
49
+ return null;
50
+ const expectedType = managedDocsMetadataType(path, data, raw !== null);
51
+ if (isDocsMetadataV2(data)) {
52
+ const result = validateDocsMetadataV2(data);
53
+ return {
54
+ repo: repoName,
55
+ path: displayPath,
56
+ state: result.valid ? "valid" : "invalid",
57
+ profile: result.profile,
58
+ issues: result.issues,
59
+ };
60
+ }
61
+ const state = raw === null ? "missing" : "legacy";
62
+ return {
63
+ repo: repoName,
64
+ path: displayPath,
65
+ state,
66
+ profile: expectedType ? docsMetadataProfileForType(expectedType) : null,
67
+ issues: [
68
+ {
69
+ severity: "error",
70
+ code: state === "missing" ? "missing_metadata" : "legacy_schema",
71
+ field: "schema",
72
+ message: state === "missing"
73
+ ? "required document has no leading YAML metadata"
74
+ : "document still uses pre-v2 metadata",
75
+ },
76
+ ],
77
+ };
78
+ }
79
+ export async function runDocsMetadataAudit(opts) {
80
+ const targets = [
81
+ { name: "(root)", path: REPO_ROOT },
82
+ ...SUBMODULES.map((name) => ({ name, path: resolve(REPO_ROOT, name) })).filter((target) => isInitializedRepo(target.path)),
83
+ ];
84
+ const filter = opts.repo === "." ? "(root)" : opts.repo;
85
+ const selected = filter ? targets.filter((target) => target.name === filter) : targets;
86
+ if (filter && selected.length === 0)
87
+ throw new Error(`Unknown repository: ${opts.repo}`);
88
+ const rows = [];
89
+ for (const target of selected) {
90
+ const files = await trackedMarkdownFiles(target.path);
91
+ for (const path of files) {
92
+ const row = auditFile(target.name, target.path, path);
93
+ if (row)
94
+ rows.push(row);
95
+ }
96
+ }
97
+ return rows.sort((a, b) => a.path.localeCompare(b.path));
98
+ }
99
+ export function auditDocsMetadataText(content, path) {
100
+ const root = resolve("/");
101
+ const parsed = parseFrontmatter(content);
102
+ if (!isManagedDocsMetadataFile(path, parsed.data, parsed.raw !== null))
103
+ return null;
104
+ const expectedType = managedDocsMetadataType(path, parsed.data, parsed.raw !== null);
105
+ if (isDocsMetadataV2(parsed.data)) {
106
+ const result = validateDocsMetadataV2(parsed.data);
107
+ return {
108
+ repo: "(root)",
109
+ path: relative(root, resolve(root, path)),
110
+ state: result.valid ? "valid" : "invalid",
111
+ profile: result.profile,
112
+ issues: result.issues,
113
+ };
114
+ }
115
+ const state = parsed.raw === null ? "missing" : "legacy";
116
+ return {
117
+ repo: "(root)",
118
+ path,
119
+ state,
120
+ profile: expectedType ? docsMetadataProfileForType(expectedType) : null,
121
+ issues: [
122
+ {
123
+ severity: "error",
124
+ code: state === "missing" ? "missing_metadata" : "legacy_schema",
125
+ field: "schema",
126
+ message: state === "missing"
127
+ ? "required document has no leading YAML metadata"
128
+ : "document still uses pre-v2 metadata",
129
+ },
130
+ ],
131
+ };
132
+ }
@@ -0,0 +1,23 @@
1
+ import { type DocsMetadataType } from "./docs-metadata-v2.js";
2
+ /**
3
+ * Paths whose Markdown carries frontmatter belonging to another system:
4
+ * generated mirrors of documents that live elsewhere, vendored vendor
5
+ * specifications, and the placeholder headers inside document templates.
6
+ */
7
+ export declare function isExcludedDocsMetadataPath(path: string): boolean;
8
+ /**
9
+ * Return the v2 type expected for a Markdown file that participates in the
10
+ * managed metadata contract. Unmanaged Markdown and unrelated YAML-frontmatter
11
+ * systems return null.
12
+ */
13
+ export declare function managedDocsMetadataType(path: string, data: Record<string, unknown>, hasFrontmatter: boolean): DocsMetadataType | null;
14
+ /**
15
+ * Whether a Markdown file has to satisfy the v2 contract.
16
+ *
17
+ * A file that claims the v2 schema marker is always checked, even when its
18
+ * `type` is missing or misspelled. Deciding membership from the type alone
19
+ * let a typo drop the document out of the audit entirely, so an invalid
20
+ * header reported as nothing rather than as an error.
21
+ */
22
+ export declare function isManagedDocsMetadataFile(path: string, data: Record<string, unknown>, hasFrontmatter: boolean): boolean;
23
+ //# sourceMappingURL=docs-metadata-managed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-metadata-managed.d.ts","sourceRoot":"","sources":["../../src/lib/docs-metadata-managed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gBAAgB,EAAwC,MAAM,uBAAuB,CAAC;AAMpG;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUhE;AAmBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,cAAc,EAAE,OAAO,GACtB,gBAAgB,GAAG,IAAI,CAczB;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,cAAc,EAAE,OAAO,GACtB,OAAO,CAIT"}
@@ -0,0 +1,78 @@
1
+ import { basename } from "node:path";
2
+ import { isDocsMetadataType, isDocsMetadataV2 } from "./docs-metadata-v2.js";
3
+ function normalized(path) {
4
+ return path.replaceAll("\\", "/");
5
+ }
6
+ /**
7
+ * Paths whose Markdown carries frontmatter belonging to another system:
8
+ * generated mirrors of documents that live elsewhere, vendored vendor
9
+ * specifications, and the placeholder headers inside document templates.
10
+ */
11
+ export function isExcludedDocsMetadataPath(path) {
12
+ const rel = normalized(path);
13
+ const segments = rel.split("/");
14
+ return (segments.includes(".wiki-data") ||
15
+ // Dashboard surfaces render from copies of other repositories' documents.
16
+ /(?:^|\/)content\/dashboards\//.test(rel) ||
17
+ /(?:^|\/)docs\/shopify\/admin-api\//.test(rel) ||
18
+ /(?:^|\/)docs\/templates\//.test(rel));
19
+ }
20
+ function lifecycleType(path) {
21
+ const rel = normalized(path);
22
+ if (basename(rel).toLowerCase() === "readme.md")
23
+ return null;
24
+ // A repository may sit at any depth inside the host checkout, so the
25
+ // directory rules anchor on `docs/<kind>/` rather than a single optional
26
+ // path segment. A one-segment-only prefix hid every document in a
27
+ // repository nested two or more levels down.
28
+ if (/(?:^|\/)docs\/plans\//.test(rel))
29
+ return "plan";
30
+ if (/(?:^|\/)docs\/issues\//.test(rel))
31
+ return "issue";
32
+ if (/(?:^|\/)docs\/coordination\/issues\//.test(rel))
33
+ return "issue";
34
+ if (/(?:^|\/)docs\/handoffs\//.test(rel))
35
+ return "handoff";
36
+ if (/(?:^|\/)docs\/audits\//.test(rel))
37
+ return "audit";
38
+ if (/^harnery-dev\/plans\//.test(rel))
39
+ return "plan";
40
+ if (/^harnery-dev\/issues\//.test(rel))
41
+ return "issue";
42
+ return null;
43
+ }
44
+ /**
45
+ * Return the v2 type expected for a Markdown file that participates in the
46
+ * managed metadata contract. Unmanaged Markdown and unrelated YAML-frontmatter
47
+ * systems return null.
48
+ */
49
+ export function managedDocsMetadataType(path, data, hasFrontmatter) {
50
+ const rel = normalized(path);
51
+ if (isExcludedDocsMetadataPath(rel))
52
+ return null;
53
+ if (isDocsMetadataType(data.type))
54
+ return data.type;
55
+ const lifecycle = lifecycleType(rel);
56
+ if (lifecycle)
57
+ return lifecycle;
58
+ const name = basename(rel).toLowerCase();
59
+ if (/(?:^|\/)docs\/runbook\.md$/.test(rel) || (hasFrontmatter && /^.+-runbook\.md$/.test(name))) {
60
+ return "runbook";
61
+ }
62
+ return null;
63
+ }
64
+ /**
65
+ * Whether a Markdown file has to satisfy the v2 contract.
66
+ *
67
+ * A file that claims the v2 schema marker is always checked, even when its
68
+ * `type` is missing or misspelled. Deciding membership from the type alone
69
+ * let a typo drop the document out of the audit entirely, so an invalid
70
+ * header reported as nothing rather than as an error.
71
+ */
72
+ export function isManagedDocsMetadataFile(path, data, hasFrontmatter) {
73
+ if (isExcludedDocsMetadataPath(path))
74
+ return false;
75
+ if (isDocsMetadataV2(data))
76
+ return true;
77
+ return managedDocsMetadataType(path, data, hasFrontmatter) !== null;
78
+ }
@@ -0,0 +1,20 @@
1
+ export declare function initDocsMetadataSyncContext(opts: {
2
+ repoRoot: string;
3
+ submodules: readonly string[];
4
+ }): void;
5
+ export interface DocsMetadataSyncOpts {
6
+ repo?: string;
7
+ files?: string[];
8
+ check?: boolean;
9
+ reviewed?: boolean;
10
+ now?: string;
11
+ }
12
+ export interface DocsMetadataSyncRow {
13
+ repo: string;
14
+ path: string;
15
+ status: "unchanged" | "updated" | "drift" | "invalid";
16
+ fields: string[];
17
+ message?: string;
18
+ }
19
+ export declare function runDocsMetadataSync(opts: DocsMetadataSyncOpts): Promise<DocsMetadataSyncRow[]>;
20
+ //# sourceMappingURL=docs-metadata-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-metadata-sync.d.ts","sourceRoot":"","sources":["../../src/lib/docs-metadata-sync.ts"],"names":[],"mappings":"AAWA,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,GAAG,IAAI,CAGP;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACtD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAyED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAyJhC"}
@@ -0,0 +1,222 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { dump as dumpYaml, JSON_SCHEMA } from "js-yaml";
4
+ import { parseFrontmatter } from "./docs-frontmatter.js";
5
+ import { managedDocsMetadataType } from "./docs-metadata-managed.js";
6
+ import { isDocsMetadataV2, validateDocsMetadataV2 } from "./docs-metadata-v2.js";
7
+ import { sh } from "./exec.js";
8
+ let REPO_ROOT = "";
9
+ let SUBMODULES = [];
10
+ export function initDocsMetadataSyncContext(opts) {
11
+ REPO_ROOT = opts.repoRoot;
12
+ SUBMODULES = opts.submodules;
13
+ }
14
+ function targets(repo) {
15
+ const all = [
16
+ { name: "(root)", path: REPO_ROOT },
17
+ ...SUBMODULES.filter((name) => existsSync(join(REPO_ROOT, name, ".git"))).map((name) => ({
18
+ name,
19
+ path: resolve(REPO_ROOT, name),
20
+ })),
21
+ ];
22
+ const filter = repo === "." ? "(root)" : repo;
23
+ const selected = filter ? all.filter((target) => target.name === filter) : all;
24
+ if (filter && selected.length === 0)
25
+ throw new Error(`Unknown repository: ${repo}`);
26
+ return selected;
27
+ }
28
+ async function changedFiles(target, explicit) {
29
+ if (explicit.length > 0)
30
+ return explicit;
31
+ const result = await sh("git diff --cached --name-only --diff-filter=ACMR -- '*.md'", {
32
+ cwd: target.path,
33
+ });
34
+ if (result.exitCode !== 0)
35
+ throw new Error(result.stderr || "git diff failed");
36
+ return result.stdout.split("\n").filter(Boolean);
37
+ }
38
+ async function headContent(target, path) {
39
+ const result = await sh(`git show HEAD:${JSON.stringify(path)}`, { cwd: target.path });
40
+ return result.exitCode === 0 ? result.stdout : null;
41
+ }
42
+ function semanticMetadata(data) {
43
+ const copy = { ...data };
44
+ delete copy.created_at;
45
+ delete copy.updated_at;
46
+ delete copy.status_changed_at;
47
+ delete copy.reviewed_at;
48
+ delete copy.review_due_at;
49
+ delete copy.source_updated_at;
50
+ delete copy.resolved_at;
51
+ return copy;
52
+ }
53
+ function semanticChanged(before, after) {
54
+ if (!before || !isDocsMetadataV2(before.data))
55
+ return false;
56
+ return (JSON.stringify(semanticMetadata(before.data)) !==
57
+ JSON.stringify(semanticMetadata(after.data)) ||
58
+ before.body.replaceAll("\r\n", "\n").trimEnd() !== after.body.replaceAll("\r\n", "\n").trimEnd());
59
+ }
60
+ function serialize(data, body) {
61
+ const yaml = dumpYaml(data, {
62
+ schema: JSON_SCHEMA,
63
+ noRefs: true,
64
+ lineWidth: -1,
65
+ sortKeys: false,
66
+ quotingType: '"',
67
+ }).trimEnd();
68
+ return `---\n${yaml}\n---\n${body.replace(/^\n+/, "\n")}`;
69
+ }
70
+ function addDays(value, days) {
71
+ const date = new Date(value);
72
+ date.setUTCDate(date.getUTCDate() + days);
73
+ return date.toISOString().replace(".000Z", "Z");
74
+ }
75
+ export async function runDocsMetadataSync(opts) {
76
+ const now = opts.now ?? new Date().toISOString().replace(/\.\d{3}Z$/, "Z");
77
+ const rows = [];
78
+ for (const target of targets(opts.repo)) {
79
+ for (const path of await changedFiles(target, opts.files ?? [])) {
80
+ const full = join(target.path, path);
81
+ if (!existsSync(full))
82
+ continue;
83
+ const currentText = readFileSync(full, "utf8");
84
+ const current = parseFrontmatter(currentText);
85
+ if (!managedDocsMetadataType(path, current.data, current.raw !== null))
86
+ continue;
87
+ if (!isDocsMetadataV2(current.data)) {
88
+ rows.push({
89
+ repo: target.name,
90
+ path,
91
+ status: "invalid",
92
+ fields: [],
93
+ message: "managed document must use harnery-doc/v2",
94
+ });
95
+ continue;
96
+ }
97
+ const beforeText = await headContent(target, path);
98
+ const before = beforeText === null ? null : parseFrontmatter(beforeText);
99
+ const contentChanged = semanticChanged(before, current);
100
+ const beforeV2 = before !== null && isDocsMetadataV2(before.data) ? before.data : null;
101
+ const statusChanged = beforeV2 !== null && beforeV2.status !== current.data.status;
102
+ const fields = [];
103
+ const expected = { ...current.data };
104
+ if (contentChanged) {
105
+ expected.updated_at = now;
106
+ fields.push("updated_at");
107
+ }
108
+ if (statusChanged) {
109
+ expected.status_changed_at = now;
110
+ fields.push("status_changed_at");
111
+ if (current.data.status === "resolved" && current.data.type === "issue") {
112
+ expected.resolved_at = now;
113
+ fields.push("resolved_at");
114
+ }
115
+ }
116
+ if (!statusChanged &&
117
+ beforeV2 &&
118
+ current.data.status_changed_at !== beforeV2.status_changed_at) {
119
+ expected.status_changed_at = beforeV2.status_changed_at;
120
+ fields.push("status_changed_at");
121
+ }
122
+ if (opts.reviewed) {
123
+ if (current.data.type !== "runbook") {
124
+ rows.push({
125
+ repo: target.name,
126
+ path,
127
+ status: "invalid",
128
+ fields: [],
129
+ message: "--reviewed applies only to runbooks",
130
+ });
131
+ continue;
132
+ }
133
+ expected.reviewed_at = now;
134
+ expected.review_due_at = addDays(now, 180);
135
+ expected.updated_at = now;
136
+ fields.push("reviewed_at", "review_due_at", "updated_at");
137
+ }
138
+ if (beforeV2 && expected.created_at !== beforeV2.created_at) {
139
+ rows.push({
140
+ repo: target.name,
141
+ path,
142
+ status: "invalid",
143
+ fields: ["created_at"],
144
+ message: "created_at is immutable",
145
+ });
146
+ continue;
147
+ }
148
+ if (opts.check) {
149
+ const validation = validateDocsMetadataV2(current.data);
150
+ if (!validation.valid) {
151
+ rows.push({
152
+ repo: target.name,
153
+ path,
154
+ status: "invalid",
155
+ fields,
156
+ message: validation.issues
157
+ .map((issue) => `${issue.field}: ${issue.message}`)
158
+ .join("; "),
159
+ });
160
+ continue;
161
+ }
162
+ const drift = [];
163
+ if (beforeV2 && contentChanged && current.data.updated_at === beforeV2.updated_at) {
164
+ drift.push("updated_at");
165
+ }
166
+ if (beforeV2 && statusChanged) {
167
+ if (current.data.status_changed_at === beforeV2.status_changed_at) {
168
+ drift.push("status_changed_at");
169
+ }
170
+ if (current.data.status_changed_at !== current.data.updated_at) {
171
+ drift.push("status_changed_at");
172
+ }
173
+ if (current.data.type === "issue" &&
174
+ current.data.status === "resolved" &&
175
+ current.data.resolved_at !== current.data.status_changed_at) {
176
+ drift.push("resolved_at");
177
+ }
178
+ }
179
+ if (beforeV2 &&
180
+ !statusChanged &&
181
+ current.data.status_changed_at !== beforeV2.status_changed_at) {
182
+ drift.push("status_changed_at");
183
+ }
184
+ if (opts.reviewed &&
185
+ beforeV2 &&
186
+ (current.data.reviewed_at === beforeV2.reviewed_at ||
187
+ current.data.review_due_at !== addDays(String(current.data.reviewed_at), 180))) {
188
+ drift.push("reviewed_at", "review_due_at");
189
+ }
190
+ const uniqueDrift = [...new Set(drift)];
191
+ rows.push({
192
+ repo: target.name,
193
+ path,
194
+ status: uniqueDrift.length ? "drift" : "unchanged",
195
+ fields: uniqueDrift,
196
+ ...(uniqueDrift.length
197
+ ? { message: `run docs metadata sync for ${uniqueDrift.join(", ")}` }
198
+ : {}),
199
+ });
200
+ continue;
201
+ }
202
+ const validation = validateDocsMetadataV2(expected);
203
+ if (!validation.valid) {
204
+ rows.push({
205
+ repo: target.name,
206
+ path,
207
+ status: "invalid",
208
+ fields,
209
+ message: validation.issues.map((issue) => `${issue.field}: ${issue.message}`).join("; "),
210
+ });
211
+ continue;
212
+ }
213
+ if (fields.length === 0) {
214
+ rows.push({ repo: target.name, path, status: "unchanged", fields: [] });
215
+ continue;
216
+ }
217
+ writeFileSync(full, serialize(expected, current.body), "utf8");
218
+ rows.push({ repo: target.name, path, status: "updated", fields: [...new Set(fields)] });
219
+ }
220
+ }
221
+ return rows;
222
+ }