@isaacriehm/cairn-core 0.7.3 → 0.9.1
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/doctor/index.js +57 -0
- package/dist/doctor/index.js.map +1 -1
- package/dist/gc/citation-integrity.js +3 -1
- package/dist/gc/citation-integrity.js.map +1 -1
- package/dist/gc/doc-claims.d.ts +31 -0
- package/dist/gc/doc-claims.js +213 -0
- package/dist/gc/doc-claims.js.map +1 -0
- package/dist/gc/doc-source-drift.d.ts +31 -0
- package/dist/gc/doc-source-drift.js +190 -0
- package/dist/gc/doc-source-drift.js.map +1 -0
- package/dist/gc/index.d.ts +4 -0
- package/dist/gc/index.js +2 -0
- package/dist/gc/index.js.map +1 -1
- package/dist/gc/sweep.js +18 -0
- package/dist/gc/sweep.js.map +1 -1
- package/dist/gc/types.d.ts +2 -2
- package/dist/hooks/runners/context-threshold.d.ts +63 -0
- package/dist/hooks/runners/context-threshold.js +179 -0
- package/dist/hooks/runners/context-threshold.js.map +1 -0
- package/dist/hooks/runners/gc-autotrigger.d.ts +49 -0
- package/dist/hooks/runners/gc-autotrigger.js +87 -0
- package/dist/hooks/runners/gc-autotrigger.js.map +1 -0
- package/dist/hooks/runners/index.d.ts +2 -0
- package/dist/hooks/runners/index.js +1 -0
- package/dist/hooks/runners/index.js.map +1 -1
- package/dist/hooks/runners/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 +157 -9
- package/dist/hooks/runners/session-start.js.map +1 -1
- package/dist/hooks/runners/stop.js +119 -0
- package/dist/hooks/runners/stop.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 +8 -3
- package/dist/init/index.js +4 -1
- package/dist/init/index.js.map +1 -1
- package/dist/init/ingest-docs.d.ts +6 -1
- package/dist/init/ingest-docs.js.map +1 -1
- package/dist/init/init.js +15 -26
- 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 +20 -12
- 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/1-detect.d.ts +17 -4
- package/dist/init/phases/1-detect.js +48 -4
- package/dist/init/phases/1-detect.js.map +1 -1
- package/dist/init/phases/10-rules-merge.d.ts +7 -2
- package/dist/init/phases/10-rules-merge.js +17 -32
- package/dist/init/phases/10-rules-merge.js.map +1 -1
- package/dist/init/phases/11-baseline.js.map +1 -1
- package/dist/init/phases/12-strip.js +14 -1
- package/dist/init/phases/12-strip.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/3-mapper.js.map +1 -1
- package/dist/init/phases/4-seed.js +2 -3
- 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/6-brand.js +2 -4
- package/dist/init/phases/6-brand.js.map +1 -1
- 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 +16 -43
- 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.d.ts +10 -0
- package/dist/init/phases/orchestrator.js +13 -1
- package/dist/init/phases/orchestrator.js.map +1 -1
- package/dist/init/phases/state-io.js +1 -1
- package/dist/init/phases/types.d.ts +115 -9
- package/dist/init/phases/types.js +4 -2
- package/dist/init/phases/types.js.map +1 -1
- package/dist/init/post-git-init.d.ts +53 -0
- package/dist/init/post-git-init.js +74 -0
- package/dist/init/post-git-init.js.map +1 -0
- package/dist/init/preflight-guards.d.ts +11 -2
- package/dist/init/preflight-guards.js +27 -5
- package/dist/init/preflight-guards.js.map +1 -1
- package/dist/init/rules-merge/index.d.ts +1 -1
- package/dist/init/rules-merge/ingest.d.ts +6 -1
- package/dist/init/rules-merge/ingest.js.map +1 -1
- package/dist/init/skill-budget.d.ts +39 -0
- package/dist/init/skill-budget.js +99 -0
- package/dist/init/skill-budget.js.map +1 -0
- 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/types.d.ts +9 -0
- 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/bootstrap-guard.js +2 -2
- package/dist/mcp/bootstrap-guard.js.map +1 -1
- package/dist/mcp/schemas.d.ts +34 -0
- package/dist/mcp/schemas.js +50 -0
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/telemetry.d.ts +1 -1
- package/dist/mcp/tools/bootstrap-retry.d.ts +23 -0
- package/dist/mcp/tools/bootstrap-retry.js +53 -0
- package/dist/mcp/tools/bootstrap-retry.js.map +1 -0
- 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/index.js +10 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init-phases.d.ts +7 -6
- package/dist/mcp/tools/init-phases.js +36 -65
- package/dist/mcp/tools/init-phases.js.map +1 -1
- package/dist/mcp/tools/resume.d.ts +21 -0
- package/dist/mcp/tools/resume.js +88 -0
- package/dist/mcp/tools/resume.js.map +1 -0
- package/dist/mcp/tools/task-complete.d.ts +23 -0
- package/dist/mcp/tools/task-complete.js +51 -0
- package/dist/mcp/tools/task-complete.js.map +1 -0
- package/dist/mcp/tools/task-create.js +17 -11
- package/dist/mcp/tools/task-create.js.map +1 -1
- package/dist/mcp/tools/task-journal-append.d.ts +22 -0
- package/dist/mcp/tools/task-journal-append.js +44 -0
- package/dist/mcp/tools/task-journal-append.js.map +1 -0
- package/dist/paths/index.js +1 -1
- package/dist/paths/index.js.map +1 -1
- package/dist/status-line/format.js +20 -0
- package/dist/status-line/format.js.map +1 -1
- package/dist/tasks/index.d.ts +2 -0
- package/dist/tasks/index.js +2 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/lifecycle.d.ts +107 -0
- package/dist/tasks/lifecycle.js +302 -0
- package/dist/tasks/lifecycle.js.map +1 -0
- package/dist/trace/index.d.ts +1 -1
- package/dist/trace/index.js +2 -2
- package/dist/trace/index.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 -55
- 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 -172
- package/dist/init/phases/parallel-8910.js.map +0 -1
- package/dist/init/phases/source-comments-output-io.d.ts +0 -84
- 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
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Curator pipeline — Phase 9a-walker top-level (v0.9.0).
|
|
3
|
+
*
|
|
4
|
+
* Builds the unified corpus by running three sub-walkers:
|
|
5
|
+
*
|
|
6
|
+
* - Source comments (existing `walkSourceComments`) — essay-class
|
|
7
|
+
* block comments per source file
|
|
8
|
+
* - Doc paragraphs (existing `discoverDocs` + paragraph splitter)
|
|
9
|
+
* — README + docs/**\/*.md paragraphs ≥80 chars
|
|
10
|
+
* - Rule sections (existing `discoverRuleSources` +
|
|
11
|
+
* `parseRuleSections`) — H2/H3 sections from CLAUDE.md /
|
|
12
|
+
* AGENTS.md / .claude/rules/**\/*.md
|
|
13
|
+
*
|
|
14
|
+
* Each candidate runs through the regex pre-filter (`regex-prefilter.ts`)
|
|
15
|
+
* which drops 60-80% of raw blocks (test files, JSX comments, license
|
|
16
|
+
* headers, JSDoc with only @tags, etc.). Survivors get written to
|
|
17
|
+
* `.cairn/init/curator/corpus.jsonl` and packed into shards capped
|
|
18
|
+
* at 120k input tokens (`shards.json`).
|
|
19
|
+
*/
|
|
20
|
+
import { createHash } from "node:crypto";
|
|
21
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
import { walkSourceComments } from "../source-comments/walker.js";
|
|
24
|
+
import { discoverRuleSources } from "../rules-merge/discover.js";
|
|
25
|
+
import { parseRuleSections } from "../rules-merge/parse-sections.js";
|
|
26
|
+
import { applyPrefilter, } from "./regex-prefilter.js";
|
|
27
|
+
import { packShards, writeCorpus, writeShards, } from "./corpus.js";
|
|
28
|
+
import { walkFs } from "@isaacriehm/cairn-state";
|
|
29
|
+
import { readMapperOutputFile } from "../phases/mapper-output-io.js";
|
|
30
|
+
const MIN_DOC_PARAGRAPH_CHARS = 80;
|
|
31
|
+
const SOURCE_FILE_CAP = 5_000;
|
|
32
|
+
const SKIP_DIRS = new Set([
|
|
33
|
+
".git",
|
|
34
|
+
"node_modules",
|
|
35
|
+
"dist",
|
|
36
|
+
"build",
|
|
37
|
+
"target",
|
|
38
|
+
"out",
|
|
39
|
+
".next",
|
|
40
|
+
".turbo",
|
|
41
|
+
".cairn",
|
|
42
|
+
]);
|
|
43
|
+
export async function runCuratorWalker(args) {
|
|
44
|
+
const { repoRoot } = args;
|
|
45
|
+
const offLimitsGlobs = loadOffLimitsGlobs(repoRoot);
|
|
46
|
+
const moduleFlagsByPrefix = loadModuleFlags(repoRoot);
|
|
47
|
+
const dropped = {
|
|
48
|
+
"test-file": 0,
|
|
49
|
+
"generated-dir": 0,
|
|
50
|
+
"archive-dir": 0,
|
|
51
|
+
"off-limits-glob": 0,
|
|
52
|
+
"jsx-block-comment": 0,
|
|
53
|
+
"license-header": 0,
|
|
54
|
+
"jsdoc-tag-only": 0,
|
|
55
|
+
"todo-or-banner-only": 0,
|
|
56
|
+
"below-minimum-prose": 0,
|
|
57
|
+
};
|
|
58
|
+
const records = [];
|
|
59
|
+
// ── 1. Source-comment sub-walker ──────────────────────────────────
|
|
60
|
+
const commentWalk = walkSourceComments({
|
|
61
|
+
repoRoot,
|
|
62
|
+
fileCap: SOURCE_FILE_CAP,
|
|
63
|
+
});
|
|
64
|
+
for (const block of commentWalk.blocks) {
|
|
65
|
+
const result = applyPrefilter({
|
|
66
|
+
file: block.file,
|
|
67
|
+
source_kind: "comment",
|
|
68
|
+
prose: block.prose,
|
|
69
|
+
raw: block.raw,
|
|
70
|
+
offLimitsGlobs,
|
|
71
|
+
});
|
|
72
|
+
if (result.drop) {
|
|
73
|
+
dropped[result.reason] += 1;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const moduleSlug = moduleSlugForFile(block.file);
|
|
77
|
+
const enclosing = detectEnclosingSymbol(repoRoot, block.file, block.endOffset);
|
|
78
|
+
const record = {
|
|
79
|
+
comment_id: shortHash(`${block.file}:${block.startLine}-${block.endLine}`),
|
|
80
|
+
source_kind: "comment",
|
|
81
|
+
file: block.file,
|
|
82
|
+
module: moduleSlug,
|
|
83
|
+
lang: block.lang,
|
|
84
|
+
prose_clean: result.cleanedProse,
|
|
85
|
+
nearby_imports: detectNearbyImports(repoRoot, block.file),
|
|
86
|
+
module_flags: moduleFlagsByPrefix[moduleSlug] ?? [],
|
|
87
|
+
line_range: [block.startLine, block.endLine],
|
|
88
|
+
};
|
|
89
|
+
if (enclosing !== undefined)
|
|
90
|
+
record.enclosing_symbol = enclosing;
|
|
91
|
+
records.push(record);
|
|
92
|
+
}
|
|
93
|
+
// ── 2. Doc-paragraph sub-walker ───────────────────────────────────
|
|
94
|
+
for (const doc of discoverDocsForCurator(repoRoot)) {
|
|
95
|
+
let raw;
|
|
96
|
+
try {
|
|
97
|
+
raw = readFileSync(join(repoRoot, doc), "utf8");
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const paragraphs = splitMarkdownParagraphs(raw);
|
|
103
|
+
let lineCursor = 1;
|
|
104
|
+
for (const p of paragraphs) {
|
|
105
|
+
const startLine = lineCursor;
|
|
106
|
+
const endLine = startLine + countNewlines(p) - 1;
|
|
107
|
+
lineCursor = endLine + 2; // +1 for the trailing newline + 1 blank-line separator
|
|
108
|
+
if (p.length < MIN_DOC_PARAGRAPH_CHARS)
|
|
109
|
+
continue;
|
|
110
|
+
const result = applyPrefilter({
|
|
111
|
+
file: doc,
|
|
112
|
+
source_kind: "doc",
|
|
113
|
+
prose: p,
|
|
114
|
+
offLimitsGlobs,
|
|
115
|
+
});
|
|
116
|
+
if (result.drop) {
|
|
117
|
+
dropped[result.reason] += 1;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const moduleSlug = "docs";
|
|
121
|
+
records.push({
|
|
122
|
+
comment_id: shortHash(`${doc}:${startLine}-${endLine}`),
|
|
123
|
+
source_kind: "doc",
|
|
124
|
+
file: doc,
|
|
125
|
+
module: moduleSlug,
|
|
126
|
+
lang: "md",
|
|
127
|
+
prose_clean: result.cleanedProse,
|
|
128
|
+
line_range: [startLine, endLine],
|
|
129
|
+
module_flags: moduleFlagsByPrefix[moduleSlug] ?? [],
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// ── 3. Rule-section sub-walker ────────────────────────────────────
|
|
134
|
+
for (const ruleFile of discoverRuleSources(repoRoot)) {
|
|
135
|
+
let raw;
|
|
136
|
+
try {
|
|
137
|
+
raw = readFileSync(ruleFile.absPath, "utf8");
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const sections = parseRuleSections(raw);
|
|
143
|
+
for (const sec of sections) {
|
|
144
|
+
// Preamble (level 0) is the first slab before any heading; rare
|
|
145
|
+
// to carry a real decision and often boilerplate. Skip.
|
|
146
|
+
if (sec.level === 0)
|
|
147
|
+
continue;
|
|
148
|
+
// Honor operator-protected `<!-- cairn:keep --> ` blocks — those
|
|
149
|
+
// are deliberately kept untouched.
|
|
150
|
+
if (sec.protectedByKeepMarker)
|
|
151
|
+
continue;
|
|
152
|
+
const startLine = lineFromOffset(raw, sec.startOffset);
|
|
153
|
+
const endLine = startLine + countNewlines(sec.body) - 1;
|
|
154
|
+
const result = applyPrefilter({
|
|
155
|
+
file: ruleFile.path,
|
|
156
|
+
source_kind: "rule",
|
|
157
|
+
prose: sec.body,
|
|
158
|
+
offLimitsGlobs,
|
|
159
|
+
});
|
|
160
|
+
if (result.drop) {
|
|
161
|
+
dropped[result.reason] += 1;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const moduleSlug = "rules";
|
|
165
|
+
records.push({
|
|
166
|
+
comment_id: shortHash(`${ruleFile.path}:${startLine}-${endLine}`),
|
|
167
|
+
source_kind: "rule",
|
|
168
|
+
file: ruleFile.path,
|
|
169
|
+
module: moduleSlug,
|
|
170
|
+
lang: "md",
|
|
171
|
+
prose_clean: result.cleanedProse,
|
|
172
|
+
line_range: [startLine, endLine],
|
|
173
|
+
module_flags: moduleFlagsByPrefix[moduleSlug] ?? [],
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// ── 4. Persist corpus + shards ────────────────────────────────────
|
|
178
|
+
const corpus = writeCorpus(repoRoot, records);
|
|
179
|
+
const plan = packShards(records);
|
|
180
|
+
const shardsPath = writeShards(repoRoot, plan);
|
|
181
|
+
return {
|
|
182
|
+
corpus_path: corpus.corpus_path,
|
|
183
|
+
shards_path: shardsPath,
|
|
184
|
+
records_total: corpus.records_total,
|
|
185
|
+
records_by_kind: corpus.records_by_kind,
|
|
186
|
+
dropped,
|
|
187
|
+
shards: plan.shards.length,
|
|
188
|
+
total_input_tokens_estimate: plan.total_input_tokens_estimate,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/* -------------------------------------------------------------------------- */
|
|
192
|
+
/* Helpers — module / docs / rules / off-limits */
|
|
193
|
+
/* -------------------------------------------------------------------------- */
|
|
194
|
+
function moduleSlugForFile(file) {
|
|
195
|
+
// Top-level dir wins; if path has no dir, use "(root)".
|
|
196
|
+
const idx = file.indexOf("/");
|
|
197
|
+
if (idx === -1)
|
|
198
|
+
return "(root)";
|
|
199
|
+
return file.slice(0, idx);
|
|
200
|
+
}
|
|
201
|
+
function loadOffLimitsGlobs(repoRoot) {
|
|
202
|
+
const mapperOut = readMapperOutputFile(repoRoot);
|
|
203
|
+
const fromMapper = mapperOut?.output.off_limits_globs;
|
|
204
|
+
if (Array.isArray(fromMapper))
|
|
205
|
+
return fromMapper;
|
|
206
|
+
return [];
|
|
207
|
+
}
|
|
208
|
+
function loadModuleFlags(repoRoot) {
|
|
209
|
+
const mapperOut = readMapperOutputFile(repoRoot);
|
|
210
|
+
const km = mapperOut?.output.key_modules;
|
|
211
|
+
if (!Array.isArray(km))
|
|
212
|
+
return {};
|
|
213
|
+
const out = {};
|
|
214
|
+
for (const m of km) {
|
|
215
|
+
if (typeof m !== "object" || m === null)
|
|
216
|
+
continue;
|
|
217
|
+
const slug = m.slug;
|
|
218
|
+
const flags = m.flags;
|
|
219
|
+
if (typeof slug === "string" && Array.isArray(flags)) {
|
|
220
|
+
out[slug] = flags.filter((f) => typeof f === "string");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return out;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Doc-walker for curator. Includes README + every .md under `docs/`,
|
|
227
|
+
* skipping `.archive/`, `.planning/archive/`, and the standard
|
|
228
|
+
* generated-output dirs. Mirrors `discoverDocs` but adds the README at
|
|
229
|
+
* the repo root and tolerates missing `docs/` dirs gracefully.
|
|
230
|
+
*/
|
|
231
|
+
function discoverDocsForCurator(repoRoot) {
|
|
232
|
+
const out = [];
|
|
233
|
+
for (const top of ["README.md", "README", "Readme.md"]) {
|
|
234
|
+
if (existsSync(join(repoRoot, top))) {
|
|
235
|
+
out.push(top);
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const docsDir = join(repoRoot, "docs");
|
|
240
|
+
if (existsSync(docsDir)) {
|
|
241
|
+
walkFs({
|
|
242
|
+
dir: docsDir,
|
|
243
|
+
repoRoot,
|
|
244
|
+
onDir: (_rel, _abs, ent) => {
|
|
245
|
+
if (ent.name.startsWith("."))
|
|
246
|
+
return false;
|
|
247
|
+
if (SKIP_DIRS.has(ent.name))
|
|
248
|
+
return false;
|
|
249
|
+
return true;
|
|
250
|
+
},
|
|
251
|
+
onFile: (rel, abs, ent) => {
|
|
252
|
+
if (!ent.name.endsWith(".md"))
|
|
253
|
+
return;
|
|
254
|
+
// Drop .archive/ or .planning/archive/ paths.
|
|
255
|
+
if (/(?:^|\/)(?:\.archive|\.planning\/archive)\//.test(rel))
|
|
256
|
+
return;
|
|
257
|
+
try {
|
|
258
|
+
statSync(abs);
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
out.push(rel);
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
return out;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Split markdown into paragraphs on blank-line boundaries. Headings
|
|
271
|
+
* become standalone paragraphs (the heading line itself + nothing
|
|
272
|
+
* else), so the prefilter's "below-minimum-prose" rule sweeps them
|
|
273
|
+
* out. Code fences stay as one paragraph each.
|
|
274
|
+
*/
|
|
275
|
+
function splitMarkdownParagraphs(raw) {
|
|
276
|
+
const out = [];
|
|
277
|
+
const lines = raw.split("\n");
|
|
278
|
+
let buffer = [];
|
|
279
|
+
let inFence = false;
|
|
280
|
+
const flush = () => {
|
|
281
|
+
if (buffer.length === 0)
|
|
282
|
+
return;
|
|
283
|
+
const joined = buffer.join("\n").trim();
|
|
284
|
+
if (joined.length > 0)
|
|
285
|
+
out.push(joined);
|
|
286
|
+
buffer = [];
|
|
287
|
+
};
|
|
288
|
+
for (const line of lines) {
|
|
289
|
+
if (/^\s*```/.test(line)) {
|
|
290
|
+
buffer.push(line);
|
|
291
|
+
inFence = !inFence;
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
if (!inFence && line.trim().length === 0) {
|
|
295
|
+
flush();
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
buffer.push(line);
|
|
299
|
+
}
|
|
300
|
+
flush();
|
|
301
|
+
return out;
|
|
302
|
+
}
|
|
303
|
+
function countNewlines(s) {
|
|
304
|
+
let n = 1;
|
|
305
|
+
for (let i = 0; i < s.length; i++) {
|
|
306
|
+
if (s[i] === "\n")
|
|
307
|
+
n += 1;
|
|
308
|
+
}
|
|
309
|
+
return n;
|
|
310
|
+
}
|
|
311
|
+
function lineFromOffset(raw, offset) {
|
|
312
|
+
let line = 1;
|
|
313
|
+
const cap = Math.min(offset, raw.length);
|
|
314
|
+
for (let i = 0; i < cap; i++) {
|
|
315
|
+
if (raw[i] === "\n")
|
|
316
|
+
line += 1;
|
|
317
|
+
}
|
|
318
|
+
return line;
|
|
319
|
+
}
|
|
320
|
+
function shortHash(seed) {
|
|
321
|
+
return createHash("sha256").update(seed).digest("hex").slice(0, 7);
|
|
322
|
+
}
|
|
323
|
+
/* -------------------------------------------------------------------------- */
|
|
324
|
+
/* Source-comment context heuristics */
|
|
325
|
+
/* -------------------------------------------------------------------------- */
|
|
326
|
+
/**
|
|
327
|
+
* Best-effort enclosing-symbol detection. After the comment block ends,
|
|
328
|
+
* scan up to 4 lines forward for the first JS/TS/Python/Rust/Go-style
|
|
329
|
+
* declaration. Returns undefined when nothing matches; the curator
|
|
330
|
+
* subagent treats absence as "anonymous block".
|
|
331
|
+
*/
|
|
332
|
+
function detectEnclosingSymbol(repoRoot, file, endOffset) {
|
|
333
|
+
let raw;
|
|
334
|
+
try {
|
|
335
|
+
raw = readFileSync(join(repoRoot, file), "utf8");
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
return undefined;
|
|
339
|
+
}
|
|
340
|
+
const tail = raw.slice(endOffset, endOffset + 800);
|
|
341
|
+
const lines = tail.split("\n").slice(0, 4);
|
|
342
|
+
for (const line of lines) {
|
|
343
|
+
const m = line.match(/^\s*(?:export\s+)?(?:async\s+)?(?:function|class|interface|type|const|let|var|enum|namespace)\s+([A-Za-z_$][\w$]*)/) ??
|
|
344
|
+
line.match(/^\s*(?:def|fn|func)\s+([A-Za-z_][\w]*)/) ??
|
|
345
|
+
line.match(/^\s*(?:struct|impl|trait)\s+([A-Za-z_][\w]*)/);
|
|
346
|
+
if (m && m[1])
|
|
347
|
+
return m[1];
|
|
348
|
+
}
|
|
349
|
+
return undefined;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Top-of-file imports — first 30 lines. Heuristic narrative for the
|
|
353
|
+
* curator subagent ("this module imports X — likely a Y handler").
|
|
354
|
+
*/
|
|
355
|
+
function detectNearbyImports(repoRoot, file) {
|
|
356
|
+
let raw;
|
|
357
|
+
try {
|
|
358
|
+
raw = readFileSync(join(repoRoot, file), "utf8");
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
return [];
|
|
362
|
+
}
|
|
363
|
+
const head = raw.split("\n").slice(0, 30);
|
|
364
|
+
const out = [];
|
|
365
|
+
for (const line of head) {
|
|
366
|
+
const js = line.match(/^\s*import\s+(?:[\w{},*\s]+\s+from\s+)?["']([^"']+)["']/);
|
|
367
|
+
if (js && js[1])
|
|
368
|
+
out.push(js[1]);
|
|
369
|
+
const py = line.match(/^\s*(?:from\s+(\S+)\s+import|import\s+(\S+))/);
|
|
370
|
+
if (py) {
|
|
371
|
+
const mod = py[1] ?? py[2];
|
|
372
|
+
if (mod)
|
|
373
|
+
out.push(mod);
|
|
374
|
+
}
|
|
375
|
+
if (out.length >= 8)
|
|
376
|
+
break;
|
|
377
|
+
}
|
|
378
|
+
return out;
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=walker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walker.js","sourceRoot":"","sources":["../../../src/init/curator/walker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ETA calibration cache for the init pipeline's long Haiku phases.
|
|
3
|
+
*
|
|
4
|
+
* Lives at `~/.cairn/cache/eta-calibration.json`, shared across every
|
|
5
|
+
* project the operator adopts on this machine. Each entry is a rolling
|
|
6
|
+
* `secondsPerUnit` average for one of the long phases — pre-flight
|
|
7
|
+
* uses these to convert unit counts (paragraphs, comment blocks, etc.)
|
|
8
|
+
* into a wall-clock estimate before the operator commits, then each
|
|
9
|
+
* completed phase writes its measured rate back via EWMA so the cache
|
|
10
|
+
* compounds accuracy across runs and as the underlying model speeds
|
|
11
|
+
* up.
|
|
12
|
+
*
|
|
13
|
+
* Defaults shipped here are calibrated against Haiku at the time of
|
|
14
|
+
* writing; first-run estimates use them, subsequent runs use the
|
|
15
|
+
* operator's own measurements.
|
|
16
|
+
*/
|
|
17
|
+
export type EtaPhase = "7-topic-index" | "8-docs-ingest" | "9-source-comments" | "10-rules-merge";
|
|
18
|
+
export interface PhaseCalibration {
|
|
19
|
+
/** Wall-clock seconds per unit, averaged across recent runs. */
|
|
20
|
+
secondsPerUnit: number;
|
|
21
|
+
/** Total samples folded into the EWMA so far. */
|
|
22
|
+
samples: number;
|
|
23
|
+
}
|
|
24
|
+
export interface CalibrationCache {
|
|
25
|
+
version: 1;
|
|
26
|
+
phases: Record<EtaPhase, PhaseCalibration>;
|
|
27
|
+
}
|
|
28
|
+
export declare function defaultCache(): CalibrationCache;
|
|
29
|
+
export declare function readCalibration(): CalibrationCache;
|
|
30
|
+
/**
|
|
31
|
+
* Fold a measured `seconds / units` rate back into the calibration
|
|
32
|
+
* cache for `phase`. Uses an EWMA with a warm-up alpha for the first
|
|
33
|
+
* few samples so a fresh cache converges fast.
|
|
34
|
+
*/
|
|
35
|
+
export declare function recordSample(args: {
|
|
36
|
+
phase: EtaPhase;
|
|
37
|
+
units: number;
|
|
38
|
+
durationMs: number;
|
|
39
|
+
}): void;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ETA calibration cache for the init pipeline's long Haiku phases.
|
|
3
|
+
*
|
|
4
|
+
* Lives at `~/.cairn/cache/eta-calibration.json`, shared across every
|
|
5
|
+
* project the operator adopts on this machine. Each entry is a rolling
|
|
6
|
+
* `secondsPerUnit` average for one of the long phases — pre-flight
|
|
7
|
+
* uses these to convert unit counts (paragraphs, comment blocks, etc.)
|
|
8
|
+
* into a wall-clock estimate before the operator commits, then each
|
|
9
|
+
* completed phase writes its measured rate back via EWMA so the cache
|
|
10
|
+
* compounds accuracy across runs and as the underlying model speeds
|
|
11
|
+
* up.
|
|
12
|
+
*
|
|
13
|
+
* Defaults shipped here are calibrated against Haiku at the time of
|
|
14
|
+
* writing; first-run estimates use them, subsequent runs use the
|
|
15
|
+
* operator's own measurements.
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from "node:fs";
|
|
18
|
+
import { homedir } from "node:os";
|
|
19
|
+
import { join } from "node:path";
|
|
20
|
+
import { logger } from "../logger.js";
|
|
21
|
+
const log = logger("init.eta-calibration");
|
|
22
|
+
/**
|
|
23
|
+
* Shipped defaults. Each `secondsPerUnit` is the time it takes to
|
|
24
|
+
* process one "primary unit" of the phase, with the phase's internal
|
|
25
|
+
* concurrency already baked in (so callers multiply units × rate
|
|
26
|
+
* without re-applying the parallelism factor).
|
|
27
|
+
*
|
|
28
|
+
* Units per phase:
|
|
29
|
+
* - 7-topic-index → Jaccard-filtered pair-judge calls
|
|
30
|
+
* - 8-docs-ingest → markdown paragraphs scanned
|
|
31
|
+
* - 9-source-comments → essay-class comment blocks classified
|
|
32
|
+
* - 10-rules-merge → H2/H3 sections across rule files
|
|
33
|
+
*/
|
|
34
|
+
const DEFAULT_SECONDS_PER_UNIT = {
|
|
35
|
+
"7-topic-index": 0.6,
|
|
36
|
+
"8-docs-ingest": 0.1,
|
|
37
|
+
"9-source-comments": 0.75,
|
|
38
|
+
"10-rules-merge": 0.6,
|
|
39
|
+
};
|
|
40
|
+
/** Minimum-sample EWMA — heavier weight on recent samples until the cache warms. */
|
|
41
|
+
const ALPHA_WARMUP = 0.3;
|
|
42
|
+
const ALPHA_STEADY = 0.1;
|
|
43
|
+
const WARMUP_SAMPLES = 5;
|
|
44
|
+
function calibrationDir() {
|
|
45
|
+
return join(homedir(), ".cairn", "cache");
|
|
46
|
+
}
|
|
47
|
+
function calibrationPath() {
|
|
48
|
+
return join(calibrationDir(), "eta-calibration.json");
|
|
49
|
+
}
|
|
50
|
+
export function defaultCache() {
|
|
51
|
+
return {
|
|
52
|
+
version: 1,
|
|
53
|
+
phases: {
|
|
54
|
+
"7-topic-index": {
|
|
55
|
+
secondsPerUnit: DEFAULT_SECONDS_PER_UNIT["7-topic-index"],
|
|
56
|
+
samples: 0,
|
|
57
|
+
},
|
|
58
|
+
"8-docs-ingest": {
|
|
59
|
+
secondsPerUnit: DEFAULT_SECONDS_PER_UNIT["8-docs-ingest"],
|
|
60
|
+
samples: 0,
|
|
61
|
+
},
|
|
62
|
+
"9-source-comments": {
|
|
63
|
+
secondsPerUnit: DEFAULT_SECONDS_PER_UNIT["9-source-comments"],
|
|
64
|
+
samples: 0,
|
|
65
|
+
},
|
|
66
|
+
"10-rules-merge": {
|
|
67
|
+
secondsPerUnit: DEFAULT_SECONDS_PER_UNIT["10-rules-merge"],
|
|
68
|
+
samples: 0,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export function readCalibration() {
|
|
74
|
+
const path = calibrationPath();
|
|
75
|
+
if (!existsSync(path))
|
|
76
|
+
return defaultCache();
|
|
77
|
+
try {
|
|
78
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
79
|
+
if (typeof parsed !== "object" ||
|
|
80
|
+
parsed === null ||
|
|
81
|
+
parsed["version"] !== 1) {
|
|
82
|
+
return defaultCache();
|
|
83
|
+
}
|
|
84
|
+
const fresh = defaultCache();
|
|
85
|
+
const phases = parsed.phases ?? {};
|
|
86
|
+
for (const id of Object.keys(fresh.phases)) {
|
|
87
|
+
const raw = phases[id];
|
|
88
|
+
if (typeof raw === "object" &&
|
|
89
|
+
raw !== null &&
|
|
90
|
+
typeof raw.secondsPerUnit === "number" &&
|
|
91
|
+
typeof raw.samples === "number" &&
|
|
92
|
+
raw.secondsPerUnit > 0) {
|
|
93
|
+
fresh.phases[id] = {
|
|
94
|
+
secondsPerUnit: raw.secondsPerUnit,
|
|
95
|
+
samples: Math.max(0, Math.floor(raw.samples)),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return fresh;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
log.warn({ err: String(err) }, "calibration cache unreadable; using defaults");
|
|
103
|
+
return defaultCache();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function writeCalibration(cache) {
|
|
107
|
+
const path = calibrationPath();
|
|
108
|
+
mkdirSync(calibrationDir(), { recursive: true });
|
|
109
|
+
const tmp = `${path}.tmp`;
|
|
110
|
+
writeFileSync(tmp, JSON.stringify(cache, null, 2), "utf8");
|
|
111
|
+
renameSync(tmp, path);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Fold a measured `seconds / units` rate back into the calibration
|
|
115
|
+
* cache for `phase`. Uses an EWMA with a warm-up alpha for the first
|
|
116
|
+
* few samples so a fresh cache converges fast.
|
|
117
|
+
*/
|
|
118
|
+
export function recordSample(args) {
|
|
119
|
+
if (args.units <= 0 || args.durationMs <= 0)
|
|
120
|
+
return;
|
|
121
|
+
const sample = args.durationMs / 1000 / args.units;
|
|
122
|
+
// Guard against extreme outliers (cold cache, network blip). Cap the
|
|
123
|
+
// sample at 10× the prior rate so a single bad run can't poison the
|
|
124
|
+
// estimate.
|
|
125
|
+
const cache = readCalibration();
|
|
126
|
+
const prior = cache.phases[args.phase];
|
|
127
|
+
const cappedSample = Math.min(sample, prior.secondsPerUnit * 10);
|
|
128
|
+
const alpha = prior.samples < WARMUP_SAMPLES ? ALPHA_WARMUP : ALPHA_STEADY;
|
|
129
|
+
const updated = {
|
|
130
|
+
secondsPerUnit: prior.samples === 0
|
|
131
|
+
? cappedSample
|
|
132
|
+
: prior.secondsPerUnit * (1 - alpha) + cappedSample * alpha,
|
|
133
|
+
samples: prior.samples + 1,
|
|
134
|
+
};
|
|
135
|
+
cache.phases[args.phase] = updated;
|
|
136
|
+
try {
|
|
137
|
+
writeCalibration(cache);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
log.warn({ err: String(err) }, "calibration cache write failed");
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=eta-calibration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eta-calibration.js","sourceRoot":"","sources":["../../src/init/eta-calibration.ts"],"names":[],"mappings":"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"}
|
package/dist/init/index.d.ts
CHANGED
|
@@ -12,9 +12,13 @@ export { installMultiDev, patchPackageJsonPrepare, } from "./multi-dev/index.js"
|
|
|
12
12
|
export type { InstallMultiDevArgs, MultiDevHostKind, MultiDevInstallResult, MultiDevInstallStep, } from "./multi-dev/index.js";
|
|
13
13
|
export type { KeepBlock, RegenerateRulesArgs, RegenerateRulesResult, RuleClassKind, RuleClassification, RuleSection, RuleSourceFile, RunRulesMergeArgs, RunRulesMergeResult, } from "./rules-merge/index.js";
|
|
14
14
|
export type { WalkOptions as SourceCommentWalkOptions, WalkResult as SourceCommentWalkResult, } from "./source-comments/index.js";
|
|
15
|
-
export type { ClassifiedDoc, DocCandidate, DocClassification, DocClassificationKind, FileFilterVerdict, IngestionResult, RunDocsIngestionArgs, } from "./ingest-docs.js";
|
|
15
|
+
export type { ClassifiedDoc, DocCandidate, DocClassification, DocClassificationKind, FileFilterVerdict, IngestionResult, IngestionRunResult, IngestionSkippedResult, RunDocsIngestionArgs, } from "./ingest-docs.js";
|
|
16
16
|
export { runInit } from "./init.js";
|
|
17
17
|
export type { InitResult, RunInitArgs } from "./init.js";
|
|
18
|
+
export { applyPostInitGitConfig, detectWsl } from "./post-git-init.js";
|
|
19
|
+
export type { GitRunResult, GitRunner, PostGitInitOptions, PostGitInitResult, WslDetectOptions, } from "./post-git-init.js";
|
|
20
|
+
export { SKILL_BUDGET_FLOOR, ensureSkillBudgetFloor, settingsJsonPath, } from "./skill-budget.js";
|
|
21
|
+
export type { EnsureSkillBudgetOptions, EnsureSkillBudgetOutcome, EnsureSkillBudgetResult, } from "./skill-budget.js";
|
|
18
22
|
export { buildMapperUserPrompt, MAPPER_OUTPUT_SCHEMA, MAPPER_SYSTEM_PROMPT, runMapper, validateMapperOutput, } from "./mapper.js";
|
|
19
23
|
export type { MapperKeyModule, MapperOutput, MapperProposedSensor, MapperResult, MapperScopeIndex, MapperScopeIndexEntry, RunMapperArgs, } from "./mapper.js";
|
|
20
24
|
export { PROGRESS_PATH, progressAbsPath, writeProgress, readProgress, clearProgress, type ProgressSnapshot, } from "./progress.js";
|
|
@@ -34,7 +38,8 @@ export { buildRepoSummary } from "./walker.js";
|
|
|
34
38
|
export type { BuildRepoSummaryOptions, ManifestPreview, RepoSummary, } from "./walker.js";
|
|
35
39
|
export { updateWorkflowSlugBlock } from "./workflow-block.js";
|
|
36
40
|
export type { UpdateResult as WorkflowSlugUpdateResult, WorkflowSlugBlockUpdate, } from "./workflow-block.js";
|
|
37
|
-
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,
|
|
38
|
-
export type { PhaseId, PhaseState, PhaseOutputs, PhaseResult, PhaseQuestion, PhaseOption, PhaseError, ResumeReport, MapperResultPersisted,
|
|
41
|
+
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";
|
|
42
|
+
export type { PhaseId, PhaseState, PhaseOutputs, PhaseResult, PhaseQuestion, PhaseOption, PhaseError, ResumeReport, MapperResultPersisted, WalkerOutput, CurateOutput, EmitOutput, NoopPhaseOutput, TopicIndexPhaseOutput, } from "./phases/index.js";
|
|
43
|
+
export { validateEntry, stripLineRange, type FinalEntry, type ValidationResult, } from "./curator/index.js";
|
|
39
44
|
export { buildTopicIndex, walkProseBlocks, resolveTopics, makeHaikuJudge, } from "./topic-index/index.js";
|
|
40
45
|
export type { BuildTopicIndexArgs, BuildTopicIndexResult, ProseBlock, ProseBlockKind, ResolveOptions, ResolveResult, SemanticJudge, SemanticVerdict, JudgeOptions, } from "./topic-index/index.js";
|
package/dist/init/index.js
CHANGED
|
@@ -8,6 +8,8 @@ export { HEURISTIC as SOURCE_COMMENT_HEURISTIC, applyStripReplace, classifyBlock
|
|
|
8
8
|
export { KEEP_END_MARKER, KEEP_START_MARKER, discoverRuleSources, extractKeepBlocks, parseRuleSections, reapplyKeepBlocks, regenerateRulesFiles, renderKeepBlock, runRulesMerge, } from "./rules-merge/index.js";
|
|
9
9
|
export { installMultiDev, patchPackageJsonPrepare, } from "./multi-dev/index.js";
|
|
10
10
|
export { runInit } from "./init.js";
|
|
11
|
+
export { applyPostInitGitConfig, detectWsl } from "./post-git-init.js";
|
|
12
|
+
export { SKILL_BUDGET_FLOOR, ensureSkillBudgetFloor, settingsJsonPath, } from "./skill-budget.js";
|
|
11
13
|
export { buildMapperUserPrompt, MAPPER_OUTPUT_SCHEMA, MAPPER_SYSTEM_PROMPT, runMapper, validateMapperOutput, } from "./mapper.js";
|
|
12
14
|
export { PROGRESS_PATH, progressAbsPath, writeProgress, readProgress, clearProgress, } from "./progress.js";
|
|
13
15
|
export { sliceModules } from "./module-slicer.js";
|
|
@@ -18,6 +20,7 @@ export { seedCairnLayout, templatesRoot } from "./seed.js";
|
|
|
18
20
|
export { editYaml, freeTextWithDefault, squareIntoSquareHole, yesNo, } from "./prompts.js";
|
|
19
21
|
export { buildRepoSummary } from "./walker.js";
|
|
20
22
|
export { updateWorkflowSlugBlock } from "./workflow-block.js";
|
|
21
|
-
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,
|
|
23
|
+
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";
|
|
24
|
+
export { validateEntry, stripLineRange, } from "./curator/index.js";
|
|
22
25
|
export { buildTopicIndex, walkProseBlocks, resolveTopics, makeHaikuJudge, } from "./topic-index/index.js";
|
|
23
26
|
//# 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":"AAAA,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,yBAAyB,EACzB,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKpE,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,IAAI,wBAAwB,EACrC,iBAAiB,EACjB,cAAc,EACd,UAAU,IAAI,uBAAuB,EACrC,mBAAmB,EACnB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,eAAe,EACf,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/init/index.ts"],"names":[],"mappings":"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"}
|