mind-palace-graph 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 (51) hide show
  1. package/INSTALL.md +387 -0
  2. package/README.md +602 -0
  3. package/dist/api.d.ts +682 -0
  4. package/dist/api.js +660 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/cli.d.ts +95 -0
  7. package/dist/cli.js +856 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/format.d.ts +16 -0
  10. package/dist/format.js +199 -0
  11. package/dist/format.js.map +1 -0
  12. package/dist/fuzzy.d.ts +45 -0
  13. package/dist/fuzzy.js +150 -0
  14. package/dist/fuzzy.js.map +1 -0
  15. package/dist/index.d.ts +9 -0
  16. package/dist/index.js +528 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/mcp-server.d.ts +24 -0
  19. package/dist/mcp-server.js +187 -0
  20. package/dist/mcp-server.js.map +1 -0
  21. package/dist/mind-palace.d.ts +148 -0
  22. package/dist/mind-palace.js +780 -0
  23. package/dist/mind-palace.js.map +1 -0
  24. package/dist/nodes.d.ts +57 -0
  25. package/dist/nodes.js +220 -0
  26. package/dist/nodes.js.map +1 -0
  27. package/dist/pagination.d.ts +41 -0
  28. package/dist/pagination.js +63 -0
  29. package/dist/pagination.js.map +1 -0
  30. package/dist/palace-format.d.ts +30 -0
  31. package/dist/palace-format.js +146 -0
  32. package/dist/palace-format.js.map +1 -0
  33. package/dist/rg.d.ts +34 -0
  34. package/dist/rg.js +288 -0
  35. package/dist/rg.js.map +1 -0
  36. package/dist/sources.d.ts +87 -0
  37. package/dist/sources.js +457 -0
  38. package/dist/sources.js.map +1 -0
  39. package/dist/tokens.d.ts +35 -0
  40. package/dist/tokens.js +95 -0
  41. package/dist/tokens.js.map +1 -0
  42. package/dist/types.d.ts +236 -0
  43. package/dist/types.js +8 -0
  44. package/dist/types.js.map +1 -0
  45. package/package.json +67 -0
  46. package/skills/mpg-context/SKILL.md +556 -0
  47. package/skills/mpg-context/references/anti-patterns.md +133 -0
  48. package/skills/mpg-context/references/integration.md +123 -0
  49. package/skills/mpg-context/references/mind-palace.md +217 -0
  50. package/skills/mpg-context/references/multi-agent.md +147 -0
  51. package/skills/mpg-context/references/sources.md +120 -0
