@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.
Files changed (229) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/attention/bulk-accept.d.ts +0 -2
  3. package/dist/attention/bulk-accept.js +0 -3
  4. package/dist/attention/bulk-accept.js.map +1 -1
  5. package/dist/attention/scoring.d.ts +1 -3
  6. package/dist/attention/scoring.js +1 -12
  7. package/dist/attention/scoring.js.map +1 -1
  8. package/dist/claude/cache.js +1 -0
  9. package/dist/claude/cache.js.map +1 -1
  10. package/dist/claude/runner.js +25 -1
  11. package/dist/claude/runner.js.map +1 -1
  12. package/dist/claude/types.d.ts +8 -0
  13. package/dist/doctor/index.js +57 -0
  14. package/dist/doctor/index.js.map +1 -1
  15. package/dist/gc/citation-integrity.js +3 -1
  16. package/dist/gc/citation-integrity.js.map +1 -1
  17. package/dist/gc/doc-claims.d.ts +31 -0
  18. package/dist/gc/doc-claims.js +213 -0
  19. package/dist/gc/doc-claims.js.map +1 -0
  20. package/dist/gc/doc-source-drift.d.ts +31 -0
  21. package/dist/gc/doc-source-drift.js +190 -0
  22. package/dist/gc/doc-source-drift.js.map +1 -0
  23. package/dist/gc/index.d.ts +4 -0
  24. package/dist/gc/index.js +2 -0
  25. package/dist/gc/index.js.map +1 -1
  26. package/dist/gc/sweep.js +18 -0
  27. package/dist/gc/sweep.js.map +1 -1
  28. package/dist/gc/types.d.ts +2 -2
  29. package/dist/hooks/runners/context-threshold.d.ts +63 -0
  30. package/dist/hooks/runners/context-threshold.js +179 -0
  31. package/dist/hooks/runners/context-threshold.js.map +1 -0
  32. package/dist/hooks/runners/gc-autotrigger.d.ts +49 -0
  33. package/dist/hooks/runners/gc-autotrigger.js +87 -0
  34. package/dist/hooks/runners/gc-autotrigger.js.map +1 -0
  35. package/dist/hooks/runners/index.d.ts +2 -0
  36. package/dist/hooks/runners/index.js +1 -0
  37. package/dist/hooks/runners/index.js.map +1 -1
  38. package/dist/hooks/runners/payload.d.ts +10 -0
  39. package/dist/hooks/runners/payload.js +13 -0
  40. package/dist/hooks/runners/payload.js.map +1 -1
  41. package/dist/hooks/runners/session-end.js +2 -4
  42. package/dist/hooks/runners/session-end.js.map +1 -1
  43. package/dist/hooks/runners/session-start.js +157 -9
  44. package/dist/hooks/runners/session-start.js.map +1 -1
  45. package/dist/hooks/runners/stop.js +119 -0
  46. package/dist/hooks/runners/stop.js.map +1 -1
  47. package/dist/init/brand-derive.js +6 -1
  48. package/dist/init/brand-derive.js.map +1 -1
  49. package/dist/init/brand-setup.d.ts +12 -1
  50. package/dist/init/brand-setup.js +36 -1
  51. package/dist/init/brand-setup.js.map +1 -1
  52. package/dist/init/curator/corpus.d.ts +92 -0
  53. package/dist/init/curator/corpus.js +171 -0
  54. package/dist/init/curator/corpus.js.map +1 -0
  55. package/dist/init/curator/emit.d.ts +42 -0
  56. package/dist/init/curator/emit.js +230 -0
  57. package/dist/init/curator/emit.js.map +1 -0
  58. package/dist/init/curator/index.d.ts +1 -0
  59. package/dist/init/curator/index.js +2 -0
  60. package/dist/init/curator/index.js.map +1 -0
  61. package/dist/init/curator/regex-prefilter.d.ts +54 -0
  62. package/dist/init/curator/regex-prefilter.js +185 -0
  63. package/dist/init/curator/regex-prefilter.js.map +1 -0
  64. package/dist/init/curator/validate.d.ts +46 -0
  65. package/dist/init/curator/validate.js +100 -0
  66. package/dist/init/curator/validate.js.map +1 -0
  67. package/dist/init/curator/walker.d.ts +36 -0
  68. package/dist/init/curator/walker.js +380 -0
  69. package/dist/init/curator/walker.js.map +1 -0
  70. package/dist/init/eta-calibration.d.ts +39 -0
  71. package/dist/init/eta-calibration.js +143 -0
  72. package/dist/init/eta-calibration.js.map +1 -0
  73. package/dist/init/index.d.ts +8 -3
  74. package/dist/init/index.js +4 -1
  75. package/dist/init/index.js.map +1 -1
  76. package/dist/init/ingest-docs.d.ts +6 -1
  77. package/dist/init/ingest-docs.js.map +1 -1
  78. package/dist/init/init.js +15 -26
  79. package/dist/init/init.js.map +1 -1
  80. package/dist/init/mapper-merge.d.ts +4 -6
  81. package/dist/init/mapper-merge.js +11 -34
  82. package/dist/init/mapper-merge.js.map +1 -1
  83. package/dist/init/mapper-parallel.d.ts +0 -1
  84. package/dist/init/mapper-parallel.js +20 -12
  85. package/dist/init/mapper-parallel.js.map +1 -1
  86. package/dist/init/mapper-prompts.d.ts +1 -4
  87. package/dist/init/mapper-prompts.js +2 -6
  88. package/dist/init/mapper-prompts.js.map +1 -1
  89. package/dist/init/mapper.d.ts +8 -7
  90. package/dist/init/mapper.js +23 -15
  91. package/dist/init/mapper.js.map +1 -1
  92. package/dist/init/overlay.js +0 -1
  93. package/dist/init/overlay.js.map +1 -1
  94. package/dist/init/phases/1-detect.d.ts +17 -4
  95. package/dist/init/phases/1-detect.js +48 -4
  96. package/dist/init/phases/1-detect.js.map +1 -1
  97. package/dist/init/phases/10-rules-merge.d.ts +7 -2
  98. package/dist/init/phases/10-rules-merge.js +17 -32
  99. package/dist/init/phases/10-rules-merge.js.map +1 -1
  100. package/dist/init/phases/11-baseline.js.map +1 -1
  101. package/dist/init/phases/12-strip.js +14 -1
  102. package/dist/init/phases/12-strip.js.map +1 -1
  103. package/dist/init/phases/13-multidev.d.ts +5 -1
  104. package/dist/init/phases/13-multidev.js +23 -2
  105. package/dist/init/phases/13-multidev.js.map +1 -1
  106. package/dist/init/phases/3-mapper.js.map +1 -1
  107. package/dist/init/phases/4-seed.js +2 -3
  108. package/dist/init/phases/4-seed.js.map +1 -1
  109. package/dist/init/phases/5-preflight.d.ts +42 -0
  110. package/dist/init/phases/5-preflight.js +244 -0
  111. package/dist/init/phases/5-preflight.js.map +1 -0
  112. package/dist/init/phases/6-brand.js +2 -4
  113. package/dist/init/phases/6-brand.js.map +1 -1
  114. package/dist/init/phases/7-topic-index.d.ts +6 -0
  115. package/dist/init/phases/7-topic-index.js +13 -0
  116. package/dist/init/phases/7-topic-index.js.map +1 -1
  117. package/dist/init/phases/8-docs-ingest.d.ts +6 -5
  118. package/dist/init/phases/8-docs-ingest.js +16 -43
  119. package/dist/init/phases/8-docs-ingest.js.map +1 -1
  120. package/dist/init/phases/9a-walker.d.ts +15 -0
  121. package/dist/init/phases/9a-walker.js +63 -0
  122. package/dist/init/phases/9a-walker.js.map +1 -0
  123. package/dist/init/phases/9b-curate.d.ts +19 -0
  124. package/dist/init/phases/9b-curate.js +79 -0
  125. package/dist/init/phases/9b-curate.js.map +1 -0
  126. package/dist/init/phases/9c-emit.d.ts +13 -0
  127. package/dist/init/phases/9c-emit.js +57 -0
  128. package/dist/init/phases/9c-emit.js.map +1 -0
  129. package/dist/init/phases/index.d.ts +6 -5
  130. package/dist/init/phases/index.js +4 -4
  131. package/dist/init/phases/index.js.map +1 -1
  132. package/dist/init/phases/mapper-output-io.d.ts +5 -5
  133. package/dist/init/phases/mapper-output-io.js +5 -5
  134. package/dist/init/phases/orchestrator.d.ts +10 -0
  135. package/dist/init/phases/orchestrator.js +13 -1
  136. package/dist/init/phases/orchestrator.js.map +1 -1
  137. package/dist/init/phases/state-io.js +1 -1
  138. package/dist/init/phases/types.d.ts +115 -9
  139. package/dist/init/phases/types.js +4 -2
  140. package/dist/init/phases/types.js.map +1 -1
  141. package/dist/init/post-git-init.d.ts +53 -0
  142. package/dist/init/post-git-init.js +74 -0
  143. package/dist/init/post-git-init.js.map +1 -0
  144. package/dist/init/preflight-guards.d.ts +11 -2
  145. package/dist/init/preflight-guards.js +27 -5
  146. package/dist/init/preflight-guards.js.map +1 -1
  147. package/dist/init/rules-merge/index.d.ts +1 -1
  148. package/dist/init/rules-merge/ingest.d.ts +6 -1
  149. package/dist/init/rules-merge/ingest.js.map +1 -1
  150. package/dist/init/skill-budget.d.ts +39 -0
  151. package/dist/init/skill-budget.js +99 -0
  152. package/dist/init/skill-budget.js.map +1 -0
  153. package/dist/init/source-comments/ingest.d.ts +0 -2
  154. package/dist/init/source-comments/ingest.js.map +1 -1
  155. package/dist/init/source-comments/walker.js +2 -2
  156. package/dist/init/topic-index/index.d.ts +8 -0
  157. package/dist/init/topic-index/index.js +10 -2
  158. package/dist/init/topic-index/index.js.map +1 -1
  159. package/dist/init/topic-index/judge.d.ts +15 -0
  160. package/dist/init/topic-index/judge.js +15 -1
  161. package/dist/init/topic-index/judge.js.map +1 -1
  162. package/dist/init/topic-index/resolve.js +41 -14
  163. package/dist/init/topic-index/resolve.js.map +1 -1
  164. package/dist/init/types.d.ts +9 -0
  165. package/dist/init/walker.d.ts +1 -1
  166. package/dist/init/walker.js +1 -1
  167. package/dist/init/workflow-block.d.ts +5 -6
  168. package/dist/init/workflow-block.js +5 -9
  169. package/dist/init/workflow-block.js.map +1 -1
  170. package/dist/mcp/bootstrap-guard.js +2 -2
  171. package/dist/mcp/bootstrap-guard.js.map +1 -1
  172. package/dist/mcp/schemas.d.ts +34 -0
  173. package/dist/mcp/schemas.js +50 -0
  174. package/dist/mcp/schemas.js.map +1 -1
  175. package/dist/mcp/telemetry.d.ts +1 -1
  176. package/dist/mcp/tools/bootstrap-retry.d.ts +23 -0
  177. package/dist/mcp/tools/bootstrap-retry.js +53 -0
  178. package/dist/mcp/tools/bootstrap-retry.js.map +1 -0
  179. package/dist/mcp/tools/bulk-accept-attention.d.ts +1 -1
  180. package/dist/mcp/tools/bulk-accept-attention.js +4 -6
  181. package/dist/mcp/tools/bulk-accept-attention.js.map +1 -1
  182. package/dist/mcp/tools/index.js +10 -0
  183. package/dist/mcp/tools/index.js.map +1 -1
  184. package/dist/mcp/tools/init-phases.d.ts +7 -6
  185. package/dist/mcp/tools/init-phases.js +36 -65
  186. package/dist/mcp/tools/init-phases.js.map +1 -1
  187. package/dist/mcp/tools/resume.d.ts +21 -0
  188. package/dist/mcp/tools/resume.js +88 -0
  189. package/dist/mcp/tools/resume.js.map +1 -0
  190. package/dist/mcp/tools/task-complete.d.ts +23 -0
  191. package/dist/mcp/tools/task-complete.js +51 -0
  192. package/dist/mcp/tools/task-complete.js.map +1 -0
  193. package/dist/mcp/tools/task-create.js +17 -11
  194. package/dist/mcp/tools/task-create.js.map +1 -1
  195. package/dist/mcp/tools/task-journal-append.d.ts +22 -0
  196. package/dist/mcp/tools/task-journal-append.js +44 -0
  197. package/dist/mcp/tools/task-journal-append.js.map +1 -0
  198. package/dist/paths/index.js +1 -1
  199. package/dist/paths/index.js.map +1 -1
  200. package/dist/status-line/format.js +20 -0
  201. package/dist/status-line/format.js.map +1 -1
  202. package/dist/tasks/index.d.ts +2 -0
  203. package/dist/tasks/index.js +2 -0
  204. package/dist/tasks/index.js.map +1 -0
  205. package/dist/tasks/lifecycle.d.ts +107 -0
  206. package/dist/tasks/lifecycle.js +302 -0
  207. package/dist/tasks/lifecycle.js.map +1 -0
  208. package/dist/trace/index.d.ts +1 -1
  209. package/dist/trace/index.js +2 -2
  210. package/dist/trace/index.js.map +1 -1
  211. package/package.json +2 -2
  212. package/templates/.cairn/config/trust-policy.yaml +0 -3
  213. package/templates/.cairn/config/workflow.md +0 -1
  214. package/templates/.cairn/ground/canonical-map/topics.yaml +0 -12
  215. package/dist/init/phases/5-pilot.d.ts +0 -10
  216. package/dist/init/phases/5-pilot.js +0 -108
  217. package/dist/init/phases/5-pilot.js.map +0 -1
  218. package/dist/init/phases/9-source-comments.d.ts +0 -6
  219. package/dist/init/phases/9-source-comments.js +0 -55
  220. package/dist/init/phases/9-source-comments.js.map +0 -1
  221. package/dist/init/phases/parallel-8910.d.ts +0 -27
  222. package/dist/init/phases/parallel-8910.js +0 -172
  223. package/dist/init/phases/parallel-8910.js.map +0 -1
  224. package/dist/init/phases/source-comments-output-io.d.ts +0 -84
  225. package/dist/init/phases/source-comments-output-io.js +0 -81
  226. package/dist/init/phases/source-comments-output-io.js.map +0 -1
  227. package/templates/.cairn/ground/capabilities/mcp-tools.yaml +0 -29
  228. package/templates/.cairn/ground/capabilities/skills.yaml +0 -25
  229. package/templates/.cairn/ground/capabilities/snippets.yaml +0 -29
