@isaacriehm/cairn-core 0.1.10 → 0.2.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.
Files changed (158) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/context/checkpoint.d.ts +4 -3
  3. package/dist/context/checkpoint.js +4 -3
  4. package/dist/context/checkpoint.js.map +1 -1
  5. package/dist/context/index.d.ts +2 -2
  6. package/dist/context/index.js +2 -2
  7. package/dist/context/spec-delta.js +1 -1
  8. package/dist/context/spec-delta.js.map +1 -1
  9. package/dist/doctor/index.d.ts +1 -1
  10. package/dist/doctor/index.js +4 -59
  11. package/dist/doctor/index.js.map +1 -1
  12. package/dist/frontend-types.d.ts +3 -3
  13. package/dist/frontend-types.js +3 -3
  14. package/dist/gc/quality-update.d.ts +4 -4
  15. package/dist/gc/quality-update.js +4 -4
  16. package/dist/ground/manifest.js +0 -2
  17. package/dist/ground/manifest.js.map +1 -1
  18. package/dist/ground/paths.js +0 -1
  19. package/dist/ground/paths.js.map +1 -1
  20. package/dist/ground/scope-index.d.ts +3 -2
  21. package/dist/ground/scope-index.js +3 -2
  22. package/dist/ground/scope-index.js.map +1 -1
  23. package/dist/hooks/bypass-detection.js +13 -18
  24. package/dist/hooks/bypass-detection.js.map +1 -1
  25. package/dist/hooks/defer.d.ts +50 -0
  26. package/dist/hooks/defer.js +87 -0
  27. package/dist/hooks/defer.js.map +1 -0
  28. package/dist/hooks/index.d.ts +2 -0
  29. package/dist/hooks/index.js +1 -0
  30. package/dist/hooks/index.js.map +1 -1
  31. package/dist/hooks/post-tool-use/ledger-cache.d.ts +2 -2
  32. package/dist/hooks/post-tool-use/ledger-cache.js +5 -4
  33. package/dist/hooks/post-tool-use/ledger-cache.js.map +1 -1
  34. package/dist/hooks/runners/index.d.ts +2 -0
  35. package/dist/hooks/runners/index.js +1 -0
  36. package/dist/hooks/runners/index.js.map +1 -1
  37. package/dist/hooks/runners/session-start.js +47 -18
  38. package/dist/hooks/runners/session-start.js.map +1 -1
  39. package/dist/hooks/runners/stop.js +81 -24
  40. package/dist/hooks/runners/stop.js.map +1 -1
  41. package/dist/hooks/seed-attested.d.ts +25 -0
  42. package/dist/hooks/seed-attested.js +84 -0
  43. package/dist/hooks/seed-attested.js.map +1 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.js +13 -7
  46. package/dist/index.js.map +1 -1
  47. package/dist/init/index.d.ts +2 -0
  48. package/dist/init/index.js +1 -0
  49. package/dist/init/index.js.map +1 -1
  50. package/dist/init/init.js +8 -90
  51. package/dist/init/init.js.map +1 -1
  52. package/dist/init/mapper.d.ts +1 -1
  53. package/dist/init/multi-dev/install.d.ts +15 -10
  54. package/dist/init/multi-dev/install.js +17 -84
  55. package/dist/init/multi-dev/install.js.map +1 -1
  56. package/dist/init/overlay.d.ts +14 -0
  57. package/dist/init/overlay.js +65 -0
  58. package/dist/init/overlay.js.map +1 -0
  59. package/dist/init/phases/1-detect.d.ts +10 -0
  60. package/dist/init/phases/1-detect.js +36 -0
  61. package/dist/init/phases/1-detect.js.map +1 -0
  62. package/dist/init/phases/10-strip.d.ts +11 -0
  63. package/dist/init/phases/10-strip.js +80 -0
  64. package/dist/init/phases/10-strip.js.map +1 -0
  65. package/dist/init/phases/12-multidev.d.ts +11 -0
  66. package/dist/init/phases/12-multidev.js +39 -0
  67. package/dist/init/phases/12-multidev.js.map +1 -0
  68. package/dist/init/phases/2-walker.d.ts +8 -0
  69. package/dist/init/phases/2-walker.js +34 -0
  70. package/dist/init/phases/2-walker.js.map +1 -0
  71. package/dist/init/phases/3-mapper.d.ts +14 -0
  72. package/dist/init/phases/3-mapper.js +56 -0
  73. package/dist/init/phases/3-mapper.js.map +1 -0
  74. package/dist/init/phases/3b-seed.d.ts +27 -0
  75. package/dist/init/phases/3b-seed.js +149 -0
  76. package/dist/init/phases/3b-seed.js.map +1 -0
  77. package/dist/init/phases/4-pilot.d.ts +10 -0
  78. package/dist/init/phases/4-pilot.js +70 -0
  79. package/dist/init/phases/4-pilot.js.map +1 -0
  80. package/dist/init/phases/5-brand.d.ts +10 -0
  81. package/dist/init/phases/5-brand.js +66 -0
  82. package/dist/init/phases/5-brand.js.map +1 -0
  83. package/dist/init/phases/6-docs-ingest.d.ts +11 -0
  84. package/dist/init/phases/6-docs-ingest.js +39 -0
  85. package/dist/init/phases/6-docs-ingest.js.map +1 -0
  86. package/dist/init/phases/7b-source-comments.d.ts +6 -0
  87. package/dist/init/phases/7b-source-comments.js +34 -0
  88. package/dist/init/phases/7b-source-comments.js.map +1 -0
  89. package/dist/init/phases/7c-rules-merge.d.ts +6 -0
  90. package/dist/init/phases/7c-rules-merge.js +34 -0
  91. package/dist/init/phases/7c-rules-merge.js.map +1 -0
  92. package/dist/init/phases/8-baseline.d.ts +10 -0
  93. package/dist/init/phases/8-baseline.js +52 -0
  94. package/dist/init/phases/8-baseline.js.map +1 -0
  95. package/dist/init/phases/index.d.ts +15 -0
  96. package/dist/init/phases/index.js +16 -0
  97. package/dist/init/phases/index.js.map +1 -0
  98. package/dist/init/phases/orchestrator.d.ts +49 -0
  99. package/dist/init/phases/orchestrator.js +85 -0
  100. package/dist/init/phases/orchestrator.js.map +1 -0
  101. package/dist/init/phases/state-io.d.ts +19 -0
  102. package/dist/init/phases/state-io.js +73 -0
  103. package/dist/init/phases/state-io.js.map +1 -0
  104. package/dist/init/phases/types.d.ts +93 -0
  105. package/dist/init/phases/types.js +30 -0
  106. package/dist/init/phases/types.js.map +1 -0
  107. package/dist/init/seed.js +11 -2
  108. package/dist/init/seed.js.map +1 -1
  109. package/dist/init/walker.d.ts +0 -6
  110. package/dist/init/walker.js +2 -3
  111. package/dist/init/walker.js.map +1 -1
  112. package/dist/join/index.js +49 -2
  113. package/dist/join/index.js.map +1 -1
  114. package/dist/logger.d.ts +1 -1
  115. package/dist/logger.js +5 -5
  116. package/dist/logger.js.map +1 -1
  117. package/dist/mcp/errors.d.ts +1 -1
  118. package/dist/mcp/schemas.d.ts +19 -0
  119. package/dist/mcp/schemas.js +19 -0
  120. package/dist/mcp/schemas.js.map +1 -1
  121. package/dist/mcp/tools/append-run-note.js +13 -6
  122. package/dist/mcp/tools/append-run-note.js.map +1 -1
  123. package/dist/mcp/tools/drop-task.js +1 -1
  124. package/dist/mcp/tools/drop-task.js.map +1 -1
  125. package/dist/mcp/tools/ground-get.js +2 -2
  126. package/dist/mcp/tools/ground-get.js.map +1 -1
  127. package/dist/mcp/tools/index.js +4 -0
  128. package/dist/mcp/tools/index.js.map +1 -1
  129. package/dist/mcp/tools/init-phases.d.ts +24 -0
  130. package/dist/mcp/tools/init-phases.js +140 -0
  131. package/dist/mcp/tools/init-phases.js.map +1 -0
  132. package/dist/mcp/tools/query-history.js +1 -1
  133. package/dist/mcp/tools/query-history.js.map +1 -1
  134. package/dist/mcp/tools/resolve-attention.d.ts +3 -1
  135. package/dist/mcp/tools/resolve-attention.js +228 -11
  136. package/dist/mcp/tools/resolve-attention.js.map +1 -1
  137. package/dist/profiles/types.d.ts +1 -1
  138. package/dist/sensors/catalog.js +8 -3
  139. package/dist/sensors/catalog.js.map +1 -1
  140. package/dist/session-start/build.d.ts +4 -0
  141. package/dist/session-start/build.js +7 -0
  142. package/dist/session-start/build.js.map +1 -1
  143. package/dist/status-line/format.d.ts +10 -7
  144. package/dist/status-line/format.js +16 -14
  145. package/dist/status-line/format.js.map +1 -1
  146. package/dist/status-line/index.d.ts +0 -3
  147. package/dist/status-line/index.js.map +1 -1
  148. package/dist/status-line/reader.d.ts +1 -1
  149. package/dist/status-line/reader.js +2 -5
  150. package/dist/status-line/reader.js.map +1 -1
  151. package/dist/status-line/writer.d.ts +1 -9
  152. package/dist/status-line/writer.js +1 -12
  153. package/dist/status-line/writer.js.map +1 -1
  154. package/package.json +1 -1
  155. package/templates/.cairn/JOIN.md +3 -9
  156. package/templates/.cairn/git-hooks/commit-msg +14 -3
  157. package/templates/.cairn/git-hooks/pre-commit +22 -13
  158. package/templates/README.md +0 -24
