@isaacriehm/cairn-core 0.13.3 → 0.14.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 (100) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/gc/entity-orphan.d.ts +55 -0
  3. package/dist/gc/entity-orphan.js +171 -0
  4. package/dist/gc/entity-orphan.js.map +1 -0
  5. package/dist/gc/index.d.ts +4 -0
  6. package/dist/gc/index.js +2 -0
  7. package/dist/gc/index.js.map +1 -1
  8. package/dist/gc/retire.d.ts +57 -0
  9. package/dist/gc/retire.js +189 -0
  10. package/dist/gc/retire.js.map +1 -0
  11. package/dist/gc/sweep.js +11 -0
  12. package/dist/gc/sweep.js.map +1 -1
  13. package/dist/gc/types.d.ts +2 -2
  14. package/dist/hooks/ask-user-blocked.d.ts +8 -0
  15. package/dist/hooks/ask-user-blocked.js +13 -0
  16. package/dist/hooks/ask-user-blocked.js.map +1 -0
  17. package/dist/hooks/post-tool-use/ask-user-blocked.d.ts +18 -0
  18. package/dist/hooks/post-tool-use/ask-user-blocked.js +113 -0
  19. package/dist/hooks/post-tool-use/ask-user-blocked.js.map +1 -0
  20. package/dist/hooks/post-tool-use/index.d.ts +1 -0
  21. package/dist/hooks/post-tool-use/index.js +1 -0
  22. package/dist/hooks/post-tool-use/index.js.map +1 -1
  23. package/dist/hooks/runners/context-threshold.js +2 -2
  24. package/dist/hooks/runners/context-threshold.js.map +1 -1
  25. package/dist/hooks/runners/gc-autotrigger.d.ts +7 -4
  26. package/dist/hooks/runners/gc-autotrigger.js +7 -4
  27. package/dist/hooks/runners/gc-autotrigger.js.map +1 -1
  28. package/dist/hooks/runners/stop.js +173 -90
  29. package/dist/hooks/runners/stop.js.map +1 -1
  30. package/dist/init/ingest-docs.d.ts +2 -4
  31. package/dist/init/ingest-docs.js +2 -4
  32. package/dist/init/ingest-docs.js.map +1 -1
  33. package/dist/mcp/errors.d.ts +1 -1
  34. package/dist/mcp/errors.js.map +1 -1
  35. package/dist/mcp/schemas.d.ts +7 -94
  36. package/dist/mcp/schemas.js +23 -87
  37. package/dist/mcp/schemas.js.map +1 -1
  38. package/dist/mcp/serve.js +8 -6
  39. package/dist/mcp/serve.js.map +1 -1
  40. package/dist/mcp/tools/index.js +6 -29
  41. package/dist/mcp/tools/index.js.map +1 -1
  42. package/dist/mcp/tools/retire-entity.d.ts +22 -0
  43. package/dist/mcp/tools/retire-entity.js +62 -0
  44. package/dist/mcp/tools/retire-entity.js.map +1 -0
  45. package/dist/mcp/tools/task-complete.js +7 -19
  46. package/dist/mcp/tools/task-complete.js.map +1 -1
  47. package/dist/mcp/tools/task-create.d.ts +0 -1
  48. package/dist/mcp/tools/task-create.js +31 -10
  49. package/dist/mcp/tools/task-create.js.map +1 -1
  50. package/dist/mcp/tools/task-journal-append.js +23 -2
  51. package/dist/mcp/tools/task-journal-append.js.map +1 -1
  52. package/dist/session-start/build.d.ts +26 -0
  53. package/dist/session-start/build.js +30 -0
  54. package/dist/session-start/build.js.map +1 -1
  55. package/dist/session-start/index.d.ts +1 -1
  56. package/dist/session-start/index.js +1 -1
  57. package/dist/session-start/index.js.map +1 -1
  58. package/dist/tasks/index.d.ts +2 -2
  59. package/dist/tasks/index.js +1 -1
  60. package/dist/tasks/index.js.map +1 -1
  61. package/dist/tasks/lifecycle.d.ts +14 -22
  62. package/dist/tasks/lifecycle.js +14 -47
  63. package/dist/tasks/lifecycle.js.map +1 -1
  64. package/package.json +2 -2
  65. package/dist/mcp/tools/align-drain.d.ts +0 -7
  66. package/dist/mcp/tools/align-drain.js +0 -26
  67. package/dist/mcp/tools/align-drain.js.map +0 -1
  68. package/dist/mcp/tools/archive.d.ts +0 -8
  69. package/dist/mcp/tools/archive.js +0 -72
  70. package/dist/mcp/tools/archive.js.map +0 -1
  71. package/dist/mcp/tools/attention-restore.d.ts +0 -14
  72. package/dist/mcp/tools/attention-restore.js +0 -22
  73. package/dist/mcp/tools/attention-restore.js.map +0 -1
  74. package/dist/mcp/tools/decisions-for-symbol.d.ts +0 -7
  75. package/dist/mcp/tools/decisions-for-symbol.js +0 -42
  76. package/dist/mcp/tools/decisions-for-symbol.js.map +0 -1
  77. package/dist/mcp/tools/get-full.d.ts +0 -7
  78. package/dist/mcp/tools/get-full.js +0 -46
  79. package/dist/mcp/tools/get-full.js.map +0 -1
  80. package/dist/mcp/tools/ground-get.d.ts +0 -7
  81. package/dist/mcp/tools/ground-get.js +0 -77
  82. package/dist/mcp/tools/ground-get.js.map +0 -1
  83. package/dist/mcp/tools/mission-close.d.ts +0 -8
  84. package/dist/mcp/tools/mission-close.js +0 -53
  85. package/dist/mcp/tools/mission-close.js.map +0 -1
  86. package/dist/mcp/tools/mission-reopen.d.ts +0 -13
  87. package/dist/mcp/tools/mission-reopen.js +0 -56
  88. package/dist/mcp/tools/mission-reopen.js.map +0 -1
  89. package/dist/mcp/tools/reject-candidate.d.ts +0 -24
  90. package/dist/mcp/tools/reject-candidate.js +0 -71
  91. package/dist/mcp/tools/reject-candidate.js.map +0 -1
  92. package/dist/mcp/tools/search-candidates.d.ts +0 -20
  93. package/dist/mcp/tools/search-candidates.js +0 -93
  94. package/dist/mcp/tools/search-candidates.js.map +0 -1
  95. package/dist/mcp/tools/supersedes-chain.d.ts +0 -6
  96. package/dist/mcp/tools/supersedes-chain.js +0 -66
  97. package/dist/mcp/tools/supersedes-chain.js.map +0 -1
  98. package/dist/mcp/tools/timeline.d.ts +0 -9
  99. package/dist/mcp/tools/timeline.js +0 -61
  100. package/dist/mcp/tools/timeline.js.map +0 -1
