@isaacriehm/cairn-core 0.19.1 → 0.22.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 (336) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/align-undo/log.js +3 -2
  3. package/dist/align-undo/log.js.map +1 -1
  4. package/dist/attention/index.d.ts +0 -2
  5. package/dist/attention/index.js +0 -2
  6. package/dist/attention/index.js.map +1 -1
  7. package/dist/attention/restore.d.ts +1 -1
  8. package/dist/attention/restore.js +1 -1
  9. package/dist/attention/source-strip.d.ts +2 -2
  10. package/dist/attention/source-strip.js +4 -3
  11. package/dist/attention/source-strip.js.map +1 -1
  12. package/dist/components/audit.d.ts +7 -1
  13. package/dist/components/audit.js +144 -72
  14. package/dist/components/audit.js.map +1 -1
  15. package/dist/components/emit.js +33 -6
  16. package/dist/components/emit.js.map +1 -1
  17. package/dist/components/freshness.d.ts +51 -0
  18. package/dist/components/freshness.js +121 -0
  19. package/dist/components/freshness.js.map +1 -0
  20. package/dist/components/index.d.ts +4 -0
  21. package/dist/components/index.js +2 -0
  22. package/dist/components/index.js.map +1 -1
  23. package/dist/components/reconfirm.d.ts +64 -0
  24. package/dist/components/reconfirm.js +204 -0
  25. package/dist/components/reconfirm.js.map +1 -0
  26. package/dist/context/handoff-builder.js +3 -3
  27. package/dist/context/handoff-builder.js.map +1 -1
  28. package/dist/context/task-summary.js +2 -2
  29. package/dist/context/task-summary.js.map +1 -1
  30. package/dist/doctor/index.js +102 -9
  31. package/dist/doctor/index.js.map +1 -1
  32. package/dist/events/paths.js +2 -2
  33. package/dist/events/paths.js.map +1 -1
  34. package/dist/fix-align/sentinel.js +2 -3
  35. package/dist/fix-align/sentinel.js.map +1 -1
  36. package/dist/gc/attested-commits.js +2 -2
  37. package/dist/gc/attested-commits.js.map +1 -1
  38. package/dist/gc/canary.js +2 -3
  39. package/dist/gc/canary.js.map +1 -1
  40. package/dist/gc/citation-integrity.d.ts +4 -5
  41. package/dist/gc/citation-integrity.js +11 -33
  42. package/dist/gc/citation-integrity.js.map +1 -1
  43. package/dist/gc/classify.js +3 -16
  44. package/dist/gc/classify.js.map +1 -1
  45. package/dist/gc/completion-integrity.js +4 -3
  46. package/dist/gc/completion-integrity.js.map +1 -1
  47. package/dist/gc/entity-orphan.js +66 -12
  48. package/dist/gc/entity-orphan.js.map +1 -1
  49. package/dist/gc/ghost-anchor.d.ts +57 -0
  50. package/dist/gc/ghost-anchor.js +171 -0
  51. package/dist/gc/ghost-anchor.js.map +1 -0
  52. package/dist/gc/index.d.ts +2 -0
  53. package/dist/gc/index.js +1 -0
  54. package/dist/gc/index.js.map +1 -1
  55. package/dist/gc/sweep.d.ts +1 -1
  56. package/dist/gc/sweep.js +13 -1
  57. package/dist/gc/sweep.js.map +1 -1
  58. package/dist/gc/types.d.ts +1 -1
  59. package/dist/hooks/bypass-detection.js +3 -2
  60. package/dist/hooks/bypass-detection.js.map +1 -1
  61. package/dist/hooks/defer.js +3 -2
  62. package/dist/hooks/defer.js.map +1 -1
  63. package/dist/hooks/ghost-backup.d.ts +37 -0
  64. package/dist/hooks/ghost-backup.js +82 -0
  65. package/dist/hooks/ghost-backup.js.map +1 -0
  66. package/dist/hooks/post-tool-use/allowlist-reader.js +2 -2
  67. package/dist/hooks/post-tool-use/allowlist-reader.js.map +1 -1
  68. package/dist/hooks/post-tool-use/ask-user-blocked.d.ts +1 -2
  69. package/dist/hooks/post-tool-use/ask-user-blocked.js +3 -4
  70. package/dist/hooks/post-tool-use/ask-user-blocked.js.map +1 -1
  71. package/dist/hooks/post-tool-use/citation-scanner.d.ts +9 -7
  72. package/dist/hooks/post-tool-use/citation-scanner.js +9 -14
  73. package/dist/hooks/post-tool-use/citation-scanner.js.map +1 -1
  74. package/dist/hooks/post-tool-use/legend-builder.d.ts +2 -2
  75. package/dist/hooks/post-tool-use/legend-builder.js +1 -19
  76. package/dist/hooks/post-tool-use/legend-builder.js.map +1 -1
  77. package/dist/hooks/post-tool-use/post-write.js +18 -1
  78. package/dist/hooks/post-tool-use/post-write.js.map +1 -1
  79. package/dist/hooks/post-tool-use/read-enricher.d.ts +2 -2
  80. package/dist/hooks/post-tool-use/read-enricher.js +4 -6
  81. package/dist/hooks/post-tool-use/read-enricher.js.map +1 -1
  82. package/dist/hooks/post-tool-use/sot-align.js +29 -3
  83. package/dist/hooks/post-tool-use/sot-align.js.map +1 -1
  84. package/dist/hooks/post-tool-use/write-guardian.d.ts +1 -5
  85. package/dist/hooks/post-tool-use/write-guardian.js +25 -18
  86. package/dist/hooks/post-tool-use/write-guardian.js.map +1 -1
  87. package/dist/hooks/runners/context-threshold.js +3 -3
  88. package/dist/hooks/runners/context-threshold.js.map +1 -1
  89. package/dist/hooks/runners/payload.js +2 -1
  90. package/dist/hooks/runners/payload.js.map +1 -1
  91. package/dist/hooks/runners/phase-ready-surface.js +3 -2
  92. package/dist/hooks/runners/phase-ready-surface.js.map +1 -1
  93. package/dist/hooks/runners/session-start.js +103 -4
  94. package/dist/hooks/runners/session-start.js.map +1 -1
  95. package/dist/hooks/runners/stop.js +46 -42
  96. package/dist/hooks/runners/stop.js.map +1 -1
  97. package/dist/hooks/runners/user-prompt-submit.d.ts +2 -2
  98. package/dist/hooks/runners/user-prompt-submit.js +4 -9
  99. package/dist/hooks/runners/user-prompt-submit.js.map +1 -1
  100. package/dist/hooks/seed-attested.js +3 -2
  101. package/dist/hooks/seed-attested.js.map +1 -1
  102. package/dist/index.d.ts +4 -0
  103. package/dist/index.js +3 -0
  104. package/dist/index.js.map +1 -1
  105. package/dist/init/baseline-audit.js +3 -3
  106. package/dist/init/baseline-audit.js.map +1 -1
  107. package/dist/init/claude-rule.js +13 -1
  108. package/dist/init/claude-rule.js.map +1 -1
  109. package/dist/init/curator/corpus.d.ts +1 -0
  110. package/dist/init/curator/corpus.js +6 -2
  111. package/dist/init/curator/corpus.js.map +1 -1
  112. package/dist/init/curator/emit.js +2 -3
  113. package/dist/init/curator/emit.js.map +1 -1
  114. package/dist/init/detect-components.d.ts +3 -2
  115. package/dist/init/detect-components.js +33 -15
  116. package/dist/init/detect-components.js.map +1 -1
  117. package/dist/init/detect.d.ts +1 -5
  118. package/dist/init/detect.js +157 -143
  119. package/dist/init/detect.js.map +1 -1
  120. package/dist/init/eta-calibration.js +2 -2
  121. package/dist/init/eta-calibration.js.map +1 -1
  122. package/dist/init/glob-inference.js +24 -0
  123. package/dist/init/glob-inference.js.map +1 -1
  124. package/dist/init/index.d.ts +4 -4
  125. package/dist/init/index.js +2 -2
  126. package/dist/init/index.js.map +1 -1
  127. package/dist/init/init.d.ts +8 -0
  128. package/dist/init/init.js +16 -20
  129. package/dist/init/init.js.map +1 -1
  130. package/dist/init/mapper-merge.d.ts +1 -4
  131. package/dist/init/mapper-merge.js +4 -17
  132. package/dist/init/mapper-merge.js.map +1 -1
  133. package/dist/init/mapper-parallel.js +1 -1
  134. package/dist/init/mapper-parallel.js.map +1 -1
  135. package/dist/init/mapper-prompts.d.ts +1 -23
  136. package/dist/init/mapper-prompts.js +1 -25
  137. package/dist/init/mapper-prompts.js.map +1 -1
  138. package/dist/init/mapper.d.ts +0 -6
  139. package/dist/init/mapper.js +2 -5
  140. package/dist/init/mapper.js.map +1 -1
  141. package/dist/init/module-slicer.js +3 -24
  142. package/dist/init/module-slicer.js.map +1 -1
  143. package/dist/init/multi-dev/install.js +24 -0
  144. package/dist/init/multi-dev/install.js.map +1 -1
  145. package/dist/init/overlay.js +5 -16
  146. package/dist/init/overlay.js.map +1 -1
  147. package/dist/init/phases/11-baseline.js +1 -1
  148. package/dist/init/phases/11-baseline.js.map +1 -1
  149. package/dist/init/phases/4-seed.js +7 -5
  150. package/dist/init/phases/4-seed.js.map +1 -1
  151. package/dist/init/phases/9a-walker.js +4 -0
  152. package/dist/init/phases/9a-walker.js.map +1 -1
  153. package/dist/init/phases/9b-curate.d.ts +1 -0
  154. package/dist/init/phases/9b-curate.js +6 -2
  155. package/dist/init/phases/9b-curate.js.map +1 -1
  156. package/dist/init/phases/9d-comp-walk.js +3 -3
  157. package/dist/init/phases/9d-comp-walk.js.map +1 -1
  158. package/dist/init/phases/9e-comp-annotate.js +63 -3
  159. package/dist/init/phases/9e-comp-annotate.js.map +1 -1
  160. package/dist/init/phases/index.d.ts +0 -1
  161. package/dist/init/phases/index.js +0 -1
  162. package/dist/init/phases/index.js.map +1 -1
  163. package/dist/init/phases/mapper-output-io.d.ts +1 -1
  164. package/dist/init/phases/mapper-output-io.js +3 -2
  165. package/dist/init/phases/mapper-output-io.js.map +1 -1
  166. package/dist/init/phases/state-io.d.ts +1 -1
  167. package/dist/init/phases/state-io.js +3 -2
  168. package/dist/init/phases/state-io.js.map +1 -1
  169. package/dist/init/phases/types.d.ts +20 -8
  170. package/dist/init/phases/types.js +0 -1
  171. package/dist/init/phases/types.js.map +1 -1
  172. package/dist/init/progress.d.ts +1 -0
  173. package/dist/init/progress.js +3 -1
  174. package/dist/init/progress.js.map +1 -1
  175. package/dist/init/rules-merge/ingest.js +3 -3
  176. package/dist/init/rules-merge/ingest.js.map +1 -1
  177. package/dist/init/seed.js +54 -5
  178. package/dist/init/seed.js.map +1 -1
  179. package/dist/init/source-comments/strip-replace.d.ts +1 -2
  180. package/dist/init/source-comments/strip-replace.js +19 -3
  181. package/dist/init/source-comments/strip-replace.js.map +1 -1
  182. package/dist/init/source-comments/walker.js +8 -79
  183. package/dist/init/source-comments/walker.js.map +1 -1
  184. package/dist/init/types.d.ts +8 -16
  185. package/dist/init/walker.d.ts +1 -1
  186. package/dist/init/walker.js +1 -1
  187. package/dist/join/index.d.ts +9 -0
  188. package/dist/join/index.js +82 -25
  189. package/dist/join/index.js.map +1 -1
  190. package/dist/lock.js +4 -3
  191. package/dist/lock.js.map +1 -1
  192. package/dist/mcp/bootstrap-guard.js +10 -1
  193. package/dist/mcp/bootstrap-guard.js.map +1 -1
  194. package/dist/mcp/schemas.d.ts +26 -4
  195. package/dist/mcp/schemas.js +23 -1
  196. package/dist/mcp/schemas.js.map +1 -1
  197. package/dist/mcp/serve.js +9 -0
  198. package/dist/mcp/serve.js.map +1 -1
  199. package/dist/mcp/server.js +3 -3
  200. package/dist/mcp/server.js.map +1 -1
  201. package/dist/mcp/telemetry.js +4 -3
  202. package/dist/mcp/telemetry.js.map +1 -1
  203. package/dist/mcp/tools/component-reconfirm.d.ts +7 -0
  204. package/dist/mcp/tools/component-reconfirm.js +39 -0
  205. package/dist/mcp/tools/component-reconfirm.js.map +1 -0
  206. package/dist/mcp/tools/component-register.d.ts +15 -0
  207. package/dist/mcp/tools/component-register.js +65 -0
  208. package/dist/mcp/tools/component-register.js.map +1 -0
  209. package/dist/mcp/tools/decision-get.js +2 -2
  210. package/dist/mcp/tools/decision-get.js.map +1 -1
  211. package/dist/mcp/tools/index.js +5 -6
  212. package/dist/mcp/tools/index.js.map +1 -1
  213. package/dist/mcp/tools/init-phases.d.ts +2 -0
  214. package/dist/mcp/tools/init-phases.js +21 -5
  215. package/dist/mcp/tools/init-phases.js.map +1 -1
  216. package/dist/mcp/tools/mission-advance.d.ts +3 -4
  217. package/dist/mcp/tools/mission-advance.js +15 -19
  218. package/dist/mcp/tools/mission-advance.js.map +1 -1
  219. package/dist/mcp/tools/mission-resume.js +3 -3
  220. package/dist/mcp/tools/mission-resume.js.map +1 -1
  221. package/dist/mcp/tools/record-decision.js +17 -9
  222. package/dist/mcp/tools/record-decision.js.map +1 -1
  223. package/dist/mcp/tools/resolve-attention.js +70 -34
  224. package/dist/mcp/tools/resolve-attention.js.map +1 -1
  225. package/dist/mcp/tools/resume.js +3 -2
  226. package/dist/mcp/tools/resume.js.map +1 -1
  227. package/dist/mcp/tools/search.js +2 -2
  228. package/dist/mcp/tools/search.js.map +1 -1
  229. package/dist/mcp/tools/task-complete.js +2 -3
  230. package/dist/mcp/tools/task-complete.js.map +1 -1
  231. package/dist/mcp/tools/task-create.js +2 -2
  232. package/dist/mcp/tools/task-create.js.map +1 -1
  233. package/dist/migrate/config-io.d.ts +24 -0
  234. package/dist/migrate/config-io.js +73 -0
  235. package/dist/migrate/config-io.js.map +1 -0
  236. package/dist/migrate/gitignore.d.ts +28 -0
  237. package/dist/migrate/gitignore.js +82 -0
  238. package/dist/migrate/gitignore.js.map +1 -0
  239. package/dist/migrate/index.d.ts +6 -0
  240. package/dist/migrate/index.js +6 -0
  241. package/dist/migrate/index.js.map +1 -0
  242. package/dist/migrate/migrations/0001-drop-dead-config-fields.d.ts +12 -0
  243. package/dist/migrate/migrations/0001-drop-dead-config-fields.js +39 -0
  244. package/dist/migrate/migrations/0001-drop-dead-config-fields.js.map +1 -0
  245. package/dist/migrate/migrations/0002-backfill-gitignore.d.ts +14 -0
  246. package/dist/migrate/migrations/0002-backfill-gitignore.js +40 -0
  247. package/dist/migrate/migrations/0002-backfill-gitignore.js.map +1 -0
  248. package/dist/migrate/registry.d.ts +9 -0
  249. package/dist/migrate/registry.js +11 -0
  250. package/dist/migrate/registry.js.map +1 -0
  251. package/dist/migrate/runner.d.ts +45 -0
  252. package/dist/migrate/runner.js +177 -0
  253. package/dist/migrate/runner.js.map +1 -0
  254. package/dist/migrate/semver.d.ts +11 -0
  255. package/dist/migrate/semver.js +35 -0
  256. package/dist/migrate/semver.js.map +1 -0
  257. package/dist/migrate/types.d.ts +47 -0
  258. package/dist/migrate/types.js +13 -0
  259. package/dist/migrate/types.js.map +1 -0
  260. package/dist/missions/task-link.js +7 -8
  261. package/dist/missions/task-link.js.map +1 -1
  262. package/dist/paths/index.d.ts +12 -1
  263. package/dist/paths/index.js +17 -3
  264. package/dist/paths/index.js.map +1 -1
  265. package/dist/sensors/catalog.js +6 -11
  266. package/dist/sensors/catalog.js.map +1 -1
  267. package/dist/sensors/decisions.js +55 -19
  268. package/dist/sensors/decisions.js.map +1 -1
  269. package/dist/sensors/diff.d.ts +12 -0
  270. package/dist/sensors/diff.js +103 -0
  271. package/dist/sensors/diff.js.map +1 -1
  272. package/dist/sensors/index.d.ts +4 -5
  273. package/dist/sensors/index.js +2 -3
  274. package/dist/sensors/index.js.map +1 -1
  275. package/dist/sensors/runner.d.ts +34 -37
  276. package/dist/sensors/runner.js +63 -53
  277. package/dist/sensors/runner.js.map +1 -1
  278. package/dist/sensors/stub-catalog.d.ts +6 -3
  279. package/dist/sensors/stub-catalog.js +7 -19
  280. package/dist/sensors/stub-catalog.js.map +1 -1
  281. package/dist/sensors/types.d.ts +11 -55
  282. package/dist/sensors/types.js +4 -8
  283. package/dist/sensors/types.js.map +1 -1
  284. package/dist/session-start/build.js +36 -21
  285. package/dist/session-start/build.js.map +1 -1
  286. package/dist/session-start/templates.d.ts +1 -1
  287. package/dist/session-start/templates.js +1 -1
  288. package/dist/status-line/event-queue.js +2 -1
  289. package/dist/status-line/event-queue.js.map +1 -1
  290. package/dist/status-line/reader.js +5 -5
  291. package/dist/status-line/reader.js.map +1 -1
  292. package/dist/status-line/writer.js +2 -1
  293. package/dist/status-line/writer.js.map +1 -1
  294. package/dist/tasks/lifecycle.d.ts +3 -4
  295. package/dist/tasks/lifecycle.js +19 -21
  296. package/dist/tasks/lifecycle.js.map +1 -1
  297. package/dist/trace/index.js +2 -2
  298. package/dist/trace/index.js.map +1 -1
  299. package/dist/update-check.d.ts +28 -0
  300. package/dist/update-check.js +137 -0
  301. package/dist/update-check.js.map +1 -0
  302. package/package.json +2 -2
  303. package/templates/.cairn/git-hooks/commit-msg +33 -5
  304. package/templates/.cairn/git-hooks/post-commit +13 -3
  305. package/templates/.cairn/git-hooks/pre-commit +48 -22
  306. package/templates/.github/workflows/cairn-check.yml +8 -0
  307. package/dist/attention/bulk-accept.d.ts +0 -78
  308. package/dist/attention/bulk-accept.js +0 -348
  309. package/dist/attention/bulk-accept.js.map +0 -1
  310. package/dist/attention/serve/api.d.ts +0 -24
  311. package/dist/attention/serve/api.js +0 -383
  312. package/dist/attention/serve/api.js.map +0 -1
  313. package/dist/attention/serve/index.d.ts +0 -63
  314. package/dist/attention/serve/index.js +0 -219
  315. package/dist/attention/serve/index.js.map +0 -1
  316. package/dist/hooks/read-enrich.d.ts +0 -6
  317. package/dist/hooks/read-enrich.js +0 -11
  318. package/dist/hooks/read-enrich.js.map +0 -1
  319. package/dist/hooks/write-guard.d.ts +0 -6
  320. package/dist/hooks/write-guard.js +0 -11
  321. package/dist/hooks/write-guard.js.map +0 -1
  322. package/dist/init/phases/12-strip.d.ts +0 -10
  323. package/dist/init/phases/12-strip.js +0 -88
  324. package/dist/init/phases/12-strip.js.map +0 -1
  325. package/dist/mcp/tools/attention-serve.d.ts +0 -23
  326. package/dist/mcp/tools/attention-serve.js +0 -84
  327. package/dist/mcp/tools/attention-serve.js.map +0 -1
  328. package/dist/mcp/tools/attention-wait.d.ts +0 -18
  329. package/dist/mcp/tools/attention-wait.js +0 -84
  330. package/dist/mcp/tools/attention-wait.js.map +0 -1
  331. package/dist/mcp/tools/bulk-accept-attention.d.ts +0 -22
  332. package/dist/mcp/tools/bulk-accept-attention.js +0 -84
  333. package/dist/mcp/tools/bulk-accept-attention.js.map +0 -1
  334. package/dist/sensors/attestation.d.ts +0 -44
  335. package/dist/sensors/attestation.js +0 -262
  336. package/dist/sensors/attestation.js.map +0 -1
