@isaacriehm/cairn-core 0.8.0 → 0.9.2
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/attention/bulk-accept.d.ts +0 -2
- package/dist/attention/bulk-accept.js +0 -3
- package/dist/attention/bulk-accept.js.map +1 -1
- package/dist/attention/scoring.d.ts +1 -3
- package/dist/attention/scoring.js +1 -12
- package/dist/attention/scoring.js.map +1 -1
- package/dist/claude/cache.js +1 -0
- package/dist/claude/cache.js.map +1 -1
- package/dist/claude/runner.js +25 -1
- package/dist/claude/runner.js.map +1 -1
- package/dist/claude/types.d.ts +8 -0
- package/dist/hooks/runners/payload.d.ts +10 -0
- package/dist/hooks/runners/payload.js +13 -0
- package/dist/hooks/runners/payload.js.map +1 -1
- package/dist/hooks/runners/session-end.js +2 -4
- package/dist/hooks/runners/session-end.js.map +1 -1
- package/dist/hooks/runners/session-start.js +48 -4
- package/dist/hooks/runners/session-start.js.map +1 -1
- package/dist/init/brand-derive.js +6 -1
- package/dist/init/brand-derive.js.map +1 -1
- package/dist/init/brand-setup.d.ts +12 -1
- package/dist/init/brand-setup.js +36 -1
- package/dist/init/brand-setup.js.map +1 -1
- package/dist/init/curator/corpus.d.ts +92 -0
- package/dist/init/curator/corpus.js +171 -0
- package/dist/init/curator/corpus.js.map +1 -0
- package/dist/init/curator/emit.d.ts +42 -0
- package/dist/init/curator/emit.js +230 -0
- package/dist/init/curator/emit.js.map +1 -0
- package/dist/init/curator/index.d.ts +1 -0
- package/dist/init/curator/index.js +2 -0
- package/dist/init/curator/index.js.map +1 -0
- package/dist/init/curator/regex-prefilter.d.ts +54 -0
- package/dist/init/curator/regex-prefilter.js +185 -0
- package/dist/init/curator/regex-prefilter.js.map +1 -0
- package/dist/init/curator/validate.d.ts +46 -0
- package/dist/init/curator/validate.js +100 -0
- package/dist/init/curator/validate.js.map +1 -0
- package/dist/init/curator/walker.d.ts +36 -0
- package/dist/init/curator/walker.js +380 -0
- package/dist/init/curator/walker.js.map +1 -0
- package/dist/init/eta-calibration.d.ts +39 -0
- package/dist/init/eta-calibration.js +143 -0
- package/dist/init/eta-calibration.js.map +1 -0
- package/dist/init/index.d.ts +3 -2
- package/dist/init/index.js +2 -1
- package/dist/init/index.js.map +1 -1
- package/dist/init/init.js +4 -20
- package/dist/init/init.js.map +1 -1
- package/dist/init/mapper-merge.d.ts +4 -6
- package/dist/init/mapper-merge.js +11 -34
- package/dist/init/mapper-merge.js.map +1 -1
- package/dist/init/mapper-parallel.d.ts +0 -1
- package/dist/init/mapper-parallel.js +7 -6
- package/dist/init/mapper-parallel.js.map +1 -1
- package/dist/init/mapper-prompts.d.ts +1 -4
- package/dist/init/mapper-prompts.js +2 -6
- package/dist/init/mapper-prompts.js.map +1 -1
- package/dist/init/mapper.d.ts +8 -7
- package/dist/init/mapper.js +23 -15
- package/dist/init/mapper.js.map +1 -1
- package/dist/init/overlay.js +0 -1
- package/dist/init/overlay.js.map +1 -1
- package/dist/init/phases/10-rules-merge.d.ts +7 -2
- package/dist/init/phases/10-rules-merge.js +18 -45
- package/dist/init/phases/10-rules-merge.js.map +1 -1
- package/dist/init/phases/13-multidev.d.ts +5 -1
- package/dist/init/phases/13-multidev.js +23 -2
- package/dist/init/phases/13-multidev.js.map +1 -1
- package/dist/init/phases/4-seed.js +1 -2
- package/dist/init/phases/4-seed.js.map +1 -1
- package/dist/init/phases/5-preflight.d.ts +42 -0
- package/dist/init/phases/5-preflight.js +244 -0
- package/dist/init/phases/5-preflight.js.map +1 -0
- package/dist/init/phases/7-topic-index.d.ts +6 -0
- package/dist/init/phases/7-topic-index.js +13 -0
- package/dist/init/phases/7-topic-index.js.map +1 -1
- package/dist/init/phases/8-docs-ingest.d.ts +6 -5
- package/dist/init/phases/8-docs-ingest.js +17 -56
- package/dist/init/phases/8-docs-ingest.js.map +1 -1
- package/dist/init/phases/9a-walker.d.ts +15 -0
- package/dist/init/phases/9a-walker.js +63 -0
- package/dist/init/phases/9a-walker.js.map +1 -0
- package/dist/init/phases/9b-curate.d.ts +19 -0
- package/dist/init/phases/9b-curate.js +79 -0
- package/dist/init/phases/9b-curate.js.map +1 -0
- package/dist/init/phases/9c-emit.d.ts +13 -0
- package/dist/init/phases/9c-emit.js +57 -0
- package/dist/init/phases/9c-emit.js.map +1 -0
- package/dist/init/phases/index.d.ts +6 -5
- package/dist/init/phases/index.js +4 -4
- package/dist/init/phases/index.js.map +1 -1
- package/dist/init/phases/mapper-output-io.d.ts +5 -5
- package/dist/init/phases/mapper-output-io.js +5 -5
- package/dist/init/phases/orchestrator.js +1 -1
- package/dist/init/phases/state-io.js +1 -1
- package/dist/init/phases/types.d.ts +79 -13
- package/dist/init/phases/types.js +4 -2
- package/dist/init/phases/types.js.map +1 -1
- package/dist/init/source-comments/ingest.d.ts +0 -2
- package/dist/init/source-comments/ingest.js.map +1 -1
- package/dist/init/source-comments/walker.js +2 -2
- package/dist/init/topic-index/index.d.ts +8 -0
- package/dist/init/topic-index/index.js +10 -2
- package/dist/init/topic-index/index.js.map +1 -1
- package/dist/init/topic-index/judge.d.ts +15 -0
- package/dist/init/topic-index/judge.js +15 -1
- package/dist/init/topic-index/judge.js.map +1 -1
- package/dist/init/topic-index/resolve.js +41 -14
- package/dist/init/topic-index/resolve.js.map +1 -1
- package/dist/init/walker.d.ts +1 -1
- package/dist/init/walker.js +1 -1
- package/dist/init/workflow-block.d.ts +5 -6
- package/dist/init/workflow-block.js +5 -9
- package/dist/init/workflow-block.js.map +1 -1
- package/dist/mcp/tools/bulk-accept-attention.d.ts +1 -1
- package/dist/mcp/tools/bulk-accept-attention.js +4 -6
- package/dist/mcp/tools/bulk-accept-attention.js.map +1 -1
- package/dist/mcp/tools/init-phases.d.ts +7 -6
- package/dist/mcp/tools/init-phases.js +34 -59
- package/dist/mcp/tools/init-phases.js.map +1 -1
- package/dist/session-start/build.js +47 -5
- package/dist/session-start/build.js.map +1 -1
- package/package.json +2 -2
- package/templates/.cairn/config/trust-policy.yaml +0 -3
- package/templates/.cairn/config/workflow.md +0 -1
- package/templates/.cairn/ground/canonical-map/topics.yaml +0 -12
- package/dist/init/phases/5-pilot.d.ts +0 -10
- package/dist/init/phases/5-pilot.js +0 -108
- package/dist/init/phases/5-pilot.js.map +0 -1
- package/dist/init/phases/9-source-comments.d.ts +0 -6
- package/dist/init/phases/9-source-comments.js +0 -67
- package/dist/init/phases/9-source-comments.js.map +0 -1
- package/dist/init/phases/parallel-8910.d.ts +0 -27
- package/dist/init/phases/parallel-8910.js +0 -197
- package/dist/init/phases/parallel-8910.js.map +0 -1
- package/dist/init/phases/source-comments-output-io.d.ts +0 -89
- package/dist/init/phases/source-comments-output-io.js +0 -81
- package/dist/init/phases/source-comments-output-io.js.map +0 -1
- package/templates/.cairn/ground/capabilities/mcp-tools.yaml +0 -29
- package/templates/.cairn/ground/capabilities/skills.yaml +0 -25
- package/templates/.cairn/ground/capabilities/snippets.yaml +0 -29
|
@@ -31,13 +31,21 @@ import { logger } from "../../logger.js";
|
|
|
31
31
|
import { jaccard, tokenize } from "../../text/jaccard.js";
|
|
32
32
|
const log = logger("init.topic-index.resolve");
|
|
33
33
|
/**
|
|
34
|
-
* Bail the rest of phase 7 after this many consecutive judge
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
34
|
+
* Bail the rest of phase 7 after this many consecutive judge failures of
|
|
35
|
+
* ANY kind. Any sustained failure mode (timeout, overloaded, rate-limited
|
|
36
|
+
* via wording the regex didn't catch, broken pipe, JSON parse glitch on
|
|
37
|
+
* every call) means subsequent calls will almost certainly fail too;
|
|
38
|
+
* continuing would burn `TIMEOUT_MS × pair-count` of wall-time AND mask
|
|
39
|
+
* the true partial-completion as a successful phase output. Quota / auth
|
|
40
|
+
* errors trip the breaker on the first occurrence.
|
|
41
|
+
*
|
|
42
|
+
* Crucially, a breaker trip caused by quota/auth — or by reaching this
|
|
43
|
+
* consecutive-fail threshold — surfaces as a thrown error from
|
|
44
|
+
* `resolveTopics`, not a degraded-but-successful result. Phase 7 wraps
|
|
45
|
+
* that as `status: "error"` so the orchestrator stops instead of
|
|
46
|
+
* advancing on a partial topic index.
|
|
39
47
|
*/
|
|
40
|
-
const
|
|
48
|
+
const CONSECUTIVE_FAIL_BAIL = 5;
|
|
41
49
|
const PRIORITY = {
|
|
42
50
|
doc: 0,
|
|
43
51
|
claudemd: 1,
|
|
@@ -110,8 +118,18 @@ export async function resolveTopics(blocks, opts) {
|
|
|
110
118
|
const concurrency = Math.max(1, opts.judgeConcurrency ?? 5);
|
|
111
119
|
let judgeCalls = 0;
|
|
112
120
|
let unresolvedAmbiguous = 0;
|
|
113
|
-
let
|
|
121
|
+
let consecutiveFails = 0;
|
|
114
122
|
let judgeBroken = false;
|
|
123
|
+
/**
|
|
124
|
+
* First fatal error encountered. Set when:
|
|
125
|
+
* - quota/auth error (immediate trip — no point retrying), OR
|
|
126
|
+
* - the consecutive-fail threshold trips on any error kind.
|
|
127
|
+
* Re-thrown after Promise.all so phase 7 surfaces as an error and
|
|
128
|
+
* the orchestrator does NOT advance on a partial topic index.
|
|
129
|
+
* Non-fatal soft failures (isolated parse glitch, single timeout)
|
|
130
|
+
* still count toward `unresolvedAmbiguous` and let the phase finish.
|
|
131
|
+
*/
|
|
132
|
+
let firstFatalErr = null;
|
|
115
133
|
let nextIdx = 0;
|
|
116
134
|
const sameVerdicts = [];
|
|
117
135
|
const worker = async () => {
|
|
@@ -132,24 +150,27 @@ export async function resolveTopics(blocks, opts) {
|
|
|
132
150
|
judgeCalls += 1;
|
|
133
151
|
try {
|
|
134
152
|
const verdict = await opts.judge({ a: pair.a, b: pair.b });
|
|
135
|
-
|
|
153
|
+
consecutiveFails = 0;
|
|
136
154
|
if (verdict === "same")
|
|
137
155
|
sameVerdicts.push({ i: pair.i, j: pair.j });
|
|
138
156
|
}
|
|
139
157
|
catch (err) {
|
|
140
158
|
unresolvedAmbiguous += 1;
|
|
159
|
+
consecutiveFails += 1;
|
|
141
160
|
if (err instanceof ClaudeError) {
|
|
142
161
|
if (err.kind === "auth" || isQuotaKind(err.kind)) {
|
|
143
162
|
log.warn({ kind: err.kind }, "phase 7 judge bailed on quota/auth error");
|
|
163
|
+
if (firstFatalErr === null)
|
|
164
|
+
firstFatalErr = err;
|
|
144
165
|
judgeBroken = true;
|
|
145
166
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
}
|
|
167
|
+
}
|
|
168
|
+
if (!judgeBroken && consecutiveFails >= CONSECUTIVE_FAIL_BAIL) {
|
|
169
|
+
log.warn({ consecutiveFails, errKind: err instanceof ClaudeError ? err.kind : "non-claude" }, "phase 7 judge bailed after consecutive fails; surfacing as phase error");
|
|
170
|
+
if (firstFatalErr === null) {
|
|
171
|
+
firstFatalErr = err instanceof Error ? err : new Error(String(err));
|
|
152
172
|
}
|
|
173
|
+
judgeBroken = true;
|
|
153
174
|
}
|
|
154
175
|
}
|
|
155
176
|
if (opts.onProgress !== undefined) {
|
|
@@ -158,6 +179,12 @@ export async function resolveTopics(blocks, opts) {
|
|
|
158
179
|
}
|
|
159
180
|
};
|
|
160
181
|
await Promise.all(Array.from({ length: concurrency }, () => worker()));
|
|
182
|
+
// Surface fatal failure to phase 7. Doing this before applying merges
|
|
183
|
+
// / writing topicIndex prevents a partial topic-index from being
|
|
184
|
+
// written to ground state when quota / auth / sustained failures
|
|
185
|
+
// mean the resolver never got a clean run.
|
|
186
|
+
if (firstFatalErr !== null)
|
|
187
|
+
throw firstFatalErr;
|
|
161
188
|
// Apply union-find merges from successful "same" verdicts. Done after
|
|
162
189
|
// all workers finish so concurrent verdicts can't race the merge map.
|
|
163
190
|
// Order doesn't affect the final equivalence classes — union is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/init/topic-index/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EACL,cAAc,EACd,eAAe,EACf,SAAS,EACT,QAAQ,GACT,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAI1D,MAAM,GAAG,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAE/C
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/init/topic-index/resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/init/walker.d.ts
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
*
|
|
32
32
|
* The mapper turns this into the `<slug>:` extension block (route_handler_globs,
|
|
33
33
|
* dto_globs, generator_source_globs, high_stakes_globs, off_limits_globs,
|
|
34
|
-
*
|
|
34
|
+
* key_modules, proposed_sensors, domain_summary).
|
|
35
35
|
*/
|
|
36
36
|
export interface ManifestPreview {
|
|
37
37
|
path: string;
|
package/dist/init/walker.js
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
*
|
|
32
32
|
* The mapper turns this into the `<slug>:` extension block (route_handler_globs,
|
|
33
33
|
* dto_globs, generator_source_globs, high_stakes_globs, off_limits_globs,
|
|
34
|
-
*
|
|
34
|
+
* key_modules, proposed_sensors, domain_summary).
|
|
35
35
|
*/
|
|
36
36
|
import { execFileSync } from "node:child_process";
|
|
37
37
|
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
@@ -5,18 +5,17 @@
|
|
|
5
5
|
* 1. `.cairn/config.yaml` — the project overlay (built by `init.ts` directly)
|
|
6
6
|
* 2. `.cairn/config/workflow.md` — the `<slug>:` block in YAML frontmatter
|
|
7
7
|
*
|
|
8
|
-
* (2) is shipped as a template with
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* (2) is shipped as a template with empty glob arrays. After seed
|
|
9
|
+
* substitutes `<project_name>:` → `<slug>:`, this module patches the slug
|
|
10
|
+
* block with the mapper's outputs while preserving the rest of the
|
|
11
|
+
* frontmatter (comments, key order, sibling keys) and the markdown body
|
|
12
|
+
* below the closing `---`.
|
|
13
13
|
*
|
|
14
14
|
* Round-trip uses `yaml`'s `parseDocument` API so comments outside the slug
|
|
15
15
|
* block survive. Comments inside the slug block are dropped on the keys we
|
|
16
16
|
* mutate; that's acceptable because the placeholder block is comment-light.
|
|
17
17
|
*/
|
|
18
18
|
export interface WorkflowSlugBlockUpdate {
|
|
19
|
-
pilot_module?: string;
|
|
20
19
|
route_handler_globs?: string[];
|
|
21
20
|
dto_globs?: string[];
|
|
22
21
|
generator_source_globs?: string[];
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
* 1. `.cairn/config.yaml` — the project overlay (built by `init.ts` directly)
|
|
6
6
|
* 2. `.cairn/config/workflow.md` — the `<slug>:` block in YAML frontmatter
|
|
7
7
|
*
|
|
8
|
-
* (2) is shipped as a template with
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* (2) is shipped as a template with empty glob arrays. After seed
|
|
9
|
+
* substitutes `<project_name>:` → `<slug>:`, this module patches the slug
|
|
10
|
+
* block with the mapper's outputs while preserving the rest of the
|
|
11
|
+
* frontmatter (comments, key order, sibling keys) and the markdown body
|
|
12
|
+
* below the closing `---`.
|
|
13
13
|
*
|
|
14
14
|
* Round-trip uses `yaml`'s `parseDocument` API so comments outside the slug
|
|
15
15
|
* block survive. Comments inside the slug block are dropped on the keys we
|
|
@@ -44,10 +44,6 @@ export function updateWorkflowSlugBlock(args) {
|
|
|
44
44
|
}
|
|
45
45
|
const applied = [];
|
|
46
46
|
const u = args.update;
|
|
47
|
-
if (u.pilot_module !== undefined) {
|
|
48
|
-
slugBlock.set("pilot_module", u.pilot_module);
|
|
49
|
-
applied.push("pilot_module");
|
|
50
|
-
}
|
|
51
47
|
if (u.route_handler_globs !== undefined) {
|
|
52
48
|
slugBlock.set("route_handler_globs", doc.createNode(u.route_handler_globs));
|
|
53
49
|
applied.push("route_handler_globs");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-block.js","sourceRoot":"","sources":["../../src/init/workflow-block.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EACL,KAAK,EACL,KAAK,EACL,aAAa,EACb,MAAM,EACN,OAAO,EACP,OAAO,GAGR,MAAM,MAAM,CAAC;AAEd,MAAM,cAAc,GAAG,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-block.js","sourceRoot":"","sources":["../../src/init/workflow-block.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Wraps `bulkAcceptObvious` so the cairn-attention skill can drain
|
|
5
5
|
* obvious DEC drafts in one tool call instead of N rounds of
|
|
6
6
|
* `cairn_resolve_attention(choice="a")` per draft. Loads the project
|
|
7
|
-
* globs
|
|
7
|
+
* globs from `.cairn/config.yaml` so the scoring
|
|
8
8
|
* heuristic has the same context the cli subcommand does.
|
|
9
9
|
*
|
|
10
10
|
* Returns a slim count-distribution shape — no draft bodies, no file
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Wraps `bulkAcceptObvious` so the cairn-attention skill can drain
|
|
5
5
|
* obvious DEC drafts in one tool call instead of N rounds of
|
|
6
6
|
* `cairn_resolve_attention(choice="a")` per draft. Loads the project
|
|
7
|
-
* globs
|
|
7
|
+
* globs from `.cairn/config.yaml` so the scoring
|
|
8
8
|
* heuristic has the same context the cli subcommand does.
|
|
9
9
|
*
|
|
10
10
|
* Returns a slim count-distribution shape — no draft bodies, no file
|
|
@@ -31,7 +31,6 @@ const ConfigSchema = z.object({
|
|
|
31
31
|
}).optional(),
|
|
32
32
|
high_stakes_globs: z.array(z.string()).optional(),
|
|
33
33
|
off_limits: z.array(z.string()).optional(),
|
|
34
|
-
pilot_module: z.string().optional(),
|
|
35
34
|
}).passthrough();
|
|
36
35
|
function loadProjectGlobs(repoRoot) {
|
|
37
36
|
const configPath = join(repoRoot, ".cairn", "config.yaml");
|
|
@@ -66,18 +65,17 @@ function loadProjectGlobs(repoRoot) {
|
|
|
66
65
|
globs.high_stakes_globs = pg.high_stakes_globs;
|
|
67
66
|
}
|
|
68
67
|
}
|
|
69
|
-
return
|
|
68
|
+
return { globs };
|
|
70
69
|
}
|
|
71
70
|
export const bulkAcceptAttentionTool = {
|
|
72
71
|
name: "cairn_bulk_accept_attention",
|
|
73
|
-
description: "Score every DEC draft + invariant in `.cairn/ground/decisions/_inbox/` and `.cairn/ground/invariants/` against a confidence heuristic (file in high_stakes_globs /
|
|
72
|
+
description: "Score every DEC draft + invariant in `.cairn/ground/decisions/_inbox/` and `.cairn/ground/invariants/` against a confidence heuristic (file in high_stakes_globs / route or dto globs, prose substantiveness, decision verbs, JSDoc tags). Auto-promote DEC drafts at or above `threshold` (default 'high') out of the inbox to accepted state and rebuild the decisions ledger. Stamp `capture_confidence` on every draft + invariant so subsequent attention surfaces can sort. Use this once per adoption to drain the obvious classifications before per-item triage. Returns count distributions and the accepted ID list. `dryRun: true` reports the same distribution without writing.",
|
|
74
73
|
inputSchema: inputShape,
|
|
75
74
|
handler: async (ctx, input) => {
|
|
76
|
-
const { globs
|
|
75
|
+
const { globs } = loadProjectGlobs(ctx.repoRoot);
|
|
77
76
|
return bulkAcceptObvious({
|
|
78
77
|
repoRoot: ctx.repoRoot,
|
|
79
78
|
globs,
|
|
80
|
-
...(pilotModule !== undefined ? { pilotModule } : {}),
|
|
81
79
|
threshold: input.threshold ?? "high",
|
|
82
80
|
...(input.dryRun !== undefined ? { dryRun: input.dryRun } : {}),
|
|
83
81
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulk-accept-attention.js","sourceRoot":"","sources":["../../../src/mcp/tools/bulk-accept-attention.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,iBAAiB,GAGlB,MAAM,0BAA0B,CAAC;AAKlC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAE3D,MAAM,UAAU,GAAG;IACjB,SAAS,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IACtC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC;AAOF,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC;QACtB,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACnD,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACzC,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACtD,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KAClD,CAAC,CAAC,QAAQ,EAAE;IACb,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACjD,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"bulk-accept-attention.js","sourceRoot":"","sources":["../../../src/mcp/tools/bulk-accept-attention.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MCP tools for the v0.
|
|
2
|
+
* MCP tools for the v0.9.0 init pipeline.
|
|
3
3
|
*
|
|
4
4
|
* Two tools, single surface:
|
|
5
5
|
* 1. `cairn_init_resume` → { status, nextPhase, repoRoot }
|
|
@@ -11,11 +11,12 @@
|
|
|
11
11
|
* 3. AskUserQuestion if needs_input → re-call same tool with { answer }
|
|
12
12
|
* 4. loop on complete + advance until nextPhase === null
|
|
13
13
|
*
|
|
14
|
-
* Phase
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
14
|
+
* Phase 9b-curate is a skill-driven pseudo-phase: between Phase 9a
|
|
15
|
+
* (walker) and Phase 9c (emit), the cairn-adopt skill spawns
|
|
16
|
+
* `cairn:curator-map` and `cairn:curator-reduce` subagents that write
|
|
17
|
+
* `.cairn/init/curator/final.jsonl`. The 9b runner only confirms the
|
|
18
|
+
* file exists + counts entries before advancing; the heavy work
|
|
19
|
+
* happens outside the MCP server.
|
|
19
20
|
*
|
|
20
21
|
* State persists to .cairn/init-state.json after every successful
|
|
21
22
|
* phase result so the operator can crash-recover. The skill no longer
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MCP tools for the v0.
|
|
2
|
+
* MCP tools for the v0.9.0 init pipeline.
|
|
3
3
|
*
|
|
4
4
|
* Two tools, single surface:
|
|
5
5
|
* 1. `cairn_init_resume` → { status, nextPhase, repoRoot }
|
|
@@ -11,11 +11,12 @@
|
|
|
11
11
|
* 3. AskUserQuestion if needs_input → re-call same tool with { answer }
|
|
12
12
|
* 4. loop on complete + advance until nextPhase === null
|
|
13
13
|
*
|
|
14
|
-
* Phase
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
14
|
+
* Phase 9b-curate is a skill-driven pseudo-phase: between Phase 9a
|
|
15
|
+
* (walker) and Phase 9c (emit), the cairn-adopt skill spawns
|
|
16
|
+
* `cairn:curator-map` and `cairn:curator-reduce` subagents that write
|
|
17
|
+
* `.cairn/init/curator/final.jsonl`. The 9b runner only confirms the
|
|
18
|
+
* file exists + counts entries before advancing; the heavy work
|
|
19
|
+
* happens outside the MCP server.
|
|
19
20
|
*
|
|
20
21
|
* State persists to .cairn/init-state.json after every successful
|
|
21
22
|
* phase result so the operator can crash-recover. The skill no longer
|
|
@@ -34,7 +35,7 @@
|
|
|
34
35
|
* phase outputs — a single bad call could nuke a 90KB mapper run.
|
|
35
36
|
*/
|
|
36
37
|
import { z } from "zod";
|
|
37
|
-
import { PHASE_IDS, clearProgress, freshPhaseState, readPhaseState, resumePhases, runPhase1Detect, runPhase2Walker, runPhase3Mapper, runPhase4Seed,
|
|
38
|
+
import { PHASE_IDS, clearProgress, freshPhaseState, readPhaseState, resumePhases, runPhase1Detect, runPhase2Walker, runPhase3Mapper, runPhase4Seed, runPhase5Preflight, runPhase6Brand, runPhase7TopicIndex, runPhase8DocsIngest, runPhase9aWalker, runPhase9bCurate, runPhase9cEmit, runPhase10RulesMerge, runPhase11Baseline, runPhase12Strip, runPhase13Multidev, writePhaseState, writeProgress, } from "../../init/index.js";
|
|
38
39
|
import { mcpError } from "../errors.js";
|
|
39
40
|
const phaseIdEnum = z.enum(PHASE_IDS);
|
|
40
41
|
const phaseStateSchema = z.object({
|
|
@@ -43,7 +44,7 @@ const phaseStateSchema = z.object({
|
|
|
43
44
|
outputs: z.record(z.string(), z.unknown()),
|
|
44
45
|
answer: z.string().optional(),
|
|
45
46
|
startedAt: z.string().min(1),
|
|
46
|
-
schemaVersion: z.literal(
|
|
47
|
+
schemaVersion: z.literal(3),
|
|
47
48
|
});
|
|
48
49
|
const phaseRunInput = {
|
|
49
50
|
phase: phaseIdEnum,
|
|
@@ -62,11 +63,13 @@ const RUNNERS = {
|
|
|
62
63
|
"2-walker": runPhase2Walker,
|
|
63
64
|
"3-mapper": runPhase3Mapper,
|
|
64
65
|
"4-seed": runPhase4Seed,
|
|
65
|
-
"5-
|
|
66
|
+
"5-preflight": runPhase5Preflight,
|
|
66
67
|
"6-brand": runPhase6Brand,
|
|
67
68
|
"7-topic-index": runPhase7TopicIndex,
|
|
68
69
|
"8-docs-ingest": runPhase8DocsIngest,
|
|
69
|
-
"
|
|
70
|
+
"9a-walker": runPhase9aWalker,
|
|
71
|
+
"9b-curate": runPhase9bCurate,
|
|
72
|
+
"9c-emit": runPhase9cEmit,
|
|
70
73
|
"10-rules-merge": runPhase10RulesMerge,
|
|
71
74
|
"11-baseline": runPhase11Baseline,
|
|
72
75
|
"12-strip": runPhase12Strip,
|
|
@@ -81,40 +84,6 @@ function toSlim(result) {
|
|
|
81
84
|
}
|
|
82
85
|
return { status: "error", error: result.error };
|
|
83
86
|
}
|
|
84
|
-
/**
|
|
85
|
-
* Phase 8 fans out to phases 8/9/10 in parallel. Centralized here so
|
|
86
|
-
* `cairn_init_run` callers don't have to special-case the gate.
|
|
87
|
-
*/
|
|
88
|
-
async function handlePhase8Parallel(ctx, state) {
|
|
89
|
-
if (state.repoRoot !== ctx.repoRoot) {
|
|
90
|
-
return mcpError("VALIDATION_FAILED", `state.repoRoot ${state.repoRoot} does not match MCP context ${ctx.repoRoot}`);
|
|
91
|
-
}
|
|
92
|
-
const t0 = performance.now();
|
|
93
|
-
const result = await runPhases8910Parallel(state);
|
|
94
|
-
const durationMs = Math.round(performance.now() - t0);
|
|
95
|
-
clearProgress(state.repoRoot);
|
|
96
|
-
if (result.status !== "error") {
|
|
97
|
-
for (const id of [
|
|
98
|
-
"8-docs-ingest",
|
|
99
|
-
"9-source-comments",
|
|
100
|
-
"10-rules-merge",
|
|
101
|
-
]) {
|
|
102
|
-
const phaseOut = result.state.outputs[id];
|
|
103
|
-
if (typeof phaseOut === "object" && phaseOut !== null) {
|
|
104
|
-
if (!("duration_ms" in phaseOut)) {
|
|
105
|
-
Object.assign(phaseOut, { duration_ms: durationMs });
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
try {
|
|
110
|
-
writePhaseState(result.state);
|
|
111
|
-
}
|
|
112
|
-
catch (err) {
|
|
113
|
-
return mcpError("INTERNAL_ERROR", `failed to persist init state: ${err instanceof Error ? err.message : String(err)}`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return toSlim(result);
|
|
117
|
-
}
|
|
118
87
|
async function handlePhaseRun(ctx, id, input) {
|
|
119
88
|
// Resolve state: prefer the explicit arg (smoke tests, debug
|
|
120
89
|
// tooling), fall back to disk (cairn-adopt skill default).
|
|
@@ -139,17 +108,9 @@ async function handlePhaseRun(ctx, id, input) {
|
|
|
139
108
|
const stateForRun = input.answer !== undefined && input.answer.length > 0
|
|
140
109
|
? { ...state, answer: input.answer }
|
|
141
110
|
: state;
|
|
142
|
-
// Phase 8 dispatches the parallel 8/9/10 runner — the three Haiku-
|
|
143
|
-
// batched ingestion phases overlap on wall-clock and the combined
|
|
144
|
-
// result advances to `11-baseline`. No separate MCP tool needed.
|
|
145
|
-
if (id === "8-docs-ingest") {
|
|
146
|
-
return handlePhase8Parallel(ctx, stateForRun);
|
|
147
|
-
}
|
|
148
111
|
const runner = RUNNERS[id];
|
|
149
112
|
// Coarse-grained statusline coverage
|
|
150
|
-
const isLongPhase = id === "3-mapper" ||
|
|
151
|
-
id === "9-source-comments" ||
|
|
152
|
-
id === "10-rules-merge";
|
|
113
|
+
const isLongPhase = id === "3-mapper" || id === "9a-walker" || id === "9c-emit";
|
|
153
114
|
if (!isLongPhase) {
|
|
154
115
|
writeProgress(state.repoRoot, {
|
|
155
116
|
phase: id,
|
|
@@ -183,7 +144,7 @@ async function handlePhaseRun(ctx, id, input) {
|
|
|
183
144
|
function makePhaseRunTool() {
|
|
184
145
|
return {
|
|
185
146
|
name: "cairn_init_run",
|
|
186
|
-
description: "Run the next initialization phase. Call cairn_init_resume to find the next phase, then invoke this tool with that phase ID. Phase 8-docs-ingest
|
|
147
|
+
description: "Run the next initialization phase. Call cairn_init_resume to find the next phase, then invoke this tool with that phase ID. Phase 8-docs-ingest and 10-rules-merge are no-op markers in v0.9.0 (the curator pipeline 9a-walker → 9b-curate → 9c-emit subsumes both); 10-rules-merge advances to 11-baseline. Phase 9b-curate is a skill-driven pseudo-phase: the cairn-adopt skill must dispatch curator-map + curator-reduce subagents and write .cairn/init/curator/final.jsonl before invoking it. The cairn-adopt skill loops on this tool until nextPhase === null.",
|
|
187
148
|
inputSchema: phaseRunInput,
|
|
188
149
|
handler: async (ctx, input) => {
|
|
189
150
|
return handlePhaseRun(ctx, input.phase, input);
|
|
@@ -193,19 +154,33 @@ function makePhaseRunTool() {
|
|
|
193
154
|
function makeResumeTool() {
|
|
194
155
|
return {
|
|
195
156
|
name: "cairn_init_resume",
|
|
196
|
-
description: "Read the on-disk init state for the current repo and return the next phase to invoke. The cairn-adopt skill calls this once at the start of the pipeline (and after any operator interruption) to find where to pick up. Returns { status: 'ready' | 'done', nextPhase: PhaseId | null, repoRoot }.",
|
|
157
|
+
description: "Read the on-disk init state for the current repo and return the next phase to invoke. The cairn-adopt skill calls this once at the start of the pipeline (and after any operator interruption) to find where to pick up. Returns { status: 'ready' | 'done', nextPhase: PhaseId | null, repoRoot }. For a fresh start (no `.cairn/init-state.json`), the tool persists a fresh PhaseState to disk so the very next `cairn_init_run` call can read it back without the skill having to thread state through tool arguments.",
|
|
197
158
|
inputSchema: initResumeInput,
|
|
198
159
|
handler: async (ctx) => {
|
|
199
160
|
const report = resumePhases(ctx.repoRoot);
|
|
200
161
|
// For a fresh start, ensure state.repoRoot matches ctx.repoRoot
|
|
201
162
|
// (resumePhases uses freshPhaseState(ctx.repoRoot) for this case).
|
|
202
|
-
const
|
|
203
|
-
? freshPhaseState(ctx.repoRoot)
|
|
204
|
-
: report.state
|
|
163
|
+
const stateForCtx = report.state.repoRoot !== ctx.repoRoot
|
|
164
|
+
? freshPhaseState(ctx.repoRoot)
|
|
165
|
+
: report.state;
|
|
166
|
+
// Persist fresh state to disk so the next `cairn_init_run` call
|
|
167
|
+
// (which by SKILL.md contract omits the `state` arg) finds
|
|
168
|
+
// something to read. Without this, the loop deadlocks at Phase
|
|
169
|
+
// 1-detect with `VALIDATION_FAILED ... no init state at
|
|
170
|
+
// .cairn/init-state.json` on every fresh adoption.
|
|
171
|
+
const onDisk = readPhaseState(ctx.repoRoot);
|
|
172
|
+
if (onDisk === null) {
|
|
173
|
+
try {
|
|
174
|
+
writePhaseState(stateForCtx);
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
return mcpError("INTERNAL_ERROR", `failed to seed init state: ${err instanceof Error ? err.message : String(err)}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
205
180
|
return {
|
|
206
181
|
status: report.status,
|
|
207
182
|
nextPhase: report.nextPhase,
|
|
208
|
-
repoRoot,
|
|
183
|
+
repoRoot: stateForCtx.repoRoot,
|
|
209
184
|
};
|
|
210
185
|
},
|
|
211
186
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-phases.js","sourceRoot":"","sources":["../../../src/mcp/tools/init-phases.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"init-phases.js","sourceRoot":"","sources":["../../../src/mcp/tools/init-phases.ts"],"names":[],"mappings":"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"}
|
|
@@ -111,9 +111,14 @@ export async function buildSessionStartContext(args) {
|
|
|
111
111
|
counts.pendingDrafts = drafts.length;
|
|
112
112
|
const pendingDraftsSection = renderPendingDraftsSection(drafts);
|
|
113
113
|
// Baseline findings drive the attention surface alongside drafts +
|
|
114
|
-
// drift
|
|
114
|
+
// drift. Only HARD findings count — soft findings (e.g. the
|
|
115
|
+
// commented-block-3-plus-lines pattern that fires on every
|
|
116
|
+
// 3+-line commented block in the repo) are inventory for the
|
|
117
|
+
// attestation cross-check, not actionable attention. Surfacing
|
|
118
|
+
// 500+ soft findings as "⚑ N pending" gives the operator a count
|
|
119
|
+
// they can't drain item-by-item.
|
|
115
120
|
const latestBaseline = readLatestBaselineAudit(args.repoRoot, warnings);
|
|
116
|
-
counts.baselineFindings = latestBaseline?.
|
|
121
|
+
counts.baselineFindings = latestBaseline?.hardFindings ?? 0;
|
|
117
122
|
// ── Section 1.5 — brand + product positioning (always injected) ───
|
|
118
123
|
const brandAndPositioningSection = readBrandAndPositioning(args.repoRoot, warnings);
|
|
119
124
|
// ── First-session onboarding block ────────────────────────────────
|
|
@@ -558,8 +563,16 @@ function renderFirstSessionOnboarding(args) {
|
|
|
558
563
|
lines.push("");
|
|
559
564
|
}
|
|
560
565
|
if (audit.totalFindings > 0) {
|
|
561
|
-
|
|
562
|
-
|
|
566
|
+
const breakdown = audit.hardFindings > 0 || audit.softFindings > 0
|
|
567
|
+
? ` (${audit.hardFindings} hard · ${audit.softFindings} soft)`
|
|
568
|
+
: "";
|
|
569
|
+
lines.push(` Baseline debt: ${audit.totalFindings} pre-Cairn violation${audit.totalFindings === 1 ? "" : "s"}${breakdown} found in existing code.`);
|
|
570
|
+
if (audit.hardFindings > 0) {
|
|
571
|
+
lines.push(" Invoke the cairn-attention skill to triage hard findings; soft findings are inventory, drained in bulk.");
|
|
572
|
+
}
|
|
573
|
+
else {
|
|
574
|
+
lines.push(" All findings are soft (inventory only). No hard violations to triage.");
|
|
575
|
+
}
|
|
563
576
|
lines.push("");
|
|
564
577
|
}
|
|
565
578
|
else {
|
|
@@ -602,13 +615,42 @@ function readLatestBaselineAudit(repoRoot, warnings) {
|
|
|
602
615
|
const filesScanned = typeof parsed["files_scanned"] === "number"
|
|
603
616
|
? parsed["files_scanned"]
|
|
604
617
|
: 0;
|
|
605
|
-
|
|
618
|
+
const { hard, soft } = countFindingsBySeverity(parsed["sensors"]);
|
|
619
|
+
return { runAt, totalFindings, hardFindings: hard, softFindings: soft, filesScanned };
|
|
606
620
|
}
|
|
607
621
|
catch (err) {
|
|
608
622
|
warnings.push(`baseline audit unreadable: ${err instanceof Error ? err.message : String(err)}`);
|
|
609
623
|
return null;
|
|
610
624
|
}
|
|
611
625
|
}
|
|
626
|
+
/**
|
|
627
|
+
* Walk the audit's `sensors[].findings[]` and tally by severity. Defensive
|
|
628
|
+
* against schema drift — anything that isn't string `"hard"` or `"soft"`
|
|
629
|
+
* is silently ignored rather than counted under the wrong bucket.
|
|
630
|
+
*/
|
|
631
|
+
function countFindingsBySeverity(sensorsRaw) {
|
|
632
|
+
let hard = 0;
|
|
633
|
+
let soft = 0;
|
|
634
|
+
if (!Array.isArray(sensorsRaw))
|
|
635
|
+
return { hard, soft };
|
|
636
|
+
for (const sensor of sensorsRaw) {
|
|
637
|
+
if (typeof sensor !== "object" || sensor === null)
|
|
638
|
+
continue;
|
|
639
|
+
const findings = sensor["findings"];
|
|
640
|
+
if (!Array.isArray(findings))
|
|
641
|
+
continue;
|
|
642
|
+
for (const f of findings) {
|
|
643
|
+
if (typeof f !== "object" || f === null)
|
|
644
|
+
continue;
|
|
645
|
+
const sev = f["severity"];
|
|
646
|
+
if (sev === "hard")
|
|
647
|
+
hard += 1;
|
|
648
|
+
else if (sev === "soft")
|
|
649
|
+
soft += 1;
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
return { hard, soft };
|
|
653
|
+
}
|
|
612
654
|
function readActiveSensorIds(repoRoot, warnings) {
|
|
613
655
|
try {
|
|
614
656
|
const reg = loadSensorRegistry(repoRoot);
|