@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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":";;;AAAA,0DAAiF;AACjF,uCAAqE;AAExD,QAAA,UAAU,GAAY;IACjC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,+EAA+E;QAC/E,kFAAkF;QAClF,0EAA0E;IAC5E,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;YAC5E,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,kBAAkB;aAChC;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,0BAA0B;aACxC;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,2BAA2B;aACzC;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,OAAO,CAAC,IAAI,EAAE,WAAW;QACvB,IAAI,CAAC,IAAA,6BAAa,EAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,kEAAkE,CAAC;QAC5E,CAAC;QACD,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO;YAAE,OAAO,0BAA0B,CAAC;QAEhD,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAA,kBAAQ,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAA,mBAAS,GAAE,YAAY,EAAE,EAAE,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,IAAA,eAAK,GAAE,KAAK,CAAC;QACjC,IAAA,yBAAS,EAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;QACjF,IAAA,6BAAa,EAAC,WAAW,CAAC,CAAC;QAE3B,OAAO,CACL,iCAAiC,QAAQ,MAAM;YAC/C,uDAAuD;YACvD,iEAAiE,IAAA,eAAK,GAAE,GAAG,CAC5E,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -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 @@
|
|
|
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.
|
|
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
|
-
"
|
|
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
|
+
}
|