@isaacriehm/cairn-core 0.17.0 → 0.18.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/components/audit.d.ts +30 -0
- package/dist/components/audit.js +154 -0
- package/dist/components/audit.js.map +1 -0
- package/dist/components/check.d.ts +33 -0
- package/dist/components/check.js +43 -0
- package/dist/components/check.js.map +1 -0
- package/dist/components/index-build.d.ts +23 -0
- package/dist/components/index-build.js +47 -0
- package/dist/components/index-build.js.map +1 -0
- package/dist/components/index.d.ts +6 -0
- package/dist/components/index.js +4 -0
- package/dist/components/index.js.map +1 -0
- package/dist/doctor/index.js +52 -1
- package/dist/doctor/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init/detect-components.d.ts +27 -0
- package/dist/init/detect-components.js +144 -0
- package/dist/init/detect-components.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/phases/4-seed.js +8 -0
- package/dist/init/phases/4-seed.js.map +1 -1
- package/dist/init/phases/9c-emit.js +2 -2
- package/dist/init/phases/9c-emit.js.map +1 -1
- package/dist/init/phases/9d-comp-walk.d.ts +18 -0
- package/dist/init/phases/9d-comp-walk.js +106 -0
- package/dist/init/phases/9d-comp-walk.js.map +1 -0
- package/dist/init/phases/9e-comp-annotate.d.ts +19 -0
- package/dist/init/phases/9e-comp-annotate.js +90 -0
- package/dist/init/phases/9e-comp-annotate.js.map +1 -0
- package/dist/init/phases/9f-comp-emit.d.ts +24 -0
- package/dist/init/phases/9f-comp-emit.js +180 -0
- package/dist/init/phases/9f-comp-emit.js.map +1 -0
- package/dist/init/phases/index.d.ts +4 -1
- package/dist/init/phases/index.js +3 -0
- package/dist/init/phases/index.js.map +1 -1
- package/dist/init/phases/types.d.ts +49 -1
- package/dist/init/phases/types.js +3 -0
- package/dist/init/phases/types.js.map +1 -1
- package/dist/init/source-comments/walker.js +7 -0
- package/dist/init/source-comments/walker.js.map +1 -1
- package/dist/mcp/errors.d.ts +1 -1
- package/dist/mcp/errors.js.map +1 -1
- package/dist/mcp/schemas.d.ts +8 -0
- package/dist/mcp/schemas.js +9 -0
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/tools/component-get.d.ts +7 -0
- package/dist/mcp/tools/component-get.js +24 -0
- package/dist/mcp/tools/component-get.js.map +1 -0
- package/dist/mcp/tools/components-in-scope.d.ts +6 -0
- package/dist/mcp/tools/components-in-scope.js +18 -0
- package/dist/mcp/tools/components-in-scope.js.map +1 -0
- package/dist/mcp/tools/index.js +5 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init-phases.js +4 -1
- package/dist/mcp/tools/init-phases.js.map +1 -1
- package/package.json +2 -2
- package/templates/.cairn/config/workflow.md +58 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic component-dir detection for adoption (Phase 4-seed).
|
|
3
|
+
*
|
|
4
|
+
* No LLM. Probes conventional component directories that actually
|
|
5
|
+
* exist on disk and proposes a `components:` block for
|
|
6
|
+
* `.cairn/config.yaml`. Returns `null` when the project has no
|
|
7
|
+
* recognizable component layout (non-UI repos stay untouched).
|
|
8
|
+
*
|
|
9
|
+
* Isolation invariant (port invariant 3): a monorepo workspace is
|
|
10
|
+
* NEVER guessed as `shared`. We omit the flag entirely — it normalizes
|
|
11
|
+
* to isolated — and leave the opt-in to the operator (manual config
|
|
12
|
+
* edit or the future annotate step).
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
15
|
+
import { extname, join } from "node:path";
|
|
16
|
+
import { DEFAULT_CATEGORIES, DEFAULT_EXCLUDE, DEFAULT_EXTENSIONS, walkFs, } from "@isaacriehm/cairn-state";
|
|
17
|
+
/** Conventional component-dir suffixes, probed in order under a root or package. */
|
|
18
|
+
const CONVENTIONAL_DIRS = [
|
|
19
|
+
"src/components",
|
|
20
|
+
"src/features",
|
|
21
|
+
"app/components",
|
|
22
|
+
"src/app/components",
|
|
23
|
+
"components",
|
|
24
|
+
];
|
|
25
|
+
/** Monorepo package parents to scan for nested component dirs. */
|
|
26
|
+
const MONOREPO_PARENTS = ["packages", "apps"];
|
|
27
|
+
/** Extensions we sniff for beyond the React default. */
|
|
28
|
+
const SVELTE_EXT = ".svelte";
|
|
29
|
+
const VUE_EXT = ".vue";
|
|
30
|
+
/**
|
|
31
|
+
* Detect the extension set to scan. Defaults to the React profile
|
|
32
|
+
* (`.tsx`/`.jsx`); appends `.vue`/`.svelte` only when such files
|
|
33
|
+
* actually exist under the candidate dirs (framework-agnostic, but
|
|
34
|
+
* presence-driven so we never invent extensions a repo doesn't use).
|
|
35
|
+
*/
|
|
36
|
+
function detectExtensions(repoRoot, dirs) {
|
|
37
|
+
let hasVue = false;
|
|
38
|
+
let hasSvelte = false;
|
|
39
|
+
let hasReact = false;
|
|
40
|
+
const skipDirs = new Set([...DEFAULT_EXCLUDE]);
|
|
41
|
+
for (const dir of dirs) {
|
|
42
|
+
const abs = join(repoRoot, dir);
|
|
43
|
+
if (!existsSync(abs))
|
|
44
|
+
continue;
|
|
45
|
+
walkFs({
|
|
46
|
+
dir: abs,
|
|
47
|
+
repoRoot,
|
|
48
|
+
skipDirs,
|
|
49
|
+
onFile: (_rel, fileAbs) => {
|
|
50
|
+
const e = extname(fileAbs);
|
|
51
|
+
if (e === VUE_EXT)
|
|
52
|
+
hasVue = true;
|
|
53
|
+
else if (e === SVELTE_EXT)
|
|
54
|
+
hasSvelte = true;
|
|
55
|
+
else if (e === ".tsx" || e === ".jsx")
|
|
56
|
+
hasReact = true;
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const exts = [];
|
|
61
|
+
// Keep the React pair as the baseline unless the repo is purely
|
|
62
|
+
// Vue/Svelte — most TS UI repos still carry .tsx alongside framework files.
|
|
63
|
+
if (hasReact || (!hasVue && !hasSvelte))
|
|
64
|
+
exts.push(...DEFAULT_EXTENSIONS);
|
|
65
|
+
if (hasVue)
|
|
66
|
+
exts.push(VUE_EXT);
|
|
67
|
+
if (hasSvelte)
|
|
68
|
+
exts.push(SVELTE_EXT);
|
|
69
|
+
return exts;
|
|
70
|
+
}
|
|
71
|
+
/** Conventional dirs (relative to `base`) that exist on disk. */
|
|
72
|
+
function existingDirs(repoRoot, base) {
|
|
73
|
+
return CONVENTIONAL_DIRS.map((suffix) => base.length > 0 ? `${base}/${suffix}` : suffix).filter((rel) => existsSync(join(repoRoot, rel)));
|
|
74
|
+
}
|
|
75
|
+
/** Scan `packages/*` + `apps/*` for sub-packages with component dirs. */
|
|
76
|
+
function probeMonorepo(repoRoot) {
|
|
77
|
+
const exclude = new Set([...DEFAULT_EXCLUDE]);
|
|
78
|
+
const found = [];
|
|
79
|
+
const usedNames = new Set();
|
|
80
|
+
for (const parent of MONOREPO_PARENTS) {
|
|
81
|
+
const parentAbs = join(repoRoot, parent);
|
|
82
|
+
if (!existsSync(parentAbs))
|
|
83
|
+
continue;
|
|
84
|
+
let subs;
|
|
85
|
+
try {
|
|
86
|
+
subs = readdirSync(parentAbs, { withFileTypes: true });
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
for (const d of subs.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
92
|
+
if (!d.isDirectory() || exclude.has(d.name) || d.name.startsWith(".")) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const dirs = existingDirs(repoRoot, `${parent}/${d.name}`);
|
|
96
|
+
if (dirs.length === 0)
|
|
97
|
+
continue;
|
|
98
|
+
// Disambiguate a name shared by packages/<x> and apps/<x>.
|
|
99
|
+
let name = d.name;
|
|
100
|
+
if (usedNames.has(name))
|
|
101
|
+
name = `${parent}-${d.name}`;
|
|
102
|
+
usedNames.add(name);
|
|
103
|
+
found.push({ name, dirs });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return found;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Probe `repoRoot` for a component layout and return a `components:`
|
|
110
|
+
* config block (raw yaml shape), or `null` when nothing is found.
|
|
111
|
+
*
|
|
112
|
+
* - 2+ monorepo packages with component dirs → `workspaces` form.
|
|
113
|
+
* - Exactly one package, or root-level dirs → flat single-app form.
|
|
114
|
+
*
|
|
115
|
+
* `detection` is reserved for future stack-aware tuning; extension
|
|
116
|
+
* detection is presence-driven so the result holds even when stack
|
|
117
|
+
* signatures are absent (e.g. a Vue repo with no tsconfig).
|
|
118
|
+
*/
|
|
119
|
+
export function detectComponentsConfig(repoRoot, _detection) {
|
|
120
|
+
const workspaces = probeMonorepo(repoRoot);
|
|
121
|
+
if (workspaces.length >= 2) {
|
|
122
|
+
const allDirs = workspaces.flatMap((w) => w.dirs);
|
|
123
|
+
const config = {
|
|
124
|
+
extensions: detectExtensions(repoRoot, allDirs),
|
|
125
|
+
categories: [...DEFAULT_CATEGORIES],
|
|
126
|
+
exclude: [...DEFAULT_EXCLUDE],
|
|
127
|
+
workspaces: Object.fromEntries(workspaces.map((w) => [w.name, { componentDirs: w.dirs }])),
|
|
128
|
+
};
|
|
129
|
+
return config;
|
|
130
|
+
}
|
|
131
|
+
// Single-app: a lone monorepo package's dirs, else root-level dirs.
|
|
132
|
+
const dirs = workspaces.length === 1
|
|
133
|
+
? workspaces[0].dirs
|
|
134
|
+
: existingDirs(repoRoot, "");
|
|
135
|
+
if (dirs.length === 0)
|
|
136
|
+
return null;
|
|
137
|
+
return {
|
|
138
|
+
componentDirs: dirs,
|
|
139
|
+
extensions: detectExtensions(repoRoot, dirs),
|
|
140
|
+
categories: [...DEFAULT_CATEGORIES],
|
|
141
|
+
exclude: [...DEFAULT_EXCLUDE],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=detect-components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-components.js","sourceRoot":"","sources":["../../src/init/detect-components.ts"],"names":[],"mappings":"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"}
|
package/dist/init/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { detectAll, detectAvailableSensors, detectEnvironment, detectHookCapability, detectOriginUrl, detectProjectSlug, detectStackSignatures, detectStartCommand, } from "./detect.js";
|
|
2
2
|
export { installInitCancelHandlers, startProgress, startSpinner, withSpinner, } from "./visual.js";
|
|
3
3
|
export { applyBrandAnswers, runBrandSetup } from "./brand-setup.js";
|
|
4
|
+
export { detectComponentsConfig } from "./detect-components.js";
|
|
4
5
|
export { ensureCairnRuleImport, installCairnRuleAndImport, CAIRN_RULE_IMPORT, } from "./claude-rule.js";
|
|
5
6
|
export type { EnsureImportResult, InstallRuleResult } from "./claude-rule.js";
|
|
6
7
|
export type { BrandAnswers, RunBrandSetupOptions, } from "./brand-setup.js";
|
|
@@ -40,8 +41,8 @@ export { buildRepoSummary } from "./walker.js";
|
|
|
40
41
|
export type { BuildRepoSummaryOptions, ManifestPreview, RepoSummary, } from "./walker.js";
|
|
41
42
|
export { updateWorkflowSlugBlock } from "./workflow-block.js";
|
|
42
43
|
export type { UpdateResult as WorkflowSlugUpdateResult, WorkflowSlugBlockUpdate, } from "./workflow-block.js";
|
|
43
|
-
export { PHASE_IDS, INIT_STATE_PATH, phaseStateAbsPath, readPhaseState, writePhaseState, clearPhaseState, freshPhaseState, resumePhases, nextPhaseAfter, advancePhase, MAPPER_OUTPUT_PATH, mapperOutputAbsPath, readMapperOutputFile, writeMapperOutputFile, toMapperResultPersisted, runPhase1Detect, runPhase2Walker, runPhase3Mapper, runPhase4Seed, runPhase5Preflight, runPhase6Brand, runPhase7TopicIndex, runPhase8DocsIngest, runPhase9aWalker, runPhase9bCurate, runPhase9cEmit, CURATOR_FINAL_PATH, runPhase10RulesMerge, runPhase11Baseline, runPhase12Strip, runPhase13Multidev, } from "./phases/index.js";
|
|
44
|
-
export type { PhaseId, PhaseState, PhaseOutputs, PhaseResult, PhaseQuestion, PhaseOption, PhaseError, ResumeReport, MapperResultPersisted, WalkerOutput, CurateOutput, EmitOutput, NoopPhaseOutput, TopicIndexPhaseOutput, } from "./phases/index.js";
|
|
44
|
+
export { PHASE_IDS, INIT_STATE_PATH, phaseStateAbsPath, readPhaseState, writePhaseState, clearPhaseState, freshPhaseState, resumePhases, nextPhaseAfter, advancePhase, MAPPER_OUTPUT_PATH, mapperOutputAbsPath, readMapperOutputFile, writeMapperOutputFile, toMapperResultPersisted, runPhase1Detect, runPhase2Walker, runPhase3Mapper, runPhase4Seed, runPhase5Preflight, runPhase6Brand, runPhase7TopicIndex, runPhase8DocsIngest, runPhase9aWalker, runPhase9bCurate, runPhase9cEmit, CURATOR_FINAL_PATH, runPhase9dCompWalk, COMP_MISSING_PATH, runPhase9eCompAnnotate, runPhase9fCompEmit, runPhase10RulesMerge, runPhase11Baseline, runPhase12Strip, runPhase13Multidev, } from "./phases/index.js";
|
|
45
|
+
export type { PhaseId, PhaseState, PhaseOutputs, PhaseResult, PhaseQuestion, PhaseOption, PhaseError, ResumeReport, MapperResultPersisted, WalkerOutput, CurateOutput, EmitOutput, CompWalkOutput, CompAnnotateOutput, ComponentsPhaseOutput, NoopPhaseOutput, TopicIndexPhaseOutput, } from "./phases/index.js";
|
|
45
46
|
export { validateEntry, stripLineRange, type FinalEntry, type ValidationResult, } from "./curator/index.js";
|
|
46
47
|
export { buildTopicIndex, walkProseBlocks, resolveTopics, makeHaikuJudge, } from "./topic-index/index.js";
|
|
47
48
|
export type { BuildTopicIndexArgs, BuildTopicIndexResult, ProseBlock, ProseBlockKind, ResolveOptions, ResolveResult, SemanticJudge, SemanticVerdict, JudgeOptions, } from "./topic-index/index.js";
|
package/dist/init/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { detectAll, detectAvailableSensors, detectEnvironment, detectHookCapability, detectOriginUrl, detectProjectSlug, detectStackSignatures, detectStartCommand, } from "./detect.js";
|
|
2
2
|
export { installInitCancelHandlers, startProgress, startSpinner, withSpinner, } from "./visual.js";
|
|
3
3
|
export { applyBrandAnswers, runBrandSetup } from "./brand-setup.js";
|
|
4
|
+
export { detectComponentsConfig } from "./detect-components.js";
|
|
4
5
|
export { ensureCairnRuleImport, installCairnRuleAndImport, CAIRN_RULE_IMPORT, } from "./claude-rule.js";
|
|
5
6
|
export { deriveBrandFromProject, derivedToBrandAnswers, } from "./brand-derive.js";
|
|
6
7
|
export { defaultBaselineLanguages, findLatestBaselineAudit, runBaselineAudit, } from "./baseline-audit.js";
|
|
@@ -21,7 +22,7 @@ export { seedCairnLayout, templatesRoot } from "./seed.js";
|
|
|
21
22
|
export { editYaml, freeTextWithDefault, squareIntoSquareHole, yesNo, } from "./prompts.js";
|
|
22
23
|
export { buildRepoSummary } from "./walker.js";
|
|
23
24
|
export { updateWorkflowSlugBlock } from "./workflow-block.js";
|
|
24
|
-
export { PHASE_IDS, INIT_STATE_PATH, phaseStateAbsPath, readPhaseState, writePhaseState, clearPhaseState, freshPhaseState, resumePhases, nextPhaseAfter, advancePhase, MAPPER_OUTPUT_PATH, mapperOutputAbsPath, readMapperOutputFile, writeMapperOutputFile, toMapperResultPersisted, runPhase1Detect, runPhase2Walker, runPhase3Mapper, runPhase4Seed, runPhase5Preflight, runPhase6Brand, runPhase7TopicIndex, runPhase8DocsIngest, runPhase9aWalker, runPhase9bCurate, runPhase9cEmit, CURATOR_FINAL_PATH, runPhase10RulesMerge, runPhase11Baseline, runPhase12Strip, runPhase13Multidev, } from "./phases/index.js";
|
|
25
|
+
export { PHASE_IDS, INIT_STATE_PATH, phaseStateAbsPath, readPhaseState, writePhaseState, clearPhaseState, freshPhaseState, resumePhases, nextPhaseAfter, advancePhase, MAPPER_OUTPUT_PATH, mapperOutputAbsPath, readMapperOutputFile, writeMapperOutputFile, toMapperResultPersisted, runPhase1Detect, runPhase2Walker, runPhase3Mapper, runPhase4Seed, runPhase5Preflight, runPhase6Brand, runPhase7TopicIndex, runPhase8DocsIngest, runPhase9aWalker, runPhase9bCurate, runPhase9cEmit, CURATOR_FINAL_PATH, runPhase9dCompWalk, COMP_MISSING_PATH, runPhase9eCompAnnotate, runPhase9fCompEmit, runPhase10RulesMerge, runPhase11Baseline, runPhase12Strip, runPhase13Multidev, } from "./phases/index.js";
|
|
25
26
|
export { validateEntry, stripLineRange, } from "./curator/index.js";
|
|
26
27
|
export { buildTopicIndex, walkProseBlocks, resolveTopics, makeHaikuJudge, } from "./topic-index/index.js";
|
|
27
28
|
//# sourceMappingURL=index.js.map
|
package/dist/init/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/init/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/init/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ import { join } from "node:path";
|
|
|
19
19
|
import { stringify as stringifyYaml } from "yaml";
|
|
20
20
|
import { scopeIndexPath, writeScopeIndex, } from "@isaacriehm/cairn-state";
|
|
21
21
|
import { seedAttestedCommits } from "../../hooks/seed-attested.js";
|
|
22
|
+
import { detectComponentsConfig } from "../detect-components.js";
|
|
22
23
|
import { buildProjectOverlay } from "../overlay.js";
|
|
23
24
|
import { seedCairnLayout } from "../seed.js";
|
|
24
25
|
import { updateWorkflowSlugBlock } from "../workflow-block.js";
|
|
@@ -83,6 +84,13 @@ export async function runPhase4Seed(state) {
|
|
|
83
84
|
decidedSlug: projectSlug,
|
|
84
85
|
...(mapperOutput !== undefined ? { mapperOutput } : {}),
|
|
85
86
|
});
|
|
87
|
+
// Attach a detected `components:` block (deterministic FS probe,
|
|
88
|
+
// no LLM). Null for non-UI repos — the key is simply omitted, so
|
|
89
|
+
// the whole component store stays inert. overlay.ts is pure (no
|
|
90
|
+
// IO); the detection lives here where 4-seed already does IO.
|
|
91
|
+
const components = detectComponentsConfig(state.repoRoot, detection);
|
|
92
|
+
if (components !== null)
|
|
93
|
+
config["components"] = components;
|
|
86
94
|
writeFileSync(configPath, stringifyYaml(config), "utf8");
|
|
87
95
|
}
|
|
88
96
|
// Step 4 — write .cairn/ground/scope-index.yaml from mapper.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"4-seed.js","sourceRoot":"","sources":["../../../src/init/phases/4-seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EACL,cAAc,EACd,eAAe,GAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAiB;IACnD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE;gBACL,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,0CAA0C;aACpD;YACD,KAAK;SACN,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC;IAC3C,MAAM,YAAY,GAAG,YAAY,EAAE,MAAM,CAAC;IAC1C,qEAAqE;IACrE,uDAAuD;IACvD,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAExD,IAAI,CAAC;QACH,wCAAwC;QACxC,MAAM,IAAI,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAExE,gEAAgE;QAChE,gEAAgE;QAChE,MAAM,KAAK,GAAG,2BAA2B,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAChC,IAAI,kBAAkB,GAAkB,IAAI,CAAC;QAC7C,IAAI,YAAY,KAAK,SAAS,IAAI,WAAW,EAAE,CAAC;YAC9C,IAAI,CAAC;gBACH,uBAAuB,CAAC;oBACtB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC;oBAC3C,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE;wBACN,mBAAmB,EAAE,YAAY,CAAC,mBAAmB;wBACrD,SAAS,EAAE,YAAY,CAAC,SAAS;wBACjC,sBAAsB,EAAE,YAAY,CAAC,sBAAsB;wBAC3D,iBAAiB,EAAE,YAAY,CAAC,iBAAiB;wBACjD,iBAAiB,EAAE,YAAY,CAAC,gBAAgB;qBACjD;iBACF,CAAC,CAAC;gBACH,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,2DAA2D;gBAC3D,wDAAwD;gBACxD,8CAA8C;gBAC9C,kBAAkB;oBAChB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACjE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,mBAAmB,CAAC;gBACjC,SAAS;gBACT,WAAW,EAAE,WAAW;gBACxB,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD,CAAC,CAAC;YACH,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAED,6DAA6D;QAC7D,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAoC,EAAE,CAAC;YACtD,MAAM,WAAW,GAAG,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;YAChE,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACpD,MAAM,KAAK,GAAoB;oBAC7B,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,UAAU,EAAE,CAAC,CAAC,UAAU;iBACzB,CAAC;gBACF,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI;oBAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAC/C,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAC1B,CAAC;YACD,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE;gBAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC;QAED,+CAA+C;QAC/C,8DAA8D;QAC9D,wDAAwD;QACxD,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEzD,MAAM,GAAG,GAAoB;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,oBAAoB;YACjC,gBAAgB,EAAE,gCAAgC;YAClD,qBAAqB,EAAE,mBAAmB;YAC1C,oBAAoB,EAAE,kBAAkB;YACxC,eAAe,EAAE,YAAY,CAAC,KAAK,IAAI,CAAC;YACxC,oBAAoB,EAAE,YAAY,CAAC,MAAM;SAC1C,CAAC;QACF,MAAM,IAAI,GAAe;YACvB,GAAG,KAAK;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE;SAC7C,CAAC;QACF,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,aAAa;YACxB,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE;gBACL,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,iCAAiC;gBAC1C,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACtE;YACD,KAAK;SACN,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"4-seed.js","sourceRoot":"","sources":["../../../src/init/phases/4-seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ export async function runPhase9cEmit(state) {
|
|
|
19
19
|
};
|
|
20
20
|
return {
|
|
21
21
|
status: "complete",
|
|
22
|
-
nextPhase: "
|
|
22
|
+
nextPhase: "9d-comp-walk",
|
|
23
23
|
state: advancePhase(next),
|
|
24
24
|
};
|
|
25
25
|
}
|
|
@@ -38,7 +38,7 @@ export async function runPhase9cEmit(state) {
|
|
|
38
38
|
};
|
|
39
39
|
return {
|
|
40
40
|
status: "complete",
|
|
41
|
-
nextPhase: "
|
|
41
|
+
nextPhase: "9d-comp-walk",
|
|
42
42
|
state: advancePhase(next),
|
|
43
43
|
};
|
|
44
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"9c-emit.js","sourceRoot":"","sources":["../../../src/init/phases/9c-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGnE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAiB;IACpD,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAe,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QACtD,MAAM,IAAI,GAAe;YACvB,GAAG,KAAK;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE;SAClD,CAAC;QACF,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"9c-emit.js","sourceRoot":"","sources":["../../../src/init/phases/9c-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGnE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAiB;IACpD,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAe,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QACtD,MAAM,IAAI,GAAe;YACvB,GAAG,KAAK;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE;SAClD,CAAC;QACF,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,cAAc;YACzB,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;SAC1B,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClE,MAAM,GAAG,GAAe;YACtB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC;QACF,MAAM,IAAI,GAAe;YACvB,GAAG,KAAK;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE;SAC9C,CAAC;QACF,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,cAAc;YACzB,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE;gBACL,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,qBAAqB;gBAC9B,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACtE;YACD,KAAK;SACN,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 9d-comp-walk — list component files missing a `@cairn` header.
|
|
3
|
+
*
|
|
4
|
+
* Deterministic (no LLM), the first leg of the component trio
|
|
5
|
+
* (9d-comp-walk → 9e-comp-annotate → 9f-comp-emit). Writes a corpus of
|
|
6
|
+
* un-headered component files to `.cairn/init/components/missing.jsonl`
|
|
7
|
+
* for the skill-driven annotate step to work from. Each record carries
|
|
8
|
+
* the best-effort detected export name (the likely `@cairn` value) and
|
|
9
|
+
* the workspace's category taxonomy so the annotator picks a valid
|
|
10
|
+
* `@category`.
|
|
11
|
+
*
|
|
12
|
+
* No-ops on self-adopt or when the project carries no `components:`
|
|
13
|
+
* config — those skip the WHOLE trio straight to `10-rules-merge`, so
|
|
14
|
+
* non-UI repos are untouched.
|
|
15
|
+
*/
|
|
16
|
+
import type { PhaseResult, PhaseState } from "./types.js";
|
|
17
|
+
export declare const COMP_MISSING_PATH: string;
|
|
18
|
+
export declare function runPhase9dCompWalk(state: PhaseState): Promise<PhaseResult>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 9d-comp-walk — list component files missing a `@cairn` header.
|
|
3
|
+
*
|
|
4
|
+
* Deterministic (no LLM), the first leg of the component trio
|
|
5
|
+
* (9d-comp-walk → 9e-comp-annotate → 9f-comp-emit). Writes a corpus of
|
|
6
|
+
* un-headered component files to `.cairn/init/components/missing.jsonl`
|
|
7
|
+
* for the skill-driven annotate step to work from. Each record carries
|
|
8
|
+
* the best-effort detected export name (the likely `@cairn` value) and
|
|
9
|
+
* the workspace's category taxonomy so the annotator picks a valid
|
|
10
|
+
* `@category`.
|
|
11
|
+
*
|
|
12
|
+
* No-ops on self-adopt or when the project carries no `components:`
|
|
13
|
+
* config — those skip the WHOLE trio straight to `10-rules-merge`, so
|
|
14
|
+
* non-UI repos are untouched.
|
|
15
|
+
*/
|
|
16
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { collectComponents, extractExportName, hasComponentConfig, loadComponentsConfig, } from "@isaacriehm/cairn-state";
|
|
19
|
+
import { advancePhase, isSelfAdoptState } from "./orchestrator.js";
|
|
20
|
+
export const COMP_MISSING_PATH = join(".cairn", "init", "components", "missing.jsonl");
|
|
21
|
+
/** Longest-prefix match of a repo-relative file to its owning workspace. */
|
|
22
|
+
function resolveWorkspace(file, config) {
|
|
23
|
+
let best = null;
|
|
24
|
+
let bestLen = -1;
|
|
25
|
+
for (const ws of config.workspaces) {
|
|
26
|
+
for (const d of ws.componentDirs) {
|
|
27
|
+
if ((file === d || file.startsWith(`${d}/`)) && d.length > bestLen) {
|
|
28
|
+
bestLen = d.length;
|
|
29
|
+
best = ws;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return best;
|
|
34
|
+
}
|
|
35
|
+
export async function runPhase9dCompWalk(state) {
|
|
36
|
+
// Skip the whole component trio for self-adopt / non-UI repos —
|
|
37
|
+
// jump currentPhase straight to 10-rules-merge so the skill loop
|
|
38
|
+
// never visits 9e / 9f.
|
|
39
|
+
const skipToRulesMerge = (out) => ({
|
|
40
|
+
status: "complete",
|
|
41
|
+
nextPhase: "10-rules-merge",
|
|
42
|
+
state: {
|
|
43
|
+
...state,
|
|
44
|
+
outputs: { ...state.outputs, "9d-comp-walk": out },
|
|
45
|
+
currentPhase: "10-rules-merge",
|
|
46
|
+
answer: undefined,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
if (isSelfAdoptState(state)) {
|
|
50
|
+
return skipToRulesMerge({ skipped: "self-adopt" });
|
|
51
|
+
}
|
|
52
|
+
const config = loadComponentsConfig(state.repoRoot);
|
|
53
|
+
if (!hasComponentConfig(config)) {
|
|
54
|
+
return skipToRulesMerge({ skipped: "no-components" });
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const { missing } = collectComponents(state.repoRoot, config);
|
|
58
|
+
const records = missing.map((file) => {
|
|
59
|
+
const ws = resolveWorkspace(file, config);
|
|
60
|
+
let exportName = null;
|
|
61
|
+
try {
|
|
62
|
+
exportName = extractExportName(readFileSync(join(state.repoRoot, file), "utf8"));
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
/* unreadable — leave null */
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
file,
|
|
69
|
+
workspace: ws?.name ?? "",
|
|
70
|
+
export_name: exportName,
|
|
71
|
+
categories: ws?.categories ?? [],
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
const dir = join(state.repoRoot, ".cairn", "init", "components");
|
|
75
|
+
mkdirSync(dir, { recursive: true });
|
|
76
|
+
const body = records.length > 0
|
|
77
|
+
? `${records.map((r) => JSON.stringify(r)).join("\n")}\n`
|
|
78
|
+
: "";
|
|
79
|
+
writeFileSync(join(dir, "missing.jsonl"), body, "utf8");
|
|
80
|
+
const out = {
|
|
81
|
+
missing_count: records.length,
|
|
82
|
+
corpus_path: COMP_MISSING_PATH,
|
|
83
|
+
};
|
|
84
|
+
const next = {
|
|
85
|
+
...state,
|
|
86
|
+
outputs: { ...state.outputs, "9d-comp-walk": out },
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
status: "complete",
|
|
90
|
+
nextPhase: "9e-comp-annotate",
|
|
91
|
+
state: advancePhase(next),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return {
|
|
96
|
+
status: "error",
|
|
97
|
+
error: {
|
|
98
|
+
code: "9d-comp-walk-failed",
|
|
99
|
+
message: "Component header walk failed",
|
|
100
|
+
detail: err instanceof Error ? err.stack ?? err.message : String(err),
|
|
101
|
+
},
|
|
102
|
+
state,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=9d-comp-walk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"9d-comp-walk.js","sourceRoot":"","sources":["../../../src/init/phases/9d-comp-walk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 9e-comp-annotate — skill-driven header annotation (confirm leg).
|
|
3
|
+
*
|
|
4
|
+
* The actual work runs in the cairn-adopt skill (Step 3.6): it reads
|
|
5
|
+
* the `.cairn/init/components/missing.jsonl` corpus from 9d-comp-walk
|
|
6
|
+
* and dispatches `component-annotator` subagents in parallel batches
|
|
7
|
+
* that write `@cairn` headers into the source files (per-batch
|
|
8
|
+
* operator consent, like Phase 12).
|
|
9
|
+
*
|
|
10
|
+
* This MCP runner is the state-machine bookkeeper. Unlike 9b-curate —
|
|
11
|
+
* which HARD-errors when its subagent output is missing — annotation is
|
|
12
|
+
* opportunistic: any file the operator declined or a subagent couldn't
|
|
13
|
+
* confidently header simply stays un-headered and surfaces as
|
|
14
|
+
* missing-header debt in 9f-comp-emit's attention baseline. So this
|
|
15
|
+
* runner is tolerant: it counts how many of the walk's files now carry
|
|
16
|
+
* a header and always advances.
|
|
17
|
+
*/
|
|
18
|
+
import type { PhaseResult, PhaseState } from "./types.js";
|
|
19
|
+
export declare function runPhase9eCompAnnotate(state: PhaseState): Promise<PhaseResult>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 9e-comp-annotate — skill-driven header annotation (confirm leg).
|
|
3
|
+
*
|
|
4
|
+
* The actual work runs in the cairn-adopt skill (Step 3.6): it reads
|
|
5
|
+
* the `.cairn/init/components/missing.jsonl` corpus from 9d-comp-walk
|
|
6
|
+
* and dispatches `component-annotator` subagents in parallel batches
|
|
7
|
+
* that write `@cairn` headers into the source files (per-batch
|
|
8
|
+
* operator consent, like Phase 12).
|
|
9
|
+
*
|
|
10
|
+
* This MCP runner is the state-machine bookkeeper. Unlike 9b-curate —
|
|
11
|
+
* which HARD-errors when its subagent output is missing — annotation is
|
|
12
|
+
* opportunistic: any file the operator declined or a subagent couldn't
|
|
13
|
+
* confidently header simply stays un-headered and surfaces as
|
|
14
|
+
* missing-header debt in 9f-comp-emit's attention baseline. So this
|
|
15
|
+
* runner is tolerant: it counts how many of the walk's files now carry
|
|
16
|
+
* a header and always advances.
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
19
|
+
import { join } from "node:path";
|
|
20
|
+
import { hasComponentConfig, loadComponentsConfig, parseComponentHeader, } from "@isaacriehm/cairn-state";
|
|
21
|
+
import { COMP_MISSING_PATH } from "./9d-comp-walk.js";
|
|
22
|
+
import { advancePhase, isSelfAdoptState } from "./orchestrator.js";
|
|
23
|
+
const NEXT_PHASE = "9f-comp-emit";
|
|
24
|
+
function complete(state, out) {
|
|
25
|
+
const next = {
|
|
26
|
+
...state,
|
|
27
|
+
outputs: { ...state.outputs, "9e-comp-annotate": out },
|
|
28
|
+
};
|
|
29
|
+
return { status: "complete", nextPhase: NEXT_PHASE, state: advancePhase(next) };
|
|
30
|
+
}
|
|
31
|
+
export async function runPhase9eCompAnnotate(state) {
|
|
32
|
+
if (isSelfAdoptState(state)) {
|
|
33
|
+
return complete(state, { skipped: "self-adopt" });
|
|
34
|
+
}
|
|
35
|
+
const config = loadComponentsConfig(state.repoRoot);
|
|
36
|
+
if (!hasComponentConfig(config)) {
|
|
37
|
+
return complete(state, { skipped: "no-components" });
|
|
38
|
+
}
|
|
39
|
+
const corpusAbs = join(state.repoRoot, COMP_MISSING_PATH);
|
|
40
|
+
if (!existsSync(corpusAbs)) {
|
|
41
|
+
return complete(state, { skipped: "nothing-missing" });
|
|
42
|
+
}
|
|
43
|
+
let annotated = 0;
|
|
44
|
+
let stillMissing = 0;
|
|
45
|
+
try {
|
|
46
|
+
const text = readFileSync(corpusAbs, "utf8");
|
|
47
|
+
for (const line of text.split("\n")) {
|
|
48
|
+
const trimmed = line.trim();
|
|
49
|
+
if (trimmed.length === 0)
|
|
50
|
+
continue;
|
|
51
|
+
let rec;
|
|
52
|
+
try {
|
|
53
|
+
rec = JSON.parse(trimmed);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (typeof rec.file !== "string")
|
|
59
|
+
continue;
|
|
60
|
+
let hasHeader = false;
|
|
61
|
+
try {
|
|
62
|
+
hasHeader =
|
|
63
|
+
parseComponentHeader(readFileSync(join(state.repoRoot, rec.file), "utf8")) !== null;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
/* file gone / unreadable → counts as still missing */
|
|
67
|
+
}
|
|
68
|
+
if (hasHeader)
|
|
69
|
+
annotated += 1;
|
|
70
|
+
else
|
|
71
|
+
stillMissing += 1;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
return {
|
|
76
|
+
status: "error",
|
|
77
|
+
error: {
|
|
78
|
+
code: "9e-comp-annotate-failed",
|
|
79
|
+
message: "Failed to read the component annotation corpus",
|
|
80
|
+
detail: err instanceof Error ? err.stack ?? err.message : String(err),
|
|
81
|
+
},
|
|
82
|
+
state,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (annotated + stillMissing === 0) {
|
|
86
|
+
return complete(state, { skipped: "nothing-missing" });
|
|
87
|
+
}
|
|
88
|
+
return complete(state, { annotated, still_missing: stillMissing });
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=9e-comp-annotate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"9e-comp-annotate.js","sourceRoot":"","sources":["../../../src/init/phases/9e-comp-annotate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 9f-comp-emit — build the component store at adoption.
|
|
3
|
+
*
|
|
4
|
+
* Deterministic (no LLM), the final leg of the component trio
|
|
5
|
+
* (9d-comp-walk → 9e-comp-annotate → 9f-comp-emit). No-ops on
|
|
6
|
+
* self-adopt or when the project carries no `components:` config, so
|
|
7
|
+
* non-UI repos flow straight through. Otherwise, now that 9e has had a
|
|
8
|
+
* chance to annotate source headers:
|
|
9
|
+
*
|
|
10
|
+
* 1. Build the derived index under `.cairn/ground/components/`.
|
|
11
|
+
* 2. Promote every `@singleton` header to a §INV ledger entry
|
|
12
|
+
* (verbatim auto-accept, like 9c-emit — the rule is mechanical;
|
|
13
|
+
* "exists exactly once" is enforced by the check's duplicate-name
|
|
14
|
+
* gate, not a generic assertion).
|
|
15
|
+
* 3. Run the advisory audit + collect any still-missing-header debt
|
|
16
|
+
* and write both to a baseline file the cairn-attention skill
|
|
17
|
+
* triages.
|
|
18
|
+
*
|
|
19
|
+
* Advisory vs gate stays unblurred (port invariant 5): nothing here
|
|
20
|
+
* blocks. The audit + missing headers are surfaced for triage; the
|
|
21
|
+
* daily-flow check is the gate.
|
|
22
|
+
*/
|
|
23
|
+
import type { PhaseResult, PhaseState } from "./types.js";
|
|
24
|
+
export declare function runPhase9fCompEmit(state: PhaseState): Promise<PhaseResult>;
|