memory-forge 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,308 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MemoryForge — AI Agent 持久记忆引擎 (MVP)
4
+ *
5
+ * 8 个 MCP 工具 + 5 个后台自动化引擎 + Pro 层 Shelby 云同步。
6
+ * 嵌入: Transformers.js (23MB, 进程内)。
7
+ * 存储: Free 层本地 Markdown; Pro 层 Shelby 云。
8
+ *
9
+ * 一键嵌入:
10
+ * claude mcp add memory-forge -- npx memory-forge
11
+ */
12
+ import { randomUUID } from "node:crypto";
13
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
15
+ import { z } from "zod";
16
+ import { MemoryStore } from "./store.js";
17
+ import { embed, preload } from "./embedding.js";
18
+ import { saveMemory, loadAllMemories, deleteMemoryFile } from "./storage/local.js";
19
+ import { uploadMemory } from "./storage/shelby.js";
20
+ import { autoName, autoMerge } from "./auto/index.js";
21
+ import { generateContextSummary } from "./auto/index.js";
22
+ import { setup } from "./setup.js";
23
+ import { pro, syncAll } from "./pro.js";
24
+ // ─── CLI 命令路由 ──────────────────────────────────────────
25
+ const cmd = process.argv[2];
26
+ if (cmd === "setup") {
27
+ setup()
28
+ .then(() => process.exit(0))
29
+ .catch((err) => { console.error(err); process.exit(1); });
30
+ // Don't start MCP server — rely on setup's process.exit
31
+ }
32
+ else if (cmd === "pro") {
33
+ pro()
34
+ .then(() => process.exit(0))
35
+ .catch((err) => { console.error(err); process.exit(1); });
36
+ }
37
+ else if (cmd === "hook") {
38
+ const hookType = process.argv[3];
39
+ if (hookType === "session-start") {
40
+ const s = new MemoryStore();
41
+ for (const m of loadAllMemories())
42
+ s.add(m);
43
+ const summary = generateContextSummary(s, 5);
44
+ if (summary)
45
+ console.log(summary);
46
+ }
47
+ process.exit(0);
48
+ }
49
+ else {
50
+ // Default: start MCP server
51
+ startMcpServer();
52
+ }
53
+ // ═══════════════════════════════════════════════════════════════
54
+ // MCP Server
55
+ // ═══════════════════════════════════════════════════════════════
56
+ function startMcpServer() {
57
+ const store = new MemoryStore();
58
+ for (const m of loadAllMemories()) {
59
+ store.add(m);
60
+ }
61
+ preload();
62
+ const server = new McpServer({ name: "memory-forge", version: "0.1.0" });
63
+ // ── memory_store ──────────────────────────────────────────
64
+ server.registerTool("memory_store", {
65
+ title: "存储记忆",
66
+ description: "存储一条上下文、知识或偏好到持久记忆中。自动向量化以支持语义检索。",
67
+ inputSchema: {
68
+ content: z.string().min(1).describe("要存储的记忆内容。"),
69
+ category: z.string().default("general").describe("分类标签: user-preference, project-context, decision-log, code-pattern。"),
70
+ tags: z.array(z.string()).default([]).describe("标签列表。"),
71
+ priority: z.number().min(1).max(10).default(5).describe("优先级 1-10。"),
72
+ },
73
+ }, async (params) => {
74
+ const { content, category, tags, priority } = params;
75
+ const vec = await embed(content);
76
+ const name = autoName(content);
77
+ const memory = {
78
+ id: randomUUID(), name, content, category, tags, priority,
79
+ vector: vec ? Array.from(vec) : [],
80
+ created_at: new Date().toISOString(), access_count: 0, last_accessed: null,
81
+ };
82
+ const merged = await autoMerge(store, memory);
83
+ if (merged) {
84
+ saveMemory(merged);
85
+ return { content: [{ type: "text", text: JSON.stringify({
86
+ success: true, merged: true, memory_id: merged.id, name: merged.name, preview: content.slice(0, 200),
87
+ }) }] };
88
+ }
89
+ saveMemory(memory);
90
+ store.add(memory);
91
+ // Pro: auto-upload to Shelby cloud
92
+ if (process.env.SHELBY_API_KEY) {
93
+ uploadMemory(memory).catch(() => { });
94
+ }
95
+ return { content: [{ type: "text", text: JSON.stringify({
96
+ success: true, memory_id: memory.id, name: memory.name, preview: content.slice(0, 200),
97
+ }) }] };
98
+ });
99
+ // ── memory_search ─────────────────────────────────────────
100
+ server.registerTool("memory_search", {
101
+ title: "语义检索记忆",
102
+ description: "通过语义相似度搜索相关记忆。向量模型不可用时自动回退到关键词匹配。",
103
+ inputSchema: {
104
+ query: z.string().describe("自然语言查询。"),
105
+ limit: z.number().min(1).max(20).default(5),
106
+ min_similarity: z.number().min(0).max(1).default(0.6),
107
+ category: z.string().optional(),
108
+ tags: z.array(z.string()).optional(),
109
+ },
110
+ }, async (params) => {
111
+ const { query, limit, min_similarity, category, tags } = params;
112
+ const vec = await embed(query);
113
+ const results = store.search(query, {
114
+ limit, minSimilarity: min_similarity, category: category ?? null,
115
+ tags: tags ?? null, queryVec: vec ?? undefined,
116
+ });
117
+ for (const r of results) {
118
+ store.touch(r.id);
119
+ const updated = store.get(r.id);
120
+ if (updated)
121
+ saveMemory(updated);
122
+ }
123
+ return { content: [{ type: "text", text: JSON.stringify({
124
+ query, count: results.length,
125
+ results: results.map((r) => ({
126
+ memory_id: r.id, name: r.name,
127
+ similarity: r.similarity?.toFixed(3) ?? 0, content: r.content,
128
+ _method: r._fallback || "vector",
129
+ })),
130
+ hint: results.length === 0 ? "No relevant memories found." : null,
131
+ }) }] };
132
+ });
133
+ // ── memory_recall ─────────────────────────────────────────
134
+ server.registerTool("memory_recall", {
135
+ title: "精确获取记忆",
136
+ description: "通过 memory_id 精确获取一条记忆的完整内容。",
137
+ inputSchema: { memory_id: z.string().describe("记忆 ID。") },
138
+ }, async (params) => {
139
+ const { memory_id } = params;
140
+ const memory = store.get(memory_id);
141
+ if (!memory)
142
+ return { content: [{ type: "text", text: JSON.stringify({ error: "Not found", memory_id }) }] };
143
+ store.touch(memory_id);
144
+ saveMemory(memory);
145
+ return { content: [{ type: "text", text: JSON.stringify({
146
+ memory_id: memory.id, name: memory.name, content: memory.content,
147
+ category: memory.category, tags: memory.tags, priority: memory.priority,
148
+ created_at: memory.created_at, access_count: memory.access_count,
149
+ }) }] };
150
+ });
151
+ // ── memory_list ───────────────────────────────────────────
152
+ server.registerTool("memory_list", {
153
+ title: "列出记忆",
154
+ description: "列出记忆目录,可按分类和标签过滤。",
155
+ inputSchema: {
156
+ category: z.string().optional(),
157
+ tags: z.array(z.string()).optional(),
158
+ limit: z.number().min(1).max(100).default(20),
159
+ offset: z.number().min(0).default(0),
160
+ },
161
+ }, async (params) => {
162
+ const { category, tags, limit, offset } = params;
163
+ const memories = store.list({ category: category ?? null, tags: tags ?? null, limit, offset });
164
+ return { content: [{ type: "text", text: JSON.stringify({
165
+ total: store.size(), count: memories.length,
166
+ memories: memories.map((m) => ({
167
+ memory_id: m.id, name: m.name, category: m.category,
168
+ tags: m.tags, priority: m.priority, preview: m.content.slice(0, 100),
169
+ })),
170
+ }) }] };
171
+ });
172
+ // ── memory_forget ─────────────────────────────────────────
173
+ server.registerTool("memory_forget", {
174
+ title: "遗忘记忆",
175
+ description: "删除一条记忆,同时删除本地文件。",
176
+ inputSchema: { memory_id: z.string().describe("要删除的记忆 ID。") },
177
+ }, async (params) => {
178
+ const { memory_id } = params;
179
+ const existed = store.remove(memory_id);
180
+ if (existed)
181
+ deleteMemoryFile(memory_id);
182
+ return { content: [{ type: "text", text: JSON.stringify({
183
+ success: existed, memory_id, action: existed ? "deleted" : "not_found",
184
+ }) }] };
185
+ });
186
+ // ── memory_context ────────────────────────────────────────
187
+ server.registerTool("memory_context", {
188
+ title: "加载上下文",
189
+ description: "加载当前会话的上下文——返回最近访问的高优先级记忆。",
190
+ inputSchema: { limit: z.number().min(1).max(20).default(5) },
191
+ }, async (params) => {
192
+ const { limit } = params;
193
+ const summary = generateContextSummary(store, limit);
194
+ return { content: [{ type: "text", text: JSON.stringify({
195
+ context_loaded: true, memory_count: store.size(), context: summary,
196
+ }) }] };
197
+ });
198
+ // ── memory_export ─────────────────────────────────────────
199
+ server.registerTool("memory_export", {
200
+ title: "导出记忆",
201
+ description: "导出记忆为可移植格式(JSON 或 Markdown)。Free 用户换电脑时手动带走记忆,Pro 用户备份。不指定 memory_ids 则导出全部。",
202
+ inputSchema: {
203
+ memory_ids: z.array(z.string()).optional().describe("要导出的记忆 ID 列表。不指定则导出全部。"),
204
+ format: z.enum(["json", "markdown"]).default("json").describe("导出格式: json(结构化)或 markdown(人类可读)。"),
205
+ },
206
+ }, async (params) => {
207
+ const { memory_ids, format } = params;
208
+ let memories = memory_ids
209
+ ? memory_ids.map((id) => store.get(id)).filter((m) => m !== null)
210
+ : [...store.list({ limit: 10000, offset: 0 })];
211
+ if (memories.length === 0) {
212
+ return { content: [{ type: "text", text: JSON.stringify({
213
+ exported: 0, message: "No memories to export.",
214
+ }) }] };
215
+ }
216
+ let output;
217
+ if (format === "markdown") {
218
+ output = memories.map((m) => {
219
+ const lines = [
220
+ `# ${m.name}`,
221
+ `> category: ${m.category} | tags: ${m.tags.join(", ")} | priority: ${m.priority}`,
222
+ `> created: ${m.created_at} | access_count: ${m.access_count}`,
223
+ ``,
224
+ m.content,
225
+ ``,
226
+ "---",
227
+ ];
228
+ return lines.join("\n");
229
+ }).join("\n\n");
230
+ }
231
+ else {
232
+ output = JSON.stringify({
233
+ exported_at: new Date().toISOString(),
234
+ version: "memory-forge-1.0",
235
+ count: memories.length,
236
+ memories: memories.map((m) => ({
237
+ id: m.id,
238
+ name: m.name,
239
+ content: m.content,
240
+ category: m.category,
241
+ tags: m.tags,
242
+ priority: m.priority,
243
+ created_at: m.created_at,
244
+ })),
245
+ }, null, 2);
246
+ }
247
+ return { content: [{ type: "text", text: output }] };
248
+ });
249
+ // ── memory_share ──────────────────────────────────────────
250
+ server.registerTool("memory_share", {
251
+ title: "分享记忆",
252
+ description: "将一条记忆打包为可分享的格式,方便发送给队友或其他 Agent 导入。返回一个独立 JSON 包,对方可用 memory_store 重新存入。",
253
+ inputSchema: {
254
+ memory_id: z.string().describe("要分享的记忆 ID。"),
255
+ recipient: z.string().optional().describe("接收者名称(可选,写入分享包元数据)。"),
256
+ note: z.string().optional().describe("附注消息(可选,写入分享包)。"),
257
+ },
258
+ }, async (params) => {
259
+ const { memory_id, recipient, note } = params;
260
+ const memory = store.get(memory_id);
261
+ if (!memory) {
262
+ return { content: [{ type: "text", text: JSON.stringify({
263
+ error: "Not found", memory_id, hint: "Use memory_list to find the correct ID.",
264
+ }) }] };
265
+ }
266
+ store.touch(memory_id);
267
+ const sharePackage = {
268
+ type: "memory-forge-share",
269
+ version: "1.0",
270
+ shared_at: new Date().toISOString(),
271
+ recipient: recipient ?? null,
272
+ note: note ?? null,
273
+ memory: {
274
+ name: memory.name,
275
+ content: memory.content,
276
+ category: memory.category,
277
+ tags: memory.tags,
278
+ },
279
+ import_instruction: "Use memory_store with this content to import.",
280
+ };
281
+ return { content: [{ type: "text", text: JSON.stringify(sharePackage, null, 2) }] };
282
+ });
283
+ // ── 启动 ──────────────────────────────────────────────────
284
+ async function main() {
285
+ // Pro: auto-sync on startup (non-blocking — server starts regardless)
286
+ const proActive = !!process.env.SHELBY_API_KEY;
287
+ if (proActive) {
288
+ console.error("[MemoryForge] Pro: Syncing with Shelby cloud...");
289
+ syncAll()
290
+ .then(() => {
291
+ for (const m of loadAllMemories())
292
+ store.add(m);
293
+ console.error(`[MemoryForge] Pro sync complete — ${store.size()} memories`);
294
+ })
295
+ .catch((err) => console.error("[MemoryForge] Pro sync failed (server still available):", err.message));
296
+ }
297
+ const transport = new StdioServerTransport();
298
+ await server.connect(transport);
299
+ console.error(`[MemoryForge] MCP Server started — ${store.size()} memories loaded` +
300
+ (proActive ? " (Pro: Shelby cloud sync)" : " (Free: local storage)"));
301
+ console.error("[MemoryForge] 8 tools: store / search / recall / list / forget / context / export / share");
302
+ }
303
+ main().catch((err) => {
304
+ console.error("[MemoryForge] Fatal:", err);
305
+ process.exit(1);
306
+ });
307
+ }
308
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,0DAA0D;AAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5B,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE;SACJ,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,wDAAwD;AAC1D,CAAC;KAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;IACzB,GAAG,EAAE;SACF,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;KAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE;YAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,CAAC;IACN,4BAA4B;IAC5B,cAAc,EAAE,CAAC;AACnB,CAAC;AAED,kEAAkE;AAClE,cAAc;AACd,kEAAkE;AAClE,SAAS,cAAc;IACrB,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;IAEhC,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,EAAE,CAAC;QAClC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IAED,OAAO,EAAE,CAAC;IAEV,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAEzE,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,mCAAmC;QAChD,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;YAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,qEAAqE,CAAC;YACvH,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YACvD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;SACrE;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE/B,MAAM,MAAM,GAAG;YACb,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;YACzD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;YAClC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,IAAqB;SAC5F,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACX,UAAU,CAAC,MAAM,CAAC,CAAC;YACnB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;yBACrG,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC;QAED,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAElB,mCAAmC;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YAC/B,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBAC/D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;qBACvF,CAAC,EAAE,CAAC,EAAE,CAAC;IACV,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,mCAAmC;QAChD,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;YACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC/B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;SACrC;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE;YAClC,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI;YAChE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,SAAS;SAC/C,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,OAAO;gBAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBAC/D,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM;wBAC5B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC3B,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;4BAC7B,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO;4BAC7D,OAAO,EAAE,CAAC,CAAC,SAAS,IAAI,QAAQ;yBACjC,CAAC,CAAC;wBACH,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI;qBAClE,CAAC,EAAE,CAAC,EAAE,CAAC;IACV,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,6BAA6B;QAC1C,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;KAC1D,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACtH,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvB,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBAC/D,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO;wBAChE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACvE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY;qBACjE,CAAC,EAAE,CAAC,EAAE,CAAC;IACV,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC/B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;SACrC;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBAC/D,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM;wBAC3C,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC7B,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ;4BACnD,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;yBACrE,CAAC,CAAC;qBACJ,CAAC,EAAE,CAAC,EAAE,CAAC;IACV,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;KAC9D,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,OAAO;YAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACzC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBAC/D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;qBACvE,CAAC,EAAE,CAAC,EAAE,CAAC;IACV,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,4BAA4B;QACzC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;KAC7D,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QACzB,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBAC/D,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO;qBACnE,CAAC,EAAE,CAAC,EAAE,CAAC;IACV,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,8EAA8E;QAC3F,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YAC7E,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;SAClG;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAEtC,IAAI,QAAQ,GAAG,UAAU;YACvB,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;YAC7F,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BAC/D,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,wBAAwB;yBAC/C,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC;QAED,IAAI,MAAc,CAAC;QAEnB,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC1B,MAAM,KAAK,GAAG;oBACZ,KAAK,CAAC,CAAC,IAAI,EAAE;oBACb,eAAe,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;oBAClF,cAAc,CAAC,CAAC,UAAU,oBAAoB,CAAC,CAAC,YAAY,EAAE;oBAC9D,EAAE;oBACF,CAAC,CAAC,OAAO;oBACT,EAAE;oBACF,KAAK;iBACN,CAAC;gBACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;gBACtB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,OAAO,EAAE,kBAAkB;gBAC3B,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,UAAU,EAAE,CAAC,CAAC,UAAU;iBACzB,CAAC,CAAC;aACJ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACd,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAChE,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,0EAA0E;QACvF,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC5C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAChE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SACxD;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BAC/D,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,yCAAyC;yBAC/E,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAEvB,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,SAAS,IAAI,IAAI;YAC5B,IAAI,EAAE,IAAI,IAAI,IAAI;YAClB,MAAM,EAAE;gBACN,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB;YACD,kBAAkB,EAAE,+CAA+C;SACpE,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC/F,CAAC,CACF,CAAC;IAEF,2DAA2D;IAC3D,KAAK,UAAU,IAAI;QACjB,sEAAsE;QACtE,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QAC/C,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACjE,OAAO,EAAE;iBACN,IAAI,CAAC,GAAG,EAAE;gBACT,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE;oBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAChD,OAAO,CAAC,KAAK,CAAC,qCAAqC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC9E,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACtH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,sCAAsC,KAAK,CAAC,IAAI,EAAE,kBAAkB;YAChF,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;IAC7G,CAAC;IAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 规则迁移: 自动检测已有规则文件,导入为记忆。
3
+ * 支持 CLAUDE.md / .cursor/rules/*.mdc / .gitconfig / AGENTS.md
4
+ */
5
+ import type { Memory } from "../store.js";
6
+ export interface ImportedRule {
7
+ source: string;
8
+ key: string;
9
+ content: string;
10
+ }
11
+ export declare function importRules(): ImportedRule[];
12
+ export declare function rulesToMemories(rules: ImportedRule[]): Memory[];
@@ -0,0 +1,92 @@
1
+ /**
2
+ * 规则迁移: 自动检测已有规则文件,导入为记忆。
3
+ * 支持 CLAUDE.md / .cursor/rules/*.mdc / .gitconfig / AGENTS.md
4
+ */
5
+ import { randomUUID } from "node:crypto";
6
+ import * as fs from "node:fs";
7
+ import * as path from "node:path";
8
+ import { autoName } from "../auto/index.js";
9
+ const HOME = process.env.HOME ?? process.env.USERPROFILE ?? "/tmp";
10
+ const SOURCES = [
11
+ {
12
+ path: path.join(HOME, ".claude", "CLAUDE.md"),
13
+ category: "claude-rules",
14
+ extract: (content, filepath) => {
15
+ const rules = [];
16
+ for (const line of content.split("\n")) {
17
+ const trimmed = line.trim();
18
+ if (trimmed && !trimmed.startsWith("#") && trimmed.length > 10) {
19
+ rules.push({ source: filepath, key: `claude-rule-${rules.length}`, content: trimmed });
20
+ }
21
+ }
22
+ return rules.slice(0, 20);
23
+ },
24
+ },
25
+ {
26
+ path: path.join(HOME, ".cursor", "rules"),
27
+ category: "cursor-rules",
28
+ extract: (content, filepath) => {
29
+ const rules = [];
30
+ for (const line of content.split("\n")) {
31
+ const trimmed = line.trim();
32
+ if (trimmed && !trimmed.startsWith("#") && trimmed.length > 10) {
33
+ rules.push({ source: filepath, key: `cursor-${path.basename(filepath)}-${rules.length}`, content: trimmed });
34
+ }
35
+ }
36
+ return rules.slice(0, 20);
37
+ },
38
+ },
39
+ {
40
+ path: path.join(HOME, ".gitconfig"),
41
+ category: "user-info",
42
+ extract: (content) => {
43
+ const rules = [];
44
+ const name = content.match(/name\s*=\s*(.+)/)?.[1];
45
+ const email = content.match(/email\s*=\s*(.+)/)?.[1];
46
+ if (name)
47
+ rules.push({ source: "~/.gitconfig", key: "git-user-name", content: `Git user name: ${name.trim()}` });
48
+ if (email)
49
+ rules.push({ source: "~/.gitconfig", key: "git-user-email", content: `Git user email: ${email.trim()}` });
50
+ return rules;
51
+ },
52
+ },
53
+ ];
54
+ export function importRules() {
55
+ const allRules = [];
56
+ for (const source of SOURCES) {
57
+ try {
58
+ const stat = fs.statSync(source.path);
59
+ if (stat.isDirectory()) {
60
+ const files = fs.readdirSync(source.path).filter((f) => f.endsWith(".md") || f.endsWith(".mdc"));
61
+ for (const file of files) {
62
+ const filepath = path.join(source.path, file);
63
+ const content = fs.readFileSync(filepath, "utf-8");
64
+ allRules.push(...source.extract(content, filepath));
65
+ }
66
+ }
67
+ else if (stat.isFile()) {
68
+ const content = fs.readFileSync(source.path, "utf-8");
69
+ allRules.push(...source.extract(content, source.path));
70
+ }
71
+ }
72
+ catch {
73
+ // File doesn't exist — skip
74
+ }
75
+ }
76
+ return allRules;
77
+ }
78
+ export function rulesToMemories(rules) {
79
+ return rules.map((r) => ({
80
+ id: randomUUID(),
81
+ name: autoName(r.content),
82
+ content: r.content,
83
+ category: r.source.includes(".cursor") ? "cursor-rules" : r.source.includes(".gitconfig") ? "user-info" : "claude-rules",
84
+ tags: [r.source.split("/").pop()?.replace(/\..*/, "") ?? "imported"],
85
+ priority: 7,
86
+ vector: [],
87
+ created_at: new Date().toISOString(),
88
+ access_count: 0,
89
+ last_accessed: null,
90
+ }));
91
+ }
92
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/migrate/import.ts"],"names":[],"mappings":"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"}
package/dist/pro.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MemoryForge Pro: Shelby 云存储 + 多设备同步。
4
+ *
5
+ * 用法: npx memory-forge pro
6
+ */
7
+ export declare function pro(): Promise<void>;
8
+ /** Sync: download from Shelby, merge with local */
9
+ export declare function syncAll(): Promise<void>;
package/dist/pro.js ADDED
@@ -0,0 +1,135 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MemoryForge Pro: Shelby 云存储 + 多设备同步。
4
+ *
5
+ * 用法: npx memory-forge pro
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import { loadAllMemories, saveMemory } from "./storage/local.js";
10
+ import { initShelby, uploadMemory, downloadMemory, listBlobs, getMemoryId, } from "./storage/shelby.js";
11
+ import { MemoryStore } from "./store.js";
12
+ const HOME = process.env.HOME ?? process.env.USERPROFILE ?? "/tmp";
13
+ const MEMORYFORGE_DIR = path.join(HOME, ".memory-forge");
14
+ const PROFILE_PATH = path.join(MEMORYFORGE_DIR, "pro.json");
15
+ export async function pro() {
16
+ // Check if already initialized
17
+ if (fs.existsSync(PROFILE_PATH)) {
18
+ console.log("✅ Pro is already active. Syncing memories...");
19
+ await syncAll();
20
+ return;
21
+ }
22
+ console.log(`
23
+ ╔══════════════════════════╗
24
+ ║ MemoryForge Pro Setup ║
25
+ ╚══════════════════════════╝
26
+ `);
27
+ const apiKey = process.env.SHELBY_API_KEY;
28
+ if (!apiKey) {
29
+ console.log("Pro requires a Shelby API Key.");
30
+ console.log("");
31
+ console.log(" Get your key at: https://docs.shelby.xyz/sdks/typescript/acquire-api-keys");
32
+ console.log(' Then run: SHELBY_API_KEY="aptoslabs_***" npx memory-forge pro');
33
+ console.log("");
34
+ console.log("💡 Free tier: npx memory-forge setup (local storage only)");
35
+ return;
36
+ }
37
+ // Load or generate Aptos account
38
+ let privateKey = process.env.APTOS_PRIVATE_KEY;
39
+ if (!privateKey && fs.existsSync(PROFILE_PATH)) {
40
+ const profile = JSON.parse(fs.readFileSync(PROFILE_PATH, "utf-8"));
41
+ privateKey = profile.privateKey;
42
+ }
43
+ console.log("🔄 Initializing Shelby storage...");
44
+ const { address, generatedKey } = initShelby(apiKey, privateKey);
45
+ if (generatedKey) {
46
+ // Save generated key for future runs
47
+ privateKey = generatedKey;
48
+ console.log(" ℹ️ Auto-generated Shelbynet account");
49
+ console.log(` ℹ️ Address: ${address}`);
50
+ console.log(" ⚠️ Fund this account with APT + ShelbyUSD:");
51
+ console.log(" APT: https://docs.shelby.xyz/apis/faucet/aptos");
52
+ console.log(" ShelbyUSD: https://docs.shelby.xyz/apis/faucet/shelbyusd");
53
+ console.log("");
54
+ }
55
+ else {
56
+ console.log(` ℹ️ Using account: ${address}`);
57
+ }
58
+ console.log("📤 Uploading existing memories to Shelby...");
59
+ let uploaded = 0;
60
+ for (const m of loadAllMemories()) {
61
+ const result = await uploadMemory(m);
62
+ if (result)
63
+ uploaded++;
64
+ }
65
+ // Save Pro profile
66
+ if (!fs.existsSync(MEMORYFORGE_DIR)) {
67
+ fs.mkdirSync(MEMORYFORGE_DIR, { recursive: true });
68
+ }
69
+ fs.writeFileSync(PROFILE_PATH, JSON.stringify({
70
+ version: 1,
71
+ activatedAt: new Date().toISOString(),
72
+ privateKey,
73
+ address,
74
+ }, null, 2));
75
+ console.log(`
76
+ ┌──────────────────────────────────────┐
77
+ │ MemoryForge Pro is active! │
78
+ │ │
79
+ │ ✅ ${uploaded} memories synced to Shelby │
80
+ │ ✅ Auto-sync on every session │
81
+ │ ✅ Memories survive across devices │
82
+ └──────────────────────────────────────┘
83
+ `);
84
+ }
85
+ /** Sync: download from Shelby, merge with local */
86
+ export async function syncAll() {
87
+ if (!fs.existsSync(PROFILE_PATH))
88
+ return;
89
+ const apiKey = process.env.SHELBY_API_KEY;
90
+ if (!apiKey)
91
+ return;
92
+ const profile = JSON.parse(fs.readFileSync(PROFILE_PATH, "utf-8"));
93
+ const privateKey = process.env.APTOS_PRIVATE_KEY || profile.privateKey;
94
+ initShelby(apiKey, privateKey);
95
+ const blobs = await listBlobs();
96
+ const store = new MemoryStore();
97
+ // Load existing local memories
98
+ for (const m of loadAllMemories()) {
99
+ store.add(m);
100
+ }
101
+ // Download and merge blob memories
102
+ let downloaded = 0;
103
+ for (const blobName of blobs) {
104
+ const memoryId = getMemoryId(blobName);
105
+ if (!memoryId || store.get(memoryId))
106
+ continue; // skip if already local
107
+ const memory = await downloadMemory(blobName);
108
+ if (memory) {
109
+ store.add(memory);
110
+ saveMemory(memory);
111
+ downloaded++;
112
+ }
113
+ }
114
+ // Upload any local-only memories
115
+ let uploaded = 0;
116
+ for (const m of loadAllMemories()) {
117
+ const blobName = `memories/${m.id}.json`;
118
+ if (blobs.includes(blobName))
119
+ continue; // already on Shelby
120
+ const result = await uploadMemory(m);
121
+ if (result)
122
+ uploaded++;
123
+ }
124
+ if (downloaded > 0 || uploaded > 0) {
125
+ console.error(`[MemoryForge] Sync: ↑${uploaded} ↓${downloaded}`);
126
+ }
127
+ }
128
+ // Allow running directly: npx memory-forge pro
129
+ if (process.argv[2] === "pro") {
130
+ pro().catch((err) => {
131
+ console.error("[MemoryForge] Pro setup failed:", err);
132
+ process.exit(1);
133
+ });
134
+ }
135
+ //# sourceMappingURL=pro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pro.js","sourceRoot":"","sources":["../src/pro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MemoryForge 一键安装: npx memory-forge setup
4
+ */
5
+ export declare function setup(): Promise<void>;