@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.
- package/.memignore.example +11 -0
- package/README.md +48 -0
- package/docker-compose.yml +17 -0
- package/package.json +36 -0
- package/packages/cli/bin/mem.js +6 -0
- package/packages/cli/coverage/lcov-report/base.css +224 -0
- package/packages/cli/coverage/lcov-report/block-navigation.js +87 -0
- package/packages/cli/coverage/lcov-report/chunking/chunker.ts.html +538 -0
- package/packages/cli/coverage/lcov-report/chunking/hash.ts.html +148 -0
- package/packages/cli/coverage/lcov-report/chunking/index.html +146 -0
- package/packages/cli/coverage/lcov-report/chunking/types.ts.html +214 -0
- package/packages/cli/coverage/lcov-report/config/index.html +131 -0
- package/packages/cli/coverage/lcov-report/config/load.ts.html +184 -0
- package/packages/cli/coverage/lcov-report/config/types.ts.html +232 -0
- package/packages/cli/coverage/lcov-report/embedding/index.html +116 -0
- package/packages/cli/coverage/lcov-report/embedding/stub.ts.html +181 -0
- package/packages/cli/coverage/lcov-report/favicon.png +0 -0
- package/packages/cli/coverage/lcov-report/index.html +161 -0
- package/packages/cli/coverage/lcov-report/prettify.css +1 -0
- package/packages/cli/coverage/lcov-report/prettify.js +2 -0
- package/packages/cli/coverage/lcov-report/scope/allowlist.ts.html +199 -0
- package/packages/cli/coverage/lcov-report/scope/ignore.ts.html +343 -0
- package/packages/cli/coverage/lcov-report/scope/index.html +131 -0
- package/packages/cli/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/packages/cli/coverage/lcov-report/sorter.js +210 -0
- package/packages/cli/coverage/lcov.info +669 -0
- package/packages/cli/coverage/tmp/coverage-25917-1770055893226-0.json +1 -0
- package/packages/cli/coverage/tmp/coverage-25918-1770055893272-0.json +1 -0
- package/packages/cli/coverage/tmp/coverage-25919-1770055893273-0.json +1 -0
- package/packages/cli/coverage/tmp/coverage-25920-1770055893271-0.json +1 -0
- package/packages/cli/coverage/tmp/coverage-25921-1770055893279-0.json +1 -0
- package/packages/cli/coverage/tmp/coverage-25922-1770055893272-0.json +1 -0
- package/packages/cli/coverage/tmp/coverage-25923-1770055893275-0.json +1 -0
- package/packages/cli/coverage/tmp/coverage-25924-1770055893294-0.json +1 -0
- package/packages/cli/coverage/tmp/coverage-25925-1770055893290-0.json +1 -0
- package/packages/cli/dist/chunking/chunker.d.ts +2 -0
- package/packages/cli/dist/chunking/chunker.js +142 -0
- package/packages/cli/dist/chunking/chunker.js.map +1 -0
- package/packages/cli/dist/chunking/chunker.test.d.ts +1 -0
- package/packages/cli/dist/chunking/chunker.test.js +50 -0
- package/packages/cli/dist/chunking/chunker.test.js.map +1 -0
- package/packages/cli/dist/chunking/hash.d.ts +3 -0
- package/packages/cli/dist/chunking/hash.js +17 -0
- package/packages/cli/dist/chunking/hash.js.map +1 -0
- package/packages/cli/dist/chunking/hash.test.d.ts +1 -0
- package/packages/cli/dist/chunking/hash.test.js +36 -0
- package/packages/cli/dist/chunking/hash.test.js.map +1 -0
- package/packages/cli/dist/chunking/types.d.ts +19 -0
- package/packages/cli/dist/chunking/types.js +24 -0
- package/packages/cli/dist/chunking/types.js.map +1 -0
- package/packages/cli/dist/chunking/types.test.d.ts +1 -0
- package/packages/cli/dist/chunking/types.test.js +25 -0
- package/packages/cli/dist/chunking/types.test.js.map +1 -0
- package/packages/cli/dist/cli/index.d.ts +1 -0
- package/packages/cli/dist/cli/index.js +67 -0
- package/packages/cli/dist/cli/index.js.map +1 -0
- package/packages/cli/dist/commands/deep-index.d.ts +1 -0
- package/packages/cli/dist/commands/deep-index.js +17 -0
- package/packages/cli/dist/commands/deep-index.js.map +1 -0
- package/packages/cli/dist/commands/doctor.d.ts +1 -0
- package/packages/cli/dist/commands/doctor.js +27 -0
- package/packages/cli/dist/commands/doctor.js.map +1 -0
- package/packages/cli/dist/commands/down.d.ts +1 -0
- package/packages/cli/dist/commands/down.js +13 -0
- package/packages/cli/dist/commands/down.js.map +1 -0
- package/packages/cli/dist/commands/explain.d.ts +1 -0
- package/packages/cli/dist/commands/explain.js +23 -0
- package/packages/cli/dist/commands/explain.js.map +1 -0
- package/packages/cli/dist/commands/init.d.ts +1 -0
- package/packages/cli/dist/commands/init.js +35 -0
- package/packages/cli/dist/commands/init.js.map +1 -0
- package/packages/cli/dist/commands/query.d.ts +1 -0
- package/packages/cli/dist/commands/query.js +44 -0
- package/packages/cli/dist/commands/query.js.map +1 -0
- package/packages/cli/dist/commands/reset.d.ts +3 -0
- package/packages/cli/dist/commands/reset.js +28 -0
- package/packages/cli/dist/commands/reset.js.map +1 -0
- package/packages/cli/dist/commands/scaffold.d.ts +1 -0
- package/packages/cli/dist/commands/scaffold.js +52 -0
- package/packages/cli/dist/commands/scaffold.js.map +1 -0
- package/packages/cli/dist/commands/update.d.ts +5 -0
- package/packages/cli/dist/commands/update.js +23 -0
- package/packages/cli/dist/commands/update.js.map +1 -0
- package/packages/cli/dist/commands/watch.d.ts +1 -0
- package/packages/cli/dist/commands/watch.js +46 -0
- package/packages/cli/dist/commands/watch.js.map +1 -0
- package/packages/cli/dist/config/defaults.d.ts +2 -0
- package/packages/cli/dist/config/defaults.js +47 -0
- package/packages/cli/dist/config/defaults.js.map +1 -0
- package/packages/cli/dist/config/load.d.ts +4 -0
- package/packages/cli/dist/config/load.js +29 -0
- package/packages/cli/dist/config/load.js.map +1 -0
- package/packages/cli/dist/config/load.test.d.ts +1 -0
- package/packages/cli/dist/config/load.test.js +51 -0
- package/packages/cli/dist/config/load.test.js.map +1 -0
- package/packages/cli/dist/config/types.d.ts +32 -0
- package/packages/cli/dist/config/types.js +24 -0
- package/packages/cli/dist/config/types.js.map +1 -0
- package/packages/cli/dist/config/types.test.d.ts +1 -0
- package/packages/cli/dist/config/types.test.js +31 -0
- package/packages/cli/dist/config/types.test.js.map +1 -0
- package/packages/cli/dist/docker/compose.d.ts +5 -0
- package/packages/cli/dist/docker/compose.js +75 -0
- package/packages/cli/dist/docker/compose.js.map +1 -0
- package/packages/cli/dist/embedding/stub.d.ts +6 -0
- package/packages/cli/dist/embedding/stub.js +29 -0
- package/packages/cli/dist/embedding/stub.js.map +1 -0
- package/packages/cli/dist/embedding/stub.test.d.ts +1 -0
- package/packages/cli/dist/embedding/stub.test.js +31 -0
- package/packages/cli/dist/embedding/stub.test.js.map +1 -0
- package/packages/cli/dist/phase1/pipeline.d.ts +1 -0
- package/packages/cli/dist/phase1/pipeline.js +145 -0
- package/packages/cli/dist/phase1/pipeline.js.map +1 -0
- package/packages/cli/dist/phase2/deep-index.d.ts +1 -0
- package/packages/cli/dist/phase2/deep-index.js +105 -0
- package/packages/cli/dist/phase2/deep-index.js.map +1 -0
- package/packages/cli/dist/qdrant/upsert.d.ts +14 -0
- package/packages/cli/dist/qdrant/upsert.js +30 -0
- package/packages/cli/dist/qdrant/upsert.js.map +1 -0
- package/packages/cli/dist/scope/allowlist.d.ts +11 -0
- package/packages/cli/dist/scope/allowlist.js +36 -0
- package/packages/cli/dist/scope/allowlist.js.map +1 -0
- package/packages/cli/dist/scope/allowlist.test.d.ts +1 -0
- package/packages/cli/dist/scope/allowlist.test.js +23 -0
- package/packages/cli/dist/scope/allowlist.test.js.map +1 -0
- package/packages/cli/dist/scope/ignore.d.ts +2 -0
- package/packages/cli/dist/scope/ignore.js +80 -0
- package/packages/cli/dist/scope/ignore.js.map +1 -0
- package/packages/cli/dist/scope/ignore.test.d.ts +1 -0
- package/packages/cli/dist/scope/ignore.test.js +71 -0
- package/packages/cli/dist/scope/ignore.test.js.map +1 -0
- package/packages/cli/package.json +46 -0
- package/packages/cli/src/chunking/chunker.test.ts +54 -0
- package/packages/cli/src/chunking/chunker.ts +151 -0
- package/packages/cli/src/chunking/hash.test.ts +41 -0
- package/packages/cli/src/chunking/hash.ts +21 -0
- package/packages/cli/src/chunking/types.test.ts +28 -0
- package/packages/cli/src/chunking/types.ts +43 -0
- package/packages/cli/src/cli/index.ts +79 -0
- package/packages/cli/src/commands/deep-index.ts +16 -0
- package/packages/cli/src/commands/doctor.ts +32 -0
- package/packages/cli/src/commands/down.ts +12 -0
- package/packages/cli/src/commands/explain.ts +22 -0
- package/packages/cli/src/commands/init.ts +37 -0
- package/packages/cli/src/commands/query.ts +49 -0
- package/packages/cli/src/commands/reset.ts +30 -0
- package/packages/cli/src/commands/scaffold.ts +55 -0
- package/packages/cli/src/commands/update.ts +22 -0
- package/packages/cli/src/commands/watch.ts +47 -0
- package/packages/cli/src/config/defaults.ts +49 -0
- package/packages/cli/src/config/load.test.ts +55 -0
- package/packages/cli/src/config/load.ts +33 -0
- package/packages/cli/src/config/types.test.ts +43 -0
- package/packages/cli/src/config/types.ts +49 -0
- package/packages/cli/src/docker/compose.ts +75 -0
- package/packages/cli/src/embedding/stub.test.ts +35 -0
- package/packages/cli/src/embedding/stub.ts +32 -0
- package/packages/cli/src/phase1/pipeline.ts +164 -0
- package/packages/cli/src/phase2/deep-index.ts +120 -0
- package/packages/cli/src/qdrant/upsert.ts +45 -0
- package/packages/cli/src/scope/allowlist.test.ts +25 -0
- package/packages/cli/src/scope/allowlist.ts +38 -0
- package/packages/cli/src/scope/ignore.test.ts +71 -0
- package/packages/cli/src/scope/ignore.ts +86 -0
- package/packages/cli/tsconfig.json +16 -0
- package/packages/server/coverage/lcov-report/base.css +224 -0
- package/packages/server/coverage/lcov-report/block-navigation.js +87 -0
- package/packages/server/coverage/lcov-report/favicon.png +0 -0
- package/packages/server/coverage/lcov-report/index.html +116 -0
- package/packages/server/coverage/lcov-report/prettify.css +1 -0
- package/packages/server/coverage/lcov-report/prettify.js +2 -0
- package/packages/server/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/packages/server/coverage/lcov-report/sorter.js +210 -0
- package/packages/server/coverage/lcov-report/stub.ts.html +184 -0
- package/packages/server/coverage/lcov.info +57 -0
- package/packages/server/coverage/tmp/coverage-26012-1770055894042-0.json +1 -0
- package/packages/server/coverage/tmp/coverage-26013-1770055894077-0.json +1 -0
- package/packages/server/dist/api/explain.d.ts +6 -0
- package/packages/server/dist/api/explain.js +16 -0
- package/packages/server/dist/api/explain.js.map +1 -0
- package/packages/server/dist/api/health.d.ts +7 -0
- package/packages/server/dist/api/health.js +43 -0
- package/packages/server/dist/api/health.js.map +1 -0
- package/packages/server/dist/api/refresh.d.ts +2 -0
- package/packages/server/dist/api/refresh.js +8 -0
- package/packages/server/dist/api/refresh.js.map +1 -0
- package/packages/server/dist/api/search.d.ts +28 -0
- package/packages/server/dist/api/search.js +36 -0
- package/packages/server/dist/api/search.js.map +1 -0
- package/packages/server/dist/api/system.d.ts +6 -0
- package/packages/server/dist/api/system.js +17 -0
- package/packages/server/dist/api/system.js.map +1 -0
- package/packages/server/dist/embedding/stub.d.ts +7 -0
- package/packages/server/dist/embedding/stub.js +30 -0
- package/packages/server/dist/embedding/stub.js.map +1 -0
- package/packages/server/dist/embedding/stub.test.d.ts +1 -0
- package/packages/server/dist/embedding/stub.test.js +25 -0
- package/packages/server/dist/embedding/stub.test.js.map +1 -0
- package/packages/server/dist/index.d.ts +1 -0
- package/packages/server/dist/index.js +26 -0
- package/packages/server/dist/index.js.map +1 -0
- package/packages/server/dist/qdrant/client.d.ts +24 -0
- package/packages/server/dist/qdrant/client.js +55 -0
- package/packages/server/dist/qdrant/client.js.map +1 -0
- package/packages/server/package.json +37 -0
- package/packages/server/src/api/explain.ts +24 -0
- package/packages/server/src/api/health.ts +50 -0
- package/packages/server/src/api/refresh.ts +9 -0
- package/packages/server/src/api/search.ts +57 -0
- package/packages/server/src/api/system.ts +25 -0
- package/packages/server/src/embedding/stub.test.ts +28 -0
- package/packages/server/src/embedding/stub.ts +33 -0
- package/packages/server/src/index.ts +29 -0
- package/packages/server/src/qdrant/client.ts +92 -0
- package/packages/server/tsconfig.json +16 -0
|
@@ -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,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>;
|