@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/context/checkpoint.d.ts +4 -3
- package/dist/context/checkpoint.js +4 -3
- package/dist/context/checkpoint.js.map +1 -1
- package/dist/context/index.d.ts +2 -2
- package/dist/context/index.js +2 -2
- package/dist/context/spec-delta.js +1 -1
- package/dist/context/spec-delta.js.map +1 -1
- package/dist/doctor/index.d.ts +1 -1
- package/dist/doctor/index.js +4 -59
- package/dist/doctor/index.js.map +1 -1
- package/dist/frontend-types.d.ts +3 -3
- package/dist/frontend-types.js +3 -3
- package/dist/gc/quality-update.d.ts +4 -4
- package/dist/gc/quality-update.js +4 -4
- package/dist/ground/manifest.js +0 -2
- package/dist/ground/manifest.js.map +1 -1
- package/dist/ground/paths.js +0 -1
- package/dist/ground/paths.js.map +1 -1
- package/dist/ground/scope-index.d.ts +3 -2
- package/dist/ground/scope-index.js +3 -2
- package/dist/ground/scope-index.js.map +1 -1
- package/dist/hooks/bypass-detection.js +13 -18
- package/dist/hooks/bypass-detection.js.map +1 -1
- package/dist/hooks/defer.d.ts +50 -0
- package/dist/hooks/defer.js +87 -0
- package/dist/hooks/defer.js.map +1 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/post-tool-use/ledger-cache.d.ts +2 -2
- package/dist/hooks/post-tool-use/ledger-cache.js +5 -4
- package/dist/hooks/post-tool-use/ledger-cache.js.map +1 -1
- package/dist/hooks/runners/index.d.ts +2 -0
- package/dist/hooks/runners/index.js +1 -0
- package/dist/hooks/runners/index.js.map +1 -1
- package/dist/hooks/runners/session-start.js +47 -18
- package/dist/hooks/runners/session-start.js.map +1 -1
- package/dist/hooks/runners/stop.js +81 -24
- package/dist/hooks/runners/stop.js.map +1 -1
- package/dist/hooks/seed-attested.d.ts +25 -0
- package/dist/hooks/seed-attested.js +84 -0
- package/dist/hooks/seed-attested.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +13 -7
- package/dist/index.js.map +1 -1
- package/dist/init/index.d.ts +2 -0
- package/dist/init/index.js +1 -0
- package/dist/init/index.js.map +1 -1
- package/dist/init/init.js +8 -90
- package/dist/init/init.js.map +1 -1
- package/dist/init/mapper.d.ts +1 -1
- package/dist/init/multi-dev/install.d.ts +15 -10
- package/dist/init/multi-dev/install.js +17 -84
- package/dist/init/multi-dev/install.js.map +1 -1
- package/dist/init/overlay.d.ts +14 -0
- package/dist/init/overlay.js +65 -0
- package/dist/init/overlay.js.map +1 -0
- package/dist/init/phases/1-detect.d.ts +10 -0
- package/dist/init/phases/1-detect.js +36 -0
- package/dist/init/phases/1-detect.js.map +1 -0
- package/dist/init/phases/10-strip.d.ts +11 -0
- package/dist/init/phases/10-strip.js +80 -0
- package/dist/init/phases/10-strip.js.map +1 -0
- package/dist/init/phases/12-multidev.d.ts +11 -0
- package/dist/init/phases/12-multidev.js +39 -0
- package/dist/init/phases/12-multidev.js.map +1 -0
- package/dist/init/phases/2-walker.d.ts +8 -0
- package/dist/init/phases/2-walker.js +34 -0
- package/dist/init/phases/2-walker.js.map +1 -0
- package/dist/init/phases/3-mapper.d.ts +14 -0
- package/dist/init/phases/3-mapper.js +56 -0
- package/dist/init/phases/3-mapper.js.map +1 -0
- package/dist/init/phases/3b-seed.d.ts +27 -0
- package/dist/init/phases/3b-seed.js +149 -0
- package/dist/init/phases/3b-seed.js.map +1 -0
- package/dist/init/phases/4-pilot.d.ts +10 -0
- package/dist/init/phases/4-pilot.js +70 -0
- package/dist/init/phases/4-pilot.js.map +1 -0
- package/dist/init/phases/5-brand.d.ts +10 -0
- package/dist/init/phases/5-brand.js +66 -0
- package/dist/init/phases/5-brand.js.map +1 -0
- package/dist/init/phases/6-docs-ingest.d.ts +11 -0
- package/dist/init/phases/6-docs-ingest.js +39 -0
- package/dist/init/phases/6-docs-ingest.js.map +1 -0
- package/dist/init/phases/7b-source-comments.d.ts +6 -0
- package/dist/init/phases/7b-source-comments.js +34 -0
- package/dist/init/phases/7b-source-comments.js.map +1 -0
- package/dist/init/phases/7c-rules-merge.d.ts +6 -0
- package/dist/init/phases/7c-rules-merge.js +34 -0
- package/dist/init/phases/7c-rules-merge.js.map +1 -0
- package/dist/init/phases/8-baseline.d.ts +10 -0
- package/dist/init/phases/8-baseline.js +52 -0
- package/dist/init/phases/8-baseline.js.map +1 -0
- package/dist/init/phases/index.d.ts +15 -0
- package/dist/init/phases/index.js +16 -0
- package/dist/init/phases/index.js.map +1 -0
- package/dist/init/phases/orchestrator.d.ts +49 -0
- package/dist/init/phases/orchestrator.js +85 -0
- package/dist/init/phases/orchestrator.js.map +1 -0
- package/dist/init/phases/state-io.d.ts +19 -0
- package/dist/init/phases/state-io.js +73 -0
- package/dist/init/phases/state-io.js.map +1 -0
- package/dist/init/phases/types.d.ts +93 -0
- package/dist/init/phases/types.js +30 -0
- package/dist/init/phases/types.js.map +1 -0
- package/dist/init/seed.js +11 -2
- package/dist/init/seed.js.map +1 -1
- package/dist/init/walker.d.ts +0 -6
- package/dist/init/walker.js +2 -3
- package/dist/init/walker.js.map +1 -1
- package/dist/join/index.js +49 -2
- package/dist/join/index.js.map +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.js +5 -5
- package/dist/logger.js.map +1 -1
- package/dist/mcp/errors.d.ts +1 -1
- package/dist/mcp/schemas.d.ts +19 -0
- package/dist/mcp/schemas.js +19 -0
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/tools/append-run-note.js +13 -6
- package/dist/mcp/tools/append-run-note.js.map +1 -1
- package/dist/mcp/tools/drop-task.js +1 -1
- package/dist/mcp/tools/drop-task.js.map +1 -1
- package/dist/mcp/tools/ground-get.js +2 -2
- package/dist/mcp/tools/ground-get.js.map +1 -1
- package/dist/mcp/tools/index.js +4 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init-phases.d.ts +24 -0
- package/dist/mcp/tools/init-phases.js +140 -0
- package/dist/mcp/tools/init-phases.js.map +1 -0
- package/dist/mcp/tools/query-history.js +1 -1
- package/dist/mcp/tools/query-history.js.map +1 -1
- package/dist/mcp/tools/resolve-attention.d.ts +3 -1
- package/dist/mcp/tools/resolve-attention.js +228 -11
- package/dist/mcp/tools/resolve-attention.js.map +1 -1
- package/dist/profiles/types.d.ts +1 -1
- package/dist/sensors/catalog.js +8 -3
- package/dist/sensors/catalog.js.map +1 -1
- package/dist/session-start/build.d.ts +4 -0
- package/dist/session-start/build.js +7 -0
- package/dist/session-start/build.js.map +1 -1
- package/dist/status-line/format.d.ts +10 -7
- package/dist/status-line/format.js +16 -14
- package/dist/status-line/format.js.map +1 -1
- package/dist/status-line/index.d.ts +0 -3
- package/dist/status-line/index.js.map +1 -1
- package/dist/status-line/reader.d.ts +1 -1
- package/dist/status-line/reader.js +2 -5
- package/dist/status-line/reader.js.map +1 -1
- package/dist/status-line/writer.d.ts +1 -9
- package/dist/status-line/writer.js +1 -12
- package/dist/status-line/writer.js.map +1 -1
- package/package.json +1 -1
- package/templates/.cairn/JOIN.md +3 -9
- package/templates/.cairn/git-hooks/commit-msg +14 -3
- package/templates/.cairn/git-hooks/pre-commit +22 -13
- 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
|
|
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
|
-
*
|
|
6
|
-
*
|
|
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
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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 (
|
|
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 =
|
|
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
|
|
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;
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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(
|
|
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(
|
|
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
|
|
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.
|
|
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",
|
package/templates/.cairn/JOIN.md
CHANGED
|
@@ -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
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
11
|
-
#
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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"
|
package/templates/README.md
DELETED
|
@@ -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.
|