@isaacriehm/cairn-core 0.1.10 → 0.2.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 (158) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/context/checkpoint.d.ts +4 -3
  3. package/dist/context/checkpoint.js +4 -3
  4. package/dist/context/checkpoint.js.map +1 -1
  5. package/dist/context/index.d.ts +2 -2
  6. package/dist/context/index.js +2 -2
  7. package/dist/context/spec-delta.js +1 -1
  8. package/dist/context/spec-delta.js.map +1 -1
  9. package/dist/doctor/index.d.ts +1 -1
  10. package/dist/doctor/index.js +4 -59
  11. package/dist/doctor/index.js.map +1 -1
  12. package/dist/frontend-types.d.ts +3 -3
  13. package/dist/frontend-types.js +3 -3
  14. package/dist/gc/quality-update.d.ts +4 -4
  15. package/dist/gc/quality-update.js +4 -4
  16. package/dist/ground/manifest.js +0 -2
  17. package/dist/ground/manifest.js.map +1 -1
  18. package/dist/ground/paths.js +0 -1
  19. package/dist/ground/paths.js.map +1 -1
  20. package/dist/ground/scope-index.d.ts +3 -2
  21. package/dist/ground/scope-index.js +3 -2
  22. package/dist/ground/scope-index.js.map +1 -1
  23. package/dist/hooks/bypass-detection.js +13 -18
  24. package/dist/hooks/bypass-detection.js.map +1 -1
  25. package/dist/hooks/defer.d.ts +50 -0
  26. package/dist/hooks/defer.js +87 -0
  27. package/dist/hooks/defer.js.map +1 -0
  28. package/dist/hooks/index.d.ts +2 -0
  29. package/dist/hooks/index.js +1 -0
  30. package/dist/hooks/index.js.map +1 -1
  31. package/dist/hooks/post-tool-use/ledger-cache.d.ts +2 -2
  32. package/dist/hooks/post-tool-use/ledger-cache.js +5 -4
  33. package/dist/hooks/post-tool-use/ledger-cache.js.map +1 -1
  34. package/dist/hooks/runners/index.d.ts +2 -0
  35. package/dist/hooks/runners/index.js +1 -0
  36. package/dist/hooks/runners/index.js.map +1 -1
  37. package/dist/hooks/runners/session-start.js +47 -18
  38. package/dist/hooks/runners/session-start.js.map +1 -1
  39. package/dist/hooks/runners/stop.js +81 -24
  40. package/dist/hooks/runners/stop.js.map +1 -1
  41. package/dist/hooks/seed-attested.d.ts +25 -0
  42. package/dist/hooks/seed-attested.js +84 -0
  43. package/dist/hooks/seed-attested.js.map +1 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.js +13 -7
  46. package/dist/index.js.map +1 -1
  47. package/dist/init/index.d.ts +2 -0
  48. package/dist/init/index.js +1 -0
  49. package/dist/init/index.js.map +1 -1
  50. package/dist/init/init.js +8 -90
  51. package/dist/init/init.js.map +1 -1
  52. package/dist/init/mapper.d.ts +1 -1
  53. package/dist/init/multi-dev/install.d.ts +15 -10
  54. package/dist/init/multi-dev/install.js +17 -84
  55. package/dist/init/multi-dev/install.js.map +1 -1
  56. package/dist/init/overlay.d.ts +14 -0
  57. package/dist/init/overlay.js +65 -0
  58. package/dist/init/overlay.js.map +1 -0
  59. package/dist/init/phases/1-detect.d.ts +10 -0
  60. package/dist/init/phases/1-detect.js +36 -0
  61. package/dist/init/phases/1-detect.js.map +1 -0
  62. package/dist/init/phases/10-strip.d.ts +11 -0
  63. package/dist/init/phases/10-strip.js +80 -0
  64. package/dist/init/phases/10-strip.js.map +1 -0
  65. package/dist/init/phases/12-multidev.d.ts +11 -0
  66. package/dist/init/phases/12-multidev.js +39 -0
  67. package/dist/init/phases/12-multidev.js.map +1 -0
  68. package/dist/init/phases/2-walker.d.ts +8 -0
  69. package/dist/init/phases/2-walker.js +34 -0
  70. package/dist/init/phases/2-walker.js.map +1 -0
  71. package/dist/init/phases/3-mapper.d.ts +14 -0
  72. package/dist/init/phases/3-mapper.js +56 -0
  73. package/dist/init/phases/3-mapper.js.map +1 -0
  74. package/dist/init/phases/3b-seed.d.ts +27 -0
  75. package/dist/init/phases/3b-seed.js +149 -0
  76. package/dist/init/phases/3b-seed.js.map +1 -0
  77. package/dist/init/phases/4-pilot.d.ts +10 -0
  78. package/dist/init/phases/4-pilot.js +70 -0
  79. package/dist/init/phases/4-pilot.js.map +1 -0
  80. package/dist/init/phases/5-brand.d.ts +10 -0
  81. package/dist/init/phases/5-brand.js +66 -0
  82. package/dist/init/phases/5-brand.js.map +1 -0
  83. package/dist/init/phases/6-docs-ingest.d.ts +11 -0
  84. package/dist/init/phases/6-docs-ingest.js +39 -0
  85. package/dist/init/phases/6-docs-ingest.js.map +1 -0
  86. package/dist/init/phases/7b-source-comments.d.ts +6 -0
  87. package/dist/init/phases/7b-source-comments.js +34 -0
  88. package/dist/init/phases/7b-source-comments.js.map +1 -0
  89. package/dist/init/phases/7c-rules-merge.d.ts +6 -0
  90. package/dist/init/phases/7c-rules-merge.js +34 -0
  91. package/dist/init/phases/7c-rules-merge.js.map +1 -0
  92. package/dist/init/phases/8-baseline.d.ts +10 -0
  93. package/dist/init/phases/8-baseline.js +52 -0
  94. package/dist/init/phases/8-baseline.js.map +1 -0
  95. package/dist/init/phases/index.d.ts +15 -0
  96. package/dist/init/phases/index.js +16 -0
  97. package/dist/init/phases/index.js.map +1 -0
  98. package/dist/init/phases/orchestrator.d.ts +49 -0
  99. package/dist/init/phases/orchestrator.js +85 -0
  100. package/dist/init/phases/orchestrator.js.map +1 -0
  101. package/dist/init/phases/state-io.d.ts +19 -0
  102. package/dist/init/phases/state-io.js +73 -0
  103. package/dist/init/phases/state-io.js.map +1 -0
  104. package/dist/init/phases/types.d.ts +93 -0
  105. package/dist/init/phases/types.js +30 -0
  106. package/dist/init/phases/types.js.map +1 -0
  107. package/dist/init/seed.js +11 -2
  108. package/dist/init/seed.js.map +1 -1
  109. package/dist/init/walker.d.ts +0 -6
  110. package/dist/init/walker.js +2 -3
  111. package/dist/init/walker.js.map +1 -1
  112. package/dist/join/index.js +49 -2
  113. package/dist/join/index.js.map +1 -1
  114. package/dist/logger.d.ts +1 -1
  115. package/dist/logger.js +5 -5
  116. package/dist/logger.js.map +1 -1
  117. package/dist/mcp/errors.d.ts +1 -1
  118. package/dist/mcp/schemas.d.ts +19 -0
  119. package/dist/mcp/schemas.js +19 -0
  120. package/dist/mcp/schemas.js.map +1 -1
  121. package/dist/mcp/tools/append-run-note.js +13 -6
  122. package/dist/mcp/tools/append-run-note.js.map +1 -1
  123. package/dist/mcp/tools/drop-task.js +1 -1
  124. package/dist/mcp/tools/drop-task.js.map +1 -1
  125. package/dist/mcp/tools/ground-get.js +2 -2
  126. package/dist/mcp/tools/ground-get.js.map +1 -1
  127. package/dist/mcp/tools/index.js +4 -0
  128. package/dist/mcp/tools/index.js.map +1 -1
  129. package/dist/mcp/tools/init-phases.d.ts +24 -0
  130. package/dist/mcp/tools/init-phases.js +140 -0
  131. package/dist/mcp/tools/init-phases.js.map +1 -0
  132. package/dist/mcp/tools/query-history.js +1 -1
  133. package/dist/mcp/tools/query-history.js.map +1 -1
  134. package/dist/mcp/tools/resolve-attention.d.ts +3 -1
  135. package/dist/mcp/tools/resolve-attention.js +228 -11
  136. package/dist/mcp/tools/resolve-attention.js.map +1 -1
  137. package/dist/profiles/types.d.ts +1 -1
  138. package/dist/sensors/catalog.js +8 -3
  139. package/dist/sensors/catalog.js.map +1 -1
  140. package/dist/session-start/build.d.ts +4 -0
  141. package/dist/session-start/build.js +7 -0
  142. package/dist/session-start/build.js.map +1 -1
  143. package/dist/status-line/format.d.ts +10 -7
  144. package/dist/status-line/format.js +16 -14
  145. package/dist/status-line/format.js.map +1 -1
  146. package/dist/status-line/index.d.ts +0 -3
  147. package/dist/status-line/index.js.map +1 -1
  148. package/dist/status-line/reader.d.ts +1 -1
  149. package/dist/status-line/reader.js +2 -5
  150. package/dist/status-line/reader.js.map +1 -1
  151. package/dist/status-line/writer.d.ts +1 -9
  152. package/dist/status-line/writer.js +1 -12
  153. package/dist/status-line/writer.js.map +1 -1
  154. package/package.json +1 -1
  155. package/templates/.cairn/JOIN.md +3 -9
  156. package/templates/.cairn/git-hooks/commit-msg +14 -3
  157. package/templates/.cairn/git-hooks/pre-commit +22 -13
  158. package/templates/README.md +0 -24
