@isaacriehm/cairn-core 0.21.0 → 0.22.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/align-undo/log.js +3 -2
- package/dist/align-undo/log.js.map +1 -1
- package/dist/attention/source-strip.js +2 -1
- package/dist/attention/source-strip.js.map +1 -1
- package/dist/components/emit.js +33 -6
- package/dist/components/emit.js.map +1 -1
- package/dist/components/freshness.d.ts +51 -0
- package/dist/components/freshness.js +121 -0
- package/dist/components/freshness.js.map +1 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/reconfirm.d.ts +64 -0
- package/dist/components/reconfirm.js +204 -0
- package/dist/components/reconfirm.js.map +1 -0
- package/dist/context/handoff-builder.js +3 -3
- package/dist/context/handoff-builder.js.map +1 -1
- package/dist/context/task-summary.js +2 -2
- package/dist/context/task-summary.js.map +1 -1
- package/dist/doctor/index.js +7 -7
- package/dist/doctor/index.js.map +1 -1
- package/dist/events/paths.js +2 -2
- package/dist/events/paths.js.map +1 -1
- package/dist/fix-align/sentinel.js +2 -3
- package/dist/fix-align/sentinel.js.map +1 -1
- package/dist/gc/attested-commits.js +2 -2
- package/dist/gc/attested-commits.js.map +1 -1
- package/dist/gc/canary.js +2 -3
- package/dist/gc/canary.js.map +1 -1
- package/dist/gc/citation-integrity.d.ts +2 -3
- package/dist/gc/citation-integrity.js +2 -26
- package/dist/gc/citation-integrity.js.map +1 -1
- package/dist/gc/completion-integrity.js +4 -3
- package/dist/gc/completion-integrity.js.map +1 -1
- package/dist/gc/entity-orphan.js +60 -8
- package/dist/gc/entity-orphan.js.map +1 -1
- package/dist/gc/ghost-anchor.d.ts +57 -0
- package/dist/gc/ghost-anchor.js +171 -0
- package/dist/gc/ghost-anchor.js.map +1 -0
- package/dist/gc/index.d.ts +2 -0
- package/dist/gc/index.js +1 -0
- package/dist/gc/index.js.map +1 -1
- package/dist/gc/runtime-prune.d.ts +59 -0
- package/dist/gc/runtime-prune.js +232 -0
- package/dist/gc/runtime-prune.js.map +1 -0
- package/dist/gc/sweep.js +18 -0
- package/dist/gc/sweep.js.map +1 -1
- package/dist/gc/types.d.ts +1 -1
- package/dist/hooks/bypass-detection.js +3 -2
- package/dist/hooks/bypass-detection.js.map +1 -1
- package/dist/hooks/defer.js +3 -2
- package/dist/hooks/defer.js.map +1 -1
- package/dist/hooks/ghost-backup.d.ts +37 -0
- package/dist/hooks/ghost-backup.js +82 -0
- package/dist/hooks/ghost-backup.js.map +1 -0
- package/dist/hooks/post-tool-use/allowlist-reader.js +2 -2
- package/dist/hooks/post-tool-use/allowlist-reader.js.map +1 -1
- package/dist/hooks/post-tool-use/ask-user-blocked.js +2 -2
- package/dist/hooks/post-tool-use/ask-user-blocked.js.map +1 -1
- package/dist/hooks/post-tool-use/citation-scanner.d.ts +8 -6
- package/dist/hooks/post-tool-use/citation-scanner.js +9 -14
- package/dist/hooks/post-tool-use/citation-scanner.js.map +1 -1
- package/dist/hooks/post-tool-use/legend-builder.d.ts +2 -2
- package/dist/hooks/post-tool-use/legend-builder.js +1 -19
- package/dist/hooks/post-tool-use/legend-builder.js.map +1 -1
- package/dist/hooks/post-tool-use/post-write.js +18 -1
- package/dist/hooks/post-tool-use/post-write.js.map +1 -1
- package/dist/hooks/post-tool-use/read-enricher.d.ts +2 -2
- package/dist/hooks/post-tool-use/read-enricher.js +4 -6
- package/dist/hooks/post-tool-use/read-enricher.js.map +1 -1
- package/dist/hooks/post-tool-use/sot-align.js +29 -3
- package/dist/hooks/post-tool-use/sot-align.js.map +1 -1
- package/dist/hooks/post-tool-use/write-guardian.js +4 -4
- package/dist/hooks/post-tool-use/write-guardian.js.map +1 -1
- package/dist/hooks/runners/context-threshold.js +3 -3
- package/dist/hooks/runners/context-threshold.js.map +1 -1
- package/dist/hooks/runners/payload.js +2 -1
- package/dist/hooks/runners/payload.js.map +1 -1
- package/dist/hooks/runners/phase-ready-surface.js +3 -2
- package/dist/hooks/runners/phase-ready-surface.js.map +1 -1
- package/dist/hooks/runners/session-start.js +124 -5
- package/dist/hooks/runners/session-start.js.map +1 -1
- package/dist/hooks/runners/stop.js +26 -12
- package/dist/hooks/runners/stop.js.map +1 -1
- package/dist/hooks/runners/user-prompt-submit.d.ts +2 -2
- package/dist/hooks/runners/user-prompt-submit.js +4 -9
- package/dist/hooks/runners/user-prompt-submit.js.map +1 -1
- package/dist/hooks/seed-attested.js +3 -2
- package/dist/hooks/seed-attested.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/init/baseline-audit.js +3 -3
- package/dist/init/baseline-audit.js.map +1 -1
- package/dist/init/claude-rule.js +13 -1
- package/dist/init/claude-rule.js.map +1 -1
- package/dist/init/curator/corpus.d.ts +1 -0
- package/dist/init/curator/corpus.js +6 -2
- package/dist/init/curator/corpus.js.map +1 -1
- package/dist/init/curator/emit.js +2 -3
- package/dist/init/curator/emit.js.map +1 -1
- package/dist/init/detect-components.js +2 -2
- package/dist/init/detect-components.js.map +1 -1
- package/dist/init/eta-calibration.js +2 -2
- package/dist/init/eta-calibration.js.map +1 -1
- package/dist/init/index.d.ts +1 -1
- package/dist/init/index.js +1 -1
- package/dist/init/index.js.map +1 -1
- package/dist/init/init.d.ts +8 -0
- package/dist/init/init.js +16 -6
- package/dist/init/init.js.map +1 -1
- package/dist/init/mapper.js +2 -2
- package/dist/init/mapper.js.map +1 -1
- package/dist/init/multi-dev/install.js +24 -0
- package/dist/init/multi-dev/install.js.map +1 -1
- package/dist/init/phases/11-baseline.js +1 -1
- package/dist/init/phases/11-baseline.js.map +1 -1
- package/dist/init/phases/4-seed.js +7 -5
- package/dist/init/phases/4-seed.js.map +1 -1
- package/dist/init/phases/9a-walker.js +4 -0
- package/dist/init/phases/9a-walker.js.map +1 -1
- package/dist/init/phases/9b-curate.d.ts +1 -0
- package/dist/init/phases/9b-curate.js +6 -2
- package/dist/init/phases/9b-curate.js.map +1 -1
- package/dist/init/phases/9d-comp-walk.js +2 -2
- package/dist/init/phases/9d-comp-walk.js.map +1 -1
- package/dist/init/phases/9e-comp-annotate.js +63 -3
- package/dist/init/phases/9e-comp-annotate.js.map +1 -1
- package/dist/init/phases/index.d.ts +0 -1
- package/dist/init/phases/index.js +0 -1
- package/dist/init/phases/index.js.map +1 -1
- package/dist/init/phases/mapper-output-io.d.ts +1 -1
- package/dist/init/phases/mapper-output-io.js +3 -2
- package/dist/init/phases/mapper-output-io.js.map +1 -1
- package/dist/init/phases/state-io.d.ts +1 -1
- package/dist/init/phases/state-io.js +3 -2
- package/dist/init/phases/state-io.js.map +1 -1
- package/dist/init/phases/types.d.ts +20 -8
- package/dist/init/phases/types.js +0 -1
- package/dist/init/phases/types.js.map +1 -1
- package/dist/init/progress.d.ts +1 -0
- package/dist/init/progress.js +3 -1
- package/dist/init/progress.js.map +1 -1
- package/dist/init/rules-merge/ingest.js +3 -3
- package/dist/init/rules-merge/ingest.js.map +1 -1
- package/dist/init/seed.js +54 -5
- package/dist/init/seed.js.map +1 -1
- package/dist/init/source-comments/strip-replace.d.ts +0 -1
- package/dist/init/source-comments/strip-replace.js +17 -1
- package/dist/init/source-comments/strip-replace.js.map +1 -1
- package/dist/join/index.d.ts +9 -0
- package/dist/join/index.js +82 -25
- package/dist/join/index.js.map +1 -1
- package/dist/lock.js +4 -3
- package/dist/lock.js.map +1 -1
- package/dist/mcp/bootstrap-guard.js +10 -1
- package/dist/mcp/bootstrap-guard.js.map +1 -1
- package/dist/mcp/schemas.d.ts +26 -0
- package/dist/mcp/schemas.js +26 -0
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/server.js +3 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/telemetry.js +4 -3
- package/dist/mcp/telemetry.js.map +1 -1
- package/dist/mcp/tools/component-reconfirm.d.ts +7 -0
- package/dist/mcp/tools/component-reconfirm.js +39 -0
- package/dist/mcp/tools/component-reconfirm.js.map +1 -0
- package/dist/mcp/tools/component-register.d.ts +15 -0
- package/dist/mcp/tools/component-register.js +65 -0
- package/dist/mcp/tools/component-register.js.map +1 -0
- package/dist/mcp/tools/index.js +8 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/init-phases.d.ts +2 -0
- package/dist/mcp/tools/init-phases.js +21 -5
- package/dist/mcp/tools/init-phases.js.map +1 -1
- package/dist/mcp/tools/migrate.d.ts +21 -0
- package/dist/mcp/tools/migrate.js +49 -0
- package/dist/mcp/tools/migrate.js.map +1 -0
- package/dist/mcp/tools/mission-advance.js +5 -5
- package/dist/mcp/tools/mission-advance.js.map +1 -1
- package/dist/mcp/tools/mission-resume.js +3 -3
- package/dist/mcp/tools/mission-resume.js.map +1 -1
- package/dist/mcp/tools/record-decision.js +11 -4
- package/dist/mcp/tools/record-decision.js.map +1 -1
- package/dist/mcp/tools/resolve-attention.js +20 -4
- package/dist/mcp/tools/resolve-attention.js.map +1 -1
- package/dist/mcp/tools/resume.js +3 -2
- package/dist/mcp/tools/resume.js.map +1 -1
- package/dist/mcp/tools/search.js +2 -2
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/tools/task-complete.js +2 -3
- package/dist/mcp/tools/task-complete.js.map +1 -1
- package/dist/mcp/tools/task-create.js +2 -2
- package/dist/mcp/tools/task-create.js.map +1 -1
- package/dist/migrate/config-io.d.ts +10 -2
- package/dist/migrate/config-io.js +21 -19
- package/dist/migrate/config-io.js.map +1 -1
- package/dist/migrate/gitignore.d.ts +28 -0
- package/dist/migrate/gitignore.js +82 -0
- package/dist/migrate/gitignore.js.map +1 -0
- package/dist/migrate/index.d.ts +1 -0
- package/dist/migrate/index.js +1 -0
- package/dist/migrate/index.js.map +1 -1
- package/dist/migrate/migrations/0001-drop-dead-config-fields.js +2 -2
- package/dist/migrate/migrations/0001-drop-dead-config-fields.js.map +1 -1
- package/dist/migrate/migrations/0002-backfill-gitignore.d.ts +14 -0
- package/dist/migrate/migrations/0002-backfill-gitignore.js +40 -0
- package/dist/migrate/migrations/0002-backfill-gitignore.js.map +1 -0
- package/dist/migrate/migrations/0003-prune-scaffolding.d.ts +19 -0
- package/dist/migrate/migrations/0003-prune-scaffolding.js +54 -0
- package/dist/migrate/migrations/0003-prune-scaffolding.js.map +1 -0
- package/dist/migrate/registry.js +7 -1
- package/dist/migrate/registry.js.map +1 -1
- package/dist/migrate/runner.js +17 -10
- package/dist/migrate/runner.js.map +1 -1
- package/dist/migrate/types.d.ts +10 -2
- package/dist/missions/task-link.js +4 -5
- package/dist/missions/task-link.js.map +1 -1
- package/dist/paths/index.d.ts +12 -1
- package/dist/paths/index.js +17 -3
- package/dist/paths/index.js.map +1 -1
- package/dist/sensors/catalog.js +3 -3
- package/dist/sensors/catalog.js.map +1 -1
- package/dist/session-start/build.js +31 -16
- package/dist/session-start/build.js.map +1 -1
- package/dist/status-line/event-queue.js +2 -1
- package/dist/status-line/event-queue.js.map +1 -1
- package/dist/status-line/reader.js +5 -5
- package/dist/status-line/reader.js.map +1 -1
- package/dist/status-line/writer.js +2 -1
- package/dist/status-line/writer.js.map +1 -1
- package/dist/tasks/lifecycle.js +10 -9
- package/dist/tasks/lifecycle.js.map +1 -1
- package/dist/trace/index.js +2 -2
- package/dist/trace/index.js.map +1 -1
- package/dist/update-check.d.ts +28 -0
- package/dist/update-check.js +137 -0
- package/dist/update-check.js.map +1 -0
- package/package.json +2 -2
- package/templates/.cairn/git-hooks/commit-msg +33 -5
- package/templates/.cairn/git-hooks/post-commit +13 -3
- package/templates/.cairn/git-hooks/pre-commit +48 -25
- package/dist/hooks/read-enrich.d.ts +0 -6
- package/dist/hooks/read-enrich.js +0 -11
- package/dist/hooks/read-enrich.js.map +0 -1
- package/dist/hooks/write-guard.d.ts +0 -6
- package/dist/hooks/write-guard.js +0 -11
- package/dist/hooks/write-guard.js.map +0 -1
- package/dist/init/phases/12-strip.d.ts +0 -10
- package/dist/init/phases/12-strip.js +0 -88
- package/dist/init/phases/12-strip.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-create.js","sourceRoot":"","sources":["../../../src/mcp/tools/task-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"task-create.js","sourceRoot":"","sources":["../../../src/mcp/tools/task-create.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,11 +6,19 @@
|
|
|
6
6
|
* rewrites of the single config.yaml — callers serialize via the migrate
|
|
7
7
|
* lock.
|
|
8
8
|
*/
|
|
9
|
+
import { type Document } from "yaml";
|
|
10
|
+
/**
|
|
11
|
+
* Parse `config.yaml` once. Returns null when absent / unreadable. Pass the
|
|
12
|
+
* result to `readConfigPin` / `configHasKeys` to share a single parse across
|
|
13
|
+
* the runner's read-only selection phase (the apply phase re-reads fresh, since
|
|
14
|
+
* each migration may mutate the file).
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadConfigDoc(repoRoot: string): Document | null;
|
|
9
17
|
/** Read the `cairn_version` pin, or null when absent / unreadable. */
|
|
10
|
-
export declare function readConfigPin(repoRoot: string): string | null;
|
|
18
|
+
export declare function readConfigPin(repoRoot: string, doc?: Document | null): string | null;
|
|
11
19
|
/** Set the `cairn_version` pin. No-op (returns false) when already equal. */
|
|
12
20
|
export declare function writeConfigPin(repoRoot: string, version: string): boolean;
|
|
13
21
|
/** Which of `keys` are present as top-level config keys. */
|
|
14
|
-
export declare function configHasKeys(repoRoot: string, keys: readonly string[]): string[];
|
|
22
|
+
export declare function configHasKeys(repoRoot: string, keys: readonly string[], doc?: Document | null): string[];
|
|
15
23
|
/** Delete top-level `keys`; returns the keys actually removed. */
|
|
16
24
|
export declare function deleteConfigKeys(repoRoot: string, keys: readonly string[]): string[];
|
|
@@ -7,25 +7,33 @@
|
|
|
7
7
|
* lock.
|
|
8
8
|
*/
|
|
9
9
|
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
10
|
-
import { join } from "node:path";
|
|
11
10
|
import { parseDocument } from "yaml";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
import { configPath } from "@isaacriehm/cairn-state";
|
|
12
|
+
/**
|
|
13
|
+
* Parse `config.yaml` once. Returns null when absent / unreadable. Pass the
|
|
14
|
+
* result to `readConfigPin` / `configHasKeys` to share a single parse across
|
|
15
|
+
* the runner's read-only selection phase (the apply phase re-reads fresh, since
|
|
16
|
+
* each migration may mutate the file).
|
|
17
|
+
*/
|
|
18
|
+
export function loadConfigDoc(repoRoot) {
|
|
17
19
|
const p = configPath(repoRoot);
|
|
18
20
|
if (!existsSync(p))
|
|
19
21
|
return null;
|
|
20
22
|
try {
|
|
21
|
-
|
|
22
|
-
const v = doc.get("cairn_version");
|
|
23
|
-
return typeof v === "string" && v.length > 0 ? v : null;
|
|
23
|
+
return parseDocument(readFileSync(p, "utf8"));
|
|
24
24
|
}
|
|
25
25
|
catch {
|
|
26
26
|
return null;
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
/** Read the `cairn_version` pin, or null when absent / unreadable. */
|
|
30
|
+
export function readConfigPin(repoRoot, doc) {
|
|
31
|
+
const d = doc !== undefined ? doc : loadConfigDoc(repoRoot);
|
|
32
|
+
if (d === null)
|
|
33
|
+
return null;
|
|
34
|
+
const v = d.get("cairn_version");
|
|
35
|
+
return typeof v === "string" && v.length > 0 ? v : null;
|
|
36
|
+
}
|
|
29
37
|
/** Set the `cairn_version` pin. No-op (returns false) when already equal. */
|
|
30
38
|
export function writeConfigPin(repoRoot, version) {
|
|
31
39
|
const p = configPath(repoRoot);
|
|
@@ -39,17 +47,11 @@ export function writeConfigPin(repoRoot, version) {
|
|
|
39
47
|
return true;
|
|
40
48
|
}
|
|
41
49
|
/** Which of `keys` are present as top-level config keys. */
|
|
42
|
-
export function configHasKeys(repoRoot, keys) {
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
50
|
+
export function configHasKeys(repoRoot, keys, doc) {
|
|
51
|
+
const d = doc !== undefined ? doc : loadConfigDoc(repoRoot);
|
|
52
|
+
if (d === null)
|
|
45
53
|
return [];
|
|
46
|
-
|
|
47
|
-
const doc = parseDocument(readFileSync(p, "utf8"));
|
|
48
|
-
return keys.filter((k) => doc.has(k));
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
return [];
|
|
52
|
-
}
|
|
54
|
+
return keys.filter((k) => d.has(k));
|
|
53
55
|
}
|
|
54
56
|
/** Delete top-level `keys`; returns the keys actually removed. */
|
|
55
57
|
export function deleteConfigKeys(repoRoot, keys) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-io.js","sourceRoot":"","sources":["../../src/migrate/config-io.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"config-io.js","sourceRoot":"","sources":["../../src/migrate/config-io.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared `.cairn/.gitignore` remediation — used by `cairn fix gitignore` AND
|
|
3
|
+
* the `0002-backfill-gitignore` migration.
|
|
4
|
+
*
|
|
5
|
+
* Cairn added gitignored derived/per-clone state across several releases
|
|
6
|
+
* (v0.11.3 tasks/missions, v0.15.0 derived ground indexes, v0.18.0 component
|
|
7
|
+
* index). A repo adopted before an entry landed both (a) lacks the ignore line
|
|
8
|
+
* and (b) may have COMMITTED the derived state, which then churns on every
|
|
9
|
+
* clone. Remediation = bring `.cairn/.gitignore` current (merge — never clobber
|
|
10
|
+
* operator lines) and `git rm --cached` any now-ignored, already-tracked paths.
|
|
11
|
+
* Idempotent: a second run adds nothing and untracks nothing.
|
|
12
|
+
*/
|
|
13
|
+
export interface GitignoreRemediation {
|
|
14
|
+
/** True when there is anything to backfill (missing lines or tracked state). */
|
|
15
|
+
changed: boolean;
|
|
16
|
+
/** Template ignore lines absent from the current file. */
|
|
17
|
+
addedEntries: string[];
|
|
18
|
+
/** Repo-relative paths that are (or would be) `git rm --cached`'d. */
|
|
19
|
+
untracked: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Bring `.cairn/.gitignore` current with the bundled template and (apply mode)
|
|
23
|
+
* untrack any now-ignored committed state. `apply: false` is a pure read used
|
|
24
|
+
* by the migration's `detect()`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function remediateGitignore(repoRoot: string, opts: {
|
|
27
|
+
apply: boolean;
|
|
28
|
+
}): GitignoreRemediation;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared `.cairn/.gitignore` remediation — used by `cairn fix gitignore` AND
|
|
3
|
+
* the `0002-backfill-gitignore` migration.
|
|
4
|
+
*
|
|
5
|
+
* Cairn added gitignored derived/per-clone state across several releases
|
|
6
|
+
* (v0.11.3 tasks/missions, v0.15.0 derived ground indexes, v0.18.0 component
|
|
7
|
+
* index). A repo adopted before an entry landed both (a) lacks the ignore line
|
|
8
|
+
* and (b) may have COMMITTED the derived state, which then churns on every
|
|
9
|
+
* clone. Remediation = bring `.cairn/.gitignore` current (merge — never clobber
|
|
10
|
+
* operator lines) and `git rm --cached` any now-ignored, already-tracked paths.
|
|
11
|
+
* Idempotent: a second run adds nothing and untracks nothing.
|
|
12
|
+
*/
|
|
13
|
+
import { execFileSync } from "node:child_process";
|
|
14
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { cairnDir, writeFileSafe } from "@isaacriehm/cairn-state";
|
|
17
|
+
import { templatesRoot } from "../init/seed.js";
|
|
18
|
+
/** Non-comment, non-blank trimmed lines. */
|
|
19
|
+
function entryLines(text) {
|
|
20
|
+
return text
|
|
21
|
+
.split("\n")
|
|
22
|
+
.map((l) => l.trim())
|
|
23
|
+
.filter((l) => l.length > 0 && !l.startsWith("#"));
|
|
24
|
+
}
|
|
25
|
+
/** Of the template entries, the tracked-in-git file paths under them. */
|
|
26
|
+
function trackedUnder(repoRoot, entries) {
|
|
27
|
+
if (entries.length === 0)
|
|
28
|
+
return [];
|
|
29
|
+
const targets = entries.map((e) => join(".cairn", e));
|
|
30
|
+
try {
|
|
31
|
+
const out = execFileSync("git", ["ls-files", "-z", "--", ...targets], {
|
|
32
|
+
cwd: repoRoot,
|
|
33
|
+
encoding: "utf8",
|
|
34
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
35
|
+
});
|
|
36
|
+
return out.split("\0").filter((p) => p.length > 0);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Bring `.cairn/.gitignore` current with the bundled template and (apply mode)
|
|
44
|
+
* untrack any now-ignored committed state. `apply: false` is a pure read used
|
|
45
|
+
* by the migration's `detect()`.
|
|
46
|
+
*/
|
|
47
|
+
export function remediateGitignore(repoRoot, opts) {
|
|
48
|
+
const result = { changed: false, addedEntries: [], untracked: [] };
|
|
49
|
+
const templatePath = join(templatesRoot(), ".cairn", ".gitignore");
|
|
50
|
+
const gitignorePath = cairnDir(repoRoot, ".gitignore");
|
|
51
|
+
if (!existsSync(templatePath) || !existsSync(gitignorePath))
|
|
52
|
+
return result;
|
|
53
|
+
const template = readFileSync(templatePath, "utf8");
|
|
54
|
+
const current = readFileSync(gitignorePath, "utf8");
|
|
55
|
+
const have = new Set(entryLines(current));
|
|
56
|
+
const templateEntries = entryLines(template);
|
|
57
|
+
result.addedEntries = templateEntries.filter((e) => !have.has(e));
|
|
58
|
+
result.untracked = trackedUnder(repoRoot, templateEntries);
|
|
59
|
+
result.changed = result.addedEntries.length > 0 || result.untracked.length > 0;
|
|
60
|
+
if (!opts.apply || !result.changed)
|
|
61
|
+
return result;
|
|
62
|
+
if (result.addedEntries.length > 0) {
|
|
63
|
+
const sep = current.endsWith("\n") ? "" : "\n";
|
|
64
|
+
const block = `${sep}\n# --- backfilled by cairn migrate (0002-backfill-gitignore) ---\n` +
|
|
65
|
+
`${result.addedEntries.join("\n")}\n`;
|
|
66
|
+
writeFileSafe(gitignorePath, current + block);
|
|
67
|
+
}
|
|
68
|
+
if (result.untracked.length > 0) {
|
|
69
|
+
// Untrack so the committed derived state drops out of the index. The
|
|
70
|
+
// working-tree copy stays (rebuildDerived rewrites it); only the tracking
|
|
71
|
+
// is removed. Best-effort — a git failure leaves the file ignored anyway.
|
|
72
|
+
const targets = result.untracked.slice();
|
|
73
|
+
try {
|
|
74
|
+
execFileSync("git", ["rm", "--cached", "-r", "--ignore-unmatch", "--", ...targets], { cwd: repoRoot, encoding: "utf8", stdio: ["ignore", "ignore", "ignore"] });
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
/* best-effort */
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/migrate/gitignore.ts"],"names":[],"mappings":"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"}
|
package/dist/migrate/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export type { Migration, MigrationClass, MigrationResult } from "./types.js";
|
|
|
2
2
|
export { MIGRATIONS } from "./registry.js";
|
|
3
3
|
export { runMigrations, type RunMigrationsArgs, type RunMigrationsResult, type MigrationOutcome, type MigrationStatus, } from "./runner.js";
|
|
4
4
|
export { readConfigPin } from "./config-io.js";
|
|
5
|
+
export { remediateGitignore, type GitignoreRemediation } from "./gitignore.js";
|
|
5
6
|
export { semverCmp, semverGt, semverLte } from "./semver.js";
|
package/dist/migrate/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { MIGRATIONS } from "./registry.js";
|
|
2
2
|
export { runMigrations, } from "./runner.js";
|
|
3
3
|
export { readConfigPin } from "./config-io.js";
|
|
4
|
+
export { remediateGitignore } from "./gitignore.js";
|
|
4
5
|
export { semverCmp, semverGt, semverLte } from "./semver.js";
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrate/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,aAAa,GAKd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrate/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,aAAa,GAKd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAA6B,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -23,8 +23,8 @@ export const dropDeadConfigFields = {
|
|
|
23
23
|
introducedIn: "0.21.0",
|
|
24
24
|
describe: "Remove unconsumed config.yaml keys (detected_sensor_commands, mapper_proposed_sensors, mapper_notes, key_modules, stack_signatures, hook_capability, start_command, origin_url)",
|
|
25
25
|
class: "safe",
|
|
26
|
-
detect(repoRoot) {
|
|
27
|
-
return configHasKeys(repoRoot, DEAD_CONFIG_KEYS).length > 0;
|
|
26
|
+
detect(repoRoot, doc) {
|
|
27
|
+
return configHasKeys(repoRoot, DEAD_CONFIG_KEYS, doc).length > 0;
|
|
28
28
|
},
|
|
29
29
|
apply(repoRoot) {
|
|
30
30
|
const removed = deleteConfigKeys(repoRoot, DEAD_CONFIG_KEYS);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"0001-drop-dead-config-fields.js","sourceRoot":"","sources":["../../../src/migrate/migrations/0001-drop-dead-config-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAElE,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,0BAA0B;IAC1B,yBAAyB;IACzB,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,iBAAiB;IACjB,eAAe;IACf,YAAY;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAc;IAC7C,EAAE,EAAE,8BAA8B;IAClC,YAAY,EAAE,QAAQ;IACtB,QAAQ,EAAE,iLAAiL;IAC3L,KAAK,EAAE,MAAM;IACb,MAAM,CAAC,QAAgB;
|
|
1
|
+
{"version":3,"file":"0001-drop-dead-config-fields.js","sourceRoot":"","sources":["../../../src/migrate/migrations/0001-drop-dead-config-fields.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAElE,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,0BAA0B;IAC1B,yBAAyB;IACzB,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,iBAAiB;IACjB,eAAe;IACf,YAAY;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAc;IAC7C,EAAE,EAAE,8BAA8B;IAClC,YAAY,EAAE,QAAQ;IACtB,QAAQ,EAAE,iLAAiL;IAC3L,KAAK,EAAE,MAAM;IACb,MAAM,CAAC,QAAgB,EAAE,GAAsB;QAC7C,OAAO,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,QAAgB;QACpB,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAC7D,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;YAC3B,MAAM,EACJ,OAAO,CAAC,MAAM,GAAG,CAAC;gBAChB,CAAC,CAAC,WAAW,OAAO,CAAC,MAAM,wBAAwB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACvE,CAAC,CAAC,6BAA6B;SACpC,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0002 — backfill `.cairn/.gitignore` + untrack committed derived state.
|
|
3
|
+
*
|
|
4
|
+
* Repos adopted before the relevant releases (tasks/missions v0.11.3, derived
|
|
5
|
+
* ground indexes v0.15.0, component index v0.18.0) lack the ignore lines and
|
|
6
|
+
* may have COMMITTED per-clone derived state that then churns across clones.
|
|
7
|
+
*
|
|
8
|
+
* `review` (not `safe`): apply runs `git rm --cached`, mutating the git index —
|
|
9
|
+
* a VCS change the operator confirms via `cairn migrate --all`, never silently
|
|
10
|
+
* at SessionStart. Detect/apply share `remediateGitignore` with the
|
|
11
|
+
* `cairn fix gitignore` CLI, and both are idempotent.
|
|
12
|
+
*/
|
|
13
|
+
import type { Migration } from "../types.js";
|
|
14
|
+
export declare const backfillGitignore: Migration;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0002 — backfill `.cairn/.gitignore` + untrack committed derived state.
|
|
3
|
+
*
|
|
4
|
+
* Repos adopted before the relevant releases (tasks/missions v0.11.3, derived
|
|
5
|
+
* ground indexes v0.15.0, component index v0.18.0) lack the ignore lines and
|
|
6
|
+
* may have COMMITTED per-clone derived state that then churns across clones.
|
|
7
|
+
*
|
|
8
|
+
* `review` (not `safe`): apply runs `git rm --cached`, mutating the git index —
|
|
9
|
+
* a VCS change the operator confirms via `cairn migrate --all`, never silently
|
|
10
|
+
* at SessionStart. Detect/apply share `remediateGitignore` with the
|
|
11
|
+
* `cairn fix gitignore` CLI, and both are idempotent.
|
|
12
|
+
*/
|
|
13
|
+
import { remediateGitignore } from "../gitignore.js";
|
|
14
|
+
export const backfillGitignore = {
|
|
15
|
+
id: "0002-backfill-gitignore",
|
|
16
|
+
// Ships in 0.22.0 → runs for every pin < 0.22.0 (catches 0.21 adopters who
|
|
17
|
+
// upgraded from <0.15 and got 0001 but never a gitignore backfill). Bump in
|
|
18
|
+
// lockstep with the release that lands this.
|
|
19
|
+
introducedIn: "0.22.0",
|
|
20
|
+
describe: "Backfill .cairn/.gitignore (derived ground indexes, component index, per-clone state) and untrack derived state committed before it was gitignored — repos adopted before v0.15.0/v0.18.0",
|
|
21
|
+
class: "review",
|
|
22
|
+
detect(repoRoot) {
|
|
23
|
+
return remediateGitignore(repoRoot, { apply: false }).changed;
|
|
24
|
+
},
|
|
25
|
+
apply(repoRoot) {
|
|
26
|
+
const r = remediateGitignore(repoRoot, { apply: true });
|
|
27
|
+
const parts = [];
|
|
28
|
+
if (r.addedEntries.length > 0) {
|
|
29
|
+
parts.push(`added ${r.addedEntries.length} ignore entr${r.addedEntries.length === 1 ? "y" : "ies"}`);
|
|
30
|
+
}
|
|
31
|
+
if (r.untracked.length > 0) {
|
|
32
|
+
parts.push(`untracked ${r.untracked.length} committed derived file(s)`);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
changed: r.changed,
|
|
36
|
+
detail: r.changed ? parts.join("; ") : "nothing to backfill",
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=0002-backfill-gitignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"0002-backfill-gitignore.js","sourceRoot":"","sources":["../../../src/migrate/migrations/0002-backfill-gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,EAAE,EAAE,yBAAyB;IAC7B,2EAA2E;IAC3E,4EAA4E;IAC5E,6CAA6C;IAC7C,YAAY,EAAE,QAAQ;IACtB,QAAQ,EACN,2LAA2L;IAC7L,KAAK,EAAE,QAAQ;IACf,MAAM,CAAC,QAAgB;QACrB,OAAO,kBAAkB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC;IAChE,CAAC;IACD,KAAK,CAAC,QAAgB;QACpB,MAAM,CAAC,GAAG,kBAAkB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CACR,SAAS,CAAC,CAAC,YAAY,CAAC,MAAM,eAAe,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CACzF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,MAAM,4BAA4B,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,qBAAqB;SAC7D,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0003 — prune one-time init scaffolding.
|
|
3
|
+
*
|
|
4
|
+
* `.cairn/init/` (the mapper output + curator corpus) and `.cairn/backups/`
|
|
5
|
+
* (the pre-strip `.original` copies of every source file the comment-ingest
|
|
6
|
+
* rewrote) are written ONCE during adoption and never again. Nothing in the
|
|
7
|
+
* daily flow reads them — only the `cairn fix` repair escape-hatch
|
|
8
|
+
* (re-derive-from-mapper, restore-stripped-comments) does. On a real repo
|
|
9
|
+
* they are dead weight measured in megabytes (observed: a 255 KB mapper
|
|
10
|
+
* dump + a 127-file / 1.7 MB backup tree).
|
|
11
|
+
*
|
|
12
|
+
* `review` (not `safe`): apply hard-deletes committed/working-tree state and
|
|
13
|
+
* disables those two `cairn fix` repairs, so it is operator-confirmed —
|
|
14
|
+
* surfaced at SessionStart and applied via the `cairn_migrate` tool (or
|
|
15
|
+
* `cairn migrate --all`), never silently. Idempotent: re-running after the
|
|
16
|
+
* dirs are gone is a no-op.
|
|
17
|
+
*/
|
|
18
|
+
import type { Migration } from "../types.js";
|
|
19
|
+
export declare const pruneScaffolding: Migration;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 0003 — prune one-time init scaffolding.
|
|
3
|
+
*
|
|
4
|
+
* `.cairn/init/` (the mapper output + curator corpus) and `.cairn/backups/`
|
|
5
|
+
* (the pre-strip `.original` copies of every source file the comment-ingest
|
|
6
|
+
* rewrote) are written ONCE during adoption and never again. Nothing in the
|
|
7
|
+
* daily flow reads them — only the `cairn fix` repair escape-hatch
|
|
8
|
+
* (re-derive-from-mapper, restore-stripped-comments) does. On a real repo
|
|
9
|
+
* they are dead weight measured in megabytes (observed: a 255 KB mapper
|
|
10
|
+
* dump + a 127-file / 1.7 MB backup tree).
|
|
11
|
+
*
|
|
12
|
+
* `review` (not `safe`): apply hard-deletes committed/working-tree state and
|
|
13
|
+
* disables those two `cairn fix` repairs, so it is operator-confirmed —
|
|
14
|
+
* surfaced at SessionStart and applied via the `cairn_migrate` tool (or
|
|
15
|
+
* `cairn migrate --all`), never silently. Idempotent: re-running after the
|
|
16
|
+
* dirs are gone is a no-op.
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync, rmSync } from "node:fs";
|
|
19
|
+
import { cairnDir } from "@isaacriehm/cairn-state";
|
|
20
|
+
/** Top-level `.cairn/` subtrees that exist only as init-time scaffolding. */
|
|
21
|
+
const SCAFFOLDING_DIRS = ["init", "backups"];
|
|
22
|
+
function present(repoRoot) {
|
|
23
|
+
return SCAFFOLDING_DIRS.filter((d) => existsSync(cairnDir(repoRoot, d)));
|
|
24
|
+
}
|
|
25
|
+
export const pruneScaffolding = {
|
|
26
|
+
id: "0003-prune-scaffolding",
|
|
27
|
+
// Ships in 0.22.1 → runs for every pin < 0.22.1 (catches every 0.22.0
|
|
28
|
+
// adopter on the patch pull). Bump in lockstep with the release that lands it.
|
|
29
|
+
introducedIn: "0.22.1",
|
|
30
|
+
describe: "Remove one-time init scaffolding (.cairn/init mapper output + curator corpus, .cairn/backups source-strip copies) — dead weight once adoption is past the cairn-fix repair window",
|
|
31
|
+
class: "review",
|
|
32
|
+
detect(repoRoot) {
|
|
33
|
+
return present(repoRoot).length > 0;
|
|
34
|
+
},
|
|
35
|
+
apply(repoRoot) {
|
|
36
|
+
const removed = [];
|
|
37
|
+
for (const dir of present(repoRoot)) {
|
|
38
|
+
try {
|
|
39
|
+
rmSync(cairnDir(repoRoot, dir), { recursive: true, force: true });
|
|
40
|
+
removed.push(`.cairn/${dir}`);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
/* best-effort — a locked/permission-denied subtree is left in place */
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
changed: removed.length > 0,
|
|
48
|
+
detail: removed.length > 0
|
|
49
|
+
? `removed ${removed.length} scaffolding dir(s): ${removed.join(", ")}`
|
|
50
|
+
: "no init scaffolding present",
|
|
51
|
+
};
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=0003-prune-scaffolding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"0003-prune-scaffolding.js","sourceRoot":"","sources":["../../../src/migrate/migrations/0003-prune-scaffolding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,6EAA6E;AAC7E,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,SAAS,CAAU,CAAC;AAEtD,SAAS,OAAO,CAAC,QAAgB;IAC/B,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAc;IACzC,EAAE,EAAE,wBAAwB;IAC5B,sEAAsE;IACtE,+EAA+E;IAC/E,YAAY,EAAE,QAAQ;IACtB,QAAQ,EACN,mLAAmL;IACrL,KAAK,EAAE,QAAQ;IACf,MAAM,CAAC,QAAgB;QACrB,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,CAAC,QAAgB;QACpB,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClE,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;YACzE,CAAC;QACH,CAAC;QACD,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;YAC3B,MAAM,EACJ,OAAO,CAAC,MAAM,GAAG,CAAC;gBAChB,CAAC,CAAC,WAAW,OAAO,CAAC,MAAM,wBAAwB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACvE,CAAC,CAAC,6BAA6B;SACpC,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/dist/migrate/registry.js
CHANGED
|
@@ -6,5 +6,11 @@
|
|
|
6
6
|
* migration here and link it from CHANGELOG.
|
|
7
7
|
*/
|
|
8
8
|
import { dropDeadConfigFields } from "./migrations/0001-drop-dead-config-fields.js";
|
|
9
|
-
|
|
9
|
+
import { backfillGitignore } from "./migrations/0002-backfill-gitignore.js";
|
|
10
|
+
import { pruneScaffolding } from "./migrations/0003-prune-scaffolding.js";
|
|
11
|
+
export const MIGRATIONS = [
|
|
12
|
+
dropDeadConfigFields,
|
|
13
|
+
backfillGitignore,
|
|
14
|
+
pruneScaffolding,
|
|
15
|
+
];
|
|
10
16
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/migrate/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/migrate/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAE1E,MAAM,CAAC,MAAM,UAAU,GAAyB;IAC9C,oBAAoB;IACpB,iBAAiB;IACjB,gBAAgB;CACjB,CAAC"}
|
package/dist/migrate/runner.js
CHANGED
|
@@ -15,27 +15,30 @@
|
|
|
15
15
|
* cleanly (`ran: false`) rather than racing.
|
|
16
16
|
*/
|
|
17
17
|
import { existsSync } from "node:fs";
|
|
18
|
-
import { join } from "node:path";
|
|
19
18
|
import { VERSION } from "../index.js";
|
|
20
19
|
import { logger } from "../logger.js";
|
|
21
20
|
import { acquireOperationLock, OperationLockHeldError } from "../lock.js";
|
|
22
|
-
import { readConfigPin, writeConfigPin } from "./config-io.js";
|
|
21
|
+
import { loadConfigDoc, readConfigPin, writeConfigPin } from "./config-io.js";
|
|
23
22
|
import { MIGRATIONS } from "./registry.js";
|
|
24
23
|
import { semverCmp, semverGt, semverLte } from "./semver.js";
|
|
24
|
+
import { cairnDir } from "@isaacriehm/cairn-state";
|
|
25
25
|
const log = logger("migrate.runner");
|
|
26
|
-
function needs(m, repoRoot) {
|
|
26
|
+
function needs(m, repoRoot, doc) {
|
|
27
27
|
try {
|
|
28
|
-
return m.detect(repoRoot);
|
|
28
|
+
return m.detect(repoRoot, doc);
|
|
29
29
|
}
|
|
30
30
|
catch (err) {
|
|
31
31
|
log.warn({ migration: m.id, err: err instanceof Error ? err.message : String(err) }, "migration detect() threw — skipping");
|
|
32
32
|
return false;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
/**
|
|
36
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Migrations introduced in `(pin, current]` that still report needed. `doc` is
|
|
37
|
+
* the once-parsed `config.yaml` shared across this read-only selection pass.
|
|
38
|
+
*/
|
|
39
|
+
function selectCandidates(repoRoot, pin, current, doc) {
|
|
37
40
|
return MIGRATIONS.filter((m) => semverGt(m.introducedIn, pin) && semverLte(m.introducedIn, current))
|
|
38
|
-
.filter((m) => needs(m, repoRoot))
|
|
41
|
+
.filter((m) => needs(m, repoRoot, doc))
|
|
39
42
|
.slice()
|
|
40
43
|
.sort((a, b) => semverCmp(a.introducedIn, b.introducedIn) || a.id.localeCompare(b.id));
|
|
41
44
|
}
|
|
@@ -46,11 +49,15 @@ export async function runMigrations(args) {
|
|
|
46
49
|
const includeReview = args.includeReview === true;
|
|
47
50
|
// Never act on an unadopted repo — guards against any caller (notably the
|
|
48
51
|
// defensive MCP-boot run) creating `.cairn/` via the lock's mkdir.
|
|
49
|
-
if (!existsSync(
|
|
52
|
+
if (!existsSync(cairnDir(repoRoot, "config.yaml"))) {
|
|
50
53
|
return { ran: true, pin: "0.0.0", current, newPin: null, outcomes: [], pendingReview: [] };
|
|
51
54
|
}
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
// Parse config.yaml once for the whole read-only selection phase (pin read +
|
|
56
|
+
// each candidate's detect). The apply phase re-reads fresh, since a migration
|
|
57
|
+
// may mutate the file mid-run.
|
|
58
|
+
const doc = loadConfigDoc(repoRoot);
|
|
59
|
+
const pin = readConfigPin(repoRoot, doc) ?? "0.0.0";
|
|
60
|
+
const candidates = selectCandidates(repoRoot, pin, current, doc);
|
|
54
61
|
// Nothing pending: make the pin live if it's merely stale, else no-op.
|
|
55
62
|
if (candidates.length === 0) {
|
|
56
63
|
if (semverCmp(pin, current) >= 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/migrate/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/migrate/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/migrate/types.d.ts
CHANGED
|
@@ -32,8 +32,16 @@ export interface Migration {
|
|
|
32
32
|
/** One-line description, surfaced to the operator + linkable from CHANGELOG. */
|
|
33
33
|
describe: string;
|
|
34
34
|
class: MigrationClass;
|
|
35
|
-
/**
|
|
36
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Idempotent: true when this repo still needs the migration. The runner may
|
|
37
|
+
* pass `doc` — `config.yaml` parsed once for the whole selection phase — so a
|
|
38
|
+
* config-shape detect can skip re-parsing. Migrations that read other state
|
|
39
|
+
* ignore it. Never passed during the post-apply re-check (the file may have
|
|
40
|
+
* changed), so a detect handed no `doc` must read fresh.
|
|
41
|
+
*/
|
|
42
|
+
detect(repoRoot: string, doc?: ConfigDoc | null): boolean;
|
|
37
43
|
/** Apply. Must be idempotent and atomic per migration. */
|
|
38
44
|
apply(repoRoot: string): MigrationResult;
|
|
39
45
|
}
|
|
46
|
+
/** Opaque parsed-`config.yaml` handle threaded through `detect` (yaml Document). */
|
|
47
|
+
export type ConfigDoc = import("yaml").Document;
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
* - exit_gate=manual → no-op; operator runs `cairn mission advance`.
|
|
14
14
|
*/
|
|
15
15
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
16
|
-
import { join } from "node:path";
|
|
17
16
|
import { parse as parseYaml } from "yaml";
|
|
18
17
|
/**
|
|
19
18
|
* `tasks/done/<id>/` exists → the task graduated to a terminal phase
|
|
@@ -23,7 +22,7 @@ import { parse as parseYaml } from "yaml";
|
|
|
23
22
|
* means a sibling already graduated successfully.
|
|
24
23
|
*/
|
|
25
24
|
function taskIsCompletedOnDisk(repoRoot, taskId) {
|
|
26
|
-
const dir =
|
|
25
|
+
const dir = cairnDir(repoRoot, "tasks", "done", taskId);
|
|
27
26
|
if (!existsSync(dir))
|
|
28
27
|
return false;
|
|
29
28
|
try {
|
|
@@ -77,14 +76,14 @@ function graduatedIdsCoverPrSlug(taskIds, prSlug) {
|
|
|
77
76
|
}
|
|
78
77
|
return false;
|
|
79
78
|
}
|
|
80
|
-
import { appendMissionJournal, effectivePhaseExitGate, readMissionState, readRoadmap, writeMissionState, } from "@isaacriehm/cairn-state";
|
|
79
|
+
import { cairnDir, appendMissionJournal, effectivePhaseExitGate, readMissionState, readRoadmap, writeMissionState, } from "@isaacriehm/cairn-state";
|
|
81
80
|
import { writeInvalidationEvent } from "../events/index.js";
|
|
82
81
|
import { advancePhase, allPhaseTasksDone } from "./cursor.js";
|
|
83
82
|
/** Read the mission anchor stamped on a task's status.yaml. */
|
|
84
83
|
export function readTaskMissionAnchor(repoRoot, taskId) {
|
|
85
84
|
const candidates = [
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
cairnDir(repoRoot, "tasks", "active", taskId, "status.yaml"),
|
|
86
|
+
cairnDir(repoRoot, "tasks", "done", taskId, "status.yaml"),
|
|
88
87
|
];
|
|
89
88
|
for (const path of candidates) {
|
|
90
89
|
if (!existsSync(path))
|