@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,70 @@
1
+ /**
2
+ * GC pass — scope-coverage.
3
+ *
4
+ * Surfaces drift between the source tree and `.cairn/ground/scope-index.yaml`:
5
+ * 1. Source files with no scope-index entry → `scope_uncovered`.
6
+ * 2. Index entries pointing at paths that no longer exist → `scope_drift_orphan`.
7
+ *
8
+ * If the scope-index file itself is missing, emits a single
9
+ * `scope_index_missing` finding telling the operator to rebuild it.
10
+ *
11
+ * Spec: docs/DOCS_SPEC.md §3.8.
12
+ */
13
+ import { existsSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { lookupScope, readScopeIndex } from "../ground/scope-index.js";
16
+ import { walkSourceTree } from "./walk-source.js";
17
+ const PASS_ID = "scope-coverage";
18
+ const MAX_FINDINGS_PER_KIND = 50;
19
+ export function runScopeCoverage(opts) {
20
+ const findings = [];
21
+ const index = readScopeIndex(opts.repoRoot);
22
+ if (index === null) {
23
+ findings.push({
24
+ pass: PASS_ID,
25
+ kind: "scope_index_missing",
26
+ path: ".cairn/ground/scope-index.yaml",
27
+ detail: "scope-index.yaml not found — run `cairn scope rebuild` to populate",
28
+ severity: "warn",
29
+ });
30
+ return { findings };
31
+ }
32
+ // 1. Files in the source tree without an entry.
33
+ const sourceFiles = walkSourceTree(opts.repoRoot);
34
+ let uncoveredCount = 0;
35
+ for (const rel of sourceFiles) {
36
+ if (uncoveredCount >= MAX_FINDINGS_PER_KIND)
37
+ break;
38
+ const entry = lookupScope(index, rel);
39
+ if (entry === null) {
40
+ findings.push({
41
+ pass: PASS_ID,
42
+ kind: "scope_uncovered",
43
+ path: rel,
44
+ detail: `${rel} has no scope-index entry — uncovered by decisions/invariants mapping`,
45
+ severity: "warn",
46
+ });
47
+ uncoveredCount++;
48
+ }
49
+ // entry.unscoped === true is fine — the operator explicitly marked it.
50
+ }
51
+ // 2. Index entries pointing at missing files.
52
+ let orphanCount = 0;
53
+ for (const path of Object.keys(index.files)) {
54
+ if (orphanCount >= MAX_FINDINGS_PER_KIND)
55
+ break;
56
+ const abs = join(opts.repoRoot, path);
57
+ if (!existsSync(abs)) {
58
+ findings.push({
59
+ pass: PASS_ID,
60
+ kind: "scope_drift_orphan",
61
+ path,
62
+ detail: `${path} appears in scope-index but does not exist in the working tree`,
63
+ severity: "warn",
64
+ });
65
+ orphanCount++;
66
+ }
67
+ }
68
+ return { findings };
69
+ }
70
+ //# sourceMappingURL=scope-coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-coverage.js","sourceRoot":"","sources":["../../src/gc/scope-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,OAAO,GAAG,gBAAyB,CAAC;AAC1C,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAUjC,MAAM,UAAU,gBAAgB,CAC9B,IAA0B;IAE1B,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE,gCAAgC;YACtC,MAAM,EACJ,oEAAoE;YACtE,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QACH,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,gDAAgD;IAChD,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,cAAc,IAAI,qBAAqB;YAAE,MAAM;QACnD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,GAAG;gBACT,MAAM,EAAE,GAAG,GAAG,uEAAuE;gBACrF,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAC;YACH,cAAc,EAAE,CAAC;QACnB,CAAC;QACD,uEAAuE;IACzE,CAAC;IAED,8CAA8C;IAC9C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,IAAI,WAAW,IAAI,qBAAqB;YAAE,MAAM;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,oBAAoB;gBAC1B,IAAI;gBACJ,MAAM,EAAE,GAAG,IAAI,gEAAgE;gBAC/E,QAAQ,EAAE,MAAM;aACjB,CAAC,CAAC;YACH,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * GC pass 3 — stub-catalog hits (full-tree scan).
3
+ *
4
+ * Layer A in `cairn/src/sensors/stub-catalog.ts` only flags genuinely-NEW
5
+ * stubs (added lines per diff). That keeps per-task feedback tight and avoids
6
+ * paying for pre-existing debt over and over.
7
+ *
8
+ * GC closes the loop on accumulated debt: walks the canonical zone and runs
9
+ * the same regex catalog against every file's CURRENT content. Hits become
10
+ * findings the operator can triage. Phase 12 v1 surfaces only — opening a
11
+ * targeted refactor commit (per spec) requires generating a diff that actually
12
+ * fixes the stub, which needs an agent. That belongs in Phase 14+.
13
+ */
14
+ import type { SensorLanguage, StubCatalog } from "../sensors/types.js";
15
+ import type { GcFinding } from "./types.js";
16
+ export interface StubCatalogHitsOptions {
17
+ repoRoot: string;
18
+ /** Languages active for this profile. Filters which patterns run. */
19
+ languages?: readonly SensorLanguage[];
20
+ /** Pre-loaded catalog (smoke convenience). Otherwise loaded from project. */
21
+ catalog?: StubCatalog;
22
+ /**
23
+ * Cap on file size to scan (bytes). Files larger than this are skipped to
24
+ * keep the pass cheap on big artifacts. Default 256 KB.
25
+ */
26
+ maxFileBytes?: number;
27
+ }
28
+ export interface StubCatalogHitsResult {
29
+ findings: GcFinding[];
30
+ }
31
+ export declare function runStubCatalogHits(opts: StubCatalogHitsOptions): StubCatalogHitsResult;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * GC pass 3 — stub-catalog hits (full-tree scan).
3
+ *
4
+ * Layer A in `cairn/src/sensors/stub-catalog.ts` only flags genuinely-NEW
5
+ * stubs (added lines per diff). That keeps per-task feedback tight and avoids
6
+ * paying for pre-existing debt over and over.
7
+ *
8
+ * GC closes the loop on accumulated debt: walks the canonical zone and runs
9
+ * the same regex catalog against every file's CURRENT content. Hits become
10
+ * findings the operator can triage. Phase 12 v1 surfaces only — opening a
11
+ * targeted refactor commit (per spec) requires generating a diff that actually
12
+ * fixes the stub, which needs an agent. That belongs in Phase 14+.
13
+ */
14
+ import { readFileSync } from "node:fs";
15
+ import { resolve } from "node:path";
16
+ import { loadStubCatalog } from "../sensors/catalog.js";
17
+ import { detectLanguage } from "../sensors/stub-catalog.js";
18
+ import { walkSourceTree } from "./walk-source.js";
19
+ const PASS_ID = "stub-catalog-hits";
20
+ export function runStubCatalogHits(opts) {
21
+ const findings = [];
22
+ const catalog = opts.catalog ?? loadStubCatalog(opts.repoRoot);
23
+ const allowedLangs = opts.languages;
24
+ const maxBytes = opts.maxFileBytes ?? 256 * 1024;
25
+ const files = walkSourceTree(opts.repoRoot);
26
+ for (const rel of files) {
27
+ const lang = detectLanguage(rel);
28
+ if (lang === undefined)
29
+ continue;
30
+ if (allowedLangs !== undefined && !allowedLangs.includes(lang))
31
+ continue;
32
+ const abs = resolve(opts.repoRoot, rel);
33
+ let content;
34
+ try {
35
+ const buf = readFileSync(abs);
36
+ if (buf.length > maxBytes)
37
+ continue;
38
+ content = buf.toString("utf8");
39
+ }
40
+ catch {
41
+ continue;
42
+ }
43
+ if (content.length === 0)
44
+ continue;
45
+ for (const pattern of catalog.patterns) {
46
+ if (!pattern.languages.includes(lang))
47
+ continue;
48
+ const re = new RegExp(pattern.regex, "gm");
49
+ let m;
50
+ while ((m = re.exec(content)) !== null) {
51
+ const lineIdx = lineOf(content, m.index);
52
+ const matched = m[0];
53
+ findings.push({
54
+ pass: PASS_ID,
55
+ kind: "stub_hit",
56
+ path: rel,
57
+ detail: `${rel}:${lineIdx} matches stub pattern \`${pattern.id}\` — ${pattern.description}`,
58
+ severity: pattern.severity === "hard" ? "block" : "warn",
59
+ pattern_id: pattern.id,
60
+ line: lineIdx,
61
+ matched_text: matched.length > 200 ? matched.slice(0, 200) + "…" : matched,
62
+ });
63
+ if (re.lastIndex === m.index)
64
+ re.lastIndex += 1;
65
+ }
66
+ }
67
+ }
68
+ return { findings };
69
+ }
70
+ function lineOf(text, charIndex) {
71
+ let line = 1;
72
+ for (let i = 0; i < charIndex && i < text.length; i++) {
73
+ if (text.charCodeAt(i) === 10 /* \n */)
74
+ line += 1;
75
+ }
76
+ return line;
77
+ }
78
+ //# sourceMappingURL=stub-hits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stub-hits.js","sourceRoot":"","sources":["../../src/gc/stub-hits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Sweep + batch entry points for GC.
3
+ *
4
+ * `runGcSweep` composes all five passes against a repo root and returns the
5
+ * aggregated `GcSweepResult` (findings + commit proposals). Callers decide
6
+ * whether to apply.
7
+ *
8
+ * `runGcBatch` is the apply-side counterpart. Given a sweep result, it
9
+ * (1) optionally re-classifies each proposal against project globs; (2)
10
+ * applies proposals whose class is in `applyClasses`; (3) when more than one
11
+ * proposal lands in the same batch AND `canary` is true, runs
12
+ * `verifyBatchCanary` against the post-batch state; (4) on canary fail,
13
+ * rolls back to the pre-batch SHA and returns the batch as `rolled_back`.
14
+ */
15
+ import type { Profile } from "../profiles/types.js";
16
+ import type { ProjectGlobs, SensorLanguage } from "../sensors/types.js";
17
+ import type { GcAutoMergeClass, GcSweepResult, GcBatchResult } from "./types.js";
18
+ export interface RunGcSweepOptions {
19
+ repoRoot: string;
20
+ /** Override stack profile. Defaults to `selectProfile(repoRoot)`. */
21
+ profile?: Profile;
22
+ /** Project-extension globs (high_stakes_globs etc). */
23
+ projectGlobs?: ProjectGlobs;
24
+ /** Languages active for stub-catalog scan. Default ["typescript"]. */
25
+ languages?: readonly SensorLanguage[];
26
+ /** Frontmatter-pass options. */
27
+ frontmatter?: {
28
+ warnDays?: number;
29
+ blockDays?: number;
30
+ /** Inject for tests. */
31
+ now?: Date;
32
+ /**
33
+ * Phase 12 v1 surfaces stale frontmatter only. Setting this to true also
34
+ * proposes a verified-at bump as a safe-class commit; the smoke uses
35
+ * this to exercise the auto-merge end-to-end.
36
+ */
37
+ forceRefresh?: boolean;
38
+ };
39
+ /** Quality-grades pass options. */
40
+ qualityRecentRunCount?: number;
41
+ /** Doc-gardening orphan exception list. */
42
+ docOrphanExcludes?: readonly string[];
43
+ }
44
+ export declare function runGcSweep(opts: RunGcSweepOptions): Promise<GcSweepResult>;
45
+ export interface RunGcBatchOptions extends RunGcSweepOptions {
46
+ /** Auto-merge classes that are allowed to apply. Default ["safe"]. */
47
+ applyClasses?: readonly GcAutoMergeClass[];
48
+ /** Re-run the canary after the batch lands. Default true. */
49
+ canary?: boolean;
50
+ /** Override the commit author. */
51
+ author?: {
52
+ name: string;
53
+ email: string;
54
+ };
55
+ }
56
+ export declare function runGcBatch(opts: RunGcBatchOptions): Promise<GcBatchResult>;
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Sweep + batch entry points for GC.
3
+ *
4
+ * `runGcSweep` composes all five passes against a repo root and returns the
5
+ * aggregated `GcSweepResult` (findings + commit proposals). Callers decide
6
+ * whether to apply.
7
+ *
8
+ * `runGcBatch` is the apply-side counterpart. Given a sweep result, it
9
+ * (1) optionally re-classifies each proposal against project globs; (2)
10
+ * applies proposals whose class is in `applyClasses`; (3) when more than one
11
+ * proposal lands in the same batch AND `canary` is true, runs
12
+ * `verifyBatchCanary` against the post-batch state; (4) on canary fail,
13
+ * rolls back to the pre-batch SHA and returns the batch as `rolled_back`.
14
+ */
15
+ import { simpleGit } from "simple-git";
16
+ import { logger } from "../logger.js";
17
+ import { selectProfile } from "../profiles/index.js";
18
+ import { applyCommit } from "./apply.js";
19
+ import { verifyBatchCanary } from "./canary.js";
20
+ import { runCitationIntegrity } from "./citation-integrity.js";
21
+ import { classifyAutoMerge } from "./classify.js";
22
+ import { runCompletionIntegrity } from "./completion-integrity.js";
23
+ import { runDocGardening } from "./doc-gardening.js";
24
+ import { runFrontmatterFreshness } from "./frontmatter.js";
25
+ import { runGeneratorDrift } from "./generator-drift.js";
26
+ import { runQualityGradesUpdate } from "./quality-update.js";
27
+ import { runScopeCoverage } from "./scope-coverage.js";
28
+ import { runStubCatalogHits } from "./stub-hits.js";
29
+ const log = logger("gc.sweep");
30
+ export async function runGcSweep(opts) {
31
+ const startedAt = Date.now();
32
+ const profile = opts.profile ?? selectProfile(opts.repoRoot);
33
+ const findings = [];
34
+ const proposals = [];
35
+ const passDurations = {
36
+ "frontmatter-freshness": 0,
37
+ "generator-drift": 0,
38
+ "stub-catalog-hits": 0,
39
+ "doc-gardening": 0,
40
+ "quality-grades": 0,
41
+ "scope-coverage": 0,
42
+ "completion-integrity": 0,
43
+ "citation-integrity": 0,
44
+ };
45
+ // 1. Frontmatter freshness.
46
+ {
47
+ const t0 = Date.now();
48
+ const r = runFrontmatterFreshness({
49
+ repoRoot: opts.repoRoot,
50
+ ...(opts.frontmatter?.warnDays !== undefined ? { warnDays: opts.frontmatter.warnDays } : {}),
51
+ ...(opts.frontmatter?.blockDays !== undefined ? { blockDays: opts.frontmatter.blockDays } : {}),
52
+ ...(opts.frontmatter?.now !== undefined ? { now: opts.frontmatter.now } : {}),
53
+ ...(opts.frontmatter?.forceRefresh !== undefined ? { forceRefresh: opts.frontmatter.forceRefresh } : {}),
54
+ });
55
+ findings.push(...r.findings);
56
+ proposals.push(...r.proposals);
57
+ passDurations["frontmatter-freshness"] = Date.now() - t0;
58
+ }
59
+ // 2. Generator drift.
60
+ {
61
+ const t0 = Date.now();
62
+ const r = await runGeneratorDrift({ repoRoot: opts.repoRoot, profile });
63
+ findings.push(...r.findings);
64
+ proposals.push(...r.proposals);
65
+ passDurations["generator-drift"] = Date.now() - t0;
66
+ }
67
+ // 3. Stub catalog hits.
68
+ {
69
+ const t0 = Date.now();
70
+ const r = runStubCatalogHits({
71
+ repoRoot: opts.repoRoot,
72
+ ...(opts.languages !== undefined ? { languages: opts.languages } : {}),
73
+ });
74
+ findings.push(...r.findings);
75
+ passDurations["stub-catalog-hits"] = Date.now() - t0;
76
+ }
77
+ // 4. Doc gardening.
78
+ {
79
+ const t0 = Date.now();
80
+ const r = runDocGardening({
81
+ repoRoot: opts.repoRoot,
82
+ ...(opts.docOrphanExcludes !== undefined ? { orphanExcludes: opts.docOrphanExcludes } : {}),
83
+ });
84
+ findings.push(...r.findings);
85
+ passDurations["doc-gardening"] = Date.now() - t0;
86
+ }
87
+ // 5. Quality grades.
88
+ {
89
+ const t0 = Date.now();
90
+ const r = runQualityGradesUpdate({
91
+ repoRoot: opts.repoRoot,
92
+ ...(opts.qualityRecentRunCount !== undefined ? { recentRunCount: opts.qualityRecentRunCount } : {}),
93
+ });
94
+ findings.push(...r.findings);
95
+ proposals.push(...r.proposals);
96
+ passDurations["quality-grades"] = Date.now() - t0;
97
+ }
98
+ // 6. Completion integrity.
99
+ {
100
+ const t0 = Date.now();
101
+ const r = await runCompletionIntegrity({ repoRoot: opts.repoRoot });
102
+ findings.push(...r.findings);
103
+ passDurations["completion-integrity"] = Date.now() - t0;
104
+ }
105
+ // 7. Scope coverage.
106
+ {
107
+ const t0 = Date.now();
108
+ const r = runScopeCoverage({ repoRoot: opts.repoRoot });
109
+ findings.push(...r.findings);
110
+ passDurations["scope-coverage"] = Date.now() - t0;
111
+ }
112
+ // 8. Citation integrity.
113
+ {
114
+ const t0 = Date.now();
115
+ const r = runCitationIntegrity({ repoRoot: opts.repoRoot });
116
+ findings.push(...r.findings);
117
+ passDurations["citation-integrity"] = Date.now() - t0;
118
+ }
119
+ // Re-classify proposals against project globs (passes set defaults; this
120
+ // ensures high-stakes hits dominate when a stale-frontmatter doc happens to
121
+ // live under a high-stakes glob).
122
+ for (const p of proposals) {
123
+ p.class = classifyAutoMerge({
124
+ paths: p.paths,
125
+ ...(opts.projectGlobs !== undefined ? { projectGlobs: opts.projectGlobs } : {}),
126
+ });
127
+ }
128
+ const result = {
129
+ generated: new Date().toISOString(),
130
+ findings,
131
+ proposals,
132
+ pass_durations: passDurations,
133
+ duration_ms: Date.now() - startedAt,
134
+ };
135
+ log.info({
136
+ repo: opts.repoRoot,
137
+ profile: profile.id,
138
+ findings: findings.length,
139
+ proposals: proposals.length,
140
+ duration_ms: result.duration_ms,
141
+ }, "gc sweep complete");
142
+ return result;
143
+ }
144
+ export async function runGcBatch(opts) {
145
+ const applyClasses = opts.applyClasses ?? ["safe"];
146
+ const canaryEnabled = opts.canary ?? true;
147
+ const sweep = await runGcSweep(opts);
148
+ const git = simpleGit({ baseDir: opts.repoRoot });
149
+ const preBatchSha = (await git.revparse(["HEAD"])).trim();
150
+ const toApply = [];
151
+ const surfaced = [];
152
+ for (const p of sweep.proposals) {
153
+ if (applyClasses.includes(p.class)) {
154
+ toApply.push(p);
155
+ }
156
+ else {
157
+ surfaced.push(p);
158
+ }
159
+ }
160
+ const applied = [];
161
+ for (const p of toApply) {
162
+ const r = await applyCommit({
163
+ repoRoot: opts.repoRoot,
164
+ proposal: p,
165
+ ...(opts.author !== undefined ? { author: opts.author } : {}),
166
+ });
167
+ applied.push({
168
+ pass: p.pass,
169
+ class: p.class,
170
+ commit_sha: r.commit_sha,
171
+ commit_message: p.commit_message,
172
+ paths: p.paths,
173
+ });
174
+ }
175
+ let canaryResult;
176
+ let rolledBack = false;
177
+ if (canaryEnabled && applied.length >= 2) {
178
+ canaryResult = verifyBatchCanary({ repoRoot: opts.repoRoot });
179
+ if (!canaryResult.ok) {
180
+ // Roll back to pre-batch SHA — undoes every commit applied in this
181
+ // batch atomically.
182
+ await git.reset(["--hard", preBatchSha]);
183
+ rolledBack = true;
184
+ log.warn({
185
+ repo: opts.repoRoot,
186
+ pre_batch_sha: preBatchSha,
187
+ applied_count: applied.length,
188
+ failures: canaryResult.failures,
189
+ }, "gc batch rolled back — canary failed");
190
+ }
191
+ }
192
+ const postBatchSha = rolledBack
193
+ ? preBatchSha
194
+ : (await git.revparse(["HEAD"])).trim();
195
+ return {
196
+ applied: rolledBack ? [] : applied,
197
+ surfaced: rolledBack ? [...surfaced, ...toApply] : surfaced,
198
+ pre_batch_sha: preBatchSha,
199
+ post_batch_sha: postBatchSha,
200
+ canary_ok: canaryResult ? canaryResult.ok : true,
201
+ canary_failures: canaryResult?.failures ?? [],
202
+ rolled_back: rolledBack,
203
+ };
204
+ }
205
+ //# sourceMappingURL=sweep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/gc/sweep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Phase 12 — garbage collection cadence.
3
+ *
4
+ * GC runs five passes (per PRIMER §12.1) against the canonical zone of an
5
+ * adopted project's mirror checkout:
6
+ *
7
+ * 1. frontmatter-freshness — verified-at >30d warn, >60d block
8
+ * 2. generator-drift — re-run profile.extractors, diff against ground
9
+ * 3. stub-catalog-hits — full-tree scan against stub-patterns.yaml
10
+ * 4. doc-gardening — broken markdown links, orphan paths
11
+ * 5. quality-grades — rebuild .cairn/ground/quality-grades.yaml
12
+ *
13
+ * Each pass returns `GcFinding[]` and may attach a `GcCommitProposal` when the
14
+ * fix is mechanical (frontmatter refresh, generator regen, quality-grades
15
+ * rebuild). The sweep composer produces a `GcSweepResult` that the CLI / cron
16
+ * decides how to apply.
17
+ *
18
+ * Auto-merge classes per PRIMER §12.2:
19
+ * safe — formatting, doc regen, frontmatter refresh, generated content,
20
+ * archive moves, stub-catalog additions. Push, no UAT.
21
+ * code — touches *.ts outside generator-managed files. Sensors +
22
+ * reviewer + UAT 🟢 → push.
23
+ * high-stakes — touches projectGlobs.high_stakes_globs. Above + E2E + Layer E.
24
+ */
25
+ export type GcPassId = "frontmatter-freshness" | "generator-drift" | "stub-catalog-hits" | "doc-gardening" | "quality-grades" | "scope-coverage" | "completion-integrity" | "citation-integrity";
26
+ export type GcFindingKind = "frontmatter_stale" | "generator_drift" | "stub_hit" | "broken_link" | "orphan_path" | "quality_update" | "scope_uncovered" | "scope_drift_orphan" | "scope_index_missing" | "task_integrity_error" | "orphaned_citation" | "superseded_citation" | "banned_dec_comment";
27
+ export type GcAutoMergeClass = "safe" | "code" | "high-stakes";
28
+ export interface GcFinding {
29
+ pass: GcPassId;
30
+ kind: GcFindingKind;
31
+ /** Repo-relative path the finding applies to. */
32
+ path: string;
33
+ /** Human-readable, one-line summary. */
34
+ detail: string;
35
+ /** warn = surface; block = sensor-equivalent failure. info = neutral. */
36
+ severity: "warn" | "block" | "info";
37
+ /** Days since verified-at (frontmatter pass only). */
38
+ age_days?: number;
39
+ /** Stub-pattern id when kind = "stub_hit". */
40
+ pattern_id?: string;
41
+ /** Line number when relevant (1-based). */
42
+ line?: number;
43
+ /** Verbatim text that triggered the finding. */
44
+ matched_text?: string;
45
+ }
46
+ /**
47
+ * A mechanical patch the pass can produce. The CLI / cron applies it as a
48
+ * single `chore(gc): ...` commit when the proposal's class is enabled.
49
+ * Patches are absolute file rewrites — keys are repo-relative paths, values
50
+ * are the full new content. Empty-string content means "delete this file".
51
+ */
52
+ export interface GcCommitProposal {
53
+ pass: GcPassId;
54
+ class: GcAutoMergeClass;
55
+ /** Files this commit touches. */
56
+ paths: string[];
57
+ /** path → full new content. Empty value = delete. */
58
+ patch: Record<string, string>;
59
+ /** Conventional-commits-shaped subject + body. */
60
+ commit_message: string;
61
+ /** Findings this commit resolves (for audit log + Discord summary). */
62
+ findings: GcFinding[];
63
+ }
64
+ export interface GcSweepResult {
65
+ generated: string;
66
+ /** All findings across passes. Includes those covered by proposals. */
67
+ findings: GcFinding[];
68
+ /** Mechanical patches the passes produced. */
69
+ proposals: GcCommitProposal[];
70
+ /** Per-pass timing (ms). */
71
+ pass_durations: Record<GcPassId, number>;
72
+ duration_ms: number;
73
+ }
74
+ /**
75
+ * Outcome of `runGcBatch` — one or more proposals applied, optional canary
76
+ * verification, optional rollback on failure. The CLI uses this to print the
77
+ * summary and (when configured) push the resulting commits.
78
+ */
79
+ export interface GcBatchResult {
80
+ /** Applied commits with their resulting SHA. */
81
+ applied: {
82
+ pass: GcPassId;
83
+ class: GcAutoMergeClass;
84
+ commit_sha: string;
85
+ commit_message: string;
86
+ paths: string[];
87
+ }[];
88
+ /** Proposals NOT applied (class not enabled, or canary failed). */
89
+ surfaced: GcCommitProposal[];
90
+ /** Pre-batch SHA — used for rollback. */
91
+ pre_batch_sha: string;
92
+ /** Post-batch SHA when canary passed; equal to pre_batch_sha when nothing applied or rolled back. */
93
+ post_batch_sha: string;
94
+ /** True when verifyBatchCanary passed (or wasn't run because <2 applied). */
95
+ canary_ok: boolean;
96
+ /** Canary failure details when canary_ok = false. */
97
+ canary_failures: string[];
98
+ /** True when batch was rolled back due to canary fail. */
99
+ rolled_back: boolean;
100
+ }
101
+ /**
102
+ * Synthetic context used by verifyBatchCanary to render workflow.md against
103
+ * a known-good fixture. The fixture mirrors the values the orchestrator would
104
+ * inject for a real run — if any of these tokens fail to resolve, the batch
105
+ * has broken the prompt template and must not be pushed.
106
+ */
107
+ export interface CanarySyntheticContext {
108
+ agent_role: string;
109
+ project_name: string;
110
+ run_id: string;
111
+ mirror_path: string;
112
+ sha_pin: string;
113
+ tightened_spec_body: string;
114
+ acceptance_criteria: string[];
115
+ in_scope_decisions: {
116
+ id: string;
117
+ title: string;
118
+ scope_summary: string;
119
+ }[];
120
+ in_scope_invariants: {
121
+ id: string;
122
+ title: string;
123
+ }[];
124
+ off_limits: string[];
125
+ scoped_sensors: {
126
+ id: string;
127
+ description: string;
128
+ }[];
129
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Phase 12 — garbage collection cadence.
3
+ *
4
+ * GC runs five passes (per PRIMER §12.1) against the canonical zone of an
5
+ * adopted project's mirror checkout:
6
+ *
7
+ * 1. frontmatter-freshness — verified-at >30d warn, >60d block
8
+ * 2. generator-drift — re-run profile.extractors, diff against ground
9
+ * 3. stub-catalog-hits — full-tree scan against stub-patterns.yaml
10
+ * 4. doc-gardening — broken markdown links, orphan paths
11
+ * 5. quality-grades — rebuild .cairn/ground/quality-grades.yaml
12
+ *
13
+ * Each pass returns `GcFinding[]` and may attach a `GcCommitProposal` when the
14
+ * fix is mechanical (frontmatter refresh, generator regen, quality-grades
15
+ * rebuild). The sweep composer produces a `GcSweepResult` that the CLI / cron
16
+ * decides how to apply.
17
+ *
18
+ * Auto-merge classes per PRIMER §12.2:
19
+ * safe — formatting, doc regen, frontmatter refresh, generated content,
20
+ * archive moves, stub-catalog additions. Push, no UAT.
21
+ * code — touches *.ts outside generator-managed files. Sensors +
22
+ * reviewer + UAT 🟢 → push.
23
+ * high-stakes — touches projectGlobs.high_stakes_globs. Above + E2E + Layer E.
24
+ */
25
+ export {};
26
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gc/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Shared file-tree walker for GC passes that need a flat repo-relative listing.
3
+ *
4
+ * Mirrors the strategy of `walkCanonical` but without the canonical-zone glob
5
+ * filter — used by passes that scan the entire source tree (stub-catalog hits,
6
+ * scope-coverage, etc.).
7
+ */
8
+ /** Directories the scan never descends into. */
9
+ export declare const SOURCE_TREE_SKIP_DIRS: Set<string>;
10
+ /**
11
+ * Walk every file in repoRoot, yielding repo-relative paths sorted
12
+ * alphabetically. Returns an empty array if `repoRoot` does not exist.
13
+ */
14
+ export declare function walkSourceTree(repoRoot: string): string[];