@isaacriehm/cairn-core 0.19.1 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/align-undo/log.js +3 -2
  3. package/dist/align-undo/log.js.map +1 -1
  4. package/dist/attention/index.d.ts +0 -2
  5. package/dist/attention/index.js +0 -2
  6. package/dist/attention/index.js.map +1 -1
  7. package/dist/attention/restore.d.ts +1 -1
  8. package/dist/attention/restore.js +1 -1
  9. package/dist/attention/source-strip.d.ts +2 -2
  10. package/dist/attention/source-strip.js +4 -3
  11. package/dist/attention/source-strip.js.map +1 -1
  12. package/dist/components/audit.d.ts +7 -1
  13. package/dist/components/audit.js +144 -72
  14. package/dist/components/audit.js.map +1 -1
  15. package/dist/components/emit.js +33 -6
  16. package/dist/components/emit.js.map +1 -1
  17. package/dist/components/freshness.d.ts +51 -0
  18. package/dist/components/freshness.js +121 -0
  19. package/dist/components/freshness.js.map +1 -0
  20. package/dist/components/index.d.ts +4 -0
  21. package/dist/components/index.js +2 -0
  22. package/dist/components/index.js.map +1 -1
  23. package/dist/components/reconfirm.d.ts +64 -0
  24. package/dist/components/reconfirm.js +204 -0
  25. package/dist/components/reconfirm.js.map +1 -0
  26. package/dist/context/handoff-builder.js +3 -3
  27. package/dist/context/handoff-builder.js.map +1 -1
  28. package/dist/context/task-summary.js +2 -2
  29. package/dist/context/task-summary.js.map +1 -1
  30. package/dist/doctor/index.js +102 -9
  31. package/dist/doctor/index.js.map +1 -1
  32. package/dist/events/paths.js +2 -2
  33. package/dist/events/paths.js.map +1 -1
  34. package/dist/fix-align/sentinel.js +2 -3
  35. package/dist/fix-align/sentinel.js.map +1 -1
  36. package/dist/gc/attested-commits.js +2 -2
  37. package/dist/gc/attested-commits.js.map +1 -1
  38. package/dist/gc/canary.js +2 -3
  39. package/dist/gc/canary.js.map +1 -1
  40. package/dist/gc/citation-integrity.d.ts +4 -5
  41. package/dist/gc/citation-integrity.js +11 -33
  42. package/dist/gc/citation-integrity.js.map +1 -1
  43. package/dist/gc/classify.js +3 -16
  44. package/dist/gc/classify.js.map +1 -1
  45. package/dist/gc/completion-integrity.js +4 -3
  46. package/dist/gc/completion-integrity.js.map +1 -1
  47. package/dist/gc/entity-orphan.js +66 -12
  48. package/dist/gc/entity-orphan.js.map +1 -1
  49. package/dist/gc/ghost-anchor.d.ts +57 -0
  50. package/dist/gc/ghost-anchor.js +171 -0
  51. package/dist/gc/ghost-anchor.js.map +1 -0
  52. package/dist/gc/index.d.ts +2 -0
  53. package/dist/gc/index.js +1 -0
  54. package/dist/gc/index.js.map +1 -1
  55. package/dist/gc/sweep.d.ts +1 -1
  56. package/dist/gc/sweep.js +13 -1
  57. package/dist/gc/sweep.js.map +1 -1
  58. package/dist/gc/types.d.ts +1 -1
  59. package/dist/hooks/bypass-detection.js +3 -2
  60. package/dist/hooks/bypass-detection.js.map +1 -1
  61. package/dist/hooks/defer.js +3 -2
  62. package/dist/hooks/defer.js.map +1 -1
  63. package/dist/hooks/ghost-backup.d.ts +37 -0
  64. package/dist/hooks/ghost-backup.js +82 -0
  65. package/dist/hooks/ghost-backup.js.map +1 -0
  66. package/dist/hooks/post-tool-use/allowlist-reader.js +2 -2
  67. package/dist/hooks/post-tool-use/allowlist-reader.js.map +1 -1
  68. package/dist/hooks/post-tool-use/ask-user-blocked.d.ts +1 -2
  69. package/dist/hooks/post-tool-use/ask-user-blocked.js +3 -4
  70. package/dist/hooks/post-tool-use/ask-user-blocked.js.map +1 -1
  71. package/dist/hooks/post-tool-use/citation-scanner.d.ts +9 -7
  72. package/dist/hooks/post-tool-use/citation-scanner.js +9 -14
  73. package/dist/hooks/post-tool-use/citation-scanner.js.map +1 -1
  74. package/dist/hooks/post-tool-use/legend-builder.d.ts +2 -2
  75. package/dist/hooks/post-tool-use/legend-builder.js +1 -19
  76. package/dist/hooks/post-tool-use/legend-builder.js.map +1 -1
  77. package/dist/hooks/post-tool-use/post-write.js +18 -1
  78. package/dist/hooks/post-tool-use/post-write.js.map +1 -1
  79. package/dist/hooks/post-tool-use/read-enricher.d.ts +2 -2
  80. package/dist/hooks/post-tool-use/read-enricher.js +4 -6
  81. package/dist/hooks/post-tool-use/read-enricher.js.map +1 -1
  82. package/dist/hooks/post-tool-use/sot-align.js +29 -3
  83. package/dist/hooks/post-tool-use/sot-align.js.map +1 -1
  84. package/dist/hooks/post-tool-use/write-guardian.d.ts +1 -5
  85. package/dist/hooks/post-tool-use/write-guardian.js +25 -18
  86. package/dist/hooks/post-tool-use/write-guardian.js.map +1 -1
  87. package/dist/hooks/runners/context-threshold.js +3 -3
  88. package/dist/hooks/runners/context-threshold.js.map +1 -1
  89. package/dist/hooks/runners/payload.js +2 -1
  90. package/dist/hooks/runners/payload.js.map +1 -1
  91. package/dist/hooks/runners/phase-ready-surface.js +3 -2
  92. package/dist/hooks/runners/phase-ready-surface.js.map +1 -1
  93. package/dist/hooks/runners/session-start.js +103 -4
  94. package/dist/hooks/runners/session-start.js.map +1 -1
  95. package/dist/hooks/runners/stop.js +46 -42
  96. package/dist/hooks/runners/stop.js.map +1 -1
  97. package/dist/hooks/runners/user-prompt-submit.d.ts +2 -2
  98. package/dist/hooks/runners/user-prompt-submit.js +4 -9
  99. package/dist/hooks/runners/user-prompt-submit.js.map +1 -1
  100. package/dist/hooks/seed-attested.js +3 -2
  101. package/dist/hooks/seed-attested.js.map +1 -1
  102. package/dist/index.d.ts +4 -0
  103. package/dist/index.js +3 -0
  104. package/dist/index.js.map +1 -1
  105. package/dist/init/baseline-audit.js +3 -3
  106. package/dist/init/baseline-audit.js.map +1 -1
  107. package/dist/init/claude-rule.js +13 -1
  108. package/dist/init/claude-rule.js.map +1 -1
  109. package/dist/init/curator/corpus.d.ts +1 -0
  110. package/dist/init/curator/corpus.js +6 -2
  111. package/dist/init/curator/corpus.js.map +1 -1
  112. package/dist/init/curator/emit.js +2 -3
  113. package/dist/init/curator/emit.js.map +1 -1
  114. package/dist/init/detect-components.d.ts +3 -2
  115. package/dist/init/detect-components.js +33 -15
  116. package/dist/init/detect-components.js.map +1 -1
  117. package/dist/init/detect.d.ts +1 -5
  118. package/dist/init/detect.js +157 -143
  119. package/dist/init/detect.js.map +1 -1
  120. package/dist/init/eta-calibration.js +2 -2
  121. package/dist/init/eta-calibration.js.map +1 -1
  122. package/dist/init/glob-inference.js +24 -0
  123. package/dist/init/glob-inference.js.map +1 -1
  124. package/dist/init/index.d.ts +4 -4
  125. package/dist/init/index.js +2 -2
  126. package/dist/init/index.js.map +1 -1
  127. package/dist/init/init.d.ts +8 -0
  128. package/dist/init/init.js +16 -20
  129. package/dist/init/init.js.map +1 -1
  130. package/dist/init/mapper-merge.d.ts +1 -4
  131. package/dist/init/mapper-merge.js +4 -17
  132. package/dist/init/mapper-merge.js.map +1 -1
  133. package/dist/init/mapper-parallel.js +1 -1
  134. package/dist/init/mapper-parallel.js.map +1 -1
  135. package/dist/init/mapper-prompts.d.ts +1 -23
  136. package/dist/init/mapper-prompts.js +1 -25
  137. package/dist/init/mapper-prompts.js.map +1 -1
  138. package/dist/init/mapper.d.ts +0 -6
  139. package/dist/init/mapper.js +2 -5
  140. package/dist/init/mapper.js.map +1 -1
  141. package/dist/init/module-slicer.js +3 -24
  142. package/dist/init/module-slicer.js.map +1 -1
  143. package/dist/init/multi-dev/install.js +24 -0
  144. package/dist/init/multi-dev/install.js.map +1 -1
  145. package/dist/init/overlay.js +5 -16
  146. package/dist/init/overlay.js.map +1 -1
  147. package/dist/init/phases/11-baseline.js +1 -1
  148. package/dist/init/phases/11-baseline.js.map +1 -1
  149. package/dist/init/phases/4-seed.js +7 -5
  150. package/dist/init/phases/4-seed.js.map +1 -1
  151. package/dist/init/phases/9a-walker.js +4 -0
  152. package/dist/init/phases/9a-walker.js.map +1 -1
  153. package/dist/init/phases/9b-curate.d.ts +1 -0
  154. package/dist/init/phases/9b-curate.js +6 -2
  155. package/dist/init/phases/9b-curate.js.map +1 -1
  156. package/dist/init/phases/9d-comp-walk.js +3 -3
  157. package/dist/init/phases/9d-comp-walk.js.map +1 -1
  158. package/dist/init/phases/9e-comp-annotate.js +63 -3
  159. package/dist/init/phases/9e-comp-annotate.js.map +1 -1
  160. package/dist/init/phases/index.d.ts +0 -1
  161. package/dist/init/phases/index.js +0 -1
  162. package/dist/init/phases/index.js.map +1 -1
  163. package/dist/init/phases/mapper-output-io.d.ts +1 -1
  164. package/dist/init/phases/mapper-output-io.js +3 -2
  165. package/dist/init/phases/mapper-output-io.js.map +1 -1
  166. package/dist/init/phases/state-io.d.ts +1 -1
  167. package/dist/init/phases/state-io.js +3 -2
  168. package/dist/init/phases/state-io.js.map +1 -1
  169. package/dist/init/phases/types.d.ts +20 -8
  170. package/dist/init/phases/types.js +0 -1
  171. package/dist/init/phases/types.js.map +1 -1
  172. package/dist/init/progress.d.ts +1 -0
  173. package/dist/init/progress.js +3 -1
  174. package/dist/init/progress.js.map +1 -1
  175. package/dist/init/rules-merge/ingest.js +3 -3
  176. package/dist/init/rules-merge/ingest.js.map +1 -1
  177. package/dist/init/seed.js +54 -5
  178. package/dist/init/seed.js.map +1 -1
  179. package/dist/init/source-comments/strip-replace.d.ts +1 -2
  180. package/dist/init/source-comments/strip-replace.js +19 -3
  181. package/dist/init/source-comments/strip-replace.js.map +1 -1
  182. package/dist/init/source-comments/walker.js +8 -79
  183. package/dist/init/source-comments/walker.js.map +1 -1
  184. package/dist/init/types.d.ts +8 -16
  185. package/dist/init/walker.d.ts +1 -1
  186. package/dist/init/walker.js +1 -1
  187. package/dist/join/index.d.ts +9 -0
  188. package/dist/join/index.js +82 -25
  189. package/dist/join/index.js.map +1 -1
  190. package/dist/lock.js +4 -3
  191. package/dist/lock.js.map +1 -1
  192. package/dist/mcp/bootstrap-guard.js +10 -1
  193. package/dist/mcp/bootstrap-guard.js.map +1 -1
  194. package/dist/mcp/schemas.d.ts +26 -4
  195. package/dist/mcp/schemas.js +23 -1
  196. package/dist/mcp/schemas.js.map +1 -1
  197. package/dist/mcp/serve.js +9 -0
  198. package/dist/mcp/serve.js.map +1 -1
  199. package/dist/mcp/server.js +3 -3
  200. package/dist/mcp/server.js.map +1 -1
  201. package/dist/mcp/telemetry.js +4 -3
  202. package/dist/mcp/telemetry.js.map +1 -1
  203. package/dist/mcp/tools/component-reconfirm.d.ts +7 -0
  204. package/dist/mcp/tools/component-reconfirm.js +39 -0
  205. package/dist/mcp/tools/component-reconfirm.js.map +1 -0
  206. package/dist/mcp/tools/component-register.d.ts +15 -0
  207. package/dist/mcp/tools/component-register.js +65 -0
  208. package/dist/mcp/tools/component-register.js.map +1 -0
  209. package/dist/mcp/tools/decision-get.js +2 -2
  210. package/dist/mcp/tools/decision-get.js.map +1 -1
  211. package/dist/mcp/tools/index.js +5 -6
  212. package/dist/mcp/tools/index.js.map +1 -1
  213. package/dist/mcp/tools/init-phases.d.ts +2 -0
  214. package/dist/mcp/tools/init-phases.js +21 -5
  215. package/dist/mcp/tools/init-phases.js.map +1 -1
  216. package/dist/mcp/tools/mission-advance.d.ts +3 -4
  217. package/dist/mcp/tools/mission-advance.js +15 -19
  218. package/dist/mcp/tools/mission-advance.js.map +1 -1
  219. package/dist/mcp/tools/mission-resume.js +3 -3
  220. package/dist/mcp/tools/mission-resume.js.map +1 -1
  221. package/dist/mcp/tools/record-decision.js +17 -9
  222. package/dist/mcp/tools/record-decision.js.map +1 -1
  223. package/dist/mcp/tools/resolve-attention.js +70 -34
  224. package/dist/mcp/tools/resolve-attention.js.map +1 -1
  225. package/dist/mcp/tools/resume.js +3 -2
  226. package/dist/mcp/tools/resume.js.map +1 -1
  227. package/dist/mcp/tools/search.js +2 -2
  228. package/dist/mcp/tools/search.js.map +1 -1
  229. package/dist/mcp/tools/task-complete.js +2 -3
  230. package/dist/mcp/tools/task-complete.js.map +1 -1
  231. package/dist/mcp/tools/task-create.js +2 -2
  232. package/dist/mcp/tools/task-create.js.map +1 -1
  233. package/dist/migrate/config-io.d.ts +24 -0
  234. package/dist/migrate/config-io.js +73 -0
  235. package/dist/migrate/config-io.js.map +1 -0
  236. package/dist/migrate/gitignore.d.ts +28 -0
  237. package/dist/migrate/gitignore.js +82 -0
  238. package/dist/migrate/gitignore.js.map +1 -0
  239. package/dist/migrate/index.d.ts +6 -0
  240. package/dist/migrate/index.js +6 -0
  241. package/dist/migrate/index.js.map +1 -0
  242. package/dist/migrate/migrations/0001-drop-dead-config-fields.d.ts +12 -0
  243. package/dist/migrate/migrations/0001-drop-dead-config-fields.js +39 -0
  244. package/dist/migrate/migrations/0001-drop-dead-config-fields.js.map +1 -0
  245. package/dist/migrate/migrations/0002-backfill-gitignore.d.ts +14 -0
  246. package/dist/migrate/migrations/0002-backfill-gitignore.js +40 -0
  247. package/dist/migrate/migrations/0002-backfill-gitignore.js.map +1 -0
  248. package/dist/migrate/registry.d.ts +9 -0
  249. package/dist/migrate/registry.js +11 -0
  250. package/dist/migrate/registry.js.map +1 -0
  251. package/dist/migrate/runner.d.ts +45 -0
  252. package/dist/migrate/runner.js +177 -0
  253. package/dist/migrate/runner.js.map +1 -0
  254. package/dist/migrate/semver.d.ts +11 -0
  255. package/dist/migrate/semver.js +35 -0
  256. package/dist/migrate/semver.js.map +1 -0
  257. package/dist/migrate/types.d.ts +47 -0
  258. package/dist/migrate/types.js +13 -0
  259. package/dist/migrate/types.js.map +1 -0
  260. package/dist/missions/task-link.js +7 -8
  261. package/dist/missions/task-link.js.map +1 -1
  262. package/dist/paths/index.d.ts +12 -1
  263. package/dist/paths/index.js +17 -3
  264. package/dist/paths/index.js.map +1 -1
  265. package/dist/sensors/catalog.js +6 -11
  266. package/dist/sensors/catalog.js.map +1 -1
  267. package/dist/sensors/decisions.js +55 -19
  268. package/dist/sensors/decisions.js.map +1 -1
  269. package/dist/sensors/diff.d.ts +12 -0
  270. package/dist/sensors/diff.js +103 -0
  271. package/dist/sensors/diff.js.map +1 -1
  272. package/dist/sensors/index.d.ts +4 -5
  273. package/dist/sensors/index.js +2 -3
  274. package/dist/sensors/index.js.map +1 -1
  275. package/dist/sensors/runner.d.ts +34 -37
  276. package/dist/sensors/runner.js +63 -53
  277. package/dist/sensors/runner.js.map +1 -1
  278. package/dist/sensors/stub-catalog.d.ts +6 -3
  279. package/dist/sensors/stub-catalog.js +7 -19
  280. package/dist/sensors/stub-catalog.js.map +1 -1
  281. package/dist/sensors/types.d.ts +11 -55
  282. package/dist/sensors/types.js +4 -8
  283. package/dist/sensors/types.js.map +1 -1
  284. package/dist/session-start/build.js +36 -21
  285. package/dist/session-start/build.js.map +1 -1
  286. package/dist/session-start/templates.d.ts +1 -1
  287. package/dist/session-start/templates.js +1 -1
  288. package/dist/status-line/event-queue.js +2 -1
  289. package/dist/status-line/event-queue.js.map +1 -1
  290. package/dist/status-line/reader.js +5 -5
  291. package/dist/status-line/reader.js.map +1 -1
  292. package/dist/status-line/writer.js +2 -1
  293. package/dist/status-line/writer.js.map +1 -1
  294. package/dist/tasks/lifecycle.d.ts +3 -4
  295. package/dist/tasks/lifecycle.js +19 -21
  296. package/dist/tasks/lifecycle.js.map +1 -1
  297. package/dist/trace/index.js +2 -2
  298. package/dist/trace/index.js.map +1 -1
  299. package/dist/update-check.d.ts +28 -0
  300. package/dist/update-check.js +137 -0
  301. package/dist/update-check.js.map +1 -0
  302. package/package.json +2 -2
  303. package/templates/.cairn/git-hooks/commit-msg +33 -5
  304. package/templates/.cairn/git-hooks/post-commit +13 -3
  305. package/templates/.cairn/git-hooks/pre-commit +48 -22
  306. package/templates/.github/workflows/cairn-check.yml +8 -0
  307. package/dist/attention/bulk-accept.d.ts +0 -78
  308. package/dist/attention/bulk-accept.js +0 -348
  309. package/dist/attention/bulk-accept.js.map +0 -1
  310. package/dist/attention/serve/api.d.ts +0 -24
  311. package/dist/attention/serve/api.js +0 -383
  312. package/dist/attention/serve/api.js.map +0 -1
  313. package/dist/attention/serve/index.d.ts +0 -63
  314. package/dist/attention/serve/index.js +0 -219
  315. package/dist/attention/serve/index.js.map +0 -1
  316. package/dist/hooks/read-enrich.d.ts +0 -6
  317. package/dist/hooks/read-enrich.js +0 -11
  318. package/dist/hooks/read-enrich.js.map +0 -1
  319. package/dist/hooks/write-guard.d.ts +0 -6
  320. package/dist/hooks/write-guard.js +0 -11
  321. package/dist/hooks/write-guard.js.map +0 -1
  322. package/dist/init/phases/12-strip.d.ts +0 -10
  323. package/dist/init/phases/12-strip.js +0 -88
  324. package/dist/init/phases/12-strip.js.map +0 -1
  325. package/dist/mcp/tools/attention-serve.d.ts +0 -23
  326. package/dist/mcp/tools/attention-serve.js +0 -84
  327. package/dist/mcp/tools/attention-serve.js.map +0 -1
  328. package/dist/mcp/tools/attention-wait.d.ts +0 -18
  329. package/dist/mcp/tools/attention-wait.js +0 -84
  330. package/dist/mcp/tools/attention-wait.js.map +0 -1
  331. package/dist/mcp/tools/bulk-accept-attention.d.ts +0 -22
  332. package/dist/mcp/tools/bulk-accept-attention.js +0 -84
  333. package/dist/mcp/tools/bulk-accept-attention.js.map +0 -1
  334. package/dist/sensors/attestation.d.ts +0 -44
  335. package/dist/sensors/attestation.js +0 -262
  336. package/dist/sensors/attestation.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/components/emit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/components/emit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Headerless component freshness — the edit-time gate (ghost-mode design).
