@saleem11kh/repomem 0.1.1 → 0.3.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 +212 -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 +75 -0
- package/dist/index.js.map +1 -0
- package/dist/store/file-store.d.ts +83 -0
- package/dist/store/file-store.d.ts.map +1 -0
- package/dist/store/file-store.js +509 -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 +93 -0
- package/dist/tools/mem-context.js.map +1 -0
- package/dist/tools/mem-get.d.ts +3 -0
- package/dist/tools/mem-get.d.ts.map +1 -0
- package/dist/tools/mem-get.js +57 -0
- package/dist/tools/mem-get.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-prime.d.ts +3 -0
- package/dist/tools/mem-prime.d.ts.map +1 -0
- package/dist/tools/mem-prime.js +48 -0
- package/dist/tools/mem-prime.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 +103 -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 +50 -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,509 @@
|
|
|
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.summaryOf = summaryOf;
|
|
43
|
+
exports.parseLinks = parseLinks;
|
|
44
|
+
exports.resolveLink = resolveLink;
|
|
45
|
+
exports.relatedOf = relatedOf;
|
|
46
|
+
exports.readProjectDocs = readProjectDocs;
|
|
47
|
+
exports.searchFiles = searchFiles;
|
|
48
|
+
exports.remoteCacheRoot = remoteCacheRoot;
|
|
49
|
+
exports.searchAllRepos = searchAllRepos;
|
|
50
|
+
exports.importBundle = importBundle;
|
|
51
|
+
exports.counts = counts;
|
|
52
|
+
exports.generateIndex = generateIndex;
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
const config_js_1 = require("../config/config.js");
|
|
56
|
+
const remote_js_1 = require("./remote.js");
|
|
57
|
+
exports.MEMORY_TYPES = [
|
|
58
|
+
"decisions",
|
|
59
|
+
"sessions",
|
|
60
|
+
"patterns",
|
|
61
|
+
"issues",
|
|
62
|
+
];
|
|
63
|
+
exports.REPOMEM_DIR = ".repomem";
|
|
64
|
+
exports.INDEX_FILENAME = "REPOMEM.md";
|
|
65
|
+
/** Absolute path to the .repomem/ dir for a given project root. */
|
|
66
|
+
function getRepomemRoot(projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
67
|
+
return path.join(projectRoot, exports.REPOMEM_DIR);
|
|
68
|
+
}
|
|
69
|
+
/** True if .repomem/ exists at the project root. */
|
|
70
|
+
function isInitialized(projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
71
|
+
return fs.existsSync(getRepomemRoot(projectRoot));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* List relative file paths (from .repomem/) of a given memory type, sorted
|
|
75
|
+
* newest-first by filename. Returns [] when uninitialised or empty.
|
|
76
|
+
*/
|
|
77
|
+
function listFiles(type, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
78
|
+
const dir = path.join(getRepomemRoot(projectRoot), type);
|
|
79
|
+
try {
|
|
80
|
+
return fs
|
|
81
|
+
.readdirSync(dir)
|
|
82
|
+
.filter((f) => f.endsWith(".md"))
|
|
83
|
+
.sort()
|
|
84
|
+
.reverse();
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Read a memory file by type + filename. Returns null when missing. */
|
|
91
|
+
function readFile(type, filename, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
92
|
+
const filePath = path.join(getRepomemRoot(projectRoot), type, filename);
|
|
93
|
+
try {
|
|
94
|
+
return fs.readFileSync(filePath, "utf8");
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Write (or append) a memory file. Creates the type dir if needed.
|
|
102
|
+
* Returns the absolute path written.
|
|
103
|
+
*/
|
|
104
|
+
function writeFile(type, filename, content, opts = {}, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
105
|
+
const dir = path.join(getRepomemRoot(projectRoot), type);
|
|
106
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
107
|
+
const filePath = path.join(dir, filename);
|
|
108
|
+
if (opts.append && fs.existsSync(filePath)) {
|
|
109
|
+
fs.appendFileSync(filePath, content, "utf8");
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
fs.writeFileSync(filePath, content, "utf8");
|
|
113
|
+
}
|
|
114
|
+
return filePath;
|
|
115
|
+
}
|
|
116
|
+
/** Strip YAML front matter and return { meta, body }. */
|
|
117
|
+
function splitFrontMatter(raw) {
|
|
118
|
+
if (raw.startsWith("---")) {
|
|
119
|
+
const end = raw.indexOf("\n---", 3);
|
|
120
|
+
if (end !== -1) {
|
|
121
|
+
const after = raw.indexOf("\n", end + 1);
|
|
122
|
+
return { body: after !== -1 ? raw.slice(after + 1) : "" };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { body: raw };
|
|
126
|
+
}
|
|
127
|
+
/** Best-effort title: first markdown H1, else the filename. */
|
|
128
|
+
function titleOf(raw, filename) {
|
|
129
|
+
const m = raw.match(/^#\s+(.+)$/m);
|
|
130
|
+
return m ? m[1].trim() : filename.replace(/\.md$/, "");
|
|
131
|
+
}
|
|
132
|
+
/** Return the raw YAML front-matter block (between the --- fences), or "". */
|
|
133
|
+
function frontMatter(raw) {
|
|
134
|
+
if (raw.startsWith("---")) {
|
|
135
|
+
const end = raw.indexOf("\n---", 3);
|
|
136
|
+
if (end !== -1)
|
|
137
|
+
return raw.slice(3, end);
|
|
138
|
+
}
|
|
139
|
+
return "";
|
|
140
|
+
}
|
|
141
|
+
/** Read a single scalar front-matter field, or null. */
|
|
142
|
+
function fmField(raw, key) {
|
|
143
|
+
const m = frontMatter(raw).match(new RegExp(`^\\s*${key}:\\s*(.+)$`, "m"));
|
|
144
|
+
return m ? m[1].trim() : null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* A one-line summary for an entry: the `summary:` front-matter field, else the
|
|
148
|
+
* first prose line of the body, else the title. Used by mem_context and
|
|
149
|
+
* mem_search to surface entries cheaply (progressive disclosure).
|
|
150
|
+
*/
|
|
151
|
+
function summaryOf(raw, filename) {
|
|
152
|
+
const explicit = fmField(raw, "summary");
|
|
153
|
+
if (explicit)
|
|
154
|
+
return explicit.replace(/^["']|["']$/g, "");
|
|
155
|
+
const { body } = splitFrontMatter(raw);
|
|
156
|
+
const line = body
|
|
157
|
+
.split("\n")
|
|
158
|
+
.map((l) => l.trim())
|
|
159
|
+
.find((l) => l.length > 0 && !l.startsWith("#"));
|
|
160
|
+
const base = line || titleOf(raw, filename);
|
|
161
|
+
return base.length > 140 ? base.slice(0, 137).trimEnd() + "…" : base;
|
|
162
|
+
}
|
|
163
|
+
/** Extract `[[wikilink]]` targets from a memory's raw text (order-preserving, deduped). */
|
|
164
|
+
function parseLinks(raw) {
|
|
165
|
+
const out = new Set();
|
|
166
|
+
const re = /\[\[([^\]|]+)(?:\|[^\]]*)?\]\]/g;
|
|
167
|
+
let m;
|
|
168
|
+
while ((m = re.exec(raw)) !== null)
|
|
169
|
+
out.add(m[1].trim());
|
|
170
|
+
return [...out];
|
|
171
|
+
}
|
|
172
|
+
/** Strip the date prefix and extension from a memory filename to get its slug. */
|
|
173
|
+
function fileSlug(filename) {
|
|
174
|
+
return filename.replace(/\.md$/i, "").replace(/^\d{4}-\d{2}-\d{2}-?/, "").toLowerCase();
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Resolve a `[[target]]` to a memory file. Matches an exact filename, an exact
|
|
178
|
+
* slug (date-stripped), or a unique slug substring. Returns null when unresolved.
|
|
179
|
+
*/
|
|
180
|
+
function resolveLink(target, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
181
|
+
const t = target.replace(/\.md$/i, "").toLowerCase().trim();
|
|
182
|
+
let partial = null;
|
|
183
|
+
let partialCount = 0;
|
|
184
|
+
for (const type of exports.MEMORY_TYPES) {
|
|
185
|
+
for (const filename of listFiles(type, projectRoot)) {
|
|
186
|
+
const nameNoExt = filename.replace(/\.md$/i, "").toLowerCase();
|
|
187
|
+
const slug = fileSlug(filename);
|
|
188
|
+
if (nameNoExt === t || slug === t) {
|
|
189
|
+
const raw = readFile(type, filename, projectRoot) ?? "";
|
|
190
|
+
return { type, filename, title: titleOf(raw, filename) };
|
|
191
|
+
}
|
|
192
|
+
if (slug.includes(t) || nameNoExt.includes(t)) {
|
|
193
|
+
const raw = readFile(type, filename, projectRoot) ?? "";
|
|
194
|
+
partial = { type, filename, title: titleOf(raw, filename) };
|
|
195
|
+
partialCount++;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return partialCount === 1 ? partial : null;
|
|
200
|
+
}
|
|
201
|
+
/** Resolve all `[[wikilinks]]` in a file to their target entries (unresolved dropped). */
|
|
202
|
+
function relatedOf(raw, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
203
|
+
const out = [];
|
|
204
|
+
const seen = new Set();
|
|
205
|
+
for (const target of parseLinks(raw)) {
|
|
206
|
+
const hit = resolveLink(target, projectRoot);
|
|
207
|
+
if (hit && !seen.has(hit.filename)) {
|
|
208
|
+
seen.add(hit.filename);
|
|
209
|
+
out.push(hit);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return out;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Gather existing project docs (CLAUDE.md, AGENTS.md, README, docs/**.md) so an
|
|
216
|
+
* agent can bootstrap memory for a project that already has lots of context.
|
|
217
|
+
* Each doc is capped to keep the priming payload bounded.
|
|
218
|
+
*/
|
|
219
|
+
function readProjectDocs(projectRoot = (0, config_js_1.findProjectRoot)(), perFileCap = 6000, maxFiles = 12) {
|
|
220
|
+
const found = [];
|
|
221
|
+
const push = (abs) => {
|
|
222
|
+
try {
|
|
223
|
+
const text = fs.readFileSync(abs, "utf8");
|
|
224
|
+
if (text.trim()) {
|
|
225
|
+
found.push({ rel: path.relative(projectRoot, abs), text: text.slice(0, perFileCap) });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
/* skip unreadable */
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
for (const name of ["CLAUDE.md", "AGENTS.md", "GEMINI.md", "README.md"]) {
|
|
233
|
+
const abs = path.join(projectRoot, name);
|
|
234
|
+
if (fs.existsSync(abs))
|
|
235
|
+
push(abs);
|
|
236
|
+
}
|
|
237
|
+
// Shallow-ish walk of docs/ for markdown (ADRs, design notes).
|
|
238
|
+
const docsDir = path.join(projectRoot, "docs");
|
|
239
|
+
const walk = (dir, depth) => {
|
|
240
|
+
if (depth > 2 || found.length >= maxFiles)
|
|
241
|
+
return;
|
|
242
|
+
let entries;
|
|
243
|
+
try {
|
|
244
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
for (const e of entries) {
|
|
250
|
+
if (found.length >= maxFiles)
|
|
251
|
+
return;
|
|
252
|
+
const abs = path.join(dir, e.name);
|
|
253
|
+
if (e.isDirectory())
|
|
254
|
+
walk(abs, depth + 1);
|
|
255
|
+
else if (e.isFile() && e.name.toLowerCase().endsWith(".md"))
|
|
256
|
+
push(abs);
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
if (fs.existsSync(docsDir))
|
|
260
|
+
walk(docsDir, 0);
|
|
261
|
+
return found.slice(0, maxFiles);
|
|
262
|
+
}
|
|
263
|
+
// Recency boost: a fresh doc can score up to (1 + RECENCY_WEIGHT)× a stale one,
|
|
264
|
+
// decaying with a ~RECENCY_HALFLIFE_DAYS half-life. Keeps yesterday's session
|
|
265
|
+
// ahead of a year-old note when both match equally well.
|
|
266
|
+
const RECENCY_WEIGHT = 0.5;
|
|
267
|
+
const RECENCY_HALFLIFE_DAYS = 30;
|
|
268
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
269
|
+
// BM25 tuning: k1 controls term-frequency saturation, b the length penalty.
|
|
270
|
+
const BM25_K1 = 1.5;
|
|
271
|
+
const BM25_B = 0.75;
|
|
272
|
+
/** Best-effort timestamp for a memory: leading YYYY-MM-DD in the name, else mtime. */
|
|
273
|
+
function docDateMs(type, filename, projectRoot) {
|
|
274
|
+
const m = filename.match(/^(\d{4})-(\d{2})-(\d{2})/);
|
|
275
|
+
if (m) {
|
|
276
|
+
const t = Date.parse(`${m[1]}-${m[2]}-${m[3]}T00:00:00Z`);
|
|
277
|
+
if (!Number.isNaN(t))
|
|
278
|
+
return t;
|
|
279
|
+
}
|
|
280
|
+
try {
|
|
281
|
+
return fs.statSync(path.join(getRepomemRoot(projectRoot), type, filename)).mtimeMs;
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return 0;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/** Count non-overlapping occurrences of `term` in `haystack` (already lower-cased). */
|
|
288
|
+
function countTerm(haystack, term) {
|
|
289
|
+
let n = 0;
|
|
290
|
+
let idx = haystack.indexOf(term);
|
|
291
|
+
while (idx !== -1) {
|
|
292
|
+
n += 1;
|
|
293
|
+
idx = haystack.indexOf(term, idx + term.length);
|
|
294
|
+
}
|
|
295
|
+
return n;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Full-text search across all memory types in a single project root, ranked by
|
|
299
|
+
* TF-IDF (rarer query terms weigh more), normalised for document length, with a
|
|
300
|
+
* recency boost. Case-insensitive over plain-markdown stores.
|
|
301
|
+
*/
|
|
302
|
+
function searchInRoot(query, scope, projectRoot) {
|
|
303
|
+
const terms = [
|
|
304
|
+
...new Set(query
|
|
305
|
+
.toLowerCase()
|
|
306
|
+
.split(/\s+/)
|
|
307
|
+
.filter((t) => t.length > 0)),
|
|
308
|
+
];
|
|
309
|
+
if (terms.length === 0)
|
|
310
|
+
return [];
|
|
311
|
+
// Pass 1: load matching docs and per-term frequencies.
|
|
312
|
+
const docs = [];
|
|
313
|
+
for (const type of exports.MEMORY_TYPES) {
|
|
314
|
+
for (const filename of listFiles(type, projectRoot)) {
|
|
315
|
+
const raw = readFile(type, filename, projectRoot);
|
|
316
|
+
if (raw == null)
|
|
317
|
+
continue;
|
|
318
|
+
const haystack = raw.toLowerCase();
|
|
319
|
+
const counts = new Map();
|
|
320
|
+
let total = 0;
|
|
321
|
+
for (const term of terms) {
|
|
322
|
+
const c = countTerm(haystack, term);
|
|
323
|
+
if (c > 0)
|
|
324
|
+
counts.set(term, c);
|
|
325
|
+
total += c;
|
|
326
|
+
}
|
|
327
|
+
if (total === 0)
|
|
328
|
+
continue;
|
|
329
|
+
docs.push({
|
|
330
|
+
file: `${type}/${filename}`,
|
|
331
|
+
type,
|
|
332
|
+
filename,
|
|
333
|
+
raw,
|
|
334
|
+
counts,
|
|
335
|
+
length: haystack.split(/\s+/).filter(Boolean).length || 1,
|
|
336
|
+
dateMs: docDateMs(type, filename, projectRoot),
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (docs.length === 0)
|
|
341
|
+
return [];
|
|
342
|
+
// Pass 2: document frequency per term across the matched corpus.
|
|
343
|
+
const df = new Map();
|
|
344
|
+
for (const doc of docs) {
|
|
345
|
+
for (const term of doc.counts.keys())
|
|
346
|
+
df.set(term, (df.get(term) ?? 0) + 1);
|
|
347
|
+
}
|
|
348
|
+
const n = docs.length;
|
|
349
|
+
const now = Date.now();
|
|
350
|
+
// Pass 3: BM25 relevance × recency boost. BM25's saturating tf (k1) and length
|
|
351
|
+
// normalisation (b) keep a doc that merely repeats a common term from
|
|
352
|
+
// outranking one containing the rare, discriminating term.
|
|
353
|
+
const avgdl = docs.reduce((s, d) => s + d.length, 0) / docs.length;
|
|
354
|
+
const results = [];
|
|
355
|
+
for (const doc of docs) {
|
|
356
|
+
let score = 0;
|
|
357
|
+
for (const [term, tf] of doc.counts) {
|
|
358
|
+
const dfv = df.get(term) ?? 0;
|
|
359
|
+
const idf = Math.log(1 + (n - dfv + 0.5) / (dfv + 0.5));
|
|
360
|
+
const denom = tf + BM25_K1 * (1 - BM25_B + (BM25_B * doc.length) / avgdl);
|
|
361
|
+
score += idf * ((tf * (BM25_K1 + 1)) / denom);
|
|
362
|
+
}
|
|
363
|
+
const ageDays = doc.dateMs > 0 ? Math.max(0, (now - doc.dateMs) / DAY_MS) : Infinity;
|
|
364
|
+
const recency = 1 + RECENCY_WEIGHT * Math.exp(-ageDays / RECENCY_HALFLIFE_DAYS);
|
|
365
|
+
score *= recency;
|
|
366
|
+
if (score <= 0)
|
|
367
|
+
continue;
|
|
368
|
+
const { body } = splitFrontMatter(doc.raw);
|
|
369
|
+
results.push({
|
|
370
|
+
file: doc.file,
|
|
371
|
+
scope,
|
|
372
|
+
title: titleOf(doc.raw, doc.filename),
|
|
373
|
+
excerpt: makeExcerpt(body, terms),
|
|
374
|
+
score,
|
|
375
|
+
related: relatedOf(doc.raw, projectRoot).map((r) => r.title),
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
return results;
|
|
379
|
+
}
|
|
380
|
+
/** Pull a short window of text around the first matched term. */
|
|
381
|
+
function makeExcerpt(body, terms) {
|
|
382
|
+
const flat = body.replace(/\s+/g, " ").trim();
|
|
383
|
+
const lower = flat.toLowerCase();
|
|
384
|
+
let pos = -1;
|
|
385
|
+
for (const term of terms) {
|
|
386
|
+
const i = lower.indexOf(term);
|
|
387
|
+
if (i !== -1 && (pos === -1 || i < pos))
|
|
388
|
+
pos = i;
|
|
389
|
+
}
|
|
390
|
+
if (pos === -1)
|
|
391
|
+
return flat.slice(0, 160);
|
|
392
|
+
const start = Math.max(0, pos - 60);
|
|
393
|
+
const end = Math.min(flat.length, pos + 100);
|
|
394
|
+
return (start > 0 ? "…" : "") + flat.slice(start, end) + (end < flat.length ? "…" : "");
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Search the current repo and, when `includeLinked`, all linked repos and the
|
|
398
|
+
* workspace declared in repomem.config.json. Returns max 10 results, ranked.
|
|
399
|
+
*/
|
|
400
|
+
function searchFiles(query, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
401
|
+
return searchInRoot(query, "[current]", projectRoot)
|
|
402
|
+
.sort((a, b) => b.score - a.score)
|
|
403
|
+
.slice(0, 10);
|
|
404
|
+
}
|
|
405
|
+
/** Cache root for a pulled remote repo — a project-root-shaped dir under .repomem/.cache/. */
|
|
406
|
+
function remoteCacheRoot(projectRoot, r) {
|
|
407
|
+
return path.join(getRepomemRoot(projectRoot), ".cache", (0, remote_js_1.remoteSlug)(r));
|
|
408
|
+
}
|
|
409
|
+
function searchAllRepos(query, projectRoot = (0, config_js_1.findProjectRoot)(), config = (0, config_js_1.loadConfig)(projectRoot)) {
|
|
410
|
+
const all = [];
|
|
411
|
+
all.push(...searchInRoot(query, "[current]", projectRoot));
|
|
412
|
+
for (const link of config.linked) {
|
|
413
|
+
const remote = (0, remote_js_1.parseRemote)(link.repo);
|
|
414
|
+
if (remote) {
|
|
415
|
+
// Remote repo: search the local cache populated by `repomem pull`.
|
|
416
|
+
const cacheRoot = remoteCacheRoot(projectRoot, remote);
|
|
417
|
+
if (isInitialized(cacheRoot)) {
|
|
418
|
+
all.push(...searchInRoot(query, `[remote:${remote.name}]`, cacheRoot));
|
|
419
|
+
}
|
|
420
|
+
continue;
|
|
421
|
+
}
|
|
422
|
+
const linkedRoot = path.resolve(projectRoot, link.repo);
|
|
423
|
+
if (isInitialized(linkedRoot)) {
|
|
424
|
+
const name = path.basename(linkedRoot);
|
|
425
|
+
all.push(...searchInRoot(query, `[linked:${name}]`, linkedRoot));
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
if (config.workspace) {
|
|
429
|
+
const wsRoot = path.resolve(projectRoot, config.workspace);
|
|
430
|
+
if (isInitialized(wsRoot)) {
|
|
431
|
+
all.push(...searchInRoot(query, "[workspace]", wsRoot));
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return all.sort((a, b) => b.score - a.score).slice(0, 10);
|
|
435
|
+
}
|
|
436
|
+
const SECTION_RE = /^###\s+(decisions|sessions|patterns|issues)\/(.+\.md)\s*$/;
|
|
437
|
+
/**
|
|
438
|
+
* Parse a `repomem sync` export bundle and write its files back into .repomem/.
|
|
439
|
+
* The inverse of the CLI's export format — used for airgapped transfer. Returns
|
|
440
|
+
* the list of `type/filename` entries written. Existing files are overwritten.
|
|
441
|
+
*/
|
|
442
|
+
function importBundle(text, projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
443
|
+
const lines = text.split(/\r?\n/);
|
|
444
|
+
const written = [];
|
|
445
|
+
let current = null;
|
|
446
|
+
const flush = () => {
|
|
447
|
+
if (!current)
|
|
448
|
+
return;
|
|
449
|
+
const content = current.body.join("\n").replace(/^(?:[ \t]*\n)+/, "").replace(/\s*$/, "") + "\n";
|
|
450
|
+
writeFile(current.type, current.filename, content, {}, projectRoot);
|
|
451
|
+
written.push(`${current.type}/${current.filename}`);
|
|
452
|
+
current = null;
|
|
453
|
+
};
|
|
454
|
+
for (const line of lines) {
|
|
455
|
+
const m = line.match(SECTION_RE);
|
|
456
|
+
if (m) {
|
|
457
|
+
flush();
|
|
458
|
+
current = { type: m[1], filename: m[2].trim(), body: [] };
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
// Skip the bundle title and per-type headers when between sections.
|
|
462
|
+
if (!current && (line.startsWith("# ") || line.startsWith("## ")))
|
|
463
|
+
continue;
|
|
464
|
+
if (current)
|
|
465
|
+
current.body.push(line);
|
|
466
|
+
}
|
|
467
|
+
flush();
|
|
468
|
+
return written;
|
|
469
|
+
}
|
|
470
|
+
/** Counts of each memory type — used by `status` and the index. */
|
|
471
|
+
function counts(projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
472
|
+
const out = {};
|
|
473
|
+
for (const type of exports.MEMORY_TYPES)
|
|
474
|
+
out[type] = listFiles(type, projectRoot).length;
|
|
475
|
+
return out;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Regenerate REPOMEM.md — a human- and agent-readable index of everything in
|
|
479
|
+
* .repomem/. Returns the absolute path written, or null when uninitialised.
|
|
480
|
+
*/
|
|
481
|
+
function generateIndex(projectRoot = (0, config_js_1.findProjectRoot)()) {
|
|
482
|
+
if (!isInitialized(projectRoot))
|
|
483
|
+
return null;
|
|
484
|
+
const config = (0, config_js_1.loadConfig)(projectRoot);
|
|
485
|
+
const lines = [];
|
|
486
|
+
lines.push(`# ${config.project} — repomem index`);
|
|
487
|
+
lines.push("");
|
|
488
|
+
lines.push("_Auto-generated by repomem. Do not edit by hand._");
|
|
489
|
+
lines.push("");
|
|
490
|
+
for (const type of exports.MEMORY_TYPES) {
|
|
491
|
+
const files = listFiles(type, projectRoot);
|
|
492
|
+
lines.push(`## ${type} (${files.length})`);
|
|
493
|
+
if (files.length === 0) {
|
|
494
|
+
lines.push("");
|
|
495
|
+
lines.push("_none yet_");
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
for (const filename of files) {
|
|
499
|
+
const raw = readFile(type, filename, projectRoot) ?? "";
|
|
500
|
+
lines.push(`- [${titleOf(raw, filename)}](${type}/${filename})`);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
lines.push("");
|
|
504
|
+
}
|
|
505
|
+
const indexPath = path.join(getRepomemRoot(projectRoot), exports.INDEX_FILENAME);
|
|
506
|
+
fs.writeFileSync(indexPath, lines.join("\n"), "utf8");
|
|
507
|
+
return indexPath;
|
|
508
|
+
}
|
|
509
|
+
//# 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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/store/remote.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAgB1D;AAMD,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAG/C;AAUD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,CAAC,EAAE,SAAS,EACZ,cAAc,EAAE,MAAM,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CA+CjB"}
|