mneme-ai 0.8.3

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 (107) hide show
  1. package/README.md +45 -0
  2. package/bin/mneme.js +2 -0
  3. package/dist/commands/adapt.d.ts +6 -0
  4. package/dist/commands/adapt.d.ts.map +1 -0
  5. package/dist/commands/adapt.js +219 -0
  6. package/dist/commands/adapt.js.map +1 -0
  7. package/dist/commands/ask.d.ts +8 -0
  8. package/dist/commands/ask.d.ts.map +1 -0
  9. package/dist/commands/ask.js +76 -0
  10. package/dist/commands/ask.js.map +1 -0
  11. package/dist/commands/blast.d.ts +8 -0
  12. package/dist/commands/blast.d.ts.map +1 -0
  13. package/dist/commands/blast.js +132 -0
  14. package/dist/commands/blast.js.map +1 -0
  15. package/dist/commands/clones.d.ts +19 -0
  16. package/dist/commands/clones.d.ts.map +1 -0
  17. package/dist/commands/clones.js +155 -0
  18. package/dist/commands/clones.js.map +1 -0
  19. package/dist/commands/conscience.d.ts +15 -0
  20. package/dist/commands/conscience.d.ts.map +1 -0
  21. package/dist/commands/conscience.js +202 -0
  22. package/dist/commands/conscience.js.map +1 -0
  23. package/dist/commands/correlate.d.ts +18 -0
  24. package/dist/commands/correlate.d.ts.map +1 -0
  25. package/dist/commands/correlate.js +173 -0
  26. package/dist/commands/correlate.js.map +1 -0
  27. package/dist/commands/echo.d.ts +16 -0
  28. package/dist/commands/echo.d.ts.map +1 -0
  29. package/dist/commands/echo.js +175 -0
  30. package/dist/commands/echo.js.map +1 -0
  31. package/dist/commands/genius.d.ts +13 -0
  32. package/dist/commands/genius.d.ts.map +1 -0
  33. package/dist/commands/genius.js +213 -0
  34. package/dist/commands/genius.js.map +1 -0
  35. package/dist/commands/heal.d.ts +22 -0
  36. package/dist/commands/heal.d.ts.map +1 -0
  37. package/dist/commands/heal.js +160 -0
  38. package/dist/commands/heal.js.map +1 -0
  39. package/dist/commands/index-cmd.d.ts +9 -0
  40. package/dist/commands/index-cmd.d.ts.map +1 -0
  41. package/dist/commands/index-cmd.js +74 -0
  42. package/dist/commands/index-cmd.js.map +1 -0
  43. package/dist/commands/init.d.ts +6 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +34 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/mcp.d.ts +4 -0
  48. package/dist/commands/mcp.d.ts.map +1 -0
  49. package/dist/commands/mcp.js +10 -0
  50. package/dist/commands/mcp.js.map +1 -0
  51. package/dist/commands/palimpsest.d.ts +22 -0
  52. package/dist/commands/palimpsest.d.ts.map +1 -0
  53. package/dist/commands/palimpsest.js +164 -0
  54. package/dist/commands/palimpsest.js.map +1 -0
  55. package/dist/commands/status.d.ts +4 -0
  56. package/dist/commands/status.d.ts.map +1 -0
  57. package/dist/commands/status.js +49 -0
  58. package/dist/commands/status.js.map +1 -0
  59. package/dist/commands/teach.d.ts +16 -0
  60. package/dist/commands/teach.d.ts.map +1 -0
  61. package/dist/commands/teach.js +237 -0
  62. package/dist/commands/teach.js.map +1 -0
  63. package/dist/commands/teach.test.d.ts +2 -0
  64. package/dist/commands/teach.test.d.ts.map +1 -0
  65. package/dist/commands/teach.test.js +44 -0
  66. package/dist/commands/teach.test.js.map +1 -0
  67. package/dist/commands/why.d.ts +12 -0
  68. package/dist/commands/why.d.ts.map +1 -0
  69. package/dist/commands/why.js +85 -0
  70. package/dist/commands/why.js.map +1 -0
  71. package/dist/commands/wild-features.d.ts +42 -0
  72. package/dist/commands/wild-features.d.ts.map +1 -0
  73. package/dist/commands/wild-features.js +483 -0
  74. package/dist/commands/wild-features.js.map +1 -0
  75. package/dist/commands/wild-stubs.d.ts +6 -0
  76. package/dist/commands/wild-stubs.d.ts.map +1 -0
  77. package/dist/commands/wild-stubs.js +112 -0
  78. package/dist/commands/wild-stubs.js.map +1 -0
  79. package/dist/commands/wisdom.d.ts +13 -0
  80. package/dist/commands/wisdom.d.ts.map +1 -0
  81. package/dist/commands/wisdom.js +94 -0
  82. package/dist/commands/wisdom.js.map +1 -0
  83. package/dist/config.d.ts +26 -0
  84. package/dist/config.d.ts.map +1 -0
  85. package/dist/config.js +28 -0
  86. package/dist/config.js.map +1 -0
  87. package/dist/index.d.ts +2 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +371 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/meditations.d.ts +24 -0
  92. package/dist/meditations.d.ts.map +1 -0
  93. package/dist/meditations.js +120 -0
  94. package/dist/meditations.js.map +1 -0
  95. package/dist/meditations.test.d.ts +2 -0
  96. package/dist/meditations.test.d.ts.map +1 -0
  97. package/dist/meditations.test.js +70 -0
  98. package/dist/meditations.test.js.map +1 -0
  99. package/dist/paths.d.ts +7 -0
  100. package/dist/paths.d.ts.map +1 -0
  101. package/dist/paths.js +14 -0
  102. package/dist/paths.js.map +1 -0
  103. package/dist/ui.d.ts +12 -0
  104. package/dist/ui.d.ts.map +1 -0
  105. package/dist/ui.js +30 -0
  106. package/dist/ui.js.map +1 -0
  107. package/package.json +46 -0
