@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
@@ -24,8 +24,12 @@ export { classifyAutoMerge } from "./classify.js";
24
24
  export type { ClassifyArgs } from "./classify.js";
25
25
  export { runCompletionIntegrity } from "./completion-integrity.js";
26
26
  export type { CompletionIntegrityOptions, CompletionIntegrityResult, } from "./completion-integrity.js";
27
+ export { runDocClaimsVsRuntime } from "./doc-claims.js";
28
+ export type { DocClaimKind, DocClaimsOptions, DocClaimsResult, RuntimeTruth as DocClaimsRuntimeTruth, } from "./doc-claims.js";
27
29
  export { runDocGardening } from "./doc-gardening.js";
28
30
  export type { DocGardeningOptions, DocGardeningResult, } from "./doc-gardening.js";
31
+ export { extractSectionByAnchor, runDocSourceDrift, slugifyHeading, } from "./doc-source-drift.js";
32
+ export type { DocSourceDriftOptions, DocSourceDriftResult, } from "./doc-source-drift.js";
29
33
  export { runFrontmatterFreshness, } from "./frontmatter.js";
30
34
  export type { FrontmatterFreshnessOptions, FrontmatterFreshnessResult, } from "./frontmatter.js";
31
35
  export { runGeneratorDrift } from "./generator-drift.js";
package/dist/gc/index.js CHANGED
@@ -19,7 +19,9 @@ export { runGcCanary as verifyBatchCanary } from "./canary.js";
19
19
  export { runCitationIntegrity } from "./citation-integrity.js";
20
20
  export { classifyAutoMerge } from "./classify.js";
21
21
  export { runCompletionIntegrity } from "./completion-integrity.js";
22
+ export { runDocClaimsVsRuntime } from "./doc-claims.js";
22
23
  export { runDocGardening } from "./doc-gardening.js";
24
+ export { extractSectionByAnchor, runDocSourceDrift, slugifyHeading, } from "./doc-source-drift.js";
23
25
  export { runFrontmatterFreshness, } from "./frontmatter.js";
24
26
  export { runGeneratorDrift } from "./generator-drift.js";
25
27
  export { runQualityUpdate as runQualityGradesUpdate } from "./quality-update.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,EACL,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKpD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAOxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKpD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/gc/sweep.js CHANGED
@@ -20,7 +20,9 @@ import { runGcCanary } from "./canary.js";
20
20
  import { runCitationIntegrity } from "./citation-integrity.js";
21
21
  import { classifyAutoMerge } from "./classify.js";
22
22
  import { runCompletionIntegrity } from "./completion-integrity.js";
23
+ import { runDocClaimsVsRuntime } from "./doc-claims.js";
23
24
  import { runDocGardening } from "./doc-gardening.js";
25
+ import { runDocSourceDrift } from "./doc-source-drift.js";
24
26
  import { runFrontmatterFreshness } from "./frontmatter.js";
25
27
  import { runGeneratorDrift } from "./generator-drift.js";
26
28
  import { runQualityUpdate } from "./quality-update.js";
@@ -43,6 +45,8 @@ export async function runGcSweep(opts) {
43
45
  "completion-integrity": 0,
44
46
  "citation-integrity": 0,
45
47
  "attested-commits-pruning": 0,
48
+ "doc-claims-vs-runtime": 0,
49
+ "doc-source-drift": 0,
46
50
  };
47
51
  // 1. Frontmatter freshness.
48
52
  {
@@ -125,6 +129,20 @@ export async function runGcSweep(opts) {
125
129
  findings.push(...r.findings);
126
130
  passDurations["attested-commits-pruning"] = Date.now() - t0;
127
131
  }
132
+ // 10. Doc-claims vs runtime drift.
133
+ {
134
+ const t0 = Date.now();
135
+ const r = runDocClaimsVsRuntime({ repoRoot: opts.repoRoot });
136
+ findings.push(...r.findings);
137
+ passDurations["doc-claims-vs-runtime"] = Date.now() - t0;
138
+ }
139
+ // 11. Doc-source drift — body of sot_kind=path DECs/INVs vs ground hash.
140
+ {
141
+ const t0 = Date.now();
142
+ const r = runDocSourceDrift({ repoRoot: opts.repoRoot });
143
+ findings.push(...r.findings);
144
+ passDurations["doc-source-drift"] = Date.now() - t0;
145
+ }
128
146
  // Re-classify proposals against project globs (passes set defaults; this
129
147
  // ensures high-stakes hits dominate when a stale-frontmatter doc happens to
130
148
  // live under a high-stakes glob).
@@ -1 +1 @@
1
- {"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/gc/sweep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/gc/sweep.ts"],"names":[],"mappings":"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"}
@@ -22,8 +22,8 @@
22
22
  * reviewer + UAT 🟢 → push.
