@isaacriehm/cairn-core 0.1.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 (616) hide show
  1. package/LICENSE +21 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/claude/error.d.ts +33 -0
  4. package/dist/claude/error.js +58 -0
  5. package/dist/claude/error.js.map +1 -0
  6. package/dist/claude/index.d.ts +3 -0
  7. package/dist/claude/index.js +3 -0
  8. package/dist/claude/index.js.map +1 -0
  9. package/dist/claude/runner.d.ts +11 -0
  10. package/dist/claude/runner.js +132 -0
  11. package/dist/claude/runner.js.map +1 -0
  12. package/dist/claude/types.d.ts +52 -0
  13. package/dist/claude/types.js +14 -0
  14. package/dist/claude/types.js.map +1 -0
  15. package/dist/context/checkpoint.d.ts +10 -0
  16. package/dist/context/checkpoint.js +29 -0
  17. package/dist/context/checkpoint.js.map +1 -0
  18. package/dist/context/handoff-builder.d.ts +11 -0
  19. package/dist/context/handoff-builder.js +268 -0
  20. package/dist/context/handoff-builder.js.map +1 -0
  21. package/dist/context/index.d.ts +11 -0
  22. package/dist/context/index.js +11 -0
  23. package/dist/context/index.js.map +1 -0
  24. package/dist/context/spec-delta.d.ts +47 -0
  25. package/dist/context/spec-delta.js +237 -0
  26. package/dist/context/spec-delta.js.map +1 -0
  27. package/dist/decision-capture/capture.d.ts +57 -0
  28. package/dist/decision-capture/capture.js +186 -0
  29. package/dist/decision-capture/capture.js.map +1 -0
  30. package/dist/decision-capture/extractor.d.ts +20 -0
  31. package/dist/decision-capture/extractor.js +103 -0
  32. package/dist/decision-capture/extractor.js.map +1 -0
  33. package/dist/decision-capture/id.d.ts +21 -0
  34. package/dist/decision-capture/id.js +60 -0
  35. package/dist/decision-capture/id.js.map +1 -0
  36. package/dist/decision-capture/index.d.ts +25 -0
  37. package/dist/decision-capture/index.js +21 -0
  38. package/dist/decision-capture/index.js.map +1 -0
  39. package/dist/decision-capture/prompt.d.ts +15 -0
  40. package/dist/decision-capture/prompt.js +68 -0
  41. package/dist/decision-capture/prompt.js.map +1 -0
  42. package/dist/decision-capture/refinement-prompt.d.ts +25 -0
  43. package/dist/decision-capture/refinement-prompt.js +146 -0
  44. package/dist/decision-capture/refinement-prompt.js.map +1 -0
  45. package/dist/decision-capture/refinement-schema.d.ts +52 -0
  46. package/dist/decision-capture/refinement-schema.js +61 -0
  47. package/dist/decision-capture/refinement-schema.js.map +1 -0
  48. package/dist/decision-capture/refinement.d.ts +60 -0
  49. package/dist/decision-capture/refinement.js +439 -0
  50. package/dist/decision-capture/refinement.js.map +1 -0
  51. package/dist/decision-capture/schema.d.ts +70 -0
  52. package/dist/decision-capture/schema.js +71 -0
  53. package/dist/decision-capture/schema.js.map +1 -0
  54. package/dist/decision-capture/types.d.ts +201 -0
  55. package/dist/decision-capture/types.js +20 -0
  56. package/dist/decision-capture/types.js.map +1 -0
  57. package/dist/decision-capture/writer.d.ts +90 -0
  58. package/dist/decision-capture/writer.js +267 -0
  59. package/dist/decision-capture/writer.js.map +1 -0
  60. package/dist/doctor/index.d.ts +48 -0
  61. package/dist/doctor/index.js +460 -0
  62. package/dist/doctor/index.js.map +1 -0
  63. package/dist/events/index.d.ts +15 -0
  64. package/dist/events/index.js +14 -0
  65. package/dist/events/index.js.map +1 -0
  66. package/dist/events/paths.d.ts +2 -0
  67. package/dist/events/paths.js +6 -0
  68. package/dist/events/paths.js.map +1 -0
  69. package/dist/events/reader.d.ts +40 -0
  70. package/dist/events/reader.js +139 -0
  71. package/dist/events/reader.js.map +1 -0
  72. package/dist/events/writer.d.ts +61 -0
  73. package/dist/events/writer.js +68 -0
  74. package/dist/events/writer.js.map +1 -0
  75. package/dist/frontend-types.d.ts +243 -0
  76. package/dist/frontend-types.js +15 -0
  77. package/dist/frontend-types.js.map +1 -0
  78. package/dist/gc/apply.d.ts +26 -0
  79. package/dist/gc/apply.js +48 -0
  80. package/dist/gc/apply.js.map +1 -0
  81. package/dist/gc/canary.d.ts +42 -0
  82. package/dist/gc/canary.js +134 -0
  83. package/dist/gc/canary.js.map +1 -0
  84. package/dist/gc/citation-integrity.d.ts +24 -0
  85. package/dist/gc/citation-integrity.js +151 -0
  86. package/dist/gc/citation-integrity.js.map +1 -0
  87. package/dist/gc/classify.d.ts +25 -0
  88. package/dist/gc/classify.js +89 -0
  89. package/dist/gc/classify.js.map +1 -0
  90. package/dist/gc/completion-integrity.d.ts +22 -0
  91. package/dist/gc/completion-integrity.js +165 -0
  92. package/dist/gc/completion-integrity.js.map +1 -0
  93. package/dist/gc/doc-gardening.d.ts +29 -0
  94. package/dist/gc/doc-gardening.js +146 -0
  95. package/dist/gc/doc-gardening.js.map +1 -0
  96. package/dist/gc/frontmatter.d.ts +35 -0
  97. package/dist/gc/frontmatter.js +105 -0
  98. package/dist/gc/frontmatter.js.map +1 -0
  99. package/dist/gc/generator-drift.d.ts +28 -0
  100. package/dist/gc/generator-drift.js +53 -0
  101. package/dist/gc/generator-drift.js.map +1 -0
  102. package/dist/gc/index.d.ts +42 -0
  103. package/dist/gc/index.js +30 -0
  104. package/dist/gc/index.js.map +1 -0
  105. package/dist/gc/quality-update.d.ts +23 -0
  106. package/dist/gc/quality-update.js +69 -0
  107. package/dist/gc/quality-update.js.map +1 -0
  108. package/dist/gc/scope-coverage.d.ts +20 -0
  109. package/dist/gc/scope-coverage.js +70 -0
  110. package/dist/gc/scope-coverage.js.map +1 -0
  111. package/dist/gc/stub-hits.d.ts +31 -0
  112. package/dist/gc/stub-hits.js +78 -0
  113. package/dist/gc/stub-hits.js.map +1 -0
  114. package/dist/gc/sweep.d.ts +56 -0
  115. package/dist/gc/sweep.js +205 -0
  116. package/dist/gc/sweep.js.map +1 -0
  117. package/dist/gc/types.d.ts +129 -0
  118. package/dist/gc/types.js +26 -0
  119. package/dist/gc/types.js.map +1 -0
  120. package/dist/gc/walk-source.d.ts +14 -0
  121. package/dist/gc/walk-source.js +59 -0
  122. package/dist/gc/walk-source.js.map +1 -0
  123. package/dist/ground/drift.d.ts +8 -0
  124. package/dist/ground/drift.js +23 -0
  125. package/dist/ground/drift.js.map +1 -0
  126. package/dist/ground/frontmatter.d.ts +20 -0
  127. package/dist/ground/frontmatter.js +49 -0
  128. package/dist/ground/frontmatter.js.map +1 -0
  129. package/dist/ground/glob.d.ts +10 -0
  130. package/dist/ground/glob.js +46 -0
  131. package/dist/ground/glob.js.map +1 -0
  132. package/dist/ground/index.d.ts +16 -0
  133. package/dist/ground/index.js +11 -0
  134. package/dist/ground/index.js.map +1 -0
  135. package/dist/ground/ledgers.d.ts +18 -0
  136. package/dist/ground/ledgers.js +103 -0
  137. package/dist/ground/ledgers.js.map +1 -0
  138. package/dist/ground/manifest.d.ts +10 -0
  139. package/dist/ground/manifest.js +88 -0
  140. package/dist/ground/manifest.js.map +1 -0
  141. package/dist/ground/paths.d.ts +20 -0
  142. package/dist/ground/paths.js +61 -0
  143. package/dist/ground/paths.js.map +1 -0
  144. package/dist/ground/quality-grades.d.ts +11 -0
  145. package/dist/ground/quality-grades.js +98 -0
  146. package/dist/ground/quality-grades.js.map +1 -0
  147. package/dist/ground/schemas.d.ts +306 -0
  148. package/dist/ground/schemas.js +188 -0
  149. package/dist/ground/schemas.js.map +1 -0
  150. package/dist/ground/scope-index.d.ts +48 -0
  151. package/dist/ground/scope-index.js +120 -0
  152. package/dist/ground/scope-index.js.map +1 -0
  153. package/dist/ground/walk.d.ts +7 -0
  154. package/dist/ground/walk.js +53 -0
  155. package/dist/ground/walk.js.map +1 -0
  156. package/dist/hooks/bypass-detection.d.ts +28 -0
  157. package/dist/hooks/bypass-detection.js +106 -0
  158. package/dist/hooks/bypass-detection.js.map +1 -0
  159. package/dist/hooks/index.d.ts +12 -0
  160. package/dist/hooks/index.js +13 -0
  161. package/dist/hooks/index.js.map +1 -0
  162. package/dist/hooks/post-tool-use/allowlist-reader.d.ts +14 -0
  163. package/dist/hooks/post-tool-use/allowlist-reader.js +69 -0
  164. package/dist/hooks/post-tool-use/allowlist-reader.js.map +1 -0
  165. package/dist/hooks/post-tool-use/citation-scanner.d.ts +23 -0
  166. package/dist/hooks/post-tool-use/citation-scanner.js +59 -0
  167. package/dist/hooks/post-tool-use/citation-scanner.js.map +1 -0
  168. package/dist/hooks/post-tool-use/copy-scanner.d.ts +25 -0
  169. package/dist/hooks/post-tool-use/copy-scanner.js +192 -0
  170. package/dist/hooks/post-tool-use/copy-scanner.js.map +1 -0
  171. package/dist/hooks/post-tool-use/index.d.ts +19 -0
  172. package/dist/hooks/post-tool-use/index.js +15 -0
  173. package/dist/hooks/post-tool-use/index.js.map +1 -0
  174. package/dist/hooks/post-tool-use/ledger-cache.d.ts +32 -0
  175. package/dist/hooks/post-tool-use/ledger-cache.js +236 -0
  176. package/dist/hooks/post-tool-use/ledger-cache.js.map +1 -0
  177. package/dist/hooks/post-tool-use/legend-builder.d.ts +15 -0
  178. package/dist/hooks/post-tool-use/legend-builder.js +84 -0
  179. package/dist/hooks/post-tool-use/legend-builder.js.map +1 -0
  180. package/dist/hooks/post-tool-use/read-enricher.d.ts +13 -0
  181. package/dist/hooks/post-tool-use/read-enricher.js +157 -0
  182. package/dist/hooks/post-tool-use/read-enricher.js.map +1 -0
  183. package/dist/hooks/post-tool-use/write-guardian.d.ts +17 -0
  184. package/dist/hooks/post-tool-use/write-guardian.js +176 -0
  185. package/dist/hooks/post-tool-use/write-guardian.js.map +1 -0
  186. package/dist/hooks/read-enrich.d.ts +6 -0
  187. package/dist/hooks/read-enrich.js +11 -0
  188. package/dist/hooks/read-enrich.js.map +1 -0
  189. package/dist/hooks/runners/index.d.ts +12 -0
  190. package/dist/hooks/runners/index.js +11 -0
  191. package/dist/hooks/runners/index.js.map +1 -0
  192. package/dist/hooks/runners/payload.d.ts +32 -0
  193. package/dist/hooks/runners/payload.js +70 -0
  194. package/dist/hooks/runners/payload.js.map +1 -0
  195. package/dist/hooks/runners/session-end.d.ts +7 -0
  196. package/dist/hooks/runners/session-end.js +42 -0
  197. package/dist/hooks/runners/session-end.js.map +1 -0
  198. package/dist/hooks/runners/session-start.d.ts +10 -0
  199. package/dist/hooks/runners/session-start.js +167 -0
  200. package/dist/hooks/runners/session-start.js.map +1 -0
  201. package/dist/hooks/runners/stop.d.ts +18 -0
  202. package/dist/hooks/runners/stop.js +165 -0
  203. package/dist/hooks/runners/stop.js.map +1 -0
  204. package/dist/hooks/session-end.d.ts +5 -0
  205. package/dist/hooks/session-end.js +10 -0
  206. package/dist/hooks/session-end.js.map +1 -0
  207. package/dist/hooks/session-start.d.ts +7 -0
  208. package/dist/hooks/session-start.js +12 -0
  209. package/dist/hooks/session-start.js.map +1 -0
  210. package/dist/hooks/stop.d.ts +5 -0
  211. package/dist/hooks/stop.js +10 -0
  212. package/dist/hooks/stop.js.map +1 -0
  213. package/dist/hooks/write-guard.d.ts +6 -0
  214. package/dist/hooks/write-guard.js +11 -0
  215. package/dist/hooks/write-guard.js.map +1 -0
  216. package/dist/inbox.d.ts +17 -0
  217. package/dist/inbox.js +30 -0
  218. package/dist/inbox.js.map +1 -0
  219. package/dist/index.d.ts +33 -0
  220. package/dist/index.js +32 -0
  221. package/dist/index.js.map +1 -0
  222. package/dist/init/baseline-audit.d.ts +71 -0
  223. package/dist/init/baseline-audit.js +377 -0
  224. package/dist/init/baseline-audit.js.map +1 -0
  225. package/dist/init/brand-setup.d.ts +44 -0
  226. package/dist/init/brand-setup.js +201 -0
  227. package/dist/init/brand-setup.js.map +1 -0
  228. package/dist/init/daemon-autostart.d.ts +16 -0
  229. package/dist/init/daemon-autostart.js +95 -0
  230. package/dist/init/daemon-autostart.js.map +1 -0
  231. package/dist/init/detect.d.ts +25 -0
  232. package/dist/init/detect.js +319 -0
  233. package/dist/init/detect.js.map +1 -0
  234. package/dist/init/index.d.ts +32 -0
  235. package/dist/init/index.js +18 -0
  236. package/dist/init/index.js.map +1 -0
  237. package/dist/init/ingest-docs.d.ts +74 -0
  238. package/dist/init/ingest-docs.js +499 -0
  239. package/dist/init/ingest-docs.js.map +1 -0
  240. package/dist/init/init.d.ts +165 -0
  241. package/dist/init/init.js +1166 -0
  242. package/dist/init/init.js.map +1 -0
  243. package/dist/init/mapper-legacy.d.ts +148 -0
  244. package/dist/init/mapper-legacy.js +238 -0
  245. package/dist/init/mapper-legacy.js.map +1 -0
  246. package/dist/init/mapper-merge.d.ts +38 -0
  247. package/dist/init/mapper-merge.js +238 -0
  248. package/dist/init/mapper-merge.js.map +1 -0
  249. package/dist/init/mapper-parallel.d.ts +48 -0
  250. package/dist/init/mapper-parallel.js +409 -0
  251. package/dist/init/mapper-parallel.js.map +1 -0
  252. package/dist/init/mapper-prompts.d.ts +135 -0
  253. package/dist/init/mapper-prompts.js +189 -0
  254. package/dist/init/mapper-prompts.js.map +1 -0
  255. package/dist/init/mapper.d.ts +211 -0
  256. package/dist/init/mapper.js +151 -0
  257. package/dist/init/mapper.js.map +1 -0
  258. package/dist/init/module-slicer.d.ts +39 -0
  259. package/dist/init/module-slicer.js +809 -0
  260. package/dist/init/module-slicer.js.map +1 -0
  261. package/dist/init/multi-dev/index.d.ts +2 -0
  262. package/dist/init/multi-dev/index.js +2 -0
  263. package/dist/init/multi-dev/index.js.map +1 -0
  264. package/dist/init/multi-dev/install.d.ts +40 -0
  265. package/dist/init/multi-dev/install.js +139 -0
  266. package/dist/init/multi-dev/install.js.map +1 -0
  267. package/dist/init/preflight-guards.d.ts +42 -0
  268. package/dist/init/preflight-guards.js +108 -0
  269. package/dist/init/preflight-guards.js.map +1 -0
  270. package/dist/init/prompts.d.ts +61 -0
  271. package/dist/init/prompts.js +66 -0
  272. package/dist/init/prompts.js.map +1 -0
  273. package/dist/init/rules-merge/discover.d.ts +21 -0
  274. package/dist/init/rules-merge/discover.js +78 -0
  275. package/dist/init/rules-merge/discover.js.map +1 -0
  276. package/dist/init/rules-merge/index.d.ts +10 -0
  277. package/dist/init/rules-merge/index.js +6 -0
  278. package/dist/init/rules-merge/index.js.map +1 -0
  279. package/dist/init/rules-merge/ingest.d.ts +56 -0
  280. package/dist/init/rules-merge/ingest.js +336 -0
  281. package/dist/init/rules-merge/ingest.js.map +1 -0
  282. package/dist/init/rules-merge/keep-markers.d.ts +39 -0
  283. package/dist/init/rules-merge/keep-markers.js +97 -0
  284. package/dist/init/rules-merge/keep-markers.js.map +1 -0
  285. package/dist/init/rules-merge/parse-sections.d.ts +24 -0
  286. package/dist/init/rules-merge/parse-sections.js +71 -0
  287. package/dist/init/rules-merge/parse-sections.js.map +1 -0
  288. package/dist/init/rules-merge/regenerate.d.ts +33 -0
  289. package/dist/init/rules-merge/regenerate.js +163 -0
  290. package/dist/init/rules-merge/regenerate.js.map +1 -0
  291. package/dist/init/secrets.d.ts +18 -0
  292. package/dist/init/secrets.js +76 -0
  293. package/dist/init/secrets.js.map +1 -0
  294. package/dist/init/seed.d.ts +21 -0
  295. package/dist/init/seed.js +96 -0
  296. package/dist/init/seed.js.map +1 -0
  297. package/dist/init/setup-runners.d.ts +15 -0
  298. package/dist/init/setup-runners.js +143 -0
  299. package/dist/init/setup-runners.js.map +1 -0
  300. package/dist/init/source-comments/classify.d.ts +98 -0
  301. package/dist/init/source-comments/classify.js +244 -0
  302. package/dist/init/source-comments/classify.js.map +1 -0
  303. package/dist/init/source-comments/index.d.ts +8 -0
  304. package/dist/init/source-comments/index.js +5 -0
  305. package/dist/init/source-comments/index.js.map +1 -0
  306. package/dist/init/source-comments/ingest.d.ts +51 -0
  307. package/dist/init/source-comments/ingest.js +236 -0
  308. package/dist/init/source-comments/ingest.js.map +1 -0
  309. package/dist/init/source-comments/strip-replace.d.ts +106 -0
  310. package/dist/init/source-comments/strip-replace.js +284 -0
  311. package/dist/init/source-comments/strip-replace.js.map +1 -0
  312. package/dist/init/source-comments/walker.d.ts +65 -0
  313. package/dist/init/source-comments/walker.js +777 -0
  314. package/dist/init/source-comments/walker.js.map +1 -0
  315. package/dist/init/submodules.d.ts +48 -0
  316. package/dist/init/submodules.js +149 -0
  317. package/dist/init/submodules.js.map +1 -0
  318. package/dist/init/types.d.ts +55 -0
  319. package/dist/init/types.js +10 -0
  320. package/dist/init/types.js.map +1 -0
  321. package/dist/init/visual.d.ts +69 -0
  322. package/dist/init/visual.js +265 -0
  323. package/dist/init/visual.js.map +1 -0
  324. package/dist/init/walker.d.ts +82 -0
  325. package/dist/init/walker.js +585 -0
  326. package/dist/init/walker.js.map +1 -0
  327. package/dist/init/workflow-block.d.ts +34 -0
  328. package/dist/init/workflow-block.js +110 -0
  329. package/dist/init/workflow-block.js.map +1 -0
  330. package/dist/join/index.d.ts +67 -0
  331. package/dist/join/index.js +256 -0
  332. package/dist/join/index.js.map +1 -0
  333. package/dist/lock.d.ts +39 -0
  334. package/dist/lock.js +129 -0
  335. package/dist/lock.js.map +1 -0
  336. package/dist/logger.d.ts +13 -0
  337. package/dist/logger.js +78 -0
  338. package/dist/logger.js.map +1 -0
  339. package/dist/mcp/bootstrap-guard.d.ts +29 -0
  340. package/dist/mcp/bootstrap-guard.js +47 -0
  341. package/dist/mcp/bootstrap-guard.js.map +1 -0
  342. package/dist/mcp/context.d.ts +23 -0
  343. package/dist/mcp/context.js +9 -0
  344. package/dist/mcp/context.js.map +1 -0
  345. package/dist/mcp/errors.d.ts +17 -0
  346. package/dist/mcp/errors.js +23 -0
  347. package/dist/mcp/errors.js.map +1 -0
  348. package/dist/mcp/history/index.d.ts +6 -0
  349. package/dist/mcp/history/index.js +5 -0
  350. package/dist/mcp/history/index.js.map +1 -0
  351. package/dist/mcp/history/prompt.d.ts +32 -0
  352. package/dist/mcp/history/prompt.js +99 -0
  353. package/dist/mcp/history/prompt.js.map +1 -0
  354. package/dist/mcp/history/schema.d.ts +58 -0
  355. package/dist/mcp/history/schema.js +41 -0
  356. package/dist/mcp/history/schema.js.map +1 -0
  357. package/dist/mcp/history/summarizer.d.ts +81 -0
  358. package/dist/mcp/history/summarizer.js +196 -0
  359. package/dist/mcp/history/summarizer.js.map +1 -0
  360. package/dist/mcp/history/walker.d.ts +57 -0
  361. package/dist/mcp/history/walker.js +156 -0
  362. package/dist/mcp/history/walker.js.map +1 -0
  363. package/dist/mcp/index.d.ts +13 -0
  364. package/dist/mcp/index.js +9 -0
  365. package/dist/mcp/index.js.map +1 -0
  366. package/dist/mcp/path-allowlist.d.ts +29 -0
  367. package/dist/mcp/path-allowlist.js +71 -0
  368. package/dist/mcp/path-allowlist.js.map +1 -0
  369. package/dist/mcp/result.d.ts +8 -0
  370. package/dist/mcp/result.js +18 -0
  371. package/dist/mcp/result.js.map +1 -0
  372. package/dist/mcp/schemas.d.ts +192 -0
  373. package/dist/mcp/schemas.js +174 -0
  374. package/dist/mcp/schemas.js.map +1 -0
  375. package/dist/mcp/serve.d.ts +15 -0
  376. package/dist/mcp/serve.js +71 -0
  377. package/dist/mcp/serve.js.map +1 -0
  378. package/dist/mcp/server.d.ts +11 -0
  379. package/dist/mcp/server.js +58 -0
  380. package/dist/mcp/server.js.map +1 -0
  381. package/dist/mcp/telemetry.d.ts +15 -0
  382. package/dist/mcp/telemetry.js +13 -0
  383. package/dist/mcp/telemetry.js.map +1 -0
  384. package/dist/mcp/tools/append-run-note.d.ts +18 -0
  385. package/dist/mcp/tools/append-run-note.js +47 -0
  386. package/dist/mcp/tools/append-run-note.js.map +1 -0
  387. package/dist/mcp/tools/append.d.ts +8 -0
  388. package/dist/mcp/tools/append.js +37 -0
  389. package/dist/mcp/tools/append.js.map +1 -0
  390. package/dist/mcp/tools/archive.d.ts +8 -0
  391. package/dist/mcp/tools/archive.js +72 -0
  392. package/dist/mcp/tools/archive.js.map +1 -0
  393. package/dist/mcp/tools/ask-operator.d.ts +34 -0
  394. package/dist/mcp/tools/ask-operator.js +97 -0
  395. package/dist/mcp/tools/ask-operator.js.map +1 -0
  396. package/dist/mcp/tools/canonical-for-topic.d.ts +6 -0
  397. package/dist/mcp/tools/canonical-for-topic.js +40 -0
  398. package/dist/mcp/tools/canonical-for-topic.js.map +1 -0
  399. package/dist/mcp/tools/decision-get.d.ts +6 -0
  400. package/dist/mcp/tools/decision-get.js +49 -0
  401. package/dist/mcp/tools/decision-get.js.map +1 -0
  402. package/dist/mcp/tools/decisions-for-symbol.d.ts +7 -0
  403. package/dist/mcp/tools/decisions-for-symbol.js +42 -0
  404. package/dist/mcp/tools/decisions-for-symbol.js.map +1 -0
  405. package/dist/mcp/tools/decisions-in-scope.d.ts +7 -0
  406. package/dist/mcp/tools/decisions-in-scope.js +47 -0
  407. package/dist/mcp/tools/decisions-in-scope.js.map +1 -0
  408. package/dist/mcp/tools/drop-task.d.ts +12 -0
  409. package/dist/mcp/tools/drop-task.js +68 -0
  410. package/dist/mcp/tools/drop-task.js.map +1 -0
  411. package/dist/mcp/tools/get-full.d.ts +7 -0
  412. package/dist/mcp/tools/get-full.js +46 -0
  413. package/dist/mcp/tools/get-full.js.map +1 -0
  414. package/dist/mcp/tools/ground-get.d.ts +7 -0
  415. package/dist/mcp/tools/ground-get.js +77 -0
  416. package/dist/mcp/tools/ground-get.js.map +1 -0
  417. package/dist/mcp/tools/index.d.ts +3 -0
  418. package/dist/mcp/tools/index.js +40 -0
  419. package/dist/mcp/tools/index.js.map +1 -0
  420. package/dist/mcp/tools/invariant-get.d.ts +6 -0
  421. package/dist/mcp/tools/invariant-get.js +49 -0
  422. package/dist/mcp/tools/invariant-get.js.map +1 -0
  423. package/dist/mcp/tools/invariants-in-scope.d.ts +7 -0
  424. package/dist/mcp/tools/invariants-in-scope.js +62 -0
  425. package/dist/mcp/tools/invariants-in-scope.js.map +1 -0
  426. package/dist/mcp/tools/query-history.d.ts +20 -0
  427. package/dist/mcp/tools/query-history.js +51 -0
  428. package/dist/mcp/tools/query-history.js.map +1 -0
  429. package/dist/mcp/tools/record-decision.d.ts +14 -0
  430. package/dist/mcp/tools/record-decision.js +98 -0
  431. package/dist/mcp/tools/record-decision.js.map +1 -0
  432. package/dist/mcp/tools/record-run-event.d.ts +10 -0
  433. package/dist/mcp/tools/record-run-event.js +32 -0
  434. package/dist/mcp/tools/record-run-event.js.map +1 -0
  435. package/dist/mcp/tools/resolve-attention.d.ts +31 -0
  436. package/dist/mcp/tools/resolve-attention.js +191 -0
  437. package/dist/mcp/tools/resolve-attention.js.map +1 -0
  438. package/dist/mcp/tools/search.d.ts +9 -0
  439. package/dist/mcp/tools/search.js +164 -0
  440. package/dist/mcp/tools/search.js.map +1 -0
  441. package/dist/mcp/tools/supersedes-chain.d.ts +6 -0
  442. package/dist/mcp/tools/supersedes-chain.js +66 -0
  443. package/dist/mcp/tools/supersedes-chain.js.map +1 -0
  444. package/dist/mcp/tools/timeline.d.ts +9 -0
  445. package/dist/mcp/tools/timeline.js +65 -0
  446. package/dist/mcp/tools/timeline.js.map +1 -0
  447. package/dist/mcp/tools/types.d.ts +9 -0
  448. package/dist/mcp/tools/types.js +2 -0
  449. package/dist/mcp/tools/types.js.map +1 -0
  450. package/dist/mirror/clone.d.ts +6 -0
  451. package/dist/mirror/clone.js +48 -0
  452. package/dist/mirror/clone.js.map +1 -0
  453. package/dist/mirror/dirty-overlap.d.ts +13 -0
  454. package/dist/mirror/dirty-overlap.js +42 -0
  455. package/dist/mirror/dirty-overlap.js.map +1 -0
  456. package/dist/mirror/index.d.ts +7 -0
  457. package/dist/mirror/index.js +7 -0
  458. package/dist/mirror/index.js.map +1 -0
  459. package/dist/mirror/paths.d.ts +18 -0
  460. package/dist/mirror/paths.js +45 -0
  461. package/dist/mirror/paths.js.map +1 -0
  462. package/dist/mirror/push.d.ts +9 -0
  463. package/dist/mirror/push.js +27 -0
  464. package/dist/mirror/push.js.map +1 -0
  465. package/dist/mirror/state.d.ts +4 -0
  466. package/dist/mirror/state.js +36 -0
  467. package/dist/mirror/state.js.map +1 -0
  468. package/dist/mirror/sync.d.ts +9 -0
  469. package/dist/mirror/sync.js +33 -0
  470. package/dist/mirror/sync.js.map +1 -0
  471. package/dist/mirror/types.d.ts +77 -0
  472. package/dist/mirror/types.js +2 -0
  473. package/dist/mirror/types.js.map +1 -0
  474. package/dist/paths/index.d.ts +23 -0
  475. package/dist/paths/index.js +50 -0
  476. package/dist/paths/index.js.map +1 -0
  477. package/dist/profiles/index.d.ts +3 -0
  478. package/dist/profiles/index.js +3 -0
  479. package/dist/profiles/index.js.map +1 -0
  480. package/dist/profiles/registry.d.ts +5 -0
  481. package/dist/profiles/registry.js +31 -0
  482. package/dist/profiles/registry.js.map +1 -0
  483. package/dist/profiles/types.d.ts +48 -0
  484. package/dist/profiles/types.js +11 -0
  485. package/dist/profiles/types.js.map +1 -0
  486. package/dist/profiles/unknown.d.ts +9 -0
  487. package/dist/profiles/unknown.js +17 -0
  488. package/dist/profiles/unknown.js.map +1 -0
  489. package/dist/prompt.d.ts +19 -0
  490. package/dist/prompt.js +50 -0
  491. package/dist/prompt.js.map +1 -0
  492. package/dist/sensors/attestation.d.ts +44 -0
  493. package/dist/sensors/attestation.js +262 -0
  494. package/dist/sensors/attestation.js.map +1 -0
  495. package/dist/sensors/catalog.d.ts +41 -0
  496. package/dist/sensors/catalog.js +123 -0
  497. package/dist/sensors/catalog.js.map +1 -0
  498. package/dist/sensors/decisions.d.ts +30 -0
  499. package/dist/sensors/decisions.js +393 -0
  500. package/dist/sensors/decisions.js.map +1 -0
  501. package/dist/sensors/diff.d.ts +27 -0
  502. package/dist/sensors/diff.js +148 -0
  503. package/dist/sensors/diff.js.map +1 -0
  504. package/dist/sensors/index.d.ts +13 -0
  505. package/dist/sensors/index.js +9 -0
  506. package/dist/sensors/index.js.map +1 -0
  507. package/dist/sensors/remediation.d.ts +20 -0
  508. package/dist/sensors/remediation.js +65 -0
  509. package/dist/sensors/remediation.js.map +1 -0
  510. package/dist/sensors/runner.d.ts +44 -0
  511. package/dist/sensors/runner.js +95 -0
  512. package/dist/sensors/runner.js.map +1 -0
  513. package/dist/sensors/structural.d.ts +30 -0
  514. package/dist/sensors/structural.js +204 -0
  515. package/dist/sensors/structural.js.map +1 -0
  516. package/dist/sensors/stub-catalog.d.ts +39 -0
  517. package/dist/sensors/stub-catalog.js +115 -0
  518. package/dist/sensors/stub-catalog.js.map +1 -0
  519. package/dist/sensors/types.d.ts +135 -0
  520. package/dist/sensors/types.js +14 -0
  521. package/dist/sensors/types.js.map +1 -0
  522. package/dist/session/events-marker.d.ts +39 -0
  523. package/dist/session/events-marker.js +74 -0
  524. package/dist/session/events-marker.js.map +1 -0
  525. package/dist/session/id.d.ts +83 -0
  526. package/dist/session/id.js +166 -0
  527. package/dist/session/id.js.map +1 -0
  528. package/dist/session/index.d.ts +14 -0
  529. package/dist/session/index.js +13 -0
  530. package/dist/session/index.js.map +1 -0
  531. package/dist/session-start/build.d.ts +53 -0
  532. package/dist/session-start/build.js +645 -0
  533. package/dist/session-start/build.js.map +1 -0
  534. package/dist/session-start/index.d.ts +18 -0
  535. package/dist/session-start/index.js +18 -0
  536. package/dist/session-start/index.js.map +1 -0
  537. package/dist/session-start/templates.d.ts +6 -0
  538. package/dist/session-start/templates.js +38 -0
  539. package/dist/session-start/templates.js.map +1 -0
  540. package/dist/status-line/format.d.ts +14 -0
  541. package/dist/status-line/format.js +40 -0
  542. package/dist/status-line/format.js.map +1 -0
  543. package/dist/status-line/index.d.ts +29 -0
  544. package/dist/status-line/index.js +14 -0
  545. package/dist/status-line/index.js.map +1 -0
  546. package/dist/status-line/reader.d.ts +13 -0
  547. package/dist/status-line/reader.js +76 -0
  548. package/dist/status-line/reader.js.map +1 -0
  549. package/dist/status-line/writer.d.ts +33 -0
  550. package/dist/status-line/writer.js +72 -0
  551. package/dist/status-line/writer.js.map +1 -0
  552. package/dist/tier0/classify.d.ts +10 -0
  553. package/dist/tier0/classify.js +110 -0
  554. package/dist/tier0/classify.js.map +1 -0
  555. package/dist/tier0/index.d.ts +2 -0
  556. package/dist/tier0/index.js +2 -0
  557. package/dist/tier0/index.js.map +1 -0
  558. package/dist/tier0/ollama.d.ts +22 -0
  559. package/dist/tier0/ollama.js +63 -0
  560. package/dist/tier0/ollama.js.map +1 -0
  561. package/dist/tier0/types.d.ts +24 -0
  562. package/dist/tier0/types.js +9 -0
  563. package/dist/tier0/types.js.map +1 -0
  564. package/dist/tightener/index.d.ts +4 -0
  565. package/dist/tightener/index.js +4 -0
  566. package/dist/tightener/index.js.map +1 -0
  567. package/dist/tightener/prompt.d.ts +3 -0
  568. package/dist/tightener/prompt.js +67 -0
  569. package/dist/tightener/prompt.js.map +1 -0
  570. package/dist/tightener/schema.d.ts +68 -0
  571. package/dist/tightener/schema.js +44 -0
  572. package/dist/tightener/schema.js.map +1 -0
  573. package/dist/tightener/tighten.d.ts +2 -0
  574. package/dist/tightener/tighten.js +66 -0
  575. package/dist/tightener/tighten.js.map +1 -0
  576. package/dist/tightener/types.d.ts +74 -0
  577. package/dist/tightener/types.js +6 -0
  578. package/dist/tightener/types.js.map +1 -0
  579. package/dist/voice/index.d.ts +4 -0
  580. package/dist/voice/index.js +4 -0
  581. package/dist/voice/index.js.map +1 -0
  582. package/dist/voice/model.d.ts +23 -0
  583. package/dist/voice/model.js +46 -0
  584. package/dist/voice/model.js.map +1 -0
  585. package/dist/voice/pipe.d.ts +9 -0
  586. package/dist/voice/pipe.js +47 -0
  587. package/dist/voice/pipe.js.map +1 -0
  588. package/dist/voice/transcribe.d.ts +3 -0
  589. package/dist/voice/transcribe.js +43 -0
  590. package/dist/voice/transcribe.js.map +1 -0
  591. package/dist/voice/types.d.ts +26 -0
  592. package/dist/voice/types.js +9 -0
  593. package/dist/voice/types.js.map +1 -0
  594. package/package.json +54 -0
  595. package/templates/.archive/README.md +67 -0
  596. package/templates/.cairn/JOIN.md +87 -0
  597. package/templates/.cairn/config/sensors.yaml +185 -0
  598. package/templates/.cairn/config/stub-patterns.yaml +231 -0
  599. package/templates/.cairn/config/trust-policy.yaml +95 -0
  600. package/templates/.cairn/config/workflow.md +230 -0
  601. package/templates/.cairn/git-hooks/commit-msg +17 -0
  602. package/templates/.cairn/git-hooks/post-commit +28 -0
  603. package/templates/.cairn/git-hooks/pre-commit +24 -0
  604. package/templates/.cairn/ground/brand/overview.md +24 -0
  605. package/templates/.cairn/ground/brand/voice.md +20 -0
  606. package/templates/.cairn/ground/canonical-map/topics.yaml +54 -0
  607. package/templates/.cairn/ground/capabilities/mcp-tools.yaml +4 -0
  608. package/templates/.cairn/ground/capabilities/skills.yaml +3 -0
  609. package/templates/.cairn/ground/capabilities/snippets.yaml +3 -0
  610. package/templates/.cairn/ground/manifest.yaml +16 -0
  611. package/templates/.cairn/ground/product/personas.yaml +4 -0
  612. package/templates/.cairn/ground/product/positioning.md +21 -0
  613. package/templates/.claude/settings.json +57 -0
  614. package/templates/.github/workflows/cairn-check.yml +31 -0
  615. package/templates/.mcp.json +8 -0
  616. package/templates/README.md +24 -0
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Copy-safety scanner for the PostToolUse Write/Edit guardian.
3
+ *
4
+ * Given a file path and its (post-Write/Edit) content, locate strings
5
+ * that look like internal-only copy leaking into a user-facing surface
6
+ * (TODO/FIXME comments inside JSX text, cairn citations, snake_case
7
+ * identifiers in display strings, internal repo paths, etc.).
8
+ *
9
+ * Implementation is intentionally regex-only — NOT a full AST. For
10
+ * `.tsx`/`.jsx` we extract the contents of string/template literals and
11
+ * the text between `>` and `<`/`{` in JSX. For `.json` we walk values
12
+ * (skipping keys). For `.html`/`.vue`/`.svelte` and any other extension
13
+ * we scan the entire content.
14
+ *
15
+ * Spec: docs/READ_ENRICHER_SPEC.md "Write Guardian" section.
16
+ */
17
+ const PATTERNS = [
18
+ { regex: /\b(TODO|FIXME|HACK|XXX|TEMP|WIP)\b/g, label: "comment-marker" },
19
+ { regex: /§V\d+/g, label: "cairn-citation-§V" },
20
+ { regex: /\bTSK-[a-z0-9-]+\b/g, label: "cairn-citation-TSK" },
21
+ { regex: /\[(PLACEHOLDER|TODO|DRAFT)\]/g, label: "draft-marker" },
22
+ {
23
+ regex: /\b[a-z][a-z0-9]*(?:_[a-z0-9]+){2,}\b/g,
24
+ label: "multi-underscore-identifier",
25
+ },
26
+ // Internal path: matches a leading separator (start, whitespace, quote, or
27
+ // backtick) followed by `src/` | `packages/` | `.cairn/`. The whole
28
+ // match is recorded verbatim (including the leading char) so allowlist
29
+ // authoring is consistent — see scanForCopyLeakage callers.
30
+ {
31
+ regex: /(?:^|[\s"'`])(src\/|packages\/|\.cairn\/)/g,
32
+ label: "internal-path",
33
+ },
34
+ ];
35
+ /**
36
+ * Compute 1-indexed line number of an absolute character index within `content`.
37
+ */
38
+ function lineForIndex(content, absIndex) {
39
+ let line = 1;
40
+ const cap = Math.min(absIndex, content.length);
41
+ for (let i = 0; i < cap; i++) {
42
+ if (content.charCodeAt(i) === 0x0a)
43
+ line++;
44
+ }
45
+ return line;
46
+ }
47
+ function getExt(filePath) {
48
+ const lastSlash = filePath.lastIndexOf("/");
49
+ const tail = lastSlash >= 0 ? filePath.slice(lastSlash + 1) : filePath;
50
+ const dot = tail.lastIndexOf(".");
51
+ if (dot < 0)
52
+ return "";
53
+ return tail.slice(dot).toLowerCase();
54
+ }
55
+ /**
56
+ * For .tsx/.jsx: extract regions worth scanning — the inside of every
57
+ * single-quote, double-quote, and backtick literal, plus JSX text
58
+ * positions. Strict correctness vs. a real parser is not the goal; we
59
+ * accept some false positives (e.g. matches inside non-display strings)
60
+ * — the allowlist is the escape valve.
61
+ */
62
+ function jsxRegions(content) {
63
+ const regions = [];
64
+ // Capture string and template literal contents.
65
+ const literalRe = /(['"`])((?:\\.|(?!\1)[\s\S])*)\1/g;
66
+ for (const m of content.matchAll(literalRe)) {
67
+ const inner = m[2];
68
+ if (typeof inner !== "string" || inner.length === 0)
69
+ continue;
70
+ if (m.index === undefined)
71
+ continue;
72
+ // +1 to skip past the opening quote/backtick to where `inner` starts.
73
+ regions.push({ text: inner, baseOffset: m.index + 1 });
74
+ }
75
+ // Capture JSX text positions — `>...<` and `>...{` runs.
76
+ const jsxTextRe = />([^<{]+)</g;
77
+ for (const m of content.matchAll(jsxTextRe)) {
78
+ const inner = m[1];
79
+ if (typeof inner !== "string" || inner.length === 0)
80
+ continue;
81
+ if (m.index === undefined)
82
+ continue;
83
+ regions.push({ text: inner, baseOffset: m.index + 1 });
84
+ }
85
+ return regions;
86
+ }
87
+ /**
88
+ * For .json: walk parsed values (NOT keys). On parse failure, fall back
89
+ * to a regex over `: "..."` value-position strings.
90
+ */
91
+ function jsonRegions(content) {
92
+ const regions = [];
93
+ let parsed;
94
+ try {
95
+ parsed = JSON.parse(content);
96
+ }
97
+ catch {
98
+ parsed = undefined;
99
+ }
100
+ if (parsed !== undefined) {
101
+ const stringValues = [];
102
+ const visit = (node) => {
103
+ if (typeof node === "string") {
104
+ stringValues.push(node);
105
+ return;
106
+ }
107
+ if (Array.isArray(node)) {
108
+ for (const v of node)
109
+ visit(v);
110
+ return;
111
+ }
112
+ if (node !== null && typeof node === "object") {
113
+ for (const v of Object.values(node))
114
+ visit(v);
115
+ }
116
+ };
117
+ visit(parsed);
118
+ // For each string value, locate its first occurrence as a JSON
119
+ // value-position substring (`"<value>"`) for accurate line numbers.
120
+ for (const sv of stringValues) {
121
+ if (sv.length === 0)
122
+ continue;
123
+ // Best-effort: search for the literal value enclosed in quotes.
124
+ // Simple identity match — JSON-escape sequences may shift, but
125
+ // the line number derived will still point at the right block in
126
+ // practice. False positives here just produce slightly wrong
127
+ // lines, never wrong matches.
128
+ const escaped = JSON.stringify(sv);
129
+ const idx = content.indexOf(escaped);
130
+ if (idx < 0)
131
+ continue;
132
+ regions.push({ text: sv, baseOffset: idx + 1 });
133
+ }
134
+ return regions;
135
+ }
136
+ // Fallback: regex over value-position strings.
137
+ const valueRe = /:\s*"((?:\\.|[^"\\])*)"/g;
138
+ for (const m of content.matchAll(valueRe)) {
139
+ const inner = m[1];
140
+ if (typeof inner !== "string" || inner.length === 0)
141
+ continue;
142
+ if (m.index === undefined)
143
+ continue;
144
+ // Locate the offset of the captured value's opening quote.
145
+ const matchText = m[0];
146
+ const quoteIdx = matchText.indexOf('"');
147
+ if (quoteIdx < 0)
148
+ continue;
149
+ regions.push({ text: inner, baseOffset: m.index + quoteIdx + 1 });
150
+ }
151
+ return regions;
152
+ }
153
+ function scanRegion(region, content, out) {
154
+ for (const { regex, label } of PATTERNS) {
155
+ // Each pattern uses /g; reset lastIndex via fresh matchAll on the slice.
156
+ for (const m of region.text.matchAll(regex)) {
157
+ if (m.index === undefined)
158
+ continue;
159
+ const matchText = m[0];
160
+ if (matchText.length === 0)
161
+ continue;
162
+ const absIndex = region.baseOffset + m.index;
163
+ out.push({
164
+ line: lineForIndex(content, absIndex),
165
+ match: matchText,
166
+ pattern: label,
167
+ });
168
+ }
169
+ }
170
+ }
171
+ export function scanForCopyLeakage(content, filePath) {
172
+ if (content.length === 0)
173
+ return [];
174
+ const ext = getExt(filePath);
175
+ const issues = [];
176
+ let regions;
177
+ if (ext === ".tsx" || ext === ".jsx") {
178
+ regions = jsxRegions(content);
179
+ }
180
+ else if (ext === ".json") {
181
+ regions = jsonRegions(content);
182
+ }
183
+ else {
184
+ // .html, .vue, .svelte, and default fallback — scan everything.
185
+ regions = [{ text: content, baseOffset: 0 }];
186
+ }
187
+ for (const region of regions) {
188
+ scanRegion(region, content, issues);
189
+ }
190
+ return issues;
191
+ }
192
+ //# sourceMappingURL=copy-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-scanner.js","sourceRoot":"","sources":["../../../src/hooks/post-tool-use/copy-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * PostToolUse hook handlers.
3
+ *
4
+ * Exposes the Read enricher (`runReadEnricher`), the Write guardian
5
+ * (`runWriteGuardian`), and their shared helpers.
6
+ * Spec: docs/READ_ENRICHER_SPEC.md.
7
+ */
8
+ export { runReadEnricher } from "./read-enricher.js";
9
+ export { scanCitations } from "./citation-scanner.js";
10
+ export type { ScannedCitations, CitationMatch } from "./citation-scanner.js";
11
+ export { getInvariantsLedger, getScopeIndexEntry, lookupTask, } from "./ledger-cache.js";
12
+ export type { LedgerSnapshot, ScopeIndexEntry, TaskLookupResult, } from "./ledger-cache.js";
13
+ export { buildLegend } from "./legend-builder.js";
14
+ export type { ScopeIndexHint } from "./legend-builder.js";
15
+ export { runWriteGuardian } from "./write-guardian.js";
16
+ export { scanForCopyLeakage } from "./copy-scanner.js";
17
+ export type { CopyIssue } from "./copy-scanner.js";
18
+ export { readCopySafetyConfig } from "./allowlist-reader.js";
19
+ export type { CopySafetyConfig } from "./allowlist-reader.js";
@@ -0,0 +1,15 @@
1
+ /**
2
+ * PostToolUse hook handlers.
3
+ *
4
+ * Exposes the Read enricher (`runReadEnricher`), the Write guardian
5
+ * (`runWriteGuardian`), and their shared helpers.
6
+ * Spec: docs/READ_ENRICHER_SPEC.md.
7
+ */
8
+ export { runReadEnricher } from "./read-enricher.js";
9
+ export { scanCitations } from "./citation-scanner.js";
10
+ export { getInvariantsLedger, getScopeIndexEntry, lookupTask, } from "./ledger-cache.js";
11
+ export { buildLegend } from "./legend-builder.js";
12
+ export { runWriteGuardian } from "./write-guardian.js";
13
+ export { scanForCopyLeakage } from "./copy-scanner.js";
14
+ export { readCopySafetyConfig } from "./allowlist-reader.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/post-tool-use/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,GACX,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Per-process LRU cache (max 1 entry) for the invariants ledger and
3
+ * task-status lookups consumed by the read-enricher hook. All disk
4
+ * reads here are best-effort: any failure returns null/not_found so
5
+ * the hook stays a no-op.
6
+ */
7
+ import { type ScopeIndexEntry } from "../../ground/scope-index.js";
8
+ export type { ScopeIndexEntry } from "../../ground/scope-index.js";
9
+ export interface LedgerSnapshot {
10
+ invariantsByid: Map<string, {
11
+ title: string;
12
+ status: string;
13
+ superseded_by?: string;
14
+ }>;
15
+ }
16
+ export interface TaskLookupResult {
17
+ found: "active" | "done" | "not_found";
18
+ title?: string;
19
+ }
20
+ export declare function getInvariantsLedger(repoRoot: string): LedgerSnapshot | null;
21
+ export declare function lookupTask(repoRoot: string, taskId: string): TaskLookupResult;
22
+ /**
23
+ * Cached scope-index reader. Content-keyed (sha256 of first 512 bytes) so
24
+ * back-to-back hook invocations in the same process don't re-parse the file
25
+ * AND so daemon writes that happen within the same mtime tick are not
26
+ * silently masked by a stale cache hit (Gap 6 in BUILD_REPORT).
27
+ *
28
+ * Returns null when the file is missing, when no entry matches the path,
29
+ * when the entry is explicitly `unscoped: true`, or when the entry has no
30
+ * decisions/invariants — i.e., when there is nothing useful to surface.
31
+ */
32
+ export declare function getScopeIndexEntry(repoRoot: string, repoRelativePath: string): ScopeIndexEntry | null;
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Per-process LRU cache (max 1 entry) for the invariants ledger and
3
+ * task-status lookups consumed by the read-enricher hook. All disk
4
+ * reads here are best-effort: any failure returns null/not_found so
5
+ * the hook stays a no-op.
6
+ */
7
+ import { createHash } from "node:crypto";
8
+ import { existsSync, openSync, readFileSync, readSync, closeSync, statSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { parse as parseYaml } from "yaml";
11
+ import { lookupScope, readScopeIndex, scopeIndexPath, } from "../../ground/scope-index.js";
12
+ const SCOPE_INDEX_HASH_BYTES = 512;
13
+ /**
14
+ * Hash the first N bytes of a file. Returns null when the file can't be read.
15
+ * Used as the cache key for scope-index — mtime is unreliable under clock skew
16
+ * (daemon writes can land with the same mtime as the previous read).
17
+ */
18
+ function hashFilePrefix(path, bytes) {
19
+ let fd;
20
+ try {
21
+ fd = openSync(path, "r");
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ try {
27
+ const buf = Buffer.alloc(bytes);
28
+ const read = readSync(fd, buf, 0, bytes, 0);
29
+ return createHash("sha256")
30
+ .update(buf.subarray(0, read))
31
+ .digest("hex");
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ finally {
37
+ try {
38
+ closeSync(fd);
39
+ }
40
+ catch {
41
+ // ignore — best-effort
42
+ }
43
+ }
44
+ }
45
+ let invariantsCache = null;
46
+ let activeTasksCache = null;
47
+ let doneTasksCache = null;
48
+ let scopeIndexCache = null;
49
+ function invariantsLedgerFile(repoRoot) {
50
+ return join(repoRoot, ".cairn", "ground", "invariants", "invariants.ledger.yaml");
51
+ }
52
+ export function getInvariantsLedger(repoRoot) {
53
+ const path = invariantsLedgerFile(repoRoot);
54
+ if (!existsSync(path))
55
+ return null;
56
+ let mtimeMs;
57
+ try {
58
+ mtimeMs = statSync(path).mtimeMs;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ if (invariantsCache !== null &&
64
+ invariantsCache.repoRoot === repoRoot &&
65
+ invariantsCache.mtimeMs === mtimeMs) {
66
+ return invariantsCache.snapshot;
67
+ }
68
+ let parsed;
69
+ try {
70
+ parsed = parseYaml(readFileSync(path, "utf8"));
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ if (!Array.isArray(parsed))
76
+ return null;
77
+ const map = new Map();
78
+ for (const raw of parsed) {
79
+ if (typeof raw !== "object" || raw === null)
80
+ continue;
81
+ const r = raw;
82
+ const id = typeof r["id"] === "string" ? r["id"] : null;
83
+ const title = typeof r["title"] === "string" ? r["title"] : "";
84
+ const status = typeof r["status"] === "string" ? r["status"] : "active";
85
+ const supersededByRaw = r["superseded_by"];
86
+ const supersededBy = typeof supersededByRaw === "string" && supersededByRaw.length > 0
87
+ ? supersededByRaw
88
+ : undefined;
89
+ if (id === null)
90
+ continue;
91
+ map.set(id, {
92
+ title,
93
+ status,
94
+ ...(supersededBy !== undefined ? { superseded_by: supersededBy } : {}),
95
+ });
96
+ }
97
+ const snapshot = { invariantsByid: map };
98
+ invariantsCache = { repoRoot, mtimeMs, snapshot };
99
+ return snapshot;
100
+ }
101
+ function tasksScopeDir(repoRoot, scope) {
102
+ return join(repoRoot, ".cairn", "tasks", scope);
103
+ }
104
+ function readDirMtime(path) {
105
+ if (!existsSync(path))
106
+ return null;
107
+ try {
108
+ return statSync(path).mtimeMs;
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ }
114
+ function extractTitle(taskDir) {
115
+ const candidates = [
116
+ join(taskDir, "spec.tightened.md"),
117
+ join(taskDir, "spec.md"),
118
+ ];
119
+ for (const c of candidates) {
120
+ if (!existsSync(c))
121
+ continue;
122
+ try {
123
+ const text = readFileSync(c, "utf8");
124
+ const m = text.match(/^#\s+(.+)$/m);
125
+ if (m && typeof m[1] === "string")
126
+ return m[1].trim();
127
+ }
128
+ catch {
129
+ // ignore — try next candidate
130
+ }
131
+ }
132
+ return "";
133
+ }
134
+ function resolveCacheForScope(repoRoot, scope) {
135
+ const dir = tasksScopeDir(repoRoot, scope);
136
+ const mtimeMs = readDirMtime(dir);
137
+ if (mtimeMs === null)
138
+ return null;
139
+ const cache = scope === "active" ? activeTasksCache : doneTasksCache;
140
+ if (cache !== null &&
141
+ cache.repoRoot === repoRoot &&
142
+ cache.scope === scope &&
143
+ cache.mtimeMs === mtimeMs) {
144
+ return cache;
145
+ }
146
+ // Lazy: don't pre-walk all task dirs. We populate `titles` on demand
147
+ // in `lookupTask`. Empty map keyed to current dir mtime is fine.
148
+ const fresh = {
149
+ repoRoot,
150
+ scope,
151
+ mtimeMs,
152
+ titles: new Map(),
153
+ };
154
+ if (scope === "active")
155
+ activeTasksCache = fresh;
156
+ else
157
+ doneTasksCache = fresh;
158
+ return fresh;
159
+ }
160
+ export function lookupTask(repoRoot, taskId) {
161
+ // Active first.
162
+ const activeDir = tasksScopeDir(repoRoot, "active");
163
+ const activeTaskDir = join(activeDir, taskId);
164
+ if (existsSync(activeTaskDir)) {
165
+ const cache = resolveCacheForScope(repoRoot, "active");
166
+ if (cache !== null) {
167
+ let title = cache.titles.get(taskId);
168
+ if (title === undefined) {
169
+ title = extractTitle(activeTaskDir);
170
+ cache.titles.set(taskId, title);
171
+ }
172
+ return title.length > 0
173
+ ? { found: "active", title }
174
+ : { found: "active" };
175
+ }
176
+ // Couldn't cache, but the dir is present.
177
+ const title = extractTitle(activeTaskDir);
178
+ return title.length > 0 ? { found: "active", title } : { found: "active" };
179
+ }
180
+ const doneDir = tasksScopeDir(repoRoot, "done");
181
+ const doneTaskDir = join(doneDir, taskId);
182
+ if (existsSync(doneTaskDir)) {
183
+ const cache = resolveCacheForScope(repoRoot, "done");
184
+ if (cache !== null) {
185
+ let title = cache.titles.get(taskId);
186
+ if (title === undefined) {
187
+ title = extractTitle(doneTaskDir);
188
+ cache.titles.set(taskId, title);
189
+ }
190
+ return title.length > 0 ? { found: "done", title } : { found: "done" };
191
+ }
192
+ const title = extractTitle(doneTaskDir);
193
+ return title.length > 0 ? { found: "done", title } : { found: "done" };
194
+ }
195
+ return { found: "not_found" };
196
+ }
197
+ /**
198
+ * Cached scope-index reader. Content-keyed (sha256 of first 512 bytes) so
199
+ * back-to-back hook invocations in the same process don't re-parse the file
200
+ * AND so daemon writes that happen within the same mtime tick are not
201
+ * silently masked by a stale cache hit (Gap 6 in BUILD_REPORT).
202
+ *
203
+ * Returns null when the file is missing, when no entry matches the path,
204
+ * when the entry is explicitly `unscoped: true`, or when the entry has no
205
+ * decisions/invariants — i.e., when there is nothing useful to surface.
206
+ */
207
+ export function getScopeIndexEntry(repoRoot, repoRelativePath) {
208
+ const path = scopeIndexPath(repoRoot);
209
+ if (!existsSync(path))
210
+ return null;
211
+ const contentHash = hashFilePrefix(path, SCOPE_INDEX_HASH_BYTES);
212
+ if (contentHash === null)
213
+ return null;
214
+ let index;
215
+ if (scopeIndexCache !== null &&
216
+ scopeIndexCache.repoRoot === repoRoot &&
217
+ scopeIndexCache.contentHash === contentHash) {
218
+ index = scopeIndexCache.index;
219
+ }
220
+ else {
221
+ const fresh = readScopeIndex(repoRoot);
222
+ if (fresh === null)
223
+ return null;
224
+ scopeIndexCache = { repoRoot, contentHash, index: fresh };
225
+ index = fresh;
226
+ }
227
+ const entry = lookupScope(index, repoRelativePath);
228
+ if (entry === null)
229
+ return null;
230
+ if (entry.unscoped === true)
231
+ return null;
232
+ if (entry.decisions.length === 0 && entry.invariants.length === 0)
233
+ return null;
234
+ return entry;
235
+ }
236
+ //# sourceMappingURL=ledger-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-cache.js","sourceRoot":"","sources":["../../../src/hooks/post-tool-use/ledger-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Renders the boxed citation legend that the read-enricher prepends to
3
+ * the agent's view via Shape-B `additionalContext`. Per
4
+ * READ_ENRICHER_SPEC §6.1 the legend includes a scope-index header
5
+ * (decisions/invariants in scope) when one was found for the file.
6
+ */
7
+ import type { ScannedCitations } from "./citation-scanner.js";
8
+ import type { LedgerSnapshot, TaskLookupResult } from "./ledger-cache.js";
9
+ export interface ScopeIndexHint {
10
+ /** DEC-IDs in scope for the file. */
11
+ decisions: string[];
12
+ /** Invariant IDs in scope (e.g. "V0041"). */
13
+ invariants: string[];
14
+ }
15
+ export declare function buildLegend(matches: ScannedCitations, ledger: LedgerSnapshot | null, scopeHint: ScopeIndexHint | null, resolveTask: (taskId: string) => TaskLookupResult): string | null;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Renders the boxed citation legend that the read-enricher prepends to
3
+ * the agent's view via Shape-B `additionalContext`. Per
4
+ * READ_ENRICHER_SPEC §6.1 the legend includes a scope-index header
5
+ * (decisions/invariants in scope) when one was found for the file.
6
+ */
7
+ const TOP_BORDER = "┌─ cairn citations ────────────────────────────┐";
8
+ const BOTTOM_BORDER = "└───────────────────────────────────────────┘";
9
+ const SIDE = "│";
10
+ function row(content) {
11
+ return `${SIDE} ${content}`;
12
+ }
13
+ export function buildLegend(matches, ledger, scopeHint, resolveTask) {
14
+ const hasScopeHint = scopeHint !== null &&
15
+ (scopeHint.decisions.length > 0 || scopeHint.invariants.length > 0);
16
+ const hasCitations = matches.invariants.length > 0 ||
17
+ matches.todos.length > 0 ||
18
+ matches.decIds.length > 0;
19
+ if (!hasScopeHint && !hasCitations)
20
+ return null;
21
+ const lines = [];
22
+ lines.push(TOP_BORDER);
23
+ if (scopeHint !== null &&
24
+ Array.isArray(scopeHint.decisions) &&
25
+ scopeHint.decisions.length > 0) {
26
+ lines.push(row(`Decisions in scope: ${scopeHint.decisions.join(", ")}`));
27
+ }
28
+ if (scopeHint !== null &&
29
+ Array.isArray(scopeHint.invariants) &&
30
+ scopeHint.invariants.length > 0) {
31
+ const formatted = scopeHint.invariants
32
+ .map((v) => (v.startsWith("§") ? v : `§${v}`))
33
+ .join(", ");
34
+ lines.push(row(`Invariants in scope: ${formatted}`));
35
+ }
36
+ for (const inv of matches.invariants) {
37
+ lines.push(row(renderInvariant(inv.id, ledger)));
38
+ }
39
+ for (const todo of matches.todos) {
40
+ lines.push(row(renderTodo(todo.id, resolveTask(todo.id))));
41
+ }
42
+ for (const dec of matches.decIds) {
43
+ lines.push(row(`${dec.id} → [POLICY VIOLATION — DEC-id comments banned]`));
44
+ }
45
+ lines.push(BOTTOM_BORDER);
46
+ return lines.join("\n");
47
+ }
48
+ function renderInvariant(id, ledger) {
49
+ // id arrives as "V0023" — display with the §-prefix.
50
+ const label = `§${id}`;
51
+ if (ledger === null) {
52
+ return `${label} → [NOT FOUND — orphaned citation, GC will flag]`;
53
+ }
54
+ const entry = ledger.invariantsByid.get(id);
55
+ if (!entry) {
56
+ return `${label} → [NOT FOUND — orphaned citation, GC will flag]`;
57
+ }
58
+ if (entry.superseded_by !== undefined && entry.superseded_by.length > 0) {
59
+ const sup = entry.superseded_by.startsWith("V")
60
+ ? `§${entry.superseded_by}`
61
+ : entry.superseded_by;
62
+ return `${label} → [SUPERSEDED by ${sup} — update this citation]`;
63
+ }
64
+ if (entry.status === "superseded") {
65
+ return `${label} → [SUPERSEDED — update this citation]`;
66
+ }
67
+ const title = entry.title.length > 0 ? entry.title : "(no title)";
68
+ return `${label} → ${title} [active]`;
69
+ }
70
+ function renderTodo(id, result) {
71
+ // id arrives as "TSK-<id>" — display in the TODO(...) form.
72
+ const label = `TODO(${id})`;
73
+ if (result.found === "not_found") {
74
+ return `${label} → [NOT FOUND]`;
75
+ }
76
+ const title = result.title !== undefined && result.title.length > 0
77
+ ? result.title
78
+ : id;
79
+ if (result.found === "done") {
80
+ return `${label} → ${title} [DONE — this TODO can be removed]`;
81
+ }
82
+ return `${label} → ${title} [active]`;
83
+ }
84
+ //# sourceMappingURL=legend-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legend-builder.js","sourceRoot":"","sources":["../../../src/hooks/post-tool-use/legend-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,UAAU,GAAG,kDAAkD,CAAC;AACtE,MAAM,aAAa,GAAG,+CAA+C,CAAC;AACtE,MAAM,IAAI,GAAG,GAAG,CAAC;AAEjB,SAAS,GAAG,CAAC,OAAe;IAC1B,OAAO,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAyB,EACzB,MAA6B,EAC7B,SAAgC,EAChC,WAAiD;IAEjD,MAAM,YAAY,GAChB,SAAS,KAAK,IAAI;QAClB,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtE,MAAM,YAAY,GAChB,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAE5B,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAEhD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEvB,IACE,SAAS,KAAK,IAAI;QAClB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;QAClC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAC9B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,IACE,SAAS,KAAK,IAAI;QAClB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC;QACnC,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAC/B,CAAC;QACD,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC7C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,gDAAgD,CAAC,CAC/D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,eAAe,CAAC,EAAU,EAAE,MAA6B;IAChE,qDAAqD;IACrD,MAAM,KAAK,GAAG,IAAI,EAAE,EAAE,CAAC;IACvB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,GAAG,KAAK,kDAAkD,CAAC;IACpE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,GAAG,KAAK,kDAAkD,CAAC;IACpE,CAAC;IACD,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC;YAC7C,CAAC,CAAC,IAAI,KAAK,CAAC,aAAa,EAAE;YAC3B,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;QACxB,OAAO,GAAG,KAAK,qBAAqB,GAAG,0BAA0B,CAAC;IACpE,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QAClC,OAAO,GAAG,KAAK,wCAAwC,CAAC;IAC1D,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;IAClE,OAAO,GAAG,KAAK,MAAM,KAAK,YAAY,CAAC;AACzC,CAAC;AAED,SAAS,UAAU,CAAC,EAAU,EAAE,MAAwB;IACtD,4DAA4D;IAC5D,MAAM,KAAK,GAAG,QAAQ,EAAE,GAAG,CAAC;IAC5B,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,GAAG,KAAK,gBAAgB,CAAC;IAClC,CAAC;IACD,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACnD,CAAC,CAAC,MAAM,CAAC,KAAK;QACd,CAAC,CAAC,EAAE,CAAC;IACT,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,GAAG,KAAK,MAAM,KAAK,qCAAqC,CAAC;IAClE,CAAC;IACD,OAAO,GAAG,KAAK,MAAM,KAAK,YAAY,CAAC;AACzC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `cairn hook read-enrich` — PostToolUse hook on the Read tool.
3
+ *
4
+ * Scans the file content the agent just read for cairn citation
5
+ * patterns (`§V<N>`, `TODO(TSK-<id>)`, banned `DEC-<N>`) and prepends a
6
+ * legend block via Claude Code's documented Shape-B `additionalContext`
7
+ * field so the agent sees authoritative resolutions inline with the
8
+ * file content. No MCP round-trip; all sources read directly from
9
+ * `.cairn/` on disk.
10
+ *
11
+ * Spec: docs/READ_ENRICHER_SPEC.md
12
+ */
13
+ export declare function runReadEnricher(): Promise<void>;