harnery 0.32.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 (665) hide show
  1. package/README.md +2 -0
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +7 -1
  4. package/dist/commands/adapter.js +2 -2
  5. package/dist/commands/agents.d.ts +144 -1
  6. package/dist/commands/agents.d.ts.map +1 -1
  7. package/dist/commands/agents.js +1408 -565
  8. package/dist/commands/artifacts.d.ts.map +1 -1
  9. package/dist/commands/artifacts.js +7 -6
  10. package/dist/commands/backup.d.ts +1 -1
  11. package/dist/commands/backup.d.ts.map +1 -1
  12. package/dist/commands/backup.js +29 -16
  13. package/dist/commands/browse.d.ts.map +1 -1
  14. package/dist/commands/browse.js +234 -12
  15. package/dist/commands/checkpoint.d.ts.map +1 -1
  16. package/dist/commands/checkpoint.js +3 -2
  17. package/dist/commands/claude-desktop.d.ts +2 -2
  18. package/dist/commands/claude-desktop.d.ts.map +1 -1
  19. package/dist/commands/claude-desktop.js +2 -2
  20. package/dist/commands/context.js +1 -6
  21. package/dist/commands/decision.d.ts.map +1 -1
  22. package/dist/commands/decision.js +22 -38
  23. package/dist/commands/docs.d.ts.map +1 -1
  24. package/dist/commands/docs.js +91 -28
  25. package/dist/commands/doctor.d.ts +4 -2
  26. package/dist/commands/doctor.d.ts.map +1 -1
  27. package/dist/commands/doctor.js +55 -7
  28. package/dist/commands/events.d.ts +5 -0
  29. package/dist/commands/events.d.ts.map +1 -0
  30. package/dist/commands/events.js +189 -0
  31. package/dist/commands/governor.d.ts.map +1 -1
  32. package/dist/commands/governor.js +13 -4
  33. package/dist/commands/init.d.ts +10 -2
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +233 -51
  36. package/dist/commands/instructions.d.ts +4 -0
  37. package/dist/commands/instructions.d.ts.map +1 -0
  38. package/dist/commands/instructions.js +100 -0
  39. package/dist/commands/journal.d.ts.map +1 -1
  40. package/dist/commands/journal.js +4 -13
  41. package/dist/commands/ledger-v3.d.ts +5 -0
  42. package/dist/commands/ledger-v3.d.ts.map +1 -0
  43. package/dist/commands/ledger-v3.js +91 -0
  44. package/dist/commands/presence.d.ts.map +1 -1
  45. package/dist/commands/presence.js +15 -6
  46. package/dist/commands/sync.d.ts +1 -1
  47. package/dist/commands/sync.js +1 -1
  48. package/dist/commands/web.d.ts +6 -0
  49. package/dist/commands/web.d.ts.map +1 -1
  50. package/dist/commands/web.js +67 -7
  51. package/dist/commands/work.d.ts.map +1 -1
  52. package/dist/commands/work.js +22 -5
  53. package/dist/core/adapter.d.ts +5 -0
  54. package/dist/core/adapter.d.ts.map +1 -0
  55. package/dist/core/adapter.js +1 -0
  56. package/dist/core/adapters/attest.d.ts +5 -2
  57. package/dist/core/adapters/attest.d.ts.map +1 -1
  58. package/dist/core/adapters/attest.js +8 -3
  59. package/dist/core/adapters/profiles.d.ts +6 -6
  60. package/dist/core/adapters/profiles.d.ts.map +1 -1
  61. package/dist/core/adapters/profiles.js +4 -4
  62. package/dist/core/agents/canonical-emit.d.ts +17 -15
  63. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  64. package/dist/core/agents/canonical-emit.js +27 -25
  65. package/dist/core/agents/cli.js +212 -235
  66. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  67. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  68. package/dist/core/agents/codex-archive-v3.js +110 -0
  69. package/dist/core/agents/coord-client.d.ts +19 -70
  70. package/dist/core/agents/coord-client.d.ts.map +1 -1
  71. package/dist/core/agents/coord-client.js +65 -155
  72. package/dist/core/agents/finalization.d.ts +4 -1
  73. package/dist/core/agents/finalization.d.ts.map +1 -1
  74. package/dist/core/agents/finalization.js +89 -32
  75. package/dist/core/agents/index.d.ts +5 -5
  76. package/dist/core/agents/index.d.ts.map +1 -1
  77. package/dist/core/agents/index.js +5 -5
  78. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  79. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-authority-v3.js +233 -0
  81. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  82. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  83. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  84. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  85. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  86. package/dist/core/agents/live-observation-v3.js +157 -0
  87. package/dist/core/agents/render/prompt-context.d.ts +10 -4
  88. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  89. package/dist/core/agents/render/prompt-context.js +61 -55
  90. package/dist/core/agents/render/session-context.d.ts +1 -1
  91. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  92. package/dist/core/agents/render/session-context.js +15 -33
  93. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  94. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  95. package/dist/core/agents/rules/claim-conflict.js +79 -127
  96. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  97. package/dist/core/agents/rules/commit-conflict.js +3 -18
  98. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  99. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  100. package/dist/core/agents/rules/stop-hook.js +193 -236
  101. package/dist/core/agents/session-events.d.ts +5 -7
  102. package/dist/core/agents/session-events.d.ts.map +1 -1
  103. package/dist/core/agents/session-events.js +127 -95
  104. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  105. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  106. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  107. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  108. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  109. package/dist/core/agents/session-finalizer-v3.js +734 -0
  110. package/dist/core/agents/session-name-display.d.ts +40 -0
  111. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  112. package/dist/core/agents/session-name-display.js +119 -0
  113. package/dist/core/agents/state/activity-log.d.ts +3 -3
  114. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  115. package/dist/core/agents/state/activity-log.js +7 -16
  116. package/dist/core/agents/state/heartbeat-writer.d.ts +29 -46
  117. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  118. package/dist/core/agents/state/heartbeat-writer.js +59 -199
  119. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  120. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  121. package/dist/core/agents/state/live-coordination-view.js +209 -0
  122. package/dist/core/agents/state/session-state.d.ts +45 -0
  123. package/dist/core/agents/state/session-state.d.ts.map +1 -0
  124. package/dist/core/agents/state/session-state.js +90 -0
  125. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  126. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  127. package/dist/core/agents/state/stale-sweep.js +26 -15
  128. package/dist/core/artifacts/index.d.ts.map +1 -1
  129. package/dist/core/artifacts/index.js +5 -7
  130. package/dist/core/config.d.ts +33 -2
  131. package/dist/core/config.d.ts.map +1 -1
  132. package/dist/core/config.js +98 -2
  133. package/dist/core/context/index.d.ts +1 -4
  134. package/dist/core/context/index.d.ts.map +1 -1
  135. package/dist/core/context/index.js +9 -9
  136. package/dist/core/events/span-parent.d.ts +15 -0
  137. package/dist/core/events/span-parent.d.ts.map +1 -0
  138. package/dist/core/events/span-parent.js +34 -0
  139. package/dist/core/events/v3/advance.d.ts +14 -0
  140. package/dist/core/events/v3/advance.d.ts.map +1 -0
  141. package/dist/core/events/v3/advance.js +134 -0
  142. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  143. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  144. package/dist/core/events/v3/authority-outbox.js +399 -0
  145. package/dist/core/events/v3/base-builder.d.ts +20 -0
  146. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  147. package/dist/core/events/v3/base-builder.js +29 -0
  148. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  149. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  150. package/dist/core/events/v3/base-contract.js +647 -0
  151. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  152. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  153. package/dist/core/events/v3/bootstrap.js +175 -0
  154. package/dist/core/events/v3/builder.d.ts +20 -0
  155. package/dist/core/events/v3/builder.d.ts.map +1 -0
  156. package/dist/core/events/v3/builder.js +28 -0
  157. package/dist/core/events/v3/canonical.d.ts +31 -0
  158. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  159. package/dist/core/events/v3/canonical.js +100 -0
  160. package/dist/core/events/v3/capabilities.d.ts +31 -0
  161. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  162. package/dist/core/events/v3/capabilities.js +107 -0
  163. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  164. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  165. package/dist/core/events/v3/capability-drift.js +134 -0
  166. package/dist/core/events/v3/catalog.d.ts +38 -0
  167. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  168. package/dist/core/events/v3/catalog.js +135 -0
  169. package/dist/core/events/v3/clock-order.d.ts +34 -0
  170. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  171. package/dist/core/events/v3/clock-order.js +35 -0
  172. package/dist/core/events/v3/contract.d.ts +171 -0
  173. package/dist/core/events/v3/contract.d.ts.map +1 -0
  174. package/dist/core/events/v3/contract.js +180 -0
  175. package/dist/core/events/v3/control.d.ts +111 -0
  176. package/dist/core/events/v3/control.d.ts.map +1 -0
  177. package/dist/core/events/v3/control.js +419 -0
  178. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  179. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/coordination-view.js +119 -0
  181. package/dist/core/events/v3/economics.d.ts +77 -0
  182. package/dist/core/events/v3/economics.d.ts.map +1 -0
  183. package/dist/core/events/v3/economics.js +274 -0
  184. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  185. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  186. package/dist/core/events/v3/finalization-view.js +37 -0
  187. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  188. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  189. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  190. package/dist/core/events/v3/generated.d.ts +4 -0
  191. package/dist/core/events/v3/generated.d.ts.map +1 -0
  192. package/dist/core/events/v3/generated.js +47 -0
  193. package/dist/core/events/v3/ids.d.ts +9 -0
  194. package/dist/core/events/v3/ids.d.ts.map +1 -0
  195. package/dist/core/events/v3/ids.js +25 -0
  196. package/dist/core/events/v3/index.d.ts +35 -0
  197. package/dist/core/events/v3/index.d.ts.map +1 -0
  198. package/dist/core/events/v3/index.js +33 -0
  199. package/dist/core/events/v3/latency.d.ts +63 -0
  200. package/dist/core/events/v3/latency.d.ts.map +1 -0
  201. package/dist/core/events/v3/latency.js +412 -0
  202. package/dist/core/events/v3/live-feed.d.ts +45 -0
  203. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-feed.js +246 -0
  205. package/dist/core/events/v3/live-observation.d.ts +35 -0
  206. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  207. package/dist/core/events/v3/live-observation.js +1 -0
  208. package/dist/core/events/v3/live-routing.d.ts +57 -0
  209. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  210. package/dist/core/events/v3/live-routing.js +107 -0
  211. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  212. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  214. package/dist/core/events/v3/producers/command.d.ts +50 -0
  215. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/command.js +135 -0
  217. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  218. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  220. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  221. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/coordination.js +229 -0
  223. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  224. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/hook-base.js +424 -0
  226. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  227. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/hook.js +71 -0
  229. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  231. package/dist/core/events/v3/producers/intake.js +244 -0
  232. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  233. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/recorder.js +2176 -0
  235. package/dist/core/events/v3/projection.d.ts +101 -0
  236. package/dist/core/events/v3/projection.d.ts.map +1 -0
  237. package/dist/core/events/v3/projection.js +479 -0
  238. package/dist/core/events/v3/reader.d.ts +75 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -0
  240. package/dist/core/events/v3/reader.js +778 -0
  241. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  242. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  243. package/dist/core/events/v3/recovery-record.js +167 -0
  244. package/dist/core/events/v3/recovery.d.ts +22 -0
  245. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  246. package/dist/core/events/v3/recovery.js +227 -0
  247. package/dist/core/events/v3/span-state.d.ts +52 -0
  248. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  249. package/dist/core/events/v3/span-state.js +142 -0
  250. package/dist/core/events/v3/targets.d.ts +23 -0
  251. package/dist/core/events/v3/targets.d.ts.map +1 -0
  252. package/dist/core/events/v3/targets.js +134 -0
  253. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  254. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  255. package/dist/core/events/v3/turn-telemetry.js +168 -0
  256. package/dist/core/events/v3/validate.d.ts +9 -0
  257. package/dist/core/events/v3/validate.d.ts.map +1 -0
  258. package/dist/core/events/v3/validate.js +281 -0
  259. package/dist/core/events/v3/writer.d.ts +56 -0
  260. package/dist/core/events/v3/writer.d.ts.map +1 -0
  261. package/dist/core/events/v3/writer.js +335 -0
  262. package/dist/core/governor/index.d.ts +1 -1
  263. package/dist/core/governor/index.d.ts.map +1 -1
  264. package/dist/core/governor/index.js +1 -1
  265. package/dist/core/governor/plan-api.d.ts +2 -1
  266. package/dist/core/governor/plan-api.d.ts.map +1 -1
  267. package/dist/core/governor/plan-api.js +6 -3
  268. package/dist/core/governor/read.d.ts +1 -1
  269. package/dist/core/governor/read.d.ts.map +1 -1
  270. package/dist/core/governor/read.js +1 -1
  271. package/dist/core/governor/state.d.ts +9 -0
  272. package/dist/core/governor/state.d.ts.map +1 -1
  273. package/dist/core/governor/state.js +40 -3
  274. package/dist/core/guard/config.d.ts +5 -0
  275. package/dist/core/guard/config.d.ts.map +1 -0
  276. package/dist/core/guard/config.js +157 -0
  277. package/dist/core/guard/coordinator.d.ts +14 -0
  278. package/dist/core/guard/coordinator.d.ts.map +1 -0
  279. package/dist/core/guard/coordinator.js +173 -0
  280. package/dist/core/guard/evaluator.d.ts +4 -0
  281. package/dist/core/guard/evaluator.d.ts.map +1 -0
  282. package/dist/core/guard/evaluator.js +242 -0
  283. package/dist/core/guard/evidence-v3.d.ts +15 -0
  284. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  285. package/dist/core/guard/evidence-v3.js +171 -0
  286. package/dist/core/guard/index.d.ts +10 -0
  287. package/dist/core/guard/index.d.ts.map +1 -0
  288. package/dist/core/guard/index.js +6 -0
  289. package/dist/core/guard/live-source-v3.d.ts +40 -0
  290. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  291. package/dist/core/guard/live-source-v3.js +128 -0
  292. package/dist/core/guard/storage.d.ts +27 -0
  293. package/dist/core/guard/storage.d.ts.map +1 -0
  294. package/dist/core/guard/storage.js +140 -0
  295. package/dist/core/guard/types.d.ts +119 -0
  296. package/dist/core/guard/types.d.ts.map +1 -0
  297. package/dist/core/guard/types.js +1 -0
  298. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  299. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/detect.js +29 -0
  301. package/dist/core/hooks/adapter/events.d.ts +7 -4
  302. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  303. package/dist/core/hooks/adapter/events.js +13 -4
  304. package/dist/core/hooks/adapter/output.d.ts +2 -2
  305. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  306. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  307. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  308. package/dist/core/hooks/adapter/parse.js +64 -24
  309. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  310. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  311. package/dist/core/hooks/adapter/wiring.js +89 -11
  312. package/dist/core/hooks/cli.d.ts +1 -1
  313. package/dist/core/hooks/cli.js +345 -400
  314. package/dist/core/hooks/codex-authorization.d.ts +30 -0
  315. package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
  316. package/dist/core/hooks/codex-authorization.js +199 -0
  317. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  318. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  319. package/dist/core/hooks/effects/image-capture.js +212 -221
  320. package/dist/core/hooks/effects/index.d.ts +1 -9
  321. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  322. package/dist/core/hooks/effects/index.js +1 -24
  323. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  324. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  325. package/dist/core/hooks/events/input-hash.js +43 -0
  326. package/dist/core/hooks/index.d.ts +4 -3
  327. package/dist/core/hooks/index.d.ts.map +1 -1
  328. package/dist/core/hooks/index.js +2 -3
  329. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  330. package/dist/core/hooks/resolve/coord-root.js +1 -1
  331. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  332. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  333. package/dist/core/hooks/resolve/owner.js +51 -42
  334. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  335. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  336. package/dist/core/hooks/resolve/transcript.js +155 -14
  337. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  338. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  339. package/dist/core/hooks/session-name-presence.js +15 -15
  340. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  341. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  342. package/dist/core/journal/index.d.ts +2 -2
  343. package/dist/core/journal/index.d.ts.map +1 -1
  344. package/dist/core/journal/index.js +9 -22
  345. package/dist/core/presence/blob.d.ts +8 -3
  346. package/dist/core/presence/blob.d.ts.map +1 -1
  347. package/dist/core/presence/blob.js +54 -41
  348. package/dist/core/presence/codec-digest.d.ts +29 -0
  349. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  350. package/dist/core/presence/codec-digest.js +170 -0
  351. package/dist/core/presence/index.js +15 -1
  352. package/dist/core/presence/relay-client.d.ts +1 -1
  353. package/dist/core/presence/relay-client.d.ts.map +1 -1
  354. package/dist/core/presence/relay-client.js +5 -5
  355. package/dist/core/work/index.d.ts +1 -1
  356. package/dist/core/work/index.d.ts.map +1 -1
  357. package/dist/core/work/index.js +1 -1
  358. package/dist/core/work/read.d.ts +1 -1
  359. package/dist/core/work/read.d.ts.map +1 -1
  360. package/dist/core/work/read.js +1 -1
  361. package/dist/core/work/runner.d.ts.map +1 -1
  362. package/dist/core/work/runner.js +6 -0
  363. package/dist/core/work/state.d.ts +9 -0
  364. package/dist/core/work/state.d.ts.map +1 -1
  365. package/dist/core/work/state.js +17 -3
  366. package/dist/core/workflow/engine.js +24 -25
  367. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  368. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  369. package/dist/core/workflow/live-session-v3.js +86 -0
  370. package/dist/core/workflow/scope-id.d.ts +3 -0
  371. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  372. package/dist/core/workflow/scope-id.js +5 -0
  373. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  374. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  375. package/dist/core/workflow/workspaces/leases.js +53 -19
  376. package/dist/index.d.ts +1 -1
  377. package/dist/index.js +1 -1
  378. package/dist/lib/browser/client.d.ts +41 -0
  379. package/dist/lib/browser/client.d.ts.map +1 -1
  380. package/dist/lib/browser/client.js +203 -0
  381. package/dist/lib/browser/critique.d.ts +28 -2
  382. package/dist/lib/browser/critique.d.ts.map +1 -1
  383. package/dist/lib/browser/critique.js +74 -18
  384. package/dist/lib/browser/geometry.d.ts +1 -1
  385. package/dist/lib/browser/geometry.d.ts.map +1 -1
  386. package/dist/lib/browser/geometry.js +130 -6
  387. package/dist/lib/browser/index.d.ts +3 -0
  388. package/dist/lib/browser/index.d.ts.map +1 -1
  389. package/dist/lib/browser/index.js +3 -0
  390. package/dist/lib/browser/qa-plan.d.ts +174 -0
  391. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  392. package/dist/lib/browser/qa-plan.js +321 -0
  393. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  394. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  395. package/dist/lib/browser/qa-reuse.js +222 -0
  396. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  397. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  398. package/dist/lib/browser/qa-snapshot.js +171 -0
  399. package/dist/lib/browser/runts.d.ts.map +1 -1
  400. package/dist/lib/browser/runts.js +22 -1
  401. package/dist/lib/browser/tiling.d.ts +71 -0
  402. package/dist/lib/browser/tiling.d.ts.map +1 -0
  403. package/dist/lib/browser/tiling.js +118 -0
  404. package/dist/lib/context/index.d.ts +0 -3
  405. package/dist/lib/context/index.d.ts.map +1 -1
  406. package/dist/lib/context/index.js +20 -42
  407. package/dist/lib/council/index.d.ts +2 -2
  408. package/dist/lib/council/index.d.ts.map +1 -1
  409. package/dist/lib/council/index.js +9 -20
  410. package/dist/lib/docs-frontmatter.d.ts +1 -6
  411. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  412. package/dist/lib/docs-frontmatter.js +12 -78
  413. package/dist/lib/docs-index.d.ts +9 -0
  414. package/dist/lib/docs-index.d.ts.map +1 -1
  415. package/dist/lib/docs-index.js +32 -3
  416. package/dist/lib/docs-lint.d.ts.map +1 -1
  417. package/dist/lib/docs-lint.js +14 -30
  418. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  419. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  420. package/dist/lib/docs-metadata-audit.js +132 -0
  421. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  422. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  423. package/dist/lib/docs-metadata-managed.js +78 -0
  424. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  425. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  426. package/dist/lib/docs-metadata-sync.js +222 -0
  427. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  428. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  429. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  430. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  431. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  432. package/dist/lib/docs-metadata-v2.js +424 -0
  433. package/dist/lib/docs-new.d.ts +11 -0
  434. package/dist/lib/docs-new.d.ts.map +1 -0
  435. package/dist/lib/docs-new.js +52 -0
  436. package/dist/lib/docs-sweep.d.ts.map +1 -1
  437. package/dist/lib/docs-sweep.js +45 -29
  438. package/dist/lib/headless/index.d.ts +98 -0
  439. package/dist/lib/headless/index.d.ts.map +1 -0
  440. package/dist/lib/headless/index.js +211 -0
  441. package/dist/lib/identities/assume.d.ts +4 -4
  442. package/dist/lib/identities/assume.d.ts.map +1 -1
  443. package/dist/lib/identities/assume.js +52 -68
  444. package/dist/lib/instructions/apply.d.ts +5 -4
  445. package/dist/lib/instructions/apply.d.ts.map +1 -1
  446. package/dist/lib/instructions/apply.js +32 -20
  447. package/dist/lib/instructions/bundle.d.ts +33 -0
  448. package/dist/lib/instructions/bundle.d.ts.map +1 -0
  449. package/dist/lib/instructions/bundle.js +149 -0
  450. package/dist/lib/instructions/splice.d.ts +0 -1
  451. package/dist/lib/instructions/splice.d.ts.map +1 -1
  452. package/dist/lib/instructions/splice.js +22 -6
  453. package/dist/lib/instructions/templates.d.ts +7 -5
  454. package/dist/lib/instructions/templates.d.ts.map +1 -1
  455. package/dist/lib/instructions/templates.js +79 -9
  456. package/package.json +27 -6
  457. package/schemas/config.schema.json +120 -2
  458. package/schemas/docs-metadata-v2.schema.json +441 -0
  459. package/schemas/event-v3.schema.json +24472 -0
  460. package/src/commander.ts +7 -1
  461. package/src/commands/adapter.ts +2 -2
  462. package/src/commands/agents.ts +1737 -570
  463. package/src/commands/artifacts.ts +7 -6
  464. package/src/commands/backup.ts +29 -21
  465. package/src/commands/browse.ts +349 -8
  466. package/src/commands/checkpoint.ts +4 -3
  467. package/src/commands/claude-desktop.ts +7 -5
  468. package/src/commands/context.ts +1 -6
  469. package/src/commands/decision.ts +27 -44
  470. package/src/commands/docs.ts +100 -33
  471. package/src/commands/doctor.ts +73 -8
  472. package/src/commands/events.ts +256 -0
  473. package/src/commands/governor.ts +18 -4
  474. package/src/commands/init.ts +264 -57
  475. package/src/commands/instructions.ts +129 -0
  476. package/src/commands/journal.ts +4 -13
  477. package/src/commands/ledger-v3.ts +111 -0
  478. package/src/commands/presence.ts +18 -11
  479. package/src/commands/sync.ts +1 -1
  480. package/src/commands/web.ts +67 -8
  481. package/src/commands/work.ts +28 -5
  482. package/src/core/adapter.ts +5 -0
  483. package/src/core/adapters/attest.ts +8 -3
  484. package/src/core/adapters/profiles.ts +4 -6
  485. package/src/core/agents/canonical-emit.ts +39 -28
  486. package/src/core/agents/cli.ts +242 -263
  487. package/src/core/agents/codex-archive-v3.ts +138 -0
  488. package/src/core/agents/coord-client.ts +75 -177
  489. package/src/core/agents/finalization.ts +120 -38
  490. package/src/core/agents/index.ts +5 -5
  491. package/src/core/agents/live-authority-v3.ts +375 -0
  492. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  493. package/src/core/agents/live-observation-v3.ts +216 -0
  494. package/src/core/agents/render/prompt-context.ts +89 -55
  495. package/src/core/agents/render/session-context.ts +23 -32
  496. package/src/core/agents/rules/claim-conflict.ts +85 -126
  497. package/src/core/agents/rules/commit-conflict.ts +3 -14
  498. package/src/core/agents/rules/stop-hook.ts +239 -293
  499. package/src/core/agents/session-events.ts +137 -104
  500. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  501. package/src/core/agents/session-finalizer-v3.ts +953 -0
  502. package/src/core/agents/session-name-display.ts +149 -0
  503. package/src/core/agents/state/activity-log.ts +6 -14
  504. package/src/core/agents/state/heartbeat-writer.ts +98 -242
  505. package/src/core/agents/state/live-coordination-view.ts +290 -0
  506. package/src/core/agents/state/session-state.ts +143 -0
  507. package/src/core/agents/state/stale-sweep.ts +40 -17
  508. package/src/core/artifacts/index.ts +4 -5
  509. package/src/core/config.ts +148 -3
  510. package/src/core/context/index.ts +9 -17
  511. package/src/core/events/span-parent.ts +46 -0
  512. package/src/core/events/v3/advance.ts +168 -0
  513. package/src/core/events/v3/authority-outbox.ts +548 -0
  514. package/src/core/events/v3/base-builder.ts +60 -0
  515. package/src/core/events/v3/base-contract.ts +882 -0
  516. package/src/core/events/v3/bootstrap.ts +226 -0
  517. package/src/core/events/v3/builder.ts +59 -0
  518. package/src/core/events/v3/canonical.ts +153 -0
  519. package/src/core/events/v3/capabilities.ts +171 -0
  520. package/src/core/events/v3/capability-drift.ts +177 -0
  521. package/src/core/events/v3/catalog.ts +202 -0
  522. package/src/core/events/v3/clock-order.ts +41 -0
  523. package/src/core/events/v3/contract.ts +365 -0
  524. package/src/core/events/v3/control.ts +576 -0
  525. package/src/core/events/v3/coordination-view.ts +193 -0
  526. package/src/core/events/v3/economics.ts +384 -0
  527. package/src/core/events/v3/finalization-view.ts +67 -0
  528. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  529. package/src/core/events/v3/generated.ts +48 -0
  530. package/src/core/events/v3/ids.ts +33 -0
  531. package/src/core/events/v3/index.ts +322 -0
  532. package/src/core/events/v3/latency.ts +551 -0
  533. package/src/core/events/v3/live-feed.ts +319 -0
  534. package/src/core/events/v3/live-observation.ts +39 -0
  535. package/src/core/events/v3/live-routing.ts +135 -0
  536. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  537. package/src/core/events/v3/producers/command.ts +201 -0
  538. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  539. package/src/core/events/v3/producers/coordination.ts +355 -0
  540. package/src/core/events/v3/producers/hook-base.ts +578 -0
  541. package/src/core/events/v3/producers/hook.ts +119 -0
  542. package/src/core/events/v3/producers/intake.ts +319 -0
  543. package/src/core/events/v3/producers/recorder.ts +2805 -0
  544. package/src/core/events/v3/projection.ts +653 -0
  545. package/src/core/events/v3/reader.ts +1127 -0
  546. package/src/core/events/v3/recovery-record.ts +244 -0
  547. package/src/core/events/v3/recovery.ts +271 -0
  548. package/src/core/events/v3/span-state.ts +187 -0
  549. package/src/core/events/v3/targets.ts +182 -0
  550. package/src/core/events/v3/turn-telemetry.ts +259 -0
  551. package/src/core/events/v3/validate.ts +361 -0
  552. package/src/core/events/v3/writer.ts +419 -0
  553. package/src/core/governor/index.ts +3 -0
  554. package/src/core/governor/plan-api.ts +10 -2
  555. package/src/core/governor/read.ts +3 -0
  556. package/src/core/governor/state.ts +52 -5
  557. package/src/core/guard/config.ts +206 -0
  558. package/src/core/guard/coordinator.ts +227 -0
  559. package/src/core/guard/evaluator.ts +343 -0
  560. package/src/core/guard/evidence-v3.ts +227 -0
  561. package/src/core/guard/index.ts +35 -0
  562. package/src/core/guard/live-source-v3.ts +204 -0
  563. package/src/core/guard/storage.ts +188 -0
  564. package/src/core/guard/types.ts +152 -0
  565. package/src/core/hooks/adapter/detect.ts +28 -1
  566. package/src/core/hooks/adapter/events.ts +15 -6
  567. package/src/core/hooks/adapter/output.ts +7 -2
  568. package/src/core/hooks/adapter/parse.ts +81 -36
  569. package/src/core/hooks/adapter/wiring.ts +119 -13
  570. package/src/core/hooks/cli.ts +398 -422
  571. package/src/core/hooks/codex-authorization.ts +253 -0
  572. package/src/core/hooks/effects/image-capture.ts +228 -238
  573. package/src/core/hooks/effects/index.ts +1 -36
  574. package/src/core/hooks/events/input-hash.ts +47 -0
  575. package/src/core/hooks/index.ts +4 -11
  576. package/src/core/hooks/resolve/coord-root.ts +1 -1
  577. package/src/core/hooks/resolve/owner.ts +52 -45
  578. package/src/core/hooks/resolve/transcript.ts +165 -14
  579. package/src/core/hooks/session-name-presence.ts +14 -15
  580. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  581. package/src/core/journal/index.ts +15 -22
  582. package/src/core/presence/blob.ts +63 -38
  583. package/src/core/presence/codec-digest.ts +215 -0
  584. package/src/core/presence/index.ts +18 -1
  585. package/src/core/presence/relay-client.ts +5 -5
  586. package/src/core/work/index.ts +3 -0
  587. package/src/core/work/read.ts +3 -0
  588. package/src/core/work/runner.ts +6 -0
  589. package/src/core/work/state.ts +27 -3
  590. package/src/core/workflow/engine.ts +24 -24
  591. package/src/core/workflow/live-session-v3.ts +126 -0
  592. package/src/core/workflow/scope-id.ts +6 -0
  593. package/src/core/workflow/workspaces/leases.ts +56 -19
  594. package/src/index.ts +1 -1
  595. package/src/lib/browser/client.ts +230 -0
  596. package/src/lib/browser/critique.ts +104 -27
  597. package/src/lib/browser/geometry.ts +143 -14
  598. package/src/lib/browser/index.ts +34 -0
  599. package/src/lib/browser/qa-plan.ts +501 -0
  600. package/src/lib/browser/qa-reuse.ts +306 -0
  601. package/src/lib/browser/qa-snapshot.ts +223 -0
  602. package/src/lib/browser/runts.ts +27 -2
  603. package/src/lib/browser/tiling.ts +164 -0
  604. package/src/lib/context/index.ts +22 -46
  605. package/src/lib/council/index.ts +9 -21
  606. package/src/lib/docs-frontmatter.ts +8 -79
  607. package/src/lib/docs-index.ts +33 -3
  608. package/src/lib/docs-lint.ts +15 -29
  609. package/src/lib/docs-metadata-audit.ts +166 -0
  610. package/src/lib/docs-metadata-managed.ts +83 -0
  611. package/src/lib/docs-metadata-sync.ts +262 -0
  612. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  613. package/src/lib/docs-metadata-v2.ts +646 -0
  614. package/src/lib/docs-new.ts +63 -0
  615. package/src/lib/docs-sweep.ts +42 -28
  616. package/src/lib/headless/index.ts +287 -0
  617. package/src/lib/identities/assume.ts +67 -86
  618. package/src/lib/instructions/apply.ts +33 -20
  619. package/src/lib/instructions/bundle.ts +199 -0
  620. package/src/lib/instructions/splice.ts +21 -7
  621. package/src/lib/instructions/templates.ts +85 -13
  622. package/dist/core/agents/cli-emit.d.ts +0 -27
  623. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  624. package/dist/core/agents/cli-emit.js +0 -57
  625. package/dist/core/agents/codex-replay.d.ts +0 -29
  626. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  627. package/dist/core/agents/codex-replay.js +0 -138
  628. package/dist/core/agents/events/consume.d.ts +0 -82
  629. package/dist/core/agents/events/consume.d.ts.map +0 -1
  630. package/dist/core/agents/events/consume.js +0 -195
  631. package/dist/core/agents/events/emit.d.ts +0 -42
  632. package/dist/core/agents/events/emit.d.ts.map +0 -1
  633. package/dist/core/agents/events/emit.js +0 -75
  634. package/dist/core/agents/events/ulid.d.ts +0 -11
  635. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  636. package/dist/core/agents/events/ulid.js +0 -47
  637. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -65
  638. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  639. package/dist/core/agents/state/heartbeat-projector.js +0 -527
  640. package/dist/core/hooks/events/emit.d.ts +0 -31
  641. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  642. package/dist/core/hooks/events/emit.js +0 -93
  643. package/dist/core/hooks/events/rotate.d.ts +0 -43
  644. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  645. package/dist/core/hooks/events/rotate.js +0 -142
  646. package/dist/core/hooks/events/schema.d.ts +0 -312
  647. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  648. package/dist/core/hooks/events/schema.js +0 -12
  649. package/dist/core/hooks/events/ulid.d.ts +0 -10
  650. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  651. package/dist/core/hooks/events/ulid.js +0 -47
  652. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  653. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  654. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  655. package/src/core/agents/cli-emit.ts +0 -64
  656. package/src/core/agents/codex-replay.ts +0 -163
  657. package/src/core/agents/events/consume.ts +0 -254
  658. package/src/core/agents/events/emit.ts +0 -115
  659. package/src/core/agents/events/ulid.ts +0 -51
  660. package/src/core/agents/state/heartbeat-projector.ts +0 -582
  661. package/src/core/hooks/events/emit.ts +0 -125
  662. package/src/core/hooks/events/rotate.ts +0 -151
  663. package/src/core/hooks/events/schema.ts +0 -538
  664. package/src/core/hooks/events/ulid.ts +0 -51
  665. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -9,6 +9,7 @@ import { createHash, randomBytes } from "node:crypto";
