@reposkein/mcp 0.2.6 → 0.3.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 (71) hide show
  1. package/binary-digests.json +4 -4
  2. package/dist/SKILL.md +44 -1
  3. package/dist/cli/adr.d.ts +37 -0
  4. package/dist/cli/adr.js +231 -0
  5. package/dist/cli/adr.js.map +1 -0
  6. package/dist/cli/doctor.js +3 -0
  7. package/dist/cli/doctor.js.map +1 -1
  8. package/dist/cli/doctorDecisions.d.ts +5 -0
  9. package/dist/cli/doctorDecisions.js +83 -0
  10. package/dist/cli/doctorDecisions.js.map +1 -0
  11. package/dist/cli/init.d.ts +3 -3
  12. package/dist/cli/init.js +11 -7
  13. package/dist/cli/init.js.map +1 -1
  14. package/dist/guard/decisionValidation.d.ts +29 -0
  15. package/dist/guard/decisionValidation.js +51 -0
  16. package/dist/guard/decisionValidation.js.map +1 -0
  17. package/dist/guard/summaryValidation.d.ts +3 -0
  18. package/dist/guard/summaryValidation.js +5 -3
  19. package/dist/guard/summaryValidation.js.map +1 -1
  20. package/dist/index.d.ts +40 -0
  21. package/dist/index.js +127 -5
  22. package/dist/index.js.map +1 -1
  23. package/dist/indexer/decisionsAffected.d.ts +42 -0
  24. package/dist/indexer/decisionsAffected.js +149 -0
  25. package/dist/indexer/decisionsAffected.js.map +1 -0
  26. package/dist/indexer/ensureGraph.d.ts +36 -0
  27. package/dist/indexer/ensureGraph.js +60 -0
  28. package/dist/indexer/ensureGraph.js.map +1 -0
  29. package/dist/indexer/runIndexer.d.ts +3 -0
  30. package/dist/indexer/runIndexer.js.map +1 -1
  31. package/dist/profile/decisions.d.ts +37 -0
  32. package/dist/profile/decisions.js +112 -0
  33. package/dist/profile/decisions.js.map +1 -0
  34. package/dist/profile/types.d.ts +8 -0
  35. package/dist/store/GraphStore.d.ts +5 -0
  36. package/dist/store/JsonlGraphStore.d.ts +1 -0
  37. package/dist/store/JsonlGraphStore.js +11 -2
  38. package/dist/store/JsonlGraphStore.js.map +1 -1
  39. package/dist/store/UnconfiguredStore.js +9 -1
  40. package/dist/store/UnconfiguredStore.js.map +1 -1
  41. package/dist/store/decisions.d.ts +113 -0
  42. package/dist/store/decisions.js +288 -0
  43. package/dist/store/decisions.js.map +1 -0
  44. package/dist/tools/getContextProfile.d.ts +1 -1
  45. package/dist/tools/getContextProfile.js +9 -1
  46. package/dist/tools/getContextProfile.js.map +1 -1
  47. package/dist/tools/getDecision.d.ts +6 -0
  48. package/dist/tools/getDecision.js +59 -0
  49. package/dist/tools/getDecision.js.map +1 -0
  50. package/dist/tools/impact.d.ts +1 -1
  51. package/dist/tools/impact.js +13 -1
  52. package/dist/tools/impact.js.map +1 -1
  53. package/dist/tools/indexerTools.d.ts +2 -0
  54. package/dist/tools/indexerTools.js +27 -0
  55. package/dist/tools/indexerTools.js.map +1 -1
  56. package/dist/tools/listDecisions.d.ts +19 -0
  57. package/dist/tools/listDecisions.js +93 -0
  58. package/dist/tools/listDecisions.js.map +1 -0
  59. package/dist/tools/reaffirmDecision.d.ts +11 -0
  60. package/dist/tools/reaffirmDecision.js +55 -0
  61. package/dist/tools/reaffirmDecision.js.map +1 -0
  62. package/dist/tools/recordDecision.d.ts +24 -0
  63. package/dist/tools/recordDecision.js +130 -0
  64. package/dist/tools/recordDecision.js.map +1 -0
  65. package/dist/tools/semanticFind.d.ts +9 -2
  66. package/dist/tools/semanticFind.js +44 -2
  67. package/dist/tools/semanticFind.js.map +1 -1
  68. package/dist/tools/setDecisionStatus.d.ts +8 -0
  69. package/dist/tools/setDecisionStatus.js +34 -0
  70. package/dist/tools/setDecisionStatus.js.map +1 -0
  71. package/package.json +1 -1