23
23
  * high-stakes — touches projectGlobs.high_stakes_globs. Above + E2E + Layer E.
24
24
  */
25
- export type GcPassId = "frontmatter-freshness" | "generator-drift" | "stub-catalog-hits" | "doc-gardening" | "quality-grades" | "scope-coverage" | "completion-integrity" | "citation-integrity" | "attested-commits-pruning";
26
- export type GcFindingKind = "frontmatter_stale" | "generator_drift" | "stub_hit" | "broken_link" | "orphan_path" | "quality_update" | "scope_uncovered" | "scope_drift_orphan" | "scope_index_missing" | "task_integrity_error" | "orphaned_citation" | "stale_citation" | "quality_grades_rebuilt" | "superseded_citation";
25
+ export type GcPassId = "frontmatter-freshness" | "generator-drift" | "stub-catalog-hits" | "doc-gardening" | "quality-grades" | "scope-coverage" | "completion-integrity" | "citation-integrity" | "attested-commits-pruning" | "doc-claims-vs-runtime" | "doc-source-drift";
26
+ export type GcFindingKind = "frontmatter_stale" | "generator_drift" | "stub_hit" | "broken_link" | "orphan_path" | "quality_update" | "scope_uncovered" | "scope_drift_orphan" | "scope_index_missing" | "task_integrity_error" | "orphaned_citation" | "stale_citation" | "quality_grades_rebuilt" | "superseded_citation" | "doc_claim_drift" | "doc_source_drift" | "sot_missing" | "sot_anchor_missing";
27
27
  export type GcAutoMergeClass = "safe" | "code" | "high-stakes";
