@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,139 @@
1
+ /**
2
+ * Invalidation event reader + retention GC.
3
+ *
4
+ * `eventsSince(repoRoot, sinceMs)` — list events with ts > sinceMs,
5
+ * sorted ascending. Used by the plugin Stop hook to surface only events
6
+ * that landed during the current session.
7
+ *
8
+ * `gcStaleEvents(repoRoot, opts?)` — drops events older than 7 days.
9
+ * Wired into the standard sweep so the events directory stays bounded.
10
+ */
11
+ import { existsSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs";
12
+ import { join } from "node:path";
13
+ import { eventsDir } from "./paths.js";
14
+ const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;
15
+ export function eventsSince(args) {
16
+ const dir = eventsDir(args.repoRoot);
17
+ const events = [];
18
+ const malformed = [];
19
+ if (!existsSync(dir))
20
+ return { events, malformed };
21
+ const entries = readdirSync(dir, { withFileTypes: true, encoding: "utf8" });
22
+ for (const e of entries) {
23
+ if (!e.isFile() || !e.name.endsWith(".json"))
24
+ continue;
25
+ const abs = join(dir, e.name);
26
+ let body;
27
+ try {
28
+ body = readFileSync(abs, "utf8");
29
+ }
30
+ catch {
31
+ malformed.push(e.name);
32
+ continue;
33
+ }
34
+ let parsed;
35
+ try {
36
+ parsed = JSON.parse(body);
37
+ }
38
+ catch {
39
+ malformed.push(e.name);
40
+ continue;
41
+ }
42
+ if (!isInvalidationEvent(parsed)) {
43
+ malformed.push(e.name);
44
+ continue;
45
+ }
46
+ if (parsed.ts > args.sinceMs)
47
+ events.push(parsed);
48
+ }
49
+ events.sort((a, b) => a.ts - b.ts);
50
+ if (typeof args.limit === "number" && events.length > args.limit) {
51
+ events.length = args.limit;
52
+ }
53
+ return { events, malformed };
54
+ }
55
+ /**
56
+ * Remove event files older than `maxAgeMs` (default 7 days). Uses each
57
+ * file's parsed `ts` when present; falls back to `mtimeMs` otherwise.
58
+ */
59
+ export function gcStaleEvents(args) {
60
+ const dir = eventsDir(args.repoRoot);
61
+ const removed = [];
62
+ const kept = [];
63
+ if (!existsSync(dir))
64
+ return { removed, kept };
65
+ const maxAge = args.maxAgeMs ?? SEVEN_DAYS_MS;
66
+ const now = args.now ? args.now() : Date.now();
67
+ const entries = readdirSync(dir, { withFileTypes: true, encoding: "utf8" });
68
+ for (const e of entries) {
69
+ if (!e.isFile() || !e.name.endsWith(".json"))
70
+ continue;
71
+ const abs = join(dir, e.name);
72
+ let ts = null;
73
+ try {
74
+ const parsed = JSON.parse(readFileSync(abs, "utf8"));
75
+ if (typeof parsed?.ts === "number")
76
+ ts = parsed.ts;
77
+ }
78
+ catch {
79
+ ts = null;
80
+ }
81
+ if (ts === null) {
82
+ try {
83
+ ts = statSync(abs).mtimeMs;
84
+ }
85
+ catch {
86
+ ts = 0;
87
+ }
88
+ }
89
+ if (now - ts >= maxAge) {
90
+ try {
91
+ rmSync(abs, { force: true });
92
+ removed.push(e.name);
93
+ }
94
+ catch {
95
+ kept.push(e.name);
96
+ }
97
+ }
98
+ else {
99
+ kept.push(e.name);
100
+ }
101
+ }
102
+ return { removed, kept };
103
+ }
104
+ function isInvalidationEvent(x) {
105
+ if (x === null || typeof x !== "object")
106
+ return false;
107
+ const o = x;
108
+ if (typeof o["ts"] !== "number")
109
+ return false;
110
+ if (typeof o["kind"] !== "string")
111
+ return false;
112
+ if (!Array.isArray(o["refs"]))
113
+ return false;
114
+ for (const r of o["refs"])
115
+ if (!isRef(r))
116
+ return false;
117
+ const source = o["source"];
118
+ if (source === null || typeof source !== "object")
119
+ return false;
120
+ const s = source;
121
+ if (s["session_id"] !== null && typeof s["session_id"] !== "string")
122
+ return false;
123
+ if (typeof s["tool"] !== "string")
124
+ return false;
125
+ if (o["path"] !== undefined && typeof o["path"] !== "string")
126
+ return false;
127
+ return true;
128
+ }
129
+ function isRef(x) {
130
+ if (x === null || typeof x !== "object")
131
+ return false;
132
+ const o = x;
133
+ return (typeof o["id"] === "string" &&
134
+ (o["kind"] === "decision" ||
135
+ o["kind"] === "invariant" ||
136
+ o["kind"] === "task" ||
137
+ o["kind"] === "path"));
138
+ }
139
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/events/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Invalidation event writer.
3
+ *
4
+ * Per PLUGIN_ARCHITECTURE §7 (three-layer conflict catch, layer 2),
5
+ * every locked write to global state emits a small JSON file under
6
+ * `.cairn/events/`. Plugin Stop hooks in other live sessions poll
7
+ * that directory and surface an inline A/B/C if the event touches a
8
+ * DEC/§V they have in scope.
9
+ *
10
+ * Files: `.cairn/events/<msTs>-<kind>.json` — sortable by name. ts
11
+ * collisions resolved with a short crypto suffix.
12
+ *
13
+ * Retention: events older than 7 days are GC'd by `gcStaleEvents`.
14
+ */
15
+ /**
16
+ * Reference into the canonical zone — what this event invalidates.
17
+ * Decision/invariant ids are filtered against the reading session's
18
+ * in-scope set; path entries match against scope-globs.
19
+ */
20
+ export interface InvalidationEventRef {
21
+ kind: "decision" | "invariant" | "task" | "path";
22
+ id: string;
23
+ }
24
+ export interface InvalidationEventSource {
25
+ /** Claude Code session id of the writer, if known. */
26
+ session_id: string | null;
27
+ /** MCP tool name (e.g. `cairn_record_decision`) or other emitter id. */
28
+ tool: string;
29
+ }
30
+ export interface InvalidationEvent {
31
+ /** ms-since-epoch — set by the writer if not provided. */
32
+ ts: number;
33
+ /** Short event kind. Decision-recorded, archived, task-created, etc. */
34
+ kind: string;
35
+ /** Things this event invalidates. Empty array allowed for diagnostic events. */
36
+ refs: InvalidationEventRef[];
37
+ /** Path relative to repo root, when applicable. */
38
+ path?: string;
39
+ /** Where the event came from. */
40
+ source: InvalidationEventSource;
41
+ }
42
+ export interface WriteInvalidationEventInput {
43
+ kind: string;
44
+ refs: InvalidationEventRef[];
45
+ source: InvalidationEventSource;
46
+ path?: string;
47
+ /** Override Date.now() — tests use this. */
48
+ ts?: number;
49
+ }
50
+ export interface WriteInvalidationEventResult {
51
+ /** Absolute path to the event file written. */
52
+ filePath: string;
53
+ /** Final event payload (with ts filled in). */
54
+ event: InvalidationEvent;
55
+ }
56
+ /**
57
+ * Write a single invalidation event. Best-effort — failures throw, but
58
+ * locked-write callers should swallow + log so the underlying write is
59
+ * never rolled back by an emit failure.
60
+ */
61
+ export declare function writeInvalidationEvent(repoRoot: string, input: WriteInvalidationEventInput): WriteInvalidationEventResult;
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Invalidation event writer.
3
+ *
4
+ * Per PLUGIN_ARCHITECTURE §7 (three-layer conflict catch, layer 2),
5
+ * every locked write to global state emits a small JSON file under
6
+ * `.cairn/events/`. Plugin Stop hooks in other live sessions poll
7
+ * that directory and surface an inline A/B/C if the event touches a
8
+ * DEC/§V they have in scope.
9
+ *
10
+ * Files: `.cairn/events/<msTs>-<kind>.json` — sortable by name. ts
11
+ * collisions resolved with a short crypto suffix.
12
+ *
13
+ * Retention: events older than 7 days are GC'd by `gcStaleEvents`.
14
+ */
15
+ import { mkdirSync, writeFileSync } from "node:fs";
16
+ import { randomBytes } from "node:crypto";
17
+ import { join } from "node:path";
18
+ import { eventsDir } from "./paths.js";
19
+ /**
20
+ * Write a single invalidation event. Best-effort — failures throw, but
21
+ * locked-write callers should swallow + log so the underlying write is
22
+ * never rolled back by an emit failure.
23
+ */
24
+ export function writeInvalidationEvent(repoRoot, input) {
25
+ const ts = input.ts ?? Date.now();
26
+ const event = {
27
+ ts,
28
+ kind: input.kind,
29
+ refs: input.refs,
30
+ source: input.source,
31
+ ...(input.path !== undefined ? { path: input.path } : {}),
32
+ };
33
+ const dir = eventsDir(repoRoot);
34
+ mkdirSync(dir, { recursive: true });
35
+ // Filename: `<14-digit-ts>-<kind>.json`. ms epoch is ~13 digits today;
36
+ // pad to 14 so files sort lexically by ts even past year 2286. On
37
+ // collision append a short random suffix.
38
+ const tsStr = String(ts).padStart(14, "0");
39
+ const safeKind = sanitizeKind(input.kind);
40
+ let filename = `${tsStr}-${safeKind}.json`;
41
+ let filePath = join(dir, filename);
42
+ // wx + retry on EEXIST; bound the retries to a tiny number — Date.now()
43
+ // collisions across writers within the same ms are vanishingly rare,
44
+ // and the random suffix breaks ties in O(1) attempts.
45
+ let attempts = 0;
46
+ while (true) {
47
+ try {
48
+ writeFileSync(filePath, `${JSON.stringify(event, null, 2)}\n`, {
49
+ encoding: "utf8",
50
+ flag: "wx",
51
+ });
52
+ return { filePath, event };
53
+ }
54
+ catch (err) {
55
+ const code = err.code;
56
+ if (code !== "EEXIST" || attempts >= 4)
57
+ throw err;
58
+ const suffix = randomBytes(2).toString("hex");
59
+ filename = `${tsStr}-${safeKind}-${suffix}.json`;
60
+ filePath = join(dir, filename);
61
+ attempts += 1;
62
+ }
63
+ }
64
+ }
65
+ function sanitizeKind(raw) {
66
+ return raw.replace(/[^a-zA-Z0-9_-]+/g, "_").replace(/^_+|_+$/g, "") || "event";
67
+ }
68
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/events/writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAgDvC;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,KAAkC;IAElC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,KAAK,GAAsB;QAC/B,EAAE;QACF,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;IAEF,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,uEAAuE;IACvE,kEAAkE;IAClE,0CAA0C;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,QAAQ,GAAG,GAAG,KAAK,IAAI,QAAQ,OAAO,CAAC;IAC3C,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACnC,wEAAwE;IACxE,qEAAqE;IACrE,sDAAsD;IACtD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBAC7D,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;YACH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;YACjD,IAAI,IAAI,KAAK,QAAQ,IAAI,QAAQ,IAAI,CAAC;gBAAE,MAAM,GAAG,CAAC;YAClD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9C,QAAQ,GAAG,GAAG,KAAK,IAAI,QAAQ,IAAI,MAAM,OAAO,CAAC;YACjD,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC/B,QAAQ,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;AACjF,CAAC"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Frontend adapter contract per `docs/WORKFLOW_GUIDE.md` §0.1.
3
+ *
4
+ * The orchestrator + grounding daemon + MCP server are frontend-agnostic.
5
+ * The operator console is a swappable adapter that consumes a uniform
6
+ * task/run/UAT bundle and renders/listens via its native primitive.
7
+ *
8
+ * Adapters live in `cairn/src/frontend/<name>/`. Each implements
9
+ * `FrontendAdapter`. The `cairn run --frontend <name>` CLI loads + starts
10
+ * registered adapters; on operator events, adapters drop normalized JSON rows
11
+ * to `.cairn/inbox/<ts>-<source>-<slug>.json`. The orchestrator (Phase 8)
12
+ * picks them up. Phase 5 lands ingress-only — no orchestrator yet.
13
+ */
14
+ export type NotifyLevel = "info" | "warn" | "error";
15
+ /**
16
+ * A normalized inbox entry kind. Adapters drop one of these to
17
+ * `.cairn/inbox/`. The orchestrator multiplexes on `kind`.
18
+ */
19
+ export type InboxKind = "task" | "slash" | "free_text" | "voice" | "interaction";
20
+ export interface FrontendTask {
21
+ source: string;
22
+ intent: string;
23
+ rawText: string;
24
+ authorId: string;
25
+ channelId?: string;
26
+ guildId?: string;
27
+ messageId?: string;
28
+ receivedAt: string;
29
+ }
30
+ export interface VoiceMessage {
31
+ source: string;
32
+ attachmentUrl: string;
33
+ mime?: string;
34
+ authorId: string;
35
+ channelId: string;
36
+ guildId?: string;
37
+ messageId: string;
38
+ receivedAt: string;
39
+ }
40
+ export interface SlashEvent {
41
+ source: string;
42
+ command: string;
43
+ options: Record<string, string | number | boolean>;
44
+ authorId: string;
45
+ channelId?: string;
46
+ guildId?: string;
47
+ messageId?: string;
48
+ receivedAt: string;
49
+ }
50
+ export interface FreeTextEvent {
51
+ source: string;
52
+ intent: string;
53
+ rawText: string;
54
+ authorId: string;
55
+ channelId?: string;
56
+ guildId?: string;
57
+ messageId?: string;
58
+ receivedAt: string;
59
+ }
60
+ export interface InteractionEvent {
61
+ source: string;
62
+ bundleId: string;
63
+ choiceId: string;
64
+ freeText?: string;
65
+ authorId: string;
66
+ channelId?: string;
67
+ guildId?: string;
68
+ messageId?: string;
69
+ receivedAt: string;
70
+ }
71
+ export interface DialogChoice {
72
+ /** Stable id ("a" | "b" | ... | "e_other"). */
73
+ id: string;
74
+ label: string;
75
+ }
76
+ export interface DialogSpec {
77
+ /** Origin run / task id used to correlate adapter responses. */
78
+ bundleId: string;
79
+ prompt: string;
80
+ /**
81
+ * 2-5 choices. Last MUST be `E) Other` per WORKFLOW_GUIDE §1.4.
82
+ * If more than 4 orthogonal questions arise, caller MUST collapse to a
83
+ * single tightened-spec proposal per §1.0 (cap = 2 questions/turn).
84
+ */
85
+ choices: DialogChoice[];
86
+ channelId?: string;
87
+ timeoutMs?: number;
88
+ /**
89
+ * When true, the adapter notifies authorized operators (push, mention,
90
+ * etc. — adapter-defined) so they see the run is paused. Used for
91
+ * agent-initiated `cairn_ask_operator`; routine confirmations leave
92
+ * this false to avoid noise.
93
+ */
94
+ pingOperators?: boolean;
95
+ /**
96
+ * §3.4 win 1 — multi-step walks (per-question tightener resolution,
97
+ * /oops branches) edit one message in place instead of posting N+1
98
+ * messages. Set this to the previous step's `bundleId`; the adapter
99
+ * looks it up in its dialog-message map and edits that message
100
+ * (same channel, new prompt + buttons). When the bundleId is
101
+ * unknown (gone, never registered) the adapter falls back to a
102
+ * fresh send.
103
+ */
104
+ replaceBundleId?: string;
105
+ /**
106
+ * Terminal-dialog flag. When true (default), the adapter compacts
107
+ * the message on click — strips buttons, appends an "Answered" line
108
+ * — so the channel scrollback shows what was chosen. Walk steps
109
+ * that intend to be replaced by a follow-on dialog (per-Q tightener)
110
+ * MUST pass false: otherwise the compaction race-edits the message
111
+ * the next step is about to overwrite, and either the answer
112
+ * annotation or the next prompt loses depending on REST ordering.
113
+ * Adapter still fires `deferUpdate` so the click acknowledges.
114
+ */
115
+ compactOnAnswer?: boolean;
116
+ }
117
+ export interface DialogResponse {
118
+ bundleId: string;
119
+ choiceId: string;
120
+ /** Populated only when `choiceId` is the `E) Other` option. */
121
+ freeText?: string;
122
+ timedOut?: boolean;
123
+ }
124
+ export interface ApprovalArtifact {
125
+ kind: "gif" | "screenshot" | "table" | "diff" | "log" | "url" | "text";
126
+ label?: string;
127
+ path?: string;
128
+ url?: string;
129
+ content?: string;
130
+ }
131
+ export interface ApprovalBundle {
132
+ bundleId: string;
133
+ runId: string;
134
+ taskId?: string;
135
+ goal: string;
136
+ diffSummary?: string;
137
+ acceptance?: {
138
+ id: string;
139
+ status: "pass" | "fail" | "pending";
140
+ note?: string;
141
+ }[];
142
+ artifacts?: ApprovalArtifact[];
143
+ channelId?: string;
144
+ timeoutMs?: number;
145
+ }
146
+ export interface Approval {
147
+ bundleId: string;
148
+ decision: "approve" | "reject" | "ask";
149
+ reason?: string;
150
+ timedOut?: boolean;
151
+ }
152
+ export interface PostUpdate {
153
+ taskId: string;
154
+ runId?: string;
155
+ status: string;
156
+ /**
157
+ * Free-form body. ≤1024 chars renders as inline embed `details` field
158
+ * (§3.3 win 3 — drops the live-status + content-message split). >1024
159
+ * chars falls back to the chunked secondary-embed path.
160
+ */
161
+ body?: string;
162
+ /**
163
+ * Original task spec (the operator's verbatim ask). Replaces the
164
+ * standalone `🆕 Task` drop card — the body lives on the same live
165
+ * status embed as everything else, so the channel only ever shows
166
+ * one self-updating message per task. Truncated at 1024 chars.
167
+ */
168
+ taskBody?: string;
169
+ channelId?: string;
170
+ /**
171
+ * Tier-0 (Haiku) summary of what the agent is doing right now —
172
+ * one-line, present-progressive ("Reading core/src/X", "Editing
173
+ * platform/Y"). Surfaces inside the live status embed so the
174
+ * operator sees ongoing activity instead of a static "running" badge.
175
+ * Set on a throttled cadence by the orchestrator during the
176
+ * implementer phase.
177
+ */
178
+ activity?: string;
179
+ /**
180
+ * Second-source visibility — extracted from claude stream-json events.
181
+ * Independent of the Tier-0 summary; renders even when the Tier-0 call
182
+ * fails. Each list capped + deduped at the source.
183
+ */
184
+ tools?: {
185
+ files?: string[];
186
+ bash?: string[];
187
+ searches?: string[];
188
+ };
189
+ /**
190
+ * Curated narrative tail from `.cairn/runs/active/<run_id>/log.jsonl`
191
+ * (§3.3 win 1) — last N transitions, pre-formatted. Renders inside the
192
+ * live status embed's description so operator sees actual progress
193
+ * instead of a static "phase: running" line.
194
+ */
195
+ recentEvents?: string[];
196
+ /**
197
+ * §3.4 win 3 — when status === "failed", the orchestrator classifies
198
+ * which gate eject the run so the embed renders class-colored title +
199
+ * emoji. Operator can route differently per class.
200
+ */
201
+ failureClass?: "sensor" | "reviewer" | "uat" | "hard" | "halt";
202
+ /**
203
+ * §3.4 win 2 — failure remediation guidance surfaced as a dedicated
204
+ * embed field. `reason` is a one-liner; `suggestedActions` are the
205
+ * operator's next moves (`/ship-anyway`, re-submit, open thread).
206
+ */
207
+ remediation?: {
208
+ reason: string;
209
+ suggestedActions: string[];
210
+ };
211
+ }
212
+ export type IngestHandler<T> = (item: T) => void | Promise<void>;
213
+ export interface FrontendAdapter {
214
+ readonly name: string;
215
+ /** Connects, registers commands, prepares to ingest events. */
216
+ start(): Promise<void>;
217
+ /** Disconnects + cleans up. Idempotent. */
218
+ stop(): Promise<void>;
219
+ onTask(handler: IngestHandler<FrontendTask>): void;
220
+ onVoice(handler: IngestHandler<VoiceMessage>): void;
221
+ onSlash(handler: IngestHandler<SlashEvent>): void;
222
+ onFreeText(handler: IngestHandler<FreeTextEvent>): void;
223
+ onInteraction(handler: IngestHandler<InteractionEvent>): void;
224
+ postTaskUpdate(update: PostUpdate): Promise<void>;
225
+ requestApproval(bundle: ApprovalBundle): Promise<Approval>;
226
+ requestDialog(spec: DialogSpec): Promise<DialogResponse>;
227
+ notify(level: NotifyLevel, message: string): Promise<void>;
228
+ /**
229
+ * Show a "typing" / activity indicator on the given channel until the
230
+ * returned stop fn is called. Adapters without a native typing
231
+ * indicator should no-op.
232
+ */
233
+ startTyping?(channelId: string): () => void;
234
+ /**
235
+ * Pre-flight check: is this channel still reachable + writable?
236
+ * Adapters that maintain channels MUST return false when the channel
237
+ * has been deleted or the adapter lacks access. The orchestrator uses
238
+ * this to skip dispatching a queued task whose channel is gone.
239
+ * Adapters without channels should leave this undefined; the
240
+ * orchestrator treats undefined as "always alive".
241
+ */
242
+ isChannelAlive?(channelId: string): Promise<boolean>;
243
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Frontend adapter contract per `docs/WORKFLOW_GUIDE.md` §0.1.
3
+ *
4
+ * The orchestrator + grounding daemon + MCP server are frontend-agnostic.
5
+ * The operator console is a swappable adapter that consumes a uniform
6
+ * task/run/UAT bundle and renders/listens via its native primitive.
7
+ *
8
+ * Adapters live in `cairn/src/frontend/<name>/`. Each implements
9
+ * `FrontendAdapter`. The `cairn run --frontend <name>` CLI loads + starts
10
+ * registered adapters; on operator events, adapters drop normalized JSON rows
11
+ * to `.cairn/inbox/<ts>-<source>-<slug>.json`. The orchestrator (Phase 8)
12
+ * picks them up. Phase 5 lands ingress-only — no orchestrator yet.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=frontend-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend-types.js","sourceRoot":"","sources":["../src/frontend-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Apply a single GcCommitProposal to the mirror checkout: write the patch
3
+ * files, run `git add` + `git commit`, return the resulting SHA.
4
+ *
5
+ * The caller is responsible for filtering proposals by `class` (only safe is
6
+ * auto-applied in v1; code / high-stakes are surfaced for confirm).
7
+ *
8
+ * No push happens here — the GC sweep + canary verification + push policy is
9
+ * orchestrated by `runGcBatch` (sweep.ts).
10
+ */
11
+ import type { GcCommitProposal } from "./types.js";
12
+ export interface ApplyCommitOptions {
13
+ repoRoot: string;
14
+ proposal: GcCommitProposal;
15
+ /** Override the commit author (smoke convenience). */
16
+ author?: {
17
+ name: string;
18
+ email: string;
19
+ };
20
+ }
21
+ export interface ApplyCommitResult {
22
+ commit_sha: string;
23
+ paths_written: string[];
24
+ paths_deleted: string[];
25
+ }
26
+ export declare function applyCommit(opts: ApplyCommitOptions): Promise<ApplyCommitResult>;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Apply a single GcCommitProposal to the mirror checkout: write the patch
3
+ * files, run `git add` + `git commit`, return the resulting SHA.
4
+ *
5
+ * The caller is responsible for filtering proposals by `class` (only safe is
6
+ * auto-applied in v1; code / high-stakes are surfaced for confirm).
7
+ *
8
+ * No push happens here — the GC sweep + canary verification + push policy is
9
+ * orchestrated by `runGcBatch` (sweep.ts).
10
+ */
11
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
12
+ import { dirname, resolve } from "node:path";
13
+ import { simpleGit } from "simple-git";
14
+ export async function applyCommit(opts) {
15
+ const written = [];
16
+ const deleted = [];
17
+ for (const [rel, content] of Object.entries(opts.proposal.patch)) {
18
+ const abs = resolve(opts.repoRoot, rel);
19
+ if (content === "") {
20
+ try {
21
+ rmSync(abs, { force: true });
22
+ deleted.push(rel);
23
+ }
24
+ catch {
25
+ // file may not exist; ignore
26
+ }
27
+ }
28
+ else {
29
+ mkdirSync(dirname(abs), { recursive: true });
30
+ writeFileSync(abs, content, "utf8");
31
+ written.push(rel);
32
+ }
33
+ }
34
+ const git = simpleGit({ baseDir: opts.repoRoot });
35
+ if (opts.author !== undefined) {
36
+ await git.addConfig("user.name", opts.author.name, false, "local");
37
+ await git.addConfig("user.email", opts.author.email, false, "local");
38
+ }
39
+ await git.add(opts.proposal.paths);
40
+ await git.commit(opts.proposal.commit_message);
41
+ const sha = (await git.revparse(["HEAD"])).trim();
42
+ return {
43
+ commit_sha: sha,
44
+ paths_written: written,
45
+ paths_deleted: deleted,
46
+ };
47
+ }
48
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/gc/apply.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAgBvC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAwB;IACxD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElD,OAAO;QACL,UAAU,EAAE,GAAG;QACf,aAAa,EAAE,OAAO;QACtB,aAAa,EAAE,OAAO;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Batch canary — verifies a multi-commit GC batch hasn't broken anything that
3
+ * shows only when the commits are taken together: "individually safe,
4
+ * collectively broken."
5
+ *
6
+ * Two checks run after the batch lands locally and BEFORE any push:
7
+ *
8
+ * 1. workflow.md re-render against a synthetic-task fixture.
9
+ * The orchestrator injects this template on every run; if a GC batch
10
+ * removed a placeholder section, broke a `{{var}}` token, or left
11
+ * orphaned `{{#each}}` blocks, the next live run would silently produce
12
+ * a malformed prompt. Render the template against a known-good fixture
13
+ * and assert (a) every `{{...}}` resolves and (b) the expected section
14
+ * headers (`## Task`, `## Acceptance criteria`, `## Decisions in scope`,
15
+ * `## Sensors that will run`) survive.
16
+ *
17
+ * 2. Manifest rebuild + ground-zone consistency.
18
+ * Re-run `buildManifest` against the post-batch tree. If it throws or
19
+ * produces zero entries (the canonical zone went empty), the batch
20
+ * broke ground.
21
+ *
22
+ * Both checks are pure-mechanical — no claude burn — and run in milliseconds.
23
+ * They are not exhaustive (no runtime sensor sweep against a synthetic diff
24
+ * yet; that's deferred to a richer Phase 12.x revision when the orchestrator
25
+ * exposes an "isolated sensor sweep" entry point).
26
+ */
27
+ import type { CanarySyntheticContext } from "./types.js";
28
+ export interface BatchCanaryResult {
29
+ ok: boolean;
30
+ failures: string[];
31
+ /** Number of files in the rebuilt manifest. */
32
+ manifest_files: number;
33
+ /** Length of the rendered workflow.md template. */
34
+ rendered_length: number;
35
+ }
36
+ export interface BatchCanaryOptions {
37
+ repoRoot: string;
38
+ /** Override the synthetic context. Defaults to a minimal fixture. */
39
+ syntheticContext?: CanarySyntheticContext;
40
+ }
41
+ export declare function buildSyntheticContext(): CanarySyntheticContext;
42
+ export declare function verifyBatchCanary(opts: BatchCanaryOptions): BatchCanaryResult;