@isaacriehm/cairn-core 0.7.3 → 0.8.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 (117) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/doctor/index.js +57 -0
  3. package/dist/doctor/index.js.map +1 -1
  4. package/dist/gc/citation-integrity.js +3 -1
  5. package/dist/gc/citation-integrity.js.map +1 -1
  6. package/dist/gc/doc-claims.d.ts +31 -0
  7. package/dist/gc/doc-claims.js +213 -0
  8. package/dist/gc/doc-claims.js.map +1 -0
  9. package/dist/gc/doc-source-drift.d.ts +31 -0
  10. package/dist/gc/doc-source-drift.js +190 -0
  11. package/dist/gc/doc-source-drift.js.map +1 -0
  12. package/dist/gc/index.d.ts +4 -0
  13. package/dist/gc/index.js +2 -0
  14. package/dist/gc/index.js.map +1 -1
  15. package/dist/gc/sweep.js +18 -0
  16. package/dist/gc/sweep.js.map +1 -1
  17. package/dist/gc/types.d.ts +2 -2
  18. package/dist/hooks/runners/context-threshold.d.ts +63 -0
  19. package/dist/hooks/runners/context-threshold.js +179 -0
  20. package/dist/hooks/runners/context-threshold.js.map +1 -0
  21. package/dist/hooks/runners/gc-autotrigger.d.ts +49 -0
  22. package/dist/hooks/runners/gc-autotrigger.js +87 -0
  23. package/dist/hooks/runners/gc-autotrigger.js.map +1 -0
  24. package/dist/hooks/runners/index.d.ts +2 -0
  25. package/dist/hooks/runners/index.js +1 -0
  26. package/dist/hooks/runners/index.js.map +1 -1
  27. package/dist/hooks/runners/session-start.js +110 -6
  28. package/dist/hooks/runners/session-start.js.map +1 -1
  29. package/dist/hooks/runners/stop.js +119 -0
  30. package/dist/hooks/runners/stop.js.map +1 -1
  31. package/dist/init/index.d.ts +5 -1
  32. package/dist/init/index.js +2 -0
  33. package/dist/init/index.js.map +1 -1
  34. package/dist/init/ingest-docs.d.ts +6 -1
  35. package/dist/init/ingest-docs.js.map +1 -1
  36. package/dist/init/init.js +11 -6
  37. package/dist/init/init.js.map +1 -1
  38. package/dist/init/mapper-parallel.js +13 -6
  39. package/dist/init/mapper-parallel.js.map +1 -1
  40. package/dist/init/phases/1-detect.d.ts +17 -4
  41. package/dist/init/phases/1-detect.js +48 -4
  42. package/dist/init/phases/1-detect.js.map +1 -1
  43. package/dist/init/phases/10-rules-merge.js +13 -1
  44. package/dist/init/phases/10-rules-merge.js.map +1 -1
  45. package/dist/init/phases/11-baseline.js.map +1 -1
  46. package/dist/init/phases/12-strip.js +14 -1
  47. package/dist/init/phases/12-strip.js.map +1 -1
  48. package/dist/init/phases/3-mapper.js.map +1 -1
  49. package/dist/init/phases/4-seed.js +1 -1
  50. package/dist/init/phases/4-seed.js.map +1 -1
  51. package/dist/init/phases/5-pilot.js.map +1 -1
  52. package/dist/init/phases/6-brand.js +2 -4
  53. package/dist/init/phases/6-brand.js.map +1 -1
  54. package/dist/init/phases/8-docs-ingest.js +13 -1
  55. package/dist/init/phases/8-docs-ingest.js.map +1 -1
  56. package/dist/init/phases/9-source-comments.js +13 -1
  57. package/dist/init/phases/9-source-comments.js.map +1 -1
  58. package/dist/init/phases/orchestrator.d.ts +10 -0
  59. package/dist/init/phases/orchestrator.js +12 -0
  60. package/dist/init/phases/orchestrator.js.map +1 -1
  61. package/dist/init/phases/parallel-8910.js +29 -4
  62. package/dist/init/phases/parallel-8910.js.map +1 -1
  63. package/dist/init/phases/source-comments-output-io.d.ts +7 -2
  64. package/dist/init/phases/source-comments-output-io.js.map +1 -1
  65. package/dist/init/phases/types.d.ts +49 -9
  66. package/dist/init/phases/types.js.map +1 -1
  67. package/dist/init/post-git-init.d.ts +53 -0
  68. package/dist/init/post-git-init.js +74 -0
  69. package/dist/init/post-git-init.js.map +1 -0
  70. package/dist/init/preflight-guards.d.ts +11 -2
  71. package/dist/init/preflight-guards.js +27 -5
  72. package/dist/init/preflight-guards.js.map +1 -1
  73. package/dist/init/rules-merge/index.d.ts +1 -1
  74. package/dist/init/rules-merge/ingest.d.ts +6 -1
  75. package/dist/init/rules-merge/ingest.js.map +1 -1
  76. package/dist/init/skill-budget.d.ts +39 -0
  77. package/dist/init/skill-budget.js +99 -0
  78. package/dist/init/skill-budget.js.map +1 -0
  79. package/dist/init/types.d.ts +9 -0
  80. package/dist/mcp/bootstrap-guard.js +2 -2
  81. package/dist/mcp/bootstrap-guard.js.map +1 -1
  82. package/dist/mcp/schemas.d.ts +34 -0
  83. package/dist/mcp/schemas.js +50 -0
  84. package/dist/mcp/schemas.js.map +1 -1
  85. package/dist/mcp/telemetry.d.ts +1 -1
  86. package/dist/mcp/tools/bootstrap-retry.d.ts +23 -0
  87. package/dist/mcp/tools/bootstrap-retry.js +53 -0
  88. package/dist/mcp/tools/bootstrap-retry.js.map +1 -0
  89. package/dist/mcp/tools/index.js +10 -0
  90. package/dist/mcp/tools/index.js.map +1 -1
  91. package/dist/mcp/tools/init-phases.js +4 -8
  92. package/dist/mcp/tools/init-phases.js.map +1 -1
  93. package/dist/mcp/tools/resume.d.ts +21 -0
  94. package/dist/mcp/tools/resume.js +88 -0
  95. package/dist/mcp/tools/resume.js.map +1 -0
  96. package/dist/mcp/tools/task-complete.d.ts +23 -0
  97. package/dist/mcp/tools/task-complete.js +51 -0
  98. package/dist/mcp/tools/task-complete.js.map +1 -0
  99. package/dist/mcp/tools/task-create.js +17 -11
  100. package/dist/mcp/tools/task-create.js.map +1 -1
  101. package/dist/mcp/tools/task-journal-append.d.ts +22 -0
  102. package/dist/mcp/tools/task-journal-append.js +44 -0
  103. package/dist/mcp/tools/task-journal-append.js.map +1 -0
  104. package/dist/paths/index.js +1 -1
  105. package/dist/paths/index.js.map +1 -1
  106. package/dist/status-line/format.js +20 -0
  107. package/dist/status-line/format.js.map +1 -1
  108. package/dist/tasks/index.d.ts +2 -0
  109. package/dist/tasks/index.js +2 -0
  110. package/dist/tasks/index.js.map +1 -0
  111. package/dist/tasks/lifecycle.d.ts +107 -0
  112. package/dist/tasks/lifecycle.js +302 -0
  113. package/dist/tasks/lifecycle.js.map +1 -0
  114. package/dist/trace/index.d.ts +1 -1
  115. package/dist/trace/index.js +2 -2
  116. package/dist/trace/index.js.map +1 -1
  117. package/package.json +2 -2