9
9
  import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
10
10
  import { basename, resolve } from "node:path";
11
11
  import { monorepoRoot } from "../../core/agents/index.js";
12
+ import { readLiveCoordinationRows } from "../../core/agents/state/live-coordination-view.js";
12
13
  import { resolveBinName } from "../../core/config.js";
13
14
  import { ensureIdentity, lookupById as lookupIdentityById } from "../identities/index.js";
14
15
  export const COUNCIL_SCHEMA_VERSION = 2;
@@ -176,7 +177,7 @@ export function setCouncilSteward(councilId, steward) {
176
177
  * next-app's same-named constant. */
177
178
  const KNOWN_AGENT_STALE_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;
178
179
  /**
179
- * Active heartbeats + recently-archived journals, deduped by name.
180
+ * Active V3 generations + recently-archived journals, deduped by name.
180
181
  * Used by `agents council set-steward` to refuse arbitrary names;
181
182
  * pass `--allow-unknown` to bypass when bootstrapping a new agent.
182
183
  */
@@ -184,27 +185,15 @@ export function listKnownAgents() {
184
185
  const root = monorepoRoot();
185
186
  if (!root)
186
187
  return [];
187
- const activeDir = resolve(root, ".harnery", "active");
188
188
  const archiveDir = resolve(root, ".harnery", "journal", "archived");
189
189
  const byName = new Map();
190
- if (existsSync(activeDir)) {
191
- for (const f of readdirSync(activeDir)) {
192
- if (!f.endsWith(".json"))
193
- continue;
194
- try {
195
- const hb = JSON.parse(readFileSync(resolve(activeDir, f), "utf8"));
196
- if (!hb.name)
197
- continue;
198
- const name = hb.name.startsWith("agent-") ? hb.name : `agent-${hb.name}`;
199
- const last_seen = hb.last_heartbeat ?? new Date().toISOString();
200
- const existing = byName.get(name);
201
- if (existing?.state !== "active") {
202
- byName.set(name, { name, state: "active", last_seen });
203
- }
204
- }
205
- catch {
206
- /* skip unreadable */
207
- }
190
+ for (const row of readLiveCoordinationRows(root)) {
191
+ if (!row.name)
192
+ continue;
193
+ const name = row.name.startsWith("agent-") ? row.name : `agent-${row.name}`;
194
+ const existing = byName.get(name);
195
+ if (existing?.state !== "active") {
196
+ byName.set(name, { name, state: "active", last_seen: row.last_heartbeat });
208
197
  }
209
198
  }
210
199
  const cutoff = Date.now() - KNOWN_AGENT_STALE_WINDOW_MS;
@@ -19,12 +19,7 @@ export type DocKind = "plan" | "issue" | "handoff";
19
19
  * stripped from `body`, so status readers do not need try/catch.
20
20
  */
21
21
  export declare function parseFrontmatter(text: string): ParsedFrontmatter;
22
- /**
23
- * Normalize a raw status token to the canonical enum for its kind.
24
- * Returns null when the token can't be mapped (caller may fail loud).
25
- */
26
- export declare function normalizeStatus(raw: string, kind?: DocKind): string | null;
27
- /** Read and normalize a doc's YAML lifecycle status, or null when absent/invalid. */
22
+ /** Read a canonical v2 lifecycle status, or null when absent or invalid. */
28
23
  export declare function readDocStatus(filePath: string, kind?: DocKind): string | null;
29
24
  /** Same as {@link readDocStatus} but from an in-memory string (testable). */
30
25
  export declare function readDocStatusFromText(content: string, kind?: DocKind): string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"docs-frontmatter.d.ts","sourceRoot":"","sources":["../../src/lib/docs-frontmatter.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,+CAA+C;AAC/C,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAKnD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAgBhE;AA+DD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAW1E;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ7E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAOpF;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGtD"}
1
+ {"version":3,"file":"docs-frontmatter.d.ts","sourceRoot":"","sources":["../../src/lib/docs-frontmatter.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,+CAA+C;AAC/C,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAKnD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAgBhE;AAOD,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ7E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CASpF;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGtD"}
@@ -26,84 +26,12 @@ export function parseFrontmatter(text) {
26
26
  }
27
27
  return { data, body: text.slice(m[0].length), raw: m[1] };
28
28
  }
29
- /**
30
- * Kind-independent token normalization (spacing / casing / punctuation
31
- * variants). Kind-specific collapses (done -> shipped vs resolved) are applied
32
- * in `normalizeStatus`.
33
- */
34
- const GENERIC_NORMALIZE = {
35
- in_progress: "in-progress",
36
- inprogress: "in-progress",
37
- "in progress": "in-progress",
38
- "in-progress": "in-progress",
39
- wip: "in-progress",
40
- "wont-fix": "wontfix",
41
- wontfix: "wontfix",
42
- proposed: "proposed",
43
- abandoned: "abandoned",
44
- open: "open",
45
- resolved: "resolved",
46
- shipped: "shipped",
47
- };
48
- // "done"-family tokens collapse to different canonical values per kind.
49
- const DONE_FAMILY = new Set(["done", "complete", "completed", "finished"]);
50
- const KIND_NORMALIZE = {
51
- plan: {
52
- planning: "proposed",
53
- draft: "proposed",
54
- approved: "proposed",
55
- plan: "proposed",
56
- open: "proposed",
57
- deferred: "proposed",
58
- implemented: "shipped",
59
- resolved: "shipped",
60
- fixed: "shipped",
61
- archived: "shipped",
62
- shelved: "abandoned",
63
- },
64
- issue: {
65
- "in progress": "open",
66
- in_progress: "open",
67
- "in-progress": "open",
68
- blocked: "open",
69
- mitigated: "open",
70
- fixed: "resolved",
71
- shipped: "resolved",
72
- },
73
- handoff: {
74
- "in progress": "open",
75
- in_progress: "open",
76
- "in-progress": "open",
77
- blocked: "open",
78
- fixed: "resolved",
79
- shipped: "resolved",
80
- },
81
- };
82
29
  const ALLOWED_BY_KIND = {
83
30
  plan: new Set(["proposed", "in-progress", "shipped", "abandoned"]),
84
31
  issue: new Set(["open", "resolved", "wontfix"]),
85
32
  handoff: new Set(["open", "resolved", "abandoned"]),
86
33
  };
87
- const ALL_CANONICAL = new Set(Object.values(ALLOWED_BY_KIND).flatMap((values) => [...values]));
88
- /**
89
- * Normalize a raw status token to the canonical enum for its kind.
90
- * Returns null when the token can't be mapped (caller may fail loud).
91
- */
92
- export function normalizeStatus(raw, kind) {
93
- const t = raw.trim().toLowerCase();
94
- if (!t)
95
- return null;
96
- if (DONE_FAMILY.has(t)) {
97
- // plans ship; issues/handoffs resolve. Default to "shipped" when unknown.
98
- return kind === "issue" || kind === "handoff" ? "resolved" : "shipped";
99
- }
100
- const normalized = (kind ? KIND_NORMALIZE[kind][t] : undefined) ?? GENERIC_NORMALIZE[t];
101
- if (!normalized)
102
- return null;
103
- const allowed = kind ? ALLOWED_BY_KIND[kind] : ALL_CANONICAL;
104
- return allowed.has(normalized) ? normalized : null;
105
- }
106
- /** Read and normalize a doc's YAML lifecycle status, or null when absent/invalid. */
34
+ /** Read a canonical v2 lifecycle status, or null when absent or invalid. */
107
35
  export function readDocStatus(filePath, kind) {
108
36
  let content;
109
37
  try {
@@ -117,11 +45,17 @@ export function readDocStatus(filePath, kind) {
117
45
  /** Same as {@link readDocStatus} but from an in-memory string (testable). */
118
46
  export function readDocStatusFromText(content, kind) {
119
47
  const { data } = parseFrontmatter(content);
120
- const yamlStatus = data.status;
121
- if (typeof yamlStatus === "string" && yamlStatus.trim()) {
122
- return normalizeStatus(yamlStatus, kind);
123
- }
124
- return null;
48
+ if (data.schema !== "harnery-doc/v2")
49
+ return null;
50
+ if (kind && data.type !== kind)
51
+ return null;
52
+ if (typeof data.status !== "string")
53
+ return null;
54
+ if (kind)
55
+ return ALLOWED_BY_KIND[kind].has(data.status) ? data.status : null;
56
+ return Object.values(ALLOWED_BY_KIND).some((allowed) => allowed.has(data.status))
57
+ ? data.status
58
+ : null;
125
59
  }
126
60
  /** Whether a doc carries a non-empty status in leading YAML frontmatter. */
127
61
  export function hasYamlStatus(content) {
@@ -7,6 +7,10 @@ export declare function initDocsContext(opts: {
7
7
  * Idempotent: safe to run on every commit. Reads the first ~30 lines of
8
8
  * each dated file to extract title and (for issues) status.
9
9
  *
10
+ * Targets: the host root, every initialized git submodule, and first-level
11
+ * in-tree packages that keep `docs/audits` or `docs/issues` without being
12
+ * git submodules. Marker rules are unchanged.
13
+ *
10
14
  * Preserves hand-written preambles. The command updates only the section
11
15
  * between `<!-- BEGIN INDEX -->` and `<!-- END INDEX -->` markers. If a
12
16
  * README exists without markers, the command refuses to overwrite it and
@@ -25,5 +29,10 @@ export interface IndexResult {
25
29
  after: string;
26
30
  }
27
31
  export declare function extractStatus(content: string): string | undefined;
32
+ /** Root + initialized submodules + first-level in-tree packages with docs indexes. */
33
+ export declare function collectIndexTargets(): {
34
+ name: string;
35
+ path: string;
36
+ }[];
28
37
  export declare function runIndex(opts: IndexOpts): Promise<IndexResult[]>;
29
38
  //# sourceMappingURL=docs-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"docs-index.d.ts","sourceRoot":"","sources":["../../src/lib/docs-index.ts"],"names":[],"mappings":"AASA,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAG/F;AAeD;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAkBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE;AAgGD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA+CtE"}
1
+ {"version":3,"file":"docs-index.d.ts","sourceRoot":"","sources":["../../src/lib/docs-index.ts"],"names":[],"mappings":"AASA,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAG/F;AAeD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAkBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE;AAsGD,sFAAsF;AACtF,wBAAgB,mBAAmB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAqBtE;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA2CtE"}
@@ -122,13 +122,42 @@ function hasMarkers(existing) {
122
122
  function buildNewReadme(kind, body) {
123
123
  return `${defaultPreamble(kind)}\n${BEGIN_MARKER}\n${body}${END_MARKER}\n`;
124
124
  }
125
- export async function runIndex(opts) {
126
- const targets = [{ name: "(root)", path: REPO_ROOT }];
125
+ const SKIP_NESTED_DIR_NAMES = new Set(["node_modules", "dist", "target"]);
126
+ function hasIndexableDocs(path) {
127
+ return existsSync(join(path, "docs", "audits")) || existsSync(join(path, "docs", "issues"));
128
+ }
129
+ /** Root + initialized submodules + first-level in-tree packages with docs indexes. */
130
+ export function collectIndexTargets() {
131
+ const byPath = new Map();
132
+ const add = (name, path) => {
133
+ byPath.set(path, { name, path });
134
+ };
135
+ add("(root)", REPO_ROOT);
127
136
  for (const name of SUBMODULES) {
128
137
  if (!isSubmoduleInitialized(name))
129
138
  continue;
130
- targets.push({ name, path: submodulePath(name) });
139
+ add(name, submodulePath(name));
140
+ }
141
+ if (!existsSync(REPO_ROOT))
142
+ return [...byPath.values()];
143
+ for (const ent of readdirSync(REPO_ROOT, { withFileTypes: true })) {
144
+ if (!ent.isDirectory() && !ent.isSymbolicLink())
145
+ continue;
146
+ if (ent.name.startsWith("."))
147
+ continue;
148
+ if (SKIP_NESTED_DIR_NAMES.has(ent.name))
149
+ continue;
150
+ if (isSubmoduleInitialized(ent.name))
151
+ continue;
152
+ const child = join(REPO_ROOT, ent.name);
153
+ if (!hasIndexableDocs(child))
154
+ continue;
155
+ add(ent.name, child);
131
156
  }
157
+ return [...byPath.values()];
158
+ }
159
+ export async function runIndex(opts) {
160
+ const targets = collectIndexTargets();
132
161
  const filter = opts.repo === "." ? "(root)" : opts.repo;
133
162
  const filtered = filter ? targets.filter((t) => t.name === filter) : targets;
134
163
  const results = [];
@@ -1 +1 @@
1
- {"version":3,"file":"docs-lint.d.ts","sourceRoot":"","sources":["../../src/lib/docs-lint.ts"],"names":[],"mappings":"AAcA,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC,GAAG,IAAI,CAKP;AAaD;;;;;;GAMG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0HD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMrD;AAsQD,wBAAsB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAqBlE"}
1
+ {"version":3,"file":"docs-lint.d.ts","sourceRoot":"","sources":["../../src/lib/docs-lint.ts"],"names":[],"mappings":"AAeA,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC,GAAG,IAAI,CAMP;AAaD;;;;;;GAMG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0HD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMrD;AA0OD,wBAAsB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAiClE"}
@@ -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"}