@withone/mem 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/LICENSE +21 -0
- package/README.md +92 -0
- package/bin/mem +36 -0
- package/dist/cli.d.ts +28 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +656 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +94 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +461 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/schema.d.ts +14 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +514 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +100 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
- package/skills/context/SKILL.md +168 -0
- package/skills/remember/SKILL.md +144 -0
- package/skills/search/SKILL.md +137 -0
- package/skills/setup/SKILL.md +162 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,656 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* mem - Memory for AI agents
|
|
4
|
+
* https://mem.now
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* mem <command> [args...]
|
|
8
|
+
*
|
|
9
|
+
* Commands:
|
|
10
|
+
* init Interactive setup
|
|
11
|
+
* add <type> '<json>' Add memory
|
|
12
|
+
* get <id> [--with-links] Get by ID
|
|
13
|
+
* list <type> [--filter key=val] List memories
|
|
14
|
+
* update <id> '<json>' Update
|
|
15
|
+
* delete <id> Delete
|
|
16
|
+
* link <from> <relation> <to> Create link
|
|
17
|
+
* unlink <from> <relation> <to> Remove link
|
|
18
|
+
* linked <id> [relation] Get linked
|
|
19
|
+
* search <query> [-t type] [-n N] Hybrid search
|
|
20
|
+
* context [-n N] [-t types] Startup context
|
|
21
|
+
* weight <id> <1-10> Set importance
|
|
22
|
+
* archive <id> Archive
|
|
23
|
+
* unarchive <id> Restore
|
|
24
|
+
* flush <id> Reset access
|
|
25
|
+
* migrate Apply schema
|
|
26
|
+
*/
|
|
27
|
+
import { Command } from "commander";
|
|
28
|
+
import * as p from "@clack/prompts";
|
|
29
|
+
import pc from "picocolors";
|
|
30
|
+
import { execSync, spawnSync } from "child_process";
|
|
31
|
+
import { existsSync, writeFileSync, readFileSync, mkdirSync, cpSync } from "fs";
|
|
32
|
+
import { dirname, join } from "path";
|
|
33
|
+
import { fileURLToPath } from "url";
|
|
34
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
35
|
+
const __dirname = dirname(__filename);
|
|
36
|
+
import { add, get, list, update, remove, link, unlink, linked, search, context, archive, unarchive, flush, weight, } from "./client.js";
|
|
37
|
+
import { SCHEMA_VERSION, getMigrationSQL } from "./schema.js";
|
|
38
|
+
const program = new Command();
|
|
39
|
+
program
|
|
40
|
+
.name("mem")
|
|
41
|
+
.description("Memory for AI agents")
|
|
42
|
+
.version(SCHEMA_VERSION);
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// CRUD Commands
|
|
45
|
+
// =============================================================================
|
|
46
|
+
program
|
|
47
|
+
.command("add <type> <json>")
|
|
48
|
+
.description("Add a new memory")
|
|
49
|
+
.action(async (type, jsonStr) => {
|
|
50
|
+
try {
|
|
51
|
+
const data = JSON.parse(jsonStr);
|
|
52
|
+
const tags = data.tags;
|
|
53
|
+
const weightVal = data.weight;
|
|
54
|
+
delete data.tags;
|
|
55
|
+
delete data.weight;
|
|
56
|
+
const result = await add(type, data, { tags, weight: weightVal });
|
|
57
|
+
if (result) {
|
|
58
|
+
const name = data.content?.slice(0, 50) || data.topic || data.title || result.id;
|
|
59
|
+
console.log(`Added ${type}: ${name}`);
|
|
60
|
+
console.log(`ID: ${result.id}`);
|
|
61
|
+
if (weightVal)
|
|
62
|
+
console.log(`Weight: ${weightVal}`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.error("Failed to add memory");
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error("Error:", error.message);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
program
|
|
75
|
+
.command("get <id>")
|
|
76
|
+
.description("Get a memory by ID")
|
|
77
|
+
.option("--with-links", "Include linked records")
|
|
78
|
+
.action(async (id, options) => {
|
|
79
|
+
const result = await get(id, options.withLinks);
|
|
80
|
+
if (result) {
|
|
81
|
+
console.log(JSON.stringify(result, null, 2));
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.log("Memory not found");
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
program
|
|
89
|
+
.command("list <type>")
|
|
90
|
+
.description("List memories by type")
|
|
91
|
+
.option("--filter <key=value>", "Filter by field")
|
|
92
|
+
.option("-n, --limit <number>", "Max results", "100")
|
|
93
|
+
.action(async (type, options) => {
|
|
94
|
+
let filterField;
|
|
95
|
+
let filterValue;
|
|
96
|
+
if (options.filter) {
|
|
97
|
+
const [key, value] = options.filter.split("=");
|
|
98
|
+
filterField = key;
|
|
99
|
+
filterValue = value;
|
|
100
|
+
}
|
|
101
|
+
const results = await list(type, {
|
|
102
|
+
filterField,
|
|
103
|
+
filterValue,
|
|
104
|
+
limit: parseInt(options.limit, 10),
|
|
105
|
+
});
|
|
106
|
+
console.log(JSON.stringify(results, null, 2));
|
|
107
|
+
console.log(`\n${results.length} memories`);
|
|
108
|
+
});
|
|
109
|
+
program
|
|
110
|
+
.command("update <id> <json>")
|
|
111
|
+
.description("Update a memory")
|
|
112
|
+
.action(async (id, jsonStr) => {
|
|
113
|
+
try {
|
|
114
|
+
const data = JSON.parse(jsonStr);
|
|
115
|
+
const tags = data.tags;
|
|
116
|
+
delete data.tags;
|
|
117
|
+
const result = await update(id, data, { tags });
|
|
118
|
+
if (result) {
|
|
119
|
+
console.log(`Updated: ${result.id}`);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
console.log("Memory not found");
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
console.error("Error:", error.message);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
program
|
|
132
|
+
.command("delete <id>")
|
|
133
|
+
.description("Delete a memory")
|
|
134
|
+
.action(async (id) => {
|
|
135
|
+
if (await remove(id)) {
|
|
136
|
+
console.log(`Deleted: ${id}`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.log("Memory not found");
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
// =============================================================================
|
|
144
|
+
// Link Commands
|
|
145
|
+
// =============================================================================
|
|
146
|
+
program
|
|
147
|
+
.command("link <from> <relation> <to>")
|
|
148
|
+
.description("Create a link between memories")
|
|
149
|
+
.option("--bi", "Make link bidirectional")
|
|
150
|
+
.action(async (from, relation, to, options) => {
|
|
151
|
+
const result = await link(from, to, relation, {
|
|
152
|
+
bidirectional: options.bi,
|
|
153
|
+
});
|
|
154
|
+
if (result) {
|
|
155
|
+
const arrow = options.bi ? "<--" : "--";
|
|
156
|
+
console.log(`Created link: ${from} ${arrow}${relation}${arrow}> ${to}`);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
console.error("Failed to create link");
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
program
|
|
164
|
+
.command("unlink <from> <relation> <to>")
|
|
165
|
+
.description("Remove a link between memories")
|
|
166
|
+
.action(async (from, relation, to) => {
|
|
167
|
+
if (await unlink(from, to, relation)) {
|
|
168
|
+
console.log(`Removed link: ${from} --${relation}--> ${to}`);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
console.log("Link not found");
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
program
|
|
176
|
+
.command("linked <id> [relation]")
|
|
177
|
+
.description("Get linked memories")
|
|
178
|
+
.option("--dir <direction>", "Direction: outgoing, incoming, or both", "outgoing")
|
|
179
|
+
.action(async (id, relation, options) => {
|
|
180
|
+
const results = await linked(id, { relation, direction: options.dir });
|
|
181
|
+
console.log(JSON.stringify(results, null, 2));
|
|
182
|
+
console.log(`\n${results.length} linked memories`);
|
|
183
|
+
});
|
|
184
|
+
// =============================================================================
|
|
185
|
+
// Search Commands
|
|
186
|
+
// =============================================================================
|
|
187
|
+
program
|
|
188
|
+
.command("search <query>")
|
|
189
|
+
.description("Search memories (hybrid: semantic + keyword)")
|
|
190
|
+
.option("-t, --type <type>", "Filter by type")
|
|
191
|
+
.option("-n, --limit <number>", "Max results", "10")
|
|
192
|
+
.action(async (query, options) => {
|
|
193
|
+
const results = await search(query, {
|
|
194
|
+
type: options.type,
|
|
195
|
+
limit: parseInt(options.limit, 10),
|
|
196
|
+
});
|
|
197
|
+
for (const r of results) {
|
|
198
|
+
const data = r.data;
|
|
199
|
+
const name = data.content?.slice(0, 50) ||
|
|
200
|
+
data.topic ||
|
|
201
|
+
data.title ||
|
|
202
|
+
r.id.slice(0, 8);
|
|
203
|
+
console.log(`[${r.combined_score.toFixed(3)}] ${r.type}: ${name}`);
|
|
204
|
+
const content = data.content ||
|
|
205
|
+
data.notes ||
|
|
206
|
+
data.summary;
|
|
207
|
+
if (content && content.length > 60) {
|
|
208
|
+
console.log(` ${content.slice(0, 100)}...`);
|
|
209
|
+
}
|
|
210
|
+
console.log();
|
|
211
|
+
}
|
|
212
|
+
console.log(`${results.length} results`);
|
|
213
|
+
});
|
|
214
|
+
// =============================================================================
|
|
215
|
+
// Context Commands
|
|
216
|
+
// =============================================================================
|
|
217
|
+
program
|
|
218
|
+
.command("context")
|
|
219
|
+
.description("Get startup context (most relevant memories)")
|
|
220
|
+
.option("-n, --limit <number>", "Max results", "20")
|
|
221
|
+
.option("-t, --types <types>", "Comma-separated types")
|
|
222
|
+
.action(async (options) => {
|
|
223
|
+
const types = options.types
|
|
224
|
+
? options.types.split(",").map((t) => t.trim())
|
|
225
|
+
: undefined;
|
|
226
|
+
const results = await context({
|
|
227
|
+
limit: parseInt(options.limit, 10),
|
|
228
|
+
types,
|
|
229
|
+
});
|
|
230
|
+
console.log("Startup Context (by relevance):\n");
|
|
231
|
+
for (const r of results) {
|
|
232
|
+
const data = r.data;
|
|
233
|
+
const name = data.content?.slice(0, 50) ||
|
|
234
|
+
data.topic ||
|
|
235
|
+
data.title ||
|
|
236
|
+
r.id.slice(0, 8);
|
|
237
|
+
const score = r.relevance_score.toFixed(3);
|
|
238
|
+
console.log(`[${score}] ${r.type}: ${name}`);
|
|
239
|
+
console.log(` weight=${r.weight}, accesses=${r.access_count}`);
|
|
240
|
+
const content = data.content ||
|
|
241
|
+
data.notes ||
|
|
242
|
+
data.summary;
|
|
243
|
+
if (content && content.length > 60) {
|
|
244
|
+
console.log(` ${content.slice(0, 80)}...`);
|
|
245
|
+
}
|
|
246
|
+
console.log();
|
|
247
|
+
}
|
|
248
|
+
console.log(`${results.length} memories`);
|
|
249
|
+
});
|
|
250
|
+
// =============================================================================
|
|
251
|
+
// Relevance Commands
|
|
252
|
+
// =============================================================================
|
|
253
|
+
program
|
|
254
|
+
.command("weight <id> <value>")
|
|
255
|
+
.description("Set importance weight (1=low, 5=default, 10=high)")
|
|
256
|
+
.action(async (id, value) => {
|
|
257
|
+
const weightVal = parseInt(value, 10);
|
|
258
|
+
if (weightVal < 1 || weightVal > 10) {
|
|
259
|
+
console.error("Weight must be between 1 and 10");
|
|
260
|
+
process.exit(1);
|
|
261
|
+
}
|
|
262
|
+
if (await weight(id, weightVal)) {
|
|
263
|
+
console.log(`Set weight=${weightVal} for ${id}`);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
console.error("Failed to set weight");
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
program
|
|
271
|
+
.command("archive <id...>")
|
|
272
|
+
.description("Archive memories (exclude from context)")
|
|
273
|
+
.action(async (ids) => {
|
|
274
|
+
const count = await archive(ids);
|
|
275
|
+
console.log(`Archived ${count} memories`);
|
|
276
|
+
});
|
|
277
|
+
program
|
|
278
|
+
.command("unarchive <id...>")
|
|
279
|
+
.description("Restore archived memories")
|
|
280
|
+
.action(async (ids) => {
|
|
281
|
+
const count = await unarchive(ids);
|
|
282
|
+
console.log(`Unarchived ${count} memories`);
|
|
283
|
+
});
|
|
284
|
+
program
|
|
285
|
+
.command("flush <id...>")
|
|
286
|
+
.description("Reset access count (let relevance decay)")
|
|
287
|
+
.action(async (ids) => {
|
|
288
|
+
const count = await flush(ids);
|
|
289
|
+
console.log(`Flushed ${count} memories (access count reset)`);
|
|
290
|
+
});
|
|
291
|
+
// =============================================================================
|
|
292
|
+
// Setup Commands
|
|
293
|
+
// =============================================================================
|
|
294
|
+
function hasSupabaseCLI() {
|
|
295
|
+
try {
|
|
296
|
+
execSync("which supabase", { stdio: "ignore" });
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
function runSupabaseMigration(sqlFile) {
|
|
304
|
+
try {
|
|
305
|
+
const result = spawnSync("supabase", ["db", "execute", "--file", sqlFile], {
|
|
306
|
+
stdio: "inherit",
|
|
307
|
+
});
|
|
308
|
+
return result.status === 0;
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
function readExistingEnv() {
|
|
315
|
+
const env = {};
|
|
316
|
+
if (existsSync(".env")) {
|
|
317
|
+
const content = readFileSync(".env", "utf8");
|
|
318
|
+
for (const line of content.split("\n")) {
|
|
319
|
+
const match = line.match(/^([^#=]+)=(.*)$/);
|
|
320
|
+
if (match) {
|
|
321
|
+
env[match[1].trim()] = match[2].trim();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return env;
|
|
326
|
+
}
|
|
327
|
+
program
|
|
328
|
+
.command("init")
|
|
329
|
+
.description("Interactive setup")
|
|
330
|
+
.action(async () => {
|
|
331
|
+
p.intro(pc.bgCyan(pc.black(" mem.now ")));
|
|
332
|
+
const existingEnv = readExistingEnv();
|
|
333
|
+
const hasExistingConfig = Object.keys(existingEnv).length > 0;
|
|
334
|
+
if (hasExistingConfig) {
|
|
335
|
+
const shouldContinue = await p.confirm({
|
|
336
|
+
message: "Found existing .env. Reconfigure?",
|
|
337
|
+
initialValue: false,
|
|
338
|
+
});
|
|
339
|
+
if (p.isCancel(shouldContinue) || !shouldContinue) {
|
|
340
|
+
p.outro("Keeping existing configuration.");
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Step 1: Supabase URL
|
|
345
|
+
p.note(`Find at: ${pc.cyan("supabase.com/dashboard/project/<ref>/settings/api")}\n` +
|
|
346
|
+
`Format: ${pc.dim("https://xxxxx.supabase.co")}`, "Supabase Project URL");
|
|
347
|
+
const supabaseUrl = await p.text({
|
|
348
|
+
message: "Supabase URL:",
|
|
349
|
+
placeholder: "https://xxxxx.supabase.co",
|
|
350
|
+
initialValue: existingEnv.SUPABASE_URL || "",
|
|
351
|
+
validate: (value) => {
|
|
352
|
+
if (!value)
|
|
353
|
+
return "Supabase URL is required";
|
|
354
|
+
if (!value.startsWith("https://") || !value.includes("supabase.co")) {
|
|
355
|
+
return "URL should be https://xxxxx.supabase.co";
|
|
356
|
+
}
|
|
357
|
+
return undefined;
|
|
358
|
+
},
|
|
359
|
+
});
|
|
360
|
+
if (p.isCancel(supabaseUrl)) {
|
|
361
|
+
p.cancel("Setup cancelled.");
|
|
362
|
+
process.exit(0);
|
|
363
|
+
}
|
|
364
|
+
// Step 2: Service Key
|
|
365
|
+
p.note(`Find at: ${pc.cyan("Project Settings > API > service_role (secret)")}\n` +
|
|
366
|
+
`${pc.dim("Use the service_role key, not the anon key")}`, "Service Role Key");
|
|
367
|
+
const serviceKey = await p.text({
|
|
368
|
+
message: "Service Key:",
|
|
369
|
+
placeholder: "your-service-role-key",
|
|
370
|
+
initialValue: existingEnv.SUPABASE_SERVICE_KEY || "",
|
|
371
|
+
validate: (value) => {
|
|
372
|
+
if (!value)
|
|
373
|
+
return "Service key is required";
|
|
374
|
+
if (value.length < 20)
|
|
375
|
+
return "Service key seems too short";
|
|
376
|
+
return undefined;
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
if (p.isCancel(serviceKey)) {
|
|
380
|
+
p.cancel("Setup cancelled.");
|
|
381
|
+
process.exit(0);
|
|
382
|
+
}
|
|
383
|
+
// Step 3: OpenAI Key (optional)
|
|
384
|
+
p.note(`Find at: ${pc.cyan("platform.openai.com/api-keys")}\n` +
|
|
385
|
+
`${pc.dim("Optional - enables semantic search. Press enter to skip.")}`, "OpenAI API Key");
|
|
386
|
+
const openaiKey = await p.text({
|
|
387
|
+
message: "OpenAI Key (optional):",
|
|
388
|
+
placeholder: "sk-... (press enter to skip)",
|
|
389
|
+
initialValue: existingEnv.OPENAI_API_KEY || "",
|
|
390
|
+
});
|
|
391
|
+
if (p.isCancel(openaiKey)) {
|
|
392
|
+
p.cancel("Setup cancelled.");
|
|
393
|
+
process.exit(0);
|
|
394
|
+
}
|
|
395
|
+
// Write .env
|
|
396
|
+
let envContent = `# Mem Configuration (mem.now)\n`;
|
|
397
|
+
envContent += `SUPABASE_URL=${supabaseUrl}\n`;
|
|
398
|
+
envContent += `SUPABASE_SERVICE_KEY=${serviceKey}\n`;
|
|
399
|
+
if (openaiKey) {
|
|
400
|
+
envContent += `OPENAI_API_KEY=${openaiKey}\n`;
|
|
401
|
+
}
|
|
402
|
+
writeFileSync(".env", envContent);
|
|
403
|
+
p.log.success("Saved .env");
|
|
404
|
+
// Write migration SQL
|
|
405
|
+
const migrationSql = getMigrationSQL();
|
|
406
|
+
writeFileSync("mem-migration.sql", migrationSql);
|
|
407
|
+
p.log.success("Saved mem-migration.sql");
|
|
408
|
+
// Step 4: Run migration
|
|
409
|
+
const hasCliTool = hasSupabaseCLI();
|
|
410
|
+
if (hasCliTool) {
|
|
411
|
+
const runMigration = await p.confirm({
|
|
412
|
+
message: "Supabase CLI detected. Run migration now?",
|
|
413
|
+
initialValue: true,
|
|
414
|
+
});
|
|
415
|
+
if (!p.isCancel(runMigration) && runMigration) {
|
|
416
|
+
p.note(`Make sure you've linked your project:\n` +
|
|
417
|
+
` ${pc.cyan("supabase link --project-ref <ref>")}`, "Migration");
|
|
418
|
+
const proceed = await p.confirm({
|
|
419
|
+
message: "Proceed with migration?",
|
|
420
|
+
initialValue: true,
|
|
421
|
+
});
|
|
422
|
+
if (!p.isCancel(proceed) && proceed) {
|
|
423
|
+
const spinner = p.spinner();
|
|
424
|
+
spinner.start("Running migration...");
|
|
425
|
+
const success = runSupabaseMigration("mem-migration.sql");
|
|
426
|
+
if (success) {
|
|
427
|
+
spinner.stop("Migration complete!");
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
spinner.stop("Migration failed");
|
|
431
|
+
p.log.warn("Run manually: supabase db execute --file mem-migration.sql");
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
p.note(`Option A: ${pc.cyan("Supabase CLI")}\n` +
|
|
438
|
+
` brew install supabase/tap/supabase\n` +
|
|
439
|
+
` supabase link --project-ref <ref>\n` +
|
|
440
|
+
` supabase db execute --file mem-migration.sql\n\n` +
|
|
441
|
+
`Option B: ${pc.cyan("SQL Editor")}\n` +
|
|
442
|
+
` 1. Open supabase.com/dashboard/project/<ref>/sql\n` +
|
|
443
|
+
` 2. Paste contents of mem-migration.sql\n` +
|
|
444
|
+
` 3. Click Run`, "Apply Schema");
|
|
445
|
+
}
|
|
446
|
+
// Step 5: CLAUDE.md
|
|
447
|
+
const hasClaudeMd = existsSync("CLAUDE.md");
|
|
448
|
+
const claudeMdAction = hasClaudeMd ? "Append to" : "Create";
|
|
449
|
+
const createClaudeMd = await p.confirm({
|
|
450
|
+
message: `${claudeMdAction} CLAUDE.md with Mem instructions?`,
|
|
451
|
+
initialValue: true,
|
|
452
|
+
});
|
|
453
|
+
if (!p.isCancel(createClaudeMd) && createClaudeMd) {
|
|
454
|
+
const claudeContent = getClaudeMdContent();
|
|
455
|
+
if (hasClaudeMd) {
|
|
456
|
+
const existing = readFileSync("CLAUDE.md", "utf8");
|
|
457
|
+
writeFileSync("CLAUDE.md", existing + "\n\n" + claudeContent);
|
|
458
|
+
p.log.success("Appended to CLAUDE.md");
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
writeFileSync("CLAUDE.md", claudeContent);
|
|
462
|
+
p.log.success("Created CLAUDE.md");
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
// Step 6: Install skills
|
|
466
|
+
const installSkillsChoice = await p.select({
|
|
467
|
+
message: "Install Claude Code skills?",
|
|
468
|
+
options: [
|
|
469
|
+
{
|
|
470
|
+
value: "project",
|
|
471
|
+
label: "Project (.claude/skills/mem/)",
|
|
472
|
+
hint: "Only available in this project",
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
value: "global",
|
|
476
|
+
label: "Global (~/.claude/skills/mem/)",
|
|
477
|
+
hint: "Available in all projects",
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
value: "skip",
|
|
481
|
+
label: "Skip",
|
|
482
|
+
hint: "Don't install skills",
|
|
483
|
+
},
|
|
484
|
+
],
|
|
485
|
+
});
|
|
486
|
+
if (!p.isCancel(installSkillsChoice) && installSkillsChoice !== "skip") {
|
|
487
|
+
const memRoot = join(__dirname, "..");
|
|
488
|
+
const { success, path } = installSkills(memRoot, installSkillsChoice);
|
|
489
|
+
if (success) {
|
|
490
|
+
p.log.success(`Installed skills to ${path}`);
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
p.log.warn("Failed to install skills");
|
|
494
|
+
p.log.info("Manual: cp -r node_modules/@anthropic/mem/skills .claude/skills/mem");
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
// Done
|
|
498
|
+
p.note(`${pc.cyan("mem add note")} '{"content": "Hello!"}'\n` +
|
|
499
|
+
`${pc.cyan("mem search")} "hello"\n` +
|
|
500
|
+
`${pc.cyan("mem context")}`, "Test Commands");
|
|
501
|
+
p.outro("Setup complete!");
|
|
502
|
+
});
|
|
503
|
+
function showManualInstructions() {
|
|
504
|
+
p.note(`Option A: ${pc.cyan("Supabase CLI")}\n` +
|
|
505
|
+
` brew install supabase/tap/supabase\n` +
|
|
506
|
+
` supabase link --project-ref <ref>\n` +
|
|
507
|
+
` supabase db execute --file mem-migration.sql\n\n` +
|
|
508
|
+
`Option B: ${pc.cyan("SQL Editor")}\n` +
|
|
509
|
+
` 1. Open supabase.com/dashboard/project/<ref>/sql\n` +
|
|
510
|
+
` 2. Paste contents of mem-migration.sql\n` +
|
|
511
|
+
` 3. Click Run`, "Apply Schema");
|
|
512
|
+
}
|
|
513
|
+
function getClaudeMdContent() {
|
|
514
|
+
return `# Project Memory
|
|
515
|
+
|
|
516
|
+
This project uses [Mem](https://mem.now) for persistent AI memory.
|
|
517
|
+
|
|
518
|
+
## Session Startup
|
|
519
|
+
|
|
520
|
+
Run at the start of each session to load relevant context:
|
|
521
|
+
|
|
522
|
+
\`\`\`bash
|
|
523
|
+
mem context
|
|
524
|
+
\`\`\`
|
|
525
|
+
|
|
526
|
+
## Quick Commands
|
|
527
|
+
|
|
528
|
+
\`\`\`bash
|
|
529
|
+
# Add memories
|
|
530
|
+
mem add note '{"content": "..."}'
|
|
531
|
+
mem add decision '{"topic": "...", "content": "...", "weight": 9}'
|
|
532
|
+
mem add preference '{"content": "...", "weight": 8}'
|
|
533
|
+
|
|
534
|
+
# Search
|
|
535
|
+
mem search "query"
|
|
536
|
+
mem search "query" -t decision
|
|
537
|
+
|
|
538
|
+
# Get context
|
|
539
|
+
mem context
|
|
540
|
+
mem context -n 10 -t decision,preference
|
|
541
|
+
|
|
542
|
+
# Manage relevance
|
|
543
|
+
mem weight <id> 9 # Set importance (1-10)
|
|
544
|
+
mem archive <id> # Exclude from context
|
|
545
|
+
mem unarchive <id> # Restore
|
|
546
|
+
|
|
547
|
+
# Links
|
|
548
|
+
mem link <id1> related_to <id2> --bi # Bidirectional
|
|
549
|
+
mem link <id1> supersedes <id2> # Directional
|
|
550
|
+
\`\`\`
|
|
551
|
+
|
|
552
|
+
## When to Remember
|
|
553
|
+
|
|
554
|
+
**Save to memory when:**
|
|
555
|
+
- User says "remember this", "note that", "save this"
|
|
556
|
+
- A decision is made with its rationale
|
|
557
|
+
- A preference is expressed ("I prefer X over Y")
|
|
558
|
+
- Important context is shared about people/projects
|
|
559
|
+
- A lesson is learned or mistake identified
|
|
560
|
+
|
|
561
|
+
## Memory Types
|
|
562
|
+
|
|
563
|
+
| Type | Use Case | Typical Weight |
|
|
564
|
+
|------|----------|----------------|
|
|
565
|
+
| \`note\` | General information | 5 |
|
|
566
|
+
| \`decision\` | Choices with rationale | 7-9 |
|
|
567
|
+
| \`preference\` | How user likes things | 8-10 |
|
|
568
|
+
| \`insight\` | Learnings, realizations | 6-8 |
|
|
569
|
+
| \`context\` | Background info | 5-7 |
|
|
570
|
+
|
|
571
|
+
## Auto-Remember Triggers
|
|
572
|
+
|
|
573
|
+
Proactively save when you notice:
|
|
574
|
+
- **Preferences**: "I like X", "I prefer Y", "Don't do Z"
|
|
575
|
+
- **Decisions**: "Let's go with A", "We decided B"
|
|
576
|
+
- **Learnings**: "This worked because...", "Next time..."
|
|
577
|
+
- **Corrections**: "Actually, it's X not Y"
|
|
578
|
+
|
|
579
|
+
When auto-remembering, briefly note: "I'll remember that you prefer X."
|
|
580
|
+
|
|
581
|
+
## Proactive Search
|
|
582
|
+
|
|
583
|
+
Before saying "I don't have information about X", search memory:
|
|
584
|
+
|
|
585
|
+
\`\`\`bash
|
|
586
|
+
mem search "X"
|
|
587
|
+
\`\`\`
|
|
588
|
+
|
|
589
|
+
Report findings or note that nothing was found.
|
|
590
|
+
|
|
591
|
+
## Relevance Scoring
|
|
592
|
+
|
|
593
|
+
Score = weight (40%) + access frequency (30%) + recency (30%)
|
|
594
|
+
|
|
595
|
+
- High-weight items always surface
|
|
596
|
+
- Frequently accessed items rise naturally
|
|
597
|
+
- Unused items fade over ~30 days
|
|
598
|
+
- Archive when done to exclude from context
|
|
599
|
+
`;
|
|
600
|
+
}
|
|
601
|
+
function installSkills(memRoot, scope) {
|
|
602
|
+
const skillsSource = join(memRoot, "skills");
|
|
603
|
+
const skillsTarget = scope === "global"
|
|
604
|
+
? join(process.env.HOME || "~", ".claude", "skills", "mem")
|
|
605
|
+
: join(process.cwd(), ".claude", "skills", "mem");
|
|
606
|
+
if (!existsSync(skillsSource)) {
|
|
607
|
+
return { success: false, path: skillsTarget };
|
|
608
|
+
}
|
|
609
|
+
try {
|
|
610
|
+
// Create target directory
|
|
611
|
+
mkdirSync(skillsTarget, { recursive: true });
|
|
612
|
+
// Copy skills
|
|
613
|
+
cpSync(skillsSource, skillsTarget, { recursive: true });
|
|
614
|
+
return { success: true, path: skillsTarget };
|
|
615
|
+
}
|
|
616
|
+
catch {
|
|
617
|
+
return { success: false, path: skillsTarget };
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
program
|
|
621
|
+
.command("migrate")
|
|
622
|
+
.description("Apply database schema to Supabase")
|
|
623
|
+
.option("--dry-run", "Print SQL without executing")
|
|
624
|
+
.action(async (options) => {
|
|
625
|
+
if (options.dryRun) {
|
|
626
|
+
console.log(getMigrationSQL());
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
629
|
+
const migrationSql = getMigrationSQL();
|
|
630
|
+
writeFileSync("mem-migration.sql", migrationSql);
|
|
631
|
+
p.log.success("Saved mem-migration.sql");
|
|
632
|
+
if (hasSupabaseCLI()) {
|
|
633
|
+
const spinner = p.spinner();
|
|
634
|
+
spinner.start("Running migration via Supabase CLI...");
|
|
635
|
+
const success = runSupabaseMigration("mem-migration.sql");
|
|
636
|
+
if (success) {
|
|
637
|
+
spinner.stop("Migration complete!");
|
|
638
|
+
p.note(`${pc.cyan("mem add note")} '{"content": "Test memory"}'\n` +
|
|
639
|
+
`${pc.cyan("mem search")} "test"\n` +
|
|
640
|
+
`${pc.cyan("mem context")}`, "Try it out");
|
|
641
|
+
}
|
|
642
|
+
else {
|
|
643
|
+
spinner.stop("Migration failed");
|
|
644
|
+
showManualInstructions();
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
else {
|
|
648
|
+
p.log.warn("Supabase CLI not found");
|
|
649
|
+
showManualInstructions();
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
// =============================================================================
|
|
653
|
+
// Run
|
|
654
|
+
// =============================================================================
|
|
655
|
+
program.parse();
|
|
656
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|