@@ -1,22 +1,21 @@
1
1
  /**
2
- * Phase 12 — multi-developer enforcement install.
2
+ * Phase 12 — multi-developer enforcement detection.
3
3
  *
4
4
  * Spec: PLUGIN_ARCHITECTURE §17 + §6 Phase 12.
5
5
  *
6
6
  * Idempotent. Runs once during `cairn init` after the .cairn/ skeleton
7
- * is seeded. Wires up the per-package-manager bootstrap hook so every clone
8
- * runs `cairn join` automatically:
7
+ * is seeded. Detects the package manager(s) in use and emits per-host
8
+ * JOIN.md hints for new contributors. The plugin bundle is the
9
+ * primary delivery mechanism; the Claude Code SessionStart hook
10
+ * surfaces the per-clone bootstrap banner the moment a contributor
11
+ * opens an unbootstrapped clone, so phase 12 no longer auto-patches
12
+ * `package.json` `prepare` (would fail noisily when no global `cairn`
13
+ * binary is on PATH — see PLUGIN_ARCHITECTURE §17 Layer 4).
9
14
  *
10
- * - Node projects: `package.json` `scripts.prepare` += "cairn join || true"
11
- * - Python (pyproject.toml): emits a JOIN-extension hint for the operator
12
- * - Rust / Go / generic: emits the same hint — these toolchains don't
13
- * have an install-time hook surface, so JOIN.md is the path
14
- *
15
- * The hint is captured in the result so the visual layer can render it once
16
- * inline; nothing is written outside `package.json` automatically.
15
+ * `patchPackageJsonPrepare` remains exported for explicit operator-
16
+ * driven wiring; phase 12 itself never calls it.
17
17
  */
