@isaacriehm/cairn-core 0.13.2 → 0.14.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 (109) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/attention/bulk-accept.js +19 -0
  3. package/dist/attention/bulk-accept.js.map +1 -1
  4. package/dist/gc/entity-orphan.d.ts +55 -0
  5. package/dist/gc/entity-orphan.js +171 -0
  6. package/dist/gc/entity-orphan.js.map +1 -0
  7. package/dist/gc/index.d.ts +4 -0
  8. package/dist/gc/index.js +2 -0
  9. package/dist/gc/index.js.map +1 -1
  10. package/dist/gc/retire.d.ts +57 -0
  11. package/dist/gc/retire.js +189 -0
  12. package/dist/gc/retire.js.map +1 -0
  13. package/dist/gc/sweep.js +11 -0
  14. package/dist/gc/sweep.js.map +1 -1
  15. package/dist/gc/types.d.ts +2 -2
  16. package/dist/hooks/ask-user-blocked.d.ts +8 -0
  17. package/dist/hooks/ask-user-blocked.js +13 -0
  18. package/dist/hooks/ask-user-blocked.js.map +1 -0
  19. package/dist/hooks/post-tool-use/ask-user-blocked.d.ts +18 -0
  20. package/dist/hooks/post-tool-use/ask-user-blocked.js +113 -0
  21. package/dist/hooks/post-tool-use/ask-user-blocked.js.map +1 -0
  22. package/dist/hooks/post-tool-use/index.d.ts +1 -0
  23. package/dist/hooks/post-tool-use/index.js +1 -0
  24. package/dist/hooks/post-tool-use/index.js.map +1 -1
  25. package/dist/hooks/runners/context-threshold.js +2 -2
  26. package/dist/hooks/runners/context-threshold.js.map +1 -1
  27. package/dist/hooks/runners/gc-autotrigger.d.ts +7 -4
  28. package/dist/hooks/runners/gc-autotrigger.js +7 -4
  29. package/dist/hooks/runners/gc-autotrigger.js.map +1 -1
  30. package/dist/hooks/runners/stop.js +260 -115
  31. package/dist/hooks/runners/stop.js.map +1 -1
  32. package/dist/init/ingest-docs.d.ts +2 -4
  33. package/dist/init/ingest-docs.js +2 -4
  34. package/dist/init/ingest-docs.js.map +1 -1
  35. package/dist/mcp/errors.d.ts +1 -1
  36. package/dist/mcp/errors.js.map +1 -1
  37. package/dist/mcp/index.d.ts +1 -0
  38. package/dist/mcp/index.js +1 -0
  39. package/dist/mcp/index.js.map +1 -1
  40. package/dist/mcp/schemas.d.ts +16 -94
  41. package/dist/mcp/schemas.js +41 -89
  42. package/dist/mcp/schemas.js.map +1 -1
  43. package/dist/mcp/tools/decision-get.js +9 -0
  44. package/dist/mcp/tools/decision-get.js.map +1 -1
  45. package/dist/mcp/tools/index.js +8 -29
  46. package/dist/mcp/tools/index.js.map +1 -1
  47. package/dist/mcp/tools/invariant-get.js +8 -0
  48. package/dist/mcp/tools/invariant-get.js.map +1 -1
  49. package/dist/mcp/tools/mission-advance.d.ts +15 -0
  50. package/dist/mcp/tools/mission-advance.js +36 -1
  51. package/dist/mcp/tools/mission-advance.js.map +1 -1
  52. package/dist/mcp/tools/record-decision.js +14 -1
  53. package/dist/mcp/tools/record-decision.js.map +1 -1
  54. package/dist/mcp/tools/retire-entity.d.ts +22 -0
  55. package/dist/mcp/tools/retire-entity.js +62 -0
  56. package/dist/mcp/tools/retire-entity.js.map +1 -0
  57. package/dist/mcp/tools/task-complete.js +28 -22
  58. package/dist/mcp/tools/task-complete.js.map +1 -1
  59. package/dist/mcp/tools/task-create.d.ts +0 -1
  60. package/dist/mcp/tools/task-create.js +41 -10
  61. package/dist/mcp/tools/task-create.js.map +1 -1
  62. package/dist/mcp/tools/task-journal-append.js +23 -2
  63. package/dist/mcp/tools/task-journal-append.js.map +1 -1
  64. package/dist/mcp/tools/task-reopen.d.ts +7 -0
  65. package/dist/mcp/tools/task-reopen.js +40 -0
  66. package/dist/mcp/tools/task-reopen.js.map +1 -0
  67. package/dist/tasks/index.d.ts +2 -2
  68. package/dist/tasks/index.js +1 -1
  69. package/dist/tasks/index.js.map +1 -1
  70. package/dist/tasks/lifecycle.d.ts +62 -19
  71. package/dist/tasks/lifecycle.js +147 -42
  72. package/dist/tasks/lifecycle.js.map +1 -1
  73. package/package.json +2 -2
  74. package/dist/mcp/tools/align-drain.d.ts +0 -7
  75. package/dist/mcp/tools/align-drain.js +0 -26
  76. package/dist/mcp/tools/align-drain.js.map +0 -1
  77. package/dist/mcp/tools/archive.d.ts +0 -8
  78. package/dist/mcp/tools/archive.js +0 -72
  79. package/dist/mcp/tools/archive.js.map +0 -1
  80. package/dist/mcp/tools/attention-restore.d.ts +0 -14
  81. package/dist/mcp/tools/attention-restore.js +0 -22
  82. package/dist/mcp/tools/attention-restore.js.map +0 -1
  83. package/dist/mcp/tools/decisions-for-symbol.d.ts +0 -7
  84. package/dist/mcp/tools/decisions-for-symbol.js +0 -42
  85. package/dist/mcp/tools/decisions-for-symbol.js.map +0 -1
  86. package/dist/mcp/tools/get-full.d.ts +0 -7
  87. package/dist/mcp/tools/get-full.js +0 -46
  88. package/dist/mcp/tools/get-full.js.map +0 -1
  89. package/dist/mcp/tools/ground-get.d.ts +0 -7
  90. package/dist/mcp/tools/ground-get.js +0 -77
  91. package/dist/mcp/tools/ground-get.js.map +0 -1
  92. package/dist/mcp/tools/mission-close.d.ts +0 -8
  93. package/dist/mcp/tools/mission-close.js +0 -48
  94. package/dist/mcp/tools/mission-close.js.map +0 -1
  95. package/dist/mcp/tools/mission-reopen.d.ts +0 -13
  96. package/dist/mcp/tools/mission-reopen.js +0 -56
  97. package/dist/mcp/tools/mission-reopen.js.map +0 -1
  98. package/dist/mcp/tools/reject-candidate.d.ts +0 -24
  99. package/dist/mcp/tools/reject-candidate.js +0 -71
  100. package/dist/mcp/tools/reject-candidate.js.map +0 -1
  101. package/dist/mcp/tools/search-candidates.d.ts +0 -20
  102. package/dist/mcp/tools/search-candidates.js +0 -93
  103. package/dist/mcp/tools/search-candidates.js.map +0 -1
  104. package/dist/mcp/tools/supersedes-chain.d.ts +0 -6
  105. package/dist/mcp/tools/supersedes-chain.js +0 -66
  106. package/dist/mcp/tools/supersedes-chain.js.map +0 -1
  107. package/dist/mcp/tools/timeline.d.ts +0 -9
  108. package/dist/mcp/tools/timeline.js +0 -61
  109. package/dist/mcp/tools/timeline.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"decisions-for-symbol.js","sourceRoot":"","sources":["../../../src/mcp/tools/decisions-for-symbol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAQxD,KAAK,UAAU,OAAO,CAAC,GAAe,EAAE,KAAY;IAClD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,GAAG,GAA4E,EAAE,CAAC;IACxF,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAChF,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC7D,IAAI,CAAC,EAAE,CAAC,OAAO;YAAE,SAAS;QAC1B,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU;YAAE,SAAS;QAC5C,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QAChE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,SAAS;QAClD,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;YACd,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK;YACpB,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM;YACtB,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAmB;IACpD,IAAI,EAAE,4BAA4B;IAClC,WAAW,EACT,4HAA4H;IAC9H,WAAW,EAAE,uBAAuB;IACpC,OAAO;CACR,CAAC"}