@@ -1,348 +0,0 @@
1
- /**
2
- * Bulk-accept obvious DEC drafts + stamp confidence on invariants.
3
- *
4
- * Mirrors the per-draft accept flow in `mcp/tools/resolve-attention.ts`
5
- * (`choice: "a"`) but applies it in one pass over `_inbox/` filtered
6
- * by the `scoring.ts` heuristic. Operator runs this once per
7
- * adoption to drain the obvious classifications, then triages the
8
- * medium / low-confidence remainder interactively via the existing
9
- * cairn-attention skill.
10
- *
11
- * Design:
12
- * - Score each draft from frontmatter + body (prose, raw block) so
13
- * it can run against drafts written before the scoring pipeline
14
- * existed (back-compat for v0.3.6 adoptions).
15
- * - High-confidence DEC drafts: move `_inbox/<id>.draft.md`
16
- * → `<id>.md`, flip `status:` frontmatter to `accepted`, and
17
- * stamp `capture_confidence: high`. Rebuild
18
- * `decisions.ledger.yaml` once at the end.
19
- * - Medium / low-confidence DEC drafts: stay in `_inbox/` but
20
- * get `capture_confidence` stamped so the cairn-attention skill
21
- * can prioritize what to surface first.
22
- * - Invariants are already at `status: active` (phase 7b promotes
23
- * them on write). Just stamp `capture_confidence` so future
24
- * UX can hide low-confidence ones from the active set.
25
- *
26
- * Side-effect-only: emits decision_accepted events, runs the source
27
- * strip-replace pass on accepted source-comment drafts so the §INV /
28
- * §DEC citations land in the original source.
29
- */
30
- import { existsSync, readFileSync, readdirSync, rmSync, writeFileSync, } from "node:fs";
31
- import { join } from "node:path";
32
- import { writeFileSafe } from "@isaacriehm/cairn-state";
33
- import { stringify as stringifyYaml } from "yaml";
34
- import { decisionsDir, invariantsDir } from "@isaacriehm/cairn-state";
35
- import { writeDecisionsLedger } from "@isaacriehm/cairn-state";
36
- import { parseFrontmatterRecord } from "@isaacriehm/cairn-state";
37
- import { withWriteLock } from "../lock.js";
38
- import { writeInvalidationEvent } from "../events/index.js";
39
- import { scoreDecDraft, scoreInvariant, } from "./scoring.js";
40
- import { runDecSourceStrip } from "./source-strip.js";
41
- /**
42
- * Score, stamp, and (for high-confidence DECs) accept inbox drafts in
43
- * bulk. Returns the count summary the CLI / skill renders to the
44
- * operator.
45
- */
46
- export async function bulkAcceptObvious(args) {
47
- const threshold = args.threshold ?? "high";
48
- const dry = args.dryRun ?? false;
49
- // ── DEC drafts ────────────────────────────────────────────────────
50
- const inboxDir = join(decisionsDir(args.repoRoot), "_inbox");
51
- const decsByConfidence = { high: 0, medium: 0, low: 0 };
52
- const acceptedIds = [];
53
- const sourceStripSkipped = [];
54
- let decsScanned = 0;
55
- let decsAccepted = 0;
56
- let sourceStripFilesModified = 0;
57
- let sourceStripItemsApplied = 0;
58
- if (existsSync(inboxDir)) {
59
- const entries = readdirSync(inboxDir, { withFileTypes: true });
60
- const drafts = entries.filter((e) => e.isFile() && e.name.endsWith(".draft.md"));
61
- decsScanned = drafts.length;
62
- if (drafts.length > 0) {
63
- await withWriteLock(args.repoRoot, async () => {
64
- for (const e of drafts) {
65
- const abs = join(inboxDir, e.name);
66
- let raw;
67
- try {
68
- raw = readFileSync(abs, "utf8");
69
- }
70
- catch {
71
- continue;
72
- }
73
- const fm = parseFrontmatterRecord(raw).fm;
74
- const body = stripFrontmatter(raw);
75
- const id = stringField(fm, "id") ?? e.name.replace(/\.draft\.md$/, "");
76
- const sourceFile = stringField(fm, "sourceFile") ?? "";
77
- const titleFm = stringField(fm, "proposedTitle") ?? stringField(fm, "title") ?? "";
78
- const rationaleFm = stringField(fm, "proposedRationale") ?? extractSection(body, "Proposed rationale");
79
- const proseFromBody = extractSection(body, "Source comment");
80
- // Phase 7b drafts emit verbatim essay bodies without a `## Source
81
- // comment` heading, so `extractSection` returns "". Fall back to
82
- // the full body so the scorer sees the actual prose — without this
83
- // every draft scored low because DECISION_VERBS / INVARIANT_MODALS
84
- // / REASON_MARKERS regexes matched nothing.
85
- const proseFallback = body.trim();
86
- const prose = rationaleFm.length > 0
87
- ? rationaleFm
88
- : proseFromBody.length > 0
89
- ? proseFromBody
90
- : proseFallback;
91
- const rawComment = proseFromBody.length > 0 ? proseFromBody : proseFallback;
92
- const score = scoreDecDraft({
93
- sourceFile,
94
- prose,
95
- title: titleFm,
96
- rawComment,
97
- globs: args.globs,
98
- });
99
- decsByConfidence[score] += 1;
100
- // Stamp confidence on the in-memory frontmatter. The actual write
101
- // back to disk is gated below — we don't re-stamp drafts the
102
- // operator already saw with a confidence value.
103
- const prevConf = stringField(fm, "capture_confidence");
104
- // Tight check: only valid enum values count as already-stamped.
105
- // An empty string or hand-edited garbage is treated as unstamped
106
- // so the scorer can re-stamp on next run.
107
- const previouslyStamped = prevConf === "high" || prevConf === "medium" || prevConf === "low";
108
- const stampedFm = { ...fm, capture_confidence: score };
109
- if (atOrAbove(score, threshold)) {
110
- // Promote to accepted.
111
- const acceptedFm = { ...stampedFm, status: "accepted" };
112
- const acceptedBody = renderDoc(acceptedFm, body);
113
- const acceptedPath = join(decisionsDir(args.repoRoot), `${id}.md`);
114
- if (!dry) {
115
- writeFileSafe(acceptedPath, acceptedBody);
116
- try {
117
- rmSync(abs, { force: true });
118
- }
119
- catch {
120
- /* best-effort */
121
- }
122
- // Source-comment derived DECs: replace the original essay
123
- // block with `// §DEC-NNNN` so the file ends up carrying
124
- // the bare cite, mirroring the §INV strip pass that 7b
125
- // runs at adoption time.
126
- const captureSource = stringField(stampedFm, "capture_source");
127
- const blockId = stringField(stampedFm, "blockId");
128
- if (captureSource === "init-source-comments" &&
129
- blockId !== null) {
130
- // Source files that came from Phase 7b are already dirty
131
- // (the INV strip pass mutated them); runDecSourceStrip
132
- // forces overwrite for the target file so the dirty
133
- // check doesn't bail. Operator consented to source
134
- // mutation at adoption time.
135
- const stripOutcome = runDecSourceStrip({
136
- repoRoot: args.repoRoot,
137
- decId: id,
138
- meta: {
139
- blockId,
140
- sourceFile: stringField(stampedFm, "sourceFile") ?? "",
141
- captureSource,
142
- title: stringField(stampedFm, "title") ?? "",
143
- },
144
- });
145
- sourceStripFilesModified +=
146
- stripOutcome.files_modified;
147
- sourceStripItemsApplied +=
148
- stripOutcome.items_applied;
149
- if (stripOutcome.attempted &&
150
- stripOutcome.items_applied === 0 &&
151
- stripOutcome.reason !== undefined) {
152
- sourceStripSkipped.push({
153
- id,
154
- reason: stripOutcome.reason,
155
- });
156
- }
157
- else if (!stripOutcome.attempted && stripOutcome.reason !== undefined) {
158
- sourceStripSkipped.push({
159
- id,
160
- reason: stripOutcome.reason,
161
- });
162
- }
163
- }
164
- }
165
- // Emit `decision_accepted` event per promoted draft so
166
- // cross-session listeners (Stop hook, scope-index rebuild)
167
- // see the new accepted DEC. Without this, bulk-accept's
168
- // 21-DEC batches were invisible to the event ledger and
169
- // downstream invalidation never fired.
170
- if (!dry) {
171
- try {
172
- writeInvalidationEvent(args.repoRoot, {
173
- kind: "decision_accepted",
174
- refs: [{ kind: "decision", id }],
175
- path: `.cairn/ground/decisions/${id}.md`,
176
- source: { session_id: null, tool: "cairn_bulk_accept_attention" },
177
- });
178
- }
179
- catch {
180
- /* best-effort */
181
- }
182
- }
183
- decsAccepted += 1;
184
- acceptedIds.push(id);
185
- }
186
- else {
187
- // Stay in inbox. Only persist the stamp on first scoring —
188
- // a re-run of bulk-accept (e.g. operator clicks "accept
189
- // high-confidence" again with a different threshold) must
190
- // not silently mutate drafts the operator already saw.
191
- if (!dry && !previouslyStamped) {
192
- const stampedDoc = renderDoc(stampedFm, body);
193
- writeFileSync(abs, stampedDoc, "utf8");
194
- }
195
- }
196
- }
197
- // Rebuild the ledger once at the end so accepted DECs surface
198
- // in `cairn_in_scope` immediately.
199
- if (!dry && decsAccepted > 0) {
200
- try {
201
- writeDecisionsLedger({ repoRoot: args.repoRoot });
202
- }
203
- catch {
204
- /* best-effort */
205
- }
206
- }
207
- });
208
- }
209
- }
210
- // ── Invariants ────────────────────────────────────────────────────
211
- // Already at status: active on disk. Just stamp confidence so the
212
- // attention skill can hide / down-weight low-confidence ones.
213
- const invDir = invariantsDir(args.repoRoot);
214
- const invariantsByConfidence = { high: 0, medium: 0, low: 0 };
215
- let invariantsScanned = 0;
216
- if (existsSync(invDir)) {
217
- const invEntries = readdirSync(invDir, { withFileTypes: true });
218
- const invFiles = invEntries.filter((e) => e.isFile() && /^INV-[0-9a-f]{7,}\.md$/.test(e.name));
219
- invariantsScanned = invFiles.length;
220
- if (invFiles.length > 0 && !dry) {
221
- await withWriteLock(args.repoRoot, async () => {
222
- for (const e of invFiles) {
223
- const abs = join(invDir, e.name);
224
- let raw;
225
- try {
226
- raw = readFileSync(abs, "utf8");
227
- }
228
- catch {
229
- continue;
230
- }
231
- const fm = parseFrontmatterRecord(raw).fm;
232
- const body = stripFrontmatter(raw);
233
- const sourceFile = stringField(fm, "sourceFile") ?? "";
234
- const titleFm = stringField(fm, "title") ?? "";
235
- const rawCommentBody = extractSection(body, "Source comment");
236
- const constraintBody = extractSection(body, "Constraint");
237
- // Phase 7b invariants emit verbatim essay bodies — no `## Constraint`
238
- // / `## Source comment` headings. Fall back to full body so the
239
- // scorer's INVARIANT_MODALS / REASON_MARKERS regexes have signal.
240
- const proseFallback = body.trim();
241
- const prose = constraintBody.length > 0
242
- ? constraintBody
243
- : rawCommentBody.length > 0
244
- ? rawCommentBody
245
- : proseFallback;
246
- const rawComment = rawCommentBody.length > 0 ? rawCommentBody : proseFallback;
247
- const score = scoreInvariant({
248
- sourceFile,
249
- prose,
250
- title: titleFm,
251
- rawComment,
252
- globs: args.globs,
253
- });
254
- invariantsByConfidence[score] += 1;
255
- const prevConf = stringField(fm, "capture_confidence");
256
- // Tight check: only valid enum values count as already-stamped.
257
- // An empty string or hand-edited garbage is treated as unstamped
258
- // so the scorer can re-stamp on next run.
259
- const previouslyStamped = prevConf === "high" || prevConf === "medium" || prevConf === "low";
260
- if (!previouslyStamped) {
261
- const stamped = { ...fm, capture_confidence: score };
262
- const stampedDoc = renderDoc(stamped, body);
263
- writeFileSync(abs, stampedDoc, "utf8");
264
- }
265
- }
266
- });
267
- }
268
- else if (invFiles.length > 0 && dry) {
269
- // Dry run still scores so the operator can see the distribution.
270
- for (const e of invFiles) {
271
- const abs = join(invDir, e.name);
272
- let raw;
273
- try {
274
- raw = readFileSync(abs, "utf8");
275
- }
276
- catch {
277
- continue;
278
- }
279
- const fm = parseFrontmatterRecord(raw).fm;
280
- const body = stripFrontmatter(raw);
281
- const sourceFile = stringField(fm, "sourceFile") ?? "";
282
- const titleFm = stringField(fm, "title") ?? "";
283
- const rawCommentBody = extractSection(body, "Source comment");
284
- const constraintBody = extractSection(body, "Constraint");
285
- const proseFallback = body.trim();
286
- const prose = constraintBody.length > 0
287
- ? constraintBody
288
- : rawCommentBody.length > 0
289
- ? rawCommentBody
290
- : proseFallback;
291
- const rawComment = rawCommentBody.length > 0 ? rawCommentBody : proseFallback;
292
- const score = scoreInvariant({
293
- sourceFile,
294
- prose,
295
- title: titleFm,
296
- rawComment,
297
- globs: args.globs,
298
- });
299
- invariantsByConfidence[score] += 1;
300
- }
301
- }
302
- }
303
- return {
304
- decsScanned,
305
- decsAccepted,
306
- decsByConfidence,
307
- acceptedIds,
308
- sourceStripFilesModified,
309
- sourceStripItemsApplied,
310
- sourceStripSkipped,
311
- invariantsScanned,
312
- invariantsByConfidence,
313
- dryRun: dry,
314
- };
315
- }
316
- // ── Helpers ────────────────────────────────────────────────────────
317
- function stripFrontmatter(doc) {
318
- return doc.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, "");
319
- }
320
- function renderDoc(fm, body) {
321
- return `---\n${stringifyYaml(fm).trimEnd()}\n---\n${body.startsWith("\n") ? body : `\n${body}`}`;
322
- }
323
- function stringField(fm, key) {
324
- const v = fm[key];
325
- return typeof v === "string" ? v : null;
326
- }
327
- function extractSection(body, header) {
328
- const re = new RegExp(`##\\s+${escapeRegex(header)}\\s*\\n([\\s\\S]*?)(?=\\n##\\s|$)`, "i");
329
- const m = body.match(re);
330
- if (m === null)
331
- return "";
332
- const captured = m[1];
333
- if (captured === undefined)
334
- return "";
335
- return captured.replace(/^\s*```[a-z0-9]*\n?/i, "").replace(/```\s*$/, "").trim();
336
- }
337
- function escapeRegex(s) {
338
- return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
339
- }
340
- function atOrAbove(score, threshold) {
341
- const order = { low: 0, medium: 1, high: 2 };
342
- const scoreVal = order[score];
343
- const thresholdVal = order[threshold];
344
- if (scoreVal === undefined || thresholdVal === undefined)
345
- return false;
346
- return scoreVal >= thresholdVal;
347
- }
348
- //# sourceMappingURL=bulk-accept.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bulk-accept.js","sourceRoot":"","sources":["../../src/attention/bulk-accept.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- /**
2
- * JSON API for the triage GUI. Routes mirror the existing attention
3
- * MCP handlers (resolve / bulk-accept / dedup / restore) so all writes
4
- * funnel through `withWriteLock`.
5
- */
6
- import type { IncomingMessage, ServerResponse } from "node:http";
7
- interface Counters {
8
- accepted: number;
9
- rejected: number;
10
- merged: number;
11
- edited: number;
12
- }
13
- interface ApiCtx {
14
- repoRoot: string;
15
- counters: Counters;
16
- touch: () => void;
17
- token: string;
18
- onDone: () => void;
19
- }
20
- /**
21
- * Top-level dispatch. Always responds with JSON.
22
- */
23
- export declare function handleApi(req: IncomingMessage, res: ServerResponse, ctx: ApiCtx): Promise<void>;
24
- export {};