@isaacriehm/cairn-core 0.2.0 → 0.3.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/claude/runner.d.ts +1 -1
- package/dist/claude/runner.js +62 -1
- package/dist/claude/runner.js.map +1 -1
- package/dist/claude/types.d.ts +14 -7
- package/dist/claude/types.js +5 -7
- package/dist/claude/types.js.map +1 -1
- package/dist/context/index.d.ts +4 -4
- package/dist/context/index.js +3 -4
- package/dist/context/index.js.map +1 -1
- package/dist/context/spec-delta.js +2 -3
- package/dist/context/spec-delta.js.map +1 -1
- package/dist/context/task-summary.d.ts +18 -0
- package/dist/context/task-summary.js +89 -0
- package/dist/context/task-summary.js.map +1 -0
- package/dist/decision-capture/id.d.ts +21 -4
- package/dist/decision-capture/id.js +56 -5
- package/dist/decision-capture/id.js.map +1 -1
- package/dist/decision-capture/index.d.ts +7 -22
- package/dist/decision-capture/index.js +7 -17
- package/dist/decision-capture/index.js.map +1 -1
- package/dist/doctor/index.d.ts +1 -1
- package/dist/doctor/index.js +1 -1
- package/dist/events/index.d.ts +1 -1
- package/dist/events/index.js +1 -1
- package/dist/events/writer.d.ts +1 -1
- package/dist/events/writer.js +1 -1
- package/dist/gc/canary.d.ts +13 -23
- package/dist/gc/canary.js +36 -92
- package/dist/gc/canary.js.map +1 -1
- package/dist/gc/citation-integrity.d.ts +6 -6
- package/dist/gc/citation-integrity.js +64 -20
- package/dist/gc/citation-integrity.js.map +1 -1
- package/dist/gc/frontmatter.js +1 -1
- package/dist/gc/generator-drift.js +1 -1
- package/dist/gc/generator-drift.js.map +1 -1
- package/dist/gc/index.d.ts +2 -2
- package/dist/gc/index.js +1 -1
- package/dist/gc/index.js.map +1 -1
- package/dist/gc/quality-update.js +1 -1
- package/dist/gc/quality-update.js.map +1 -1
- package/dist/gc/types.d.ts +1 -30
- package/dist/ground/index.d.ts +2 -2
- package/dist/ground/index.js +1 -1
- package/dist/ground/index.js.map +1 -1
- package/dist/ground/ledgers.d.ts +0 -4
- package/dist/ground/ledgers.js +10 -8
- package/dist/ground/ledgers.js.map +1 -1
- package/dist/ground/manifest.js +0 -2
- package/dist/ground/manifest.js.map +1 -1
- package/dist/ground/quality-grades.js +3 -1
- package/dist/ground/quality-grades.js.map +1 -1
- package/dist/ground/schemas.d.ts +2 -7
- package/dist/ground/schemas.js +7 -2
- package/dist/ground/schemas.js.map +1 -1
- package/dist/ground/scope-index.d.ts +59 -12
- package/dist/ground/scope-index.js +212 -43
- package/dist/ground/scope-index.js.map +1 -1
- package/dist/hooks/bypass-detection.js +4 -2
- package/dist/hooks/bypass-detection.js.map +1 -1
- package/dist/hooks/post-tool-use/citation-scanner.d.ts +7 -5
- package/dist/hooks/post-tool-use/citation-scanner.js +15 -9
- package/dist/hooks/post-tool-use/citation-scanner.js.map +1 -1
- package/dist/hooks/post-tool-use/copy-scanner.js +1 -1
- package/dist/hooks/post-tool-use/copy-scanner.js.map +1 -1
- package/dist/hooks/post-tool-use/ledger-cache.d.ts +8 -0
- package/dist/hooks/post-tool-use/ledger-cache.js +53 -0
- package/dist/hooks/post-tool-use/ledger-cache.js.map +1 -1
- package/dist/hooks/post-tool-use/legend-builder.d.ts +3 -3
- package/dist/hooks/post-tool-use/legend-builder.js +30 -8
- package/dist/hooks/post-tool-use/legend-builder.js.map +1 -1
- package/dist/hooks/post-tool-use/read-enricher.d.ts +1 -1
- package/dist/hooks/post-tool-use/read-enricher.js +68 -21
- package/dist/hooks/post-tool-use/read-enricher.js.map +1 -1
- package/dist/hooks/post-tool-use/write-guardian.js +148 -18
- package/dist/hooks/post-tool-use/write-guardian.js.map +1 -1
- package/dist/hooks/runners/index.d.ts +1 -0
- package/dist/hooks/runners/index.js +1 -0
- package/dist/hooks/runners/index.js.map +1 -1
- package/dist/hooks/runners/payload.d.ts +1 -1
- package/dist/hooks/runners/payload.js +27 -12
- package/dist/hooks/runners/payload.js.map +1 -1
- package/dist/hooks/runners/session-start.js +212 -66
- package/dist/hooks/runners/session-start.js.map +1 -1
- package/dist/hooks/runners/stop.d.ts +9 -12
- package/dist/hooks/runners/stop.js +67 -36
- package/dist/hooks/runners/stop.js.map +1 -1
- package/dist/hooks/runners/user-prompt-submit.d.ts +15 -0
- package/dist/hooks/runners/user-prompt-submit.js +149 -0
- package/dist/hooks/runners/user-prompt-submit.js.map +1 -0
- package/dist/hooks/user-prompt-submit.d.ts +7 -0
- package/dist/hooks/user-prompt-submit.js +12 -0
- package/dist/hooks/user-prompt-submit.js.map +1 -0
- package/dist/index.d.ts +1 -6
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/init/baseline-audit.d.ts +5 -1
- package/dist/init/baseline-audit.js +25 -2
- package/dist/init/baseline-audit.js.map +1 -1
- package/dist/init/glob-inference.d.ts +16 -0
- package/dist/init/glob-inference.js +108 -0
- package/dist/init/glob-inference.js.map +1 -0
- 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/ingest-docs.d.ts +1 -1
- package/dist/init/ingest-docs.js +19 -6
- package/dist/init/ingest-docs.js.map +1 -1
- package/dist/init/init.js +12 -7
- package/dist/init/init.js.map +1 -1
- package/dist/init/mapper-merge.d.ts +8 -2
- package/dist/init/mapper-merge.js +50 -32
- package/dist/init/mapper-merge.js.map +1 -1
- package/dist/init/mapper-parallel.d.ts +2 -3
- package/dist/init/mapper-parallel.js +9 -38
- package/dist/init/mapper-parallel.js.map +1 -1
- package/dist/init/mapper-prompts.js +1 -1
- package/dist/init/mapper-prompts.js.map +1 -1
- package/dist/init/mapper.d.ts +6 -127
- package/dist/init/mapper.js +30 -7
- package/dist/init/mapper.js.map +1 -1
- package/dist/init/module-slicer.d.ts +1 -1
- package/dist/init/module-slicer.js +1 -1
- package/dist/init/multi-dev/install.d.ts +5 -11
- package/dist/init/multi-dev/install.js +4 -6
- package/dist/init/multi-dev/install.js.map +1 -1
- package/dist/init/overlay.d.ts +2 -2
- package/dist/init/overlay.js +1 -1
- package/dist/init/overlay.js.map +1 -1
- package/dist/init/phases/10-strip.js +1 -2
- package/dist/init/phases/10-strip.js.map +1 -1
- package/dist/init/phases/12-multidev.d.ts +1 -6
- package/dist/init/phases/12-multidev.js +1 -6
- package/dist/init/phases/12-multidev.js.map +1 -1
- package/dist/init/phases/3b-seed.d.ts +1 -10
- package/dist/init/phases/3b-seed.js +1 -10
- package/dist/init/phases/3b-seed.js.map +1 -1
- package/dist/init/phases/4-pilot.js +53 -15
- package/dist/init/phases/4-pilot.js.map +1 -1
- package/dist/init/phases/5-brand.js +10 -10
- package/dist/init/phases/5-brand.js.map +1 -1
- package/dist/init/prompts.d.ts +6 -8
- package/dist/init/prompts.js +3 -6
- package/dist/init/prompts.js.map +1 -1
- package/dist/init/rules-merge/ingest.js +1 -1
- package/dist/init/source-comments/classify.d.ts +1 -41
- package/dist/init/source-comments/classify.js +68 -37
- package/dist/init/source-comments/classify.js.map +1 -1
- package/dist/init/source-comments/index.d.ts +2 -2
- package/dist/init/source-comments/index.js +2 -2
- package/dist/init/source-comments/index.js.map +1 -1
- package/dist/init/source-comments/ingest.d.ts +38 -2
- package/dist/init/source-comments/ingest.js +237 -4
- package/dist/init/source-comments/ingest.js.map +1 -1
- package/dist/init/source-comments/strip-replace.d.ts +10 -19
- package/dist/init/source-comments/strip-replace.js +26 -2
- package/dist/init/source-comments/strip-replace.js.map +1 -1
- package/dist/init/source-comments/walker.d.ts +9 -2
- package/dist/init/source-comments/walker.js +38 -19
- package/dist/init/source-comments/walker.js.map +1 -1
- package/dist/init/submodules.d.ts +3 -2
- package/dist/init/types.d.ts +3 -5
- package/dist/init/types.js +3 -5
- package/dist/init/types.js.map +1 -1
- package/dist/init/visual.d.ts +4 -9
- package/dist/init/visual.js +1 -16
- package/dist/init/visual.js.map +1 -1
- package/dist/logger.d.ts +0 -1
- package/dist/logger.js +0 -1
- package/dist/logger.js.map +1 -1
- package/dist/mcp/context.d.ts +2 -3
- package/dist/mcp/context.js.map +1 -1
- package/dist/mcp/errors.d.ts +1 -1
- package/dist/mcp/errors.js.map +1 -1
- package/dist/mcp/history/prompt.d.ts +2 -1
- package/dist/mcp/history/walker.js +1 -1
- package/dist/mcp/history/walker.js.map +1 -1
- package/dist/mcp/path-allowlist.d.ts +0 -6
- package/dist/mcp/path-allowlist.js +0 -10
- package/dist/mcp/path-allowlist.js.map +1 -1
- package/dist/mcp/schemas.d.ts +15 -72
- package/dist/mcp/schemas.js +21 -70
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/serve.d.ts +1 -1
- package/dist/mcp/serve.js +2 -5
- package/dist/mcp/serve.js.map +1 -1
- package/dist/mcp/server.js +10 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/telemetry.d.ts +8 -1
- package/dist/mcp/telemetry.js +16 -0
- package/dist/mcp/telemetry.js.map +1 -1
- package/dist/mcp/tools/decision-get.js +37 -29
- package/dist/mcp/tools/decision-get.js.map +1 -1
- package/dist/mcp/tools/decisions-in-scope.js +22 -3
- package/dist/mcp/tools/decisions-in-scope.js.map +1 -1
- package/dist/mcp/tools/index.js +2 -2
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/invariant-get.js +1 -1
- package/dist/mcp/tools/invariant-get.js.map +1 -1
- package/dist/mcp/tools/invariants-in-scope.js +26 -7
- package/dist/mcp/tools/invariants-in-scope.js.map +1 -1
- package/dist/mcp/tools/query-history.js +3 -3
- package/dist/mcp/tools/query-history.js.map +1 -1
- package/dist/mcp/tools/resolve-attention.d.ts +3 -3
- package/dist/mcp/tools/resolve-attention.js +40 -28
- package/dist/mcp/tools/resolve-attention.js.map +1 -1
- package/dist/mcp/tools/search.js +3 -4
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/tools/task-create.d.ts +15 -0
- package/dist/mcp/tools/task-create.js +96 -0
- package/dist/mcp/tools/task-create.js.map +1 -0
- package/dist/mcp/tools/timeline.js +3 -7
- package/dist/mcp/tools/timeline.js.map +1 -1
- package/dist/profiles/types.d.ts +1 -1
- package/dist/profiles/types.js +1 -1
- package/dist/session/id.d.ts +1 -3
- package/dist/session/id.js +1 -1
- package/dist/session/id.js.map +1 -1
- package/dist/session-start/build.d.ts +3 -11
- package/dist/session-start/build.js +55 -34
- package/dist/session-start/build.js.map +1 -1
- package/dist/session-start/index.d.ts +2 -2
- package/dist/session-start/index.js +2 -2
- package/dist/session-start/index.js.map +1 -1
- package/dist/session-start/templates.d.ts +20 -4
- package/dist/session-start/templates.js +45 -35
- package/dist/session-start/templates.js.map +1 -1
- package/dist/status-line/format.d.ts +19 -11
- package/dist/status-line/format.js +44 -36
- package/dist/status-line/format.js.map +1 -1
- package/dist/status-line/index.d.ts +3 -1
- package/dist/status-line/index.js +1 -1
- package/dist/status-line/index.js.map +1 -1
- package/dist/status-line/reader.d.ts +9 -6
- package/dist/status-line/reader.js +50 -15
- package/dist/status-line/reader.js.map +1 -1
- package/dist/status-line/writer.d.ts +5 -0
- package/dist/status-line/writer.js +9 -0
- package/dist/status-line/writer.js.map +1 -1
- package/dist/trace/index.d.ts +44 -0
- package/dist/trace/index.js +51 -0
- package/dist/trace/index.js.map +1 -0
- package/package.json +2 -3
- package/templates/.archive/README.md +3 -3
- package/templates/.cairn/config/sensors.yaml +16 -19
- package/templates/.cairn/config/stub-patterns.yaml +4 -4
- package/templates/.cairn/config/trust-policy.yaml +3 -35
- package/templates/.cairn/config/workflow.md +13 -194
- package/templates/.cairn/git-hooks/commit-msg +1 -1
- package/templates/.cairn/ground/canonical-map/topics.yaml +3 -26
- package/templates/.cairn/ground/capabilities/snippets.yaml +0 -1
- package/templates/.cairn/ground/manifest.yaml +5 -8
- package/templates/.cairn/ground/product/personas.yaml +0 -1
- package/dist/context/checkpoint.d.ts +0 -11
- package/dist/context/checkpoint.js +0 -30
- package/dist/context/checkpoint.js.map +0 -1
- package/dist/decision-capture/capture.d.ts +0 -57
- package/dist/decision-capture/capture.js +0 -186
- package/dist/decision-capture/capture.js.map +0 -1
- package/dist/decision-capture/extractor.d.ts +0 -20
- package/dist/decision-capture/extractor.js +0 -103
- package/dist/decision-capture/extractor.js.map +0 -1
- package/dist/decision-capture/prompt.d.ts +0 -15
- package/dist/decision-capture/prompt.js +0 -68
- package/dist/decision-capture/prompt.js.map +0 -1
- package/dist/decision-capture/refinement-prompt.d.ts +0 -25
- package/dist/decision-capture/refinement-prompt.js +0 -146
- package/dist/decision-capture/refinement-prompt.js.map +0 -1
- package/dist/decision-capture/refinement-schema.d.ts +0 -52
- package/dist/decision-capture/refinement-schema.js +0 -61
- package/dist/decision-capture/refinement-schema.js.map +0 -1
- package/dist/decision-capture/refinement.d.ts +0 -60
- package/dist/decision-capture/refinement.js +0 -439
- package/dist/decision-capture/refinement.js.map +0 -1
- package/dist/decision-capture/schema.d.ts +0 -70
- package/dist/decision-capture/schema.js +0 -71
- package/dist/decision-capture/schema.js.map +0 -1
- package/dist/decision-capture/types.d.ts +0 -201
- package/dist/decision-capture/types.js +0 -20
- package/dist/decision-capture/types.js.map +0 -1
- package/dist/decision-capture/writer.d.ts +0 -90
- package/dist/decision-capture/writer.js +0 -267
- package/dist/decision-capture/writer.js.map +0 -1
- package/dist/frontend-types.d.ts +0 -243
- package/dist/frontend-types.js +0 -15
- package/dist/frontend-types.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -14
- package/dist/hooks/index.js +0 -14
- package/dist/hooks/index.js.map +0 -1
- package/dist/inbox.d.ts +0 -17
- package/dist/inbox.js +0 -30
- package/dist/inbox.js.map +0 -1
- package/dist/mcp/tools/append-run-note.d.ts +0 -18
- package/dist/mcp/tools/append-run-note.js +0 -54
- package/dist/mcp/tools/append-run-note.js.map +0 -1
- package/dist/mcp/tools/append.d.ts +0 -8
- package/dist/mcp/tools/append.js +0 -37
- package/dist/mcp/tools/append.js.map +0 -1
- package/dist/mcp/tools/ask-operator.d.ts +0 -34
- package/dist/mcp/tools/ask-operator.js +0 -97
- package/dist/mcp/tools/ask-operator.js.map +0 -1
- package/dist/mcp/tools/drop-task.d.ts +0 -12
- package/dist/mcp/tools/drop-task.js +0 -68
- package/dist/mcp/tools/drop-task.js.map +0 -1
- package/dist/mcp/tools/record-run-event.d.ts +0 -10
- package/dist/mcp/tools/record-run-event.js +0 -32
- package/dist/mcp/tools/record-run-event.js.map +0 -1
- package/dist/prompt.d.ts +0 -19
- package/dist/prompt.js +0 -50
- package/dist/prompt.js.map +0 -1
- package/dist/tier0/classify.d.ts +0 -10
- package/dist/tier0/classify.js +0 -110
- package/dist/tier0/classify.js.map +0 -1
- package/dist/tier0/index.d.ts +0 -2
- package/dist/tier0/index.js +0 -2
- package/dist/tier0/index.js.map +0 -1
- package/dist/tier0/types.d.ts +0 -24
- package/dist/tier0/types.js +0 -9
- package/dist/tier0/types.js.map +0 -1
- package/dist/tightener/index.d.ts +0 -4
- package/dist/tightener/index.js +0 -4
- package/dist/tightener/index.js.map +0 -1
- package/dist/tightener/prompt.d.ts +0 -3
- package/dist/tightener/prompt.js +0 -67
- package/dist/tightener/prompt.js.map +0 -1
- package/dist/tightener/schema.d.ts +0 -68
- package/dist/tightener/schema.js +0 -44
- package/dist/tightener/schema.js.map +0 -1
- package/dist/tightener/tighten.d.ts +0 -2
- package/dist/tightener/tighten.js +0 -66
- package/dist/tightener/tighten.js.map +0 -1
- package/dist/tightener/types.d.ts +0 -74
- package/dist/tightener/types.js +0 -6
- package/dist/tightener/types.js.map +0 -1
- package/templates/.claude/settings.json +0 -57
- package/templates/.mcp.json +0 -8
|
@@ -7,21 +7,25 @@
|
|
|
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, mkdirSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
|
|
11
11
|
import { homedir } from "node:os";
|
|
12
12
|
import { join } from "node:path";
|
|
13
|
+
import { readActiveTaskSummary } from "../../context/index.js";
|
|
13
14
|
import { gcStaleEvents } from "../../events/index.js";
|
|
14
|
-
import {
|
|
15
|
+
import { writeDecisionsLedger, writeInvariantsLedger } from "../../ground/ledgers.js";
|
|
16
|
+
import { rescanScopeIndex } from "../../ground/scope-index.js";
|
|
17
|
+
import { scanBypassedCommits } from "../bypass-detection.js";
|
|
18
|
+
import { inspectJoinState, runJoin } from "../../join/index.js";
|
|
15
19
|
import { resolveRepoRoot } from "../../session-start/index.js";
|
|
16
20
|
import { buildSessionStartContext } from "../../session-start/index.js";
|
|
17
21
|
import { ensureSessionDir, gcStaleSessions, resolveSessionId, seedEventsMarker, } from "../../session/index.js";
|
|
18
22
|
import { defaultStatusJson, writeStatusJson } from "../../status-line/index.js";
|
|
19
23
|
import { emitShapeB, parseHookPayload, readHookStdin, recordHookTelemetry, } from "./payload.js";
|
|
20
24
|
/**
|
|
21
|
-
* Maintain the shim file the cairn-statusline-setup
|
|
22
|
-
* a single line containing the absolute path to the active
|
|
23
|
-
* `dist/cli.mjs`. The user's `~/.claude/settings.json`
|
|
24
|
-
* command reads this path so plugin upgrades (which change
|
|
25
|
+
* Maintain the shim file the `/cairn-statusline-setup` command relies
|
|
26
|
+
* on — a single line containing the absolute path to the active
|
|
27
|
+
* bundle's `dist/cli.mjs`. The user's `~/.claude/settings.json`
|
|
28
|
+
* statusLine command reads this path so plugin upgrades (which change
|
|
25
29
|
* CLAUDE_PLUGIN_ROOT's version segment) don't break the badge.
|
|
26
30
|
*
|
|
27
31
|
* No-op when the hook isn't running under the Claude Code plugin
|
|
@@ -116,6 +120,36 @@ export async function runSessionStartHook() {
|
|
|
116
120
|
catch (err) {
|
|
117
121
|
sessionWarnings.push(`events_gc_failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
118
122
|
}
|
|
123
|
+
// Deterministic scope-index sync — walk source files, regex for §INV/§DEC
|
|
124
|
+
// tokens, fold into scope-index. No LLM. Cheap (~100ms on 50k files via
|
|
125
|
+
// git ls-files). Keeps the in-scope tools accurate when an agent has
|
|
126
|
+
// moved cite tokens between files since the last init / rebuild.
|
|
127
|
+
try {
|
|
128
|
+
const rescan = rescanScopeIndex(repoRoot);
|
|
129
|
+
if (rescan.dirty) {
|
|
130
|
+
sessionWarnings.push(`scope_rescan_dirty:added=${rescan.entriesAdded},updated=${rescan.entriesUpdated}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
sessionWarnings.push(`scope_rescan_failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
135
|
+
}
|
|
136
|
+
// Defensive ledger rebuilds — operator may edit a DEC or INV .md file
|
|
137
|
+
// out-of-band (text editor, git checkout of a different branch). The
|
|
138
|
+
// ledger.yaml indices won't reflect that until the next accept/reject
|
|
139
|
+
// landed via the MCP write path. Rebuild from on-disk frontmatter so
|
|
140
|
+
// the in-scope tools never see a stale ledger. Pure JS, milliseconds.
|
|
141
|
+
try {
|
|
142
|
+
writeDecisionsLedger({ repoRoot });
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
sessionWarnings.push(`decisions_ledger_rebuild_failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
writeInvariantsLedger({ repoRoot });
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
sessionWarnings.push(`invariants_ledger_rebuild_failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
152
|
+
}
|
|
119
153
|
const isResume = source === "resume";
|
|
120
154
|
const buildArgs = { repoRoot };
|
|
121
155
|
if (isResume)
|
|
@@ -127,12 +161,24 @@ export async function runSessionStartHook() {
|
|
|
127
161
|
}
|
|
128
162
|
const result = await buildSessionStartContext(buildArgs);
|
|
129
163
|
try {
|
|
164
|
+
const active = readActiveTaskSummary(repoRoot);
|
|
165
|
+
let bypassCount = 0;
|
|
166
|
+
try {
|
|
167
|
+
bypassCount = scanBypassedCommits(repoRoot).bypassed.length;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
bypassCount = 0;
|
|
171
|
+
}
|
|
130
172
|
writeStatusJson(repoRoot, sessionId, {
|
|
131
173
|
decisions_in_scope: result.counts.decisions,
|
|
132
174
|
invariants_in_scope: result.counts.invariants,
|
|
133
175
|
attention_count: result.counts.pendingDrafts +
|
|
134
176
|
result.counts.baselineFindings +
|
|
135
177
|
result.counts.driftFindings,
|
|
178
|
+
task_state: active?.taskState ?? "idle",
|
|
179
|
+
task_id: active?.taskId ?? null,
|
|
180
|
+
task_module: active?.taskModule ?? null,
|
|
181
|
+
bypass_count: bypassCount,
|
|
136
182
|
updated_at: new Date().toISOString(),
|
|
137
183
|
});
|
|
138
184
|
}
|
|
@@ -161,24 +207,29 @@ export async function runSessionStartHook() {
|
|
|
161
207
|
...result.warnings,
|
|
162
208
|
...sessionWarnings,
|
|
163
209
|
...shimWarnings,
|
|
164
|
-
...(bootstrapBanner !== null ? ["
|
|
210
|
+
...(bootstrapBanner !== null ? ["bootstrap_failed"] : []),
|
|
165
211
|
],
|
|
166
212
|
extra: {
|
|
167
213
|
sections_rendered: result.sectionsRendered,
|
|
168
214
|
sections_dropped: result.sectionsDropped,
|
|
169
215
|
total_chars: additionalContext.length,
|
|
216
|
+
additional_context: additionalContext,
|
|
217
|
+
...(bootstrapBanner !== null ? { bootstrap_banner: bootstrapBanner } : {}),
|
|
170
218
|
},
|
|
171
219
|
});
|
|
172
220
|
}
|
|
173
221
|
/**
|
|
174
222
|
* Per PLUGIN_ARCHITECTURE §17 Layer 4: when a clone is cairn-adopted
|
|
175
223
|
* (`.cairn/config.yaml` present + `.git/` present) but `core.hooksPath`
|
|
176
|
-
* is unset,
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
224
|
+
* is unset, run `cairn join` synchronously to wire the per-clone hooks.
|
|
225
|
+
* Bootstrap is idempotent, local-clone-only state (git config + chmod +
|
|
226
|
+
* gitignored sentinel files) — plugin install is implicit consent for
|
|
227
|
+
* local config wiring, no operator prompt needed.
|
|
228
|
+
*
|
|
229
|
+
* Returns null on success (no banner needed) or when not in
|
|
230
|
+
* bootstrap-required state. Returns a failure banner only when
|
|
231
|
+
* `runJoin` errored — operator needs to know the write surface stayed
|
|
232
|
+
* disabled.
|
|
182
233
|
*/
|
|
183
234
|
function renderBootstrapBanner(repoRoot) {
|
|
184
235
|
if (!existsSync(join(repoRoot, ".git")))
|
|
@@ -188,76 +239,171 @@ function renderBootstrapBanner(repoRoot) {
|
|
|
188
239
|
const state = inspectJoinState({ repoRoot });
|
|
189
240
|
if (state.hooksPathSet)
|
|
190
241
|
return null;
|
|
242
|
+
// Auto-run join. Idempotent — no harm if a parallel session beat us.
|
|
243
|
+
const result = runJoin({ repoRoot });
|
|
244
|
+
if (result.bootstrapped)
|
|
245
|
+
return null;
|
|
246
|
+
// Surface failure inline so operator knows the write surface is still
|
|
247
|
+
// refused. Include each errored step's detail for diagnosis.
|
|
191
248
|
const lines = [];
|
|
192
|
-
lines.push("## Cairn — bootstrap
|
|
249
|
+
lines.push("## Cairn — bootstrap failed");
|
|
193
250
|
lines.push("");
|
|
194
|
-
lines.push("This
|
|
195
|
-
"
|
|
196
|
-
"
|
|
251
|
+
lines.push("This clone is cairn-adopted but `cairn join` did not finish. " +
|
|
252
|
+
"MCP write tools refuse and local commits skip attestation until " +
|
|
253
|
+
"this resolves.");
|
|
197
254
|
lines.push("");
|
|
198
|
-
|
|
255
|
+
for (const step of result.steps) {
|
|
256
|
+
if (step.status === "error") {
|
|
257
|
+
lines.push(`- **${step.step}** — ${step.detail}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
199
260
|
lines.push("");
|
|
200
|
-
lines.push("
|
|
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.");
|
|
261
|
+
lines.push("Re-run manually: `node \"${CLAUDE_PLUGIN_ROOT}/dist/cli.mjs\" join`");
|
|
204
262
|
return lines.join("\n");
|
|
205
263
|
}
|
|
206
264
|
/**
|
|
207
265
|
* Per PLUGIN_ARCHITECTURE §6: when the operator opens Claude Code in a
|
|
208
|
-
*
|
|
209
|
-
* adoption inline. SessionStart has no DOM to draw on — it
|
|
210
|
-
* instruction here as additionalContext so Claude reads it
|
|
211
|
-
* user message and surfaces the inline A/B/C prompt.
|
|
266
|
+
* project root with no `.cairn/` directory, the plugin proactively
|
|
267
|
+
* offers adoption inline. SessionStart has no DOM to draw on — it
|
|
268
|
+
* injects the instruction here as additionalContext so Claude reads it
|
|
269
|
+
* on the first user message and surfaces the inline A/B/C prompt.
|
|
212
270
|
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
271
|
+
* Project-shape detection: cwd is a project if it has `.git/` OR any
|
|
272
|
+
* common build manifest. The `cairn-adopt` skill's preflight handles
|
|
273
|
+
* the no-git case (offers `git init`), so we don't need to gate on
|
|
274
|
+
* `.git/` here. Returns null when cwd looks like a non-project dir
|
|
275
|
+
* (e.g. `~/`, `/tmp/`) — silent in that case.
|
|
276
|
+
*/
|
|
277
|
+
const PROJECT_MARKERS = [
|
|
278
|
+
".git",
|
|
279
|
+
"package.json",
|
|
280
|
+
"pyproject.toml",
|
|
281
|
+
"Cargo.toml",
|
|
282
|
+
"go.mod",
|
|
283
|
+
"Gemfile",
|
|
284
|
+
"build.gradle",
|
|
285
|
+
"build.gradle.kts",
|
|
286
|
+
"pom.xml",
|
|
287
|
+
"composer.json",
|
|
288
|
+
"Package.swift",
|
|
289
|
+
"deno.json",
|
|
290
|
+
"bun.lockb",
|
|
291
|
+
];
|
|
292
|
+
function looksLikeProjectRoot(cwd) {
|
|
293
|
+
for (const marker of PROJECT_MARKERS) {
|
|
294
|
+
if (existsSync(join(cwd, marker)))
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Find direct child directories that look like project roots. When the
|
|
301
|
+
* operator opens Claude Code in a parent dir (e.g. `~/Clients/Foo/`)
|
|
302
|
+
* that contains one or more adoptable projects in immediate subdirs,
|
|
303
|
+
* we surface them so the operator can `cd` in. Caps at 8 children to
|
|
304
|
+
* avoid spamming when launched in `~/` or similar.
|
|
215
305
|
*/
|
|
306
|
+
function findAdoptableChildren(cwd, max = 8) {
|
|
307
|
+
let entries;
|
|
308
|
+
try {
|
|
309
|
+
entries = readdirSync(cwd, { withFileTypes: true });
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
return [];
|
|
313
|
+
}
|
|
314
|
+
const out = [];
|
|
315
|
+
for (const entry of entries) {
|
|
316
|
+
if (!entry.isDirectory())
|
|
317
|
+
continue;
|
|
318
|
+
if (entry.name.startsWith("."))
|
|
319
|
+
continue;
|
|
320
|
+
const childPath = join(cwd, String(entry.name));
|
|
321
|
+
if (!looksLikeProjectRoot(childPath))
|
|
322
|
+
continue;
|
|
323
|
+
if (existsSync(join(childPath, ".cairn")))
|
|
324
|
+
continue; // already adopted
|
|
325
|
+
if (existsSync(join(childPath, ".cairn-skip")))
|
|
326
|
+
continue;
|
|
327
|
+
out.push(String(entry.name));
|
|
328
|
+
if (out.length >= max)
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
return out;
|
|
332
|
+
}
|
|
216
333
|
function renderAdoptionBanner(cwd) {
|
|
217
|
-
if (!existsSync(join(cwd, ".git")))
|
|
218
|
-
return null;
|
|
219
|
-
// Operator opted-out previously — never re-prompt.
|
|
220
334
|
if (existsSync(join(cwd, ".cairn-skip")))
|
|
221
335
|
return null;
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
336
|
+
const cwdIsProject = looksLikeProjectRoot(cwd);
|
|
337
|
+
if (cwdIsProject) {
|
|
338
|
+
// Walk upward briefly to make sure no parent has .cairn/ either —
|
|
339
|
+
// monorepo subdirectories should not re-prompt for adoption.
|
|
340
|
+
let dir = cwd;
|
|
341
|
+
for (let i = 0; i < 40; i++) {
|
|
342
|
+
if (existsSync(join(dir, ".cairn")))
|
|
343
|
+
return null;
|
|
344
|
+
if (existsSync(join(dir, ".cairn-skip")))
|
|
345
|
+
return null;
|
|
346
|
+
const parent = join(dir, "..");
|
|
347
|
+
if (parent === dir)
|
|
348
|
+
break;
|
|
349
|
+
dir = parent;
|
|
350
|
+
if (!looksLikeProjectRoot(dir))
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
const lines = [];
|
|
354
|
+
lines.push("## Cairn — adoption available");
|
|
355
|
+
lines.push("");
|
|
356
|
+
lines.push("This project has no `.cairn/` directory. Cairn is installed and " +
|
|
357
|
+
"can adopt it: a one-time visual pass that ingests existing " +
|
|
358
|
+
"decisions, source-comment essays, and `CLAUDE.md` / `AGENTS.md` " +
|
|
359
|
+
"rules into queryable ground state.");
|
|
360
|
+
lines.push("");
|
|
361
|
+
lines.push("Invoke the `cairn-adopt` skill on the operator's first message — " +
|
|
362
|
+
"even a casual greeting like \"hi\". The skill renders the " +
|
|
363
|
+
"yes / not now / never prompt through `AskUserQuestion`; do not " +
|
|
364
|
+
"duplicate the prompt as inline markdown.");
|
|
365
|
+
lines.push("");
|
|
366
|
+
lines.push("On `never for this project`, the skill writes a one-line " +
|
|
367
|
+
"`.cairn-skip` file at the repo root so future sessions don't " +
|
|
368
|
+
"re-prompt.");
|
|
369
|
+
lines.push("");
|
|
370
|
+
lines.push("If the operator asks what cairn does, summarize: persistent " +
|
|
371
|
+
"ground state for AI agents — decisions, invariants, canonical " +
|
|
372
|
+
"map, sensors. Stops re-debating settled choices across sessions.");
|
|
373
|
+
return lines.join("\n");
|
|
236
374
|
}
|
|
375
|
+
// cwd isn't itself a project — scan one level down for adoptable
|
|
376
|
+
// children (e.g. operator opened Claude Code in
|
|
377
|
+
// `~/Clients/Foo/Deliverables/Website/` containing `abholidaylighting/`).
|
|
378
|
+
const children = findAdoptableChildren(cwd);
|
|
379
|
+
if (children.length === 0)
|
|
380
|
+
return null;
|
|
237
381
|
const lines = [];
|
|
238
|
-
lines.push("## Cairn —
|
|
239
|
-
lines.push("");
|
|
240
|
-
lines.push("This project is a git repo with no `.cairn/` directory. Cairn " +
|
|
241
|
-
"is installed and can adopt it: a one-time visual pass that " +
|
|
242
|
-
"ingests existing decisions, source-comment essays, and " +
|
|
243
|
-
"`CLAUDE.md` / `AGENTS.md` rules into queryable ground state.");
|
|
382
|
+
lines.push("## Cairn — adoptable project in subdir");
|
|
244
383
|
lines.push("");
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
384
|
+
if (children.length === 1) {
|
|
385
|
+
lines.push(`The current dir isn't a project root, but \`${children[0]}/\` is — ` +
|
|
386
|
+
"and it has no `.cairn/`. Cairn can adopt it once the operator `cd`s in.");
|
|
387
|
+
lines.push("");
|
|
388
|
+
lines.push("Suggested first reply (edit if the operator prefers a different surface):");
|
|
389
|
+
lines.push("");
|
|
390
|
+
lines.push(`> Cairn can adopt \`${children[0]}/\`. \`cd\` in and reopen Claude Code, ` +
|
|
391
|
+
"or stay here for read-only access.");
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
lines.push(`The current dir isn't a project root, but ${children.length} ` +
|
|
395
|
+
"immediate subdirs look adoptable:");
|
|
396
|
+
lines.push("");
|
|
397
|
+
for (const c of children) {
|
|
398
|
+
lines.push(`- \`${c}/\``);
|
|
399
|
+
}
|
|
400
|
+
lines.push("");
|
|
401
|
+
lines.push("Suggest the operator `cd` into one of them to adopt.");
|
|
402
|
+
}
|
|
257
403
|
lines.push("");
|
|
258
|
-
lines.push("
|
|
259
|
-
"
|
|
260
|
-
"
|
|
404
|
+
lines.push("Do NOT auto-invoke `cairn-adopt` from this surface — the skill " +
|
|
405
|
+
"operates on `cwd`, not subdirs. Surface the suggestion in chat " +
|
|
406
|
+
"and let the operator change directory.");
|
|
261
407
|
return lines.join("\n");
|
|
262
408
|
}
|
|
263
409
|
//# sourceMappingURL=session-start.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runners/session-start.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runners/session-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `Stop` hook runner — fires when the assistant turn ends.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* •
|
|
6
|
-
*
|
|
7
|
-
* •
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* reviewer subagent on the next assistant turn.
|
|
11
|
-
* • Patch the per-session status.json `updated_at` (heartbeat).
|
|
4
|
+
* Per PLUGIN_ARCHITECTURE §10:
|
|
5
|
+
* • Drains `.cairn/events/` since the per-session marker.
|
|
6
|
+
* • Scans `.cairn/tasks/active/<id>/` for tasks missing attestation.yaml.
|
|
7
|
+
* • Compares HEAD's last 5 commits against `.cairn/.attested-commits`;
|
|
8
|
+
* surfaces bypass hint for `--no-verify` commits.
|
|
9
|
+
* • Patches per-session status.json `updated_at` (heartbeat).
|
|
12
10
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* surface backfill prompt for `--no-verify` bypasses.
|
|
11
|
+
* When context to surface: emits `{ decision: "block", reason: "..." }` so
|
|
12
|
+
* Claude reads the hint and invokes cairn-attention on the next turn.
|
|
13
|
+
* When nothing: emits `{ continue: true }` and Claude stops normally.
|
|
17
14
|
*/
|
|
18
15
|
export declare function runStopHook(): Promise<void>;
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `Stop` hook runner — fires when the assistant turn ends.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* •
|
|
6
|
-
*
|
|
7
|
-
* •
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* reviewer subagent on the next assistant turn.
|
|
11
|
-
* • Patch the per-session status.json `updated_at` (heartbeat).
|
|
4
|
+
* Per PLUGIN_ARCHITECTURE §10:
|
|
5
|
+
* • Drains `.cairn/events/` since the per-session marker.
|
|
6
|
+
* • Scans `.cairn/tasks/active/<id>/` for tasks missing attestation.yaml.
|
|
7
|
+
* • Compares HEAD's last 5 commits against `.cairn/.attested-commits`;
|
|
8
|
+
* surfaces bypass hint for `--no-verify` commits.
|
|
9
|
+
* • Patches per-session status.json `updated_at` (heartbeat).
|
|
12
10
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* surface backfill prompt for `--no-verify` bypasses.
|
|
11
|
+
* When context to surface: emits `{ decision: "block", reason: "..." }` so
|
|
12
|
+
* Claude reads the hint and invokes cairn-attention on the next turn.
|
|
13
|
+
* When nothing: emits `{ continue: true }` and Claude stops normally.
|
|
17
14
|
*/
|
|
18
|
-
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
15
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
19
16
|
import { join } from "node:path";
|
|
17
|
+
import { readActiveTaskSummary } from "../../context/index.js";
|
|
20
18
|
import { eventsSince, } from "../../events/index.js";
|
|
21
19
|
import { renderBypassHint, scanBypassedCommits, } from "../bypass-detection.js";
|
|
22
20
|
import { isDeferActive, readDeferState } from "../defer.js";
|
|
@@ -29,17 +27,16 @@ function isInitInProgress(repoRoot) {
|
|
|
29
27
|
return existsSync(join(repoRoot, ".cairn", "init-state.json"));
|
|
30
28
|
}
|
|
31
29
|
/**
|
|
32
|
-
* Cap the
|
|
33
|
-
* reviewer hint and the bypass hint can fire on the same Stop
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* facts but small enough that overflow is structurally impossible.
|
|
30
|
+
* Cap the reason text that flows back to Claude Code via decision:block.
|
|
31
|
+
* Both the reviewer hint and the bypass hint can fire on the same Stop
|
|
32
|
+
* tick; 4 KB is generous for two A/B/C strips but small enough that
|
|
33
|
+
* overflow is structurally impossible.
|
|
37
34
|
*/
|
|
38
|
-
const
|
|
39
|
-
function
|
|
40
|
-
if (body.length <=
|
|
35
|
+
const MAX_REASON_CHARS = 4_000;
|
|
36
|
+
function clampReason(body) {
|
|
37
|
+
if (body.length <= MAX_REASON_CHARS)
|
|
41
38
|
return body;
|
|
42
|
-
const head = body.slice(0,
|
|
39
|
+
const head = body.slice(0, MAX_REASON_CHARS - 80);
|
|
43
40
|
return `${head}\n\n…(truncated; resolve via cairn-attention)`;
|
|
44
41
|
}
|
|
45
42
|
export async function runStopHook() {
|
|
@@ -53,7 +50,7 @@ export async function runStopHook() {
|
|
|
53
50
|
let drained = [];
|
|
54
51
|
let pendingReviews = [];
|
|
55
52
|
let bypassed = [];
|
|
56
|
-
let
|
|
53
|
+
let reason = "";
|
|
57
54
|
if (repoRoot !== null && sessionId !== null && sessionId.length > 0) {
|
|
58
55
|
try {
|
|
59
56
|
const marker = readEventsMarker(repoRoot, sessionId);
|
|
@@ -93,7 +90,7 @@ export async function runStopHook() {
|
|
|
93
90
|
warnings.push(`review_suppressed_until:${reviewDefer.deferred_at}`);
|
|
94
91
|
}
|
|
95
92
|
else {
|
|
96
|
-
|
|
93
|
+
reason = renderReviewerHint(pendingReviews);
|
|
97
94
|
}
|
|
98
95
|
}
|
|
99
96
|
}
|
|
@@ -115,10 +112,7 @@ export async function runStopHook() {
|
|
|
115
112
|
}
|
|
116
113
|
else {
|
|
117
114
|
const hint = renderBypassHint(bypassed);
|
|
118
|
-
|
|
119
|
-
additionalContext.length > 0
|
|
120
|
-
? `${additionalContext}\n\n${hint}`
|
|
121
|
-
: hint;
|
|
115
|
+
reason = reason.length > 0 ? `${reason}\n\n${hint}` : hint;
|
|
122
116
|
}
|
|
123
117
|
}
|
|
124
118
|
}
|
|
@@ -127,20 +121,27 @@ export async function runStopHook() {
|
|
|
127
121
|
}
|
|
128
122
|
}
|
|
129
123
|
try {
|
|
124
|
+
const active = readActiveTaskSummary(repoRoot);
|
|
130
125
|
writeStatusJson(repoRoot, sessionId, {
|
|
131
126
|
updated_at: new Date().toISOString(),
|
|
127
|
+
task_state: active?.taskState ?? "idle",
|
|
128
|
+
task_id: active?.taskId ?? null,
|
|
129
|
+
task_module: active?.taskModule ?? null,
|
|
130
|
+
bypass_count: bypassed.length,
|
|
132
131
|
});
|
|
133
132
|
}
|
|
134
133
|
catch (err) {
|
|
135
134
|
warnings.push(`status_heartbeat_failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
136
135
|
}
|
|
137
136
|
}
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
137
|
+
// Stop hook uses decision:block+reason to inject context into Claude
|
|
138
|
+
// (Stop does not support hookSpecificOutput.additionalContext — that
|
|
139
|
+
// field is silently ignored by Claude Code for Stop events). When
|
|
140
|
+
// reason is non-empty, blocking keeps the session alive so Claude
|
|
141
|
+
// reads the reason and acts on it (e.g. invokes cairn-attention).
|
|
142
|
+
const out = reason.length > 0
|
|
143
|
+
? { decision: "block", reason: clampReason(reason) }
|
|
144
|
+
: { continue: true };
|
|
144
145
|
emitShapeB(out);
|
|
145
146
|
recordHookTelemetry({
|
|
146
147
|
hook: "stop",
|
|
@@ -153,6 +154,8 @@ export async function runStopHook() {
|
|
|
153
154
|
events_drained: drained.length,
|
|
154
155
|
pending_reviews: pendingReviews.length,
|
|
155
156
|
bypassed_commits: bypassed.length,
|
|
157
|
+
decision: reason.length > 0 ? "block" : "continue",
|
|
158
|
+
...(reason.length > 0 ? { reason } : {}),
|
|
156
159
|
},
|
|
157
160
|
});
|
|
158
161
|
}
|
|
@@ -165,6 +168,30 @@ export async function runStopHook() {
|
|
|
165
168
|
* Older orphans are stale; the operator deals with them via attention
|
|
166
169
|
* rather than spawning reviewers blindly.
|
|
167
170
|
*/
|
|
171
|
+
// Phases a task moves through. The reviewer-attestation prompt only
|
|
172
|
+
// fires for tasks that are explicitly ready for review — a fresh
|
|
173
|
+
// `running` task has work in flight, no reviewer needed yet.
|
|
174
|
+
const REVIEW_READY_PHASES = new Set(["ready_for_review", "awaiting_attestation"]);
|
|
175
|
+
function readTaskPhase(taskDir) {
|
|
176
|
+
const statusPath = join(taskDir, "status.yaml");
|
|
177
|
+
if (!existsSync(statusPath))
|
|
178
|
+
return null;
|
|
179
|
+
let raw;
|
|
180
|
+
try {
|
|
181
|
+
raw = readFileSync(statusPath, "utf8");
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
// Cheap line scan — `phase: <value>` at top-level. Avoid a full
|
|
187
|
+
// YAML parse (this runs on every Stop tick).
|
|
188
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
189
|
+
const m = line.match(/^phase:\s*(\S+)/);
|
|
190
|
+
if (m && m[1] !== undefined)
|
|
191
|
+
return m[1].replace(/['"]/g, "");
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
168
195
|
function scanPendingReviews(repoRoot) {
|
|
169
196
|
const activeDir = join(repoRoot, ".cairn", "tasks", "active");
|
|
170
197
|
if (!existsSync(activeDir))
|
|
@@ -189,6 +216,10 @@ function scanPendingReviews(repoRoot) {
|
|
|
189
216
|
const attestation = join(taskDir, "attestation.yaml");
|
|
190
217
|
if (existsSync(attestation))
|
|
191
218
|
continue;
|
|
219
|
+
// Phase gate — `running` / `tightening` / etc. are not review-ready.
|
|
220
|
+
const phase = readTaskPhase(taskDir);
|
|
221
|
+
if (phase !== null && !REVIEW_READY_PHASES.has(phase))
|
|
222
|
+
continue;
|
|
192
223
|
let mtime = 0;
|
|
193
224
|
try {
|
|
194
225
|
mtime = statSync(tightenedSpec).mtimeMs;
|
|
@@ -208,13 +239,13 @@ function scanPendingReviews(repoRoot) {
|
|
|
208
239
|
function renderReviewerHint(pending) {
|
|
209
240
|
const lines = [];
|
|
210
241
|
const noun = pending.length === 1 ? "task" : "tasks";
|
|
211
|
-
lines.push(
|
|
242
|
+
lines.push(`## Cairn — ${pending.length} ${noun} awaiting review attestation`);
|
|
212
243
|
lines.push("");
|
|
213
244
|
for (const p of pending) {
|
|
214
245
|
lines.push(`- \`${p.task_id}\``);
|
|
215
246
|
}
|
|
216
247
|
lines.push("");
|
|
217
|
-
lines.push("`
|
|
248
|
+
lines.push("Invoke the `cairn-attention` skill on the next turn so the operator can pick run review / skip / defer through `AskUserQuestion`.");
|
|
218
249
|
return lines.join("\n");
|
|
219
250
|
}
|
|
220
251
|
//# sourceMappingURL=stop.js.map
|