@@ -1,36 +1,38 @@
1
1
  /**
2
- * Render a StatusJson as the single-line string Claude Code's status_line hook
3
- * displays. Pure function; no I/O.
2
+ * Render a StatusJson as the single-line string Claude Code's status_line
3
+ * hook displays. Pure function; no I/O.
4
4
  *
5
- * Field priority for the "state" slot (single field):
6
- * daemon down > attention > 0 > gc running > task_state
5
+ * Format: `⬡ cairn decisions:N inv:N <state> <icon>`
6
+ *
7
+ * <state> reports the most operator-actionable signal: pending attention
8
+ * count first (ranks above tasks), GC sweep state second, task state
9
+ * last; falls back to "ready" when nothing else is happening.
7
10
  *
8
11
  * Health icon:
9
- * daemon down
10
- * attention
11
- * else → ●
12
+ * attention > 0
13
+ * gc running
14
+ * idle / running → ●
12
15
  */
13
16
  export function formatStatus(s) {
14
17
  const parts = ["⬡ cairn"];
15
- parts.push(`ctx:${s.ctx_tokens_used}/${s.ctx_tokens_budget}`);
16
18
  parts.push(`decisions:${s.decisions_in_scope}`);
17
19
  parts.push(`inv:${s.invariants_in_scope}`);
18
20
  let stateField;
19
21
  let icon;
20
- if (!s.daemon_alive) {
21
- stateField = "daemon:down";
22
- icon = "○";
23
- }
24
- else if (s.attention_count > 0) {
22
+ if (s.attention_count > 0) {
25
23
  stateField = `attention:${s.attention_count}`;
26
24
  icon = "⚑";
27
25
  }
28
26
  else if (s.gc_running) {
29
27
  stateField = "gc:active";
28
+ icon = "◐";
29
+ }
30
+ else if (s.task_state !== "idle") {
31
+ stateField = `task:${s.task_state}`;
30
32
  icon = "●";
31
33
  }
32
34
  else {
33
- stateField = `task:${s.task_state}`;
35
+ stateField = "ready";
34
36
  icon = "●";
35
37
  }
36
38
  parts.push(stateField);
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/status-line/format.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,CAAa;IACxC,MAAM,KAAK,GAAa,CAAC,SAAS,CAAC,CAAC;IAEpC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAE3C,IAAI,UAAkB,CAAC;IACvB,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;QACpB,UAAU,GAAG,aAAa,CAAC;QAC3B,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,IAAI,CAAC,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QACjC,UAAU,GAAG,aAAa,CAAC,CAAC,eAAe,EAAE,CAAC;QAC9C,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QACxB,UAAU,GAAG,WAAW,CAAC;QACzB,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/status-line/format.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,CAAa;IACxC,MAAM,KAAK,GAAa,CAAC,SAAS,CAAC,CAAC;IAEpC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAE3C,IAAI,UAAkB,CAAC;IACvB,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QAC1B,UAAU,GAAG,aAAa,CAAC,CAAC,eAAe,EAAE,CAAC;QAC9C,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QACxB,UAAU,GAAG,WAAW,CAAC;QACzB,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QACnC,UAAU,GAAG,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,OAAO,CAAC;QACrB,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -12,9 +12,6 @@ export type TaskState = "idle" | "running" | "queued" | "tightening" | "sensing"
12
12
  export interface StatusJson {
13
13
  /** ISO timestamp of last write. */
14
14
  updated_at: string;
15
- daemon_alive: boolean;
16
- ctx_tokens_used: number;
17
- ctx_tokens_budget: number;
18
15
  decisions_in_scope: number;
19
16
  invariants_in_scope: number;
20
17
  task_state: TaskState;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/status-line/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2BH,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/status-line/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAwBH,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -3,7 +3,7 @@
3
3
  * adopted repo at `repoRoot`. `sessionId` is the Claude Code session id
4
4
  * (passed via the status-line hook's stdin payload).
5
5
  *
6
- * Returns the placeholder `⬡ cairn daemon:down ○` when:
6
+ * Returns the placeholder `⬡ cairn no session ○` when:
7
7
  * - `sessionId` is null/empty (status-line invoked outside a session)
8
8
  * - the per-session status.json is missing
9
9
  * - the file is unreadable, malformed JSON, or fails shape validation
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
2
  import { formatStatus } from "./format.js";
3
3
  import { statusJsonPath } from "./writer.js";
4
- const PLACEHOLDER = "⬡ cairn daemon:down ○";
4
+ const PLACEHOLDER = "⬡ cairn no session ○";
5
5
  const TASK_STATES = [
6
6
  "idle",
7
7
  "running",
@@ -25,9 +25,6 @@ function isStatusJson(x) {
25
25
  return false;
26
26
  const o = x;
27
27
  return (typeof o["updated_at"] === "string" &&
28
- typeof o["daemon_alive"] === "boolean" &&
29
- typeof o["ctx_tokens_used"] === "number" &&
30
- typeof o["ctx_tokens_budget"] === "number" &&
31
28
  typeof o["decisions_in_scope"] === "number" &&
32
29
  typeof o["invariants_in_scope"] === "number" &&
33
30
  isTaskState(o["task_state"]) &&
@@ -42,7 +39,7 @@ function isStatusJson(x) {
42
39
  * adopted repo at `repoRoot`. `sessionId` is the Claude Code session id
43
40
  * (passed via the status-line hook's stdin payload).
44
41
  *
45
- * Returns the placeholder `⬡ cairn daemon:down ○` when:
42
+ * Returns the placeholder `⬡ cairn no session ○` when:
46
43
  * - `sessionId` is null/empty (status-line invoked outside a session)
47
44
  * - the per-session status.json is missing
48
45
  * - the file is unreadable, malformed JSON, or fails shape validation
@@ -1 +1 @@
1
- {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/status-line/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAE9C,MAAM,WAAW,GAAyB;IACxC,MAAM;IACN,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,WAAW;IACX,UAAU;CACX,CAAC;AAEF,SAAS,WAAW,CAAC,CAAU;IAC7B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,WAAiC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,cAAc,CAAC,CAAU;IAChC,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;AAC7C,CAAC;AAED,SAAS,eAAe,CAAC,CAAU;IACjC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,QAAQ,CAAC;AAC3D,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,OAAO,CACL,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,QAAQ;QACnC,OAAO,CAAC,CAAC,cAAc,CAAC,KAAK,SAAS;QACtC,OAAO,CAAC,CAAC,iBAAiB,CAAC,KAAK,QAAQ;QACxC,OAAO,CAAC,CAAC,mBAAmB,CAAC,KAAK,QAAQ;QAC1C,OAAO,CAAC,CAAC,oBAAoB,CAAC,KAAK,QAAQ;QAC3C,OAAO,CAAC,CAAC,qBAAqB,CAAC,KAAK,QAAQ;QAC5C,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAC5B,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAChC,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,SAAS;QACpC,OAAO,CAAC,CAAC,iBAAiB,CAAC,KAAK,QAAQ;QACxC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACrC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CACjC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,SAAwB;IACzE,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACrE,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,WAAW,CAAC;IAE9C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,WAAW,CAAC;IAE9C,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/status-line/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAE7C,MAAM,WAAW,GAAyB;IACxC,MAAM;IACN,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,SAAS;IACT,WAAW;IACX,UAAU;CACX,CAAC;AAEF,SAAS,WAAW,CAAC,CAAU;IAC7B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAK,WAAiC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,cAAc,CAAC,CAAU;IAChC,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;AAC7C,CAAC;AAED,SAAS,eAAe,CAAC,CAAU;IACjC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,QAAQ,CAAC;AAC3D,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,OAAO,CACL,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,QAAQ;QACnC,OAAO,CAAC,CAAC,oBAAoB,CAAC,KAAK,QAAQ;QAC3C,OAAO,CAAC,CAAC,qBAAqB,CAAC,KAAK,QAAQ;QAC5C,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAC5B,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAChC,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,SAAS;QACpC,OAAO,CAAC,CAAC,iBAAiB,CAAC,KAAK,QAAQ;QACxC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACrC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CACjC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,SAAwB;IACzE,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACrE,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,WAAW,CAAC;IAE9C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,WAAW,CAAC;IAE9C,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
@@ -21,13 +21,5 @@ export declare function writeStatusJson(repoRoot: string, sessionId: string, pat
21
21
  * Subsequent patches (heartbeat updated_at, attention_count, etc.)
22
22
  * merge over this baseline so the shape-validating reader always sees
23
23
  * a complete object.
24
- *
25
- * `ctx_tokens_budget` defaults to 4000 — the SessionStart
26
- * additionalContext cap (Section 0–7 budget). Hooks may overwrite once
27
- * a tighter per-session value is computed.
28
- *
29
- * `daemon_alive` is retained on the wire for status-line format
30
- * back-compat; the daemon itself is dormant. SessionStart writes
31
- * `true` to indicate the session is live.
32
24
  */
33
- export declare function defaultStatusJson(sessionAlive: boolean): StatusJson;
25
+ export declare function defaultStatusJson(): StatusJson;
@@ -44,21 +44,10 @@ export function writeStatusJson(repoRoot, sessionId, patch) {
44
44
  * Subsequent patches (heartbeat updated_at, attention_count, etc.)
45
45
  * merge over this baseline so the shape-validating reader always sees
46
46
  * a complete object.
47
- *
48
- * `ctx_tokens_budget` defaults to 4000 — the SessionStart
49
- * additionalContext cap (Section 0–7 budget). Hooks may overwrite once
50
- * a tighter per-session value is computed.
51
- *
52
- * `daemon_alive` is retained on the wire for status-line format
53
- * back-compat; the daemon itself is dormant. SessionStart writes
54
- * `true` to indicate the session is live.
55
47
  */
56
- export function defaultStatusJson(sessionAlive) {
48
+ export function defaultStatusJson() {
57
49
  return {
58
50
  updated_at: new Date().toISOString(),
59
- daemon_alive: sessionAlive,
60
- ctx_tokens_used: 0,
61
- ctx_tokens_budget: 4000,
62
51
  decisions_in_scope: 0,
63
52
  invariants_in_scope: 0,
64
53
  task_state: "idle",
@@ -1 +1 @@
1
- {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/status-line/writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,SAAiB;IAChE,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,SAAiB,EACjB,KAA0B;IAE1B,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAE/C,IAAI,QAAQ,GAAwB,EAAE,CAAC;IACvC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;YAC1C,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAClD,QAAQ,GAAG,MAA6B,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAwB,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IAE9D,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAqB;IACrD,OAAO;QACL,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,YAAY,EAAE,YAAY;QAC1B,eAAe,EAAE,CAAC;QAClB,iBAAiB,EAAE,IAAI;QACvB,kBAAkB,EAAE,CAAC;QACrB,mBAAmB,EAAE,CAAC;QACtB,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,KAAK;QACjB,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/status-line/writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,SAAiB;IAChE,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,SAAiB,EACjB,KAA0B;IAE1B,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAE/C,IAAI,QAAQ,GAAwB,EAAE,CAAC;IACvC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;YAC1C,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAClD,QAAQ,GAAG,MAA6B,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAwB,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IAE9D,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,kBAAkB,EAAE,CAAC;QACrB,mBAAmB,EAAE,CAAC;QACtB,UAAU,EAAE,MAAM;QAClB,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,KAAK;QACjB,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,IAAI;QACrB,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isaacriehm/cairn-core",
3
- "version": "0.1.10",
3
+ "version": "0.2.0",
4
4
  "description": "Cairn core — state + context layer. Curated `.cairn/ground/` (decisions, §V 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",
@@ -14,10 +14,12 @@ If you opened this project with Claude Code and the Cairn plugin is
14
14
  enabled, the SessionStart hook detects an unbootstrapped clone and surfaces
15
15
  an inline `[a]` bootstrap prompt. Pick `[a]` once and you are done.
16
16
 
17
- If the plugin isn't installed yet:
17
+ If the plugin isn't installed yet, register the marketplace once and
18
+ install:
18
19
 
19
20
  ```bash
20
21
  # Inside Claude Code
22
+ /plugin marketplace add isaacriehm/cairn
21
23
  /plugin install cairn@isaacriehm-cairn
22
24
  ```
23
25
 
@@ -40,14 +42,6 @@ cairn join # idempotent; safe to re-run
40
42
  versioned pre-commit / post-commit / commit-msg hooks run.
41
43
  3. Creates `.cairn/sessions/` for this clone if missing.
42
44
 
43
- ## Path C — `package.json` `prepare` (Node projects only)
44
-
45
- For Node projects the adoption flow already wires
46
- `prepare: cairn join || true` into `package.json`. Running
47
- `npm install` / `pnpm install` runs `cairn join` for you. The `|| true`
48
- lets the install succeed even if Cairn isn't yet on PATH; the failure
49
- surfaces at first commit attempt instead.
50
-
51
45
  ## Verifying
52
46
 
53
47
  ```bash
@@ -9,9 +9,20 @@
9
9
 
10
10
  set -e
11
11
 
12
- if ! command -v cairn > /dev/null 2>&1; then
13
- # If Cairn isn't on PATH, the pre-commit hook already blocked.
12
+ REPO_ROOT="$(git rev-parse --show-toplevel 2> /dev/null || true)"
13
+ if [ -z "$REPO_ROOT" ] || [ ! -d "$REPO_ROOT/.cairn" ]; then
14
14
  exit 0
15
15
  fi
16
16
 
17
- exec cairn sensor-run --commit-msg "$1" "$@"
17
+ CAIRN_CMD=""
18
+ if [ -f "$REPO_ROOT/.cairn/.cli-path" ]; then
19
+ CAIRN_CMD="$(head -n1 "$REPO_ROOT/.cairn/.cli-path")"
20
+ fi
21
+ if [ -z "$CAIRN_CMD" ] && command -v cairn > /dev/null 2>&1; then
22
+ CAIRN_CMD="cairn"
23
+ fi
24
+ if [ -z "$CAIRN_CMD" ]; then
25
+ exit 0
26
+ fi
27
+
28
+ eval "$CAIRN_CMD sensor-run --commit-msg \"$1\""
@@ -3,22 +3,31 @@
3
3
  #
4
4
  # Spec: PLUGIN_ARCHITECTURE §17 Layer 1.
5
5
  #
6
- # Fails the commit when:
7
- # - Cairn CLI is missing from PATH
8
- # - sensor-run --staged exits non-zero
6
+ # Fails the commit when sensor-run --staged returns non-zero.
9
7
  #
10
- # To opt out a project: rm .cairn/ (irreversible).
11
- # Bypass for a single commit: git commit --no-verify (CI gate still catches).
8
+ # Resolution order:
9
+ # 1. .cairn/.cli-path (written by `cairn join`; points at the bundled
10
+ # cli.mjs for plugin users, the global cairn shim for CLI users).
11
+ # 2. global `cairn` binary on PATH.
12
+ # 3. exit 0 — no enforcement available; SessionStart bootstrap banner
13
+ # will surface on next Claude Code session and re-run join.
12
14
 
13
15
  set -e
14
16
 
15
- if ! command -v cairn > /dev/null 2>&1; then
16
- echo " Cairn CLI not on PATH"
17
- echo " This project requires Cairn. Install:"
18
- echo " /plugin install cairn@isaacriehm-cairn (Claude Code)"
19
- echo " npm install -g @isaacriehm/cairn (CLI)"
20
- echo " Or: rm -rf .cairn/ to opt the project out (irreversible)"
21
- exit 1
17
+ REPO_ROOT="$(git rev-parse --show-toplevel 2> /dev/null || true)"
18
+ if [ -z "$REPO_ROOT" ] || [ ! -d "$REPO_ROOT/.cairn" ]; then
19
+ exit 0
22
20
  fi
23
21
 
24
- exec cairn sensor-run --staged "$@"
22
+ CAIRN_CMD=""
23
+ if [ -f "$REPO_ROOT/.cairn/.cli-path" ]; then
24
+ CAIRN_CMD="$(head -n1 "$REPO_ROOT/.cairn/.cli-path")"
25
+ fi
26
+ if [ -z "$CAIRN_CMD" ] && command -v cairn > /dev/null 2>&1; then
27
+ CAIRN_CMD="cairn"
28
+ fi
29
+ if [ -z "$CAIRN_CMD" ]; then
30
+ exit 0
31
+ fi
32
+
33
+ eval "$CAIRN_CMD sensor-run --staged"
@@ -1,24 +0,0 @@
1
- # `templates/` — files the init script copies into adopted projects
2
-
3
- This directory ships with the `@isaacriehm/cairn` npm package. It is the seed for `.cairn/` and `.archive/` inside any project that runs:
4
-
5
- ```sh
6
- npx @isaacriehm/cairn init <repo-dir>
7
- ```
8
-
9
- Layout mirrors `docs/FILESYSTEM_LAYOUT.md`. The init script:
10
-
11
- 1. Copies `templates/.cairn/config/*` into `<repo-dir>/.cairn/config/` (preserving the `<project_name>:` placeholder; the script then replaces it with the adopting project's package name).
12
- 2. Copies `templates/.cairn/ground/manifest.yaml` (empty stub; daemon populates).
13
- 3. Copies `templates/.archive/README.md` into `<repo-dir>/.archive/`.
14
- 4. Creates the runtime directories (`runs/`, `inbox/`, `transcripts/`, `tasks/`, `staleness/`, `ground/{decisions,invariants,canonical-map,schema,routes,events}/`) and adds them to the project's `.gitignore` per spec §9.
15
-
16
- This directory is **NOT** Cairn's own state. The Cairn package source repo is not self-hosted; it is the source for the published npm package.
17
-
18
- ## Why placeholders?
19
-
20
- The `<project_name>:` block in `templates/.cairn/config/workflow.md` is a placeholder by design. The init script reads the adopting project's `package.json name` (or directory name as fallback), normalizes it (lowercase, non-alphanumerics → underscores), and replaces every occurrence of `<project_name>` in the copied file. Cairn package code reads the project block at runtime via `Object.keys()` lookup — never by hardcoded project name (per L50, operator answer S1).
21
-
22
- ## Editing templates
23
-
24
- Templates are the single source of seed configuration. Changes here flow to every freshly-adopted project on next `npx @isaacriehm/cairn init`. Existing adoptions are unaffected — they own their copies.