@@ -0,0 +1,288 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync, } from "node:fs";
3
+ import { join } from "node:path";
4
+ const STATUSES = [
5
+ "proposed",
6
+ "accepted",
7
+ "rejected",
8
+ "deprecated",
9
+ "superseded",
10
+ ];
11
+ /** Merge-damage tiebreak when the same id appears in two files: the more
12
+ * terminal status wins (a lost supersede flip is worse than a lost flag). */
13
+ const STATUS_PRECEDENCE = {
14
+ superseded: 4,
15
+ deprecated: 3,
16
+ rejected: 2,
17
+ accepted: 1,
18
+ proposed: 0,
19
+ };
20
+ export function decisionsDir(repoPath) {
21
+ return join(repoPath, ".reposkein", "decisions");
22
+ }
23
+ /** Kebab-cases a title into the id slug: lowercase [a-z0-9-], capped. */
24
+ function slugify(title) {
25
+ const slug = title
26
+ .toLowerCase()
27
+ .replace(/[^a-z0-9]+/g, "-")
28
+ .replace(/^-+|-+$/g, "")
29
+ .slice(0, 60)
30
+ .replace(/-+$/, "");
31
+ return slug || "decision";
32
+ }
33
+ /** The ordinal-free id a (date, title) pair maps to. */
34
+ export function decisionBaseId(date, title) {
35
+ return `adr:${date}-${slugify(title)}`;
36
+ }
37
+ /** Mints `adr:<date>-<slug>`, appending `.1`, `.2`, … while taken. */
38
+ export function mintDecisionId(date, title, taken) {
39
+ const base = decisionBaseId(date, title);
40
+ if (!taken.has(base))
41
+ return base;
42
+ for (let i = 1;; i++) {
43
+ const candidate = `${base}.${i}`;
44
+ if (!taken.has(candidate))
45
+ return candidate;
46
+ }
47
+ }
48
+ /** Every id that must not be minted again: parsed record ids PLUS ids implied
49
+ * by existing filenames. The filename side matters when a file is damaged
50
+ * (conflict markers): its record doesn't parse, but minting its id anyway
51
+ * would let writeDecision rename over the hand-recoverable file — violating
52
+ * "records are never machine-deleted". */
53
+ export function takenDecisionIds(repoPath) {
54
+ const taken = new Set();
55
+ for (const { file, record } of loadDecisionFiles(repoPath)) {
56
+ if (record)
57
+ taken.add(record.id);
58
+ taken.add(`adr:${file.replace(/\.json$/, "")}`);
59
+ }
60
+ return taken;
61
+ }
62
+ /** SHA-256 over the immutable body. Excludes status/superseded_by (lifecycle)
63
+ * and anchor hash values (re-stamped by reaffirm) — but covers WHICH nodes
64
+ * and paths the decision governs, and every prose field. */
65
+ export function computeBodyHash(rec) {
66
+ const body = {
67
+ alternatives: rec.alternatives ?? "",
68
+ anchor_node_ids: rec.anchors.map((a) => a.node_id),
69
+ consequences: rec.consequences ?? "",
70
+ context: rec.context,
71
+ decided_at: rec.decided_at,
72
+ decided_by: rec.decided_by,
73
+ decision: rec.decision,
74
+ paths: rec.paths,
75
+ supersedes: rec.supersedes,
76
+ title: rec.title,
77
+ trigger: rec.trigger.kind,
78
+ };
79
+ return createHash("sha256").update(JSON.stringify(body)).digest("hex");
80
+ }
81
+ /** File name for a decision id (`adr:` prefix stripped). */
82
+ export function decisionFileName(id) {
83
+ return `${id.replace(/^adr:/, "")}.json`;
84
+ }
85
+ function sortedKeys(value) {
86
+ if (Array.isArray(value))
87
+ return value.map(sortedKeys);
88
+ if (value !== null && typeof value === "object") {
89
+ const out = {};
90
+ for (const k of Object.keys(value).sort()) {
91
+ out[k] = sortedKeys(value[k]);
92
+ }
93
+ return out;
94
+ }
95
+ return value;
96
+ }
97
+ /** Canonical bytes: `id` first, then sorted keys, 2-space indent, trailing LF.
98
+ * Pretty-printed (unlike the derived JSONL) because these files are authored
99
+ * history that humans review in PR diffs. */
100
+ export function canonicalizeDecision(rec) {
101
+ const { id, ...rest } = rec;
102
+ const sorted = sortedKeys(rest);
103
+ const withOptionalsDropped = {};
104
+ for (const [k, v] of Object.entries(sorted)) {
105
+ if (v === undefined)
106
+ continue;
107
+ withOptionalsDropped[k] = v;
108
+ }
109
+ return JSON.stringify({ id, ...withOptionalsDropped }, null, 2) + "\n";
110
+ }
111
+ /** Atomic write: temp file in the same dir, then rename. */
112
+ export function writeDecision(repoPath, rec) {
113
+ const dir = decisionsDir(repoPath);
114
+ mkdirSync(dir, { recursive: true });
115
+ const file = join(dir, decisionFileName(rec.id));
116
+ const tmp = join(dir, `.${decisionFileName(rec.id)}.tmp`);
117
+ writeFileSync(tmp, canonicalizeDecision(rec));
118
+ renameSync(tmp, file);
119
+ }
120
+ function parseDecision(obj) {
121
+ if (typeof obj.id !== "string" || !obj.id.startsWith("adr:"))
122
+ return null;
123
+ if (typeof obj.title !== "string" || typeof obj.context !== "string")
124
+ return null;
125
+ if (typeof obj.decision !== "string" || typeof obj.decided_at !== "string")
126
+ return null;
127
+ const status = obj.status;
128
+ if (typeof status !== "string" || !STATUSES.includes(status))
129
+ return null;
130
+ const anchorsRaw = Array.isArray(obj.anchors) ? obj.anchors : [];
131
+ const anchors = [];
132
+ for (const a of anchorsRaw) {
133
+ if (a === null || typeof a !== "object")
134
+ continue;
135
+ const o = a;
136
+ if (typeof o.node_id !== "string")
137
+ continue;
138
+ anchors.push({
139
+ node_id: o.node_id,
140
+ path: typeof o.path === "string" ? o.path : "",
141
+ name: typeof o.name === "string" ? o.name : "",
142
+ kind: typeof o.kind === "string" ? o.kind : "",
143
+ hash: typeof o.hash === "string" ? o.hash : null,
144
+ });
145
+ }
146
+ const strArray = (v) => Array.isArray(v) ? v.filter((x) => typeof x === "string") : [];
147
+ const triggerKind = obj.trigger !== null &&
148
+ typeof obj.trigger === "object" &&
149
+ typeof obj.trigger.kind === "string"
150
+ ? obj.trigger.kind
151
+ : "manual";
152
+ const rec = {
153
+ id: obj.id,
154
+ title: obj.title,
155
+ status: status,
156
+ context: obj.context,
157
+ decision: obj.decision,
158
+ anchors,
159
+ paths: strArray(obj.paths),
160
+ supersedes: strArray(obj.supersedes),
161
+ decided_at: obj.decided_at,
162
+ decided_by: typeof obj.decided_by === "string" ? obj.decided_by : "unknown",
163
+ trigger: {
164
+ kind: ["manual", "graph_delta", "drift"].includes(triggerKind)
165
+ ? triggerKind
166
+ : "manual",
167
+ },
168
+ body_hash: typeof obj.body_hash === "string" ? obj.body_hash : "",
169
+ };
170
+ if (typeof obj.consequences === "string")
171
+ rec.consequences = obj.consequences;
172
+ if (typeof obj.alternatives === "string")
173
+ rec.alternatives = obj.alternatives;
174
+ if (typeof obj.superseded_by === "string")
175
+ rec.superseded_by = obj.superseded_by;
176
+ return rec;
177
+ }
178
+ /** Raw per-file scan (no dedupe) — the substrate for loadDecisions and for
179
+ * doctor's duplicate/integrity checks. */
180
+ export function loadDecisionFiles(repoPath) {
181
+ const dir = decisionsDir(repoPath);
182
+ if (!existsSync(dir))
183
+ return [];
184
+ let files;
185
+ try {
186
+ files = readdirSync(dir).filter((f) => f.endsWith(".json") && !f.startsWith("."));
187
+ }
188
+ catch {
189
+ return [];
190
+ }
191
+ return files.sort().map((f) => {
192
+ let record = null;
193
+ try {
194
+ record = parseDecision(JSON.parse(readFileSync(join(dir, f), "utf8")));
195
+ }
196
+ catch {
197
+ record = null;
198
+ }
199
+ return { file: f, record };
200
+ });
201
+ }
202
+ /** Loads every decision file. Tolerant: malformed files (conflict markers,
203
+ * bad JSON, missing fields) are skipped with a warning, never thrown — a
204
+ * damaged file must not take recall down. */
205
+ export function loadDecisions(repoPath) {
206
+ const warnings = [];
207
+ const byId = new Map();
208
+ for (const { file, record } of loadDecisionFiles(repoPath)) {
209
+ if (!record) {
210
+ warnings.push(`skipped malformed decision file: ${file}`);
211
+ continue;
212
+ }
213
+ const existing = byId.get(record.id);
214
+ if (!existing || STATUS_PRECEDENCE[record.status] > STATUS_PRECEDENCE[existing.status]) {
215
+ byId.set(record.id, record);
216
+ }
217
+ }
218
+ const decisions = [...byId.values()].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
219
+ return { decisions, warnings };
220
+ }
221
+ /** Repo ids for anchor resolution: the root plus its federated children —
222
+ * decisions live at the root but may govern nodes in nested repos. Falls
223
+ * back to the root alone if federation lookup fails. */
224
+ export async function anchorRepoIds(store, repoId) {
225
+ try {
226
+ return [repoId, ...(await store.federatedRepoIds(repoId))];
227
+ }
228
+ catch {
229
+ return [repoId];
230
+ }
231
+ }
232
+ /** The portion of a node id that survives repo_id drift: `:<kind>:<rest>`.
233
+ * Shared by every decision surface — anchor resolution, profile governance,
234
+ * list filtering, and drift cross-referencing must agree on tolerance. */
235
+ export function nodeIdSuffix(nodeId) {
236
+ const m = /^rs1:[^:]+(:.+)$/.exec(nodeId);
237
+ return m ? m[1] : null;
238
+ }
239
+ /** The repo_id embedded in an rs1: node id, or null. */
240
+ export function nodeIdRepo(nodeId) {
241
+ const m = /^rs1:([^:]+):.+$/.exec(nodeId);
242
+ return m ? m[1] : null;
243
+ }
244
+ const idSuffix = nodeIdSuffix;
245
+ /** Resolves each anchor against the live graph:
246
+ * - current: node id live (exact or repo_id-suffix match), hash unchanged
247
+ * - stale: node id live, content differs since record time
248
+ * - moved: id dead, but the recorded content hash matches a live node —
249
+ * the only signal that survives renames
250
+ * - orphaned: nothing matches; kept and flagged, never deleted */
251
+ export async function resolveAnchorStates(store, repoIds, anchors) {
252
+ const out = [];
253
+ for (const anchor of anchors) {
254
+ let live = await store.getNode(repoIds, anchor.node_id);
255
+ if (!live) {
256
+ // Fork tolerance: the anchor may carry a different repo_id than the
257
+ // local checkout computes. Retry with each live repo id + the suffix.
258
+ const suffix = idSuffix(anchor.node_id);
259
+ if (suffix) {
260
+ for (const repoId of repoIds) {
261
+ const candidate = `rs1:${repoId}${suffix}`;
262
+ if (candidate === anchor.node_id)
263
+ continue;
264
+ live = await store.getNode(repoIds, candidate);
265
+ if (live)
266
+ break;
267
+ }
268
+ }
269
+ }
270
+ if (live) {
271
+ const state = anchor.hash === null || live.content_hash === null || anchor.hash === live.content_hash
272
+ ? "current"
273
+ : "stale";
274
+ out.push({ ...anchor, state, resolved_node_id: live.id });
275
+ continue;
276
+ }
277
+ if (anchor.hash && store.findByContentHash) {
278
+ const matches = await store.findByContentHash(repoIds, anchor.hash);
279
+ if (matches.length > 0) {
280
+ out.push({ ...anchor, state: "moved", resolved_node_id: matches[0].id });
281
+ continue;
282
+ }
283
+ }
284
+ out.push({ ...anchor, state: "orphaned" });
285
+ }
286
+ return out;
287
+ }
288
+ //# sourceMappingURL=decisions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../src/store/decisions.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,4 @@ export interface GetContextProfileArgs {
7
7
  hops?: number;