package/dist/index.js ADDED
@@ -0,0 +1,528 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mpg — entry point.
4
+ *
5
+ * Wires together: arg parsing → source resolution → rg search → node
6
+ * building → budget enforcement → (optional) mind-palace operations
7
+ * → formatting → stdout.
8
+ */
9
+ import { format } from "./format.js";
10
+ import { paginate } from "./pagination.js";
11
+ import { formatPalaceList, formatPalaceGet } from "./palace-format.js";
12
+ import { addStash, addRelation, removeRelation, getRelated, traversalGraph, composeToSources, exceptToSources, intersectToSources, defaultPalacePath, dropStash, getStash, listStashes, loadPalace, pruneExpired, pruneOlderThan, pruneKeep, pruneTag, pruneAll, savePalace, } from "./mind-palace.js";
13
+ import { applyTotalBudget, applyWindowCurve, buildNode, loadSourceContent } from "./nodes.js";
14
+ import { runRg, RgError, RgNotFoundError } from "./rg.js";
15
+ import { captureCommand, getStdin, captureUrl, classifyPathSpecs, } from "./sources.js";
16
+ import { parseArgs, resolveConfig, HelpRequestedError, VersionRequestedError } from "./cli.js";
17
+ import { sampleMedianLineLength, WIDE_RECORD_MEDIAN_THRESHOLD } from "./api.js";
18
+ import { buildFuzzyRegex, verifyFuzzy } from "./fuzzy.js";
19
+ const VERSION = "0.3.0";
20
+ // Fuzzy matching is now in ./fuzzy.ts (trigram-union regex + Levenshtein
21
+ // post-filter; handles drop/insert/substitute/swap up to edit distance 2).
22
+ async function main() {
23
+ // 1. Parse + resolve config.
24
+ let config;
25
+ try {
26
+ const raw = parseArgs(process.argv.slice(2));
27
+ config = resolveConfig(raw);
28
+ }
29
+ catch (err) {
30
+ if (err instanceof HelpRequestedError) {
31
+ const { HELP } = await import("./cli.js");
32
+ process.stdout.write(HELP);
33
+ return 0;
34
+ }
35
+ if (err instanceof VersionRequestedError) {
36
+ process.stdout.write(`mpg ${VERSION}\n`);
37
+ return 0;
38
+ }
39
+ process.stderr.write(`mpg: ${err.message}\n`);
40
+ process.stderr.write(`Run 'mpg --help' for usage.\n`);
41
+ return 2;
42
+ }
43
+ // 2. Handle --ls / --tree (discovery command).
44
+ // Stream rg's stdout straight through — `rg --files` on a large
45
+ // monorepo can far exceed any reasonable buffer cap. Blocking the
46
+ // event loop on a buffered exec also causes parallel sibling mpg
47
+ // calls in the same agent turn to time out.
48
+ if (config.ls) {
49
+ const { spawn } = await import("node:child_process");
50
+ return await new Promise((resolve) => {
51
+ const cwd = process.cwd();
52
+ const proc = spawn("rg", ["--files", "--no-messages", cwd], {
53
+ stdio: ["ignore", "pipe", "pipe"],
54
+ });
55
+ proc.stdout.pipe(process.stdout);
56
+ let stderr = "";
57
+ proc.stderr.setEncoding("utf8");
58
+ proc.stderr.on("data", (chunk) => { stderr += chunk; });
59
+ proc.on("error", (err) => {
60
+ process.stderr.write(`mpg: ${err.message}\n`);
61
+ resolve(3);
62
+ });
63
+ proc.on("close", (code) => {
64
+ if (code === 0 || code === 1) {
65
+ resolve(0);
66
+ return;
67
+ }
68
+ process.stderr.write(`mpg: rg --files exited with code ${code}: ${stderr.trim()}\n`);
69
+ resolve(3);
70
+ });
71
+ });
72
+ }
73
+ // 3. Handle mind-palace operations that don't require a search.
74
+ const palacePath = config.mind_palace?.path ?? defaultPalacePath();
75
+ const palace = loadPalace(palacePath);
76
+ // Pruning operations.
77
+ if (config.mind_palace?.prune_older_than) {
78
+ const r = pruneOlderThan(palace, config.mind_palace.prune_older_than, config.mind_palace.prune_dry_run ?? false);
79
+ if (!r.dry_run)
80
+ savePalace(palacePath, palace);
81
+ process.stdout.write(formatPruneResult(r));
82
+ return 0;
83
+ }
84
+ if (config.mind_palace?.prune_keep !== undefined) {
85
+ const r = pruneKeep(palace, config.mind_palace.prune_keep, config.mind_palace.prune_dry_run ?? false);
86
+ if (!r.dry_run)
87
+ savePalace(palacePath, palace);
88
+ process.stdout.write(formatPruneResult(r));
89
+ return 0;
90
+ }
91
+ if (config.mind_palace?.prune_tag) {
92
+ const r = pruneTag(palace, config.mind_palace.prune_tag, config.mind_palace.prune_dry_run ?? false);
93
+ if (!r.dry_run)
94
+ savePalace(palacePath, palace);
95
+ process.stdout.write(formatPruneResult(r));
96
+ return 0;
97
+ }
98
+ if (config.mind_palace?.prune_all) {
99
+ const r = pruneAll(palace, config.mind_palace.prune_confirm ?? false, config.mind_palace.prune_dry_run ?? false);
100
+ if (!r.dry_run)
101
+ savePalace(palacePath, palace);
102
+ process.stdout.write(formatPruneResult(r));
103
+ return 0;
104
+ }
105
+ // Explicit `--mp-prune-expired` reports what it did. The implicit
106
+ // auto-prune below still runs on every mp-list/etc, but silently.
107
+ if (config.mind_palace?.prune_expired) {
108
+ const r = pruneExpired(palace, config.mind_palace.prune_dry_run ?? false);
109
+ if (!r.dry_run && r.removed > 0)
110
+ savePalace(palacePath, palace);
111
+ process.stdout.write(formatPruneResult(r));
112
+ return 0;
113
+ }
114
+ // Auto-prune expired stashes (runs silently on every mp-list, mp-get, etc.)
115
+ const expired = pruneExpired(palace, config.mind_palace?.prune_dry_run ?? false);
116
+ if (expired.removed > 0 && !expired.dry_run)
117
+ savePalace(palacePath, palace);
118
+ if (config.mind_palace?.list) {
119
+ const allStashes = listStashes(palace, config.mind_palace.list.tags);
120
+ const { items: stashes, pagination } = paginate(allStashes, {
121
+ page: config.page,
122
+ pageSize: config.page_size,
123
+ all: config.all,
124
+ });
125
+ process.stdout.write(formatPalaceList(stashes, palacePath, config.color, pagination));
126
+ process.stdout.write("\n");
127
+ return 0;
128
+ }
129
+ if (config.mind_palace?.get) {
130
+ const { name: stashName, with_nodes: withNodes } = config.mind_palace.get;
131
+ const stash = getStash(palace, stashName);
132
+ if (!stash) {
133
+ process.stderr.write(`mpg: no such stash: ${stashName}\n`);
134
+ return 4;
135
+ }
136
+ // Card view (default) skips the captured nodes entirely — much
137
+ // cheaper for the common "what's in this stash?" lookup. Pass
138
+ // --with-nodes (or --full) to recover the previous behavior.
139
+ if (!withNodes) {
140
+ process.stdout.write(formatPalaceGet(stash, palacePath, config.color, undefined, false));
141
+ process.stdout.write("\n");
142
+ return 0;
143
+ }
144
+ const { items: pagedNodes, pagination } = paginate(stash.nodes, {
145
+ page: config.page,
146
+ pageSize: config.page_size,
147
+ all: config.all,
148
+ });
149
+ const pagedStash = { ...stash, nodes: pagedNodes };
150
+ process.stdout.write(formatPalaceGet(pagedStash, palacePath, config.color, pagination, true));
151
+ process.stdout.write("\n");
152
+ return 0;
153
+ }
154
+ if (config.mind_palace?.drop) {
155
+ const ok = dropStash(palace, config.mind_palace.drop);
156
+ if (!ok) {
157
+ process.stderr.write(`mpg: no such stash: ${config.mind_palace.drop}\n`);
158
+ return 4;
159
+ }
160
+ savePalace(palacePath, palace);
161
+ process.stderr.write(`mpg: dropped stash "${config.mind_palace.drop}"\n`);
162
+ return 0;
163
+ }
164
+ if (config.mind_palace?.link) {
165
+ try {
166
+ const rel = addRelation(palace, config.mind_palace.link.from, config.mind_palace.link.to, config.mind_palace.link.type, config.mind_palace.link.note);
167
+ savePalace(palacePath, palace);
168
+ process.stdout.write(formatRelationResult("linked", config.mind_palace.link, rel));
169
+ return 0;
170
+ }
171
+ catch (err) {
172
+ process.stderr.write(`mpg: ${err.message}\n`);
173
+ return 4;
174
+ }
175
+ }
176
+ if (config.mind_palace?.unlink) {
177
+ try {
178
+ removeRelation(palace, config.mind_palace.unlink.from, config.mind_palace.unlink.to);
179
+ savePalace(palacePath, palace);
180
+ process.stdout.write(`<mpg unlink from="${config.mind_palace.unlink.from}" to="${config.mind_palace.unlink.to}"/>\n`);
181
+ return 0;
182
+ }
183
+ catch (err) {
184
+ process.stderr.write(`mpg: ${err.message}\n`);
185
+ return 4;
186
+ }
187
+ }
188
+ if (config.mind_palace?.related) {
189
+ const related = getRelated(palace, config.mind_palace.related);
190
+ process.stdout.write(formatRelated(related, config.mind_palace.related));
191
+ return 0;
192
+ }
193
+ if (config.mind_palace?.graph) {
194
+ const graph = traversalGraph(palace, config.mind_palace.graph.name, config.mind_palace.graph.depth);
195
+ process.stdout.write(formatGraph(graph, config.mind_palace.graph.name, config.mind_palace.graph.depth));
196
+ return 0;
197
+ }
198
+ // 3. From this point on we need a search to run.
199
+ if (!config.pattern) {
200
+ process.stderr.write("mpg: a pattern is required for searches and --mp-stash/--mp-from/--mp-compose.\n");
201
+ return 2;
202
+ }
203
+ // 4. If --mp-from / --mp-compose / --mp-except / --mp-intersect,
204
+ // derive source list from the palace.
205
+ //
206
+ // When --mp-from or --mp-compose is combined with --mp-except, the
207
+ // base-set comes from from/compose and except's stash names are
208
+ // treated as exclude. This matches the documented and tested
209
+ // semantic: "files in <base> NOT in <excluded>".
210
+ const mp = config.mind_palace;
211
+ if (mp?.from || mp?.compose || mp?.except || mp?.intersect) {
212
+ try {
213
+ let palaceSources;
214
+ if (mp.from && mp.except) {
215
+ // from minus the union of except's stashes (base + extras).
216
+ palaceSources = exceptToSources(palace, mp.from, [mp.except.base, ...mp.except.exclude]);
217
+ }
218
+ else if (mp.compose && mp.except) {
219
+ // compose minus except. We pick any one of compose's stashes as
220
+ // the "base" arg (exceptToSources needs a single base), then
221
+ // post-filter against the full compose result.
222
+ const composed = composeToSources(palace, mp.compose);
223
+ const excludeNames = [mp.except.base, ...mp.except.exclude];
224
+ const excludeIds = new Set();
225
+ for (const name of excludeNames) {
226
+ const s = palace.stashes[name];
227
+ if (!s) {
228
+ throw new Error(`Unknown stash: ${name}. Run 'mpg --mp-list' to see available stashes.`);
229
+ }
230
+ for (const src of s.sources)
231
+ excludeIds.add(src);
232
+ }
233
+ palaceSources = composed.filter((s) => !excludeIds.has(s.id));
234
+ }
235
+ else if (mp.from) {
236
+ palaceSources = composeToSources(palace, [mp.from]);
237
+ }
238
+ else if (mp.compose) {
239
+ palaceSources = composeToSources(palace, mp.compose);
240
+ }
241
+ else if (mp.except) {
242
+ palaceSources = exceptToSources(palace, mp.except.base, mp.except.exclude);
243
+ }
244
+ else {
245
+ palaceSources = intersectToSources(palace, mp.intersect);
246
+ }
247
+ for (const s of palaceSources) {
248
+ config.inputs.unshift({ type: "path", path: s.id });
249
+ }
250
+ }
251
+ catch (err) {
252
+ process.stderr.write(`mpg: ${err.message}\n`);
253
+ return 4;
254
+ }
255
+ }
256
+ // 5. Resolve inputs.
257
+ const resolved = await resolveInputs(config.inputs);
258
+ // 5b. Wide-record auto-tune. If the user didn't pass explicit
259
+ // --before/--after and --no-auto-tune was not set, sample line
260
+ // lengths from the resolved file sources. If the median is over the
261
+ // wide-record threshold (typical of JSONL events), shrink before/after
262
+ // to 0 so each node is just the matched line, not its neighbors.
263
+ let beforeTokens = config.before_tokens;
264
+ let afterTokens = config.after_tokens;
265
+ let autoTuneApplied = false;
266
+ if (config.auto_tune_eligible) {
267
+ const fileIds = [];
268
+ for (const rs of resolved) {
269
+ if (rs.source.type === "file")
270
+ fileIds.push(rs.source.id);
271
+ }
272
+ const median = sampleMedianLineLength(fileIds);
273
+ if (median > WIDE_RECORD_MEDIAN_THRESHOLD) {
274
+ beforeTokens = 0;
275
+ afterTokens = 0;
276
+ autoTuneApplied = true;
277
+ }
278
+ }
279
+ // 6. Run the search.
280
+ const t0 = Date.now();
281
+ const allNodes = [];
282
+ const sourcesSeen = new Set();
283
+ // Per-line dedup. rg emits one match record per submatch, so two
284
+ // matches on one line become two `Match` objects with identical
285
+ // (source.id, line). We always dedup on that pair so each line
286
+ // contributes at most one node — regardless of whether the line
287
+ // came from an explicit file source or from a bulk dir spec that
288
+ // re-walked the same file.
289
+ const seenLines = new Set();
290
+ // Per-source content cache. Without this a 1000-match file becomes
291
+ // 1000 readFileSync calls of the same content.
292
+ const contentCache = new Map();
293
+ function getContent(sourceId, sourceObj, inline) {
294
+ if (inline !== null)
295
+ return inline;
296
+ const hit = contentCache.get(sourceId);
297
+ if (hit !== undefined)
298
+ return hit;
299
+ const loaded = loadSourceContent(sourceObj, null);
300
+ contentCache.set(sourceId, loaded);
301
+ return loaded;
302
+ }
303
+ for (const rs of resolved) {
304
+ try {
305
+ const effectivePattern = config.fuzzy
306
+ ? buildFuzzyRegex(config.pattern)
307
+ : config.pattern;
308
+ for await (const match of runRg(effectivePattern, rs.source, rs.content, config.rg_options)) {
309
+ if (allNodes.length >= config.max_nodes)
310
+ break;
311
+ if (config.fuzzy) {
312
+ // Post-filter trigram-union candidates against the original pattern.
313
+ if (!verifyFuzzy(match.text, match.match_start, config.pattern, 2))
314
+ continue;
315
+ }
316
+ const lineKey = `${match.source.id}:${match.line}`;
317
+ if (seenLines.has(lineKey))
318
+ continue;
319
+ seenLines.add(lineKey);
320
+ const content = getContent(match.source.id, match.source, rs.content);
321
+ const node = buildNode(match, content, {
322
+ beforeTokens,
323
+ afterTokens,
324
+ clipChars: config.clip_chars,
325
+ });
326
+ allNodes.push(node);
327
+ sourcesSeen.add(match.source.id);
328
+ if (allNodes.length >= config.max_nodes)
329
+ break;
330
+ }
331
+ }
332
+ catch (err) {
333
+ if (err instanceof RgNotFoundError) {
334
+ process.stderr.write(`mpg: ${err.message}\n`);
335
+ return 3;
336
+ }
337
+ if (err instanceof RgError) {
338
+ process.stderr.write(`mpg: ${err.message}\n`);
339
+ continue;
340
+ }
341
+ throw err;
342
+ }
343
+ if (allNodes.length >= config.max_nodes)
344
+ break;
345
+ }
346
+ // 6b. Optional ordering by source file mtime.
347
+ if (config.sort === "recent" || config.sort === "oldest") {
348
+ const { statSync } = await import("node:fs");
349
+ const mtimes = new Map();
350
+ for (const n of allNodes) {
351
+ const id = n.source.id;
352
+ if (mtimes.has(id))
353
+ continue;
354
+ if (n.source.type === "file") {
355
+ try {
356
+ mtimes.set(id, statSync(id).mtimeMs);
357
+ }
358
+ catch {
359
+ mtimes.set(id, 0);
360
+ }
361
+ }
362
+ else {
363
+ mtimes.set(id, config.sort === "recent" ? -Infinity : Infinity);
364
+ }
365
+ }
366
+ const dir = config.sort === "recent" ? -1 : 1;
367
+ allNodes.sort((a, b) => {
368
+ const ma = mtimes.get(a.source.id) ?? 0;
369
+ const mb = mtimes.get(b.source.id) ?? 0;
370
+ if (ma !== mb)
371
+ return dir * (ma - mb);
372
+ return (a.match_line ?? 0) - (b.match_line ?? 0);
373
+ });
374
+ }
375
+ // 6c. Apply window-decay curve before total-budget enforcement.
376
+ if (config.window_curve && config.window_curve !== "flat") {
377
+ applyWindowCurve(allNodes, config.window_curve, beforeTokens, afterTokens);
378
+ }
379
+ // 7. Apply total token budget.
380
+ const { nodes: budgetedNodes, truncated } = applyTotalBudget(allNodes, config.max_tokens, config.strategy);
381
+ // 8. Assign IDs.
382
+ budgetedNodes.forEach((n, i) => { n.id = i + 1; });
383
+ // 9. Apply pagination if requested. This slices the nodes AFTER
384
+ // budgeting so the LLM sees consistent total_tokens / total_nodes
385
+ // and can plan its pagination strategy from the metadata.
386
+ const { items: pagedNodes, pagination } = paginate(budgetedNodes, {
387
+ page: config.page,
388
+ pageSize: config.page_size,
389
+ all: config.all,
390
+ });
391
+ // Re-assign IDs for the paged view so they're 1..N within the page.
392
+ pagedNodes.forEach((n, i) => { n.id = i + 1; });
393
+ // 10. Build result with status, so LLMs can branch on outcome without
394
+ // parsing unstructured text.
395
+ const resultSources = new Set(budgetedNodes.map((n) => n.source.id));
396
+ const totalTokensResult = budgetedNodes.reduce((s, n) => s + n.tokens, 0);
397
+ const pageTokensResult = pagedNodes.reduce((s, n) => s + n.tokens, 0);
398
+ const status = budgetedNodes.length === 0 ? "no_matches" :
399
+ truncated ? "truncated" : "ok";
400
+ const result = {
401
+ pattern: config.pattern,
402
+ effort: config.effort,
403
+ strategy: config.strategy,
404
+ status,
405
+ total_nodes: budgetedNodes.length,
406
+ total_tokens: totalTokensResult,
407
+ page_tokens: pageTokensResult,
408
+ sources_count: resultSources.size,
409
+ truncated,
410
+ nodes: pagedNodes,
411
+ duration_ms: Date.now() - t0,
412
+ before_tokens: beforeTokens,
413
+ after_tokens: afterTokens,
414
+ auto_tune_applied: autoTuneApplied || undefined,
415
+ max_nodes: config.max_nodes,
416
+ max_tokens: config.max_tokens,
417
+ pagination,
418
+ };
419
+ // 10. If --mp-stash, save the result to the palace (BEFORE emitting,
420
+ // so any error aborts cleanly without polluting the palace).
421
+ let stashedAction = null;
422
+ if (config.mind_palace?.stash) {
423
+ const stashSpec = config.mind_palace.stash;
424
+ const { action } = addStash(palace, stashSpec.name, stashSpec.note, budgetedNodes, {
425
+ pattern: config.pattern,
426
+ effort: config.effort,
427
+ sources_count: resultSources.size,
428
+ }, [...resultSources], stashSpec.tags, { replace: stashSpec.replace, locations: config.mp_stash_locations, ttl: config.mind_palace?.ttl });
429
+ savePalace(palacePath, palace);
430
+ stashedAction = action;
431
+ }
432
+ // 11. Format + emit.
433
+ process.stdout.write(format(result, config.format, config.color));
434
+ process.stdout.write("\n");
435
+ // 12. Emit a side-channel confirmation for stashing so the LLM
436
+ // harness can observe what happened without parsing the result body.
437
+ if (stashedAction) {
438
+ const s = config.mind_palace.stash;
439
+ process.stderr.write(`mpg: ${stashedAction} stash "${s.name}" (${budgetedNodes.length} nodes, ${result.total_tokens} tokens) at ${palacePath}\n`);
440
+ }
441
+ return budgetedNodes.length === 0 ? 1 : 0;
442
+ }
443
+ /** Format a relation result. */
444
+ function formatRelationResult(action, link, rel) {
445
+ return `<mpg relation action=${action} from="${link.from}" to="${link.to}" type="${rel.type}">
446
+ ${link.from} --(${rel.type})--> ${link.to}
447
+ ${rel.note ? `note: ${rel.note}\n` : ""}created: ${rel.created_at}
448
+ </mpg relation>\n`;
449
+ }
450
+ function formatRelated(related, center) {
451
+ if (related.length === 0) {
452
+ return `<mpg related name="${center}">No relationships found.</mpg related>\n`;
453
+ }
454
+ const out = [];
455
+ out.push(`<mpg related name="${center}" count="${related.length}">`);
456
+ for (const r of related) {
457
+ const dir = r.direction === "outbound" ? `--> ${r.stash.name}` : `${r.stash.name} -->`;
458
+ out.push(` ${dir} [${r.relation.type}]${r.relation.note ? ` "${r.relation.note}"` : ""}`);
459
+ }
460
+ out.push("</mpg related>");
461
+ return out.join("\n");
462
+ }
463
+ function formatGraph(graph, root, maxDepth) {
464
+ if (graph.length === 0) {
465
+ return `<mpg graph name="${root}">No relationships found.</mpg graph>\n`;
466
+ }
467
+ const out = [];
468
+ out.push(`<mpg graph name="${root}" nodes="${graph.length}" max_depth="${maxDepth}">`);
469
+ for (const g of graph) {
470
+ const indent = " ".repeat(g.depth);
471
+ const dir = g.direction === "outbound" ? "-->" : "<--";
472
+ out.push(`${indent}[depth ${g.depth}] ${g.via} ${dir} ${g.stash.name} [${g.relation.type}]${g.relation.note ? ` "${g.relation.note}"` : ""}`);
473
+ }
474
+ out.push("</mpg graph>");
475
+ return out.join("\n");
476
+ }
477
+ function formatPruneResult(r) {
478
+ const tag = r.dry_run ? " (DRY RUN — nothing was deleted)" : "";
479
+ if (r.removed === 0) {
480
+ return `<mpg prune result removed=0>No stashes matched the prune criteria.${tag}</mpg prune>\n`;
481
+ }
482
+ const names = r.names.map((n) => ` - ${n}`).join("\n");
483
+ return `<mpg prune result removed=${r.removed} dry_run=${r.dry_run}>\nRemoved stashes (${r.removed}):\n${names}\n${tag}\n</mpg prune>\n`;
484
+ }
485
+ async function resolveInputs(inputs, stdinContent) {
486
+ const out = [];
487
+ const pathInputs = inputs.filter((i) => i.type === "path");
488
+ if (pathInputs.length > 0) {
489
+ const specs = pathInputs.map((p) => p.path);
490
+ // Path-spec passthrough: dirs/globs go to rg as-is (one walk, in
491
+ // parallel, in native code) instead of being pre-expanded to per-
492
+ // file fan-out from Node.
493
+ const { files, bulk } = await classifyPathSpecs(specs, stdinContent);
494
+ for (const f of files) {
495
+ out.push({
496
+ source: { id: f, type: "file" },
497
+ content: null,
498
+ });
499
+ }
500
+ for (const b of bulk) {
501
+ out.push({
502
+ source: { id: b, type: "bulk" },
503
+ content: null,
504
+ });
505
+ }
506
+ }
507
+ const content = stdinContent ?? await getStdin();
508
+ for (const input of inputs) {
509
+ if (input.type === "command") {
510
+ const cmdContent = await captureCommand(input.command);
511
+ const src = { id: `cmd:${input.command}`, type: "command", label: `$ ${input.command}` };
512
+ out.push({ source: src, content: cmdContent });
513
+ }
514
+ else if (input.type === "url") {
515
+ const urlContent = await captureUrl(input.url);
516
+ out.push({ source: { id: input.url, type: "url" }, content: urlContent });
517
+ }
518
+ else if (input.type === "stdin") {
519
+ out.push({ source: { id: "stdin", type: "stdin" }, content });
520
+ }
521
+ }
522
+ return out;
523
+ }
524
+ main().then((code) => process.exit(code), (err) => {
525
+ process.stderr.write(`mpg: unexpected error: ${err.stack ?? err}\n`);
526
+ process.exit(99);
527
+ });
528
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Minimal MCP server for mpg.
4
+ *
5
+ * Exposes mpg as an MCP-compatible tool server. Drop this into
6
+ * Claude Desktop, Cline, Windsurf, or any MCP client.
7
+ *
8
+ * Tools: mpg_search, mpg_stash, mpg_list_stashes, mpg_get_stash,
9
+ * mpg_drop_stash, mpg_discover (--ls)
10
+ *
11
+ * Usage:
12
+ * node mcp-server.js
13
+ * # or from the repo root:
14
+ * npx tsx mcp-server.ts
15
+ *
16
+ * Configuration (Claude Desktop mcp.json):
17
+ * {
18
+ * "mpg": {
19
+ * "command": "node",
20
+ * "args": ["path/to/mcp-server.js"]
21
+ * }
22
+ * }
23
+ */
24
+ export {};