3
+ *
4
+ * In committed mode the `@cairn <Name>` header rots in place the moment someone
5
+ * edits a component and ignores the comment — caught only by a later sensor.
6
+ * Ghost has no header, so the out-of-repo registry has to *detect* a body change
7
+ * at edit time and decide whether the classification it stored is still valid.
8
+ *
9
+ * The hard rule: **the hot edit path never calls the LLM.** This module is the
10
+ * cheap-to-expensive gate that runs on every Write/Edit and exits free at the
11
+ * first layer that settles it. Reclassification (the only LLM spend) is deferred
12
+ * to a quota-expected context (a `components audit` / backfill, or the operator
13
+ * acting on the surfaced "N components changed" offer) — never here.
14
+ *
15
+ * - **L0 — registered?** Edited path not in the registry → stop. Zero cost.
16
+ * (Most edits — committed repos exit even earlier on the `isGhost` guard.)
17
+ * - **L1 — body changed?** Whole-file fingerprint matches the stored hash →
18
+ * stop. Zero work. (A Write that didn't actually change bytes.)
19
+ * - **L2 — identity changed (deterministic only)?** Body differs, but the
20
+ * exports + unit-shape are unchanged and the registered export symbol still
21
+ * exists → an internal refactor → refresh the fingerprint, no flag, no LLM.
22
+ * - **L3 — identity may have genuinely changed.** Exports changed, the shape
23
+ * flipped, or the registered export vanished → mark the entry
24
+ * `needs_reconfirm` (+ refresh the fingerprint/snapshot), free. The expensive
25
+ * reclassify runs later.
26
+ *
27
+ * v1 anchors on a whole-file fingerprint (one component per file is the UI
28
+ * convention, so the file body *is* the component span); the export-span hash is
29
+ * a later precision refinement. Every path is `isGhost`-gated — committed mode's
30
+ * header is its own SoT and this never runs there.
31
+ */
32
+ export type FreshnessAction = "inert" | "not-registered" | "unchanged" | "refreshed" | "reconfirm";
33
+ export interface FreshnessResult {
34
+ action: FreshnessAction;
35
+ /** Repo-relative path the gate ran against. */
36
+ file: string;
37
+ /** The registered component name, when the path resolved to one. */
38
+ name: string | null;
39
+ /**
40
+ * Operator-facing one-liner for the L3 case (surfaced as a PostToolUse hint),
41
+ * or null for every settled-free outcome.
42
+ */
43
+ hint: string | null;
44
+ }
45
+ /**
46
+ * Run the L0–L3 freshness gate against one repo-relative file. Pure, fast,
47
+ * deterministic — NO LLM. Mutates the registry only when a registered
48
+ * component's body actually changed (L2 refresh or L3 flag). Best-effort: any
49
+ * failure degrades to `inert` so the hot Write path is never blocked.
50
+ */
51
+ export declare function runComponentFreshness(repoRoot: string, relPath: string): FreshnessResult;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Headerless component freshness — the edit-time gate (ghost-mode design).
3
+ *
4
+ * In committed mode the `@cairn <Name>` header rots in place the moment someone
5
+ * edits a component and ignores the comment — caught only by a later sensor.
6
+ * Ghost has no header, so the out-of-repo registry has to *detect* a body change
7
+ * at edit time and decide whether the classification it stored is still valid.
8
+ *
9
+ * The hard rule: **the hot edit path never calls the LLM.** This module is the
10
+ * cheap-to-expensive gate that runs on every Write/Edit and exits free at the
11
+ * first layer that settles it. Reclassification (the only LLM spend) is deferred
12
+ * to a quota-expected context (a `components audit` / backfill, or the operator
13
+ * acting on the surfaced "N components changed" offer) — never here.
14
+ *
15
+ * - **L0 — registered?** Edited path not in the registry → stop. Zero cost.
16
+ * (Most edits — committed repos exit even earlier on the `isGhost` guard.)
17
+ * - **L1 — body changed?** Whole-file fingerprint matches the stored hash →
18
+ * stop. Zero work. (A Write that didn't actually change bytes.)
19
+ * - **L2 — identity changed (deterministic only)?** Body differs, but the
20
+ * exports + unit-shape are unchanged and the registered export symbol still
21
+ * exists → an internal refactor → refresh the fingerprint, no flag, no LLM.
22
+ * - **L3 — identity may have genuinely changed.** Exports changed, the shape
23
+ * flipped, or the registered export vanished → mark the entry
24
+ * `needs_reconfirm` (+ refresh the fingerprint/snapshot), free. The expensive
25
+ * reclassify runs later.
26
+ *
27
+ * v1 anchors on a whole-file fingerprint (one component per file is the UI
28
+ * convention, so the file body *is* the component span); the export-span hash is
29
+ * a later precision refinement. Every path is `isGhost`-gated — committed mode's
30
+ * header is its own SoT and this never runs there.
31
+ */
32
+ import { existsSync, readFileSync } from "node:fs";
33
+ import { join } from "node:path";
34
+ import { bodyContentHash, extractExportNames, isGhost, lookupComponentEntryByFile, profileForFile, readComponentRegistry, registerComponentEntry, } from "@isaacriehm/cairn-state";
35
+ import { logger } from "../logger.js";
36
+ const log = logger("components.freshness");
37
+ function inert(file) {
38
+ return { action: "inert", file, name: null, hint: null };
39
+ }
40
+ /** Set equality, order-independent — a reorder is not an identity change. */
41
+ function sameSet(a, b) {
42
+ if (a.length !== b.length)
43
+ return false;
44
+ const sa = new Set(a);
45
+ for (const x of b)
46
+ if (!sa.has(x))
47
+ return false;
48
+ return true;
49
+ }
50
+ /**
51
+ * Run the L0–L3 freshness gate against one repo-relative file. Pure, fast,
52
+ * deterministic — NO LLM. Mutates the registry only when a registered
53
+ * component's body actually changed (L2 refresh or L3 flag). Best-effort: any
54
+ * failure degrades to `inert` so the hot Write path is never blocked.
55
+ */
56
+ export function runComponentFreshness(repoRoot, relPath) {
57
+ try {
58
+ // Committed mode: the in-file header is the SoT — this gate does not apply.
59
+ if (!isGhost(repoRoot))
60
+ return inert(relPath);
61
+ // L0 — is this a registered unit? (Cheap: one small yaml read, memoized
62
+ // isGhost already short-circuited committed repos to zero cost.)
63
+ const reg = readComponentRegistry(repoRoot);
64
+ const entry = lookupComponentEntryByFile(reg, relPath);
65
+ if (entry === null) {
66
+ return { action: "not-registered", file: relPath, name: null, hint: null };
67
+ }
68
+ const abs = join(repoRoot, relPath);
69
+ if (!existsSync(abs)) {
70
+ // Deletion is GC/orphan territory, not freshness — leave the entry as-is.
71
+ return { action: "not-registered", file: relPath, name: entry.name, hint: null };
72
+ }
73
+ let source;
74
+ try {
75
+ source = readFileSync(abs, "utf8");
76
+ }
77
+ catch {
78
+ return { action: "not-registered", file: relPath, name: entry.name, hint: null };
79
+ }
80
+ // L1 — body changed? Whole-file fingerprint vs the stored hash.
81
+ const hash = bodyContentHash(source);
82
+ if (hash === entry.anchor.content_hash) {
83
+ return { action: "unchanged", file: relPath, name: entry.name, hint: null };
84
+ }
85
+ // Body differs — L2/L3 deterministic identity check.
86
+ const exportsNow = extractExportNames(source, relPath);
87
+ const shapeNow = profileForFile(relPath)?.isUnitShaped(source, relPath) ?? false;
88
+ // No baseline snapshot (legacy entry registered before snapshots existed):
89
+ // backfill it on this edit, never flag — we have nothing to compare against.
90
+ const hasBaseline = (entry.exports?.length ?? 0) > 0 || entry.unit_shaped !== undefined;
91
+ const identityChanged = hasBaseline &&
92
+ (!sameSet(exportsNow, entry.exports ?? []) ||
93
+ (entry.unit_shaped !== undefined && entry.unit_shaped !== shapeNow) ||
94
+ !exportsNow.includes(entry.export));
95
+ const updated = {
96
+ ...entry,
97
+ anchor: { ...entry.anchor, content_hash: hash },
98
+ exports: exportsNow,
99
+ unit_shaped: shapeNow,
100
+ // Latch the flag: an internal refactor must NOT clear a reconfirm that a
101
+ // prior identity change already raised — only an actual reclassify clears
102
+ // it. So once true, stay true until re-confirmed.
103
+ needs_reconfirm: identityChanged ? true : entry.needs_reconfirm,
104
+ };
105
+ registerComponentEntry(repoRoot, updated, reg);
106
+ if (identityChanged) {
107
+ return {
108
+ action: "reconfirm",
109
+ file: relPath,
110
+ name: entry.name,
111
+ hint: `⬡ ${entry.name} changed shape/exports — re-confirm its registry purpose with \`cairn components audit\` (ghost: no source edit).`,
112
+ };
113
+ }
114
+ return { action: "refreshed", file: relPath, name: entry.name, hint: null };
115
+ }
116
+ catch (err) {
117
+ log.warn({ err: err instanceof Error ? err.message : String(err), file: relPath }, "component freshness gate failed; degrading to inert");
118
+ return inert(relPath);
119
+ }
120
+ }
121
+ //# sourceMappingURL=freshness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freshness.js","sourceRoot":"","sources":["../../src/components/freshness.ts"],"names":[],"mappings":"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"}
@@ -6,3 +6,7 @@ export { runComponentAudit } from "./audit.js";
6
6
  export type { ComponentAuditFinding, ComponentAuditKind, ComponentAuditResult, } from "./audit.js";
7
7
  export { emitComponentStore } from "./emit.js";
8
8
  export type { ComponentEmitResult } from "./emit.js";
9
+ export { runComponentFreshness } from "./freshness.js";
10
+ export type { FreshnessAction, FreshnessResult } from "./freshness.js";
11
+ export { runComponentReconfirm } from "./reconfirm.js";
12
+ export type { ReconfirmArgs, ReconfirmResult, ReconfirmVerdict } from "./reconfirm.js";
@@ -2,4 +2,6 @@ export { runComponentCheck } from "./check.js";
2
2
  export { buildComponentIndex } from "./index-build.js";
3
3
  export { runComponentAudit } from "./audit.js";
4
4
  export { emitComponentStore } from "./emit.js";
5
+ export { runComponentFreshness } from "./freshness.js";
6
+ export { runComponentReconfirm } from "./reconfirm.js";
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAM/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAM/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Headerless component re-confirm — the deferred reclassify tier (§3.8.1).
3
+ *
4
+ * The freshness gate (`freshness.ts`) runs on every edit and, when a registered
5
+ * component's identity changes, latches `needs_reconfirm` — deterministically,
6
+ * NO LLM. This module is the *other half*: the narrow, quota-gated pass that
7
+ * actually decides whether the stored classification still holds and clears the
8
+ * flag. It runs ONLY in a quota-expected context (an explicit
9
+ * `cairn_component_reconfirm`, a `components audit` refresh, or the operator
10
+ * acting on the surfaced "N components changed" offer) — never on the hot edit
11
+ * path.
12
+ *
13
+ * Tier split (§3.8.2): *initial* classification ("what IS this component —
14
+ * category, purpose") is a rich judgment → Sonnet (the adoption annotator). A
15
+ * *re-confirm* on a changed body ("does the EXISTING category still fit?") is a
16
+ * narrow yes/no → **Haiku**. That keeps the recurring, higher-frequency path the
17
+ * cheapest one.
18
+ *
19
+ * Cost controls, mirroring sot-align:
20
+ * - **Hard per-run cap** on Haiku calls; entries past it stay flagged
21
+ * (deferred), logged via the returned counts — never silently dropped.
22
+ * - **Verdict cached on the body fingerprint** — re-running over a still-flagged
23
+ * component whose body hasn't changed is a free cache hit, so repeated sweeps
24
+ * don't re-burn quota on a stuck-stale entry.
25
+ *
26
+ * A "fits" verdict clears the flag. A "stale"/"ambiguous" verdict leaves it
27
+ * flagged; the operator resolves it by re-registering (`cairn_component_register`
28
+ * overwrites the entry — and, building it fresh, drops the flag). Every path is
29
+ * `isGhost`-gated.
30
+ */
31
+ export type ReconfirmVerdict = "fits" | "stale" | "ambiguous";
32
+ export interface ReconfirmArgs {
33
+ repoRoot: string;
34
+ /** Hard cap on fresh Haiku calls per run. Rest stay flagged (deferred). */
35
+ cap?: number;
36
+ /** Reconfirm a single file (operator acting on one offer). Omit = sweep all. */
37
+ onlyFile?: string;
38
+ /** Mock judge for smokes — default is the real Haiku judge. */
39
+ mockJudge?: (args: {
40
+ name: string;
41
+ category: string;
42
+ purpose: string;
43
+ body: string;
44
+ }) => Promise<ReconfirmVerdict>;
45
+ }
46
+ export interface ReconfirmResult {
47
+ /** Flagged entries in scope this run. */
48
+ considered: number;
49
+ /** Verdict "fits" → flag cleared. */
50
+ cleared: number;
51
+ /** Verdict "stale"/"ambiguous" (or unreadable source) → left flagged. */
52
+ stillStale: number;
53
+ /** Past the Haiku cap → untouched, still flagged. */
54
+ deferred: number;
55
+ /** Fresh Haiku calls made. */
56
+ haikuCalls: number;
57
+ /** Verdicts served from the fingerprint cache (free). */
58
+ cacheHits: number;
59
+ }
60
+ /**
61
+ * Re-confirm flagged components. No-op (zeros) outside ghost. NEVER called from
62
+ * the hot edit path — this is the quota-expected reclassify pass.
63
+ */
64
+ export declare function runComponentReconfirm(args: ReconfirmArgs): Promise<ReconfirmResult>;
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Headerless component re-confirm — the deferred reclassify tier (§3.8.1).
3
+ *
4
+ * The freshness gate (`freshness.ts`) runs on every edit and, when a registered
5
+ * component's identity changes, latches `needs_reconfirm` — deterministically,
6
+ * NO LLM. This module is the *other half*: the narrow, quota-gated pass that
7
+ * actually decides whether the stored classification still holds and clears the
8
+ * flag. It runs ONLY in a quota-expected context (an explicit
9
+ * `cairn_component_reconfirm`, a `components audit` refresh, or the operator
10
+ * acting on the surfaced "N components changed" offer) — never on the hot edit
11
+ * path.
12
+ *
13
+ * Tier split (§3.8.2): *initial* classification ("what IS this component —
14
+ * category, purpose") is a rich judgment → Sonnet (the adoption annotator). A
15
+ * *re-confirm* on a changed body ("does the EXISTING category still fit?") is a
16
+ * narrow yes/no → **Haiku**. That keeps the recurring, higher-frequency path the
17
+ * cheapest one.
18
+ *
19
+ * Cost controls, mirroring sot-align:
20
+ * - **Hard per-run cap** on Haiku calls; entries past it stay flagged
21
+ * (deferred), logged via the returned counts — never silently dropped.
22
+ * - **Verdict cached on the body fingerprint** — re-running over a still-flagged
23
+ * component whose body hasn't changed is a free cache hit, so repeated sweeps
24
+ * don't re-burn quota on a stuck-stale entry.
25
+ *
26
+ * A "fits" verdict clears the flag. A "stale"/"ambiguous" verdict leaves it
27
+ * flagged; the operator resolves it by re-registering (`cairn_component_register`
28
+ * overwrites the entry — and, building it fresh, drops the flag). Every path is
29
+ * `isGhost`-gated.
30
+ */
31
+ import { existsSync, readFileSync } from "node:fs";
32
+ import { join } from "node:path";
33
+ import { bodyContentHash, cairnDir, isGhost, readComponentRegistry, registerComponentEntry, writeFileSafe, } from "@isaacriehm/cairn-state";
34
+ import { runClaude } from "../claude/index.js";
35
+ import { logger } from "../logger.js";
36
+ const log = logger("components.reconfirm");
37
+ const DEFAULT_CAP = 10;
38
+ const BODY_CAP = 2_000;
39
+ const PER_HAIKU_TIMEOUT_MS = 30_000;
40
+ /**
41
+ * Re-confirm flagged components. No-op (zeros) outside ghost. NEVER called from
42
+ * the hot edit path — this is the quota-expected reclassify pass.
43
+ */
44
+ export async function runComponentReconfirm(args) {
45
+ const { repoRoot } = args;
46
+ const result = {
47
+ considered: 0,
48
+ cleared: 0,
49
+ stillStale: 0,
50
+ deferred: 0,
51
+ haikuCalls: 0,
52
+ cacheHits: 0,
53
+ };
54
+ if (!isGhost(repoRoot))
55
+ return result;
56
+ const reg = readComponentRegistry(repoRoot);
57
+ let flagged = reg.entries.filter((e) => e.needs_reconfirm === true);
58
+ if (args.onlyFile !== undefined)
59
+ flagged = flagged.filter((e) => e.file === args.onlyFile);
60
+ result.considered = flagged.length;
61
+ if (flagged.length === 0)
62
+ return result;
63
+ const cap = args.cap ?? DEFAULT_CAP;
64
+ for (const entry of flagged) {
65
+ const abs = join(repoRoot, entry.file);
66
+ if (!existsSync(abs)) {
67
+ // A vanished file is GC/orphan territory — leave the flag, count stale.
68
+ result.stillStale += 1;
69
+ continue;
70
+ }
71
+ let source;
72
+ try {
73
+ source = readFileSync(abs, "utf8");
74
+ }
75
+ catch {
76
+ result.stillStale += 1;
77
+ continue;
78
+ }
79
+ const fingerprint = bodyContentHash(source);
80
+ let verdict = readVerdictCache(repoRoot, entry, fingerprint);
81
+ if (verdict !== null) {
82
+ result.cacheHits += 1;
83
+ }
84
+ else {
85
+ // Cap fires only on a fresh call — a cache hit at cap is still free.
86
+ if (result.haikuCalls >= cap) {
87
+ result.deferred += 1;
88
+ continue;
89
+ }
90
+ result.haikuCalls += 1;
91
+ verdict = await judge({
92
+ name: entry.name,
93
+ category: entry.category,
94
+ purpose: entry.purpose,
95
+ body: source,
96
+ mock: args.mockJudge,
97
+ });
98
+ writeVerdictCache(repoRoot, entry, fingerprint, verdict);
99
+ }
100
+ if (verdict === "fits") {
101
+ clearFlag(repoRoot, entry);
102
+ result.cleared += 1;
103
+ }
104
+ else {
105
+ result.stillStale += 1;
106
+ }
107
+ }
108
+ return result;
109
+ }
110
+ /** Upsert the entry with `needs_reconfirm` dropped. */
111
+ function clearFlag(repoRoot, entry) {
112
+ const { needs_reconfirm: _drop, ...rest } = entry;
113
+ registerComponentEntry(repoRoot, rest);
114
+ }
115
+ /* -------------------------------------------------------------------------- */
116
+ /* Haiku judge */
117
+ /* -------------------------------------------------------------------------- */
118
+ const RECONFIRM_SCHEMA = {
119
+ type: "object",
120
+ additionalProperties: false,
121
+ required: ["verdict"],
122
+ properties: {
123
+ verdict: { type: "string", enum: ["fits", "stale", "ambiguous"] },
124
+ },
125
+ };
126
+ const RECONFIRM_SYSTEM = `You re-confirm whether a UI component's stored classification still fits its current code.
127
+
128
+ Reply ONLY JSON: { "verdict": "fits" | "stale" | "ambiguous" }.
129
+ - "fits" the stored category AND purpose still accurately describe the component.
130
+ - "stale" the category no longer fits, or the purpose now misdescribes it.
131
+ - "ambiguous" cannot tell from the code.
132
+
133
+ The component body changed since it was classified. Your job is only to decide
134
+ whether the EXISTING category/purpose still hold — not to invent a new one.
135
+ Default to "fits" unless the code clearly diverged from the stored classification.`;
136
+ async function judge(args) {
137
+ if (args.mock !== undefined) {
138
+ return args.mock({
139
+ name: args.name,
140
+ category: args.category,
141
+ purpose: args.purpose,
142
+ body: args.body,
143
+ });
144
+ }
145
+ const body = args.body.length > BODY_CAP ? `${args.body.slice(0, BODY_CAP)}\n…[truncated]` : args.body;
146
+ const prompt = [
147
+ `Component: ${args.name}`,
148
+ `Stored category: ${args.category}`,
149
+ `Stored purpose: ${args.purpose}`,
150
+ "",
151
+ "---current source---",
152
+ body,
153
+ "",
154
+ "Does the stored category + purpose still fit?",
155
+ ].join("\n");
156
+ try {
157
+ const res = await runClaude({
158
+ tier: "haiku",
159
+ system: RECONFIRM_SYSTEM,
160
+ prompt,
161
+ jsonSchema: RECONFIRM_SCHEMA,
162
+ timeoutMs: PER_HAIKU_TIMEOUT_MS,
163
+ isolateAmbientContext: true,
164
+ });
165
+ const v = res.parsed?.verdict;
166
+ if (v === "fits" || v === "stale" || v === "ambiguous")
167
+ return v;
168
+ return "fits"; // conservative — a parse miss must not nag the operator
169
+ }
170
+ catch (err) {
171
+ log.warn({ err: err instanceof Error ? err.message : String(err), name: args.name }, "reconfirm judge failed; defaulting to fits");
172
+ return "fits";
173
+ }
174
+ }
175
+ /* -------------------------------------------------------------------------- */
176
+ /* Verdict cache — keyed on (entry identity, body fingerprint) */
177
+ /* -------------------------------------------------------------------------- */
178
+ function verdictCachePath(repoRoot, entry, fingerprint) {
179
+ const keyHash = bodyContentHash(`${entry.workspace} ${entry.file} ${entry.export}`).slice(0, 12);
180
+ return cairnDir(repoRoot, "cache", "haiku", "component-reconfirm", `${fingerprint.slice(0, 12)}-${keyHash}.json`);
181
+ }
182
+ function readVerdictCache(repoRoot, entry, fingerprint) {
183
+ const p = verdictCachePath(repoRoot, entry, fingerprint);
184
+ if (!existsSync(p))
185
+ return null;
186
+ try {
187
+ const v = JSON.parse(readFileSync(p, "utf8")).verdict;
188
+ if (v === "fits" || v === "stale" || v === "ambiguous")
189
+ return v;
190
+ return null;
191
+ }
192
+ catch {
193
+ return null;
194
+ }
195
+ }
196
+ function writeVerdictCache(repoRoot, entry, fingerprint, verdict) {
197
+ try {
198
+ writeFileSafe(verdictCachePath(repoRoot, entry, fingerprint), JSON.stringify({ verdict, ts: new Date().toISOString() }, null, 2));
199
+ }
200
+ catch {
201
+ /* best-effort */
202
+ }
203
+ }
204
+ //# sourceMappingURL=reconfirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconfirm.js","sourceRoot":"","sources":["../../src/components/reconfirm.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ import { join } from "node:path";
10
10
  import { simpleGit } from "simple-git";
11
11
  import { parse as parseYaml } from "yaml";
12
12
  import { z } from "zod";
13
- import { parseFrontmatter } from "@isaacriehm/cairn-state";
13
+ import { cairnDir, parseFrontmatter } from "@isaacriehm/cairn-state";
14
14
  /** Hard cap on rendered handoff size (chars). ~600 tokens. */
15
15
  const MAX_CHARS = 2_400;
16
16
  /** Cap on commits emitted before truncation kicks in. */
@@ -35,7 +35,7 @@ const SpecFrontmatterSchema = z.object({
35
35
  * task is in flight.
36
36
  */
37
37
  export async function buildHandoffBlock(repoRoot) {
38
- const activeDir = join(repoRoot, ".cairn", "tasks", "active");
38
+ const activeDir = cairnDir(repoRoot, "tasks", "active");
39
39
  if (!existsSync(activeDir))
40
40
  return null;
41
41
  let matched = null;
@@ -72,7 +72,7 @@ export async function buildHandoffBlock(repoRoot) {
72
72
  if (matched === null)
73
73
  return null;
74
74
  // Read meta.json for the run's sha_pin.
75
- const metaPath = join(repoRoot, ".cairn", "runs", "active", matched.runId, "meta.json");
75
+ const metaPath = cairnDir(repoRoot, "runs", "active", matched.runId, "meta.json");
76
76
  if (!existsSync(metaPath))
77
77
  return null;
78
78
  let shaPin = null;
@@ -1 +1 @@
1
- {"version":3,"file":"handoff-builder.js","sourceRoot":"","sources":["../../src/context/handoff-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handoff-builder.js","sourceRoot":"","sources":["../../src/context/handoff-builder.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@
11
11
  import { existsSync, readFileSync, readdirSync } from "node:fs";
12
12
  import { join } from "node:path";
13
13
  import { parse as parseYaml } from "yaml";
14
- import { parseFrontmatter } from "@isaacriehm/cairn-state";
14
+ import { cairnDir, parseFrontmatter } from "@isaacriehm/cairn-state";
15
15
  import { z } from "zod";
16
16
  const StatusFileSchema = z.object({
17
17
  phase: z.string().optional(),
@@ -39,7 +39,7 @@ function mapPhase(phase) {
39
39
  }
40
40
  }
41
41
  export function readActiveTaskSummary(repoRoot) {
42
- const activeDir = join(repoRoot, ".cairn", "tasks", "active");
42
+ const activeDir = cairnDir(repoRoot, "tasks", "active");
43
43
  if (!existsSync(activeDir))
44
44
  return null;
45
45
  let dirents;
@@ -1 +1 @@
1
- {"version":3,"file":"task-summary.js","sourceRoot":"","sources":["../../src/context/task-summary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-summary.js","sourceRoot":"","sources":["../../src/context/task-summary.ts"],"names":[],"mappings":"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"}