18
- import { execFileSync } from "node:child_process";
19
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
18
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
20
19
  import { join } from "node:path";
21
20
  const PREPARE_SCRIPT_FRAGMENT = "cairn join || true";
22
21
  export function installMultiDev(args) {
@@ -27,8 +26,7 @@ export function installMultiDev(args) {
27
26
  const pkgJson = join(repoRoot, "package.json");
28
27
  if (existsSync(pkgJson)) {
29
28
  hostKinds.push("node-package-json");
30
- const patch = patchPackageJsonPrepare(pkgJson, args.dryRun === true);
31
- steps.push(patch.step);
29
+ manualHints.push("package.json detected Claude Code contributors get the SessionStart bootstrap banner; CLI-only contributors run `cairn join` once after `npm install`");
32
30
  }
33
31
  const pyproject = join(repoRoot, "pyproject.toml");
34
32
  if (existsSync(pyproject)) {
@@ -55,77 +53,12 @@ export function installMultiDev(args) {
55
53
  hostKinds.push("none");
56
54
  manualHints.push("No package-manager manifest detected — JOIN.md is the only on-ramp; share it with new contributors");
57
55
  }
58
- // Seed `.cairn/.attested-commits` with every commit reachable from
59
- // HEAD at adoption time. Without this, the Stop-hook bypass detector
60
- // flags every pre-adoption commit as "not attested" — false positives
61
- // for projects with prior history. Per PLUGIN_ARCHITECTURE §17 "Edge
62
- // case: legacy commits before adoption", pre-existing history is
63
- // grandfathered: it goes to the baseline audit, not the bypass
64
- // surface. Future commits flow through the post-commit hook + go on
65
- // top of this seeded list.
66
- steps.push(seedAttestedCommits(repoRoot, args.dryRun === true));
67
- const preparePatched = steps.some((s) => s.step === "patch-package-prepare" && s.status === "ok");
68
- return { hostKinds, preparePatched, manualHints, steps };
69
- }
70
- /* -------------------------------------------------------------------------- */
71
- /* attested-commits seed */
72
- /* -------------------------------------------------------------------------- */
73
- function seedAttestedCommits(repoRoot, dryRun) {
74
- const path = join(repoRoot, ".cairn", ".attested-commits");
75
- if (existsSync(path)) {
76
- return {
77
- step: "seed-attested-commits",
78
- status: "skipped",
79
- detail: ".cairn/.attested-commits already exists — leaving as-is",
80
- };
81
- }
82
- if (!existsSync(join(repoRoot, ".git"))) {
83
- return {
84
- step: "seed-attested-commits",
85
- status: "skipped",
86
- detail: "no .git/ — bypass detection is git-only, nothing to seed",
87
- };
88
- }
89
- let shas = [];
90
- try {
91
- const out = execFileSync("git", ["log", "--format=%H"], {
92
- cwd: repoRoot,
93
- encoding: "utf8",
94
- maxBuffer: 64 * 1024 * 1024,
95
- stdio: ["ignore", "pipe", "ignore"],
96
- });
97
- shas = out.split("\n").filter((s) => s.length > 0);
98
- }
99
- catch (err) {
100
- return {
101
- step: "seed-attested-commits",
102
- status: "error",
103
- detail: `git log failed: ${err instanceof Error ? err.message : String(err)}`,
104
- };
105
- }
106
- if (dryRun) {
107
- return {
108
- step: "seed-attested-commits",
109
- status: "ok",
110
- detail: `(dry-run) would seed ${shas.length} pre-adoption SHA${shas.length === 1 ? "" : "s"}`,
111
- };
112
- }
113
- try {
114
- mkdirSync(join(repoRoot, ".cairn"), { recursive: true });
115
- writeFileSync(path, `${shas.join("\n")}\n`, "utf8");
116
- }
117
- catch (err) {
118
- return {
119
- step: "seed-attested-commits",
120
- status: "error",
121
- detail: `write ${path} failed: ${err instanceof Error ? err.message : String(err)}`,
122
- };
123
- }
124
- return {
125
- step: "seed-attested-commits",
56
+ steps.push({
57
+ step: "detect-host-kinds",
126
58
  status: "ok",
127
- detail: `seeded ${shas.length} pre-adoption SHA${shas.length === 1 ? "" : "s"} — bypass detection grandfathers them`,
128
- };
59
+ detail: `detected ${hostKinds.join(", ")}`,
60
+ });
61
+ return { hostKinds, preparePatched: false, manualHints, steps };
129
62
  }
130
63
  export function patchPackageJsonPrepare(pkgPath, dryRun) {
131
64
  let raw;
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/init/multi-dev/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/init/multi-dev/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Project-overlay config.yaml builder — extracted so both runInit
3
+ * (terminal CLI) and the v0.2.0 MCP-native phase pipeline can call
4
+ * it. Pure function; no IO.
5
+ */
6
+ import type { MapperOutput } from "./mapper.js";
7
+ import type { DetectionResult } from "./types.js";
8
+ export declare const DEFAULT_OFF_LIMITS: string[];
9
+ export interface BuildProjectOverlayArgs {
10
+ detection: DetectionResult;
11
+ decidedSlug: string;
12
+ mapperOutput?: MapperOutput;
13
+ }
14
+ export declare function buildProjectOverlay(args: BuildProjectOverlayArgs): Record<string, unknown>;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Project-overlay config.yaml builder — extracted so both runInit
3
+ * (terminal CLI) and the v0.2.0 MCP-native phase pipeline can call
4
+ * it. Pure function; no IO.
5
+ */
6
+ import { VERSION } from "../index.js";
7
+ export const DEFAULT_OFF_LIMITS = [
8
+ ".env",
9
+ ".env.*",
10
+ "node_modules/",
11
+ "dist/",
12
+ "build/",
13
+ "target/",
14
+ "__pycache__/",
15
+ "vendor/",
16
+ ".venv/",
17
+ ".direnv/",
18
+ ".cache/",
19
+ "coverage/",
20
+ ];
21
+ export function buildProjectOverlay(args) {
22
+ const detected_sensor_commands = args.detection.proposed_sensors.map((s) => ({
23
+ id: s.id,
24
+ command: s.command,
25
+ args: s.args,
26
+ applies_to: s.applies_to,
27
+ reason: s.reason,
28
+ }));
29
+ const m = args.mapperOutput;
30
+ const offLimits = [...DEFAULT_OFF_LIMITS];
31
+ if (m !== undefined) {
32
+ for (const x of m.off_limits_globs) {
33
+ if (!offLimits.includes(x))
34
+ offLimits.push(x);
35
+ }
36
+ }
37
+ const overlay = {
38
+ version: 1,
39
+ cairn_version: VERSION,
40
+ slug: args.decidedSlug,
41
+ origin_url: args.detection.origin_url,
42
+ stack_signatures: args.detection.stack_signatures.map((s) => s.kind),
43
+ hook_capability: args.detection.hook_capability,
44
+ start_command: args.detection.start_command,
45
+ detected_sensor_commands,
46
+ off_limits: offLimits,
47
+ high_stakes_globs: m?.high_stakes_globs ?? [],
48
+ project_globs: {
49
+ route_handler_globs: m?.route_handler_globs ?? [],
50
+ dto_globs: m?.dto_globs ?? [],
51
+ generator_source_globs: m?.generator_source_globs ?? [],
52
+ high_stakes_globs: m?.high_stakes_globs ?? [],
53
+ },
54
+ };
55
+ if (m !== undefined) {
56
+ overlay["pilot_module"] = m.pilot_module;
57
+ overlay["domain_summary"] = m.domain_summary;
58
+ overlay["key_modules"] = m.key_modules;
59
+ overlay["mapper_proposed_sensors"] = m.proposed_sensors;
60
+ if (m.notes.trim().length > 0)
61
+ overlay["mapper_notes"] = m.notes;
62
+ }
63
+ return overlay;
64
+ }
65
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/init/overlay.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,MAAM;IACN,QAAQ;IACR,eAAe;IACf,OAAO;IACP,QAAQ;IACR,SAAS;IACT,cAAc;IACd,SAAS;IACT,QAAQ;IACR,UAAU;IACV,SAAS;IACT,WAAW;CACZ,CAAC;AAQF,MAAM,UAAU,mBAAmB,CACjC,IAA6B;IAE7B,MAAM,wBAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3E,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,MAAM,EAAE,CAAC,CAAC,MAAM;KACjB,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;IAC5B,MAAM,SAAS,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAA4B;QACvC,OAAO,EAAE,CAAC;QACV,aAAa,EAAE,OAAO;QACtB,IAAI,EAAE,IAAI,CAAC,WAAW;QACtB,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU;QACrC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe;QAC/C,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa;QAC3C,wBAAwB;QACxB,UAAU,EAAE,SAAS;QACrB,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,IAAI,EAAE;QAC7C,aAAa,EAAE;YACb,mBAAmB,EAAE,CAAC,EAAE,mBAAmB,IAAI,EAAE;YACjD,SAAS,EAAE,CAAC,EAAE,SAAS,IAAI,EAAE;YAC7B,sBAAsB,EAAE,CAAC,EAAE,sBAAsB,IAAI,EAAE;YACvD,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,IAAI,EAAE;SAC9C;KACF,CAAC;IACF,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QACpB,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC;QACzC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC;QAC7C,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;QACvC,OAAO,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAC;QACxD,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IACnE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Phase 1-detect — synchronous environment + stack signature scan.
3
+ *
4
+ * Wraps `detectAll` in the PhaseResult contract. No operator input;
5
+ * always advances. Output stamped under `state.outputs["1-detect"]`
6
+ * is the full DetectionResult so downstream phases can read repo_root,
7
+ * stack, sensors, etc. without re-detecting.
8
+ */
9
+ import type { PhaseResult, PhaseState } from "./types.js";
10
+ export declare function runPhase1Detect(state: PhaseState): Promise<PhaseResult>;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Phase 1-detect — synchronous environment + stack signature scan.
3
+ *
4
+ * Wraps `detectAll` in the PhaseResult contract. No operator input;
5
+ * always advances. Output stamped under `state.outputs["1-detect"]`
6
+ * is the full DetectionResult so downstream phases can read repo_root,
7
+ * stack, sensors, etc. without re-detecting.
8
+ */
9
+ import { detectAll } from "../detect.js";
10
+ import { advancePhase } from "./orchestrator.js";
11
+ export async function runPhase1Detect(state) {
12
+ try {
13
+ const detection = await detectAll(state.repoRoot);
14
+ const next = {
15
+ ...state,
16
+ outputs: { ...state.outputs, "1-detect": detection },
17
+ };
18
+ return {
19
+ status: "complete",
20
+ nextPhase: "2-walker",
21
+ state: advancePhase(next),
22
+ };
23
+ }
24
+ catch (err) {
25
+ return {
26
+ status: "error",
27
+ error: {
28
+ code: "detect-failed",
29
+ message: "Failed to scan project environment",
30
+ detail: err instanceof Error ? err.stack ?? err.message : String(err),
31
+ },
32
+ state,
33
+ };
34
+ }
35
+ }
36
+ //# sourceMappingURL=1-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1-detect.js","sourceRoot":"","sources":["../../../src/init/phases/1-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAiB;IACrD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,IAAI,GAAe;YACvB,GAAG,KAAK;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE;SACrD,CAAC;QACF,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,UAAU;YACrB,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,eAAe;gBACrB,OAAO,EAAE,oCAAoC;gBAC7C,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,11 @@
1
+ /**
2
+ * Phase 10-strip — per-module strip-replace consent.
3
+ *
4
+ * Surfaces each ingestion-flagged module as an A/B/C choice (strip /
5
+ * keep / skip). Tracks remaining modules in
6
+ * `outputs["10-strip"].pending` and emits one question at a time
7
+ * until the queue is empty. When the list is empty (most repos), the
8
+ * phase completes immediately with no operator prompts.
9
+ */
10
+ import type { PhaseResult, PhaseState } from "./types.js";
11
+ export declare function runPhase10Strip(state: PhaseState): Promise<PhaseResult>;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Phase 10-strip — per-module strip-replace consent.
3
+ *
4
+ * Surfaces each ingestion-flagged module as an A/B/C choice (strip /
5
+ * keep / skip). Tracks remaining modules in
6
+ * `outputs["10-strip"].pending` and emits one question at a time
7
+ * until the queue is empty. When the list is empty (most repos), the
8
+ * phase completes immediately with no operator prompts.
9
+ */
10
+ import { advancePhase } from "./orchestrator.js";
11
+ export async function runPhase10Strip(state) {
12
+ const existing = state.outputs["10-strip"];
13
+ const modules = computeFlaggedModules(state);
14
+ // Initialize on first entry.
15
+ let s = existing ?? { pending: [...modules], decisions: {} };
16
+ // Operator just answered → record + dequeue.
17
+ if (state.answer !== undefined && state.answer.length > 0 && s.pending.length > 0) {
18
+ const head = s.pending[0];
19
+ const choice = normalizeChoice(state.answer);
20
+ s = {
21
+ pending: s.pending.slice(1),
22
+ decisions: { ...s.decisions, [head]: choice },
23
+ };
24
+ }
25
+ if (s.pending.length === 0) {
26
+ const next = {
27
+ ...state,
28
+ outputs: { ...state.outputs, "10-strip": s },
29
+ answer: undefined,
30
+ };
31
+ return {
32
+ status: "complete",
33
+ nextPhase: "12-multidev",
34
+ state: advancePhase(next),
35
+ };
36
+ }
37
+ const head = s.pending[0];
38
+ const question = {
39
+ id: `10-strip:${head}`,
40
+ prompt: `Strip the source-comment essay in ${head}?`,
41
+ options: [
42
+ {
43
+ id: "strip",
44
+ label: "strip — DEC is the source of truth",
45
+ },
46
+ {
47
+ id: "keep",
48
+ label: "keep — leave comment alongside DEC",
49
+ },
50
+ {
51
+ id: "skip",
52
+ label: "skip — decide later",
53
+ },
54
+ ],
55
+ default: "skip",
56
+ };
57
+ return {
58
+ status: "needs_input",
59
+ question,
60
+ state: { ...state, outputs: { ...state.outputs, "10-strip": s }, answer: undefined },
61
+ };
62
+ }
63
+ function normalizeChoice(answer) {
64
+ switch (answer) {
65
+ case "strip":
66
+ case "keep":
67
+ case "skip":
68
+ return answer;
69
+ default:
70
+ return "skip";
71
+ }
72
+ }
73
+ function computeFlaggedModules(_state) {
74
+ // Source-comment + docs-ingest classifiers don't currently flag
75
+ // module-level strip candidates explicitly; v0.2.x will extend
76
+ // those classifiers to surface them. For now the queue starts empty
77
+ // → phase 10 completes silently.
78
+ return [];
79
+ }
80
+ //# sourceMappingURL=10-strip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"10-strip.js","sourceRoot":"","sources":["../../../src/init/phases/10-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAcjD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAiB;IACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAA2B,CAAC;IACrE,MAAM,OAAO,GAAa,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAEvD,6BAA6B;IAC7B,IAAI,CAAC,GAAe,QAAQ,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAEzE,6CAA6C;IAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC,GAAG;YACF,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE;SAC9C,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAe;YACvB,GAAG,KAAK;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE;YAC5C,MAAM,EAAE,SAAS;SAClB,CAAC;QACF,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,aAAa;YACxB,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;SAC1B,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;IAC3B,MAAM,QAAQ,GAAkB;QAC9B,EAAE,EAAE,YAAY,IAAI,EAAE;QACtB,MAAM,EAAE,qCAAqC,IAAI,GAAG;QACpD,OAAO,EAAE;YACP;gBACE,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE,oCAAoC;aAC5C;YACD;gBACE,EAAE,EAAE,MAAM;gBACV,KAAK,EAAE,oCAAoC;aAC5C;YACD;gBACE,EAAE,EAAE,MAAM;gBACV,KAAK,EAAE,qBAAqB;aAC7B;SACF;QACD,OAAO,EAAE,MAAM;KAChB,CAAC;IACF,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,QAAQ;QACR,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;KACrF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAkB;IAC/C,gEAAgE;IAChE,+DAA+D;IAC/D,oEAAoE;IACpE,iCAAiC;IACjC,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Phase 12-multidev — detect per-host package manager(s) and emit
3
+ * JOIN.md hints for new contributors.
4
+ *
5
+ * No filesystem mutation outside the result payload. The `.cairn/`
6
+ * skeleton + `.attested-commits` seeding moved to phase 3b-seed; the
7
+ * Claude Code SessionStart bootstrap banner replaces the old
8
+ * `package.json` `prepare` patching path. Idempotent.
9
+ */
10
+ import type { PhaseResult, PhaseState } from "./types.js";
11
+ export declare function runPhase12Multidev(state: PhaseState): Promise<PhaseResult>;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Phase 12-multidev — detect per-host package manager(s) and emit
3
+ * JOIN.md hints for new contributors.
4
+ *
5
+ * No filesystem mutation outside the result payload. The `.cairn/`
6
+ * skeleton + `.attested-commits` seeding moved to phase 3b-seed; the
7
+ * Claude Code SessionStart bootstrap banner replaces the old
8
+ * `package.json` `prepare` patching path. Idempotent.
9
+ */
10
+ import { installMultiDev, } from "../multi-dev/index.js";
11
+ import { advancePhase } from "./orchestrator.js";
12
+ export async function runPhase12Multidev(state) {
13
+ try {
14
+ const result = installMultiDev({
15
+ repoRoot: state.repoRoot,
16
+ });
17
+ const next = {
18
+ ...state,
19
+ outputs: { ...state.outputs, "12-multidev": result },
20
+ };
21
+ return {
22
+ status: "complete",
23
+ nextPhase: null,
24
+ state: advancePhase(next),
25
+ };
26
+ }
27
+ catch (err) {
28
+ return {
29
+ status: "error",
30
+ error: {
31
+ code: "multidev-failed",
32
+ message: "Multi-dev install failed",
33
+ detail: err instanceof Error ? err.stack ?? err.message : String(err),
34
+ },
35
+ state,
36
+ };
37
+ }
38
+ }
39
+ //# sourceMappingURL=12-multidev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"12-multidev.js","sourceRoot":"","sources":["../../../src/init/phases/12-multidev.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,eAAe,GAEhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAiB;IACxD,IAAI,CAAC;QACH,MAAM,MAAM,GAA0B,eAAe,CAAC;YACpD,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;QACH,MAAM,IAAI,GAAe;YACvB,GAAG,KAAK;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE;SACrD,CAAC;QACF,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,IAAI;YACf,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,iBAAiB;gBACvB,OAAO,EAAE,0BAA0B;gBACnC,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,8 @@
1
+ /**
2
+ * Phase 2-walker — repo summary scan.
3
+ *
4
+ * Synchronous file walk producing manifest previews, by-extension
5
+ * counts, framework signals, etc. Feeds the mapper (3) + pilot (4).
6
+ */
7
+ import type { PhaseResult, PhaseState } from "./types.js";
8
+ export declare function runPhase2Walker(state: PhaseState): Promise<PhaseResult>;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Phase 2-walker — repo summary scan.
3
+ *
4
+ * Synchronous file walk producing manifest previews, by-extension
5
+ * counts, framework signals, etc. Feeds the mapper (3) + pilot (4).
6
+ */
7
+ import { buildRepoSummary } from "../walker.js";
8
+ import { advancePhase } from "./orchestrator.js";
9
+ export async function runPhase2Walker(state) {
10
+ try {
11
+ const summary = buildRepoSummary({ repoRoot: state.repoRoot });
12
+ const next = {
13
+ ...state,
14
+ outputs: { ...state.outputs, "2-walker": summary },
15
+ };
16
+ return {
17
+ status: "complete",
18
+ nextPhase: "3-mapper",
19
+ state: advancePhase(next),
20
+ };
21
+ }
22
+ catch (err) {
23
+ return {
24
+ status: "error",
25
+ error: {
26
+ code: "walker-failed",
27
+ message: "Failed to summarize repo layout",
28
+ detail: err instanceof Error ? err.stack ?? err.message : String(err),
29
+ },
30
+ state,
31
+ };
32
+ }
33
+ }
34
+ //# sourceMappingURL=2-walker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"2-walker.js","sourceRoot":"","sources":["../../../src/init/phases/2-walker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAiB;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAe;YACvB,GAAG,KAAK;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE;SACnD,CAAC;QACF,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,UAAU;YACrB,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,eAAe;gBACrB,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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Phase 3-mapper — Sonnet-driven domain map.
3
+ *
4
+ * Reads detection (from phase 1) + repo summary (from phase 2),
5
+ * dispatches the chunked mapper pipeline, and stamps MapperResult
6
+ * under outputs["3-mapper"]. The downstream phases consume
7
+ * mapper.output for pilot suggestions, project_globs, sensor
8
+ * proposals, etc.
9
+ *
10
+ * No operator input — the mapper runs unattended (Sonnet via the
11
+ * cairn runner).
12
+ */
13
+ import type { PhaseResult, PhaseState } from "./types.js";
14
+ export declare function runPhase3Mapper(state: PhaseState): Promise<PhaseResult>;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Phase 3-mapper — Sonnet-driven domain map.
3
+ *
4
+ * Reads detection (from phase 1) + repo summary (from phase 2),
5
+ * dispatches the chunked mapper pipeline, and stamps MapperResult
6
+ * under outputs["3-mapper"]. The downstream phases consume
7
+ * mapper.output for pilot suggestions, project_globs, sensor
8
+ * proposals, etc.
9
+ *
10
+ * No operator input — the mapper runs unattended (Sonnet via the
11
+ * cairn runner).
12
+ */
13
+ import { runMapper } from "../mapper.js";
14
+ import { advancePhase } from "./orchestrator.js";
15
+ export async function runPhase3Mapper(state) {
16
+ const detection = state.outputs["1-detect"];
17
+ const summary = state.outputs["2-walker"];
18
+ if (detection === undefined || summary === undefined) {
19
+ return {
20
+ status: "error",
21
+ error: {
22
+ code: "missing-prereqs",
23
+ message: "Phase 3 needs phases 1-detect + 2-walker outputs",
24
+ },
25
+ state,
26
+ };
27
+ }
28
+ try {
29
+ const result = await runMapper({
30
+ detection,
31
+ summary,
32
+ repoRoot: state.repoRoot,
33
+ });
34
+ const next = {
35
+ ...state,
36
+ outputs: { ...state.outputs, "3-mapper": result },
37
+ };
38
+ return {
39
+ status: "complete",
40
+ nextPhase: "3b-seed",
41
+ state: advancePhase(next),
42
+ };
43
+ }
44
+ catch (err) {
45
+ return {
46
+ status: "error",
47
+ error: {
48
+ code: "mapper-failed",
49
+ message: "Mapper pipeline failed",
50
+ detail: err instanceof Error ? err.stack ?? err.message : String(err),
51
+ },
52
+ state,
53
+ };
54
+ }
55
+ }
56
+ //# sourceMappingURL=3-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"3-mapper.js","sourceRoot":"","sources":["../../../src/init/phases/3-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAqB,MAAM,cAAc,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAiB;IACrD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAgC,CAAC;IAC3E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAA4B,CAAC;IACrE,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACrD,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE;gBACL,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,kDAAkD;aAC5D;YACD,KAAK;SACN,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAiB,MAAM,SAAS,CAAC;YAC3C,SAAS;YACT,OAAO;YACP,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;QACH,MAAM,IAAI,GAAe;YACvB,GAAG,KAAK;YACR,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE;SAClD,CAAC;QACF,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,SAAS;YACpB,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,eAAe;gBACrB,OAAO,EAAE,wBAAwB;gBACjC,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,27 @@
1
+ /**
2
+ * Phase 3b-seed — write `.cairn/` skeleton + project overlay +
3
+ * grandfather pre-adoption commits.
4
+ *
5
+ * Bridges 3-mapper and 4-pilot. Without this phase the v0.2.0 init
6
+ * pipeline produced an `.cairn/` populated only by side effects of
7
+ * downstream phases (events/, baseline/, ground/decisions/_inbox/)
8
+ * but never wrote `config.yaml`, `git-hooks/`, or the brand /
9
+ * canonical-map / capabilities skeleton — leaving the project in a
10
+ * "half-adopted" shape that subsequent SessionStarts could not
11
+ * detect as adopted.
12
+ *
13
+ * Steps:
14
+ * 1. seedCairnLayout (templates → .cairn/)
15
+ * 2. updateWorkflowSlugBlock (mapper output → workflow.md)
16
+ * 3. write .cairn/config.yaml + .cairn/ground/scope-index.yaml
17
+ * 4. seed .cairn/.attested-commits with every reachable HEAD SHA
18
+ * so the Stop-hook bypass detector grandfathers pre-adoption
19
+ * history (otherwise the very next assistant turn flags every
20
+ * pre-adoption commit as a `--no-verify` bypass).
21
+ *
22
+ * No operator input. Always advances. Idempotent — re-running on a
23
+ * project that already has .cairn/ keeps existing files (collisions
24
+ * recorded in seed.collisions but not fatal).
25
+ */
26
+ import type { PhaseResult, PhaseState } from "./types.js";
27
+ export declare function runPhase3bSeed(state: PhaseState): Promise<PhaseResult>;