memax-cli 0.0.1 → 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/commands/auth.d.ts +6 -0
  2. package/dist/commands/auth.d.ts.map +1 -0
  3. package/dist/commands/auth.js +62 -0
  4. package/dist/commands/auth.js.map +1 -0
  5. package/dist/commands/config.d.ts +3 -0
  6. package/dist/commands/config.d.ts.map +1 -0
  7. package/dist/commands/config.js +24 -0
  8. package/dist/commands/config.js.map +1 -0
  9. package/dist/commands/delete.d.ts +4 -0
  10. package/dist/commands/delete.d.ts.map +1 -0
  11. package/dist/commands/delete.js +17 -0
  12. package/dist/commands/delete.js.map +1 -0
  13. package/dist/commands/hook.d.ts +2 -0
  14. package/dist/commands/hook.d.ts.map +1 -0
  15. package/dist/commands/hook.js +189 -0
  16. package/dist/commands/hook.js.map +1 -0
  17. package/dist/commands/list.d.ts +8 -0
  18. package/dist/commands/list.d.ts.map +1 -0
  19. package/dist/commands/list.js +23 -0
  20. package/dist/commands/list.js.map +1 -0
  21. package/dist/commands/login.d.ts +4 -0
  22. package/dist/commands/login.d.ts.map +1 -0
  23. package/dist/commands/login.js +126 -0
  24. package/dist/commands/login.js.map +1 -0
  25. package/dist/commands/mcp.d.ts +3 -0
  26. package/dist/commands/mcp.d.ts.map +1 -0
  27. package/dist/commands/mcp.js +208 -0
  28. package/dist/commands/mcp.js.map +1 -0
  29. package/dist/commands/push.d.ts +11 -0
  30. package/dist/commands/push.d.ts.map +1 -0
  31. package/dist/commands/push.js +64 -0
  32. package/dist/commands/push.js.map +1 -0
  33. package/dist/commands/recall.d.ts +12 -0
  34. package/dist/commands/recall.d.ts.map +1 -0
  35. package/dist/commands/recall.js +106 -0
  36. package/dist/commands/recall.js.map +1 -0
  37. package/dist/commands/show.d.ts +2 -0
  38. package/dist/commands/show.d.ts.map +1 -0
  39. package/dist/commands/show.js +29 -0
  40. package/dist/commands/show.js.map +1 -0
  41. package/dist/commands/sync.d.ts +11 -0
  42. package/dist/commands/sync.d.ts.map +1 -0
  43. package/dist/commands/sync.js +321 -0
  44. package/dist/commands/sync.js.map +1 -0
  45. package/dist/index.d.ts +3 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +121 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/lib/api.d.ts +4 -0
  50. package/dist/lib/api.d.ts.map +1 -0
  51. package/dist/lib/api.js +95 -0
  52. package/dist/lib/api.js.map +1 -0
  53. package/dist/lib/config.d.ts +10 -0
  54. package/dist/lib/config.d.ts.map +1 -0
  55. package/dist/lib/config.js +49 -0
  56. package/dist/lib/config.js.map +1 -0
  57. package/dist/lib/credentials.d.ts +11 -0
  58. package/dist/lib/credentials.d.ts.map +1 -0
  59. package/dist/lib/credentials.js +36 -0
  60. package/dist/lib/credentials.js.map +1 -0
  61. package/package.json +39 -4
  62. package/src/commands/auth.ts +92 -0
  63. package/src/commands/config.ts +27 -0
  64. package/src/commands/delete.ts +20 -0
  65. package/src/commands/hook.ts +243 -0
  66. package/src/commands/list.ts +38 -0
  67. package/src/commands/login.ts +159 -0
  68. package/src/commands/mcp.ts +282 -0
  69. package/src/commands/push.ts +82 -0
  70. package/src/commands/recall.ts +160 -0
  71. package/src/commands/show.ts +35 -0
  72. package/src/commands/sync.ts +403 -0
  73. package/src/index.ts +167 -0
  74. package/src/lib/api.ts +110 -0
  75. package/src/lib/config.ts +61 -0
  76. package/src/lib/credentials.ts +42 -0
  77. package/tsconfig.json +9 -0
  78. package/LICENSE +0 -24
  79. package/README.md +0 -2
  80. package/bin/memax.js +0 -13
