@isaacriehm/cairn-core 0.1.9 → 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 +49 -15
- 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 -14
- 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
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stop-hook signal debounce.
|
|
3
|
+
*
|
|
4
|
+
* Per-kind defer file: when the operator picks `[c]` defer on the
|
|
5
|
+
* inline A/B/C, cairn_resolve_attention writes
|
|
6
|
+
* `.cairn/.{bypass,review}-deferred-until` with the snapshot of
|
|
7
|
+
* SHAs / task-ids that were flagged. Subsequent Stop hooks suppress
|
|
8
|
+
* the warning while:
|
|
9
|
+
* 1. now < deferred_at + deferred_for_hours, AND
|
|
10
|
+
* 2. the current scan's flagged set ⊆ the deferred set
|
|
11
|
+
* (anything new shows up).
|
|
12
|
+
*
|
|
13
|
+
* Pure read/write/check helpers — no side effects beyond filesystem.
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { dirname, join } from "node:path";
|
|
17
|
+
const DEFAULT_DEFER_HOURS = 24;
|
|
18
|
+
export function deferStatePath(repoRoot, kind) {
|
|
19
|
+
return join(repoRoot, ".cairn", `.${kind}-deferred-until`);
|
|
20
|
+
}
|
|
21
|
+
export function readDeferState(repoRoot, kind) {
|
|
22
|
+
const path = deferStatePath(repoRoot, kind);
|
|
23
|
+
if (!existsSync(path))
|
|
24
|
+
return null;
|
|
25
|
+
let parsed;
|
|
26
|
+
try {
|
|
27
|
+
parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
if (!isDeferState(parsed))
|
|
33
|
+
return null;
|
|
34
|
+
return parsed;
|
|
35
|
+
}
|
|
36
|
+
export function writeDeferState(repoRoot, kind, snapshot) {
|
|
37
|
+
const state = {
|
|
38
|
+
deferred_at: snapshot.nowIso ?? new Date().toISOString(),
|
|
39
|
+
deferred_for_hours: snapshot.hours ?? DEFAULT_DEFER_HOURS,
|
|
40
|
+
flagged_shas: [...(snapshot.flagged_shas ?? [])],
|
|
41
|
+
flagged_task_ids: [...(snapshot.flagged_task_ids ?? [])],
|
|
42
|
+
};
|
|
43
|
+
const path = deferStatePath(repoRoot, kind);
|
|
44
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
45
|
+
writeFileSync(path, JSON.stringify(state, null, 2), "utf8");
|
|
46
|
+
return state;
|
|
47
|
+
}
|
|
48
|
+
export function clearDeferState(repoRoot, kind) {
|
|
49
|
+
rmSync(deferStatePath(repoRoot, kind), { force: true });
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Returns true when `state` is still suppressing — within the time
|
|
53
|
+
* window AND every currently-flagged item is in the deferred snapshot
|
|
54
|
+
* (no new bypasses / new pending reviews have appeared).
|
|
55
|
+
*
|
|
56
|
+
* If anything new appears, the suppression breaks and the Stop hook
|
|
57
|
+
* surfaces the warning again — which is the right behavior, because
|
|
58
|
+
* "defer for 24h" was a promise about the items the operator saw,
|
|
59
|
+
* not a blanket mute.
|
|
60
|
+
*/
|
|
61
|
+
export function isDeferActive(state, now, currentItems) {
|
|
62
|
+
const deferredAt = Date.parse(state.deferred_at);
|
|
63
|
+
if (Number.isNaN(deferredAt))
|
|
64
|
+
return false;
|
|
65
|
+
const expiresAt = deferredAt + state.deferred_for_hours * 60 * 60 * 1000;
|
|
66
|
+
if (now.getTime() >= expiresAt)
|
|
67
|
+
return false;
|
|
68
|
+
const snapshotSet = new Set(currentItems.kind === "shas" ? state.flagged_shas : state.flagged_task_ids);
|
|
69
|
+
for (const item of currentItems.values) {
|
|
70
|
+
if (!snapshotSet.has(item))
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
function isStringArray(v) {
|
|
76
|
+
return Array.isArray(v) && v.every((x) => typeof x === "string");
|
|
77
|
+
}
|
|
78
|
+
function isDeferState(x) {
|
|
79
|
+
if (x === null || typeof x !== "object")
|
|
80
|
+
return false;
|
|
81
|
+
const o = x;
|
|
82
|
+
return (typeof o["deferred_at"] === "string" &&
|
|
83
|
+
typeof o["deferred_for_hours"] === "number" &&
|
|
84
|
+
isStringArray(o["flagged_shas"]) &&
|
|
85
|
+
isStringArray(o["flagged_task_ids"]));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=defer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defer.js","sourceRoot":"","sources":["../../src/hooks/defer.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/index.d.ts
CHANGED
package/dist/hooks/index.js
CHANGED
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,OAAO,EACL,eAAe,EACf,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
@@ -22,8 +22,8 @@ export declare function lookupTask(repoRoot: string, taskId: string): TaskLookup
|
|
|
22
22
|
/**
|
|
23
23
|
* Cached scope-index reader. Content-keyed (sha256 of first 512 bytes) so
|
|
24
24
|
* back-to-back hook invocations in the same process don't re-parse the file
|
|
25
|
-
* AND so
|
|
26
|
-
* silently masked by a stale cache hit (Gap 6 in BUILD_REPORT).
|
|
25
|
+
* AND so concurrent ledger writes that happen within the same mtime tick
|
|
26
|
+
* are not silently masked by a stale cache hit (Gap 6 in BUILD_REPORT).
|
|
27
27
|
*
|
|
28
28
|
* Returns null when the file is missing, when no entry matches the path,
|
|
29
29
|
* when the entry is explicitly `unscoped: true`, or when the entry has no
|
|
@@ -12,8 +12,9 @@ import { lookupScope, readScopeIndex, scopeIndexPath, } from "../../ground/scope
|
|
|
12
12
|
const SCOPE_INDEX_HASH_BYTES = 512;
|
|
13
13
|
/**
|
|
14
14
|
* Hash the first N bytes of a file. Returns null when the file can't be read.
|
|
15
|
-
* Used as the cache key for scope-index — mtime is unreliable under clock
|
|
16
|
-
* (
|
|
15
|
+
* Used as the cache key for scope-index — mtime is unreliable under clock
|
|
16
|
+
* skew (concurrent ledger writes can land with the same mtime as the
|
|
17
|
+
* previous read).
|
|
17
18
|
*/
|
|
18
19
|
function hashFilePrefix(path, bytes) {
|
|
19
20
|
let fd;
|
|
@@ -197,8 +198,8 @@ export function lookupTask(repoRoot, taskId) {
|
|
|
197
198
|
/**
|
|
198
199
|
* Cached scope-index reader. Content-keyed (sha256 of first 512 bytes) so
|
|
199
200
|
* back-to-back hook invocations in the same process don't re-parse the file
|
|
200
|
-
* AND so
|
|
201
|
-
* silently masked by a stale cache hit (Gap 6 in BUILD_REPORT).
|
|
201
|
+
* AND so concurrent ledger writes that happen within the same mtime tick
|
|
202
|
+
* are not silently masked by a stale cache hit (Gap 6 in BUILD_REPORT).
|
|
202
203
|
*
|
|
203
204
|
* Returns null when the file is missing, when no entry matches the path,
|
|
204
205
|
* when the entry is explicitly `unscoped: true`, or when the entry has no
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger-cache.js","sourceRoot":"","sources":["../../../src/hooks/post-tool-use/ledger-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,GAGf,MAAM,6BAA6B,CAAC;AAqCrC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC
|
|
1
|
+
{"version":3,"file":"ledger-cache.js","sourceRoot":"","sources":["../../../src/hooks/post-tool-use/ledger-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,7 @@ export { runSessionEndHook } from "./session-end.js";
|
|
|
8
8
|
export { runStopHook } from "./stop.js";
|
|
9
9
|
export { renderBypassHint, scanBypassedCommits, } from "../bypass-detection.js";
|
|
10
10
|
export type { BypassedCommit, ScanBypassResult, } from "../bypass-detection.js";
|
|
11
|
+
export { seedAttestedCommits } from "../seed-attested.js";
|
|
12
|
+
export type { SeedAttestedResult, SeedAttestedStatus } from "../seed-attested.js";
|
|
11
13
|
export { CAIRN_HOOK_VERSION, emitShapeB, parseHookPayload, readHookStdin, recordHookTelemetry, } from "./payload.js";
|
|
12
14
|
export type { ClaudeHookPayload, HookTelemetryRow } from "./payload.js";
|
|
@@ -7,5 +7,6 @@ export { runSessionStartHook } from "./session-start.js";
|
|
|
7
7
|
export { runSessionEndHook } from "./session-end.js";
|
|
8
8
|
export { runStopHook } from "./stop.js";
|
|
9
9
|
export { renderBypassHint, scanBypassedCommits, } from "../bypass-detection.js";
|
|
10
|
+
export { seedAttestedCommits } from "../seed-attested.js";
|
|
10
11
|
export { CAIRN_HOOK_VERSION, emitShapeB, parseHookPayload, readHookStdin, recordHookTelemetry, } from "./payload.js";
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/runners/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,mBAAmB,GACpB,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/runners/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,mBAAmB,GACpB,MAAM,cAAc,CAAC"}
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* Spec: PLUGIN_ARCHITECTURE §7 + §10. Bin entrypoint at
|
|
8
8
|
* `cairn-core/src/hooks/session-start.ts` calls into this runner.
|
|
9
9
|
*/
|
|
10
|
-
import { existsSync } from "node:fs";
|
|
10
|
+
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { homedir } from "node:os";
|
|
11
12
|
import { join } from "node:path";
|
|
12
13
|
import { gcStaleEvents } from "../../events/index.js";
|
|
13
14
|
import { inspectJoinState } from "../../join/index.js";
|
|
@@ -16,6 +17,36 @@ import { buildSessionStartContext } from "../../session-start/index.js";
|
|
|
16
17
|
import { ensureSessionDir, gcStaleSessions, resolveSessionId, seedEventsMarker, } from "../../session/index.js";
|
|
17
18
|
import { defaultStatusJson, writeStatusJson } from "../../status-line/index.js";
|
|
18
19
|
import { emitShapeB, parseHookPayload, readHookStdin, recordHookTelemetry, } from "./payload.js";
|
|
20
|
+
/**
|
|
21
|
+
* Maintain the shim file the cairn-statusline-setup skill relies on —
|
|
22
|
+
* a single line containing the absolute path to the active bundle's
|
|
23
|
+
* `dist/cli.mjs`. The user's `~/.claude/settings.json` statusLine
|
|
24
|
+
* command reads this path so plugin upgrades (which change
|
|
25
|
+
* CLAUDE_PLUGIN_ROOT's version segment) don't break the badge.
|
|
26
|
+
*
|
|
27
|
+
* No-op when the hook isn't running under the Claude Code plugin
|
|
28
|
+
* (CLAUDE_PLUGIN_ROOT unset) — terminal `cairn hook session-start`
|
|
29
|
+
* invocations don't touch user-level settings.
|
|
30
|
+
*/
|
|
31
|
+
function syncActiveVersionShim(warnings) {
|
|
32
|
+
const pluginRoot = process.env["CLAUDE_PLUGIN_ROOT"];
|
|
33
|
+
if (typeof pluginRoot !== "string" || pluginRoot.length === 0)
|
|
34
|
+
return;
|
|
35
|
+
const bundlePath = join(pluginRoot, "dist", "cli.mjs");
|
|
36
|
+
if (!existsSync(bundlePath)) {
|
|
37
|
+
warnings.push(`statusline_shim_skipped: bundle missing at ${bundlePath}`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const shimDir = join(homedir(), ".claude", "plugins", "cache", "isaacriehm-cairn");
|
|
41
|
+
const shimPath = join(shimDir, ".active-version-path");
|
|
42
|
+
try {
|
|
43
|
+
mkdirSync(shimDir, { recursive: true });
|
|
44
|
+
writeFileSync(shimPath, `${bundlePath}\n`, "utf8");
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
warnings.push(`statusline_shim_failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
19
50
|
export async function runSessionStartHook() {
|
|
20
51
|
const startedAt = Date.now();
|
|
21
52
|
const raw = await readHookStdin();
|
|
@@ -24,6 +55,8 @@ export async function runSessionStartHook() {
|
|
|
24
55
|
const source = typeof payload.source === "string" ? payload.source : null;
|
|
25
56
|
const cwdInput = typeof payload.cwd === "string" ? payload.cwd : process.cwd();
|
|
26
57
|
const repoRoot = resolveRepoRoot(cwdInput);
|
|
58
|
+
const shimWarnings = [];
|
|
59
|
+
syncActiveVersionShim(shimWarnings);
|
|
27
60
|
if (repoRoot === null) {
|
|
28
61
|
// No `.cairn/` found walking up from cwd. If cwd is itself a git
|
|
29
62
|
// repo, this is an *unadopted* project — render the adoption banner
|
|
@@ -44,7 +77,10 @@ export async function runSessionStartHook() {
|
|
|
44
77
|
sessionId: payloadSessionId,
|
|
45
78
|
source,
|
|
46
79
|
durationMs: Date.now() - startedAt,
|
|
47
|
-
warnings:
|
|
80
|
+
warnings: [
|
|
81
|
+
...(adoptionBanner !== null ? ["adoption_offered"] : ["no_cairn_dir_found"]),
|
|
82
|
+
...shimWarnings,
|
|
83
|
+
],
|
|
48
84
|
extra: {
|
|
49
85
|
sections_rendered: adoptionBanner !== null ? ["adoption_banner"] : [],
|
|
50
86
|
sections_dropped: [],
|
|
@@ -57,7 +93,7 @@ export async function runSessionStartHook() {
|
|
|
57
93
|
const sessionId = resolveSessionId({ session_id: payloadSessionId ?? undefined });
|
|
58
94
|
try {
|
|
59
95
|
ensureSessionDir({ repoRoot, sessionId });
|
|
60
|
-
writeStatusJson(repoRoot, sessionId, defaultStatusJson(
|
|
96
|
+
writeStatusJson(repoRoot, sessionId, defaultStatusJson());
|
|
61
97
|
seedEventsMarker({ repoRoot, sessionId });
|
|
62
98
|
}
|
|
63
99
|
catch (err) {
|
|
@@ -94,7 +130,9 @@ export async function runSessionStartHook() {
|
|
|
94
130
|
writeStatusJson(repoRoot, sessionId, {
|
|
95
131
|
decisions_in_scope: result.counts.decisions,
|
|
96
132
|
invariants_in_scope: result.counts.invariants,
|
|
97
|
-
attention_count: result.counts.pendingDrafts
|
|
133
|
+
attention_count: result.counts.pendingDrafts +
|
|
134
|
+
result.counts.baselineFindings +
|
|
135
|
+
result.counts.driftFindings,
|
|
98
136
|
updated_at: new Date().toISOString(),
|
|
99
137
|
});
|
|
100
138
|
}
|
|
@@ -122,6 +160,7 @@ export async function runSessionStartHook() {
|
|
|
122
160
|
warnings: [
|
|
123
161
|
...result.warnings,
|
|
124
162
|
...sessionWarnings,
|
|
163
|
+
...shimWarnings,
|
|
125
164
|
...(bootstrapBanner !== null ? ["bootstrap_required"] : []),
|
|
126
165
|
],
|
|
127
166
|
extra: {
|
|
@@ -153,20 +192,15 @@ function renderBootstrapBanner(repoRoot) {
|
|
|
153
192
|
lines.push("## Cairn — bootstrap required");
|
|
154
193
|
lines.push("");
|
|
155
194
|
lines.push("This project is cairn-adopted, but this clone is not bootstrapped. " +
|
|
156
|
-
"Without
|
|
157
|
-
"skill blocks, and
|
|
195
|
+
"Without bootstrap, MCP write tools refuse, the cairn-direction " +
|
|
196
|
+
"skill blocks, and local commits will fail at the pre-commit hook.");
|
|
158
197
|
lines.push("");
|
|
159
198
|
lines.push(`Project pinned to cairn ${state.projectCairnVersion ?? "(unset)"}.`);
|
|
160
199
|
lines.push("");
|
|
161
|
-
lines.push("Surface this inline
|
|
162
|
-
lines.push("");
|
|
163
|
-
lines.push("
|
|
164
|
-
lines.push("
|
|
165
|
-
lines.push("> `[b]` skip (cairn write surface stays disabled)");
|
|
166
|
-
lines.push("");
|
|
167
|
-
lines.push("On `[a]`, run `cairn join` from this repo's working directory and " +
|
|
168
|
-
"wait for it to print `cairn join: bootstrapped`. The next assistant " +
|
|
169
|
-
"turn will pick up the unblocked surface.");
|
|
200
|
+
lines.push("Surface this inline by invoking the `cairn-bootstrap` skill —");
|
|
201
|
+
lines.push("it owns the prompt + the spawn of the bundled join command.");
|
|
202
|
+
lines.push("Do not embed the join command directly in chat output; the");
|
|
203
|
+
lines.push("skill keeps the bundle path versioned with the plugin.");
|
|
170
204
|
return lines.join("\n");
|
|
171
205
|
}
|
|
172
206
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runners/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runners/session-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,10 +19,29 @@ import { existsSync, readdirSync, statSync } from "node:fs";
|
|
|
19
19
|
import { join } from "node:path";
|
|
20
20
|
import { eventsSince, } from "../../events/index.js";
|
|
21
21
|
import { renderBypassHint, scanBypassedCommits, } from "../bypass-detection.js";
|
|
22
|
+
import { isDeferActive, readDeferState } from "../defer.js";
|
|
22
23
|
import { resolveRepoRoot } from "../../session-start/index.js";
|
|
23
24
|
import { readEventsMarker, stampEventsPoll, } from "../../session/index.js";
|
|
24
25
|
import { writeStatusJson } from "../../status-line/index.js";
|
|
25
26
|
import { emitShapeB, parseHookPayload, readHookStdin, recordHookTelemetry, } from "./payload.js";
|
|
27
|
+
/** Init in progress means `.cairn/init-state.json` exists at repoRoot. */
|
|
28
|
+
function isInitInProgress(repoRoot) {
|
|
29
|
+
return existsSync(join(repoRoot, ".cairn", "init-state.json"));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Cap the systemMessage that flows back to Claude Code. Both the
|
|
33
|
+
* reviewer hint and the bypass hint can fire on the same Stop tick;
|
|
34
|
+
* with many tasks/SHAs the combined render could blow past the
|
|
35
|
+
* envelope budget. 4 KB is generous for two A/B/C strips with their
|
|
36
|
+
* facts but small enough that overflow is structurally impossible.
|
|
37
|
+
*/
|
|
38
|
+
const MAX_ADDITIONAL_CONTEXT_CHARS = 4_000;
|
|
39
|
+
function clampAdditionalContext(body) {
|
|
40
|
+
if (body.length <= MAX_ADDITIONAL_CONTEXT_CHARS)
|
|
41
|
+
return body;
|
|
42
|
+
const head = body.slice(0, MAX_ADDITIONAL_CONTEXT_CHARS - 80);
|
|
43
|
+
return `${head}\n\n…(truncated; resolve via cairn-attention)`;
|
|
44
|
+
}
|
|
26
45
|
export async function runStopHook() {
|
|
27
46
|
const startedAt = Date.now();
|
|
28
47
|
const raw = await readHookStdin();
|
|
@@ -49,27 +68,63 @@ export async function runStopHook() {
|
|
|
49
68
|
catch (err) {
|
|
50
69
|
warnings.push(`events_poll_failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
51
70
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
71
|
+
const now = new Date();
|
|
72
|
+
// Suppress reviewer + bypass surfaces while init is mid-flight —
|
|
73
|
+
// `.cairn/.attested-commits` may not yet be seeded, and the
|
|
74
|
+
// adoption skill owns the operator's attention until phase 12
|
|
75
|
+
// returns nextPhase=null. The MCP init-phases tool clears the
|
|
76
|
+
// state file as soon as the final phase completes, after which
|
|
77
|
+
// the next Stop tick scans normally.
|
|
78
|
+
const initInProgress = isInitInProgress(repoRoot);
|
|
79
|
+
if (initInProgress) {
|
|
80
|
+
warnings.push("init_in_progress:scans_suppressed");
|
|
60
81
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
82
|
+
if (!initInProgress) {
|
|
83
|
+
try {
|
|
84
|
+
pendingReviews = scanPendingReviews(repoRoot);
|
|
85
|
+
if (pendingReviews.length > 0) {
|
|
86
|
+
const reviewDefer = readDeferState(repoRoot, "review");
|
|
87
|
+
const suppressed = reviewDefer !== null &&
|
|
88
|
+
isDeferActive(reviewDefer, now, {
|
|
89
|
+
kind: "task_ids",
|
|
90
|
+
values: pendingReviews.map((p) => p.task_id),
|
|
91
|
+
});
|
|
92
|
+
if (suppressed) {
|
|
93
|
+
warnings.push(`review_suppressed_until:${reviewDefer.deferred_at}`);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
additionalContext = renderReviewerHint(pendingReviews);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
warnings.push(`pending_review_scan_failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const bypassResult = scanBypassedCommits(repoRoot);
|
|
105
|
+
bypassed = bypassResult.bypassed;
|
|
106
|
+
if (bypassed.length > 0) {
|
|
107
|
+
const bypassDefer = readDeferState(repoRoot, "bypass");
|
|
108
|
+
const suppressed = bypassDefer !== null &&
|
|
109
|
+
isDeferActive(bypassDefer, now, {
|
|
110
|
+
kind: "shas",
|
|
111
|
+
values: bypassed.map((b) => b.sha),
|
|
112
|
+
});
|
|
113
|
+
if (suppressed) {
|
|
114
|
+
warnings.push(`bypass_suppressed_until:${bypassDefer.deferred_at}`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const hint = renderBypassHint(bypassed);
|
|
118
|
+
additionalContext =
|
|
119
|
+
additionalContext.length > 0
|
|
120
|
+
? `${additionalContext}\n\n${hint}`
|
|
121
|
+
: hint;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
warnings.push(`bypass_scan_failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
69
127
|
}
|
|
70
|
-
}
|
|
71
|
-
catch (err) {
|
|
72
|
-
warnings.push(`bypass_scan_failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
73
128
|
}
|
|
74
129
|
try {
|
|
75
130
|
writeStatusJson(repoRoot, sessionId, {
|
|
@@ -83,8 +138,9 @@ export async function runStopHook() {
|
|
|
83
138
|
// Claude Code's Stop hook schema rejects hookSpecificOutput. Surface
|
|
84
139
|
// text via the top-level systemMessage field; empty payload is fine.
|
|
85
140
|
const out = { continue: true };
|
|
86
|
-
if (additionalContext.length > 0)
|
|
87
|
-
out.systemMessage = additionalContext;
|
|
141
|
+
if (additionalContext.length > 0) {
|
|
142
|
+
out.systemMessage = clampAdditionalContext(additionalContext);
|
|
143
|
+
}
|
|
88
144
|
emitShapeB(out);
|
|
89
145
|
recordHookTelemetry({
|
|
90
146
|
hook: "stop",
|
|
@@ -151,13 +207,14 @@ function scanPendingReviews(repoRoot) {
|
|
|
151
207
|
}
|
|
152
208
|
function renderReviewerHint(pending) {
|
|
153
209
|
const lines = [];
|
|
154
|
-
|
|
210
|
+
const noun = pending.length === 1 ? "task" : "tasks";
|
|
211
|
+
lines.push(`**Cairn — ${pending.length} ${noun} awaiting review attestation.**`);
|
|
155
212
|
lines.push("");
|
|
156
213
|
for (const p of pending) {
|
|
157
|
-
lines.push(`-
|
|
214
|
+
lines.push(`- \`${p.task_id}\``);
|
|
158
215
|
}
|
|
159
216
|
lines.push("");
|
|
160
|
-
lines.push("
|
|
217
|
+
lines.push("`[a]` run review · `[b]` skip · `[c]` defer 24h");
|
|
161
218
|
return lines.join("\n");
|
|
162
219
|
}
|
|
163
220
|
//# sourceMappingURL=stop.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/hooks/runners/stop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,WAAW,GAEZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GAEpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EACL,gBAAgB,EAChB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,mBAAmB,GACpB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/hooks/runners/stop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seed `.cairn/.attested-commits` with every commit reachable from
|
|
3
|
+
* HEAD at the time of seeding. Bypass detection then grandfathers all
|
|
4
|
+
* those SHAs as "already attested" — only future bypassed commits
|
|
5
|
+
* surface as attention.
|
|
6
|
+
*
|
|
7
|
+
* Two callers:
|
|
8
|
+
* 1. Phase 3b-seed (during `cairn init`) — seeds for the adopting
|
|
9
|
+
* clone the moment `.cairn/` lands, so the very next Stop hook
|
|
10
|
+
* tick doesn't false-positive every pre-adoption commit.
|
|
11
|
+
* 2. `cairn join` (per-clone bootstrap) — `.attested-commits` is
|
|
12
|
+
* gitignored + per-clone, so each new clone needs its own seed
|
|
13
|
+
* on first bootstrap.
|
|
14
|
+
*
|
|
15
|
+
* Idempotent: if the file already exists with content, we leave it
|
|
16
|
+
* alone (the post-commit hook owns ongoing appends).
|
|
17
|
+
*/
|
|
18
|
+
export type SeedAttestedStatus = "ok" | "skipped" | "error";
|
|
19
|
+
export interface SeedAttestedResult {
|
|
20
|
+
status: SeedAttestedStatus;
|
|
21
|
+
detail: string;
|
|
22
|
+
/** SHA count seeded — present only when status="ok". */
|
|
23
|
+
count?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare function seedAttestedCommits(repoRoot: string, dryRun?: boolean): SeedAttestedResult;
|