@@ -0,0 +1,74 @@
1
+ import { git, indexer, store } from "@mneme-ai/core";
2
+ import { resolveEmbedder } from "@mneme-ai/embeddings";
3
+ import { dbPath } from "../paths.js";
4
+ import { readConfig, writeConfig } from "../config.js";
5
+ import { ui, formatProgress } from "../ui.js";
6
+ import kleur from "kleur";
7
+ export async function indexCommand(opts) {
8
+ ui.banner();
9
+ if (!(await git.isGitRepo(opts.cwd))) {
10
+ ui.error("Not in a git repo. Run `mneme init` first.");
11
+ return 1;
12
+ }
13
+ const meta = await git.getRepoMeta(opts.cwd);
14
+ const cfg = readConfig(meta.rootPath);
15
+ const embedder = await resolveEmbedder({
16
+ provider: opts.embedder ?? cfg.embeddings.provider,
17
+ model: opts.model ?? cfg.embeddings.model,
18
+ baseUrl: cfg.embeddings.baseUrl,
19
+ });
20
+ ui.step("embedder", `${kleur.bold(embedder.name)} ${kleur.gray(`(${embedder.dimensions} dims)`)}`);
21
+ if (embedder.name.startsWith("hash:")) {
22
+ ui.warn("Using hash-trick fallback. For real semantic quality install Ollama:");
23
+ ui.dim(" ollama pull nomic-embed-text && ollama serve");
24
+ }
25
+ const s = new store.MnemeStore(dbPath(meta.rootPath));
26
+ s.setMeta("repo_root", meta.rootPath);
27
+ s.setMeta("embedder", embedder.name);
28
+ let last = 0;
29
+ const idx = new indexer.Indexer({
30
+ cwd: meta.rootPath,
31
+ store: s,
32
+ embedder,
33
+ since: opts.since ?? cfg.index.since,
34
+ maxCount: opts.maxCount ?? cfg.index.maxCount,
35
+ onProgress: (p) => {
36
+ const now = Date.now();
37
+ if (now - last < 80 && p.phase !== "done")
38
+ return;
39
+ last = now;
40
+ const bar = p.total > 0 ? formatProgress(p.current, p.total) : "";
41
+ ui.raw(`\r${kleur.gray("›")} ${kleur.bold(p.phase.padEnd(10))} ${bar} ${kleur.gray(p.message ?? "")} `);
42
+ if (p.phase === "done")
43
+ ui.raw("\n");
44
+ },
45
+ });
46
+ const t0 = Date.now();
47
+ const result = await idx.run();
48
+ const elapsed = ((Date.now() - t0) / 1000).toFixed(1);
49
+ s.setMeta("indexed_at", new Date().toISOString());
50
+ // Pin the resolved embedder into config so subsequent `ask` uses the same
51
+ // vector space (otherwise auto-detect could pick a different provider whose
52
+ // embeddings are incompatible with what's stored).
53
+ const resolvedKind = embedder.name.startsWith("ollama:")
54
+ ? "ollama"
55
+ : embedder.name.startsWith("openai:")
56
+ ? "openai"
57
+ : "hash";
58
+ const resolvedModel = embedder.name.includes(":")
59
+ ? embedder.name.split(":").slice(1).join(":")
60
+ : undefined;
61
+ if (cfg.embeddings.provider !== resolvedKind ||
62
+ (resolvedModel && cfg.embeddings.model !== resolvedModel)) {
63
+ cfg.embeddings.provider = resolvedKind;
64
+ if (resolvedModel)
65
+ cfg.embeddings.model = resolvedModel;
66
+ writeConfig(meta.rootPath, cfg);
67
+ }
68
+ ui.dim("");
69
+ ui.success(`Indexed ${result.commits} commits → ${result.chunks} chunks in ${elapsed}s`);
70
+ ui.dim(`DB: ${dbPath(meta.rootPath)}`);
71
+ s.close();
72
+ return 0;
73
+ }
74
+ //# sourceMappingURL=index-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cmd.js","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface InitOptions {
2
+ cwd: string;
3
+ force?: boolean;
4
+ }
5
+ export declare function initCommand(opts: InitOptions): Promise<number>;
6
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BpE"}
@@ -0,0 +1,34 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { git } from "@mneme-ai/core";
3
+ import { mnemeDir } from "../paths.js";
4
+ import { writeConfig, DEFAULT_CONFIG, readConfig } from "../config.js";
5
+ import { ui } from "../ui.js";
6
+ export async function initCommand(opts) {
7
+ ui.banner();
8
+ ui.step("init", `checking ${opts.cwd}`);
9
+ if (!(await git.isGitRepo(opts.cwd))) {
10
+ ui.error("Not inside a git repository.");
11
+ ui.dim("Run `git init` first, or cd into a repo, then re-run mneme init.");
12
+ return 1;
13
+ }
14
+ const meta = await git.getRepoMeta(opts.cwd);
15
+ ui.success(`Repo detected: ${meta.rootPath}`);
16
+ ui.dim(` default branch: ${meta.defaultBranch}`);
17
+ if (meta.host)
18
+ ui.dim(` remote: ${meta.host}:${meta.owner}/${meta.repo}`);
19
+ mkdirSync(mnemeDir(meta.rootPath), { recursive: true });
20
+ const existing = readConfig(meta.rootPath);
21
+ if (!opts.force && existing !== DEFAULT_CONFIG && existing.schemaVersion === DEFAULT_CONFIG.schemaVersion) {
22
+ ui.info("Config already present (use --force to overwrite).");
23
+ }
24
+ else {
25
+ writeConfig(meta.rootPath, DEFAULT_CONFIG);
26
+ ui.success("Wrote .mneme/config.json");
27
+ }
28
+ ui.dim("");
29
+ ui.dim("Next: mneme index (build the memory)");
30
+ ui.dim(" mneme ask \"...\" (query the memory)");
31
+ ui.dim(" mneme mcp (serve to Claude/Cursor/etc.)");
32
+ return 0;
33
+ }
34
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAO9B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAiB;IACjD,EAAE,CAAC,MAAM,EAAE,CAAC;IACZ,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAExC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACrC,EAAE,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACzC,EAAE,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,EAAE,CAAC,OAAO,CAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9C,EAAE,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,IAAI;QAAE,EAAE,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3E,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,CAAC,aAAa,KAAK,cAAc,CAAC,aAAa,EAAE,CAAC;QAC1G,EAAE,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC3C,EAAE,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACzC,CAAC;IAED,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACX,EAAE,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAC3D,EAAE,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAC7D,EAAE,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IACtE,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function mcpCommand(opts: {
2
+ cwd: string;
3
+ }): Promise<number>;
4
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAGA,wBAAsB,UAAU,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAMvE"}
@@ -0,0 +1,10 @@
1
+ import { ui } from "../ui.js";
2
+ import kleur from "kleur";
3
+ export async function mcpCommand(opts) {
4
+ // Defer load — mcp package is heavy and only needed when launching the server.
5
+ const { startMcpServer } = await import("@mneme-ai/mcp");
6
+ ui.dim(kleur.gray("[mneme mcp] starting MCP server on stdio …"));
7
+ await startMcpServer({ cwd: opts.cwd });
8
+ return 0;
9
+ }
10
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAqB;IACpD,+EAA+E;IAC/E,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IACzD,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACjE,MAAM,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,22 @@
1
+ export interface PalimpsestCommandOptions {
2
+ cwd: string;
3
+ target: string;
4
+ /** How deep to walk the chain. */
5
+ maxDepth?: number;
6
+ json?: boolean;
7
+ }
8
+ /**
9
+ * `mneme palimpsest <file>:<line>` — render the full causal ancestry of a single
10
+ * line of code:
11
+ *
12
+ * line 47 of payment.ts
13
+ * ↑ added by a1b2c3d (PR #482, fix Stripe BigInt)
14
+ * ↑ correlated with incident INC-1287
15
+ * ↑ which followed commit f8e7d6c (introduce idempotency)
16
+ * ↑ approved by alice + bob
17
+ *
18
+ * The chain alternates between commits and incidents, walking edges from the
19
+ * `correlations` table. Cycles are guarded by a visited set.
20
+ */
21
+ export declare function palimpsestCommand(opts: PalimpsestCommandOptions): Promise<number>;
22
+ //# sourceMappingURL=palimpsest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palimpsest.d.ts","sourceRoot":"","sources":["../../src/commands/palimpsest.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAWD;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCvF"}
@@ -0,0 +1,164 @@
1
+ import kleur from "kleur";
2
+ import { git, store } from "@mneme-ai/core";
3
+ import { dbPath } from "../paths.js";
4
+ import { ui } from "../ui.js";
5
+ /**
6
+ * `mneme palimpsest <file>:<line>` — render the full causal ancestry of a single
7
+ * line of code:
8
+ *
9
+ * line 47 of payment.ts
10
+ * ↑ added by a1b2c3d (PR #482, fix Stripe BigInt)
11
+ * ↑ correlated with incident INC-1287
12
+ * ↑ which followed commit f8e7d6c (introduce idempotency)
13
+ * ↑ approved by alice + bob
14
+ *
15
+ * The chain alternates between commits and incidents, walking edges from the
16
+ * `correlations` table. Cycles are guarded by a visited set.
17
+ */
18
+ export async function palimpsestCommand(opts) {
19
+ if (!(await git.isGitRepo(opts.cwd))) {
20
+ ui.error("Not in a git repo. Run `mneme init` first.");
21
+ return 1;
22
+ }
23
+ const meta = await git.getRepoMeta(opts.cwd);
24
+ const s = new store.MnemeStore(dbPath(meta.rootPath));
25
+ const { file, startLine, endLine } = parseTarget(opts.target);
26
+ // Step 1: blame to find the originating commit(s) for the target line range.
27
+ const blamed = await git.blame(meta.rootPath, file, startLine, endLine);
28
+ if (!blamed.length) {
29
+ ui.error(`No blame data for ${file}${startLine ? `:${startLine}` : ""}. File may be untracked.`);
30
+ s.close();
31
+ return 1;
32
+ }
33
+ // Pick the most-recent originating commit by author time.
34
+ const sorted = [...blamed].sort((a, b) => b.authorTime - a.authorTime);
35
+ const seedHash = sorted[0].commitHash;
36
+ // Step 2: walk the chain.
37
+ const chain = walkChain(s, seedHash, opts.maxDepth ?? 8);
38
+ if (opts.json) {
39
+ process.stdout.write(JSON.stringify({ target: opts.target, chain }, null, 2) + "\n");
40
+ s.close();
41
+ return 0;
42
+ }
43
+ printChain(opts.target, chain);
44
+ s.close();
45
+ return 0;
46
+ }
47
+ function walkChain(s, seedHash, maxDepth) {
48
+ const visited = new Set();
49
+ const chain = [];
50
+ let cursor = { kind: "commit", id: seedHash };
51
+ for (let depth = 0; depth < maxDepth; depth++) {
52
+ const cursorKey = `${cursor.kind}:${cursor.id}`;
53
+ if (visited.has(cursorKey))
54
+ break;
55
+ visited.add(cursorKey);
56
+ if (cursor.kind === "commit") {
57
+ const commit = s.getCommit(cursor.id);
58
+ if (!commit)
59
+ break;
60
+ chain.push({
61
+ kind: "commit",
62
+ id: commit.shortHash || commit.hash.slice(0, 8),
63
+ label: commit.subject,
64
+ date: commit.authorDate.slice(0, 10),
65
+ detail: `${commit.authorName}${commit.prNumber ? ` · PR #${commit.prNumber}` : ""}`,
66
+ });
67
+ // Find correlations FROM this commit to incidents (this commit may have caused them).
68
+ const next = nextEdgeFrom(s, "commit", commit.hash);
69
+ if (!next)
70
+ break;
71
+ cursor = { kind: next.kind, id: next.id };
72
+ chain[chain.length - 1].via = next.reason;
73
+ }
74
+ else {
75
+ // cursor is incident
76
+ const inc = loadIncident(s, cursor.id);
77
+ if (!inc)
78
+ break;
79
+ chain.push({
80
+ kind: "incident",
81
+ id: inc.id,
82
+ label: inc.title,
83
+ date: inc.occurredAt.slice(0, 10),
84
+ detail: `severity ${inc.severity}${inc.url ? ` · ${inc.url}` : ""}`,
85
+ });
86
+ // From an incident, walk to commits that are likely the cause (highest weight).
87
+ const next = causesOfIncident(s, inc.id);
88
+ if (!next)
89
+ break;
90
+ cursor = { kind: "commit", id: next.id };
91
+ chain[chain.length - 1].via = next.reason;
92
+ }
93
+ }
94
+ return chain;
95
+ }
96
+ function nextEdgeFrom(s, kind, id) {
97
+ const row = s.db
98
+ .prepare(`SELECT to_kind, to_id, weight, reason FROM correlations
99
+ WHERE from_kind = ? AND from_id = ? ORDER BY weight DESC LIMIT 1`)
100
+ .get(kind, id);
101
+ if (!row)
102
+ return null;
103
+ return {
104
+ kind: row.to_kind,
105
+ id: row.to_id,
106
+ weight: row.weight,
107
+ reason: row.reason,
108
+ };
109
+ }
110
+ function causesOfIncident(s, incidentId) {
111
+ const row = s.db
112
+ .prepare(`SELECT from_id, weight, reason FROM correlations
113
+ WHERE to_kind = 'incident' AND to_id = ?
114
+ ORDER BY weight DESC LIMIT 1`)
115
+ .get(incidentId);
116
+ if (!row)
117
+ return null;
118
+ return { id: row.from_id, weight: row.weight, reason: row.reason };
119
+ }
120
+ function loadIncident(s, id) {
121
+ const row = s.db
122
+ .prepare("SELECT id, title, occurred_at, severity, url FROM incidents WHERE id = ?")
123
+ .get(id);
124
+ if (!row)
125
+ return null;
126
+ return {
127
+ id: row.id,
128
+ title: row.title,
129
+ occurredAt: row.occurred_at,
130
+ severity: row.severity,
131
+ url: row.url ?? undefined,
132
+ };
133
+ }
134
+ function parseTarget(s) {
135
+ const m = s.match(/^(.+?)(?::(\d+)(?:-(\d+))?)?$/);
136
+ if (!m)
137
+ return { file: s };
138
+ return {
139
+ file: m[1],
140
+ startLine: m[2] ? Number(m[2]) : undefined,
141
+ endLine: m[3] ? Number(m[3]) : m[2] ? Number(m[2]) : undefined,
142
+ };
143
+ }
144
+ function printChain(target, chain) {
145
+ ui.banner();
146
+ process.stdout.write(`${kleur.bold().cyan("Palimpsest")} ${target}\n\n`);
147
+ if (chain.length === 0) {
148
+ ui.warn("No causal chain found. Try indexing more (and run `mneme correlate` to wire incidents).");
149
+ return;
150
+ }
151
+ for (let i = 0; i < chain.length; i++) {
152
+ const step = chain[i];
153
+ const arrow = i === 0 ? " " : " ↑ ";
154
+ const dot = step.kind === "commit" ? kleur.green("●") : kleur.red("●");
155
+ process.stdout.write(`${arrow}${dot} ${kleur.bold(step.id)} ${kleur.gray(`[${step.date}]`)}\n` +
156
+ ` ${kleur.white(step.label)}\n` +
157
+ (step.detail ? ` ${kleur.gray(step.detail)}\n` : "") +
158
+ (step.via ? ` ${kleur.cyan("via:")} ${kleur.gray(step.via)}\n` : ""));
159
+ }
160
+ process.stdout.write("\n" +
161
+ kleur.gray(" Tip: pair this with `mneme web` to see the same chain rendered as a graph.") +
162
+ "\n");
163
+ }
164
+ //# sourceMappingURL=palimpsest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palimpsest.js","sourceRoot":"","sources":["../../src/commands/palimpsest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function statusCommand(opts: {
2
+ cwd: string;
3
+ }): Promise<number>;
4
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqD1E"}
@@ -0,0 +1,49 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+ import { git, store } from "@mneme-ai/core";
3
+ import { dbPath } from "../paths.js";
4
+ import { readConfig } from "../config.js";
5
+ import { ui } from "../ui.js";
6
+ import kleur from "kleur";
7
+ export async function statusCommand(opts) {
8
+ ui.banner();
9
+ if (!(await git.isGitRepo(opts.cwd))) {
10
+ ui.error("Not in a git repository.");
11
+ return 1;
12
+ }
13
+ const meta = await git.getRepoMeta(opts.cwd);
14
+ const path = dbPath(meta.rootPath);
15
+ const cfg = readConfig(meta.rootPath);
16
+ process.stdout.write(`${kleur.bold().magenta("Repo")}\n`);
17
+ process.stdout.write(` ${kleur.gray("path ")} ${meta.rootPath}\n`);
18
+ process.stdout.write(` ${kleur.gray("branch ")} ${meta.defaultBranch}\n`);
19
+ if (meta.host) {
20
+ process.stdout.write(` ${kleur.gray("remote ")} ${meta.host}:${meta.owner}/${meta.repo}\n`);
21
+ }
22
+ process.stdout.write(`\n${kleur.bold().magenta("Memory")}\n`);
23
+ if (!existsSync(path)) {
24
+ ui.warn("Not yet indexed.");
25
+ ui.dim("Run: mneme index");
26
+ return 0;
27
+ }
28
+ const s = new store.MnemeStore(path);
29
+ const commits = s.countCommits();
30
+ const chunks = s.countChunks();
31
+ const embedded = s.countChunksWithEmbedding();
32
+ const embedder = s.getMeta("embedder") ?? "(unknown)";
33
+ const indexedAt = s.getMeta("indexed_at");
34
+ const sizeBytes = statSync(path).size;
35
+ const sizeMb = (sizeBytes / 1024 / 1024).toFixed(1);
36
+ process.stdout.write(` ${kleur.gray("db ")} ${path} ${kleur.gray(`(${sizeMb} MB)`)}\n`);
37
+ process.stdout.write(` ${kleur.gray("commits ")} ${kleur.bold(String(commits))}\n`);
38
+ process.stdout.write(` ${kleur.gray("chunks ")} ${kleur.bold(String(chunks))} ${kleur.gray(`(${embedded} with embeddings)`)}\n`);
39
+ process.stdout.write(` ${kleur.gray("embedder")} ${embedder}\n`);
40
+ if (indexedAt)
41
+ process.stdout.write(` ${kleur.gray("indexed ")} ${indexedAt}\n`);
42
+ process.stdout.write(`\n${kleur.bold().magenta("Config")}\n`);
43
+ process.stdout.write(` ${kleur.gray("provider")} ${cfg.embeddings.provider}\n`);
44
+ if (cfg.embeddings.model)
45
+ process.stdout.write(` ${kleur.gray("model ")} ${cfg.embeddings.model}\n`);
46
+ s.close();
47
+ return 0;
48
+ }
49
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface TeachCommandOptions {
2
+ cwd: string;
3
+ target: string;
4
+ provider?: "auto" | "ollama" | "openai";
5
+ model?: string;
6
+ json?: boolean;
7
+ }
8
+ type Layer = "api" | "service" | "data" | "ui" | "utility" | "test" | "config" | "unknown";
9
+ declare function classifyLayer(filePath: string): Layer;
10
+ export declare function teachCommand(opts: TeachCommandOptions): Promise<number>;
11
+ /**
12
+ * Exported for testing — pure helper, no I/O.
13
+ */
14
+ export declare const _classifyLayer: typeof classifyLayer;
15
+ export {};
16
+ //# sourceMappingURL=teach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teach.d.ts","sourceRoot":"","sources":["../../src/commands/teach.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,KAAK,KAAK,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAe3F,iBAAS,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAO9C;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2G7E;AA2GD;;GAEG;AACH,eAAO,MAAM,cAAc,sBAAgB,CAAC"}