@@ -1,7 +0,0 @@
1
- import type { ToolDef } from "./types.js";
2
- interface Input {
3
- id: string;
4
- kind: "decision" | "invariant" | "task" | "run";
5
- }
6
- export declare const getFullTool: ToolDef<Input>;
7
- export {};
@@ -1,46 +0,0 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { decisionsDir, invariantsDir } from "@isaacriehm/cairn-state";
4
- import { mcpError } from "../errors.js";
5
- import { getFullInput } from "../schemas.js";
6
- async function handler(ctx, input) {
7
- switch (input.kind) {
8
- case "decision": {
9
- const path = join(decisionsDir(ctx.repoRoot), `${input.id}.md`);
10
- if (!existsSync(path)) {
11
- return mcpError("DECISION_NOT_FOUND", `No decision file at ${path}`);
12
- }
13
- return { id: input.id, kind: input.kind, content: readFileSync(path, "utf8") };
14
- }
15
- case "invariant": {
16
- const path = join(invariantsDir(ctx.repoRoot), `${input.id}.md`);
17
- if (!existsSync(path)) {
18
- return mcpError("INVARIANT_NOT_FOUND", `No invariant file at ${path}`);
19
- }
20
- return { id: input.id, kind: input.kind, content: readFileSync(path, "utf8") };
21
- }
22
- case "task": {
23
- const path = join(ctx.repoRoot, ".cairn", "tasks", "active", input.id, "spec.tightened.md");
24
- const fallback = join(ctx.repoRoot, ".cairn", "tasks", "active", input.id, "spec.md");
25
- const target = existsSync(path) ? path : existsSync(fallback) ? fallback : null;
26
- if (!target) {
27
- return mcpError("TASK_NOT_FOUND", `No active task ${input.id}`);
28
- }
29
- return { id: input.id, kind: input.kind, content: readFileSync(target, "utf8") };
30
- }
31
- case "run": {
32
- const meta = join(ctx.repoRoot, ".cairn", "runs", "active", input.id, "meta.json");
33
- if (!existsSync(meta)) {
34
- return mcpError("RUN_NOT_FOUND", `No active run ${input.id}`);
35
- }
36
- return { id: input.id, kind: input.kind, content: readFileSync(meta, "utf8") };
37
- }
38
- }
39
- }
40
- export const getFullTool = {
41
- name: "cairn_get_full",
42
- description: "Fetch full content of an artifact by id + kind (decision | invariant | task | run). Used after cairn_search/timeline narrows candidates.",
43
- inputSchema: getFullInput,
44
- handler,
45
- };
46
- //# sourceMappingURL=get-full.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-full.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-full.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import type { ToolDef } from "./types.js";
2
- interface Input {
3
- category: "schema" | "routes" | "events" | "quality_grades" | "glossary" | "manifest";
4
- key?: string;
5
- }
6
- export declare const groundGetTool: ToolDef<Input>;
7
- export {};
@@ -1,77 +0,0 @@
1
- import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { groundDir, manifestPath, qualityGradesPath, } from "@isaacriehm/cairn-state";
4
- import { mcpError } from "../errors.js";
5
- import { groundGetInput } from "../schemas.js";
6
- async function handler(ctx, input) {
7
- const root = groundDir(ctx.repoRoot);
8
- switch (input.category) {
9
- case "manifest": {
10
- const path = manifestPath(ctx.repoRoot);
11
- if (!existsSync(path)) {
12
- return mcpError("FILE_NOT_FOUND", "manifest.yaml not present (init not run yet?)");
13
- }
14
- return { path: ".cairn/ground/manifest.yaml", content: readFileSync(path, "utf8") };
15
- }
16
- case "quality_grades": {
17
- const path = qualityGradesPath(ctx.repoRoot);
18
- if (!existsSync(path)) {
19
- return mcpError("FILE_NOT_FOUND", "quality-grades.yaml not present (init not run yet?)");
20
- }
21
- return { path: ".cairn/ground/quality-grades.yaml", content: readFileSync(path, "utf8") };
22
- }
23
- case "glossary": {
24
- const path = join(root, "glossary.md");
25
- if (!existsSync(path)) {
26
- return mcpError("FILE_NOT_FOUND", "glossary.md not present");
27
- }
28
- return { path: ".cairn/ground/glossary.md", content: readFileSync(path, "utf8") };
29
- }
30
- case "schema":
31
- case "routes":
32
- case "events": {
33
- const dir = join(root, input.category);
34
- if (!existsSync(dir) || !statSync(dir).isDirectory()) {
35
- return mcpError("FILE_NOT_FOUND", `${input.category}/ extracts not present (no profile extractor for this stack?)`);
36
- }
37
- if (input.key !== undefined) {
38
- const candidate = join(dir, `${input.key}.md`);
39
- const fallback = join(dir, `${input.key}.yaml`);
40
- const target = existsSync(candidate)
41
- ? candidate
42
- : existsSync(fallback)
43
- ? fallback
44
- : null;
45
- if (!target) {
46
- return mcpError("FILE_NOT_FOUND", `No ${input.category} entry for key "${input.key}"`);
47
- }
48
- return {
49
- path: `.cairn/ground/${input.category}/${input.key}${target.endsWith(".yaml") ? ".yaml" : ".md"}`,
50
- content: readFileSync(target, "utf8"),
51
- };
52
- }
53
- // No key — return the directory listing.
54
- return {
55
- path: `.cairn/ground/${input.category}/`,
56
- listing: readDirShallow(dir),
57
- };
58
- }
59
- }
60
- }
61
- function readDirShallow(dir) {
62
- try {
63
- return readdirSync(dir, { withFileTypes: true, encoding: "utf8" })
64
- .filter((d) => d.isFile())
65
- .map((d) => d.name);
66
- }
67
- catch {
68
- return [];
69
- }
70
- }
71
- export const groundGetTool = {
72
- name: "cairn_ground_get",
73
- description: "Read a generated ground extract. Categories: schema | routes | events | quality_grades | glossary | manifest. `key` narrows within a category (e.g., schema → table name).",
74
- inputSchema: groundGetInput,
75
- handler,
76
- };
77
- //# sourceMappingURL=ground-get.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ground-get.js","sourceRoot":"","sources":["../../../src/mcp/tools/ground-get.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import type { ToolDef } from "./types.js";
2
- interface Input {
3
- mission_id: string;
4
- outcome: "done" | "aborted";
5
- reason?: string;
6
- }
7
- export declare const missionCloseTool: ToolDef<Input>;
8
- export {};
@@ -1,48 +0,0 @@
1
- import { appendMissionJournal, archiveMission, locateMission, readMissionState, writeMissionState, } from "@isaacriehm/cairn-state";
2
- import { requireBootstrap } from "../bootstrap-guard.js";
3
- import { mcpError } from "../errors.js";
4
- import { missionCloseInput } from "../schemas.js";
5
- async function handler(ctx, input) {
6
- const block = requireBootstrap(ctx.repoRoot);
7
- if (block !== null)
8
- return block;
9
- const scope = locateMission(ctx.repoRoot, input.mission_id);
10
- if (scope !== "active") {
11
- return mcpError("MISSION_NOT_FOUND", `Mission ${input.mission_id} not active (scope=${scope ?? "missing"})`);
12
- }
13
- const state = readMissionState(ctx.repoRoot, input.mission_id);
14
- if (state === null) {
15
- return mcpError("MISSION_NOT_FOUND", `state.json missing for ${input.mission_id}`);
16
- }
17
- const closedAt = new Date().toISOString();
18
- state.outcome = input.outcome;
19
- state.cursor.active_phase = null;
20
- state.cursor.active_phase_started_at = null;
21
- state.closed_at = closedAt;
22
- if (input.outcome === "aborted" && input.reason !== undefined) {
23
- state.abort_reason = input.reason;
24
- }
25
- writeMissionState(ctx.repoRoot, input.mission_id, state);
26
- appendMissionJournal(ctx.repoRoot, input.mission_id, {
27
- ts: closedAt,
28
- kind: "closed",
29
- detail: input.outcome === "aborted"
30
- ? `aborted${input.reason !== undefined ? `: ${input.reason}` : ""}`
31
- : "manual close",
32
- });
33
- archiveMission(ctx.repoRoot, input.mission_id);
34
- return {
35
- ok: true,
36
- mission_id: input.mission_id,
37
- outcome: input.outcome,
38
- closed_at: closedAt,
39
- archived_to: `.cairn/ground/missions/_done/${input.mission_id}/`,
40
- };
41
- }
42
- export const missionCloseTool = {
43
- name: "cairn_mission_close",
44
- description: "Close a mission and archive its dirs. `outcome=done` is the manual analogue of auto-close on last phase complete; `outcome=aborted` is the operator-driven cancel path (with optional `reason`). Roadmap moves to `.cairn/ground/missions/_done/<id>/`; per-clone runtime moves to `.cairn/missions/_done/<id>/`. Reversible via cairn_mission_reopen.",
45
- inputSchema: missionCloseInput,
46
- handler,
47
- };
48
- //# sourceMappingURL=mission-close.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mission-close.js","sourceRoot":"","sources":["../../../src/mcp/tools/mission-close.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AASlD,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,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5D,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,QAAQ,CACb,mBAAmB,EACnB,WAAW,KAAK,CAAC,UAAU,sBAAsB,KAAK,IAAI,SAAS,GAAG,CACvE,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC,mBAAmB,EAAE,0BAA0B,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,KAAK,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,MAAM,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC3B,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9D,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;IACpC,CAAC;IACD,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAEzD,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE;QACnD,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,MAAM,EACJ,KAAK,CAAC,OAAO,KAAK,SAAS;YACzB,CAAC,CAAC,UAAU,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YACnE,CAAC,CAAC,cAAc;KACrB,CAAC,CAAC;IAEH,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAE/C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,gCAAgC,KAAK,CAAC,UAAU,GAAG;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC9C,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EACT,wVAAwV;IAC1V,WAAW,EAAE,iBAAiB;IAC9B,OAAO;CACR,CAAC"}
@@ -1,13 +0,0 @@
1
- /**
2
- * `cairn_mission_reopen` — un-archive a closed mission. Moves the
3
- * `_done/<id>/` dirs back to live locations and clears the
4
- * `outcome: done|aborted` stamp so the cursor (whatever it was at
5
- * close) drives the next session. Does NOT re-execute graduated
6
- * phase tasks.
7
- */
8
- import type { ToolDef } from "./types.js";
9
- interface Input {
10
- mission_id: string;
11
- }
12
- export declare const missionReopenTool: ToolDef<Input>;
13
- export {};
@@ -1,56 +0,0 @@
1
- /**
2
- * `cairn_mission_reopen` — un-archive a closed mission. Moves the
3
- * `_done/<id>/` dirs back to live locations and clears the
4
- * `outcome: done|aborted` stamp so the cursor (whatever it was at
5
- * close) drives the next session. Does NOT re-execute graduated
6
- * phase tasks.
7
- */
8
- import { appendMissionJournal, findActiveMission, locateMission, readMissionState, restoreMission, writeMissionState, } from "@isaacriehm/cairn-state";
9
- import { requireBootstrap } from "../bootstrap-guard.js";
10
- import { mcpError } from "../errors.js";
11
- import { missionReopenInput } from "../schemas.js";
12
- async function handler(ctx, input) {
13
- const block = requireBootstrap(ctx.repoRoot);
14
- if (block !== null)
15
- return block;
16
- const scope = locateMission(ctx.repoRoot, input.mission_id);
17
- if (scope === null) {
18
- return mcpError("MISSION_NOT_FOUND", `Mission ${input.mission_id} not found`);
19
- }
20
- if (scope === "active") {
21
- return mcpError("VALIDATION_FAILED", `Mission ${input.mission_id} is already active (no reopen needed)`);
22
- }
23
- if (findActiveMission(ctx.repoRoot) !== null) {
24
- return mcpError("MISSION_ALREADY_ACTIVE", "Another mission is already active; close it before reopening this one (one active mission per repo).");
25
- }
26
- const moved = restoreMission(ctx.repoRoot, input.mission_id);
27
- if (!moved) {
28
- return mcpError("MISSION_NOT_FOUND", `Could not move archived dirs for ${input.mission_id}`);
29
- }
30
- const state = readMissionState(ctx.repoRoot, input.mission_id);
31
- if (state !== null) {
32
- state.outcome = "active";
33
- delete state.closed_at;
34
- delete state.abort_reason;
35
- writeMissionState(ctx.repoRoot, input.mission_id, state);
36
- }
37
- const reopenedAt = new Date().toISOString();
38
- appendMissionJournal(ctx.repoRoot, input.mission_id, {
39
- ts: reopenedAt,
40
- kind: "reopened",
41
- detail: `cursor: ${state?.cursor.active_phase ?? "(none)"}`,
42
- });
43
- return {
44
- ok: true,
45
- mission_id: input.mission_id,
46
- cursor: state?.cursor ?? null,
47
- reopened_at: reopenedAt,
48
- };
49
- }
50
- export const missionReopenTool = {
51
- name: "cairn_mission_reopen",
52
- description: "Un-archive a closed mission. Moves `.cairn/ground/missions/_done/<id>/` and `.cairn/missions/_done/<id>/` back to their live locations, resets `outcome` to active, and preserves the cursor at close-time. Refuses when another mission is already active. Does NOT re-execute graduated phase tasks.",
53
- inputSchema: missionReopenInput,
54
- handler,
55
- };
56
- //# sourceMappingURL=mission-reopen.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mission-reopen.js","sourceRoot":"","sources":["../../../src/mcp/tools/mission-reopen.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAOnD,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,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC,mBAAmB,EAAE,WAAW,KAAK,CAAC,UAAU,YAAY,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,QAAQ,CACb,mBAAmB,EACnB,WAAW,KAAK,CAAC,UAAU,uCAAuC,CACnE,CAAC;IACJ,CAAC;IAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,QAAQ,CACb,wBAAwB,EACxB,sGAAsG,CACvG,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC,mBAAmB,EAAE,oCAAoC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC;QACzB,OAAO,KAAK,CAAC,SAAS,CAAC;QACvB,OAAO,KAAK,CAAC,YAAY,CAAC;QAC1B,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE;QACnD,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,WAAW,KAAK,EAAE,MAAM,CAAC,YAAY,IAAI,QAAQ,EAAE;KAC5D,CAAC,CAAC;IAEH,OAAO;QACL,EAAE,EAAE,IAAI;QACR,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI;QAC7B,WAAW,EAAE,UAAU;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAmB;IAC/C,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EACT,wSAAwS;IAC1S,WAAW,EAAE,kBAAkB;IAC/B,OAAO;CACR,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * `cairn_reject_candidate` — append a topic-index slug to
3
- * `.cairn/ground/_rejected.yaml` so phase 6 / `cairn ingest` /
4
- * `cairn_propose_decision` skip it on the next pass.
5
- *
6
- * Dedup by slug — first writer wins the
7
- * `reason` string; subsequent writes only refresh `rejected_at`. The
8
- * AI-curator path stamps `rejected_by: "ai-curator"`; operator-driven
9
- * rejections (`cairn-attention` skill) reuse the same writer with
10
- * `rejected_by: "operator"`.
11
- *
12
- * Refusal modes:
13
- * - `not_found` — slug not present in the topic-index. We refuse so
14
- * stale agent calls can't poison the rejection
15
- * ledger with phantom slugs that the GC pass would
16
- * immediately drop.
17
- */
18
- import type { ToolDef } from "./types.js";
19
- interface Input {
20
- slug: string;
21
- reason: string;
22
- }
23
- export declare const rejectCandidateTool: ToolDef<Input>;
24
- export {};
@@ -1,71 +0,0 @@
1
- /**
2
- * `cairn_reject_candidate` — append a topic-index slug to
3
- * `.cairn/ground/_rejected.yaml` so phase 6 / `cairn ingest` /
4
- * `cairn_propose_decision` skip it on the next pass.
5
- *
6
- * Dedup by slug — first writer wins the
7
- * `reason` string; subsequent writes only refresh `rejected_at`. The
8
- * AI-curator path stamps `rejected_by: "ai-curator"`; operator-driven
9
- * rejections (`cairn-attention` skill) reuse the same writer with
10
- * `rejected_by: "operator"`.
11
- *
12
- * Refusal modes:
13
- * - `not_found` — slug not present in the topic-index. We refuse so
14
- * stale agent calls can't poison the rejection
15
- * ledger with phantom slugs that the GC pass would
16
- * immediately drop.
17
- */
18
- import { appendRejected, readRejectedYaml, readTopicIndex, writeRejectedYaml, } from "@isaacriehm/cairn-state";
19
- import { withWriteLock } from "../../lock.js";
20
- import { requireBootstrap } from "../bootstrap-guard.js";
21
- import { rejectCandidateInput } from "../schemas.js";
22
- const REJECTED_BY = "ai-curator";
23
- async function handler(ctx, input) {
24
- const block = requireBootstrap(ctx.repoRoot);
25
- if (block !== null)
26
- return block;
27
- return withWriteLock(ctx.repoRoot, () => {
28
- const topicIndex = readTopicIndex(ctx.repoRoot);
29
- const entry = topicIndex.topics[input.slug];
30
- if (entry === undefined) {
31
- return {
32
- ok: false,
33
- reason: "not_found",
34
- detail: `slug "${input.slug}" not in topic-index`,
35
- };
36
- }
37
- const sot = entry.candidates.find((c) => c.file === entry.sot_source);
38
- const now = new Date().toISOString();
39
- const record = {
40
- slug: input.slug,
41
- rejected_at: now,
42
- rejected_by: REJECTED_BY,
43
- reason: input.reason,
44
- sot_source: entry.sot_source,
45
- ...(sot?.line_range !== undefined ? { line_range: sot.line_range } : {}),
46
- };
47
- const current = readRejectedYaml(ctx.repoRoot);
48
- const existing = current.get(input.slug);
49
- const next = appendRejected(current, record);
50
- writeRejectedYaml(ctx.repoRoot, next);
51
- if (existing !== undefined) {
52
- return {
53
- ok: true,
54
- slug: input.slug,
55
- warning: `Slug ${input.slug} was already rejected by ${existing.rejected_by} (${existing.reason}). ` +
56
- `Refreshed rejected_at; original reason preserved.`,
57
- };
58
- }
59
- return {
60
- ok: true,
61
- slug: input.slug,
62
- };
63
- });
64
- }
65
- export const rejectCandidateTool = {
66
- name: "cairn_reject_candidate",
67
- description: "Mark a topic-index slug as not-a-decision in `.cairn/ground/_rejected.yaml`. Phase 6 / cairn ingest skip rejected slugs. Dedup by slug; first writer wins the reason string. Use when the candidate is research, narrative, plan, status, or otherwise not a binding rule.",
68
- inputSchema: rejectCandidateInput,
69
- handler,
70
- };
71
- //# sourceMappingURL=reject-candidate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reject-candidate.js","sourceRoot":"","sources":["../../../src/mcp/tools/reject-candidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAElB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAgBrD,MAAM,WAAW,GAAG,YAAY,CAAC;AAEjC,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,OAAO,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,SAAS,KAAK,CAAC,IAAI,sBAAsB;aAClB,CAAC;QACpC,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,MAAM,GAAkB;YAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,GAAG;YAChB,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE,CAAC;QAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7C,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EACL,QAAQ,KAAK,CAAC,IAAI,4BAA4B,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC,MAAM,KAAK;oBAC3F,mDAAmD;aACtB,CAAC;QACpC,CAAC;QACD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,KAAK,CAAC,IAAI;SACe,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IACjD,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EACT,4QAA4Q;IAC9Q,WAAW,EAAE,oBAAoB;IACjC,OAAO;CACR,CAAC"}
@@ -1,20 +0,0 @@
1
- /**
2
- * `cairn_search_candidates` — query topic-index entries that haven't
3
- * been promoted to a DEC yet (`dec_id IS NULL`).
4
- *
5
- * Spec: Mirrors the response shape of
6
- * `cairn_in_scope` so AI agents can use the two interchangeably
7
- * during the daily read-enrich-driven curator flow.
8
- *
9
- * The slugs returned by this tool are exactly the slugs accepted by
10
- * `cairn_propose_decision` and `cairn_reject_candidate`.
11
- */
12
- import type { ToolDef } from "./types.js";
13
- interface Input {
14
- query?: string;
15
- scope?: string;
16
- kind?: "decision" | "rule";
17
- limit?: number;
18
- }
19
- export declare const searchCandidatesTool: ToolDef<Input>;
20
- export {};
@@ -1,93 +0,0 @@
1
- /**
2
- * `cairn_search_candidates` — query topic-index entries that haven't
3
- * been promoted to a DEC yet (`dec_id IS NULL`).
4
- *
5
- * Spec: Mirrors the response shape of
6
- * `cairn_in_scope` so AI agents can use the two interchangeably
7
- * during the daily read-enrich-driven curator flow.
8
- *
9
- * The slugs returned by this tool are exactly the slugs accepted by
10
- * `cairn_propose_decision` and `cairn_reject_candidate`.
11
- */
12
- import { matchGlob, readRejectedYaml, readTopicIndex, } from "@isaacriehm/cairn-state";
13
- import { readSotBody } from "../../init/sot-emit.js";
14
- import { readAnchorMap } from "@isaacriehm/cairn-state";
15
- import { searchCandidatesInput } from "../schemas.js";
16
- /** Matches the body-preview cap used elsewhere when surfacing prose to AI agents. */
17
- const BODY_PREVIEW_CHARS = 280;
18
- const DEFAULT_LIMIT = 50;
19
- async function handler(ctx, input) {
20
- const limit = Math.min(input.limit ?? DEFAULT_LIMIT, 200);
21
- const topicIndex = readTopicIndex(ctx.repoRoot);
22
- const anchorMap = readAnchorMap(ctx.repoRoot);
23
- const rejected = readRejectedYaml(ctx.repoRoot);
24
- const q = input.query !== undefined ? input.query.toLowerCase() : null;
25
- const scope = input.scope ?? null;
26
- const out = [];
27
- for (const entry of Object.values(topicIndex.topics)) {
28
- if (entry.dec_id !== undefined)
29
- continue;
30
- if (rejected.has(entry.slug))
31
- continue;
32
- if (input.kind !== undefined && entry.marker_kind !== input.kind)
33
- continue;
34
- if (scope !== null && !matchGlob(entry.sot_source, scope))
35
- continue;
36
- const body = readSotBody(ctx.repoRoot, entry, anchorMap) ?? "";
37
- const title = deriveTitle(entry, body);
38
- if (q !== null) {
39
- const titleHit = title.toLowerCase().includes(q);
40
- const bodyHit = body.toLowerCase().includes(q);
41
- if (!titleHit && !bodyHit)
42
- continue;
43
- }
44
- const sot = entry.candidates.find((c) => c.file === entry.sot_source);
45
- const summary = {
46
- slug: entry.slug,
47
- title,
48
- sot_source: entry.sot_source,
49
- body_preview: previewBody(body),
50
- };
51
- if (sot?.line_range !== undefined)
52
- summary.line_range = sot.line_range;
53
- if (entry.marker_kind !== undefined)
54
- summary.marker_kind = entry.marker_kind;
55
- out.push(summary);
56
- }
57
- // Stable ordering: marker-kinded first, then alpha by sot_source so
58
- // pagination via `limit` is predictable across runs.
59
- out.sort((a, b) => {
60
- const am = a.marker_kind !== undefined ? 0 : 1;
61
- const bm = b.marker_kind !== undefined ? 0 : 1;
62
- if (am !== bm)
63
- return am - bm;
64
- if (a.sot_source !== b.sot_source)
65
- return a.sot_source.localeCompare(b.sot_source);
66
- return a.slug.localeCompare(b.slug);
67
- });
68
- return out.slice(0, limit);
69
- }
70
- function deriveTitle(entry, body) {
71
- const sot = entry.candidates.find((c) => c.file === entry.sot_source);
72
- if (sot?.anchor !== undefined && sot.anchor.length > 0) {
73
- return sot.anchor.replace(/[-_]+/g, " ").trim().slice(0, 120) || firstLineFallback(body);
74
- }
75
- return firstLineFallback(body);
76
- }
77
- function firstLineFallback(body) {
78
- const first = body.split("\n").find((l) => l.trim().length > 0) ?? "";
79
- return first.replace(/^#+\s*/, "").trim().slice(0, 120) || "(untitled)";
80
- }
81
- function previewBody(body) {
82
- const trimmed = body.trim();
83
- if (trimmed.length <= BODY_PREVIEW_CHARS)
84
- return trimmed;
85
- return `${trimmed.slice(0, BODY_PREVIEW_CHARS)}…`;
86
- }
87
- export const searchCandidatesTool = {
88
- name: "cairn_search_candidates",
89
- description: "List unpromoted topic-index candidates (slugs whose `dec_id` is null). Filter by `query` (substring on title/body), `scope` (glob on sot_source), or `kind` (marker_kind). Returned slugs feed `cairn_record_decision({ slug })` and `cairn_reject_candidate`.",
90
- inputSchema: searchCandidatesInput,
91
- handler,
92
- };
93
- //# sourceMappingURL=search-candidates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-candidates.js","sourceRoot":"","sources":["../../../src/mcp/tools/search-candidates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,cAAc,GAEf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAmBtD,qFAAqF;AACrF,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB,KAAK,UAAU,OAAO,CAAC,GAAe,EAAE,KAAY;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,aAAa,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEhD,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;IAElC,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS;QACzC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QACvC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,IAAI;YAAE,SAAS;QAC3E,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;YAAE,SAAS;QAEpE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAEvC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;gBAAE,SAAS;QACtC,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;QACtE,MAAM,OAAO,GAAqB;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC;SAChC,CAAC;QACF,IAAI,GAAG,EAAE,UAAU,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QACvE,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAC7E,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IAED,oEAAoE;IACpE,qDAAqD;IACrD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChB,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;YAAE,OAAO,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACnF,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,WAAW,CAAC,KAAsB,EAAE,IAAY;IACvD,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;IACtE,IAAI,GAAG,EAAE,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,YAAY,CAAC;AAC1E,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,IAAI,kBAAkB;QAAE,OAAO,OAAO,CAAC;IACzD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EACT,gQAAgQ;IAClQ,WAAW,EAAE,qBAAqB;IAClC,OAAO;CACR,CAAC"}
@@ -1,6 +0,0 @@
1
- import type { ToolDef } from "./types.js";
2
- interface Input {
3
- decision_id: string;
4
- }
5
- export declare const supersedesChainTool: ToolDef<Input>;
6
- export {};
@@ -1,66 +0,0 @@
1
- import { existsSync, readdirSync, readFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { decisionsDir, parseFrontmatter } from "@isaacriehm/cairn-state";
4
- import { DecisionFrontmatter } from "@isaacriehm/cairn-state";
5
- import { mcpError } from "../errors.js";
6
- import { supersedesChainInput } from "../schemas.js";
7
- async function handler(ctx, input) {
8
- const dir = decisionsDir(ctx.repoRoot);
9
- if (!existsSync(dir))
10
- return mcpError("DECISION_NOT_FOUND", `No decisions directory`);
11
- const all = new Map();
12
- for (const entry of readdirSync(dir, { withFileTypes: true, encoding: "utf8" })) {
13
- if (!entry.isFile() || !entry.name.endsWith(".md"))
14
- continue;
15
- const parsed = parseFrontmatter(readFileSync(join(dir, entry.name), "utf8"));
16
- const fm = DecisionFrontmatter.safeParse(parsed.frontmatter);
17
- if (!fm.success)
18
- continue;
19
- all.set(fm.data.id, {
20
- id: fm.data.id,
21
- status: fm.data.status,
22
- supersedes: fm.data.supersedes ?? null,
23
- });
24
- }
25
- if (!all.has(input.decision_id)) {
26
- return mcpError("DECISION_NOT_FOUND", `Unknown decision id ${input.decision_id}`);
27
- }
28
- // Walk back to root, then forward via reverse-supersedes index.
29
- const reverse = new Map(); // supersedes-id → newer-id
30
- for (const e of all.values()) {
31
- if (e.supersedes)
32
- reverse.set(e.supersedes, e.id);
33
- }
34
- // Find root (oldest) by walking supersedes chain backward.
35
- let root = input.decision_id;
36
- const seen = new Set();
37
- while (true) {
38
- if (seen.has(root))
39
- break;
40
- seen.add(root);
41
- const cur = all.get(root);
42
- if (!cur || cur.supersedes === null)
43
- break;
44
- root = cur.supersedes;
45
- }
46
- // Forward chain.
47
- const chain = [];
48
- const fwdSeen = new Set();
49
- let cursor = root;
50
- while (cursor && !fwdSeen.has(cursor)) {
51
- fwdSeen.add(cursor);
52
- const e = all.get(cursor);
53
- if (!e)
54
- break;
55
- chain.push(e);
56
- cursor = reverse.get(cursor);
57
- }
58
- return chain;
59
- }
60
- export const supersedesChainTool = {
61
- name: "cairn_supersedes_chain",
62
- description: "Forward chain from earliest superseded decision to current binding decision (status=accepted at the head).",
63
- inputSchema: supersedesChainInput,
64
- handler,
65
- };
66
- //# sourceMappingURL=supersedes-chain.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"supersedes-chain.js","sourceRoot":"","sources":["../../../src/mcp/tools/supersedes-chain.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import type { ToolDef } from "./types.js";
2
- interface Input {
3
- scope?: string[];
4
- since?: string;
5
- until?: string;
6
- kinds?: string[];
7
- }
8
- export declare const timelineTool: ToolDef<Input>;
9
- export {};