@@ -0,0 +1,53 @@
1
+ /**
2
+ * cairn_bootstrap_retry — manual retry for per-clone bootstrap.
3
+ *
4
+ * Spec: PLUGIN_ARCHITECTURE §11 (no CLI subcommand exposure to operator) +
5
+ * §17 Layer 2 (per-clone bootstrap).
6
+ *
7
+ * Surface: when `requireBootstrap` returns `BOOTSTRAP_REQUIRED` because
8
+ * the auto-join path failed (most commonly: hooks dir missing or
9
+ * `git config core.hooksPath` blocked), this tool re-runs the join
10
+ * sequence inline so the operator never sees a CLI subcommand. The
11
+ * `cairn-attention` skill's Step 0 calls this tool when the bootstrap
12
+ * banner is in `additionalContext`; SessionStart's degraded-mode
13
+ * banner cites this tool name as the recovery path.
14
+ *
15
+ * Idempotent. The bootstrap guard is intentionally NOT called here —
16
+ * its sole purpose is to retry bootstrap, so guarding it would be a
17
+ * loop.
18
+ */
19
+ import { runJoin } from "../../join/index.js";
20
+ const inputShape = {};
21
+ async function handler(ctx, _input) {
22
+ const result = runJoin({ repoRoot: ctx.repoRoot });
23
+ const failedSteps = result.steps
24
+ .filter((s) => s.status === "error")
25
+ .map((s) => `${s.step}: ${s.detail}`);
26
+ if (result.bootstrapped) {
27
+ return {
28
+ ok: true,
29
+ bootstrapped: true,
30
+ repo_root: result.repoRoot,
31
+ project_cairn_version: result.projectCairnVersion,
32
+ cli_version: result.cliVersion,
33
+ steps: result.steps,
34
+ };
35
+ }
36
+ return {
37
+ ok: false,
38
+ error: "BOOTSTRAP_FAILED",
39
+ bootstrapped: false,
40
+ repo_root: result.repoRoot,
41
+ project_cairn_version: result.projectCairnVersion,
42
+ cli_version: result.cliVersion,
43
+ steps: result.steps,
44
+ failed_steps: failedSteps,
45
+ };
46
+ }
47
+ export const bootstrapRetryTool = {
48
+ name: "cairn_bootstrap_retry",
49
+ description: "Retry per-clone bootstrap inline when SessionStart's auto-bootstrap or a write-tool's lazy bootstrap failed. Idempotent. Returns step-by-step status; on success, subsequent MCP write tools no longer return BOOTSTRAP_REQUIRED.",
50
+ inputSchema: inputShape,
51
+ handler,
52
+ };
53
+ //# sourceMappingURL=bootstrap-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap-retry.js","sourceRoot":"","sources":["../../../src/mcp/tools/bootstrap-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAI9C,MAAM,UAAU,GAAG,EAAW,CAAC;AAM/B,KAAK,UAAU,OAAO,CAAC,GAAe,EAAE,MAAa;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;SACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;YACjD,WAAW,EAAE,MAAM,CAAC,UAAU;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,kBAAkB;QACzB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,QAAQ;QAC1B,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;QACjD,WAAW,EAAE,MAAM,CAAC,UAAU;QAC9B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,WAAW;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,mOAAmO;IACrO,WAAW,EAAE,UAAU;IACvB,OAAO;CACR,CAAC"}
@@ -4,7 +4,7 @@
4
4
  * Wraps `bulkAcceptObvious` so the cairn-attention skill can drain