8
8
  federated?: boolean;
9
9
  }
10
- export declare function makeGetContextProfile(store: GraphStore, repoId: string): (args: GetContextProfileArgs) => Promise<ToolResult>;
10
+ export declare function makeGetContextProfile(store: GraphStore, repoId: string, repoPath?: string): (args: GetContextProfileArgs) => Promise<ToolResult>;
@@ -1,7 +1,8 @@
1
1
  import { resolveTarget } from "../profile/resolve.js";
2
2
  import { assembleProfile } from "../profile/assemble.js";
3
+ import { governingDecisionsFor } from "../profile/decisions.js";
3
4
  import { federationIds } from "../store/federation.js";
4
- export function makeGetContextProfile(store, repoId) {
5
+ export function makeGetContextProfile(store, repoId, repoPath) {
5
6
  return async (args) => {
6
7
  const sel = { node_id: args.node_id, file_path: args.file_path, name: args.name };
7
8
  if (!sel.node_id && !sel.name && !sel.file_path) {
@@ -34,6 +35,13 @@ export function makeGetContextProfile(store, repoId) {
34
35
  };
35
36
  }
36
37
  const profile = await assembleProfile(store, repoIds, resolved.target, hops);
38
+ if (repoPath) {
39
+ const gov = governingDecisionsFor(repoPath, resolved.target, repoId);
40
+ if (gov.decisions.length > 0)
41
+ profile.target.decisions = gov.decisions;
42
+ if (gov.needing_review.length > 0)
43
+ profile.decisions_needing_review = gov.needing_review;
44
+ }
37
45
  return { content: [{ type: "text", text: JSON.stringify(profile) }] };
38
46
  }
39
47
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"getContextProfile.js","sourceRoot":"","sources":["../../src/tools/getContextProfile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAiB,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAWvD,MAAM,UAAU,qBAAqB,CAAC,KAAiB,EAAE,MAAc;IACrE,OAAO,KAAK,EAAE,IAA2B,EAAuB,EAAE;QAChE,MAAM,GAAG,GAAa,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5F,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAChD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kDAAkD,EAAE,CAAC;gBACrF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAU,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC/E,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1D,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC7G,CAAC;YACD,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACnC,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,SAAS,EAAE,IAAI;gCACf,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oCAC1C,EAAE,EAAE,CAAC,CAAC,EAAE;oCACR,IAAI,EAAE,CAAC,CAAC,cAAc;oCACtB,SAAS,EAAE,CAAC,CAAC,SAAS;oCACtB,OAAO,EAAE,CAAC,CAAC,OAAO;iCACnB,CAAC,CAAC;6BACJ,CAAC;yBACH,CAAC;iBACH,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QACxE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACpF,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"getContextProfile.js","sourceRoot":"","sources":["../../src/tools/getContextProfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { GraphStore } from "../store/GraphStore.js";
2
+ import type { ToolResult } from "./readCypher.js";
3
+ export interface GetDecisionArgs {
4
+ decision_id: string;
5
+ }
6
+ export declare function makeGetDecision(store: GraphStore, repoId: string, repoPath: string): (args: GetDecisionArgs) => Promise<ToolResult>;
@@ -0,0 +1,59 @@
1
+ import { neutralizeSummary } from "../guard/summaryValidation.js";
2
+ import { anchorRepoIds, loadDecisions, resolveAnchorStates } from "../store/decisions.js";
3
+ const err = (text) => ({ content: [{ type: "text", text }], isError: true });
4
+ function neutralize(s) {
5
+ if (s === undefined)
6
+ return undefined;
7
+ return neutralizeSummary(s) ?? "";
8
+ }
9
+ export function makeGetDecision(store, repoId, repoPath) {
10
+ return async (args) => {
11
+ try {
12
+ const { decisions } = loadDecisions(repoPath);
13
+ const rec = decisions.find((d) => d.id === args.decision_id);
14
+ if (!rec)
15
+ return err(`unknown decision: ${args.decision_id}`);
16
+ const resolved = await resolveAnchorStates(store, await anchorRepoIds(store, repoId), rec.anchors);
17
+ // The chain in both directions: what this supersedes (recorded) and
18
+ // what supersedes it (recorded on flip, recovered from siblings if the
19
+ // flip was lost to merge damage).
20
+ const supersededBy = rec.superseded_by ??
21
+ decisions.find((d) => d.supersedes.includes(rec.id))?.id;
22
+ return {
23
+ content: [
24
+ {
25
+ type: "text",
26
+ text: JSON.stringify({
27
+ id: rec.id,
28
+ title: neutralize(rec.title),
29
+ status: rec.status,
30
+ context: neutralize(rec.context),
31
+ decision: neutralize(rec.decision),
32
+ ...(rec.consequences !== undefined ? { consequences: neutralize(rec.consequences) } : {}),
33
+ ...(rec.alternatives !== undefined ? { alternatives: neutralize(rec.alternatives) } : {}),
34
+ anchors: resolved.map((a) => ({
35
+ node_id: a.node_id,
36
+ path: a.path,
37
+ kind: a.kind,
38
+ state: a.state,
39
+ ...(a.resolved_node_id && a.resolved_node_id !== a.node_id
40
+ ? { resolved_node_id: a.resolved_node_id }
41
+ : {}),
42
+ })),
43
+ paths: rec.paths,
44
+ supersedes: rec.supersedes,
45
+ ...(supersededBy ? { superseded_by: supersededBy } : {}),
46
+ decided_at: rec.decided_at,
47
+ decided_by: rec.decided_by,
48
+ trigger: rec.trigger,
49
+ }),
50
+ },
51
+ ],
52
+ };
53
+ }
54
+ catch (e) {
55
+ return err(e.message);
56
+ }
57
+ };
58
+ }
59
+ //# sourceMappingURL=getDecision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDecision.js","sourceRoot":"","sources":["../../src/tools/getDecision.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAM1F,MAAM,GAAG,GAAG,CAAC,IAAY,EAAc,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjG,SAAS,UAAU,CAAC,CAAqB;IACvC,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,OAAO,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB,EAAE,MAAc,EAAE,QAAgB;IACjF,OAAO,KAAK,EAAE,IAAqB,EAAuB,EAAE;QAC1D,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG;gBAAE,OAAO,GAAG,CAAC,qBAAqB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACnG,oEAAoE;YACpE,uEAAuE;YACvE,kCAAkC;YAClC,MAAM,YAAY,GAChB,GAAG,CAAC,aAAa;gBACjB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC3D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,EAAE,EAAE,GAAG,CAAC,EAAE;4BACV,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;4BAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;4BAClB,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;4BAChC,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;4BAClC,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BACzF,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BACzF,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gCAC5B,OAAO,EAAE,CAAC,CAAC,OAAO;gCAClB,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gCACd,GAAG,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,gBAAgB,KAAK,CAAC,CAAC,OAAO;oCACxD,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE;oCAC1C,CAAC,CAAC,EAAE,CAAC;6BACR,CAAC,CAAC;4BACH,KAAK,EAAE,GAAG,CAAC,KAAK;4BAChB,UAAU,EAAE,GAAG,CAAC,UAAU;4BAC1B,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BACxD,UAAU,EAAE,GAAG,CAAC,UAAU;4BAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;4BAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;yBACrB,CAAC;qBACH;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -13,4 +13,4 @@ export interface ImpactArgs {
13
13
  * edges are captured in the committed graph for read_cypher/visualization but are
14
14
  * intentionally NOT traversed here (recorded decision, matched across both
15
15
  * backends) — instantiation sites are not treated as impact-bearing callers. */
16
- export declare function makeImpact(store: GraphStore, repoId: string): (args: ImpactArgs) => Promise<ToolResult>;
16
+ export declare function makeImpact(store: GraphStore, repoId: string, repoPath?: string): (args: ImpactArgs) => Promise<ToolResult>;
@@ -1,5 +1,6 @@
1
1
  import { resolveTarget } from "../profile/resolve.js";
2
2
  import { computeImpact } from "../profile/impact.js";
3
+ import { governingDecisionsForNodes } from "../profile/decisions.js";
3
4
  import { federationIds } from "../store/federation.js";
4
5
  function clamp(val, min, max) {
5
6
  return Math.min(Math.max(val, min), max);
@@ -10,7 +11,7 @@ function clamp(val, min, max) {
10
11
  * edges are captured in the committed graph for read_cypher/visualization but are
11
12
  * intentionally NOT traversed here (recorded decision, matched across both
12
13
  * backends) — instantiation sites are not treated as impact-bearing callers. */
13
- export function makeImpact(store, repoId) {
14
+ export function makeImpact(store, repoId, repoPath) {
14
15
  return async (args) => {
15
16
  const sel = {
16
17
  node_id: args.node_id,
@@ -53,6 +54,17 @@ export function makeImpact(store, repoId) {
53
54
  const target = resolved.target;
54
55
  const depth = clamp(args.depth ?? 3, 1, 5);
55
56
  const result = await computeImpact(store, repoIds, target.id, target.qualified_name, target.file_path, { depth, maxNodes: 500 });
57
+ if (repoPath) {
58
+ const gov = governingDecisionsForNodes(repoPath, [
59
+ { node_id: target.id, file_path: target.file_path, content_hash: target.content_hash },
60
+ ...result.impacted.map((r) => ({ node_id: r.node_id, file_path: r.file_path })),
61
+ ], repoId);
62
+ if (gov.length > 0) {
63
+ return {
64
+ content: [{ type: "text", text: JSON.stringify({ ...result, governing_decisions: gov }) }],
65
+ };
66
+ }
67
+ }
56
68
  return {
57
69
  content: [{ type: "text", text: JSON.stringify(result) }],
58
70
  };
@@ -1 +1 @@
1
- {"version":3,"file":"impact.js","sourceRoot":"","sources":["../../src/tools/impact.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"impact.js","sourceRoot":"","sources":["../../src/tools/impact.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  import type { ToolResult } from "./readCypher.js";
2
+ import { type GraphDeltaJson } from "../indexer/decisionsAffected.js";
2
3
  export type RunResult = {
3
4
  ok: true;
4
5
  nodes: number;
5
6
  edges: number;
6
7
  files: number;
7
8
  warnings: string[];
9
+ graph_delta?: GraphDeltaJson;
8
10
  } | {
9
11
  ok: false;
10
12
  error: string;
@@ -1,5 +1,6 @@
1
1
  import { spawnIndexer, parseJsonStats, repoPath, shouldLoadNeo4j, } from "../indexer/runIndexer.js";
2
2
  import { ensureIndexerBinary } from "../indexer/fetchBinary.js";
3
+ import { decisionsAffectedBy, mergeDeltas, readPendingDelta, } from "../indexer/decisionsAffected.js";
3
4
  /** Default runner: run the index/reindex verb with --json, then load into Neo4j
4
5
  * unless we're in JSONL mode (shouldLoadNeo4j() === false). */
5
6
  function defaultRun(repoId, indexPath, opts) {
@@ -26,9 +27,33 @@ function defaultRun(repoId, indexPath, opts) {
26
27
  edges: stats.edges,
27
28
  files: stats.files,
28
29
  warnings: stats.warnings ?? [],
30
+ ...(stats.graph_delta ? { graph_delta: stats.graph_delta } : {}),
29
31
  };
30
32
  })();
31
33
  }
34
+ /** Combines this run's delta with the pending one hook-driven indexes parked
35
+ * (their stdout is discarded — post-merge drift would otherwise vanish), and
36
+ * cross-references the decision log. `root` MUST be the repo that was
37
+ * actually indexed: consulting the env repo's decisions (or consuming its
38
+ * pending delta) while indexing some other path would cross the streams.
39
+ * Returns {} when there is no drift. */
40
+ function driftFields(root, repoId, runDelta) {
41
+ const pending = readPendingDelta(root);
42
+ let delta = runDelta ?? null;
43
+ if (pending)
44
+ delta = delta ? mergeDeltas(delta, pending) : pending;
45
+ if (!delta)
46
+ return {};
47
+ const affected = decisionsAffectedBy(root, delta, repoId);
48
+ return {
49
+ graph_delta: delta,
50
+ ...(affected.length > 0 ? { decisions_affected: affected } : {}),
51
+ // A truncated delta dropped ids past the cap, so an empty/short
52
+ // decisions_affected is NOT proof of no drift — say so instead of
53
+ // reading as "checked everything".
54
+ ...(delta.truncated ? { decisions_check_incomplete: true } : {}),
55
+ };
56
+ }
32
57
  function makeRunner(repoId, deps) {
33
58
  const run = deps?.run ?? ((id, path, opts) => defaultRun(id, path, opts));
34
59
  return run;
@@ -52,6 +77,7 @@ export function makeInitCpgSkeleton(repoId, deps) {
52
77
  files: r.files,
53
78
  duration_ms: Date.now() - start,
54
79
  warnings: r.warnings,
80
+ ...driftFields(indexPath, repoId, r.graph_delta),
55
81
  }),
56
82
  }],
57
83
  };
@@ -81,6 +107,7 @@ export function makeReindexFile(repoId, deps) {
81
107
  duration_ms: Date.now() - start,
82
108
  loaded: shouldLoadNeo4j(),
83
109
  warnings: r.warnings,
110
+ ...driftFields(indexPath, repoId, r.graph_delta),
84
111
  }),
85
112
  }],
86
113
  };
@@ -1 +1 @@
1
- {"version":3,"file":"indexerTools.js","sourceRoot":"","sources":["../../src/tools/indexerTools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexerTools.js","sourceRoot":"","sources":["../../src/tools/indexerTools.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,gBAAgB,GAGjB,MAAM,iCAAiC,CAAC;AAsBzC;gEACgE;AAChE,SAAS,UAAU,CAAC,MAAc,EAAE,SAAiB,EAAE,IAAc;IACnE,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC;IACnC,OAAO,CAAC,KAAK,IAAwB,EAAE;QACrC,MAAM,GAAG,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACxC,MAAM,QAAQ,GACZ,IAAI,KAAK,SAAS;YAChB,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrG,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,YAAY,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/F,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,wCAAwC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACrG,IAAI,eAAe,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YAC/E,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACjG,CAAC;QACD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;YAC9B,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED;;;;;yCAKyC;AACzC,SAAS,WAAW,CAClB,IAAY,EACZ,MAAc,EACd,QAAoC;IAMpC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,QAAQ,IAAI,IAAI,CAAC;IAC7B,IAAI,OAAO;QAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO;QACL,WAAW,EAAE,KAAK;QAClB,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,gEAAgE;QAChE,kEAAkE;QAClE,mCAAmC;QACnC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAE,IAA2B;IAC7D,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,EAAU,EAAE,IAAY,EAAE,IAAc,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACpG,OAAO,GAAG,CAAC;AACb,CAAC;AAOD,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,IAA2B;IAC7E,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,KAAK,EAAE,IAAc,EAAuB,EAAE;QACnD,MAAM,SAAS,GAAG,IAAI,EAAE,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACvE,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,EAAE,EAAE,IAAI;wBACR,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;wBAC/B,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC;qBACjD,CAAC;iBACH,CAAC;SACH,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAMD,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,IAA2B;IACzE,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,KAAK,EAAE,IAAiB,EAAuB,EAAE;QACtD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gCAAgC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChG,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACvE,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,EAAE,EAAE,IAAI;wBACR,SAAS,EAAE,IAAI,CAAC,IAAI;wBACpB,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;wBAC/B,MAAM,EAAE,eAAe,EAAE;wBACzB,QAAQ,EAAE,CAAC,CAAC,QAAQ;wBACpB,GAAG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC;qBACjD,CAAC;iBACH,CAAC;SACH,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { GraphStore } from "../store/GraphStore.js";
2
+ import type { ToolResult } from "./readCypher.js";
3
+ import { type DecisionRecord, type DecisionStatus } from "../store/decisions.js";
4
+ export interface ListDecisionsArgs {
5
+ status?: DecisionStatus;
6
+ /** A node_id (matched against anchors) or a file path (matched against
7
+ * anchor paths and decision path prefixes). Disambiguation: anything
8
+ * starting "rs1:" is a node_id; everything else is a path. */
9
+ anchor?: string;
10
+ /** Case-insensitive substring over title + context + decision. */
11
+ q?: string;
12
+ limit?: number;
13
+ }
14
+ /** True when the decision governs the given file path — an anchor records it
15
+ * exactly, or a decision path prefix (dir ending "/") contains it. */
16
+ export declare function governsPath(rec: DecisionRecord, filePath: string): boolean;
17
+ /** Deterministic order: decided_at desc, id asc within a day. */
18
+ export declare function sortDecisions(decisions: DecisionRecord[]): DecisionRecord[];
19
+ export declare function makeListDecisions(store: GraphStore, repoId: string, repoPath: string): (args: ListDecisionsArgs) => Promise<ToolResult>;