@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,44 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
const DEFAULT_SERVER_URL = "http://127.0.0.1:31415";
|
|
3
|
+
async function search(query, limit, baseUrl) {
|
|
4
|
+
const res = await fetch(`${baseUrl}/search`, {
|
|
5
|
+
method: "POST",
|
|
6
|
+
headers: { "Content-Type": "application/json" },
|
|
7
|
+
body: JSON.stringify({ query, limit }),
|
|
8
|
+
});
|
|
9
|
+
if (!res.ok) {
|
|
10
|
+
console.error(chalk.red("Search failed:"), res.status, await res.text());
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const data = (await res.json());
|
|
14
|
+
if (data.systemMaps?.length) {
|
|
15
|
+
console.log(chalk.bold("System maps"));
|
|
16
|
+
for (const sm of data.systemMaps.slice(0, 3)) {
|
|
17
|
+
console.log(chalk.dim(sm.path ?? ""), "\n", sm.text.slice(0, 200) + (sm.text.length > 200 ? "..." : ""), "\n");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (data.moduleSummaries?.length) {
|
|
21
|
+
console.log(chalk.bold("Module summaries"));
|
|
22
|
+
for (const ms of data.moduleSummaries.slice(0, 5)) {
|
|
23
|
+
console.log(chalk.dim(ms.path ?? ""), "\n", ms.text.slice(0, 150) + (ms.text.length > 150 ? "..." : ""), "\n");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (data.chunks?.length) {
|
|
27
|
+
console.log(chalk.bold("Chunks"));
|
|
28
|
+
for (const c of data.chunks.slice(0, 5)) {
|
|
29
|
+
console.log(chalk.dim(c.path ?? ""), c.score != null ? chalk.dim(`(${c.score})`) : "", "\n", c.text.slice(0, 200) + (c.text.length > 200 ? "..." : ""), "\n");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function runQuery(_cwd, text) {
|
|
34
|
+
const baseUrl = process.env.MEM_SERVER_URL ?? DEFAULT_SERVER_URL;
|
|
35
|
+
try {
|
|
36
|
+
await search(text, 15, baseUrl);
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
console.error(chalk.red("Request failed:"), e.message);
|
|
40
|
+
console.log(chalk.dim("Ensure memory server is running (mem scaffold)."));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { rmSync, existsSync, readdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { DEEP_INDEX_STATE_FILE } from "../config/types.js";
|
|
5
|
+
export function runReset(cwd, options = {}) {
|
|
6
|
+
const stateDir = join(cwd, ".mem", "state");
|
|
7
|
+
const deepIndexPath = join(cwd, DEEP_INDEX_STATE_FILE);
|
|
8
|
+
if (existsSync(deepIndexPath)) {
|
|
9
|
+
rmSync(deepIndexPath, { force: true });
|
|
10
|
+
console.log(chalk.green("Removed"), DEEP_INDEX_STATE_FILE);
|
|
11
|
+
}
|
|
12
|
+
if (existsSync(stateDir)) {
|
|
13
|
+
try {
|
|
14
|
+
const files = readdirSync(stateDir);
|
|
15
|
+
for (const f of files) {
|
|
16
|
+
rmSync(join(stateDir, f), { force: true });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// ignore
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
console.log(chalk.green("Reset complete. Index state and deep-index progress cleared."));
|
|
24
|
+
if (options.volumes) {
|
|
25
|
+
console.log(chalk.dim("To wipe Qdrant volume, run: docker compose down -v"));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=reset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/commands/reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,UAAiC,EAAE;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IAEvD,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC,CAAC;IACzF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runScaffold(cwd: string): Promise<void>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { configExists } from "../config/load.js";
|
|
6
|
+
import { dockerComposeUp, waitForQdrantHealth } from "../docker/compose.js";
|
|
7
|
+
import { runPhase1 } from "../phase1/pipeline.js";
|
|
8
|
+
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
|
9
|
+
export async function runScaffold(cwd) {
|
|
10
|
+
if (!configExists(cwd)) {
|
|
11
|
+
console.error(chalk.red("No config found. Run"), chalk.cyan("mem init"), chalk.red("first."));
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
console.log(chalk.bold("Project Memory Scaffold (Phase 1)\n"));
|
|
15
|
+
console.log(chalk.dim("Starting Docker Compose..."));
|
|
16
|
+
try {
|
|
17
|
+
dockerComposeUp(cwd);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
console.error(chalk.red("Docker Compose failed:"), err.message);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
console.log(chalk.dim("Waiting for Qdrant..."));
|
|
24
|
+
try {
|
|
25
|
+
await waitForQdrantHealth();
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
console.error(chalk.red("Qdrant health check failed:"), err.message);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
console.log(chalk.green("✓"), "Qdrant ready");
|
|
32
|
+
console.log(chalk.dim("Phase 1: file tree, symbol index, module summaries, system maps, embedding..."));
|
|
33
|
+
try {
|
|
34
|
+
await runPhase1(cwd);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.error(chalk.red("Phase 1 failed:"), err.message);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const serverPath = join(__dirname, "..", "..", "..", "server", "dist", "index.js");
|
|
41
|
+
const env = { ...process.env, MEM_CWD: cwd };
|
|
42
|
+
try {
|
|
43
|
+
spawn(process.execPath, [serverPath], { env, stdio: "ignore", detached: true }).unref();
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
console.log(chalk.yellow("Could not start memory server. Run: cd packages/server && MEM_CWD=" + cwd + " npm start"));
|
|
47
|
+
}
|
|
48
|
+
console.log(chalk.green("✓"), "Memory server started (detached)");
|
|
49
|
+
console.log(chalk.green("\nScaffold Phase 1 complete. Cursor integration ready."));
|
|
50
|
+
console.log(chalk.dim("Run"), chalk.cyan("mem deep-index"), chalk.dim("to embed remaining chunks (Phase 2)."));
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/commands/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { configExists } from "../config/load.js";
|
|
3
|
+
import { runPhase1 } from "../phase1/pipeline.js";
|
|
4
|
+
/**
|
|
5
|
+
* Incremental update: re-run Phase 1 (full scope+ignore, chunk, embed Phase 1 points).
|
|
6
|
+
* V1: full Phase 1 re-run; true incremental (changed files only) can be added later via manifest.
|
|
7
|
+
*/
|
|
8
|
+
export async function runUpdate(cwd) {
|
|
9
|
+
if (!configExists(cwd)) {
|
|
10
|
+
console.error(chalk.red("No config found. Run"), chalk.cyan("mem init"), chalk.red("first."));
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
console.log(chalk.bold("Project Memory Update\n"));
|
|
14
|
+
try {
|
|
15
|
+
await runPhase1(cwd);
|
|
16
|
+
console.log(chalk.green("Update complete."));
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
console.error(chalk.red("Update failed:"), err.message);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,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,QAAQ,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runWatch(cwd: string): Promise<void>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { configExists, loadConfig } from "../config/load.js";
|
|
3
|
+
import { listInScopeFiles } from "../scope/allowlist.js";
|
|
4
|
+
import { createIgnoreFilter } from "../scope/ignore.js";
|
|
5
|
+
import { toRelativePath } from "../scope/allowlist.js";
|
|
6
|
+
import { runUpdate } from "./update.js";
|
|
7
|
+
export async function runWatch(cwd) {
|
|
8
|
+
if (!configExists(cwd)) {
|
|
9
|
+
console.error(chalk.red("No config found. Run"), chalk.cyan("mem init"), chalk.red("first."));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const config = loadConfig(cwd);
|
|
13
|
+
const isIgnored = createIgnoreFilter(cwd, config.indexing?.exclude ?? []);
|
|
14
|
+
const inScopePaths = listInScopeFiles(cwd, config);
|
|
15
|
+
const eligiblePaths = [];
|
|
16
|
+
for (const abs of inScopePaths) {
|
|
17
|
+
const rel = toRelativePath(cwd, abs);
|
|
18
|
+
if (!isIgnored(rel))
|
|
19
|
+
eligiblePaths.push(abs);
|
|
20
|
+
}
|
|
21
|
+
const { default: chokidar } = await import("chokidar");
|
|
22
|
+
let debounceMs = 2000;
|
|
23
|
+
let timeout = null;
|
|
24
|
+
const watcher = chokidar.watch(eligiblePaths, {
|
|
25
|
+
ignoreInitial: true,
|
|
26
|
+
awaitWriteFinish: { stabilityThreshold: 500 },
|
|
27
|
+
});
|
|
28
|
+
watcher.on("change", () => {
|
|
29
|
+
if (timeout)
|
|
30
|
+
clearTimeout(timeout);
|
|
31
|
+
timeout = setTimeout(async () => {
|
|
32
|
+
console.log(chalk.dim("Change detected, running update..."));
|
|
33
|
+
try {
|
|
34
|
+
await runUpdate(cwd);
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
console.error(chalk.red("Update failed:"), e.message);
|
|
38
|
+
}
|
|
39
|
+
timeout = null;
|
|
40
|
+
}, debounceMs);
|
|
41
|
+
});
|
|
42
|
+
console.log(chalk.bold("Project Memory Watch"));
|
|
43
|
+
console.log(chalk.dim("Watching"), eligiblePaths.length, "files. Ctrl+C to stop.");
|
|
44
|
+
console.log(chalk.dim("Run mem update manually or wait for file changes."));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW;IACxC,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,QAAQ,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACvD,IAAI,UAAU,GAAG,IAAI,CAAC;IACtB,IAAI,OAAO,GAAyC,IAAI,CAAC;IAEzD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE;QAC5C,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE;KAC9C,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,IAAI,OAAO;YAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { DEFAULT_CONFIG } from "./types.js";
|
|
2
|
+
export function getDefaultConfigYaml() {
|
|
3
|
+
const c = {
|
|
4
|
+
indexing: {
|
|
5
|
+
include: ["src/**", "docs/**"],
|
|
6
|
+
exclude: [],
|
|
7
|
+
},
|
|
8
|
+
phase1: DEFAULT_CONFIG.phase1,
|
|
9
|
+
qdrant: DEFAULT_CONFIG.qdrant,
|
|
10
|
+
chunk: DEFAULT_CONFIG.chunk,
|
|
11
|
+
embedding: DEFAULT_CONFIG.embedding,
|
|
12
|
+
};
|
|
13
|
+
return `# Project Memory config
|
|
14
|
+
# indexing.include: allowlist globs (only these paths are eligible). Omit to index repo root.
|
|
15
|
+
indexing:
|
|
16
|
+
include:
|
|
17
|
+
- "src/**"
|
|
18
|
+
- "docs/**"
|
|
19
|
+
exclude: []
|
|
20
|
+
|
|
21
|
+
phase1:
|
|
22
|
+
maxEntrypointFiles: ${c.phase1.maxEntrypointFiles}
|
|
23
|
+
maxEntrypointChunks: ${c.phase1.maxEntrypointChunks}
|
|
24
|
+
|
|
25
|
+
qdrant:
|
|
26
|
+
host: ${c.qdrant.host}
|
|
27
|
+
port: ${c.qdrant.port}
|
|
28
|
+
collection: ${c.qdrant.collection}
|
|
29
|
+
|
|
30
|
+
chunk:
|
|
31
|
+
maxLines: ${c.chunk.maxLines}
|
|
32
|
+
minLines: ${c.chunk.minLines}
|
|
33
|
+
|
|
34
|
+
embedding:
|
|
35
|
+
provider: ${c.embedding.provider}
|
|
36
|
+
`;
|
|
37
|
+
}
|
|
38
|
+
export function getDefaultMemignore() {
|
|
39
|
+
return `# Project Memory ignore rules (gitignore-style)
|
|
40
|
+
# Tests
|
|
41
|
+
**/*.test.*
|
|
42
|
+
**/*.spec.*
|
|
43
|
+
**/__tests__/**
|
|
44
|
+
**/tests/**
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,UAAU,oBAAoB;IAClC,MAAM,CAAC,GAAc;QACnB,QAAQ,EAAE;YACR,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC9B,OAAO,EAAE,EAAE;SACZ;QACD,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,SAAS,EAAE,cAAc,CAAC,SAAS;KACpC,CAAC;IACF,OAAO;;;;;;;;;wBASe,CAAC,CAAC,MAAO,CAAC,kBAAkB;yBAC3B,CAAC,CAAC,MAAO,CAAC,mBAAmB;;;UAG5C,CAAC,CAAC,MAAO,CAAC,IAAI;UACd,CAAC,CAAC,MAAO,CAAC,IAAI;gBACR,CAAC,CAAC,MAAO,CAAC,UAAU;;;cAGtB,CAAC,CAAC,KAAM,CAAC,QAAQ;cACjB,CAAC,CAAC,KAAM,CAAC,QAAQ;;;cAGjB,CAAC,CAAC,SAAU,CAAC,QAAQ;CAClC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;CAMR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import yaml from "js-yaml";
|
|
4
|
+
import { DEFAULT_CONFIG, CONFIG_FILE } from "./types.js";
|
|
5
|
+
function mergeConfig(loaded) {
|
|
6
|
+
return {
|
|
7
|
+
indexing: loaded.indexing ?? DEFAULT_CONFIG.indexing,
|
|
8
|
+
phase1: { ...DEFAULT_CONFIG.phase1, ...loaded.phase1 },
|
|
9
|
+
qdrant: { ...DEFAULT_CONFIG.qdrant, ...loaded.qdrant },
|
|
10
|
+
chunk: { ...DEFAULT_CONFIG.chunk, ...loaded.chunk },
|
|
11
|
+
embedding: { ...DEFAULT_CONFIG.embedding, ...loaded.embedding },
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function loadConfig(cwd) {
|
|
15
|
+
const path = join(cwd, CONFIG_FILE);
|
|
16
|
+
if (!existsSync(path)) {
|
|
17
|
+
return mergeConfig({});
|
|
18
|
+
}
|
|
19
|
+
const raw = readFileSync(path, "utf8");
|
|
20
|
+
const parsed = yaml.load(raw);
|
|
21
|
+
return mergeConfig(parsed ?? {});
|
|
22
|
+
}
|
|
23
|
+
export function getConfigPath(cwd) {
|
|
24
|
+
return join(cwd, CONFIG_FILE);
|
|
25
|
+
}
|
|
26
|
+
export function configExists(cwd) {
|
|
27
|
+
return existsSync(join(cwd, CONFIG_FILE));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/config/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD,SAAS,WAAW,CAAC,MAAiB;IACpC,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ;QACpD,MAAM,EAAE,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE;QACtD,MAAM,EAAE,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE;QACtD,KAAK,EAAE,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE;QACnD,SAAS,EAAE,EAAE,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAA0B,CAAC;IACvD,OAAO,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { strict as assert } from "node:assert";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { mkdtempSync, writeFileSync, rmSync, mkdirSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { loadConfig, getConfigPath, configExists } from "./load.js";
|
|
7
|
+
describe("config load", () => {
|
|
8
|
+
it("loadConfig with no file returns merged defaults", () => {
|
|
9
|
+
const cwd = mkdtempSync(join(tmpdir(), "mem-config-"));
|
|
10
|
+
try {
|
|
11
|
+
const config = loadConfig(cwd);
|
|
12
|
+
assert.strictEqual(config.phase1?.maxEntrypointFiles, 50);
|
|
13
|
+
assert.strictEqual(config.qdrant?.port, 6333);
|
|
14
|
+
assert.strictEqual(config.embedding?.provider, "local");
|
|
15
|
+
}
|
|
16
|
+
finally {
|
|
17
|
+
rmSync(cwd, { recursive: true, force: true });
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
it("getConfigPath returns .mem/config.yml under cwd", () => {
|
|
21
|
+
const cwd = "/some/repo";
|
|
22
|
+
assert.ok(getConfigPath(cwd).endsWith(".mem/config.yml"));
|
|
23
|
+
assert.ok(getConfigPath(cwd).includes("some"));
|
|
24
|
+
});
|
|
25
|
+
it("configExists returns false when file missing", () => {
|
|
26
|
+
const cwd = mkdtempSync(join(tmpdir(), "mem-config-"));
|
|
27
|
+
try {
|
|
28
|
+
assert.strictEqual(configExists(cwd), false);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
rmSync(cwd, { recursive: true, force: true });
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
it("loadConfig merges overrides when file exists", () => {
|
|
35
|
+
const cwd = mkdtempSync(join(tmpdir(), "mem-config-"));
|
|
36
|
+
const configPath = join(cwd, ".mem", "config.yml");
|
|
37
|
+
mkdirSync(join(cwd, ".mem"), { recursive: true });
|
|
38
|
+
writeFileSync(configPath, "phase1:\n maxEntrypointFiles: 10\nqdrant:\n port: 9999\n", "utf8");
|
|
39
|
+
try {
|
|
40
|
+
const config = loadConfig(cwd);
|
|
41
|
+
assert.strictEqual(config.phase1?.maxEntrypointFiles, 10);
|
|
42
|
+
assert.strictEqual(config.qdrant?.port, 9999);
|
|
43
|
+
assert.strictEqual(config.embedding?.provider, "local");
|
|
44
|
+
assert.strictEqual(configExists(cwd), true);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
rmSync(cwd, { recursive: true, force: true });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=load.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.test.js","sourceRoot":"","sources":["../../src/config/load.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface MemConfig {
|
|
2
|
+
indexing?: {
|
|
3
|
+
include?: string[];
|
|
4
|
+
exclude?: string[];
|
|
5
|
+
};
|
|
6
|
+
phase1?: {
|
|
7
|
+
maxEntrypointFiles?: number;
|
|
8
|
+
maxEntrypointChunks?: number;
|
|
9
|
+
};
|
|
10
|
+
qdrant?: {
|
|
11
|
+
host?: string;
|
|
12
|
+
port?: number;
|
|
13
|
+
collection?: string;
|
|
14
|
+
};
|
|
15
|
+
chunk?: {
|
|
16
|
+
maxLines?: number;
|
|
17
|
+
minLines?: number;
|
|
18
|
+
};
|
|
19
|
+
embedding?: {
|
|
20
|
+
provider?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare const DEFAULT_CONFIG: Required<Pick<MemConfig, "phase1" | "qdrant" | "chunk" | "embedding">> & {
|
|
24
|
+
indexing: {
|
|
25
|
+
include?: string[];
|
|
26
|
+
exclude?: string[];
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export declare const CONFIG_DIR = ".mem";
|
|
30
|
+
export declare const CONFIG_FILE = ".mem/config.yml";
|
|
31
|
+
export declare const MEMIGNORE_FILE = ".memignore";
|
|
32
|
+
export declare const DEEP_INDEX_STATE_FILE = ".mem/state/deep-index.json";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const DEFAULT_CONFIG = {
|
|
2
|
+
phase1: {
|
|
3
|
+
maxEntrypointFiles: 50,
|
|
4
|
+
maxEntrypointChunks: 300,
|
|
5
|
+
},
|
|
6
|
+
qdrant: {
|
|
7
|
+
host: "127.0.0.1",
|
|
8
|
+
port: 6333,
|
|
9
|
+
collection: "project_memory",
|
|
10
|
+
},
|
|
11
|
+
chunk: {
|
|
12
|
+
maxLines: 400,
|
|
13
|
+
minLines: 50,
|
|
14
|
+
},
|
|
15
|
+
embedding: {
|
|
16
|
+
provider: "local",
|
|
17
|
+
},
|
|
18
|
+
indexing: {},
|
|
19
|
+
};
|
|
20
|
+
export const CONFIG_DIR = ".mem";
|
|
21
|
+
export const CONFIG_FILE = ".mem/config.yml";
|
|
22
|
+
export const MEMIGNORE_FILE = ".memignore";
|
|
23
|
+
export const DEEP_INDEX_STATE_FILE = ".mem/state/deep-index.json";
|
|
24
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,cAAc,GAEoC;IAC7D,MAAM,EAAE;QACN,kBAAkB,EAAE,EAAE;QACtB,mBAAmB,EAAE,GAAG;KACzB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,gBAAgB;KAC7B;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,GAAG;QACb,QAAQ,EAAE,EAAE;KACb;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,OAAO;KAClB;IACD,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { strict as assert } from "node:assert";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { DEFAULT_CONFIG, CONFIG_DIR, CONFIG_FILE, MEMIGNORE_FILE, DEEP_INDEX_STATE_FILE, } from "./types.js";
|
|
4
|
+
describe("config types", () => {
|
|
5
|
+
it("DEFAULT_CONFIG has phase1 caps", () => {
|
|
6
|
+
assert.strictEqual(DEFAULT_CONFIG.phase1.maxEntrypointFiles, 50);
|
|
7
|
+
assert.strictEqual(DEFAULT_CONFIG.phase1.maxEntrypointChunks, 300);
|
|
8
|
+
});
|
|
9
|
+
it("DEFAULT_CONFIG has qdrant defaults", () => {
|
|
10
|
+
assert.strictEqual(DEFAULT_CONFIG.qdrant.host, "127.0.0.1");
|
|
11
|
+
assert.strictEqual(DEFAULT_CONFIG.qdrant.port, 6333);
|
|
12
|
+
assert.strictEqual(DEFAULT_CONFIG.qdrant.collection, "project_memory");
|
|
13
|
+
});
|
|
14
|
+
it("DEFAULT_CONFIG has chunk defaults", () => {
|
|
15
|
+
assert.strictEqual(DEFAULT_CONFIG.chunk.maxLines, 400);
|
|
16
|
+
assert.ok((DEFAULT_CONFIG.chunk.minLines ?? 0) >= 0);
|
|
17
|
+
});
|
|
18
|
+
it("CONFIG_DIR is .mem", () => {
|
|
19
|
+
assert.strictEqual(CONFIG_DIR, ".mem");
|
|
20
|
+
});
|
|
21
|
+
it("CONFIG_FILE is .mem/config.yml", () => {
|
|
22
|
+
assert.strictEqual(CONFIG_FILE, ".mem/config.yml");
|
|
23
|
+
});
|
|
24
|
+
it("MEMIGNORE_FILE is .memignore", () => {
|
|
25
|
+
assert.strictEqual(MEMIGNORE_FILE, ".memignore");
|
|
26
|
+
});
|
|
27
|
+
it("DEEP_INDEX_STATE_FILE is .mem/state/deep-index.json", () => {
|
|
28
|
+
assert.strictEqual(DEEP_INDEX_STATE_FILE, ".mem/state/deep-index.json");
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/config/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,EACL,cAAc,EACd,UAAU,EACV,WAAW,EACX,cAAc,EACd,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC5D,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,WAAW,CAAC,qBAAqB,EAAE,4BAA4B,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function dockerComposeUp(cwd: string): void;
|
|
2
|
+
export declare function dockerComposeDown(cwd: string): void;
|
|
3
|
+
export declare function waitForQdrantHealth(timeoutMs?: number): Promise<void>;
|
|
4
|
+
export declare function checkDockerAvailable(cwd: string): boolean;
|
|
5
|
+
export declare function checkQdrantHealthy(): Promise<boolean>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const QDRANT_HEALTH_URL = "http://127.0.0.1:6333/health";
|
|
5
|
+
const HEALTH_POLL_MS = 1000;
|
|
6
|
+
const HEALTH_TIMEOUT_MS = 60_000;
|
|
7
|
+
function getComposeDir(cwd) {
|
|
8
|
+
const atRoot = join(cwd, "docker-compose.yml");
|
|
9
|
+
const atMem = join(cwd, ".mem", "docker-compose.yml");
|
|
10
|
+
if (existsSync(atRoot))
|
|
11
|
+
return cwd;
|
|
12
|
+
if (existsSync(atMem))
|
|
13
|
+
return join(cwd, ".mem");
|
|
14
|
+
return cwd;
|
|
15
|
+
}
|
|
16
|
+
function composeCmd(cwd) {
|
|
17
|
+
try {
|
|
18
|
+
execSync("docker compose version", { stdio: "pipe", cwd });
|
|
19
|
+
return "docker compose";
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
try {
|
|
23
|
+
execSync("docker-compose --version", { stdio: "pipe", cwd });
|
|
24
|
+
return "docker-compose";
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new Error("Docker Compose not found. Install Docker and Docker Compose.");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function dockerComposeUp(cwd) {
|
|
32
|
+
const dir = getComposeDir(cwd);
|
|
33
|
+
const cmd = composeCmd(dir);
|
|
34
|
+
execSync(`${cmd} up -d`, { stdio: "inherit", cwd: dir });
|
|
35
|
+
}
|
|
36
|
+
export function dockerComposeDown(cwd) {
|
|
37
|
+
const dir = getComposeDir(cwd);
|
|
38
|
+
const cmd = composeCmd(dir);
|
|
39
|
+
execSync(`${cmd} down`, { stdio: "inherit", cwd: dir });
|
|
40
|
+
}
|
|
41
|
+
export function waitForQdrantHealth(timeoutMs = HEALTH_TIMEOUT_MS) {
|
|
42
|
+
const start = Date.now();
|
|
43
|
+
return new Promise((resolve, reject) => {
|
|
44
|
+
function poll() {
|
|
45
|
+
if (Date.now() - start > timeoutMs) {
|
|
46
|
+
reject(new Error("Qdrant health check timed out"));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
fetch(QDRANT_HEALTH_URL)
|
|
50
|
+
.then((r) => {
|
|
51
|
+
if (r.ok)
|
|
52
|
+
resolve();
|
|
53
|
+
else
|
|
54
|
+
setTimeout(poll, HEALTH_POLL_MS);
|
|
55
|
+
})
|
|
56
|
+
.catch(() => setTimeout(poll, HEALTH_POLL_MS));
|
|
57
|
+
}
|
|
58
|
+
poll();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
export function checkDockerAvailable(cwd) {
|
|
62
|
+
try {
|
|
63
|
+
composeCmd(getComposeDir(cwd));
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function checkQdrantHealthy() {
|
|
71
|
+
return fetch(QDRANT_HEALTH_URL)
|
|
72
|
+
.then((r) => r.ok)
|
|
73
|
+
.catch(() => false);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/docker/compose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stub embedder: must match server's stub (same size and logic) for vector compatibility.
|
|
3
|
+
*/
|
|
4
|
+
export declare function embedText(text: string): number[];
|
|
5
|
+
export declare function embedBatch(texts: string[]): number[][];
|
|
6
|
+
export declare function getVectorSize(): number;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const VECTOR_SIZE = 384;
|
|
2
|
+
function simpleHash(str) {
|
|
3
|
+
let h = 0;
|
|
4
|
+
for (let i = 0; i < str.length; i++) {
|
|
5
|
+
h = (h * 31 + str.charCodeAt(i)) >>> 0;
|
|
6
|
+
}
|
|
7
|
+
return h;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Stub embedder: must match server's stub (same size and logic) for vector compatibility.
|
|
11
|
+
*/
|
|
12
|
+
export function embedText(text) {
|
|
13
|
+
const vec = [];
|
|
14
|
+
const words = text.split(/\s+/).filter(Boolean);
|
|
15
|
+
for (let i = 0; i < VECTOR_SIZE; i++) {
|
|
16
|
+
const seed = words[i % words.length]
|
|
17
|
+
? simpleHash(words[i % words.length]) + i * 31
|
|
18
|
+
: i;
|
|
19
|
+
vec.push(Math.sin(seed) * 0.5 + 0.5);
|
|
20
|
+
}
|
|
21
|
+
return vec;
|
|
22
|
+
}
|
|
23
|
+
export function embedBatch(texts) {
|
|
24
|
+
return texts.map(embedText);
|
|
25
|
+
}
|
|
26
|
+
export function getVectorSize() {
|
|
27
|
+
return VECTOR_SIZE;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=stub.js.map
|