@@ -0,0 +1,302 @@
1
+ /**
2
+ * Task lifecycle helpers — the only sanctioned writers of `status.yaml`
3
+ * phase transitions and the only path that moves a task directory from
4
+ * `tasks/active/` to `tasks/done/`.
5
+ *
6
+ * Two surfaces:
7
+ * - `completeTask` — terminal phase + dir move; emits invalidation.
8
+ * - `transitionTaskPhase` — in-place phase write (e.g. running →
9
+ * ready_for_review); no dir move.
10
+ *
11
+ * Plus a read helper `readTaskAttestationState` used by the Stop hook
12
+ * auto-graduator to decide which transition (if any) to apply.
13
+ *
14
+ * Tasks created by `cairn_task_create` start at `phase: running`.
15
+ * The reviewer subagent calls `completeTask` after writing
16
+ * `attestation.yaml`; the Stop hook auto-graduator handles the cases
17
+ * where the reviewer is skipped (trivial tasks with
18
+ * `needs_review: false`).
19
+ */
20
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, writeFileSync, } from "node:fs";
21
+ import { join } from "node:path";
22
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
23
+ import { writeInvalidationEvent } from "../events/index.js";
24
+ /**
25
+ * Write the terminal phase + move the active dir → done. Returns an
26
+ * error envelope on failure rather than throwing — callers (MCP tool,
27
+ * Stop hook) decide how to surface.
28
+ */
29
+ export function completeTask(args) {
30
+ const activeDir = join(args.repoRoot, ".cairn", "tasks", "active", args.taskId);
31
+ const doneRoot = join(args.repoRoot, ".cairn", "tasks", "done");
32
+ const doneDir = join(doneRoot, args.taskId);
33
+ if (!existsSync(activeDir)) {
34
+ if (existsSync(doneDir)) {
35
+ return {
36
+ ok: false,
37
+ code: "ALREADY_COMPLETED",
38
+ message: `Task ${args.taskId} already in tasks/done/`,
39
+ };
40
+ }
41
+ return {
42
+ ok: false,
43
+ code: "TASK_NOT_FOUND",
44
+ message: `No active task ${args.taskId}`,
45
+ };
46
+ }
47
+ if (existsSync(doneDir)) {
48
+ return {
49
+ ok: false,
50
+ code: "DONE_DIR_COLLISION",
51
+ message: `tasks/done/${args.taskId} already exists; refusing to overwrite. Investigate stale prior completion.`,
52
+ };
53
+ }
54
+ const statusPath = join(activeDir, "status.yaml");
55
+ const status = readStatusYaml(statusPath);
56
+ const completedAt = new Date().toISOString();
57
+ status.id = status.id ?? args.taskId;
58
+ status.phase = args.outcome;
59
+ status.completed_at = completedAt;
60
+ if (args.summary !== undefined && args.summary.length > 0) {
61
+ status.outcome_summary = args.summary;
62
+ }
63
+ writeFileSync(statusPath, stringifyYaml(status), "utf8");
64
+ mkdirSync(doneRoot, { recursive: true });
65
+ renameSync(activeDir, doneDir);
66
+ try {
67
+ writeInvalidationEvent(args.repoRoot, {
68
+ kind: "task-completed",
69
+ refs: [{ kind: "task", id: args.taskId }],
70
+ source: { session_id: null, tool: args.source ?? "cairn_task_complete" },
71
+ });
72
+ }
73
+ catch {
74
+ // best-effort emission — completion already landed on disk
75
+ }
76
+ return {
77
+ ok: true,
78
+ taskId: args.taskId,
79
+ outcome: args.outcome,
80
+ completedAt,
81
+ movedTo: `.cairn/tasks/done/${args.taskId}/`,
82
+ };
83
+ }
84
+ export function transitionTaskPhase(args) {
85
+ const activeDir = join(args.repoRoot, ".cairn", "tasks", "active", args.taskId);
86
+ if (!existsSync(activeDir))
87
+ return false;
88
+ const statusPath = join(activeDir, "status.yaml");
89
+ if (!existsSync(statusPath))
90
+ return false;
91
+ const status = readStatusYaml(statusPath);
92
+ status.phase = args.newPhase;
93
+ writeFileSync(statusPath, stringifyYaml(status), "utf8");
94
+ return true;
95
+ }
96
+ /**
97
+ * Read the attestation + needs_review state for an active task. Used
98
+ * by the Stop hook auto-graduator to decide which phase transition (if
99
+ * any) to apply.
100
+ */
101
+ export function readTaskAttestationState(repoRoot, taskId) {
102
+ const taskDir = join(repoRoot, ".cairn", "tasks", "active", taskId);
103
+ if (!existsSync(taskDir))
104
+ return null;
105
+ const rootAttestation = existsSync(join(taskDir, "attestation.yaml"));
106
+ let subagentAttestations = 0;
107
+ const subagentsDir = join(taskDir, "subagents");
108
+ if (existsSync(subagentsDir)) {
109
+ let entries = [];
110
+ try {
111
+ entries = readdirSync(subagentsDir, { withFileTypes: true, encoding: "utf8" });
112
+ }
113
+ catch {
114
+ entries = [];
115
+ }
116
+ for (const e of entries) {
117
+ if (!e.isDirectory())
118
+ continue;
119
+ if (existsSync(join(subagentsDir, e.name, "attestation.yaml"))) {
120
+ subagentAttestations += 1;
121
+ }
122
+ }
123
+ }
124
+ const needsReview = readNeedsReview(join(taskDir, "spec.tightened.md"));
125
+ const phase = readPhase(join(taskDir, "status.yaml"));
126
+ return {
127
+ rootAttestation,
128
+ subagentAttestations,
129
+ needsReview,
130
+ phase,
131
+ };
132
+ }
133
+ /**
134
+ * Append a single journal entry to
135
+ * `.cairn/tasks/active/<task_id>/journal.jsonl`. The journal is the
136
+ * authoritative record of what happened during a task across multiple
137
+ * Claude Code sessions. The resume command reads it after `/clear`
138
+ * to rebuild the operator's mental state.
139
+ *
140
+ * Returns false when the task directory is missing — caller decides
141
+ * how to surface (typically a no-op since journal append is best-effort
142
+ * inside the Stop hook).
143
+ */
144
+ export function appendTaskJournal(args) {
145
+ const taskDir = join(args.repoRoot, ".cairn", "tasks", "active", args.taskId);
146
+ if (!existsSync(taskDir))
147
+ return false;
148
+ const entry = {
149
+ ts: new Date().toISOString(),
150
+ session_id: args.sessionId,
151
+ summary: args.summary,
152
+ };
153
+ if (args.nextStep !== undefined && args.nextStep.length > 0) {
154
+ entry.next_step = args.nextStep;
155
+ }
156
+ if (args.filesTouched !== undefined && args.filesTouched.length > 0) {
157
+ entry.files_touched = args.filesTouched;
158
+ }
159
+ if (args.decisionsLoaded !== undefined && args.decisionsLoaded.length > 0) {
160
+ entry.decisions_loaded = args.decisionsLoaded;
161
+ }
162
+ const path = join(taskDir, "journal.jsonl");
163
+ appendFileSync(path, `${JSON.stringify(entry)}\n`, "utf8");
164
+ return true;
165
+ }
166
+ export function readTaskJournal(repoRoot, taskId, scope = "active") {
167
+ const taskDir = join(repoRoot, ".cairn", "tasks", scope, taskId);
168
+ const path = join(taskDir, "journal.jsonl");
169
+ if (!existsSync(path))
170
+ return [];
171
+ let raw;
172
+ try {
173
+ raw = readFileSync(path, "utf8");
174
+ }
175
+ catch {
176
+ return [];
177
+ }
178
+ const out = [];
179
+ for (const line of raw.split(/\r?\n/)) {
180
+ if (line.trim().length === 0)
181
+ continue;
182
+ try {
183
+ const parsed = JSON.parse(line);
184
+ if (typeof parsed === "object" &&
185
+ parsed !== null &&
186
+ typeof parsed.ts === "string" &&
187
+ typeof parsed.summary === "string") {
188
+ out.push(parsed);
189
+ }
190
+ }
191
+ catch {
192
+ // skip malformed lines
193
+ }
194
+ }
195
+ return out;
196
+ }
197
+ /**
198
+ * Look up the single active task that should be the implicit target
199
+ * for `cairn_task_journal_append` / `cairn_resume`. Picks the task
200
+ * with the most-recently-modified `status.yaml` whose phase is in the
201
+ * active set. Returns null when no active task exists.
202
+ */
203
+ export function findCurrentActiveTask(repoRoot) {
204
+ const activeDir = join(repoRoot, ".cairn", "tasks", "active");
205
+ if (!existsSync(activeDir))
206
+ return null;
207
+ let entries = [];
208
+ try {
209
+ entries = readdirSync(activeDir, { withFileTypes: true, encoding: "utf8" });
210
+ }
211
+ catch {
212
+ return null;
213
+ }
214
+ const ACTIVE_PHASES = new Set([
215
+ "queued",
216
+ "tightening",
217
+ "running",
218
+ "sensor_check",
219
+ "ready_for_review",
220
+ "awaiting_attestation",
221
+ "reviewing",
222
+ "backprop",
223
+ ]);
224
+ let best = null;
225
+ for (const e of entries) {
226
+ if (!e.isDirectory())
227
+ continue;
228
+ const taskDir = join(activeDir, e.name);
229
+ const statusPath = join(taskDir, "status.yaml");
230
+ if (!existsSync(statusPath))
231
+ continue;
232
+ const phase = readPhase(statusPath);
233
+ if (phase === null || !ACTIVE_PHASES.has(phase))
234
+ continue;
235
+ let mtimeMs;
236
+ try {
237
+ mtimeMs = statSync(statusPath).mtimeMs;
238
+ }
239
+ catch {
240
+ continue;
241
+ }
242
+ if (best === null || mtimeMs > best.mtimeMs) {
243
+ best = { taskId: e.name, mtimeMs };
244
+ }
245
+ }
246
+ return best?.taskId ?? null;
247
+ }
248
+ /* -------------------------------------------------------------------------- */
249
+ /* Internal helpers */
250
+ /* -------------------------------------------------------------------------- */
251
+ function readStatusYaml(statusPath) {
252
+ if (!existsSync(statusPath))
253
+ return {};
254
+ try {
255
+ const raw = readFileSync(statusPath, "utf8");
256
+ const parsed = parseYaml(raw);
257
+ if (parsed !== null && typeof parsed === "object") {
258
+ return parsed;
259
+ }
260
+ }
261
+ catch {
262
+ // fall through — caller will overwrite with a fresh frame
263
+ }
264
+ return {};
265
+ }
266
+ function readNeedsReview(specPath) {
267
+ if (!existsSync(specPath))
268
+ return true;
269
+ let raw;
270
+ try {
271
+ raw = readFileSync(specPath, "utf8");
272
+ }
273
+ catch {
274
+ return true;
275
+ }
276
+ const fmMatch = raw.match(/^---\r?\n([\s\S]*?)\n---/);
277
+ if (!fmMatch)
278
+ return true;
279
+ const fm = fmMatch[1] ?? "";
280
+ const m = fm.match(/^needs_review:\s*(true|false)/m);
281
+ if (m && m[1] === "false")
282
+ return false;
283
+ return true;
284
+ }
285
+ function readPhase(statusPath) {
286
+ if (!existsSync(statusPath))
287
+ return null;
288
+ let raw;
289
+ try {
290
+ raw = readFileSync(statusPath, "utf8");
291
+ }
292
+ catch {
293
+ return null;
294
+ }
295
+ for (const line of raw.split(/\r?\n/)) {
296
+ const m = line.match(/^phase:\s*(\S+)/);
297
+ if (m && m[1] !== undefined)
298
+ return m[1].replace(/['"]/g, "");
299
+ }
300
+ return null;
301
+ }
302
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/tasks/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Every cairn surface (Claude Code hooks, MCP tools, `claude --print`
5
5
  * subprocess calls, init phases) appends a single jsonl row per event
6
- * to `~/.local/cairn/trace/trace-<YYYY-MM-DD>.jsonl`. The `cairn trace`
6
+ * to `~/.cairn/trace/trace-<YYYY-MM-DD>.jsonl`. The `cairn trace`
7
7
  * CLI subcommand reads them back time-sorted across the most recent
8
8
  * day(s) so the operator can post-mortem an entire live session in one
9
9
  * pane.
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Every cairn surface (Claude Code hooks, MCP tools, `claude --print`
5
5
  * subprocess calls, init phases) appends a single jsonl row per event
6
- * to `~/.local/cairn/trace/trace-<YYYY-MM-DD>.jsonl`. The `cairn trace`
6
+ * to `~/.cairn/trace/trace-<YYYY-MM-DD>.jsonl`. The `cairn trace`
7
7
  * CLI subcommand reads them back time-sorted across the most recent
8
8
  * day(s) so the operator can post-mortem an entire live session in one
9
9
  * pane.
@@ -15,7 +15,7 @@ import { appendFileSync, existsSync, mkdirSync } from "node:fs";
15
15
  import { homedir } from "node:os";
16
16
  import { join } from "node:path";
17
17
  export function traceDir() {
18
- return join(homedir(), ".local", "cairn", "trace");
18
+ return join(homedir(), ".cairn", "trace");
19
19
  }
20
20
  function todayFilename(now) {
21
21
  const y = now.getUTCFullYear();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trace/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAuBjC,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,aAAa,CAAC,GAAS;IAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;IAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAY,IAAI,IAAI,EAAE;IAClD,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,cAAc,CAAC,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAA4B;IACnD,OAAO,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trace/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAuBjC,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,aAAa,CAAC,GAAS;IAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;IAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAY,IAAI,IAAI,EAAE;IAClD,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,cAAc,CAAC,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAA4B;IACnD,OAAO,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC;AACnD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isaacriehm/cairn-core",
3
- "version": "0.7.3",
3
+ "version": "0.8.0",
4
4
  "description": "Cairn core — state + context layer. Curated `.cairn/ground/` (decisions, §INV invariants, canonical-map, brand, quality-grades), MCP server, init wizard, hook runners, sensors, GC drift sweep.",
5
5
  "author": "Isaac Riehm",
6
6
  "license": "MIT",
@@ -39,7 +39,7 @@
39
39
  "simple-git": "^3.36.0",
40
40
  "yaml": "^2.8.4",
41
41
  "zod": "^4.4.3",
42
- "@isaacriehm/cairn-state": "0.7.3"
42
+ "@isaacriehm/cairn-state": "0.8.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/cli-progress": "^3.11.6",