@saleem11kh/repomem 0.1.1 → 0.2.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/LICENSE +21 -0
- package/README.md +199 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +335 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/config.d.ts +24 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +100 -0
- package/dist/config/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/store/file-store.d.ts +53 -0
- package/dist/store/file-store.d.ts.map +1 -0
- package/dist/store/file-store.js +367 -0
- package/dist/store/file-store.js.map +1 -0
- package/dist/store/remote.d.ts +30 -0
- package/dist/store/remote.d.ts.map +1 -0
- package/dist/store/remote.js +118 -0
- package/dist/store/remote.js.map +1 -0
- package/dist/tools/mem-context.d.ts +3 -0
- package/dist/tools/mem-context.d.ts.map +1 -0
- package/dist/tools/mem-context.js +105 -0
- package/dist/tools/mem-context.js.map +1 -0
- package/dist/tools/mem-handoff.d.ts +3 -0
- package/dist/tools/mem-handoff.d.ts.map +1 -0
- package/dist/tools/mem-handoff.js +72 -0
- package/dist/tools/mem-handoff.js.map +1 -0
- package/dist/tools/mem-save.d.ts +5 -0
- package/dist/tools/mem-save.d.ts.map +1 -0
- package/dist/tools/mem-save.js +85 -0
- package/dist/tools/mem-save.js.map +1 -0
- package/dist/tools/mem-search.d.ts +3 -0
- package/dist/tools/mem-search.d.ts.map +1 -0
- package/dist/tools/mem-search.js +47 -0
- package/dist/tools/mem-search.js.map +1 -0
- package/dist/tools/util.d.ts +18 -0
- package/dist/tools/util.d.ts.map +1 -0
- package/dist/tools/util.js +42 -0
- package/dist/tools/util.js.map +1 -0
- package/package.json +25 -4
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CONFIG_FILENAME = void 0;
|
|
37
|
+
exports.findProjectRoot = findProjectRoot;
|
|
38
|
+
exports.loadConfig = loadConfig;
|
|
39
|
+
exports.deriveProjectName = deriveProjectName;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
exports.CONFIG_FILENAME = "repomem.config.json";
|
|
43
|
+
const DEFAULT_CONFIG = {
|
|
44
|
+
project: "unknown-project",
|
|
45
|
+
linked: [],
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Walk up from `start` looking for repomem.config.json or a .repomem/ dir.
|
|
49
|
+
* Returns the directory that contains them, or `start` if none found.
|
|
50
|
+
*/
|
|
51
|
+
function findProjectRoot(start = process.cwd()) {
|
|
52
|
+
let dir = path.resolve(start);
|
|
53
|
+
// Stop at filesystem root.
|
|
54
|
+
for (;;) {
|
|
55
|
+
if (fs.existsSync(path.join(dir, exports.CONFIG_FILENAME)) ||
|
|
56
|
+
fs.existsSync(path.join(dir, ".repomem"))) {
|
|
57
|
+
return dir;
|
|
58
|
+
}
|
|
59
|
+
const parent = path.dirname(dir);
|
|
60
|
+
if (parent === dir)
|
|
61
|
+
return path.resolve(start);
|
|
62
|
+
dir = parent;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Load repomem.config.json from the project root. Falls back to a default
|
|
67
|
+
* config (project name derived from package.json or directory name) when the
|
|
68
|
+
* file is missing or malformed — never throws.
|
|
69
|
+
*/
|
|
70
|
+
function loadConfig(projectRoot = findProjectRoot()) {
|
|
71
|
+
const configPath = path.join(projectRoot, exports.CONFIG_FILENAME);
|
|
72
|
+
try {
|
|
73
|
+
const raw = fs.readFileSync(configPath, "utf8");
|
|
74
|
+
const parsed = JSON.parse(raw);
|
|
75
|
+
return {
|
|
76
|
+
project: parsed.project || deriveProjectName(projectRoot),
|
|
77
|
+
workspace: parsed.workspace,
|
|
78
|
+
linked: Array.isArray(parsed.linked) ? parsed.linked : [],
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return { ...DEFAULT_CONFIG, project: deriveProjectName(projectRoot) };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Derive a project name from package.json `name`, else the directory name. */
|
|
86
|
+
function deriveProjectName(projectRoot) {
|
|
87
|
+
try {
|
|
88
|
+
const pkgRaw = fs.readFileSync(path.join(projectRoot, "package.json"), "utf8");
|
|
89
|
+
const pkg = JSON.parse(pkgRaw);
|
|
90
|
+
if (pkg.name) {
|
|
91
|
+
// Strip npm scope for a friendlier label.
|
|
92
|
+
return pkg.name.replace(/^@[^/]+\//, "");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
/* ignore */
|
|
97
|
+
}
|
|
98
|
+
return path.basename(projectRoot);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,0CAcC;AAOD,gCAaC;AAGD,8CAYC;AA1ED,uCAAyB;AACzB,2CAA6B;AAahB,QAAA,eAAe,GAAG,qBAAqB,CAAC;AAErD,MAAM,cAAc,GAAkB;IACpC,OAAO,EAAE,iBAAiB;IAC1B,MAAM,EAAE,EAAE;CACX,CAAC;AAEF;;;GAGG;AACH,SAAgB,eAAe,CAAC,QAAgB,OAAO,CAAC,GAAG,EAAE;IAC3D,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,2BAA2B;IAC3B,SAAS,CAAC;QACR,IACE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAe,CAAC,CAAC;YAC9C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,EACzC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/C,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,UAAU,CAAC,cAAsB,eAAe,EAAE;IAChE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAe,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAC;QACzD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,iBAAiB,CAAC,WAAW,CAAC;YACzD,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;SAC1D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;IACxE,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,SAAgB,iBAAiB,CAAC,WAAmB;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAsB,CAAC;QACpD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,0CAA0C;YAC1C,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmBA,yDAAyD;AACzD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA8CjD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startServer = startServer;
|
|
4
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
5
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
6
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
7
|
+
const config_js_1 = require("./config/config.js");
|
|
8
|
+
const mem_save_js_1 = require("./tools/mem-save.js");
|
|
9
|
+
const mem_search_js_1 = require("./tools/mem-search.js");
|
|
10
|
+
const mem_context_js_1 = require("./tools/mem-context.js");
|
|
11
|
+
const mem_handoff_js_1 = require("./tools/mem-handoff.js");
|
|
12
|
+
const TOOLS = [mem_save_js_1.memSave, mem_search_js_1.memSearch, mem_context_js_1.memContext, mem_handoff_js_1.memHandoff];
|
|
13
|
+
const TOOL_MAP = new Map(TOOLS.map((t) => [t.name, t]));
|
|
14
|
+
const VERSION = "0.2.0";
|
|
15
|
+
/** Build and start the repomem MCP server over stdio. */
|
|
16
|
+
async function startServer() {
|
|
17
|
+
const server = new index_js_1.Server({ name: "repomem", version: VERSION }, {
|
|
18
|
+
capabilities: { tools: {} },
|
|
19
|
+
instructions: "Git-native memory for AI coding agents. Memory lives in .repomem/ in the " +
|
|
20
|
+
"repo, commits with the code, and travels to teammates. Call mem_context at " +
|
|
21
|
+
"the start of a session, mem_save to capture decisions/patterns/issues, " +
|
|
22
|
+
"mem_search to recall, and mem_handoff to close out a session.",
|
|
23
|
+
});
|
|
24
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
|
|
25
|
+
tools: TOOLS.map((t) => ({
|
|
26
|
+
name: t.name,
|
|
27
|
+
description: t.description,
|
|
28
|
+
inputSchema: t.inputSchema,
|
|
29
|
+
})),
|
|
30
|
+
}));
|
|
31
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
32
|
+
const tool = TOOL_MAP.get(request.params.name);
|
|
33
|
+
if (!tool) {
|
|
34
|
+
return {
|
|
35
|
+
content: [{ type: "text", text: `✖ Unknown tool: ${request.params.name}` }],
|
|
36
|
+
isError: true,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const args = (request.params.arguments ?? {});
|
|
40
|
+
try {
|
|
41
|
+
const text = tool.handler(args, (0, config_js_1.findProjectRoot)());
|
|
42
|
+
return { content: [{ type: "text", text }] };
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
46
|
+
return {
|
|
47
|
+
content: [{ type: "text", text: `✖ ${tool.name} failed: ${message}` }],
|
|
48
|
+
isError: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
53
|
+
await server.connect(transport);
|
|
54
|
+
// Stderr is safe to log to; stdout is reserved for the MCP protocol.
|
|
55
|
+
console.error(`repomem MCP server v${VERSION} ready (stdio).`);
|
|
56
|
+
}
|
|
57
|
+
// Run directly when invoked as a script (not when imported by the CLI router).
|
|
58
|
+
if (require.main === module) {
|
|
59
|
+
startServer().catch((err) => {
|
|
60
|
+
console.error("repomem failed to start:", err);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { RepomemConfig } from "../config/config.js";
|
|
2
|
+
import { RemoteRef } from "./remote.js";
|
|
3
|
+
export type MemoryType = "decisions" | "sessions" | "patterns" | "issues";
|
|
4
|
+
export declare const MEMORY_TYPES: MemoryType[];
|
|
5
|
+
export declare const REPOMEM_DIR = ".repomem";
|
|
6
|
+
export declare const INDEX_FILENAME = "REPOMEM.md";
|
|
7
|
+
export interface SearchResult {
|
|
8
|
+
file: string;
|
|
9
|
+
scope: string;
|
|
10
|
+
title: string;
|
|
11
|
+
excerpt: string;
|
|
12
|
+
score: number;
|
|
13
|
+
}
|
|
14
|
+
/** Absolute path to the .repomem/ dir for a given project root. */
|
|
15
|
+
export declare function getRepomemRoot(projectRoot?: string): string;
|
|
16
|
+
/** True if .repomem/ exists at the project root. */
|
|
17
|
+
export declare function isInitialized(projectRoot?: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* List relative file paths (from .repomem/) of a given memory type, sorted
|
|
20
|
+
* newest-first by filename. Returns [] when uninitialised or empty.
|
|
21
|
+
*/
|
|
22
|
+
export declare function listFiles(type: MemoryType, projectRoot?: string): string[];
|
|
23
|
+
/** Read a memory file by type + filename. Returns null when missing. */
|
|
24
|
+
export declare function readFile(type: MemoryType, filename: string, projectRoot?: string): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Write (or append) a memory file. Creates the type dir if needed.
|
|
27
|
+
* Returns the absolute path written.
|
|
28
|
+
*/
|
|
29
|
+
export declare function writeFile(type: MemoryType, filename: string, content: string, opts?: {
|
|
30
|
+
append?: boolean;
|
|
31
|
+
}, projectRoot?: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Search the current repo and, when `includeLinked`, all linked repos and the
|
|
34
|
+
* workspace declared in repomem.config.json. Returns max 10 results, ranked.
|
|
35
|
+
*/
|
|
36
|
+
export declare function searchFiles(query: string, projectRoot?: string): SearchResult[];
|
|
37
|
+
/** Cache root for a pulled remote repo — a project-root-shaped dir under .repomem/.cache/. */
|
|
38
|
+
export declare function remoteCacheRoot(projectRoot: string, r: RemoteRef): string;
|
|
39
|
+
export declare function searchAllRepos(query: string, projectRoot?: string, config?: RepomemConfig): SearchResult[];
|
|
40
|
+
/**
|
|
41
|
+
* Parse a `repomem sync` export bundle and write its files back into .repomem/.
|
|
42
|
+
* The inverse of the CLI's export format — used for airgapped transfer. Returns
|
|
43
|
+
* the list of `type/filename` entries written. Existing files are overwritten.
|
|
44
|
+
*/
|
|
45
|
+
export declare function importBundle(text: string, projectRoot?: string): string[];
|
|
46
|
+
/** Counts of each memory type — used by `status` and the index. */
|
|
47
|
+
export declare function counts(projectRoot?: string): Record<MemoryType, number>;
|
|
48
|
+
/**
|
|
49
|
+
* Regenerate REPOMEM.md — a human- and agent-readable index of everything in
|
|
50
|
+
* .repomem/. Returns the absolute path written, or null when uninitialised.
|
|
51
|
+
*/
|
|
52
|
+
export declare function generateIndex(projectRoot?: string): string | null;
|
|
53
|
+
//# sourceMappingURL=file-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/store/file-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+B,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAA2B,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE1E,eAAO,MAAM,YAAY,EAAE,UAAU,EAKpC,CAAC;AAEF,eAAO,MAAM,WAAW,aAAa,CAAC;AACtC,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,WAAW,GAAE,MAA0B,GAAG,MAAM,CAE9E;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,WAAW,GAAE,MAA0B,GAAG,OAAO,CAE9E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,UAAU,EAChB,WAAW,GAAE,MAA0B,GACtC,MAAM,EAAE,CAWV;AAED,wEAAwE;AACxE,wBAAgB,QAAQ,CACtB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAA0B,GACtC,MAAM,GAAG,IAAI,CAOf;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,EAC/B,WAAW,GAAE,MAA0B,GACtC,MAAM,CAUR;AAiKD;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,MAA0B,GACtC,YAAY,EAAE,CAIhB;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAEzE;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,MAA0B,EACvC,MAAM,GAAE,aAAuC,GAC9C,YAAY,EAAE,CA6BhB;AAID;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,MAA0B,GACtC,MAAM,EAAE,CA2BV;AAED,mEAAmE;AACnE,wBAAgB,MAAM,CACpB,WAAW,GAAE,MAA0B,GACtC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAI5B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,WAAW,GAAE,MAA0B,GACtC,MAAM,GAAG,IAAI,CA2Bf"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.INDEX_FILENAME = exports.REPOMEM_DIR = exports.MEMORY_TYPES = void 0;
|
|
37
|
+
exports.getRepomemRoot = getRepomemRoot;
|
|
38
|
+
exports.isInitialized = isInitialized;
|
|
39
|
+
exports.listFiles = listFiles;
|
|
40
|
+
exports.readFile = readFile;
|
|
41
|
+
exports.writeFile = writeFile;
|
|
42
|
+
exports.searchFiles = searchFiles;
|
|
43
|
+
exports.remoteCacheRoot = remoteCacheRoot;
|
|
44
|
+
exports.searchAllRepos = searchAllRepos;
|
|
45
|
+
exports.importBundle = importBundle;
|
|
46
|
+
exports.counts = counts;
|
|
47
|
+
exports.generateIndex = generateIndex;
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const config_js_1 = require("../config/config.js");
|
|
51
|
+
const remote_js_1 = require("./remote.js");
|
|
52
|
+
exports.MEMORY_TYPES = [
|
|
53
|
+
"decisions",
|
|
54
|
+
"sessions",
|
|
55
|
+
"patterns",
|
|
56
|
+
"issues",
|
|
57
|
+
];
|
|
58
|
+
exports.REPOMEM_DIR = ".repomem";
|
|
59
|
+
exports.INDEX_FILENAME = "REPOMEM.md";
|
|
60
|
+
/** Absolute path to the .repomem/ dir for a given project root. */
|
|
61
|
+
function getRepomemRoot(projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
62
|
+
return path.join(projectRoot, exports.REPOMEM_DIR);
|
|
63
|
+
}
|
|
64
|
+
/** True if .repomem/ exists at the project root. */
|
|
65
|
+
function isInitialized(projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
66
|
+
return fs.existsSync(getRepomemRoot(projectRoot));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* List relative file paths (from .repomem/) of a given memory type, sorted
|
|
70
|
+
* newest-first by filename. Returns [] when uninitialised or empty.
|
|
71
|
+
*/
|
|
72
|
+
function listFiles(type, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
73
|
+
const dir = path.join(getRepomemRoot(projectRoot), type);
|
|
74
|
+
try {
|
|
75
|
+
return fs
|
|
76
|
+
.readdirSync(dir)
|
|
77
|
+
.filter((f) => f.endsWith(".md"))
|
|
78
|
+
.sort()
|
|
79
|
+
.reverse();
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Read a memory file by type + filename. Returns null when missing. */
|
|
86
|
+
function readFile(type, filename, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
87
|
+
const filePath = path.join(getRepomemRoot(projectRoot), type, filename);
|
|
88
|
+
try {
|
|
89
|
+
return fs.readFileSync(filePath, "utf8");
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Write (or append) a memory file. Creates the type dir if needed.
|
|
97
|
+
* Returns the absolute path written.
|
|
98
|
+
*/
|
|
99
|
+
function writeFile(type, filename, content, opts = {}, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
100
|
+
const dir = path.join(getRepomemRoot(projectRoot), type);
|
|
101
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
102
|
+
const filePath = path.join(dir, filename);
|
|
103
|
+
if (opts.append && fs.existsSync(filePath)) {
|
|
104
|
+
fs.appendFileSync(filePath, content, "utf8");
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
fs.writeFileSync(filePath, content, "utf8");
|
|
108
|
+
}
|
|
109
|
+
return filePath;
|
|
110
|
+
}
|
|
111
|
+
/** Strip YAML front matter and return { meta, body }. */
|
|
112
|
+
function splitFrontMatter(raw) {
|
|
113
|
+
if (raw.startsWith("---")) {
|
|
114
|
+
const end = raw.indexOf("\n---", 3);
|
|
115
|
+
if (end !== -1) {
|
|
116
|
+
const after = raw.indexOf("\n", end + 1);
|
|
117
|
+
return { body: after !== -1 ? raw.slice(after + 1) : "" };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return { body: raw };
|
|
121
|
+
}
|
|
122
|
+
/** Best-effort title: first markdown H1, else the filename. */
|
|
123
|
+
function titleOf(raw, filename) {
|
|
124
|
+
const m = raw.match(/^#\s+(.+)$/m);
|
|
125
|
+
return m ? m[1].trim() : filename.replace(/\.md$/, "");
|
|
126
|
+
}
|
|
127
|
+
// Recency boost: a fresh doc can score up to (1 + RECENCY_WEIGHT)× a stale one,
|
|
128
|
+
// decaying with a ~RECENCY_HALFLIFE_DAYS half-life. Keeps yesterday's session
|
|
129
|
+
// ahead of a year-old note when both match equally well.
|
|
130
|
+
const RECENCY_WEIGHT = 0.5;
|
|
131
|
+
const RECENCY_HALFLIFE_DAYS = 30;
|
|
132
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
133
|
+
/** Best-effort timestamp for a memory: leading YYYY-MM-DD in the name, else mtime. */
|
|
134
|
+
function docDateMs(type, filename, projectRoot) {
|
|
135
|
+
const m = filename.match(/^(\d{4})-(\d{2})-(\d{2})/);
|
|
136
|
+
if (m) {
|
|
137
|
+
const t = Date.parse(`${m[1]}-${m[2]}-${m[3]}T00:00:00Z`);
|
|
138
|
+
if (!Number.isNaN(t))
|
|
139
|
+
return t;
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
return fs.statSync(path.join(getRepomemRoot(projectRoot), type, filename)).mtimeMs;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return 0;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/** Count non-overlapping occurrences of `term` in `haystack` (already lower-cased). */
|
|
149
|
+
function countTerm(haystack, term) {
|
|
150
|
+
let n = 0;
|
|
151
|
+
let idx = haystack.indexOf(term);
|
|
152
|
+
while (idx !== -1) {
|
|
153
|
+
n += 1;
|
|
154
|
+
idx = haystack.indexOf(term, idx + term.length);
|
|
155
|
+
}
|
|
156
|
+
return n;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Full-text search across all memory types in a single project root, ranked by
|
|
160
|
+
* TF-IDF (rarer query terms weigh more), normalised for document length, with a
|
|
161
|
+
* recency boost. Case-insensitive over plain-markdown stores.
|
|
162
|
+
*/
|
|
163
|
+
function searchInRoot(query, scope, projectRoot) {
|
|
164
|
+
const terms = [
|
|
165
|
+
...new Set(query
|
|
166
|
+
.toLowerCase()
|
|
167
|
+
.split(/\s+/)
|
|
168
|
+
.filter((t) => t.length > 0)),
|
|
169
|
+
];
|
|
170
|
+
if (terms.length === 0)
|
|
171
|
+
return [];
|
|
172
|
+
// Pass 1: load matching docs and per-term frequencies.
|
|
173
|
+
const docs = [];
|
|
174
|
+
for (const type of exports.MEMORY_TYPES) {
|
|
175
|
+
for (const filename of listFiles(type, projectRoot)) {
|
|
176
|
+
const raw = readFile(type, filename, projectRoot);
|
|
177
|
+
if (raw == null)
|
|
178
|
+
continue;
|
|
179
|
+
const haystack = raw.toLowerCase();
|
|
180
|
+
const counts = new Map();
|
|
181
|
+
let total = 0;
|
|
182
|
+
for (const term of terms) {
|
|
183
|
+
const c = countTerm(haystack, term);
|
|
184
|
+
if (c > 0)
|
|
185
|
+
counts.set(term, c);
|
|
186
|
+
total += c;
|
|
187
|
+
}
|
|
188
|
+
if (total === 0)
|
|
189
|
+
continue;
|
|
190
|
+
docs.push({
|
|
191
|
+
file: `${type}/${filename}`,
|
|
192
|
+
type,
|
|
193
|
+
filename,
|
|
194
|
+
raw,
|
|
195
|
+
counts,
|
|
196
|
+
length: haystack.split(/\s+/).filter(Boolean).length || 1,
|
|
197
|
+
dateMs: docDateMs(type, filename, projectRoot),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (docs.length === 0)
|
|
202
|
+
return [];
|
|
203
|
+
// Pass 2: document frequency per term across the matched corpus.
|
|
204
|
+
const df = new Map();
|
|
205
|
+
for (const doc of docs) {
|
|
206
|
+
for (const term of doc.counts.keys())
|
|
207
|
+
df.set(term, (df.get(term) ?? 0) + 1);
|
|
208
|
+
}
|
|
209
|
+
const n = docs.length;
|
|
210
|
+
const now = Date.now();
|
|
211
|
+
// Pass 3: score = Σ (sublinear-tf × idf), length-normalised, × recency boost.
|
|
212
|
+
// Sublinear tf (1 + ln tf) stops a doc that merely repeats a common term from
|
|
213
|
+
// outranking one that actually contains the rare, discriminating term.
|
|
214
|
+
const results = [];
|
|
215
|
+
for (const doc of docs) {
|
|
216
|
+
let score = 0;
|
|
217
|
+
for (const [term, tf] of doc.counts) {
|
|
218
|
+
const idf = Math.log(1 + n / (1 + (df.get(term) ?? 0)));
|
|
219
|
+
score += (1 + Math.log(tf)) * idf;
|
|
220
|
+
}
|
|
221
|
+
score /= 1 + Math.log(1 + doc.length); // dampen long documents
|
|
222
|
+
const ageDays = doc.dateMs > 0 ? Math.max(0, (now - doc.dateMs) / DAY_MS) : Infinity;
|
|
223
|
+
const recency = 1 + RECENCY_WEIGHT * Math.exp(-ageDays / RECENCY_HALFLIFE_DAYS);
|
|
224
|
+
score *= recency;
|
|
225
|
+
if (score <= 0)
|
|
226
|
+
continue;
|
|
227
|
+
const { body } = splitFrontMatter(doc.raw);
|
|
228
|
+
results.push({
|
|
229
|
+
file: doc.file,
|
|
230
|
+
scope,
|
|
231
|
+
title: titleOf(doc.raw, doc.filename),
|
|
232
|
+
excerpt: makeExcerpt(body, terms),
|
|
233
|
+
score,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
return results;
|
|
237
|
+
}
|
|
238
|
+
/** Pull a short window of text around the first matched term. */
|
|
239
|
+
function makeExcerpt(body, terms) {
|
|
240
|
+
const flat = body.replace(/\s+/g, " ").trim();
|
|
241
|
+
const lower = flat.toLowerCase();
|
|
242
|
+
let pos = -1;
|
|
243
|
+
for (const term of terms) {
|
|
244
|
+
const i = lower.indexOf(term);
|
|
245
|
+
if (i !== -1 && (pos === -1 || i < pos))
|
|
246
|
+
pos = i;
|
|
247
|
+
}
|
|
248
|
+
if (pos === -1)
|
|
249
|
+
return flat.slice(0, 160);
|
|
250
|
+
const start = Math.max(0, pos - 60);
|
|
251
|
+
const end = Math.min(flat.length, pos + 100);
|
|
252
|
+
return (start > 0 ? "…" : "") + flat.slice(start, end) + (end < flat.length ? "…" : "");
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Search the current repo and, when `includeLinked`, all linked repos and the
|
|
256
|
+
* workspace declared in repomem.config.json. Returns max 10 results, ranked.
|
|
257
|
+
*/
|
|
258
|
+
function searchFiles(query, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
259
|
+
return searchInRoot(query, "[current]", projectRoot)
|
|
260
|
+
.sort((a, b) => b.score - a.score)
|
|
261
|
+
.slice(0, 10);
|
|
262
|
+
}
|
|
263
|
+
/** Cache root for a pulled remote repo — a project-root-shaped dir under .repomem/.cache/. */
|
|
264
|
+
function remoteCacheRoot(projectRoot, r) {
|
|
265
|
+
return path.join(getRepomemRoot(projectRoot), ".cache", (0, remote_js_1.remoteSlug)(r));
|
|
266
|
+
}
|
|
267
|
+
function searchAllRepos(query, projectRoot = (0, config_js_1.findProjectRoot)(), config = (0, config_js_1.loadConfig)(projectRoot)) {
|
|
268
|
+
const all = [];
|
|
269
|
+
all.push(...searchInRoot(query, "[current]", projectRoot));
|
|
270
|
+
for (const link of config.linked) {
|
|
271
|
+
const remote = (0, remote_js_1.parseRemote)(link.repo);
|
|
272
|
+
if (remote) {
|
|
273
|
+
// Remote repo: search the local cache populated by `repomem pull`.
|
|
274
|
+
const cacheRoot = remoteCacheRoot(projectRoot, remote);
|
|
275
|
+
if (isInitialized(cacheRoot)) {
|
|
276
|
+
all.push(...searchInRoot(query, `[remote:${remote.name}]`, cacheRoot));
|
|
277
|
+
}
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const linkedRoot = path.resolve(projectRoot, link.repo);
|
|
281
|
+
if (isInitialized(linkedRoot)) {
|
|
282
|
+
const name = path.basename(linkedRoot);
|
|
283
|
+
all.push(...searchInRoot(query, `[linked:${name}]`, linkedRoot));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (config.workspace) {
|
|
287
|
+
const wsRoot = path.resolve(projectRoot, config.workspace);
|
|
288
|
+
if (isInitialized(wsRoot)) {
|
|
289
|
+
all.push(...searchInRoot(query, "[workspace]", wsRoot));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return all.sort((a, b) => b.score - a.score).slice(0, 10);
|
|
293
|
+
}
|
|
294
|
+
const SECTION_RE = /^###\s+(decisions|sessions|patterns|issues)\/(.+\.md)\s*$/;
|
|
295
|
+
/**
|
|
296
|
+
* Parse a `repomem sync` export bundle and write its files back into .repomem/.
|
|
297
|
+
* The inverse of the CLI's export format — used for airgapped transfer. Returns
|
|
298
|
+
* the list of `type/filename` entries written. Existing files are overwritten.
|
|
299
|
+
*/
|
|
300
|
+
function importBundle(text, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
301
|
+
const lines = text.split(/\r?\n/);
|
|
302
|
+
const written = [];
|
|
303
|
+
let current = null;
|
|
304
|
+
const flush = () => {
|
|
305
|
+
if (!current)
|
|
306
|
+
return;
|
|
307
|
+
const content = current.body.join("\n").replace(/^(?:[ \t]*\n)+/, "").replace(/\s*$/, "") + "\n";
|
|
308
|
+
writeFile(current.type, current.filename, content, {}, projectRoot);
|
|
309
|
+
written.push(`${current.type}/${current.filename}`);
|
|
310
|
+
current = null;
|
|
311
|
+
};
|
|
312
|
+
for (const line of lines) {
|
|
313
|
+
const m = line.match(SECTION_RE);
|
|
314
|
+
if (m) {
|
|
315
|
+
flush();
|
|
316
|
+
current = { type: m[1], filename: m[2].trim(), body: [] };
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
// Skip the bundle title and per-type headers when between sections.
|
|
320
|
+
if (!current && (line.startsWith("# ") || line.startsWith("## ")))
|
|
321
|
+
continue;
|
|
322
|
+
if (current)
|
|
323
|
+
current.body.push(line);
|
|
324
|
+
}
|
|
325
|
+
flush();
|
|
326
|
+
return written;
|
|
327
|
+
}
|
|
328
|
+
/** Counts of each memory type — used by `status` and the index. */
|
|
329
|
+
function counts(projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
330
|
+
const out = {};
|
|
331
|
+
for (const type of exports.MEMORY_TYPES)
|
|
332
|
+
out[type] = listFiles(type, projectRoot).length;
|
|
333
|
+
return out;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Regenerate REPOMEM.md — a human- and agent-readable index of everything in
|
|
337
|
+
* .repomem/. Returns the absolute path written, or null when uninitialised.
|
|
338
|
+
*/
|
|
339
|
+
function generateIndex(projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
340
|
+
if (!isInitialized(projectRoot))
|
|
341
|
+
return null;
|
|
342
|
+
const config = (0, config_js_1.loadConfig)(projectRoot);
|
|
343
|
+
const lines = [];
|
|
344
|
+
lines.push(`# ${config.project} — repomem index`);
|
|
345
|
+
lines.push("");
|
|
346
|
+
lines.push("_Auto-generated by repomem. Do not edit by hand._");
|
|
347
|
+
lines.push("");
|
|
348
|
+
for (const type of exports.MEMORY_TYPES) {
|
|
349
|
+
const files = listFiles(type, projectRoot);
|
|
350
|
+
lines.push(`## ${type} (${files.length})`);
|
|
351
|
+
if (files.length === 0) {
|
|
352
|
+
lines.push("");
|
|
353
|
+
lines.push("_none yet_");
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
for (const filename of files) {
|
|
357
|
+
const raw = readFile(type, filename, projectRoot) ?? "";
|
|
358
|
+
lines.push(`- [${titleOf(raw, filename)}](${type}/${filename})`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
lines.push("");
|
|
362
|
+
}
|
|
363
|
+
const indexPath = path.join(getRepomemRoot(projectRoot), exports.INDEX_FILENAME);
|
|
364
|
+
fs.writeFileSync(indexPath, lines.join("\n"), "utf8");
|
|
365
|
+
return indexPath;
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=file-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/store/file-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote linked-repo support: read another repo's .repomem/ from GitHub without
|
|
3
|
+
* cloning it. A remote is fetched into a local cache (see file-store) so that
|
|
4
|
+
* search stays synchronous and works offline once pulled.
|
|
5
|
+
*/
|
|
6
|
+
export interface RemoteRef {
|
|
7
|
+
owner: string;
|
|
8
|
+
name: string;
|
|
9
|
+
ref: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse a `linked` entry into a RemoteRef, or return null when it is a local
|
|
13
|
+
* path (the existing behaviour). Recognised remote forms:
|
|
14
|
+
* github:owner/repo
|
|
15
|
+
* github:owner/repo#ref
|
|
16
|
+
* https://github.com/owner/repo
|
|
17
|
+
* https://github.com/owner/repo/tree/ref
|
|
18
|
+
* git@github.com:owner/repo.git
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseRemote(spec: string): RemoteRef | null;
|
|
21
|
+
/** A filesystem-safe cache directory name for a remote. */
|
|
22
|
+
export declare function remoteSlug(r: RemoteRef): string;
|
|
23
|
+
/**
|
|
24
|
+
* Fetch a remote repo's .repomem/ memory files into `destRepomemDir` (which
|
|
25
|
+
* should be the `.repomem` directory inside a cache root). Returns the number
|
|
26
|
+
* of files written. Uses the GitHub API and honours a token for private repos
|
|
27
|
+
* and higher rate limits.
|
|
28
|
+
*/
|
|
29
|
+
export declare function fetchRemoteRepomem(r: RemoteRef, destRepomemDir: string, token?: string): Promise<number>;
|
|
30
|
+
//# sourceMappingURL=remote.d.ts.map
|