memax-cli 0.0.1 → 0.1.0-alpha.10
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/.vscode/mcp.json +8 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +62 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/capture.d.ts +17 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +61 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +24 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/delete.d.ts +4 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +45 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/hook.d.ts +2 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +189 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/list.d.ts +8 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +23 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +131 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +384 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/push.d.ts +11 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +98 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/recall.d.ts +12 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +107 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/setup.d.ts +16 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +869 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/show.d.ts +2 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +29 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/sync.d.ts +12 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +414 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +168 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +4 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +95 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +10 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +49 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/credentials.d.ts +11 -0
- package/dist/lib/credentials.d.ts.map +1 -0
- package/dist/lib/credentials.js +36 -0
- package/dist/lib/credentials.js.map +1 -0
- package/package.json +39 -4
- package/src/commands/auth.ts +92 -0
- package/src/commands/capture.ts +86 -0
- package/src/commands/config.ts +27 -0
- package/src/commands/delete.ts +58 -0
- package/src/commands/hook.ts +243 -0
- package/src/commands/list.ts +38 -0
- package/src/commands/login.ts +164 -0
- package/src/commands/mcp.ts +490 -0
- package/src/commands/push.ts +137 -0
- package/src/commands/recall.ts +163 -0
- package/src/commands/setup.ts +1129 -0
- package/src/commands/show.ts +35 -0
- package/src/commands/sync.ts +506 -0
- package/src/index.ts +223 -0
- package/src/lib/api.ts +110 -0
- package/src/lib/config.ts +61 -0
- package/src/lib/credentials.ts +42 -0
- package/tsconfig.json +9 -0
- package/LICENSE +0 -24
- package/README.md +0 -2
- package/bin/memax.js +0 -13
package/.vscode/mcp.json
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function createKeyCommand(name: string, opts: {
|
|
2
|
+
expires?: string;
|
|
3
|
+
}): Promise<void>;
|
|
4
|
+
export declare function listKeysCommand(): Promise<void>;
|
|
5
|
+
export declare function revokeKeyCommand(id: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAqBA,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BrD;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { apiPost, apiGet, apiDelete } from "../lib/api.js";
|
|
2
|
+
export async function createKeyCommand(name, opts) {
|
|
3
|
+
const expiresInDays = opts.expires ? parseInt(opts.expires, 10) : 0;
|
|
4
|
+
try {
|
|
5
|
+
const result = await apiPost("/v1/auth/api-keys", {
|
|
6
|
+
name,
|
|
7
|
+
expires_in_days: expiresInDays || undefined,
|
|
8
|
+
});
|
|
9
|
+
console.log("\n API key created successfully.\n");
|
|
10
|
+
console.log(` Name: ${result.name}`);
|
|
11
|
+
console.log(` Key: ${result.key}`);
|
|
12
|
+
if (result.expires_at) {
|
|
13
|
+
console.log(` Expires: ${new Date(result.expires_at).toLocaleDateString()}`);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
console.log(` Expires: never`);
|
|
17
|
+
}
|
|
18
|
+
console.log("\n ⚠ Save this key now — it cannot be retrieved again.\n");
|
|
19
|
+
console.log(" Usage:");
|
|
20
|
+
console.log(` export MEMAX_API_KEY=${result.key}\n`);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
console.error(` Failed to create API key: ${err.message}\n`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function listKeysCommand() {
|
|
28
|
+
try {
|
|
29
|
+
const keys = await apiGet("/v1/auth/api-keys");
|
|
30
|
+
if (keys.length === 0) {
|
|
31
|
+
console.log("\n No API keys. Create one with: memax auth create-key <name>\n");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
console.log("\n API Keys:\n");
|
|
35
|
+
for (const key of keys) {
|
|
36
|
+
const expires = key.expires_at
|
|
37
|
+
? new Date(key.expires_at).toLocaleDateString()
|
|
38
|
+
: "never";
|
|
39
|
+
const lastUsed = key.last_used
|
|
40
|
+
? new Date(key.last_used).toLocaleDateString()
|
|
41
|
+
: "never";
|
|
42
|
+
console.log(` ${key.prefix}... ${key.name}`);
|
|
43
|
+
console.log(` ID: ${key.id} Expires: ${expires} Last used: ${lastUsed}`);
|
|
44
|
+
}
|
|
45
|
+
console.log();
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
console.error(` Failed to list API keys: ${err.message}\n`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function revokeKeyCommand(id) {
|
|
53
|
+
try {
|
|
54
|
+
await apiDelete(`/v1/auth/api-keys/${id}`);
|
|
55
|
+
console.log("\n API key revoked.\n");
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
console.error(` Failed to revoke API key: ${err.message}\n`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface CaptureOptions {
|
|
2
|
+
summary?: string;
|
|
3
|
+
agent?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* capture-session reads a session transcript from stdin and pushes it
|
|
7
|
+
* to Memax for fact extraction. The extraction pipeline (Claude Haiku)
|
|
8
|
+
* pulls out key decisions, learnings, and context — each becomes a
|
|
9
|
+
* separate searchable note.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* memax capture-session --agent claude-code (reads stdin)
|
|
13
|
+
* memax capture-session --summary "Implemented auth system with JWT"
|
|
14
|
+
*/
|
|
15
|
+
export declare function captureSessionCommand(options: CaptureOptions): Promise<void>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AASA,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CA2Df"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { apiPost } from "../lib/api.js";
|
|
3
|
+
/**
|
|
4
|
+
* capture-session reads a session transcript from stdin and pushes it
|
|
5
|
+
* to Memax for fact extraction. The extraction pipeline (Claude Haiku)
|
|
6
|
+
* pulls out key decisions, learnings, and context — each becomes a
|
|
7
|
+
* separate searchable note.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* memax capture-session --agent claude-code (reads stdin)
|
|
11
|
+
* memax capture-session --summary "Implemented auth system with JWT"
|
|
12
|
+
*/
|
|
13
|
+
export async function captureSessionCommand(options) {
|
|
14
|
+
let content = "";
|
|
15
|
+
// Read from stdin if available
|
|
16
|
+
if (!process.stdin.isTTY) {
|
|
17
|
+
const chunks = [];
|
|
18
|
+
for await (const chunk of process.stdin) {
|
|
19
|
+
chunks.push(chunk);
|
|
20
|
+
}
|
|
21
|
+
content = Buffer.concat(chunks).toString("utf-8").trim();
|
|
22
|
+
}
|
|
23
|
+
// If --summary provided, use that as the content (or append to stdin)
|
|
24
|
+
if (options.summary) {
|
|
25
|
+
if (content) {
|
|
26
|
+
content = `## Session Summary\n${options.summary}\n\n## Session Transcript\n${content}`;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
content = options.summary;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (!content) {
|
|
33
|
+
console.error(chalk.red("No session data. Pipe transcript via stdin or use --summary:\n" +
|
|
34
|
+
" memax capture-session --summary 'Implemented JWT auth'\n" +
|
|
35
|
+
" cat transcript.md | memax capture-session --agent claude-code"));
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Truncate very long transcripts (keep first + last sections)
|
|
39
|
+
if (content.length > 20000) {
|
|
40
|
+
const head = content.slice(0, 10000);
|
|
41
|
+
const tail = content.slice(-5000);
|
|
42
|
+
content = head + "\n\n[...transcript truncated...]\n\n" + tail;
|
|
43
|
+
}
|
|
44
|
+
const agent = options.agent ?? "unknown";
|
|
45
|
+
try {
|
|
46
|
+
const note = await apiPost("/v1/notes", {
|
|
47
|
+
content,
|
|
48
|
+
title: `Session capture (${agent}) — ${new Date().toLocaleDateString()}`,
|
|
49
|
+
content_type: "transcript",
|
|
50
|
+
source: `auto-capture/${agent}`,
|
|
51
|
+
category: "chat/agent",
|
|
52
|
+
});
|
|
53
|
+
console.log(chalk.green(" Session captured."), chalk.gray(`Facts will be extracted in the background.`));
|
|
54
|
+
console.log(chalk.gray(` id: ${note.id} category: ${note.category}\n`));
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
console.error(chalk.red(` Capture failed: ${err.message}\n`));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAaxC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAuB;IAEvB,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,+BAA+B;IAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,CAAC;IAED,sEAAsE;IACtE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,GAAG,uBAAuB,OAAO,CAAC,OAAO,8BAA8B,OAAO,EAAE,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,gEAAgE;YAC9D,4DAA4D;YAC5D,iEAAiE,CACpE,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8DAA8D;IAC9D,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,GAAG,IAAI,GAAG,sCAAsC,GAAG,IAAI,CAAC;IACjE,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAO,WAAW,EAAE;YAC5C,OAAO;YACP,KAAK,EAAE,oBAAoB,KAAK,OAAO,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,EAAE;YACxE,YAAY,EAAE,YAAY;YAC1B,MAAM,EAAE,gBAAgB,KAAK,EAAE;YAC/B,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAClC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,eAAe,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAsB,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAkB9D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGjE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadConfig, saveConfig, getConfigDir } from "../lib/config.js";
|
|
3
|
+
export function configGetCommand(key) {
|
|
4
|
+
const config = loadConfig();
|
|
5
|
+
if (!key) {
|
|
6
|
+
console.log(chalk.gray(`Config directory: ${getConfigDir()}`));
|
|
7
|
+
console.log();
|
|
8
|
+
for (const [k, v] of Object.entries(config)) {
|
|
9
|
+
console.log(`${chalk.bold(k)}: ${v}`);
|
|
10
|
+
}
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const value = config[key];
|
|
14
|
+
if (value === undefined) {
|
|
15
|
+
console.error(chalk.red(`Unknown config key: ${key}`));
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
console.log(String(value));
|
|
19
|
+
}
|
|
20
|
+
export function configSetCommand(key, value) {
|
|
21
|
+
saveConfig({ [key]: value });
|
|
22
|
+
console.log(chalk.green("Set"), `${key} = ${value}`);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAExE,MAAM,UAAU,gBAAgB,CAAC,GAAuB;IACtD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAI,MAA6C,CAAC,GAAG,CAAC,CAAC;IAClE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,KAAa;IACzD,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAUA,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import { apiGet, apiDelete } from "../lib/api.js";
|
|
4
|
+
export async function deleteCommand(id, options) {
|
|
5
|
+
if (!id) {
|
|
6
|
+
console.error(chalk.red("Provide a note ID: memax forget <id>"));
|
|
7
|
+
process.exit(1);
|
|
8
|
+
}
|
|
9
|
+
// Show what's being deleted and confirm
|
|
10
|
+
if (!options.yes) {
|
|
11
|
+
try {
|
|
12
|
+
const note = await apiGet(`/v1/notes/${id}`);
|
|
13
|
+
console.log(chalk.yellow(`\n Delete "${note.title}" [${note.category}]?\n`));
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
console.log(chalk.yellow(`\n Delete note ${id}?\n`));
|
|
17
|
+
}
|
|
18
|
+
const confirmed = await confirm(" Type y to confirm: ");
|
|
19
|
+
if (!confirmed) {
|
|
20
|
+
console.log(chalk.gray(" Cancelled.\n"));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
await apiDelete(`/v1/notes/${id}`);
|
|
26
|
+
console.log(chalk.green(" Forgotten."), chalk.gray(id + "\n"));
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.error(chalk.red(` Delete failed: ${err.message}\n`));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function confirm(prompt) {
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
const rl = createInterface({
|
|
36
|
+
input: process.stdin,
|
|
37
|
+
output: process.stdout,
|
|
38
|
+
});
|
|
39
|
+
rl.question(prompt, (answer) => {
|
|
40
|
+
rl.close();
|
|
41
|
+
resolve(answer.trim().toLowerCase() === "y");
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAQlD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAU,EACV,OAA0B;IAE1B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAO,aAAa,EAAE,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,QAAQ,MAAM,CAAC,CACjE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAqB,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,eAAe,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"AAeA,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAoB/D"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync, } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
const SUPPORTED_AGENTS = ["claude-code"];
|
|
6
|
+
export function hookCommand(action, agent) {
|
|
7
|
+
if (!SUPPORTED_AGENTS.includes(agent)) {
|
|
8
|
+
console.error(chalk.red(`Unsupported agent: ${agent}`));
|
|
9
|
+
console.error(chalk.gray(`Supported: ${SUPPORTED_AGENTS.join(", ")}`));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
switch (action) {
|
|
13
|
+
case "install":
|
|
14
|
+
installHook(agent);
|
|
15
|
+
break;
|
|
16
|
+
case "uninstall":
|
|
17
|
+
uninstallHook(agent);
|
|
18
|
+
break;
|
|
19
|
+
default:
|
|
20
|
+
console.error(chalk.red(`Unknown action: ${action}. Use install or uninstall.`));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function installHook(agent) {
|
|
25
|
+
switch (agent) {
|
|
26
|
+
case "claude-code":
|
|
27
|
+
installClaudeCodeHook();
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function uninstallHook(agent) {
|
|
32
|
+
switch (agent) {
|
|
33
|
+
case "claude-code":
|
|
34
|
+
uninstallClaudeCodeHook();
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function installClaudeCodeHook() {
|
|
39
|
+
// Write the hook script to ~/.memax/hooks/
|
|
40
|
+
const hooksDir = join(homedir(), ".memax", "hooks");
|
|
41
|
+
mkdirSync(hooksDir, { recursive: true });
|
|
42
|
+
const scriptPath = join(hooksDir, "claude-code-recall.sh");
|
|
43
|
+
writeFileSync(scriptPath, CLAUDE_CODE_HOOK_SCRIPT);
|
|
44
|
+
chmodSync(scriptPath, 0o755);
|
|
45
|
+
// Update Claude Code settings (~/.claude/settings.json)
|
|
46
|
+
const claudeSettingsDir = join(homedir(), ".claude");
|
|
47
|
+
const claudeSettingsFile = join(claudeSettingsDir, "settings.json");
|
|
48
|
+
mkdirSync(claudeSettingsDir, { recursive: true });
|
|
49
|
+
let settings = {};
|
|
50
|
+
if (existsSync(claudeSettingsFile)) {
|
|
51
|
+
try {
|
|
52
|
+
settings = JSON.parse(readFileSync(claudeSettingsFile, "utf-8"));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Start fresh if parse fails
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Add the hook
|
|
59
|
+
const hooks = (settings.hooks ?? {});
|
|
60
|
+
const hookEntry = {
|
|
61
|
+
matcher: "",
|
|
62
|
+
hooks: [
|
|
63
|
+
{
|
|
64
|
+
type: "command",
|
|
65
|
+
command: scriptPath,
|
|
66
|
+
timeout: 30,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
// Check if already installed
|
|
71
|
+
const existing = hooks["UserPromptSubmit"];
|
|
72
|
+
if (existing?.some((h) => h.hooks?.some((hh) => hh.command?.includes("memax")))) {
|
|
73
|
+
console.log(chalk.yellow("Memax hook is already installed for Claude Code."));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
hooks["UserPromptSubmit"] = [...(hooks["UserPromptSubmit"] ?? []), hookEntry];
|
|
77
|
+
settings.hooks = hooks;
|
|
78
|
+
writeFileSync(claudeSettingsFile, JSON.stringify(settings, null, 2) + "\n");
|
|
79
|
+
console.log(chalk.green("Memax hook installed for Claude Code"));
|
|
80
|
+
console.log();
|
|
81
|
+
console.log(chalk.gray(" Hook script:"), scriptPath);
|
|
82
|
+
console.log(chalk.gray(" Settings:"), claudeSettingsFile);
|
|
83
|
+
console.log();
|
|
84
|
+
console.log(chalk.gray(" Every prompt you type in Claude Code will now recall relevant\n" +
|
|
85
|
+
" knowledge from Memax and inject it as context automatically."));
|
|
86
|
+
console.log();
|
|
87
|
+
console.log(chalk.gray(" Make sure the Memax API server is running:"));
|
|
88
|
+
console.log(chalk.gray(" cd packages/server && go run ./cmd/server"));
|
|
89
|
+
console.log();
|
|
90
|
+
console.log(chalk.gray(" To also enable MCP tools, add to your Claude Code settings:"));
|
|
91
|
+
console.log(chalk.gray(` {
|
|
92
|
+
"mcpServers": {
|
|
93
|
+
"memax": {
|
|
94
|
+
"command": "memax",
|
|
95
|
+
"args": ["mcp", "serve"]
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}`));
|
|
99
|
+
}
|
|
100
|
+
function uninstallClaudeCodeHook() {
|
|
101
|
+
const claudeSettingsFile = join(homedir(), ".claude", "settings.json");
|
|
102
|
+
if (!existsSync(claudeSettingsFile)) {
|
|
103
|
+
console.log(chalk.yellow("No Claude Code settings found. Nothing to uninstall."));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const settings = JSON.parse(readFileSync(claudeSettingsFile, "utf-8"));
|
|
108
|
+
const hooks = settings.hooks;
|
|
109
|
+
if (hooks?.["UserPromptSubmit"]) {
|
|
110
|
+
hooks["UserPromptSubmit"] = hooks["UserPromptSubmit"].filter((h) => !h.hooks?.some((hh) => hh.command?.includes("memax")));
|
|
111
|
+
if (hooks["UserPromptSubmit"].length === 0) {
|
|
112
|
+
delete hooks["UserPromptSubmit"];
|
|
113
|
+
}
|
|
114
|
+
settings.hooks = hooks;
|
|
115
|
+
writeFileSync(claudeSettingsFile, JSON.stringify(settings, null, 2) + "\n");
|
|
116
|
+
}
|
|
117
|
+
console.log(chalk.green("Memax hook uninstalled from Claude Code."));
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
console.error(chalk.red("Failed to read Claude Code settings."));
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const CLAUDE_CODE_HOOK_SCRIPT = `#!/bin/bash
|
|
125
|
+
# Memax context injection hook for Claude Code
|
|
126
|
+
# Installed by: memax hook install claude-code
|
|
127
|
+
# This runs on every prompt, recalls relevant knowledge, and injects it.
|
|
128
|
+
|
|
129
|
+
set -e
|
|
130
|
+
|
|
131
|
+
# Read hook input from stdin
|
|
132
|
+
INPUT=$(cat)
|
|
133
|
+
PROMPT=$(echo "$INPUT" | jq -r '.prompt // empty')
|
|
134
|
+
CWD=$(echo "$INPUT" | jq -r '.cwd // empty')
|
|
135
|
+
|
|
136
|
+
# Skip if no prompt
|
|
137
|
+
if [ -z "$PROMPT" ]; then
|
|
138
|
+
exit 0
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
# Skip trivial prompts (less than 10 chars, or just "yes"/"no"/etc.)
|
|
142
|
+
if [ \${#PROMPT} -lt 10 ]; then
|
|
143
|
+
exit 0
|
|
144
|
+
fi
|
|
145
|
+
|
|
146
|
+
# Skip if prompt looks like a simple confirmation
|
|
147
|
+
case "$PROMPT" in
|
|
148
|
+
[Yy]|[Yy]es|[Nn]|[Nn]o|ok|OK|Ok|sure|Sure|thanks|Thanks|y|n)
|
|
149
|
+
exit 0
|
|
150
|
+
;;
|
|
151
|
+
esac
|
|
152
|
+
|
|
153
|
+
# Change to the session's working directory
|
|
154
|
+
if [ -n "$CWD" ]; then
|
|
155
|
+
cd "$CWD" 2>/dev/null || true
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
# Find memax CLI — check common locations
|
|
159
|
+
MEMAX=""
|
|
160
|
+
if command -v memax &>/dev/null; then
|
|
161
|
+
MEMAX="memax"
|
|
162
|
+
elif [ -x "$HOME/.memax/bin/memax" ]; then
|
|
163
|
+
MEMAX="$HOME/.memax/bin/memax"
|
|
164
|
+
else
|
|
165
|
+
# Try to find it via node
|
|
166
|
+
for dir in "$CWD" "$HOME"; do
|
|
167
|
+
if [ -f "$dir/packages/cli/dist/index.js" ]; then
|
|
168
|
+
MEMAX="node $dir/packages/cli/dist/index.js"
|
|
169
|
+
break
|
|
170
|
+
fi
|
|
171
|
+
done
|
|
172
|
+
fi
|
|
173
|
+
|
|
174
|
+
# Gracefully exit if memax not found
|
|
175
|
+
if [ -z "$MEMAX" ]; then
|
|
176
|
+
exit 0
|
|
177
|
+
fi
|
|
178
|
+
|
|
179
|
+
# Recall context and output it (stdout is injected into Claude's context)
|
|
180
|
+
CONTEXT=$($MEMAX recall "$PROMPT" --hook --limit 5 --max-tokens 3000 2>/dev/null) || exit 0
|
|
181
|
+
|
|
182
|
+
# Only output if we got results
|
|
183
|
+
if [ -n "$CONTEXT" ] && [ "$CONTEXT" != "<memax-context>" ]; then
|
|
184
|
+
echo "$CONTEXT"
|
|
185
|
+
fi
|
|
186
|
+
|
|
187
|
+
exit 0
|
|
188
|
+
`;
|
|
189
|
+
//# sourceMappingURL=hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/commands/hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BrE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { apiGet } from "../lib/api.js";
|
|
3
|
+
export async function listCommand(options) {
|
|
4
|
+
try {
|
|
5
|
+
const notes = (await apiGet("/v1/notes")) ?? [];
|
|
6
|
+
if (notes.length === 0) {
|
|
7
|
+
console.log(chalk.yellow("No notes yet. Push your first one:"));
|
|
8
|
+
console.log(chalk.gray(" memax push --file ./README.md"));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
console.log(chalk.blue(`${notes.length} note${notes.length > 1 ? "s" : ""}`));
|
|
12
|
+
console.log();
|
|
13
|
+
for (const note of notes) {
|
|
14
|
+
console.log(chalk.bold(note.title), chalk.gray(`[${note.category}]`), chalk.gray(`· ${note.source}`));
|
|
15
|
+
console.log(chalk.gray(` id: ${note.id}`));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
console.error(chalk.red(`List failed: ${err.message}`));
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AASvC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAoB;IACpD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAS,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;QAExD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACjE,CAAC;QACF,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EACtB,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,EAChC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAC/B,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAiB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAUA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAsHlD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAInD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBnD"}
|