28
28
  export interface GcFinding {
29
29
  pass: GcPassId;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Context-threshold detection for the Stop hook.
3
+ *
4
+ * When mid-task context approaches the active model's window, surface
5
+ * an inline `[a] keep going [b] /clear and resume now [c] mark task
6
+ * done` choice via Claude Code's AskUserQuestion. The Stop hook can't
7
+ * call AskUserQuestion directly (only the model can), so it injects
8
+ * `decision: block` with an instructional reason that prompts main
9
+ * Claude to render the question.
10
+ *
11
+ * Threshold defaults to 50 % of the active model's window:
12
+ * - claude-opus-* → 1_000_000 tokens, fire at 500_000
13
+ * - claude-sonnet-* → 200_000 tokens, fire at 100_000
14
+ * - claude-haiku-* → 200_000 tokens, fire at 100_000
15
+ * - unknown model → assume Opus shape (1M / 500k threshold)
16
+ *
17
+ * Token count is estimated from the transcript file size (`bytes / 4`)
18
+ * — overcounts a little on JSON whitespace, undercounts on unicode-
19
+ * heavy turns. Good enough to fire near the threshold; not a budget
20
+ * check.
21
+ *
22
+ * Suppress re-fire within the same session by stamping
23
+ * `.cairn/sessions/<id>/ctx-threshold-warned.json`. Once stamped, the
24
+ * threshold prompt re-fires only when usage climbs another +10 %
25
+ * past the last warning.
26
+ */
27
+ export interface ContextThresholdInput {
28
+ transcriptPath: string | null;
29
+ repoRoot: string;
30
+ sessionId: string;
31
+ /** Override the model lookup (rarely needed). */
32
+ modelOverride?: string | null;
33
+ /** Override the threshold fraction (default 0.5). */
34
+ thresholdFraction?: number;
35
+ /** Override the window size in tokens (default keyed on model). */
36
+ windowOverride?: number;
37
+ }
38
+ export interface ContextThresholdHit {
39
+ hit: true;
40
+ estimatedTokens: number;
41
+ windowTokens: number;
42
+ pct: number;
43
+ model: string;
44
+ taskId: string | null;
45
+ }
46
+ export interface ContextThresholdMiss {
47
+ hit: false;
48
+ }
49
+ export type ContextThresholdResult = ContextThresholdHit | ContextThresholdMiss;
50
+ /**
51
+ * Returns the current threshold result. Stamps the warned-state file
52
+ * on a hit so re-fires within the same session are suppressed until
53
+ * usage climbs another +10 % of the window.
54
+ */
55
+ export declare function checkContextThreshold(input: ContextThresholdInput): ContextThresholdResult;
56
+ /**
57
+ * Render the inline prompt that the Stop hook injects via
58
+ * `decision: block`. The text instructs main Claude to render the
59
+ * three-option AskUserQuestion. Format-locked so the `[b]` branch
60
+ * always emits the literal `/cairn-resume <task_id>` token the
61
+ * operator pastes after `/clear`.
62
+ */
63
+ export declare function renderContextThresholdHint(hit: ContextThresholdHit, taskId: string | null): string;
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Context-threshold detection for the Stop hook.
3
+ *
4
+ * When mid-task context approaches the active model's window, surface
5
+ * an inline `[a] keep going [b] /clear and resume now [c] mark task
6
+ * done` choice via Claude Code's AskUserQuestion. The Stop hook can't
7
+ * call AskUserQuestion directly (only the model can), so it injects
8
+ * `decision: block` with an instructional reason that prompts main
9
+ * Claude to render the question.
10
+ *
11
+ * Threshold defaults to 50 % of the active model's window:
12
+ * - claude-opus-* → 1_000_000 tokens, fire at 500_000
13
+ * - claude-sonnet-* → 200_000 tokens, fire at 100_000
14
+ * - claude-haiku-* → 200_000 tokens, fire at 100_000
15
+ * - unknown model → assume Opus shape (1M / 500k threshold)
16
+ *
17
+ * Token count is estimated from the transcript file size (`bytes / 4`)
18
+ * — overcounts a little on JSON whitespace, undercounts on unicode-
19
+ * heavy turns. Good enough to fire near the threshold; not a budget
20
+ * check.
21
+ *
22
+ * Suppress re-fire within the same session by stamping
23
+ * `.cairn/sessions/<id>/ctx-threshold-warned.json`. Once stamped, the
24
+ * threshold prompt re-fires only when usage climbs another +10 %
25
+ * past the last warning.
26
+ */
27
+ import { existsSync, readFileSync, statSync, writeFileSync } from "node:fs";
28
+ import { join } from "node:path";
29
+ const MODEL_WINDOW_FALLBACK = 1_000_000;
30
+ function modelWindow(model) {
31
+ if (/opus/i.test(model))
32
+ return 1_000_000;
33
+ if (/sonnet/i.test(model))
34
+ return 200_000;
35
+ if (/haiku/i.test(model))
36
+ return 200_000;
37
+ return MODEL_WINDOW_FALLBACK;
38
+ }
39
+ /**
40
+ * Walk the last ~64 KB of the transcript looking for the most recent
41
+ * `model` field. Claude Code transcript lines are JSON; each assistant
42
+ * turn carries a `message.model` string. Skipping the full file keeps
43
+ * the hook fast on long sessions.
44
+ */
45
+ function readModelFromTranscript(path) {
46
+ try {
47
+ const stat = statSync(path);
48
+ const tail = Math.min(stat.size, 65_536);
49
+ const fd = readFileSync(path, "utf8");
50
+ const slice = fd.slice(Math.max(0, fd.length - tail));
51
+ const lines = slice.split(/\r?\n/);
52
+ for (let i = lines.length - 1; i >= 0; i--) {
53
+ const line = lines[i];
54
+ if (line === undefined || line.length === 0)
55
+ continue;
56
+ try {
57
+ const obj = JSON.parse(line);
58
+ const m = obj.message?.model;
59
+ if (typeof m === "string" && m.length > 0)
60
+ return m;
61
+ }
62
+ catch {
63
+ // skip malformed lines
64
+ }
65
+ }
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ return null;
71
+ }
72
+ function estimateTokens(transcriptPath) {
73
+ try {
74
+ return Math.floor(statSync(transcriptPath).size / 4);
75
+ }
76
+ catch {
77
+ return 0;
78
+ }
79
+ }
80
+ function warnedStatePath(repoRoot, sessionId) {
81
+ return join(repoRoot, ".cairn", "sessions", sessionId, "ctx-threshold-warned.json");
82
+ }
83
+ function readWarned(repoRoot, sessionId) {
84
+ const path = warnedStatePath(repoRoot, sessionId);
85
+ if (!existsSync(path))
86
+ return null;
87
+ try {
88
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
89
+ if (typeof parsed === "object" &&
90
+ parsed !== null &&
91
+ typeof parsed.ts === "number" &&
92
+ typeof parsed.warned_at_tokens === "number") {
93
+ return parsed;
94
+ }
95
+ }
96
+ catch {
97
+ // fall through
98
+ }
99
+ return null;
100
+ }
101
+ function writeWarned(repoRoot, sessionId, state) {
102
+ try {
103
+ writeFileSync(warnedStatePath(repoRoot, sessionId), `${JSON.stringify(state, null, 2)}\n`, "utf8");
104
+ }
105
+ catch {
106
+ // best-effort
107
+ }
108
+ }
109
+ /**
110
+ * Returns the current threshold result. Stamps the warned-state file
111
+ * on a hit so re-fires within the same session are suppressed until
112
+ * usage climbs another +10 % of the window.
113
+ */
114
+ export function checkContextThreshold(input) {
115
+ if (input.transcriptPath === null || input.transcriptPath.length === 0) {
116
+ return { hit: false };
117
+ }
118
+ if (!existsSync(input.transcriptPath))
119
+ return { hit: false };
120
+ const model = input.modelOverride ?? readModelFromTranscript(input.transcriptPath) ?? "unknown";
121
+ const windowTokens = input.windowOverride ?? modelWindow(model);
122
+ const fraction = input.thresholdFraction ?? 0.5;
123
+ const thresholdTokens = Math.floor(windowTokens * fraction);
124
+ const estimated = estimateTokens(input.transcriptPath);
125
+ if (estimated < thresholdTokens)
126
+ return { hit: false };
127
+ const warned = readWarned(input.repoRoot, input.sessionId);
128
+ const reFireSlackTokens = Math.floor(windowTokens * 0.1);
129
+ if (warned !== null && estimated < warned.warned_at_tokens + reFireSlackTokens) {
130
+ return { hit: false };
131
+ }
132
+ writeWarned(input.repoRoot, input.sessionId, {
133
+ ts: Date.now(),
134
+ warned_at_tokens: estimated,
135
+ });
136
+ return {
137
+ hit: true,
138
+ estimatedTokens: estimated,
139
+ windowTokens,
140
+ pct: Math.round((estimated / windowTokens) * 100),
141
+ model,
142
+ taskId: null,
143
+ };
144
+ }
145
+ /**
146
+ * Render the inline prompt that the Stop hook injects via
147
+ * `decision: block`. The text instructs main Claude to render the
148
+ * three-option AskUserQuestion. Format-locked so the `[b]` branch
149
+ * always emits the literal `/cairn-resume <task_id>` token the
150
+ * operator pastes after `/clear`.
151
+ */
152
+ export function renderContextThresholdHint(hit, taskId) {
153
+ const taskLine = taskId !== null
154
+ ? `Active task: \`${taskId}\`.`
155
+ : "No active task — context still climbing through general work.";
156
+ const resumeLine = taskId !== null
157
+ ? `If the operator picks **\`b\`**, emit a code block containing exactly:\n\n\`\`\`\n/cairn-resume ${taskId}\n\`\`\`\n\nThe operator copies that, runs \`/clear\`, then pastes it into the fresh chat — Cairn rebuilds context from \`.cairn/tasks/active/${taskId}/journal.jsonl\`.`
158
+ : "If the operator picks **`b`**, instruct them to `/clear` and re-ask. There's no task journal to resume from yet.";
159
+ return [
160
+ `## Cairn — context threshold reached`,
161
+ "",
162
+ `Estimated **${hit.estimatedTokens.toLocaleString()} / ${hit.windowTokens.toLocaleString()} tokens (${hit.pct}%)** for \`${hit.model}\`. Trust degrades as context climbs — best to compact now.`,
163
+ "",
164
+ taskLine,
165
+ "",
166
+ "Render this question via the `AskUserQuestion` tool — do not skip:",
167
+ "",
168
+ "> Context at " + hit.pct + "% of " + hit.model + " window. Pick:",
169
+ "> ",
170
+ "> - `[a]` keep going (warn re-fires every +10 %)",
171
+ "> - `[b]` `/clear` and resume now (Cairn writes the resume prompt)",
172
+ "> - `[c]` mark task done (graduate the active TSK and start fresh)",
173
+ "",
174
+ resumeLine,
175
+ "",
176
+ "On `[c]`, call `cairn_task_complete({task_id, outcome: \"succeeded\"})` for the active task before ending the turn. On `[a]`, just continue.",
177
+ ].join("\n");
178
+ }
179
+ //# sourceMappingURL=context-threshold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-threshold.js","sourceRoot":"","sources":["../../../src/hooks/runners/context-threshold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Stop-hook GC autotrigger.
3
+ *
4
+ * Runs at the tail of every Stop tick when no init is in flight. If the
5
+ * last GC run is older than the threshold (default 24 h), spawns
6
+ * `cairn gc sweep` detached so the next attention surface (or
7
+ * operator-visible run) reflects current drift. The Stop hook does NOT
8
+ * wait for the spawned process — it stamps the marker, fires the spawn,
9
+ * unrefs, and returns.
10
+ *
11
+ * `cairn gc sweep` is sweep-only (no commit). The findings flow through
12
+ * `cairn-attention` for operator triage. `cairn gc run --apply-classes`
13
+ * stays operator-driven until the autotrigger is proven safe in the
14
+ * field.
15
+ */
16
+ export interface GcAutotriggerOptions {
17
+ repoRoot: string;
18
+ /** Override threshold in hours. Default 24. */
19
+ thresholdHours?: number;
20
+ /** Override "now"; injected by tests. */
21
+ now?: Date;
22
+ /**
23
+ * Replace the actual `child_process.spawn` call. Smokes pass a
24
+ * recorder so they can assert arguments without forking a real
25
+ * subprocess.
26
+ */
27
+ spawner?: (argv: GcAutotriggerArgv) => void;
28
+ /**
29
+ * Override CLAUDE_PLUGIN_ROOT; defaults to process.env. Required for
30
+ * tests that don't set the real env var.
31
+ */
32
+ pluginRoot?: string;
33
+ }
34
+ export interface GcAutotriggerArgv {
35
+ cmd: string;
36
+ args: string[];
37
+ cwd: string;
38
+ }
39
+ export type GcAutotriggerReason = "first_run" | "threshold_passed" | "fresh" | "no_plugin_root" | "no_cli_bundle";
40
+ export interface GcAutotriggerResult {
41
+ triggered: boolean;
42
+ reason: GcAutotriggerReason;
43
+ thresholdHours: number;
44
+ /** ISO timestamp of the marker as it stood before this call. "" when none. */
45
+ lastRunIso: string;
46
+ /** Argv that was (or would have been) spawned. Set when triggered=true. */
47
+ spawned?: GcAutotriggerArgv;
48
+ }
49
+ export declare function runGcAutotriggerCheck(opts: GcAutotriggerOptions): GcAutotriggerResult;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Stop-hook GC autotrigger.
3
+ *
4
+ * Runs at the tail of every Stop tick when no init is in flight. If the
5
+ * last GC run is older than the threshold (default 24 h), spawns
6
+ * `cairn gc sweep` detached so the next attention surface (or
7
+ * operator-visible run) reflects current drift. The Stop hook does NOT
8
+ * wait for the spawned process — it stamps the marker, fires the spawn,
9
+ * unrefs, and returns.
10
+ *
11
+ * `cairn gc sweep` is sweep-only (no commit). The findings flow through
12
+ * `cairn-attention` for operator triage. `cairn gc run --apply-classes`
13
+ * stays operator-driven until the autotrigger is proven safe in the
14
+ * field.
15
+ */
16
+ import { spawn } from "node:child_process";
17
+ import { existsSync, readFileSync } from "node:fs";
18
+ import { join } from "node:path";
19
+ import { writeFileSafe } from "@isaacriehm/cairn-state";
20
+ const MARKER_REL = ".cairn/.gc-last-run";
21
+ const DEFAULT_THRESHOLD_HOURS = 24;
22
+ export function runGcAutotriggerCheck(opts) {
23
+ const thresholdHours = opts.thresholdHours ?? DEFAULT_THRESHOLD_HOURS;
24
+ const now = opts.now ?? new Date();
25
+ const markerAbs = join(opts.repoRoot, MARKER_REL);
26
+ const prior = readMarkerMtime(markerAbs);
27
+ let triggered = false;
28
+ let reason;
29
+ if (prior === null) {
30
+ triggered = true;
31
+ reason = "first_run";
32
+ }
33
+ else if (now.getTime() - prior.getTime() >= thresholdHours * 3_600_000) {
34
+ triggered = true;
35
+ reason = "threshold_passed";
36
+ }
37
+ else {
38
+ triggered = false;
39
+ reason = "fresh";
40
+ }
41
+ const lastRunIso = prior ? prior.toISOString() : "";
42
+ if (!triggered)
43
+ return { triggered, reason, thresholdHours, lastRunIso };
44
+ const pluginRoot = opts.pluginRoot ?? process.env["CLAUDE_PLUGIN_ROOT"];
45
+ if (typeof pluginRoot !== "string" || pluginRoot.length === 0) {
46
+ return { triggered: false, reason: "no_plugin_root", thresholdHours, lastRunIso };
47
+ }
48
+ const cliPath = join(pluginRoot, "dist", "cli.mjs");
49
+ if (!existsSync(cliPath)) {
50
+ return { triggered: false, reason: "no_cli_bundle", thresholdHours, lastRunIso };
51
+ }
52
+ writeFileSafe(markerAbs, now.toISOString());
53
+ const argv = {
54
+ cmd: process.execPath,
55
+ args: [cliPath, "gc", "sweep", "--repo-root", opts.repoRoot],
56
+ cwd: opts.repoRoot,
57
+ };
58
+ if (opts.spawner) {
59
+ opts.spawner(argv);
60
+ }
61
+ else {
62
+ const child = spawn(argv.cmd, argv.args, {
63
+ cwd: argv.cwd,
64
+ detached: true,
65
+ stdio: "ignore",
66
+ env: { ...process.env, CAIRN_GC_AUTOTRIGGERED: "1" },
67
+ });
68
+ child.unref();
69
+ }
70
+ return { triggered, reason, thresholdHours, lastRunIso, spawned: argv };
71
+ }
72
+ function readMarkerMtime(absPath) {
73
+ if (!existsSync(absPath))
74
+ return null;
75
+ let raw;
76
+ try {
77
+ raw = readFileSync(absPath, "utf8").trim();
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ const parsed = Date.parse(raw);
83
+ if (!Number.isFinite(parsed))
84
+ return null;
85
+ return new Date(parsed);
86
+ }
87
+ //# sourceMappingURL=gc-autotrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gc-autotrigger.js","sourceRoot":"","sources":["../../../src/hooks/runners/gc-autotrigger.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ export { runSessionStartHook } from "./session-start.js";
7
7
  export { runSessionEndHook } from "./session-end.js";
8
8
  export { runStopHook } from "./stop.js";
9
9
  export { runUserPromptSubmitHook } from "./user-prompt-submit.js";
10
+ export { runGcAutotriggerCheck } from "./gc-autotrigger.js";
11
+ export type { GcAutotriggerArgv, GcAutotriggerOptions, GcAutotriggerReason, GcAutotriggerResult, } from "./gc-autotrigger.js";
10
12
  export { renderBypassHint, scanBypassedCommits, } from "../bypass-detection.js";
11
13
  export type { BypassedCommit, ScanBypassResult, } from "../bypass-detection.js";
12
14
  export { seedAttestedCommits } from "../seed-attested.js";
@@ -7,6 +7,7 @@ export { runSessionStartHook } from "./session-start.js";
7
7
  export { runSessionEndHook } from "./session-end.js";
8
8
  export { runStopHook } from "./stop.js";
9
9
  export { runUserPromptSubmitHook } from "./user-prompt-submit.js";
10
+ export { runGcAutotriggerCheck } from "./gc-autotrigger.js";
10
11
  export { renderBypassHint, scanBypassedCommits, } from "../bypass-detection.js";
11
12
  export { seedAttestedCommits } from "../seed-attested.js";
12
13
  export { CAIRN_HOOK_VERSION, emitShapeB, parseHookPayload, readHookStdin, appendTelemetry, } from "./payload.js";
@@ -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,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,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,eAAe,GAChB,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,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAO5D,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,eAAe,GAChB,MAAM,cAAc,CAAC"}