@folterung/project-memory 0.1.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 (215) hide show
  1. package/.memignore.example +11 -0
  2. package/README.md +48 -0
  3. package/docker-compose.yml +17 -0
  4. package/package.json +36 -0
  5. package/packages/cli/bin/mem.js +6 -0
  6. package/packages/cli/coverage/lcov-report/base.css +224 -0
  7. package/packages/cli/coverage/lcov-report/block-navigation.js +87 -0
  8. package/packages/cli/coverage/lcov-report/chunking/chunker.ts.html +538 -0
  9. package/packages/cli/coverage/lcov-report/chunking/hash.ts.html +148 -0
  10. package/packages/cli/coverage/lcov-report/chunking/index.html +146 -0
  11. package/packages/cli/coverage/lcov-report/chunking/types.ts.html +214 -0
  12. package/packages/cli/coverage/lcov-report/config/index.html +131 -0
  13. package/packages/cli/coverage/lcov-report/config/load.ts.html +184 -0
  14. package/packages/cli/coverage/lcov-report/config/types.ts.html +232 -0
  15. package/packages/cli/coverage/lcov-report/embedding/index.html +116 -0
  16. package/packages/cli/coverage/lcov-report/embedding/stub.ts.html +181 -0
  17. package/packages/cli/coverage/lcov-report/favicon.png +0 -0
  18. package/packages/cli/coverage/lcov-report/index.html +161 -0
  19. package/packages/cli/coverage/lcov-report/prettify.css +1 -0
  20. package/packages/cli/coverage/lcov-report/prettify.js +2 -0
  21. package/packages/cli/coverage/lcov-report/scope/allowlist.ts.html +199 -0
  22. package/packages/cli/coverage/lcov-report/scope/ignore.ts.html +343 -0
  23. package/packages/cli/coverage/lcov-report/scope/index.html +131 -0
  24. package/packages/cli/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  25. package/packages/cli/coverage/lcov-report/sorter.js +210 -0
  26. package/packages/cli/coverage/lcov.info +669 -0
  27. package/packages/cli/coverage/tmp/coverage-25917-1770055893226-0.json +1 -0
  28. package/packages/cli/coverage/tmp/coverage-25918-1770055893272-0.json +1 -0
  29. package/packages/cli/coverage/tmp/coverage-25919-1770055893273-0.json +1 -0
  30. package/packages/cli/coverage/tmp/coverage-25920-1770055893271-0.json +1 -0
  31. package/packages/cli/coverage/tmp/coverage-25921-1770055893279-0.json +1 -0
  32. package/packages/cli/coverage/tmp/coverage-25922-1770055893272-0.json +1 -0
  33. package/packages/cli/coverage/tmp/coverage-25923-1770055893275-0.json +1 -0
  34. package/packages/cli/coverage/tmp/coverage-25924-1770055893294-0.json +1 -0
  35. package/packages/cli/coverage/tmp/coverage-25925-1770055893290-0.json +1 -0
  36. package/packages/cli/dist/chunking/chunker.d.ts +2 -0
  37. package/packages/cli/dist/chunking/chunker.js +142 -0
  38. package/packages/cli/dist/chunking/chunker.js.map +1 -0
  39. package/packages/cli/dist/chunking/chunker.test.d.ts +1 -0
  40. package/packages/cli/dist/chunking/chunker.test.js +50 -0
  41. package/packages/cli/dist/chunking/chunker.test.js.map +1 -0
  42. package/packages/cli/dist/chunking/hash.d.ts +3 -0
  43. package/packages/cli/dist/chunking/hash.js +17 -0
  44. package/packages/cli/dist/chunking/hash.js.map +1 -0
  45. package/packages/cli/dist/chunking/hash.test.d.ts +1 -0
  46. package/packages/cli/dist/chunking/hash.test.js +36 -0
  47. package/packages/cli/dist/chunking/hash.test.js.map +1 -0
  48. package/packages/cli/dist/chunking/types.d.ts +19 -0
  49. package/packages/cli/dist/chunking/types.js +24 -0
  50. package/packages/cli/dist/chunking/types.js.map +1 -0
  51. package/packages/cli/dist/chunking/types.test.d.ts +1 -0
  52. package/packages/cli/dist/chunking/types.test.js +25 -0
  53. package/packages/cli/dist/chunking/types.test.js.map +1 -0
  54. package/packages/cli/dist/cli/index.d.ts +1 -0
  55. package/packages/cli/dist/cli/index.js +67 -0
  56. package/packages/cli/dist/cli/index.js.map +1 -0
  57. package/packages/cli/dist/commands/deep-index.d.ts +1 -0
  58. package/packages/cli/dist/commands/deep-index.js +17 -0
  59. package/packages/cli/dist/commands/deep-index.js.map +1 -0
  60. package/packages/cli/dist/commands/doctor.d.ts +1 -0
  61. package/packages/cli/dist/commands/doctor.js +27 -0
  62. package/packages/cli/dist/commands/doctor.js.map +1 -0
  63. package/packages/cli/dist/commands/down.d.ts +1 -0
  64. package/packages/cli/dist/commands/down.js +13 -0
  65. package/packages/cli/dist/commands/down.js.map +1 -0
  66. package/packages/cli/dist/commands/explain.d.ts +1 -0
  67. package/packages/cli/dist/commands/explain.js +23 -0
  68. package/packages/cli/dist/commands/explain.js.map +1 -0
  69. package/packages/cli/dist/commands/init.d.ts +1 -0
  70. package/packages/cli/dist/commands/init.js +35 -0
  71. package/packages/cli/dist/commands/init.js.map +1 -0
  72. package/packages/cli/dist/commands/query.d.ts +1 -0
  73. package/packages/cli/dist/commands/query.js +44 -0
  74. package/packages/cli/dist/commands/query.js.map +1 -0
  75. package/packages/cli/dist/commands/reset.d.ts +3 -0
  76. package/packages/cli/dist/commands/reset.js +28 -0
  77. package/packages/cli/dist/commands/reset.js.map +1 -0
  78. package/packages/cli/dist/commands/scaffold.d.ts +1 -0
  79. package/packages/cli/dist/commands/scaffold.js +52 -0
  80. package/packages/cli/dist/commands/scaffold.js.map +1 -0
  81. package/packages/cli/dist/commands/update.d.ts +5 -0
  82. package/packages/cli/dist/commands/update.js +23 -0
  83. package/packages/cli/dist/commands/update.js.map +1 -0
  84. package/packages/cli/dist/commands/watch.d.ts +1 -0
  85. package/packages/cli/dist/commands/watch.js +46 -0
  86. package/packages/cli/dist/commands/watch.js.map +1 -0
  87. package/packages/cli/dist/config/defaults.d.ts +2 -0
  88. package/packages/cli/dist/config/defaults.js +47 -0
  89. package/packages/cli/dist/config/defaults.js.map +1 -0
  90. package/packages/cli/dist/config/load.d.ts +4 -0
  91. package/packages/cli/dist/config/load.js +29 -0
  92. package/packages/cli/dist/config/load.js.map +1 -0
  93. package/packages/cli/dist/config/load.test.d.ts +1 -0
  94. package/packages/cli/dist/config/load.test.js +51 -0
  95. package/packages/cli/dist/config/load.test.js.map +1 -0
  96. package/packages/cli/dist/config/types.d.ts +32 -0
  97. package/packages/cli/dist/config/types.js +24 -0
  98. package/packages/cli/dist/config/types.js.map +1 -0
  99. package/packages/cli/dist/config/types.test.d.ts +1 -0
  100. package/packages/cli/dist/config/types.test.js +31 -0
  101. package/packages/cli/dist/config/types.test.js.map +1 -0
  102. package/packages/cli/dist/docker/compose.d.ts +5 -0
  103. package/packages/cli/dist/docker/compose.js +75 -0
  104. package/packages/cli/dist/docker/compose.js.map +1 -0
  105. package/packages/cli/dist/embedding/stub.d.ts +6 -0
  106. package/packages/cli/dist/embedding/stub.js +29 -0
  107. package/packages/cli/dist/embedding/stub.js.map +1 -0
  108. package/packages/cli/dist/embedding/stub.test.d.ts +1 -0
  109. package/packages/cli/dist/embedding/stub.test.js +31 -0
  110. package/packages/cli/dist/embedding/stub.test.js.map +1 -0
  111. package/packages/cli/dist/phase1/pipeline.d.ts +1 -0
  112. package/packages/cli/dist/phase1/pipeline.js +145 -0
  113. package/packages/cli/dist/phase1/pipeline.js.map +1 -0
  114. package/packages/cli/dist/phase2/deep-index.d.ts +1 -0
  115. package/packages/cli/dist/phase2/deep-index.js +105 -0
  116. package/packages/cli/dist/phase2/deep-index.js.map +1 -0
  117. package/packages/cli/dist/qdrant/upsert.d.ts +14 -0
  118. package/packages/cli/dist/qdrant/upsert.js +30 -0
  119. package/packages/cli/dist/qdrant/upsert.js.map +1 -0
  120. package/packages/cli/dist/scope/allowlist.d.ts +11 -0
  121. package/packages/cli/dist/scope/allowlist.js +36 -0
  122. package/packages/cli/dist/scope/allowlist.js.map +1 -0
  123. package/packages/cli/dist/scope/allowlist.test.d.ts +1 -0
  124. package/packages/cli/dist/scope/allowlist.test.js +23 -0
  125. package/packages/cli/dist/scope/allowlist.test.js.map +1 -0
  126. package/packages/cli/dist/scope/ignore.d.ts +2 -0
  127. package/packages/cli/dist/scope/ignore.js +80 -0
  128. package/packages/cli/dist/scope/ignore.js.map +1 -0
  129. package/packages/cli/dist/scope/ignore.test.d.ts +1 -0
  130. package/packages/cli/dist/scope/ignore.test.js +71 -0
  131. package/packages/cli/dist/scope/ignore.test.js.map +1 -0
  132. package/packages/cli/package.json +46 -0
  133. package/packages/cli/src/chunking/chunker.test.ts +54 -0
  134. package/packages/cli/src/chunking/chunker.ts +151 -0
  135. package/packages/cli/src/chunking/hash.test.ts +41 -0
  136. package/packages/cli/src/chunking/hash.ts +21 -0
  137. package/packages/cli/src/chunking/types.test.ts +28 -0
  138. package/packages/cli/src/chunking/types.ts +43 -0
  139. package/packages/cli/src/cli/index.ts +79 -0
  140. package/packages/cli/src/commands/deep-index.ts +16 -0
  141. package/packages/cli/src/commands/doctor.ts +32 -0
  142. package/packages/cli/src/commands/down.ts +12 -0
  143. package/packages/cli/src/commands/explain.ts +22 -0
  144. package/packages/cli/src/commands/init.ts +37 -0
  145. package/packages/cli/src/commands/query.ts +49 -0
  146. package/packages/cli/src/commands/reset.ts +30 -0
  147. package/packages/cli/src/commands/scaffold.ts +55 -0
  148. package/packages/cli/src/commands/update.ts +22 -0
  149. package/packages/cli/src/commands/watch.ts +47 -0
  150. package/packages/cli/src/config/defaults.ts +49 -0
  151. package/packages/cli/src/config/load.test.ts +55 -0
  152. package/packages/cli/src/config/load.ts +33 -0
  153. package/packages/cli/src/config/types.test.ts +43 -0
  154. package/packages/cli/src/config/types.ts +49 -0
  155. package/packages/cli/src/docker/compose.ts +75 -0
  156. package/packages/cli/src/embedding/stub.test.ts +35 -0
  157. package/packages/cli/src/embedding/stub.ts +32 -0
  158. package/packages/cli/src/phase1/pipeline.ts +164 -0
  159. package/packages/cli/src/phase2/deep-index.ts +120 -0
  160. package/packages/cli/src/qdrant/upsert.ts +45 -0
  161. package/packages/cli/src/scope/allowlist.test.ts +25 -0
  162. package/packages/cli/src/scope/allowlist.ts +38 -0
  163. package/packages/cli/src/scope/ignore.test.ts +71 -0
  164. package/packages/cli/src/scope/ignore.ts +86 -0
  165. package/packages/cli/tsconfig.json +16 -0
  166. package/packages/server/coverage/lcov-report/base.css +224 -0
  167. package/packages/server/coverage/lcov-report/block-navigation.js +87 -0
  168. package/packages/server/coverage/lcov-report/favicon.png +0 -0
  169. package/packages/server/coverage/lcov-report/index.html +116 -0
  170. package/packages/server/coverage/lcov-report/prettify.css +1 -0
  171. package/packages/server/coverage/lcov-report/prettify.js +2 -0
  172. package/packages/server/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  173. package/packages/server/coverage/lcov-report/sorter.js +210 -0
  174. package/packages/server/coverage/lcov-report/stub.ts.html +184 -0
  175. package/packages/server/coverage/lcov.info +57 -0
  176. package/packages/server/coverage/tmp/coverage-26012-1770055894042-0.json +1 -0
  177. package/packages/server/coverage/tmp/coverage-26013-1770055894077-0.json +1 -0
  178. package/packages/server/dist/api/explain.d.ts +6 -0
  179. package/packages/server/dist/api/explain.js +16 -0
  180. package/packages/server/dist/api/explain.js.map +1 -0
  181. package/packages/server/dist/api/health.d.ts +7 -0
  182. package/packages/server/dist/api/health.js +43 -0
  183. package/packages/server/dist/api/health.js.map +1 -0
  184. package/packages/server/dist/api/refresh.d.ts +2 -0
  185. package/packages/server/dist/api/refresh.js +8 -0
  186. package/packages/server/dist/api/refresh.js.map +1 -0
  187. package/packages/server/dist/api/search.d.ts +28 -0
  188. package/packages/server/dist/api/search.js +36 -0
  189. package/packages/server/dist/api/search.js.map +1 -0
  190. package/packages/server/dist/api/system.d.ts +6 -0
  191. package/packages/server/dist/api/system.js +17 -0
  192. package/packages/server/dist/api/system.js.map +1 -0
  193. package/packages/server/dist/embedding/stub.d.ts +7 -0
  194. package/packages/server/dist/embedding/stub.js +30 -0
  195. package/packages/server/dist/embedding/stub.js.map +1 -0
  196. package/packages/server/dist/embedding/stub.test.d.ts +1 -0
  197. package/packages/server/dist/embedding/stub.test.js +25 -0
  198. package/packages/server/dist/embedding/stub.test.js.map +1 -0
  199. package/packages/server/dist/index.d.ts +1 -0
  200. package/packages/server/dist/index.js +26 -0
  201. package/packages/server/dist/index.js.map +1 -0
  202. package/packages/server/dist/qdrant/client.d.ts +24 -0
  203. package/packages/server/dist/qdrant/client.js +55 -0
  204. package/packages/server/dist/qdrant/client.js.map +1 -0
  205. package/packages/server/package.json +37 -0
  206. package/packages/server/src/api/explain.ts +24 -0
  207. package/packages/server/src/api/health.ts +50 -0
  208. package/packages/server/src/api/refresh.ts +9 -0
  209. package/packages/server/src/api/search.ts +57 -0
  210. package/packages/server/src/api/system.ts +25 -0
  211. package/packages/server/src/embedding/stub.test.ts +28 -0
  212. package/packages/server/src/embedding/stub.ts +33 -0
  213. package/packages/server/src/index.ts +29 -0
  214. package/packages/server/src/qdrant/client.ts +92 -0
  215. package/packages/server/tsconfig.json +16 -0