@@ -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":"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"}
@@ -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 {};
@@ -1,61 +0,0 @@
1
- import { existsSync, readdirSync, readFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { runsTerminalDir } from "@isaacriehm/cairn-state";
4
- import { timelineInput } from "../schemas.js";
5
- /** Returns chronologically ordered run/event records intersecting the scope window. */
6
- async function handler(ctx, input) {
7
- const out = [];
8
- const since = input.since ? Date.parse(input.since) : 0;
9
- const until = input.until ? Date.parse(input.until) : Number.POSITIVE_INFINITY;
10
- const wantKinds = input.kinds ? new Set(input.kinds) : null;
11
- const dir = runsTerminalDir(ctx.repoRoot);
12
- if (existsSync(dir)) {
13
- for (const e of readdirSync(dir, { withFileTypes: true, encoding: "utf8" })) {
14
- if (!e.isDirectory())
15
- continue;
16
- const meta = readJson(join(dir, e.name, "meta.json"));
17
- if (!meta)
18
- continue;
19
- const ts = meta.finished_at ?? meta.started_at;
20
- if (!ts)
21
- continue;
22
- const tsMs = Date.parse(ts);
23
- if (Number.isNaN(tsMs) || tsMs < since || tsMs > until)
24
- continue;
25
- if (wantKinds && !wantKinds.has("run"))
26
- continue;
27
- // scope filter — scoped_module substring match.
28
- if (input.scope && input.scope.length > 0 && meta.scoped_module) {
29
- const hit = input.scope.some((g) => meta.scoped_module?.includes(g) ?? false);
30
- if (!hit)
31
- continue;
32
- }
33
- out.push({
34
- ts,
35
- kind: "run",
36
- run_id: meta.run_id,
37
- ...(meta.task_id !== undefined ? { task_id: meta.task_id } : {}),
38
- ...(meta.phase !== undefined ? { detail: meta.phase } : {}),
39
- });
40
- }
41
- }
42
- out.sort((a, b) => b.ts.localeCompare(a.ts));
43
- return out;
44
- }
45
- function readJson(path) {
46
- if (!existsSync(path))
47
- return null;
48
- try {
49
- return JSON.parse(readFileSync(path, "utf8"));
50
- }
51
- catch {
52
- return null;
53
- }
54
- }
55
- export const timelineTool = {
56
- name: "cairn_timeline",
57
- description: "Chronological run-event stream intersecting the scope window. Reads runs/terminal/.",
58
- inputSchema: timelineInput,
59
- handler,
60
- };
61
- //# sourceMappingURL=timeline.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../../src/mcp/tools/timeline.ts"],"names":[],"mappings":"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"}