5
5
  * obvious DEC drafts in one tool call instead of N rounds of
6
6
  * `cairn_resolve_attention(choice="a")` per draft. Loads the project
7
- * globs + pilot module from `.cairn/config.yaml` so the scoring
7
+ * globs from `.cairn/config.yaml` so the scoring
8
8
  * heuristic has the same context the cli subcommand does.
9
9
  *
10
10
  * Returns a slim count-distribution shape — no draft bodies, no file
@@ -4,7 +4,7 @@
4
4
  * Wraps `bulkAcceptObvious` so the cairn-attention skill can drain
5
5
  * obvious DEC drafts in one tool call instead of N rounds of
6
6
  * `cairn_resolve_attention(choice="a")` per draft. Loads the project
7
- * globs + pilot module from `.cairn/config.yaml` so the scoring
7
+ * globs from `.cairn/config.yaml` so the scoring
8
8
  * heuristic has the same context the cli subcommand does.
9
9
  *
10
10
  * Returns a slim count-distribution shape — no draft bodies, no file
@@ -31,7 +31,6 @@ const ConfigSchema = z.object({
31
31
  }).optional(),
32
32
  high_stakes_globs: z.array(z.string()).optional(),
33
33
  off_limits: z.array(z.string()).optional(),
34
- pilot_module: z.string().optional(),
35
34
  }).passthrough();
