@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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +199 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +335 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/config.d.ts +24 -0
  8. package/dist/config/config.d.ts.map +1 -0
  9. package/dist/config/config.js +100 -0
  10. package/dist/config/config.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +64 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/store/file-store.d.ts +53 -0
  16. package/dist/store/file-store.d.ts.map +1 -0
  17. package/dist/store/file-store.js +367 -0
  18. package/dist/store/file-store.js.map +1 -0
  19. package/dist/store/remote.d.ts +30 -0
  20. package/dist/store/remote.d.ts.map +1 -0
  21. package/dist/store/remote.js +118 -0
  22. package/dist/store/remote.js.map +1 -0
  23. package/dist/tools/mem-context.d.ts +3 -0
  24. package/dist/tools/mem-context.d.ts.map +1 -0
  25. package/dist/tools/mem-context.js +105 -0
  26. package/dist/tools/mem-context.js.map +1 -0
  27. package/dist/tools/mem-handoff.d.ts +3 -0
  28. package/dist/tools/mem-handoff.d.ts.map +1 -0
  29. package/dist/tools/mem-handoff.js +72 -0
  30. package/dist/tools/mem-handoff.js.map +1 -0
  31. package/dist/tools/mem-save.d.ts +5 -0
  32. package/dist/tools/mem-save.d.ts.map +1 -0
  33. package/dist/tools/mem-save.js +85 -0
  34. package/dist/tools/mem-save.js.map +1 -0
  35. package/dist/tools/mem-search.d.ts +3 -0
  36. package/dist/tools/mem-search.d.ts.map +1 -0
  37. package/dist/tools/mem-search.js +47 -0
  38. package/dist/tools/mem-search.js.map +1 -0
  39. package/dist/tools/util.d.ts +18 -0
  40. package/dist/tools/util.d.ts.map +1 -0
  41. package/dist/tools/util.js +42 -0
  42. package/dist/tools/util.js.map +1 -0
  43. package/package.json +25 -4