@@ -0,0 +1,2 @@
1
+ import type { Chunk } from "./types.js";
2
+ export declare function chunkFile(path: string, content: string): Chunk[];
@@ -0,0 +1,142 @@
1
+ import { createHash } from "node:crypto";
2
+ import { hashFileContent, chunkIdFromParts, getSchemaVersion } from "./hash.js";
3
+ import { getModuleFromPath, getLanguageFromPath } from "./types.js";
4
+ const SOFT_MAX_LINES = 400;
5
+ const MIN_LINES = 50;
6
+ function inferKind(path, language) {
7
+ const lower = path.toLowerCase();
8
+ if (lower.includes(".test.") || lower.includes(".spec.") || lower.includes("__tests__"))
9
+ return "test";
10
+ if (lower.endsWith(".md") || lower.endsWith(".mdx"))
11
+ return "doc";
12
+ if (lower.endsWith(".json") || lower.endsWith(".yaml") || lower.endsWith(".yml"))
13
+ return "config";
14
+ if (lower.includes("schema"))
15
+ return "schema";
16
+ return "code";
17
+ }
18
+ function chunkByLineWindows(path, content, fileHash, kind) {
19
+ const language = getLanguageFromPath(path);
20
+ const module = getModuleFromPath(path);
21
+ const lines = content.split(/\r?\n/);
22
+ const chunks = [];
23
+ let start = 0;
24
+ let index = 0;
25
+ while (start < lines.length) {
26
+ const windowSize = Math.min(SOFT_MAX_LINES, lines.length - start);
27
+ const end = start + windowSize;
28
+ const windowLines = lines.slice(start, end);
29
+ const text = windowLines.join("\n");
30
+ const partHash = createHash("sha256").update(text, "utf8").digest("hex").slice(0, 16);
31
+ const part = `L${start}-${end}-${partHash}`;
32
+ const id = chunkIdFromParts(path, part, fileHash);
33
+ chunks.push({
34
+ id,
35
+ text,
36
+ metadata: {
37
+ path,
38
+ language,
39
+ module,
40
+ kind,
41
+ hash: fileHash,
42
+ schema_version: getSchemaVersion(),
43
+ startLine: start + 1,
44
+ endLine: end,
45
+ },
46
+ });
47
+ start = end;
48
+ index++;
49
+ }
50
+ return chunks;
51
+ }
52
+ function chunkMarkdownByHeadings(path, content, fileHash) {
53
+ const language = "markdown";
54
+ const module = getModuleFromPath(path);
55
+ const lines = content.split(/\r?\n/);
56
+ const chunks = [];
57
+ let currentStart = 0;
58
+ let currentLines = [];
59
+ let headingLevel = 0;
60
+ function flush(symbol, endLine) {
61
+ if (currentLines.length === 0)
62
+ return;
63
+ const text = currentLines.join("\n");
64
+ const partHash = createHash("sha256").update(text, "utf8").digest("hex").slice(0, 16);
65
+ const part = symbol ?? `H${currentStart}-${partHash}`;
66
+ const id = chunkIdFromParts(path, part, fileHash);
67
+ chunks.push({
68
+ id,
69
+ text,
70
+ metadata: {
71
+ path,
72
+ language,
73
+ symbol: symbol ?? undefined,
74
+ module,
75
+ kind: "doc",
76
+ hash: fileHash,
77
+ schema_version: getSchemaVersion(),
78
+ startLine: currentStart + 1,
79
+ endLine: endLine ?? currentStart + currentLines.length,
80
+ },
81
+ });
82
+ }
83
+ for (let i = 0; i < lines.length; i++) {
84
+ const line = lines[i];
85
+ const match = line.match(/^(#{1,6})\s+(.+)$/);
86
+ if (match) {
87
+ const level = match[1].length;
88
+ const title = match[2].trim();
89
+ if (currentLines.length > 0) {
90
+ flush(headingLevel > 0 ? title : undefined, i);
91
+ }
92
+ currentStart = i;
93
+ currentLines = [line];
94
+ headingLevel = level;
95
+ }
96
+ else {
97
+ currentLines.push(line);
98
+ }
99
+ }
100
+ if (currentLines.length > 0) {
101
+ flush(headingLevel > 0 ? undefined : "body", lines.length);
102
+ }
103
+ if (chunks.length === 0 && content.trim()) {
104
+ return chunkByLineWindows(path, content, fileHash, "doc");
105
+ }
106
+ return chunks;
107
+ }
108
+ function chunkConfigAsSingle(path, content, fileHash) {
109
+ const language = getLanguageFromPath(path);
110
+ const module = getModuleFromPath(path);
111
+ const part = "config";
112
+ const id = chunkIdFromParts(path, part, fileHash);
113
+ return [
114
+ {
115
+ id,
116
+ text: content,
117
+ metadata: {
118
+ path,
119
+ language,
120
+ module,
121
+ kind: "config",
122
+ hash: fileHash,
123
+ schema_version: getSchemaVersion(),
124
+ startLine: 1,
125
+ endLine: content.split(/\r?\n/).length,
126
+ },
127
+ },
128
+ ];
129
+ }
130
+ export function chunkFile(path, content) {
131
+ const fileHash = hashFileContent(content);
132
+ const language = getLanguageFromPath(path);
133
+ const kind = inferKind(path, language);
134
+ if (kind === "doc" && (path.endsWith(".md") || path.endsWith(".mdx"))) {
135
+ return chunkMarkdownByHeadings(path, content, fileHash);
136
+ }
137
+ if (kind === "config") {
138
+ return chunkConfigAsSingle(path, content, fileHash);
139
+ }
140
+ return chunkByLineWindows(path, content, fileHash, kind);
141
+ }
142
+ //# sourceMappingURL=chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/chunking/chunker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
1
+ import { strict as assert } from "node:assert";
2
+ import { describe, it } from "node:test";
3
+ import { chunkFile } from "./chunker.js";
4
+ import { getSchemaVersion } from "./hash.js";
5
+ describe("chunker", () => {
6
+ it("chunkFile returns chunks with required metadata", () => {
7
+ const chunks = chunkFile("src/foo.ts", "const x = 1;\nconst y = 2;\n");
8
+ assert.ok(Array.isArray(chunks));
9
+ assert.ok(chunks.length >= 1);
10
+ for (const c of chunks) {
11
+ assert.strictEqual(typeof c.id, "string");
12
+ assert.strictEqual(typeof c.text, "string");
13
+ assert.strictEqual(c.metadata.path, "src/foo.ts");
14
+ assert.strictEqual(c.metadata.language, "typescript");
15
+ assert.strictEqual(c.metadata.kind, "code");
16
+ assert.strictEqual(c.metadata.schema_version, getSchemaVersion());
17
+ assert.ok(c.metadata.hash.length > 0);
18
+ }
19
+ });
20
+ it("chunkFile for config returns single chunk", () => {
21
+ const chunks = chunkFile("config.json", '{"a":1}');
22
+ assert.strictEqual(chunks.length, 1);
23
+ assert.strictEqual(chunks[0].metadata.kind, "config");
24
+ assert.strictEqual(chunks[0].text, '{"a":1}');
25
+ });
26
+ it("chunkFile for markdown chunks by heading", () => {
27
+ const content = "# Title\n\nPara 1.\n\n## Section\n\nPara 2.\n";
28
+ const chunks = chunkFile("doc.md", content);
29
+ assert.ok(chunks.length >= 1);
30
+ const hasDoc = chunks.some((c) => c.metadata.kind === "doc");
31
+ assert.ok(hasDoc);
32
+ });
33
+ it("chunkFile is deterministic for same input", () => {
34
+ const input = "same content\n";
35
+ const path = "src/same.ts";
36
+ const a = chunkFile(path, input);
37
+ const b = chunkFile(path, input);
38
+ assert.strictEqual(a.length, b.length);
39
+ for (let i = 0; i < a.length; i++) {
40
+ assert.strictEqual(a[i].id, b[i].id);
41
+ assert.strictEqual(a[i].metadata.hash, b[i].metadata.hash);
42
+ }
43
+ });
44
+ it("chunkFile infers test kind for .test. path", () => {
45
+ const chunks = chunkFile("src/foo.test.ts", "describe('x', () => {});");
46
+ assert.ok(chunks.length >= 1);
47
+ assert.strictEqual(chunks[0].metadata.kind, "test");
48
+ });
49
+ });
50
+ //# sourceMappingURL=chunker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.test.js","sourceRoot":"","sources":["../../src/chunking/chunker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function hashFileContent(content: string): string;
2
+ export declare function getSchemaVersion(): number;
3
+ export declare function chunkIdFromParts(path: string, part: string, contentHash: string): string;
@@ -0,0 +1,17 @@
1
+ import { createHash } from "node:crypto";
2
+ const SCHEMA_VERSION = 1;
3
+ function normalizeContent(content) {
4
+ return content.replace(/\r\n/g, "\n").trimEnd() + "\n";
5
+ }
6
+ export function hashFileContent(content) {
7
+ const normalized = normalizeContent(content);
8
+ return createHash("sha256").update(normalized, "utf8").digest("hex");
9
+ }
10
+ export function getSchemaVersion() {
11
+ return SCHEMA_VERSION;
12
+ }
13
+ export function chunkIdFromParts(path, part, contentHash) {
14
+ const combined = `${path}:${part}:${contentHash}`;
15
+ return createHash("sha256").update(combined, "utf8").digest("hex").slice(0, 32);
16
+ }
17
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/chunking/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAY,EAAE,WAAmB;IAC9E,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;IAClD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,36 @@
1
+ import { strict as assert } from "node:assert";
2
+ import { describe, it } from "node:test";
3
+ import { hashFileContent, chunkIdFromParts, getSchemaVersion } from "./hash.js";
4
+ describe("chunking hash", () => {
5
+ it("hashFileContent is deterministic", () => {
6
+ const content = "hello\nworld\n";
7
+ const a = hashFileContent(content);
8
+ const b = hashFileContent(content);
9
+ assert.strictEqual(a, b);
10
+ });
11
+ it("hashFileContent normalizes CRLF to LF", () => {
12
+ const crlf = "a\r\nb\r\n";
13
+ const lf = "a\nb\n";
14
+ assert.strictEqual(hashFileContent(crlf), hashFileContent(lf));
15
+ });
16
+ it("hashFileContent differs for different content", () => {
17
+ const h1 = hashFileContent("foo");
18
+ const h2 = hashFileContent("bar");
19
+ assert.notStrictEqual(h1, h2);
20
+ });
21
+ it("chunkIdFromParts is deterministic", () => {
22
+ const id1 = chunkIdFromParts("src/a.ts", "L0-10-abc", "filehash123");
23
+ const id2 = chunkIdFromParts("src/a.ts", "L0-10-abc", "filehash123");
24
+ assert.strictEqual(id1, id2);
25
+ });
26
+ it("chunkIdFromParts returns 32-char hex", () => {
27
+ const id = chunkIdFromParts("p", "part", "hash");
28
+ assert.match(id, /^[a-f0-9]{32}$/);
29
+ });
30
+ it("getSchemaVersion returns number", () => {
31
+ const v = getSchemaVersion();
32
+ assert.strictEqual(typeof v, "number");
33
+ assert.ok(v >= 1);
34
+ });
35
+ });
36
+ //# sourceMappingURL=hash.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.test.js","sourceRoot":"","sources":["../../src/chunking/hash.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEhF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,OAAO,GAAG,gBAAgB,CAAC;QACjC,MAAM,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,YAAY,CAAC;QAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC;QACpB,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,gBAAgB,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,GAAG,GAAG,gBAAgB,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,EAAE,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC;QAC7B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type ChunkKind = "code" | "doc" | "config" | "schema" | "test" | "system_map" | "module_summary" | "entrypoint";
2
+ export interface ChunkMetadata {
3
+ path: string;
4
+ language: string;
5
+ symbol?: string;
6
+ module: string;
7
+ kind: ChunkKind;
8
+ hash: string;
9
+ schema_version: number;
10
+ startLine?: number;
11
+ endLine?: number;
12
+ }
13
+ export interface Chunk {
14
+ id: string;
15
+ text: string;
16
+ metadata: ChunkMetadata;
17
+ }
18
+ export declare function getModuleFromPath(path: string): string;
19
+ export declare function getLanguageFromPath(path: string): string;
@@ -0,0 +1,24 @@
1
+ export function getModuleFromPath(path) {
2
+ const parts = path.replace(/\\/g, "/").split("/");
3
+ if (parts.length <= 1)
4
+ return path;
5
+ return parts.slice(0, -1).join("/");
6
+ }
7
+ export function getLanguageFromPath(path) {
8
+ const ext = path.replace(/^.*\./, "").toLowerCase();
9
+ const map = {
10
+ ts: "typescript",
11
+ tsx: "typescript",
12
+ js: "javascript",
13
+ jsx: "javascript",
14
+ mjs: "javascript",
15
+ cjs: "javascript",
16
+ json: "json",
17
+ yaml: "yaml",
18
+ yml: "yaml",
19
+ md: "markdown",
20
+ mdx: "markdown",
21
+ };
22
+ return map[ext] ?? ext;
23
+ }
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/chunking/types.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,GAAG,GAA2B;QAClC,EAAE,EAAE,YAAY;QAChB,GAAG,EAAE,YAAY;QACjB,EAAE,EAAE,YAAY;QAChB,GAAG,EAAE,YAAY;QACjB,GAAG,EAAE,YAAY;QACjB,GAAG,EAAE,YAAY;QACjB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,MAAM;QACX,EAAE,EAAE,UAAU;QACd,GAAG,EAAE,UAAU;KAChB,CAAC;IACF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACzB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import { strict as assert } from "node:assert";
2
+ import { describe, it } from "node:test";
3
+ import { getModuleFromPath, getLanguageFromPath } from "./types.js";
4
+ describe("chunking types", () => {
5
+ it("getModuleFromPath returns dir for nested path", () => {
6
+ assert.strictEqual(getModuleFromPath("src/foo/bar.ts"), "src/foo");
7
+ assert.strictEqual(getModuleFromPath("a/b/c/d.js"), "a/b/c");
8
+ });
9
+ it("getModuleFromPath returns path for single segment", () => {
10
+ assert.strictEqual(getModuleFromPath("index.ts"), "index.ts");
11
+ });
12
+ it("getLanguageFromPath maps extensions", () => {
13
+ assert.strictEqual(getLanguageFromPath("file.ts"), "typescript");
14
+ assert.strictEqual(getLanguageFromPath("file.tsx"), "typescript");
15
+ assert.strictEqual(getLanguageFromPath("file.js"), "javascript");
16
+ assert.strictEqual(getLanguageFromPath("file.json"), "json");
17
+ assert.strictEqual(getLanguageFromPath("file.yaml"), "yaml");
18
+ assert.strictEqual(getLanguageFromPath("file.yml"), "yaml");
19
+ assert.strictEqual(getLanguageFromPath("file.md"), "markdown");
20
+ });
21
+ it("getLanguageFromPath returns ext for unknown", () => {
22
+ assert.strictEqual(getLanguageFromPath("file.xyz"), "xyz");
23
+ });
24
+ });
25
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/chunking/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEpE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,CAAC;QACnE,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QAClE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function run(): Promise<void>;
@@ -0,0 +1,67 @@
1
+ import { program } from "commander";
2
+ import { cwd } from "node:process";
3
+ import { runInit } from "../commands/init.js";
4
+ import { runScaffold } from "../commands/scaffold.js";
5
+ import { runDown } from "../commands/down.js";
6
+ import { runDoctor } from "../commands/doctor.js";
7
+ import { runReset } from "../commands/reset.js";
8
+ import { runDeepIndexCommand } from "../commands/deep-index.js";
9
+ import { runUpdate } from "../commands/update.js";
10
+ import { runWatch } from "../commands/watch.js";
11
+ import { runQuery } from "../commands/query.js";
12
+ import { runExplain } from "../commands/explain.js";
13
+ const root = cwd();
14
+ program
15
+ .name("mem")
16
+ .description("Project Memory — local-first project understanding for Cursor")
17
+ .version("0.1.0");
18
+ program
19
+ .command("init")
20
+ .description("Create .mem/config.yml and .memignore")
21
+ .action(() => runInit(root));
22
+ program
23
+ .command("scaffold")
24
+ .description("Phase 1: start Qdrant, apply scope+ignore, build index, start server")
25
+ .option("--include <globs...>", "Override indexing.include")
26
+ .option("--exclude <globs...>", "Override indexing.exclude")
27
+ .option("--write-config", "Persist include/exclude to .mem/config.yml")
28
+ .action(async (opts) => runScaffold(root));
29
+ program
30
+ .command("down")
31
+ .description("Stop Docker Compose containers")
32
+ .action(() => runDown(root));
33
+ program
34
+ .command("doctor")
35
+ .description("Check Docker, Qdrant, config, scope/ignore")
36
+ .action(async () => runDoctor(root));
37
+ program
38
+ .command("reset")
39
+ .description("Wipe index state and deep-index progress")
40
+ .option("-v, --volumes", "Hint: use docker compose down -v to wipe volumes")
41
+ .action((opts) => runReset(root, { volumes: opts.volumes }));
42
+ program
43
+ .command("deep-index")
44
+ .description("Phase 2: embed remaining chunks (resumable)")
45
+ .action(() => runDeepIndexCommand(root));
46
+ program
47
+ .command("update")
48
+ .description("Incremental update: re-run Phase 1")
49
+ .action(() => runUpdate(root));
50
+ program
51
+ .command("watch")
52
+ .description("Watch filesystem and run update on change")
53
+ .action(() => runWatch(root));
54
+ program
55
+ .command("query <text>")
56
+ .description("Call server /search with text")
57
+ .action((text) => runQuery(root, text ?? ""));
58
+ program
59
+ .command("explain <symbolOrPath>")
60
+ .description("Call server /explain for symbol or path")
61
+ .action((symbolOrPath) => runExplain(root, symbolOrPath ?? ""));
62
+ export async function run() {
63
+ await program.parseAsync();
64
+ if (!process.argv.slice(2).length)
65
+ program.outputHelp();
66
+ }
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runDeepIndexCommand(cwd: string): Promise<void>;
@@ -0,0 +1,17 @@
1
+ import chalk from "chalk";
2
+ import { configExists } from "../config/load.js";
3
+ import { runDeepIndex } from "../phase2/deep-index.js";
4
+ export async function runDeepIndexCommand(cwd) {
5
+ if (!configExists(cwd)) {
6
+ console.error(chalk.red("No config found. Run"), chalk.cyan("mem init"), chalk.red("then"), chalk.cyan("mem scaffold"), chalk.red("first."));
7
+ process.exit(1);
8
+ }
9
+ try {
10
+ await runDeepIndex(cwd);
11
+ }
12
+ catch (err) {
13
+ console.error(chalk.red("Deep index failed:"), err.message);
14
+ process.exit(1);
15
+ }
16
+ }
17
+ //# sourceMappingURL=deep-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-index.js","sourceRoot":"","sources":["../../src/commands/deep-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW;IACnD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7I,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runDoctor(cwd: string): Promise<void>;
@@ -0,0 +1,27 @@
1
+ import chalk from "chalk";
2
+ import { configExists, loadConfig } from "../config/load.js";
3
+ import { checkDockerAvailable, checkQdrantHealthy } from "../docker/compose.js";
4
+ export async function runDoctor(cwd) {
5
+ console.log(chalk.bold("Project Memory Doctor\n"));
6
+ const dockerOk = checkDockerAvailable(cwd);
7
+ console.log(dockerOk ? chalk.green("✓") : chalk.red("✗"), "Docker Compose available");
8
+ if (!dockerOk) {
9
+ console.log(chalk.dim(" Install Docker and Docker Compose."));
10
+ }
11
+ const qdrantOk = await checkQdrantHealthy();
12
+ console.log(qdrantOk ? chalk.green("✓") : chalk.yellow("○"), "Qdrant healthy (localhost:6333)");
13
+ if (!qdrantOk) {
14
+ console.log(chalk.dim(" Run mem scaffold to start Qdrant."));
15
+ }
16
+ const hasConfig = configExists(cwd);
17
+ console.log(hasConfig ? chalk.green("✓") : chalk.yellow("○"), "Config present (.mem/config.yml)");
18
+ if (!hasConfig) {
19
+ console.log(chalk.dim(" Run mem init first."));
20
+ }
21
+ if (hasConfig) {
22
+ const config = loadConfig(cwd);
23
+ console.log(chalk.green("✓"), "Scope:", config.indexing?.include?.length ? config.indexing.include.join(", ") : "entire repo");
24
+ }
25
+ console.log();
26
+ }
27
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,0BAA0B,CAAC,CAAC;IACtF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,iCAAiC,CAAC,CAAC;IAChG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAC;IAClG,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACjI,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runDown(cwd: string): void;
@@ -0,0 +1,13 @@
1
+ import chalk from "chalk";
2
+ import { dockerComposeDown } from "../docker/compose.js";
3
+ export function runDown(cwd) {
4
+ try {
5
+ dockerComposeDown(cwd);
6
+ console.log(chalk.green("Containers stopped."));
7
+ }
8
+ catch (err) {
9
+ console.error(chalk.red("Failed to stop containers:"), err.message);
10
+ throw err;
11
+ }
12
+ }
13
+ //# sourceMappingURL=down.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAC/E,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runExplain(_cwd: string, symbolOrPath: string): Promise<void>;
@@ -0,0 +1,23 @@
1
+ import chalk from "chalk";
2
+ const DEFAULT_SERVER_URL = "http://127.0.0.1:31415";
3
+ export async function runExplain(_cwd, symbolOrPath) {
4
+ const baseUrl = process.env.MEM_SERVER_URL ?? DEFAULT_SERVER_URL;
5
+ try {
6
+ const res = await fetch(`${baseUrl}/explain/${encodeURIComponent(symbolOrPath)}`);
7
+ if (!res.ok) {
8
+ console.error(chalk.red("Explain failed:"), res.status);
9
+ process.exit(1);
10
+ }
11
+ const data = (await res.json());
12
+ console.log(chalk.bold(data.symbol));
13
+ if (data.path)
14
+ console.log(chalk.dim("Path:"), data.path);
15
+ console.log("\n", data.snippet);
16
+ }
17
+ catch (e) {
18
+ console.error(chalk.red("Request failed:"), e.message);
19
+ console.log(chalk.dim("Ensure memory server is running (mem scaffold)."));
20
+ process.exit(1);
21
+ }
22
+ }
23
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/commands/explain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,YAAoB;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,kBAAkB,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuD,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runInit(cwd: string): void;
@@ -0,0 +1,35 @@
1
+ import { mkdirSync, writeFileSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import chalk from "chalk";
4
+ import { getDefaultConfigYaml, getDefaultMemignore } from "../config/defaults.js";
5
+ import { CONFIG_DIR, CONFIG_FILE, MEMIGNORE_FILE } from "../config/types.js";
6
+ export function runInit(cwd) {
7
+ const configPath = join(cwd, CONFIG_FILE);
8
+ const memignorePath = join(cwd, MEMIGNORE_FILE);
9
+ const memDir = join(cwd, CONFIG_DIR);
10
+ const stateDir = join(memDir, "state");
11
+ if (!existsSync(memDir)) {
12
+ mkdirSync(memDir, { recursive: true });
13
+ console.log(chalk.green("Created"), CONFIG_DIR + "/");
14
+ }
15
+ if (!existsSync(stateDir)) {
16
+ mkdirSync(stateDir, { recursive: true });
17
+ console.log(chalk.green("Created"), CONFIG_DIR + "/state/");
18
+ }
19
+ if (!existsSync(configPath)) {
20
+ writeFileSync(configPath, getDefaultConfigYaml(), "utf8");
21
+ console.log(chalk.green("Created"), CONFIG_FILE);
22
+ }
23
+ else {
24
+ console.log(chalk.dim("Config already exists:"), CONFIG_FILE);
25
+ }
26
+ if (!existsSync(memignorePath)) {
27
+ writeFileSync(memignorePath, getDefaultMemignore(), "utf8");
28
+ console.log(chalk.green("Created"), MEMIGNORE_FILE);
29
+ }
30
+ else {
31
+ console.log(chalk.dim("Ignore file already exists:"), MEMIGNORE_FILE);
32
+ }
33
+ console.log(chalk.green("\nProject Memory initialized. Run"), chalk.cyan("mem scaffold"), chalk.green("to build the index."));
34
+ }
35
+ //# 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,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,aAAa,CAAC,UAAU,EAAE,oBAAoB,EAAE,EAAE,MAAM,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,WAAW,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,aAAa,CAAC,aAAa,EAAE,mBAAmB,EAAE,EAAE,MAAM,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,cAAc,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAChI,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runQuery(_cwd: string, text: string): Promise<void>;