36
35
  function loadProjectGlobs(repoRoot) {
37
36
  const configPath = join(repoRoot, ".cairn", "config.yaml");
@@ -66,18 +65,17 @@ function loadProjectGlobs(repoRoot) {
66
65
  globs.high_stakes_globs = pg.high_stakes_globs;
67
66
  }
68
67
  }
69
- return cfg.pilot_module !== undefined ? { globs, pilotModule: cfg.pilot_module } : { globs };
68
+ return { globs };
70
69
  }
71
70
  export const bulkAcceptAttentionTool = {
72
71
  name: "cairn_bulk_accept_attention",
73
- description: "Score every DEC draft + invariant in `.cairn/ground/decisions/_inbox/` and `.cairn/ground/invariants/` against a confidence heuristic (file in high_stakes_globs / pilot module / route or dto globs, prose substantiveness, decision verbs, JSDoc tags). Auto-promote DEC drafts at or above `threshold` (default 'high') out of the inbox to accepted state and rebuild the decisions ledger. Stamp `capture_confidence` on every draft + invariant so subsequent attention surfaces can sort. Use this once per adoption to drain the obvious classifications before per-item triage. Returns count distributions and the accepted ID list. `dryRun: true` reports the same distribution without writing.",
72
+ description: "Score every DEC draft + invariant in `.cairn/ground/decisions/_inbox/` and `.cairn/ground/invariants/` against a confidence heuristic (file in high_stakes_globs / route or dto globs, prose substantiveness, decision verbs, JSDoc tags). Auto-promote DEC drafts at or above `threshold` (default 'high') out of the inbox to accepted state and rebuild the decisions ledger. Stamp `capture_confidence` on every draft + invariant so subsequent attention surfaces can sort. Use this once per adoption to drain the obvious classifications before per-item triage. Returns count distributions and the accepted ID list. `dryRun: true` reports the same distribution without writing.",
74
73
  inputSchema: inputShape,
75
74
  handler: async (ctx, input) => {
76
- const { globs, pilotModule } = loadProjectGlobs(ctx.repoRoot);
75
+ const { globs } = loadProjectGlobs(ctx.repoRoot);
77
76
  return bulkAcceptObvious({
78
77
  repoRoot: ctx.repoRoot,
79
78
  globs,
80
- ...(pilotModule !== undefined ? { pilotModule } : {}),
81
79
  threshold: input.threshold ?? "high",
82
80
  ...(input.dryRun !== undefined ? { dryRun: input.dryRun } : {}),
83
81
  });
@@ -1 +1 @@
1
- {"version":3,"file":"bulk-accept-attention.js","sourceRoot":"","sources":["../../../src/mcp/tools/bulk-accept-attention.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bulk-accept-attention.js","sourceRoot":"","sources":["../../../src/mcp/tools/bulk-accept-attention.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { attentionDedupTool } from "./attention-dedup.js";
4
4
  import { attentionRestoreTool } from "./attention-restore.js";
5
5
  import { attentionServeTool } from "./attention-serve.js";
6
6
  import { attentionWaitTool } from "./attention-wait.js";
7
+ import { bootstrapRetryTool } from "./bootstrap-retry.js";
7
8
  import { bulkAcceptAttentionTool } from "./bulk-accept-attention.js";
8
9
  import { canonicalForTopicTool } from "./canonical-for-topic.js";
9
10
  import { decisionGetTool } from "./decision-get.js";
@@ -20,7 +21,10 @@ import { resolveAttentionTool } from "./resolve-attention.js";
20
21
  import { searchTool } from "./search.js";
21
22
  import { searchCandidatesTool } from "./search-candidates.js";
22
23
  import { supersedesChainTool } from "./supersedes-chain.js";
24
+ import { resumeTool } from "./resume.js";
25
+ import { taskCompleteTool } from "./task-complete.js";
23
26
  import { taskCreateTool } from "./task-create.js";
27
+ import { taskJournalAppendTool } from "./task-journal-append.js";
24
28
  import { timelineTool } from "./timeline.js";
25
29
  export const allTools = [
26
30
  // Read — graph traversal
@@ -42,7 +46,11 @@ export const allTools = [
42
46
  // Write
43
47
  recordDecisionTool,
44
48
  taskCreateTool,
49
+ taskCompleteTool,
50
+ taskJournalAppendTool,
45
51
  archiveTool,
52
+ // Read — resume layer
53
+ resumeTool,
46
54
  // Write — phase 6 candidate surface
47
55
  rejectCandidateTool,
48
56
  // Write — plugin-era
@@ -54,6 +62,8 @@ export const allTools = [
54
62
  attentionWaitTool,
55
63
  // Write — Layer C SessionStart drain
56
64
  alignDrainTool,
65
+ // Write — bootstrap recovery (replaces CLI exposure in BOOTSTRAP_REQUIRED)
66
+ bootstrapRetryTool,
57
67
  // Write — init pipeline (v0.7.2 single-umbrella surface)
58
68
  initResumeTool,
59
69
  initRunTool,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,QAAQ,GAAqB;IACxC,yBAAyB;IACzB,eAAe;IACf,sBAAsB;IACtB,qBAAqB;IACrB,aAAa;IACb,mBAAmB;IACnB,gBAAgB;IAChB,WAAW;IACX,6BAA6B;IAC7B,UAAU;IACV,YAAY;IACZ,WAAW;IACX,4BAA4B;IAC5B,gBAAgB;IAChB,mCAAmC;IACnC,oBAAoB;IACpB,QAAQ;IACR,kBAAkB;IAClB,cAAc;IACd,WAAW;IACX,oCAAoC;IACpC,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,uBAAuB;IACvB,kBAAkB;IAClB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;IACjB,qCAAqC;IACrC,cAAc;IACd,yDAAyD;IACzD,cAAc;IACd,WAAW;CACZ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,QAAQ,GAAqB;IACxC,yBAAyB;IACzB,eAAe;IACf,sBAAsB;IACtB,qBAAqB;IACrB,aAAa;IACb,mBAAmB;IACnB,gBAAgB;IAChB,WAAW;IACX,6BAA6B;IAC7B,UAAU;IACV,YAAY;IACZ,WAAW;IACX,4BAA4B;IAC5B,gBAAgB;IAChB,mCAAmC;IACnC,oBAAoB;IACpB,QAAQ;IACR,kBAAkB;IAClB,cAAc;IACd,gBAAgB;IAChB,qBAAqB;IACrB,WAAW;IACX,sBAAsB;IACtB,UAAU;IACV,oCAAoC;IACpC,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,uBAAuB;IACvB,kBAAkB;IAClB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;IACjB,qCAAqC;IACrC,cAAc;IACd,2EAA2E;IAC3E,kBAAkB;IAClB,yDAAyD;IACzD,cAAc;IACd,WAAW;CACZ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MCP tools for the v0.3.5 init pipeline.
2
+ * MCP tools for the v0.9.0 init pipeline.
3
3
  *
4
4
  * Two tools, single surface:
5
5
  * 1. `cairn_init_resume` → { status, nextPhase, repoRoot }
@@ -11,11 +11,12 @@
11
11
  * 3. AskUserQuestion if needs_input → re-call same tool with { answer }
12
12
  * 4. loop on complete + advance until nextPhase === null
13
13
  *
14
- * Phase 8 (`8-docs-ingest`) is special: `cairn_init_run` internally
15
- * dispatches the parallel 8/9/10 runner so the three Haiku-batched
16
- * ingestion phases overlap on wall-clock. The combined result advances
17
- * to `11-baseline`. The skill doesn't need a separate code path for
18
- * this `cairn_init_run` is the only umbrella.
14
+ * Phase 9b-curate is a skill-driven pseudo-phase: between Phase 9a
15
+ * (walker) and Phase 9c (emit), the cairn-adopt skill spawns
16
+ * `cairn:curator-map` and `cairn:curator-reduce` subagents that write
17
+ * `.cairn/init/curator/final.jsonl`. The 9b runner only confirms the
18
+ * file exists + counts entries before advancing; the heavy work
19
+ * happens outside the MCP server.
19
20
  *
20
21
  * State persists to .cairn/init-state.json after every successful
21
22
  * phase result so the operator can crash-recover. The skill no longer
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MCP tools for the v0.3.5 init pipeline.
2
+ * MCP tools for the v0.9.0 init pipeline.
3
3
  *
4
4
  * Two tools, single surface:
5
5
  * 1. `cairn_init_resume` → { status, nextPhase, repoRoot }
@@ -11,11 +11,12 @@
11
11
  * 3. AskUserQuestion if needs_input → re-call same tool with { answer }
12
12
  * 4. loop on complete + advance until nextPhase === null
13
13
  *
14
- * Phase 8 (`8-docs-ingest`) is special: `cairn_init_run` internally
15
- * dispatches the parallel 8/9/10 runner so the three Haiku-batched
16
- * ingestion phases overlap on wall-clock. The combined result advances
17
- * to `11-baseline`. The skill doesn't need a separate code path for
18
- * this `cairn_init_run` is the only umbrella.
14
+ * Phase 9b-curate is a skill-driven pseudo-phase: between Phase 9a
15
+ * (walker) and Phase 9c (emit), the cairn-adopt skill spawns
16
+ * `cairn:curator-map` and `cairn:curator-reduce` subagents that write
17
+ * `.cairn/init/curator/final.jsonl`. The 9b runner only confirms the
18
+ * file exists + counts entries before advancing; the heavy work
19
+ * happens outside the MCP server.
19
20
  *
20
21
  * State persists to .cairn/init-state.json after every successful
21
22
  * phase result so the operator can crash-recover. The skill no longer
@@ -34,7 +35,7 @@
34
35
  * phase outputs — a single bad call could nuke a 90KB mapper run.
35
36
  */
36
37
  import { z } from "zod";
37
- import { PHASE_IDS, clearProgress, freshPhaseState, readPhaseState, resumePhases, runPhase1Detect, runPhase2Walker, runPhase3Mapper, runPhase4Seed, runPhase5Pilot, runPhase6Brand, runPhase7TopicIndex, runPhase8DocsIngest, runPhase9SourceComments, runPhase10RulesMerge, runPhase11Baseline, runPhase12Strip, runPhase13Multidev, runPhases8910Parallel, writePhaseState, writeProgress, } from "../../init/index.js";
38
+ import { PHASE_IDS, clearProgress, freshPhaseState, readPhaseState, resumePhases, runPhase1Detect, runPhase2Walker, runPhase3Mapper, runPhase4Seed, runPhase5Preflight, runPhase6Brand, runPhase7TopicIndex, runPhase8DocsIngest, runPhase9aWalker, runPhase9bCurate, runPhase9cEmit, runPhase10RulesMerge, runPhase11Baseline, runPhase12Strip, runPhase13Multidev, writePhaseState, writeProgress, } from "../../init/index.js";
38
39
  import { mcpError } from "../errors.js";
39
40
  const phaseIdEnum = z.enum(PHASE_IDS);
40
41
  const phaseStateSchema = z.object({
@@ -43,7 +44,7 @@ const phaseStateSchema = z.object({
43
44
  outputs: z.record(z.string(), z.unknown()),
44
45
  answer: z.string().optional(),
45
46
  startedAt: z.string().min(1),
46
- schemaVersion: z.literal(1),
47
+ schemaVersion: z.literal(3),
47
48
  });
48
49
  const phaseRunInput = {
49
50
  phase: phaseIdEnum,
@@ -62,11 +63,13 @@ const RUNNERS = {
62
63
  "2-walker": runPhase2Walker,
63
64
  "3-mapper": runPhase3Mapper,
64
65
  "4-seed": runPhase4Seed,
65
- "5-pilot": runPhase5Pilot,
66
+ "5-preflight": runPhase5Preflight,
66
67
  "6-brand": runPhase6Brand,
67
68
  "7-topic-index": runPhase7TopicIndex,
68
69
  "8-docs-ingest": runPhase8DocsIngest,
69
- "9-source-comments": runPhase9SourceComments,
70
+ "9a-walker": runPhase9aWalker,
71
+ "9b-curate": runPhase9bCurate,
72
+ "9c-emit": runPhase9cEmit,
70
73
  "10-rules-merge": runPhase10RulesMerge,
71
74
  "11-baseline": runPhase11Baseline,
72
75
  "12-strip": runPhase12Strip,
@@ -81,41 +84,6 @@ function toSlim(result) {
81
84
  }
82
85
  return { status: "error", error: result.error };
83
86
  }
84
- /**
85
- * Phase 8 fans out to phases 8/9/10 in parallel. Centralized here so
86
- * `cairn_init_run` callers don't have to special-case the gate.
87
- */
88
- async function handlePhase8Parallel(ctx, state) {
89
- if (state.repoRoot !== ctx.repoRoot) {
90
- return mcpError("VALIDATION_FAILED", `state.repoRoot ${state.repoRoot} does not match MCP context ${ctx.repoRoot}`);
91
- }
92
- const t0 = performance.now();
93
- const result = await runPhases8910Parallel(state);
94
- const durationMs = Math.round(performance.now() - t0);
95
- clearProgress(state.repoRoot);
96
- if (result.status !== "error") {
97
- for (const id of [
98
- "8-docs-ingest",
99
- "9-source-comments",
100
- "10-rules-merge",
101
- ]) {
102
- const phaseOut = result.state.outputs[id];
103
- if (typeof phaseOut === "object" && phaseOut !== null) {
104
- const obj = phaseOut;
105
- if (obj["duration_ms"] === undefined) {
106
- obj["duration_ms"] = durationMs;
107
- }
108
- }
109
- }
110
- try {
111
- writePhaseState(result.state);
112
- }
113
- catch (err) {
114
- return mcpError("INTERNAL_ERROR", `failed to persist init state: ${err instanceof Error ? err.message : String(err)}`);
115
- }
116
- }
117
- return toSlim(result);
118
- }
119
87
  async function handlePhaseRun(ctx, id, input) {
120
88
  // Resolve state: prefer the explicit arg (smoke tests, debug
121
89
  // tooling), fall back to disk (cairn-adopt skill default).
@@ -140,17 +108,9 @@ async function handlePhaseRun(ctx, id, input) {
140
108
  const stateForRun = input.answer !== undefined && input.answer.length > 0
141
109
  ? { ...state, answer: input.answer }
142
110
  : state;
143
- // Phase 8 dispatches the parallel 8/9/10 runner — the three Haiku-
144
- // batched ingestion phases overlap on wall-clock and the combined
145
- // result advances to `11-baseline`. No separate MCP tool needed.
146
- if (id === "8-docs-ingest") {
147
- return handlePhase8Parallel(ctx, stateForRun);
148
- }
149
111
  const runner = RUNNERS[id];
150
112
  // Coarse-grained statusline coverage
151
- const isLongPhase = id === "3-mapper" ||
152
- id === "9-source-comments" ||
153
- id === "10-rules-merge";
113
+ const isLongPhase = id === "3-mapper" || id === "9a-walker" || id === "9c-emit";
154
114
  if (!isLongPhase) {
155
115
  writeProgress(state.repoRoot, {
156
116
  phase: id,
@@ -166,11 +126,8 @@ async function handlePhaseRun(ctx, id, input) {
166
126
  // Stamp `duration_ms` on the phase's output entry
167
127
  if (result.status !== "error") {
168
128
  const phaseOut = result.state.outputs[id];
169
- if (typeof phaseOut === "object" && phaseOut !== null) {
170
- const obj = phaseOut;
171
- if (obj.duration_ms === undefined) {
172
- obj.duration_ms = durationMs;
173
- }
129
+ if (typeof phaseOut === "object" && phaseOut !== null && !("duration_ms" in phaseOut)) {
130
+ Object.assign(phaseOut, { duration_ms: durationMs });
174
131
  }
175
132
  }
176
133
  // Persist state ONLY on non-error results.
@@ -187,7 +144,7 @@ async function handlePhaseRun(ctx, id, input) {
187
144
  function makePhaseRunTool() {
188
145
  return {
189
146
  name: "cairn_init_run",
190
- description: "Run the next initialization phase. Call cairn_init_resume to find the next phase, then invoke this tool with that phase ID. Phase 8-docs-ingest internally fans out to phases 8/9/10 in parallel and advances to 11-baseline; every other phase runs sequentially. The cairn-adopt skill loops on this tool until nextPhase === null.",
147
+ description: "Run the next initialization phase. Call cairn_init_resume to find the next phase, then invoke this tool with that phase ID. Phase 8-docs-ingest and 10-rules-merge are no-op markers in v0.9.0 (the curator pipeline 9a-walker → 9b-curate → 9c-emit subsumes both); 10-rules-merge advances to 11-baseline. Phase 9b-curate is a skill-driven pseudo-phase: the cairn-adopt skill must dispatch curator-map + curator-reduce subagents and write .cairn/init/curator/final.jsonl before invoking it. The cairn-adopt skill loops on this tool until nextPhase === null.",
191
148
  inputSchema: phaseRunInput,
192
149
  handler: async (ctx, input) => {
193
150
  return handlePhaseRun(ctx, input.phase, input);
@@ -197,19 +154,33 @@ function makePhaseRunTool() {
197
154
  function makeResumeTool() {
198
155
  return {
199
156
  name: "cairn_init_resume",
200
- description: "Read the on-disk init state for the current repo and return the next phase to invoke. The cairn-adopt skill calls this once at the start of the pipeline (and after any operator interruption) to find where to pick up. Returns { status: 'ready' | 'done', nextPhase: PhaseId | null, repoRoot }.",
157
+ description: "Read the on-disk init state for the current repo and return the next phase to invoke. The cairn-adopt skill calls this once at the start of the pipeline (and after any operator interruption) to find where to pick up. Returns { status: 'ready' | 'done', nextPhase: PhaseId | null, repoRoot }. For a fresh start (no `.cairn/init-state.json`), the tool persists a fresh PhaseState to disk so the very next `cairn_init_run` call can read it back without the skill having to thread state through tool arguments.",
201
158
  inputSchema: initResumeInput,
202
159
  handler: async (ctx) => {
203
160
  const report = resumePhases(ctx.repoRoot);
204
161
  // For a fresh start, ensure state.repoRoot matches ctx.repoRoot
205
162
  // (resumePhases uses freshPhaseState(ctx.repoRoot) for this case).
206
- const repoRoot = report.state.repoRoot !== ctx.repoRoot
207
- ? freshPhaseState(ctx.repoRoot).repoRoot
208
- : report.state.repoRoot;
163
+ const stateForCtx = report.state.repoRoot !== ctx.repoRoot
164
+ ? freshPhaseState(ctx.repoRoot)
165
+ : report.state;
166
+ // Persist fresh state to disk so the next `cairn_init_run` call
167
+ // (which by SKILL.md contract omits the `state` arg) finds
168
+ // something to read. Without this, the loop deadlocks at Phase
169
+ // 1-detect with `VALIDATION_FAILED ... no init state at
170
+ // .cairn/init-state.json` on every fresh adoption.
171
+ const onDisk = readPhaseState(ctx.repoRoot);
172
+ if (onDisk === null) {
173
+ try {
174
+ writePhaseState(stateForCtx);
175
+ }
176
+ catch (err) {
177
+ return mcpError("INTERNAL_ERROR", `failed to seed init state: ${err instanceof Error ? err.message : String(err)}`);
178
+ }
179
+ }
209
180
  return {
210
181
  status: report.status,
211
182
  nextPhase: report.nextPhase,
212
- repoRoot,
183
+ repoRoot: stateForCtx.repoRoot,
213
184
  };
214
185
  },
215
186
  };
@@ -1 +1 @@
1
- {"version":3,"file":"init-phases.js","sourceRoot":"","sources":["../../../src/mcp/tools/init-phases.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init-phases.js","sourceRoot":"","sources":["../../../src/mcp/tools/init-phases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `cairn_resume` — read the active task's journal + spec and emit a
3
+ * resume payload that primes a fresh-context session cold.
4
+ *
5
+ * Called by the `/cairn-resume <task_id>` slash command after the
6
+ * operator `/clear`s mid-task. SessionStart hook also calls this
7
+ * automatically when it detects an active task whose journal has
8
+ * entries from a prior session_id.
9
+ *
10
+ * The payload is structured so the slash-command body can render a
11
+ * tight resume context block: title, goal, what's been done, what's
12
+ * next, in-scope decisions/invariants. No Haiku call — pure read.
13
+ */
14
+ import type { ToolDef } from "./types.js";
15
+ interface Input {
16
+ task_id?: string;
17
+ /** Cap on most-recent journal entries returned. Default 7. */
18
+ max_entries?: number;
19
+ }
20
+ export declare const resumeTool: ToolDef<Input>;
21
+ export {};
@@ -0,0 +1,88 @@
1
+ /**
2
+ * `cairn_resume` — read the active task's journal + spec and emit a
3
+ * resume payload that primes a fresh-context session cold.
4
+ *
5
+ * Called by the `/cairn-resume <task_id>` slash command after the
6
+ * operator `/clear`s mid-task. SessionStart hook also calls this
7
+ * automatically when it detects an active task whose journal has
8
+ * entries from a prior session_id.
9
+ *
10
+ * The payload is structured so the slash-command body can render a
11
+ * tight resume context block: title, goal, what's been done, what's
12
+ * next, in-scope decisions/invariants. No Haiku call — pure read.
13
+ */
14
+ import { existsSync, readFileSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import { parse as parseYaml } from "yaml";
17
+ import { mcpError } from "../errors.js";
18
+ import { resumeInput } from "../schemas.js";
19
+ import { findCurrentActiveTask, readTaskJournal, } from "../../tasks/index.js";
20
+ async function handler(ctx, input) {
21
+ const taskId = input.task_id ?? findCurrentActiveTask(ctx.repoRoot);
22
+ if (taskId === null) {
23
+ return mcpError("TASK_NOT_FOUND", "no active task to resume");
24
+ }
25
+ const taskDir = join(ctx.repoRoot, ".cairn", "tasks", "active", taskId);
26
+ if (!existsSync(taskDir)) {
27
+ return mcpError("TASK_NOT_FOUND", `active task directory missing: .cairn/tasks/active/${taskId}/`);
28
+ }
29
+ const specPath = join(taskDir, "spec.tightened.md");
30
+ let title = taskId;
31
+ let goal = "(spec not found)";
32
+ let inScopeDecisions = [];
33
+ let inScopeInvariants = [];
34
+ let targetPathGlobs = [];
35
+ if (existsSync(specPath)) {
36
+ const raw = readFileSync(specPath, "utf8");
37
+ const fmMatch = raw.match(/^---\r?\n([\s\S]*?)\n---\r?\n([\s\S]*)$/);
38
+ if (fmMatch) {
39
+ try {
40
+ const fm = parseYaml(fmMatch[1] ?? "");
41
+ if (typeof fm.title === "string")
42
+ title = fm.title;
43
+ if (Array.isArray(fm.in_scope_decisions)) {
44
+ inScopeDecisions = fm.in_scope_decisions.filter((x) => typeof x === "string");
45
+ }
46
+ if (Array.isArray(fm.in_scope_invariants)) {
47
+ inScopeInvariants = fm.in_scope_invariants.filter((x) => typeof x === "string");
48
+ }
49
+ if (Array.isArray(fm.target_path_globs)) {
50
+ targetPathGlobs = fm.target_path_globs.filter((x) => typeof x === "string");
51
+ }
52
+ }
53
+ catch {
54
+ // malformed frontmatter — fall through with defaults
55
+ }
56
+ const body = fmMatch[2] ?? "";
57
+ const goalMatch = body.match(/##\s+Goal\s*\r?\n+([\s\S]*?)(?:\r?\n##\s+|$)/);
58
+ if (goalMatch && goalMatch[1] !== undefined) {
59
+ goal = goalMatch[1].trim();
60
+ }
61
+ }
62
+ }
63
+ const journal = readTaskJournal(ctx.repoRoot, taskId, "active");
64
+ const cap = Math.max(1, Math.min(50, input.max_entries ?? 7));
65
+ const recent = journal.slice(-cap);
66
+ const lastEntry = journal.length > 0 ? journal[journal.length - 1] : null;
67
+ const nextStep = lastEntry?.next_step ?? null;
68
+ const payload = {
69
+ ok: true,
70
+ task_id: taskId,
71
+ title,
72
+ goal,
73
+ in_scope_decisions: inScopeDecisions,
74
+ in_scope_invariants: inScopeInvariants,
75
+ target_path_globs: targetPathGlobs,
76
+ recent_entries: recent,
77
+ next_step: nextStep,
78
+ total_entries: journal.length,
79
+ };
80
+ return payload;
81
+ }
82
+ export const resumeTool = {
83
+ name: "cairn_resume",
84
+ description: "Read the active task's journal + tightened spec and emit a resume payload (title, goal, in-scope DECs/INVs, last N journal entries, last-known next_step). Used after `/clear` to rebuild operator context cold. `task_id` defaults to the most-recently-touched active task.",
85
+ inputSchema: resumeInput,
86
+ handler,
87
+ };
88
+ //# sourceMappingURL=resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/mcp/tools/resume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `cairn_task_complete` — graduate an active task to a terminal phase
3
+ * and move its directory to `.cairn/tasks/done/`.
4
+ *
5
+ * Tasks created by `cairn_task_create` start at `phase: running`.
6
+ * This tool is the explicit terminal write — called by the reviewer
7
+ * subagent after attestation, by the cairn-direction skill on a
8
+ * confirmed pivot, or by the Stop-hook auto-graduator when the
9
+ * reviewer attestation lands.
10
+ *
11
+ * Outcomes:
12
+ * - `succeeded` — work complete, attestation present
13
+ * - `failed` — work attempted but did not pass acceptance
14
+ * - `aborted` — task abandoned (operator pivoted, scope removed)
15
+ */
16
+ import type { ToolDef } from "./types.js";
17
+ interface Input {
18
+ task_id: string;
19
+ outcome: "succeeded" | "failed" | "aborted";
20
+ summary?: string;
21
+ }
22
+ export declare const taskCompleteTool: ToolDef<Input>;
23
+ export {};
@@ -0,0 +1,51 @@
1
+ /**
2
+ * `cairn_task_complete` — graduate an active task to a terminal phase
3
+ * and move its directory to `.cairn/tasks/done/`.
4
+ *
5
+ * Tasks created by `cairn_task_create` start at `phase: running`.
6
+ * This tool is the explicit terminal write — called by the reviewer
7
+ * subagent after attestation, by the cairn-direction skill on a
8
+ * confirmed pivot, or by the Stop-hook auto-graduator when the
9
+ * reviewer attestation lands.
10
+ *
11
+ * Outcomes:
12
+ * - `succeeded` — work complete, attestation present
13
+ * - `failed` — work attempted but did not pass acceptance
14
+ * - `aborted` — task abandoned (operator pivoted, scope removed)
15
+ */
16
+ import { requireBootstrap } from "../bootstrap-guard.js";
17
+ import { mcpError } from "../errors.js";
18
+ import { taskCompleteInput } from "../schemas.js";
19
+ import { completeTask } from "../../tasks/index.js";
20
+ async function handler(ctx, input) {
21
+ const block = requireBootstrap(ctx.repoRoot);
22
+ if (block !== null)
23
+ return block;
24
+ const result = completeTask({
25
+ repoRoot: ctx.repoRoot,
26
+ taskId: input.task_id,
27
+ outcome: input.outcome,
28
+ ...(input.summary !== undefined ? { summary: input.summary } : {}),
29
+ source: "cairn_task_complete",
30
+ });
31
+ if (!result.ok) {
32
+ if (result.code === "TASK_NOT_FOUND" || result.code === "ALREADY_COMPLETED") {
33
+ return mcpError("TASK_NOT_FOUND", result.message);
34
+ }
35
+ return mcpError("INTERNAL_ERROR", result.message);
36
+ }
37
+ return {
38
+ ok: true,
39
+ task_id: result.taskId,
40
+ outcome: result.outcome,
41
+ completed_at: result.completedAt,
42
+ moved_to: result.movedTo,
43
+ };
44
+ }
45
+ export const taskCompleteTool = {
46
+ name: "cairn_task_complete",
47
+ description: "Graduate an active task (`.cairn/tasks/active/<task_id>/`) to a terminal phase (succeeded / failed / aborted) and move its directory to `.cairn/tasks/done/`. Called by the reviewer subagent after writing attestation.yaml, by the cairn-direction skill on a confirmed pivot, or by the Stop-hook auto-graduator. Returns TASK_NOT_FOUND if the task was already completed.",
48
+ inputSchema: taskCompleteInput,
49
+ handler,
50
+ };
51
+ //# sourceMappingURL=task-complete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-complete.js","sourceRoot":"","sources":["../../../src/mcp/tools/task-complete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAQpD,KAAK,UAAU,OAAO,CAAC,GAAe,EAAE,KAAY;IAClD,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEjC,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,KAAK,CAAC,OAAO;QACrB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,MAAM,EAAE,qBAAqB;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,IAAI,MAAM,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC5E,OAAO,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,WAAW;QAChC,QAAQ,EAAE,MAAM,CAAC,OAAO;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC9C,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EACT,gXAAgX;IAClX,WAAW,EAAE,iBAAiB;IAC9B,OAAO;CACR,CAAC"}