@@ -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,3 @@
1
+ export declare function configGetCommand(key: string | undefined): void;
2
+ export declare function configSetCommand(key: string, value: string): void;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -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,4 @@
1
+ export declare function deleteCommand(id: string, options: {
2
+ confirm?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -0,0 +1,17 @@
1
+ import chalk from "chalk";
2
+ import { apiDelete } from "../lib/api.js";
3
+ export async function deleteCommand(id, options) {
4
+ if (!id) {
5
+ console.error(chalk.red("Provide a note ID: memax delete <id>"));
6
+ process.exit(1);
7
+ }
8
+ try {
9
+ await apiDelete(`/v1/notes/${id}`);
10
+ console.log(chalk.green("Deleted"), chalk.gray(id));
11
+ }
12
+ catch (err) {
13
+ console.error(chalk.red(`Delete failed: ${err.message}`));
14
+ process.exit(1);
15
+ }
16
+ }
17
+ //# 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,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAU,EACV,OAA8B;IAE9B,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,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAmB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function hookCommand(action: string, agent: string): void;
2
+ //# sourceMappingURL=hook.d.ts.map
@@ -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,8 @@
1
+ interface ListOptions {
2
+ category?: string;
3
+ state?: string;
4
+ limit?: string;
5
+ }
6
+ export declare function listCommand(options: ListOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=list.d.ts.map
@@ -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,4 @@
1
+ export declare function loginCommand(): Promise<void>;
2
+ export declare function logoutCommand(): Promise<void>;
3
+ export declare function whoamiCommand(): Promise<void>;
4
+ //# sourceMappingURL=login.d.ts.map
@@ -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,CAiHlD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAInD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBnD"}
@@ -0,0 +1,126 @@
1
+ import { createServer } from "node:http";
2
+ import { loadConfig } from "../lib/config.js";
3
+ import { saveCredentials } from "../lib/credentials.js";
4
+ export async function loginCommand() {
5
+ const config = loadConfig();
6
+ const apiUrl = config.api_url;
7
+ // Start a temporary local server to receive the OAuth callback
8
+ const port = await findFreePort();
9
+ const callbackUrl = `http://localhost:${port}/callback`;
10
+ const tokenPromise = new Promise((resolve, reject) => {
11
+ const server = createServer(async (req, res) => {
12
+ const url = new URL(req.url, `http://localhost:${port}`);
13
+ if (url.pathname === "/callback") {
14
+ const code = url.searchParams.get("code");
15
+ if (code) {
16
+ // Exchange the one-time code for tokens via POST
17
+ try {
18
+ const exchangeRes = await fetch(`${apiUrl}/v1/auth/exchange`, {
19
+ method: "POST",
20
+ headers: { "Content-Type": "application/json" },
21
+ body: JSON.stringify({ code }),
22
+ });
23
+ const json = (await exchangeRes.json());
24
+ if (json.data) {
25
+ res.writeHead(200, { "Content-Type": "text/html" });
26
+ res.end(`
27
+ <html><body style="font-family: system-ui; display: flex; align-items: center; justify-content: center; height: 100vh; margin: 0;">
28
+ <div style="text-align: center;">
29
+ <h2 style="font-weight: 600;">Logged in to Memax</h2>
30
+ <p style="color: #64748b;">You can close this tab and return to your terminal.</p>
31
+ </div>
32
+ </body></html>
33
+ `);
34
+ resolve(json.data);
35
+ }
36
+ else {
37
+ res.writeHead(400, { "Content-Type": "text/html" });
38
+ res.end(`<html><body><h2>Login failed</h2><p>${json.error?.message ?? "Token exchange failed."}</p></body></html>`);
39
+ reject(new Error(json.error?.message ?? "Token exchange failed."));
40
+ }
41
+ }
42
+ catch (err) {
43
+ res.writeHead(500, { "Content-Type": "text/html" });
44
+ res.end("<html><body><h2>Login failed</h2><p>Could not reach Memax API.</p></body></html>");
45
+ reject(new Error("Could not reach Memax API for token exchange."));
46
+ }
47
+ }
48
+ else {
49
+ res.writeHead(400, { "Content-Type": "text/html" });
50
+ res.end("<html><body><h2>Login failed</h2><p>No authorization code received.</p></body></html>");
51
+ reject(new Error("No authorization code received from callback."));
52
+ }
53
+ // Close the server after handling the callback
54
+ setTimeout(() => server.close(), 500);
55
+ }
56
+ });
57
+ server.listen(port);
58
+ // Timeout after 2 minutes
59
+ setTimeout(() => {
60
+ server.close();
61
+ reject(new Error("Login timed out — no callback received within 2 minutes."));
62
+ }, 120_000);
63
+ });
64
+ // Build the GitHub OAuth URL with our local callback as the redirect
65
+ const authUrl = `${apiUrl}/v1/auth/github?redirect_uri=${encodeURIComponent(callbackUrl)}`;
66
+ console.log("\n Opening browser for GitHub login...\n");
67
+ console.log(` If the browser doesn't open, visit:\n ${authUrl}\n`);
68
+ // Try to open the browser
69
+ try {
70
+ const { exec } = await import("node:child_process");
71
+ const cmd = process.platform === "darwin"
72
+ ? `open "${authUrl}"`
73
+ : process.platform === "win32"
74
+ ? `start "${authUrl}"`
75
+ : `xdg-open "${authUrl}"`;
76
+ exec(cmd);
77
+ }
78
+ catch {
79
+ // Browser open failed — user can copy the URL
80
+ }
81
+ try {
82
+ const tokens = await tokenPromise;
83
+ saveCredentials({
84
+ access_token: tokens.access_token,
85
+ refresh_token: tokens.refresh_token,
86
+ expires_at: Date.now() + tokens.expires_in * 1000,
87
+ });
88
+ console.log(" Logged in successfully. Credentials saved to ~/.memax/credentials.json\n");
89
+ }
90
+ catch (err) {
91
+ console.error(` Login failed: ${err.message}\n`);
92
+ process.exit(1);
93
+ }
94
+ }
95
+ export async function logoutCommand() {
96
+ const { clearCredentials } = await import("../lib/credentials.js");
97
+ clearCredentials();
98
+ console.log(" Logged out. Credentials cleared.\n");
99
+ }
100
+ export async function whoamiCommand() {
101
+ const { loadCredentials } = await import("../lib/credentials.js");
102
+ const { apiGet } = await import("../lib/api.js");
103
+ const creds = loadCredentials();
104
+ if (!creds?.access_token) {
105
+ console.log(" Not logged in. Run: memax login\n");
106
+ return;
107
+ }
108
+ try {
109
+ const user = await apiGet("/v1/auth/me");
110
+ console.log(` ${user.name} (${user.email})\n`);
111
+ }
112
+ catch {
113
+ console.log(" Session expired or invalid. Run: memax login\n");
114
+ }
115
+ }
116
+ async function findFreePort() {
117
+ return new Promise((resolve) => {
118
+ const server = createServer();
119
+ server.listen(0, () => {
120
+ const addr = server.address();
121
+ const port = typeof addr === "object" && addr ? addr.port : 0;
122
+ server.close(() => resolve(port));
123
+ });
124
+ });
125
+ }
126
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerMcpCommand(program: Command): void;
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgRpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CASzD"}