@@ -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"}
@@ -0,0 +1,118 @@
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.parseRemote = parseRemote;
37
+ exports.remoteSlug = remoteSlug;
38
+ exports.fetchRemoteRepomem = fetchRemoteRepomem;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ /**
42
+ * Parse a `linked` entry into a RemoteRef, or return null when it is a local
43
+ * path (the existing behaviour). Recognised remote forms:
44
+ * github:owner/repo
45
+ * github:owner/repo#ref
46
+ * https://github.com/owner/repo
47
+ * https://github.com/owner/repo/tree/ref
48
+ * git@github.com:owner/repo.git
49
+ */
50
+ function parseRemote(spec) {
51
+ const s = spec.trim();
52
+ // github:owner/repo[#ref]
53
+ let m = s.match(/^github:([^/\s]+)\/([^#\s]+?)(?:#(.+))?$/i);
54
+ if (m)
55
+ return ref(m[1], m[2], m[3]);
56
+ // https://github.com/owner/repo[/tree/ref][...]
57
+ m = s.match(/^https?:\/\/github\.com\/([^/\s]+)\/([^/\s#]+?)(?:\.git)?(?:\/tree\/([^/\s#]+))?(?:[/#?].*)?$/i);
58
+ if (m)
59
+ return ref(m[1], m[2], m[3]);
60
+ // git@github.com:owner/repo.git
61
+ m = s.match(/^git@github\.com:([^/\s]+)\/([^/\s#]+?)(?:\.git)?$/i);
62
+ if (m)
63
+ return ref(m[1], m[2], undefined);
64
+ return null;
65
+ }
66
+ function ref(owner, name, r) {
67
+ return { owner, name: name.replace(/\.git$/i, ""), ref: r && r.trim() ? r.trim() : "HEAD" };
68
+ }
69
+ /** A filesystem-safe cache directory name for a remote. */
70
+ function remoteSlug(r) {
71
+ const raw = `${r.owner}-${r.name}${r.ref === "HEAD" ? "" : "-" + r.ref}`;
72
+ return raw.replace(/[^a-zA-Z0-9._-]+/g, "-");
73
+ }
74
+ const MEMORY_DIR_RE = /^\.repomem\/(decisions|sessions|patterns|issues)\/.+\.md$/;
75
+ /**
76
+ * Fetch a remote repo's .repomem/ memory files into `destRepomemDir` (which
77
+ * should be the `.repomem` directory inside a cache root). Returns the number
78
+ * of files written. Uses the GitHub API and honours a token for private repos
79
+ * and higher rate limits.
80
+ */
81
+ async function fetchRemoteRepomem(r, destRepomemDir, token) {
82
+ const headers = {
83
+ Accept: "application/vnd.github+json",
84
+ "User-Agent": "repomem",
85
+ "X-GitHub-Api-Version": "2022-11-28",
86
+ };
87
+ if (token)
88
+ headers.Authorization = `Bearer ${token}`;
89
+ const treeUrl = `https://api.github.com/repos/${r.owner}/${r.name}/git/trees/${encodeURIComponent(r.ref)}?recursive=1`;
90
+ const treeRes = await fetch(treeUrl, { headers });
91
+ if (!treeRes.ok) {
92
+ throw new Error(`GitHub API ${treeRes.status} for ${r.owner}/${r.name}@${r.ref}` +
93
+ (treeRes.status === 404
94
+ ? " — repo/ref not found (or private without a token)."
95
+ : treeRes.status === 403
96
+ ? " — rate limited; set GITHUB_TOKEN."
97
+ : ""));
98
+ }
99
+ const tree = (await treeRes.json());
100
+ const entries = (tree.tree ?? []).filter((e) => e.type === "blob" && MEMORY_DIR_RE.test(e.path));
101
+ let written = 0;
102
+ for (const entry of entries) {
103
+ const blobRes = await fetch(`https://api.github.com/repos/${r.owner}/${r.name}/git/blobs/${entry.sha}`, { headers });
104
+ if (!blobRes.ok)
105
+ continue;
106
+ const blob = (await blobRes.json());
107
+ const content = blob.encoding === "base64" && blob.content
108
+ ? Buffer.from(blob.content, "base64").toString("utf8")
109
+ : blob.content ?? "";
110
+ const rel = entry.path.slice(".repomem/".length);
111
+ const dest = path.join(destRepomemDir, rel);
112
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
113
+ fs.writeFileSync(dest, content, "utf8");
114
+ written++;
115
+ }
116
+ return written;
117
+ }
118
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/store/remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolDef } from "./util.js";
2
+ export declare const memContext: ToolDef;
3
+ //# sourceMappingURL=mem-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-context.d.ts","sourceRoot":"","sources":["../../src/tools/mem-context.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,eAAO,MAAM,UAAU,EAAE,OAqFxB,CAAC"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.memContext = void 0;
4
+ const file_store_js_1 = require("../store/file-store.js");
5
+ const config_js_1 = require("../config/config.js");
6
+ /** Strip YAML front matter for cleaner inlining. */
7
+ function body(raw) {
8
+ if (raw.startsWith("---")) {
9
+ const end = raw.indexOf("\n---", 3);
10
+ if (end !== -1) {
11
+ const after = raw.indexOf("\n", end + 1);
12
+ return after !== -1 ? raw.slice(after + 1).trim() : "";
13
+ }
14
+ }
15
+ return raw.trim();
16
+ }
17
+ function firstHeading(raw, fallback) {
18
+ const m = raw.match(/^#\s+(.+)$/m);
19
+ return m ? m[1].trim() : fallback;
20
+ }
21
+ function readNewest(type, projectRoot, limit) {
22
+ return (0, file_store_js_1.listFiles)(type, projectRoot)
23
+ .slice(0, limit)
24
+ .map((filename) => ({ filename, raw: (0, file_store_js_1.readFile)(type, filename, projectRoot) ?? "" }));
25
+ }
26
+ exports.memContext = {
27
+ name: "mem_context",
28
+ description: "Assemble a full project context packet at the start of a session: the latest " +
29
+ "session notes, all patterns, open issues, the 5 most recent decisions, and " +
30
+ "workspace context. Call this first so you don't have to re-explain the project. " +
31
+ "Set brief=true for a one-paragraph summary.",
32
+ inputSchema: {
33
+ type: "object",
34
+ properties: {
35
+ brief: {
36
+ type: "boolean",
37
+ description: "Return a compact one-paragraph summary instead of the full packet.",
38
+ },
39
+ },
40
+ },
41
+ handler(args, projectRoot) {
42
+ if (!(0, file_store_js_1.isInitialized)(projectRoot)) {
43
+ return "✖ .repomem/ not found. Run `repomem init` in your project first.";
44
+ }
45
+ const config = (0, config_js_1.loadConfig)(projectRoot);
46
+ const c = (0, file_store_js_1.counts)(projectRoot);
47
+ if (args.brief === true) {
48
+ const latestSession = readNewest("sessions", projectRoot, 1)[0];
49
+ const last = latestSession
50
+ ? firstHeading(latestSession.raw, latestSession.filename)
51
+ : "no sessions yet";
52
+ return (`${config.project}: ${c.decisions} decisions, ${c.patterns} patterns, ` +
53
+ `${c.issues} issues, ${c.sessions} sessions. Last session: ${last}.`);
54
+ }
55
+ const out = [];
56
+ out.push(`# Context for ${config.project}`, "");
57
+ // Latest session.
58
+ const session = readNewest("sessions", projectRoot, 1)[0];
59
+ out.push("## Last session");
60
+ out.push(session ? `### ${session.filename}\n\n${body(session.raw)}` : "_none yet_");
61
+ out.push("");
62
+ // Recent decisions (max 5).
63
+ out.push("## Recent decisions");
64
+ const decisions = readNewest("decisions", projectRoot, 5);
65
+ if (decisions.length === 0)
66
+ out.push("_none yet_");
67
+ for (const d of decisions) {
68
+ out.push(`### ${firstHeading(d.raw, d.filename)} (${d.filename})`);
69
+ out.push(body(d.raw));
70
+ out.push("");
71
+ }
72
+ // All patterns.
73
+ out.push("## Patterns");
74
+ const patterns = readNewest("patterns", projectRoot, 100);
75
+ if (patterns.length === 0)
76
+ out.push("_none yet_");
77
+ for (const p of patterns) {
78
+ out.push(`### ${firstHeading(p.raw, p.filename)}`);
79
+ out.push(body(p.raw));
80
+ out.push("");
81
+ }
82
+ // Open issues.
83
+ out.push("## Known issues");
84
+ const issues = readNewest("issues", projectRoot, 100);
85
+ if (issues.length === 0)
86
+ out.push("_none yet_");
87
+ for (const i of issues) {
88
+ out.push(`### ${firstHeading(i.raw, i.filename)}`);
89
+ out.push(body(i.raw));
90
+ out.push("");
91
+ }
92
+ // Workspace pointer.
93
+ if (config.workspace || config.linked.length) {
94
+ out.push("## Linked context");
95
+ if (config.workspace)
96
+ out.push(`- workspace: ${config.workspace}`);
97
+ for (const l of config.linked) {
98
+ out.push(`- ${l.repo}${l.relation ? ` (${l.relation})` : ""}`);
99
+ }
100
+ out.push("_Use mem_search with linked=true to search these._");
101
+ }
102
+ return out.join("\n").trim();
103
+ },
104
+ };
105
+ //# sourceMappingURL=mem-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-context.js","sourceRoot":"","sources":["../../src/tools/mem-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolDef } from "./util.js";
2
+ export declare const memHandoff: ToolDef;
3
+ //# sourceMappingURL=mem-handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-handoff.d.ts","sourceRoot":"","sources":["../../src/tools/mem-handoff.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAmC,MAAM,WAAW,CAAC;AAErE,eAAO,MAAM,UAAU,EAAE,OAoExB,CAAC"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.memHandoff = void 0;
4
+ const file_store_js_1 = require("../store/file-store.js");
5
+ const util_js_1 = require("./util.js");
6
+ exports.memHandoff = {
7
+ name: "mem_handoff",
8
+ description: "Close out a session: write a structured handoff to sessions/YYYY-MM-DD.md so " +
9
+ "the next session (you, a teammate, or a different agent) picks up exactly where " +
10
+ "this one left off. Records what was done, what's next, and any blockers.",
11
+ inputSchema: {
12
+ type: "object",
13
+ properties: {
14
+ summary: { type: "string", description: "What was worked on this session." },
15
+ done: {
16
+ type: "array",
17
+ items: { type: "string" },
18
+ description: "Completed items.",
19
+ },
20
+ next: {
21
+ type: "array",
22
+ items: { type: "string" },
23
+ description: "What to do next session.",
24
+ },
25
+ blockers: {
26
+ type: "array",
27
+ items: { type: "string" },
28
+ description: "Open blockers or gotchas.",
29
+ },
30
+ },
31
+ required: ["summary"],
32
+ },
33
+ handler(args, projectRoot) {
34
+ if (!(0, file_store_js_1.isInitialized)(projectRoot)) {
35
+ return "✖ .repomem/ not found. Run `repomem init` in your project first.";
36
+ }
37
+ const summary = (0, util_js_1.str)(args.summary);
38
+ if (!summary)
39
+ return "✖ A summary is required.";
40
+ const done = (0, util_js_1.strArray)(args.done);
41
+ const next = (0, util_js_1.strArray)(args.next);
42
+ const blockers = (0, util_js_1.strArray)(args.blockers);
43
+ const lines = [];
44
+ lines.push(`\n## ${(0, util_js_1.timestamp)()} — Handoff`, "");
45
+ lines.push(summary, "");
46
+ if (done.length) {
47
+ lines.push("**Done:**");
48
+ for (const d of done)
49
+ lines.push(`- ${d}`);
50
+ lines.push("");
51
+ }
52
+ if (next.length) {
53
+ lines.push("**Next:**");
54
+ for (const n of next)
55
+ lines.push(`- ${n}`);
56
+ lines.push("");
57
+ }
58
+ if (blockers.length) {
59
+ lines.push("**Blockers:**");
60
+ for (const b of blockers)
61
+ lines.push(`- ${b}`);
62
+ lines.push("");
63
+ }
64
+ const filename = `${(0, util_js_1.today)()}.md`;
65
+ (0, file_store_js_1.writeFile)("sessions", filename, lines.join("\n"), { append: true }, projectRoot);
66
+ (0, file_store_js_1.generateIndex)(projectRoot);
67
+ return (`✔ Handoff written to sessions/${filename}\n\n` +
68
+ "Commit it so your team and next session inherit it:\n" +
69
+ ` git add .repomem/ && git commit -m "memory: session handoff ${(0, util_js_1.today)()}"`);
70
+ },
71
+ };
72
+ //# sourceMappingURL=mem-handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-handoff.js","sourceRoot":"","sources":["../../src/tools/mem-handoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { MEMORY_TYPES } from "../store/file-store.js";
2
+ import { ToolDef } from "./util.js";
3
+ export declare const memSave: ToolDef;
4
+ export { MEMORY_TYPES };
5
+ //# sourceMappingURL=mem-save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-save.d.ts","sourceRoot":"","sources":["../../src/tools/mem-save.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAIb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,OAAO,EAA4C,MAAM,WAAW,CAAC;AAa9E,eAAO,MAAM,OAAO,EAAE,OAyErB,CAAC;AAGF,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MEMORY_TYPES = exports.memSave = void 0;
4
+ const file_store_js_1 = require("../store/file-store.js");
5
+ Object.defineProperty(exports, "MEMORY_TYPES", { enumerable: true, get: function () { return file_store_js_1.MEMORY_TYPES; } });
6
+ const util_js_1 = require("./util.js");
7
+ const TYPE_ALIASES = {
8
+ decision: "decisions",
9
+ decisions: "decisions",
10
+ session: "sessions",
11
+ sessions: "sessions",
12
+ pattern: "patterns",
13
+ patterns: "patterns",
14
+ issue: "issues",
15
+ issues: "issues",
16
+ };
17
+ exports.memSave = {
18
+ name: "mem_save",
19
+ description: "Save a memory to .repomem/. type is one of decision|session|pattern|issue. " +
20
+ "Use this to capture architectural decisions, reusable patterns, known issues, " +
21
+ "or session notes so they persist with the repo and travel to teammates.",
22
+ inputSchema: {
23
+ type: "object",
24
+ properties: {
25
+ type: {
26
+ type: "string",
27
+ enum: ["decision", "session", "pattern", "issue"],
28
+ description: "Kind of memory to save.",
29
+ },
30
+ title: { type: "string", description: "Short title for this memory." },
31
+ content: { type: "string", description: "The memory body, in markdown." },
32
+ tags: {
33
+ type: "array",
34
+ items: { type: "string" },
35
+ description: "Optional tags for retrieval.",
36
+ },
37
+ supersedes: {
38
+ type: "string",
39
+ description: "Optional filename of a prior decision this one replaces (decisions only).",
40
+ },
41
+ },
42
+ required: ["type", "title", "content"],
43
+ },
44
+ handler(args, projectRoot) {
45
+ if (!(0, file_store_js_1.isInitialized)(projectRoot)) {
46
+ return "✖ .repomem/ not found. Run `repomem init` in your project first.";
47
+ }
48
+ const rawType = (0, util_js_1.str)(args.type).toLowerCase();
49
+ const type = TYPE_ALIASES[rawType];
50
+ if (!type) {
51
+ return `✖ Unknown type "${(0, util_js_1.str)(args.type)}". Use one of: decision, session, pattern, issue.`;
52
+ }
53
+ const title = (0, util_js_1.str)(args.title);
54
+ const content = (0, util_js_1.str)(args.content);
55
+ if (!title)
56
+ return "✖ A title is required.";
57
+ if (!content)
58
+ return "✖ Content is required.";
59
+ const tags = (0, util_js_1.strArray)(args.tags);
60
+ const supersedes = (0, util_js_1.str)(args.supersedes);
61
+ // Sessions are date-keyed and appended to across a single day.
62
+ if (type === "sessions") {
63
+ const filename = `${(0, util_js_1.today)()}.md`;
64
+ const block = `\n## ${(0, util_js_1.timestamp)()} — ${title}\n\n` +
65
+ (tags.length ? `_tags: ${tags.join(", ")}_\n\n` : "") +
66
+ `${content}\n`;
67
+ (0, file_store_js_1.writeFile)(type, filename, block, { append: true }, projectRoot);
68
+ (0, file_store_js_1.generateIndex)(projectRoot);
69
+ return `✔ Appended to sessions/${filename}\n\nRemember to: git add .repomem/ && git commit`;
70
+ }
71
+ const filename = `${(0, util_js_1.today)()}-${(0, util_js_1.slugify)(title)}.md`;
72
+ const fm = ["---", `date: ${(0, util_js_1.today)()}`];
73
+ if (tags.length)
74
+ fm.push(`tags: [${tags.join(", ")}]`);
75
+ if (supersedes)
76
+ fm.push(`supersedes: ${supersedes}`);
77
+ fm.push("---", "");
78
+ const body = `# ${title}\n\n${content}\n`;
79
+ (0, file_store_js_1.writeFile)(type, filename, fm.join("\n") + body, {}, projectRoot);
80
+ (0, file_store_js_1.generateIndex)(projectRoot);
81
+ const note = supersedes ? ` (supersedes ${supersedes})` : "";
82
+ return `✔ Saved ${type}/${filename}${note}\n\nRemember to: git add .repomem/ && git commit`;
83
+ },
84
+ };
85
+ //# sourceMappingURL=mem-save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-save.js","sourceRoot":"","sources":["../../src/tools/mem-save.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ToolDef } from "./util.js";
2
+ export declare const memSearch: ToolDef;
3
+ //# sourceMappingURL=mem-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-search.d.ts","sourceRoot":"","sources":["../../src/tools/mem-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAO,MAAM,WAAW,CAAC;AAEzC,eAAO,MAAM,SAAS,EAAE,OA2CvB,CAAC"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.memSearch = void 0;
4
+ const file_store_js_1 = require("../store/file-store.js");
5
+ const util_js_1 = require("./util.js");
6
+ exports.memSearch = {
7
+ name: "mem_search",
8
+ description: "Search across all saved memory (decisions, sessions, patterns, issues), " +
9
+ "ranked by relevance (TF-IDF) and recency. Set linked=true to also search " +
10
+ "linked repos (local paths and remote GitHub repos pulled via `repomem pull`) " +
11
+ "and the workspace declared in repomem.config.json. Returns the top matches " +
12
+ "with a short excerpt each, labelled by source scope.",
13
+ inputSchema: {
14
+ type: "object",
15
+ properties: {
16
+ query: { type: "string", description: "Search terms." },
17
+ linked: {
18
+ type: "boolean",
19
+ description: "Also search linked repos and workspace. Default false.",
20
+ },
21
+ },
22
+ required: ["query"],
23
+ },
24
+ handler(args, projectRoot) {
25
+ if (!(0, file_store_js_1.isInitialized)(projectRoot)) {
26
+ return "✖ .repomem/ not found. Run `repomem init` in your project first.";
27
+ }
28
+ const query = (0, util_js_1.str)(args.query);
29
+ if (!query)
30
+ return "✖ A search query is required.";
31
+ const includeLinked = args.linked === true;
32
+ const results = includeLinked
33
+ ? (0, file_store_js_1.searchAllRepos)(query, projectRoot)
34
+ : (0, file_store_js_1.searchFiles)(query, projectRoot);
35
+ if (results.length === 0) {
36
+ return `No memory found for "${query}".`;
37
+ }
38
+ const lines = [`Found ${results.length} match(es) for "${query}":`, ""];
39
+ for (const r of results) {
40
+ lines.push(`${r.scope} ${r.title} · ${r.file}`);
41
+ lines.push(` ${r.excerpt}`);
42
+ lines.push("");
43
+ }
44
+ return lines.join("\n").trimEnd();
45
+ },
46
+ };
47
+ //# sourceMappingURL=mem-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-search.js","sourceRoot":"","sources":["../../src/tools/mem-search.ts"],"names":[],"mappings":";;;AAAA,0DAAoF;AACpF,uCAAyC;AAE5B,QAAA,SAAS,GAAY;IAChC,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,0EAA0E;QAC1E,2EAA2E;QAC3E,+EAA+E;QAC/E,6EAA6E;QAC7E,sDAAsD;IACxD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE;YACvD,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,wDAAwD;aACtE;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;IACD,OAAO,CAAC,IAAI,EAAE,WAAW;QACvB,IAAI,CAAC,IAAA,6BAAa,EAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,kEAAkE,CAAC;QAC5E,CAAC;QACD,MAAM,KAAK,GAAG,IAAA,aAAG,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK;YAAE,OAAO,+BAA+B,CAAC;QAEnD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;QAC3C,MAAM,OAAO,GAAG,aAAa;YAC3B,CAAC,CAAC,IAAA,8BAAc,EAAC,KAAK,EAAE,WAAW,CAAC;YACpC,CAAC,CAAC,IAAA,2BAAW,EAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAEpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,wBAAwB,KAAK,IAAI,CAAC;QAC3C,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,mBAAmB,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;QACxE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IACpC,CAAC;CACF,CAAC"}
@@ -0,0 +1,18 @@
1
+ /** Shared helpers for repomem MCP tools. */
2
+ export interface ToolDef {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: Record<string, unknown>;
6
+ handler: (args: Record<string, unknown>, projectRoot: string) => string;
7
+ }
8
+ /** YYYY-MM-DD in local time. */
9
+ export declare function today(): string;
10
+ /** ISO-ish local timestamp for in-file headings. */
11
+ export declare function timestamp(): string;
12
+ /** Turn a title into a filesystem-safe kebab slug. */
13
+ export declare function slugify(title: string): string;
14
+ /** Coerce an unknown arg into a trimmed string (empty when absent). */
15
+ export declare function str(v: unknown): string;
16
+ /** Coerce an unknown arg into a string array. */
17
+ export declare function strArray(v: unknown): string[];
18
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/tools/util.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;CACzE;AAED,gCAAgC;AAChC,wBAAgB,KAAK,IAAI,MAAM,CAI9B;AAED,oDAAoD;AACpD,wBAAgB,SAAS,IAAI,MAAM,CAIlC;AAED,sDAAsD;AACtD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM7C;AAED,uEAAuE;AACvE,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAEtC;AAED,iDAAiD;AACjD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAM7C"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /** Shared helpers for repomem MCP tools. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.today = today;
5
+ exports.timestamp = timestamp;
6
+ exports.slugify = slugify;
7
+ exports.str = str;
8
+ exports.strArray = strArray;
9
+ /** YYYY-MM-DD in local time. */
10
+ function today() {
11
+ const d = new Date();
12
+ const pad = (n) => String(n).padStart(2, "0");
13
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
14
+ }
15
+ /** ISO-ish local timestamp for in-file headings. */
16
+ function timestamp() {
17
+ const d = new Date();
18
+ const pad = (n) => String(n).padStart(2, "0");
19
+ return `${today()} ${pad(d.getHours())}:${pad(d.getMinutes())}`;
20
+ }
21
+ /** Turn a title into a filesystem-safe kebab slug. */
22
+ function slugify(title) {
23
+ return title
24
+ .toLowerCase()
25
+ .replace(/[^a-z0-9]+/g, "-")
26
+ .replace(/^-+|-+$/g, "")
27
+ .slice(0, 60) || "untitled";
28
+ }
29
+ /** Coerce an unknown arg into a trimmed string (empty when absent). */
30
+ function str(v) {
31
+ return typeof v === "string" ? v.trim() : "";
32
+ }
33
+ /** Coerce an unknown arg into a string array. */
34
+ function strArray(v) {
35
+ if (Array.isArray(v))
36
+ return v.map((x) => String(x).trim()).filter(Boolean);
37
+ if (typeof v === "string" && v.trim()) {
38
+ return v.split(",").map((x) => x.trim()).filter(Boolean);
39
+ }
40
+ return [];
41
+ }
42
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/tools/util.ts"],"names":[],"mappings":";AAAA,4CAA4C;;AAU5C,sBAIC;AAGD,8BAIC;AAGD,0BAMC;AAGD,kBAEC;AAGD,4BAMC;AAnCD,gCAAgC;AAChC,SAAgB,KAAK;IACnB,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,oDAAoD;AACpD,SAAgB,SAAS;IACvB,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,sDAAsD;AACtD,SAAgB,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;AAChC,CAAC;AAED,uEAAuE;AACvE,SAAgB,GAAG,CAAC,CAAU;IAC5B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,iDAAiD;AACjD,SAAgB,QAAQ,CAAC,CAAU;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5E,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
package/package.json CHANGED
@@ -1,10 +1,21 @@
1
1
  {
2
2
  "name": "@saleem11kh/repomem",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Git-native memory for AI coding agents. .repomem/ commits with your code, clones with your team, works with Claude Code, Cursor, Gemini CLI and more.",
5
- "main": "index.js",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "repomem": "dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
6
13
  "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
14
+ "build": "rimraf dist && tsc",
15
+ "dev": "ts-node src/cli.ts",
16
+ "start": "node dist/cli.js",
17
+ "test": "npm run build && node --test",
18
+ "prepare": "npm run build"
8
19
  },
9
20
  "keywords": [
10
21
  "mcp",
@@ -33,5 +44,15 @@
33
44
  "type": "commonjs",
34
45
  "engines": {
35
46
  "node": ">=18.0.0"
47
+ },
48
+ "dependencies": {
49
+ "@modelcontextprotocol/sdk": "^1.29.0",
50
+ "zod": "^4.4.3"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^26.0.1",
54
+ "rimraf": "^6.1.3",
55
+ "ts-node": "^10.9.2",
56
+ "typescript": "^6.0.3"
36
57
  }
37
- }
58
+ }