memax-cli 0.1.0-alpha.12 → 0.1.0-alpha.13
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/assets/memax-memory-skill.md +154 -0
- package/dist/commands/auth.d.ts +1 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +9 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/capture.d.ts +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +3 -3
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/delete.js +5 -5
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/hub.d.ts +4 -0
- package/dist/commands/hub.d.ts.map +1 -0
- package/dist/commands/hub.js +52 -0
- package/dist/commands/hub.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +14 -14
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +22 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +37 -35
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/push.d.ts +1 -0
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +69 -6
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/recall.d.ts +1 -0
- package/dist/commands/recall.d.ts.map +1 -1
- package/dist/commands/recall.js +62 -24
- package/dist/commands/recall.js.map +1 -1
- package/dist/commands/setup.d.ts +1 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +76 -4
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/show.js +9 -9
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/sync.js +3 -3
- package/dist/commands/sync.js.map +1 -1
- package/dist/index.js +20 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +4 -3
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +83 -40
- package/dist/lib/api.js.map +1 -1
- package/package.json +6 -1
- package/.vscode/mcp.json +0 -8
- package/src/commands/auth.ts +0 -92
- package/src/commands/capture.ts +0 -86
- package/src/commands/config.ts +0 -27
- package/src/commands/delete.ts +0 -58
- package/src/commands/hook.ts +0 -243
- package/src/commands/list.ts +0 -92
- package/src/commands/login.ts +0 -164
- package/src/commands/mcp.ts +0 -528
- package/src/commands/push.ts +0 -137
- package/src/commands/recall.ts +0 -163
- package/src/commands/setup.ts +0 -1129
- package/src/commands/show.ts +0 -35
- package/src/commands/sync.ts +0 -506
- package/src/index.ts +0 -210
- package/src/lib/api.ts +0 -110
- package/src/lib/config.ts +0 -61
- package/src/lib/credentials.ts +0 -42
- package/tsconfig.json +0 -9
package/dist/lib/api.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { loadConfig } from "./config.js";
|
|
2
2
|
import { loadCredentials, saveCredentials, isTokenExpired, } from "./credentials.js";
|
|
3
|
+
const MAX_RETRIES = 2;
|
|
4
|
+
const RETRY_DELAY_MS = 1500;
|
|
3
5
|
function getApiUrl() {
|
|
4
6
|
return loadConfig().api_url;
|
|
5
7
|
}
|
|
@@ -39,57 +41,98 @@ async function authHeaders() {
|
|
|
39
41
|
}
|
|
40
42
|
return { Authorization: `Bearer ${creds.access_token}` };
|
|
41
43
|
}
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
let
|
|
44
|
+
async function parseResponse(res, url) {
|
|
45
|
+
const text = await res.text();
|
|
46
|
+
let json;
|
|
45
47
|
try {
|
|
46
|
-
|
|
47
|
-
method: "POST",
|
|
48
|
-
headers: { "Content-Type": "application/json", ...(await authHeaders()) },
|
|
49
|
-
body: JSON.stringify(body),
|
|
50
|
-
});
|
|
48
|
+
json = JSON.parse(text);
|
|
51
49
|
}
|
|
52
50
|
catch {
|
|
53
|
-
|
|
51
|
+
if (res.status === 401) {
|
|
52
|
+
throw new Error("Not authenticated — run `memax login` first");
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`API returned ${res.status} with non-JSON response (${url})`);
|
|
54
55
|
}
|
|
55
|
-
const json = (await res.json());
|
|
56
56
|
if (json.error) {
|
|
57
|
-
throw new
|
|
57
|
+
throw new ApiError(json.error.message, json.error.code, res.status);
|
|
58
58
|
}
|
|
59
59
|
return json.data;
|
|
60
60
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
class ApiError extends Error {
|
|
62
|
+
code;
|
|
63
|
+
status;
|
|
64
|
+
constructor(message, code, status) {
|
|
65
|
+
super(message);
|
|
66
|
+
this.code = code;
|
|
67
|
+
this.status = status;
|
|
68
|
+
this.name = "ApiError";
|
|
68
69
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
70
|
+
}
|
|
71
|
+
function isRetryable(err) {
|
|
72
|
+
return err instanceof ApiError && err.code === "not_ready";
|
|
73
|
+
}
|
|
74
|
+
function sleep(ms) {
|
|
75
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
76
|
+
}
|
|
77
|
+
async function fetchWithRetry(url, init) {
|
|
78
|
+
let lastErr;
|
|
79
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
80
|
+
try {
|
|
81
|
+
let res;
|
|
82
|
+
try {
|
|
83
|
+
res = await fetch(url, init);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
throw new Error(`Cannot reach API at ${url} — is the server running?`);
|
|
87
|
+
}
|
|
88
|
+
return await parseResponse(res, url);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
lastErr = err;
|
|
92
|
+
if (isRetryable(err) && attempt < MAX_RETRIES) {
|
|
93
|
+
await sleep(RETRY_DELAY_MS);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
75
98
|
}
|
|
76
|
-
|
|
99
|
+
throw lastErr;
|
|
77
100
|
}
|
|
78
|
-
export async function
|
|
101
|
+
export async function apiPost(path, body, extraHeaders) {
|
|
79
102
|
const url = `${getApiUrl()}${path}`;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
103
|
+
return fetchWithRetry(url, {
|
|
104
|
+
method: "POST",
|
|
105
|
+
headers: {
|
|
106
|
+
"Content-Type": "application/json",
|
|
107
|
+
...(await authHeaders()),
|
|
108
|
+
...extraHeaders,
|
|
109
|
+
},
|
|
110
|
+
body: JSON.stringify(body),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
export async function apiGet(path, extraHeaders) {
|
|
114
|
+
const url = `${getApiUrl()}${path}`;
|
|
115
|
+
return fetchWithRetry(url, {
|
|
116
|
+
headers: { ...(await authHeaders()), ...extraHeaders },
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
export async function apiPatch(path, body, extraHeaders) {
|
|
120
|
+
const url = `${getApiUrl()}${path}`;
|
|
121
|
+
return fetchWithRetry(url, {
|
|
122
|
+
method: "PATCH",
|
|
123
|
+
headers: {
|
|
124
|
+
"Content-Type": "application/json",
|
|
125
|
+
...(await authHeaders()),
|
|
126
|
+
...extraHeaders,
|
|
127
|
+
},
|
|
128
|
+
body: JSON.stringify(body),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
export async function apiDelete(path, extraHeaders) {
|
|
132
|
+
const url = `${getApiUrl()}${path}`;
|
|
133
|
+
await fetchWithRetry(url, {
|
|
134
|
+
method: "DELETE",
|
|
135
|
+
headers: { ...(await authHeaders()), ...extraHeaders },
|
|
136
|
+
});
|
|
94
137
|
}
|
|
95
138
|
//# sourceMappingURL=api.js.map
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,GACf,MAAM,kBAAkB,CAAC;AAO1B,SAAS,SAAS;IAChB,OAAO,UAAU,EAAE,CAAC,OAAO,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,mEAAmE;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC;IAC/C,CAAC;IAED,0CAA0C;IAC1C,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,YAAY;QAAE,OAAO,EAAE,CAAC;IAEpC,IAAI,cAAc,EAAE,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAC5C,sCAAsC;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,SAAS,EAAE,kBAAkB,CAAC;YAC7C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;aAC7D,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgB,CAAC;YAC/C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,MAAM,GAAG,IAAI,CAAC,IAInB,CAAC;gBACF,eAAe,CAAC;oBACd,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI;iBAClD,CAAC,CAAC;gBACH,OAAO,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,UAAU,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memax-cli",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.13",
|
|
4
4
|
"description": "CLI for Memax — universal context & memory hub for AI agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
|
+
"prebuild": "mkdir -p assets && cp ../../.agents/skills/memax-memory/SKILL.md assets/memax-memory-skill.md",
|
|
16
17
|
"build": "tsc",
|
|
17
18
|
"dev": "tsc --watch",
|
|
18
19
|
"start": "node dist/index.js",
|
|
@@ -40,5 +41,9 @@
|
|
|
40
41
|
"claude-code",
|
|
41
42
|
"agent"
|
|
42
43
|
],
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"assets"
|
|
47
|
+
],
|
|
43
48
|
"license": "UNLICENSED"
|
|
44
49
|
}
|
package/.vscode/mcp.json
DELETED
package/src/commands/auth.ts
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { apiPost, apiGet, apiDelete } from "../lib/api.js";
|
|
2
|
-
|
|
3
|
-
interface APIKeyCreateResponse {
|
|
4
|
-
id: string;
|
|
5
|
-
name: string;
|
|
6
|
-
key: string;
|
|
7
|
-
prefix: string;
|
|
8
|
-
expires_at: string | null;
|
|
9
|
-
created_at: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface APIKeyListItem {
|
|
13
|
-
id: string;
|
|
14
|
-
name: string;
|
|
15
|
-
prefix: string;
|
|
16
|
-
scopes: string[];
|
|
17
|
-
expires_at: string | null;
|
|
18
|
-
last_used: string | null;
|
|
19
|
-
created_at: string;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export async function createKeyCommand(
|
|
23
|
-
name: string,
|
|
24
|
-
opts: { expires?: string },
|
|
25
|
-
): Promise<void> {
|
|
26
|
-
const expiresInDays = opts.expires ? parseInt(opts.expires, 10) : 0;
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
const result = await apiPost<APIKeyCreateResponse>("/v1/auth/api-keys", {
|
|
30
|
-
name,
|
|
31
|
-
expires_in_days: expiresInDays || undefined,
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
console.log("\n API key created successfully.\n");
|
|
35
|
-
console.log(` Name: ${result.name}`);
|
|
36
|
-
console.log(` Key: ${result.key}`);
|
|
37
|
-
if (result.expires_at) {
|
|
38
|
-
console.log(
|
|
39
|
-
` Expires: ${new Date(result.expires_at).toLocaleDateString()}`,
|
|
40
|
-
);
|
|
41
|
-
} else {
|
|
42
|
-
console.log(` Expires: never`);
|
|
43
|
-
}
|
|
44
|
-
console.log("\n ⚠ Save this key now — it cannot be retrieved again.\n");
|
|
45
|
-
console.log(" Usage:");
|
|
46
|
-
console.log(` export MEMAX_API_KEY=${result.key}\n`);
|
|
47
|
-
} catch (err) {
|
|
48
|
-
console.error(` Failed to create API key: ${(err as Error).message}\n`);
|
|
49
|
-
process.exit(1);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export async function listKeysCommand(): Promise<void> {
|
|
54
|
-
try {
|
|
55
|
-
const keys = await apiGet<APIKeyListItem[]>("/v1/auth/api-keys");
|
|
56
|
-
|
|
57
|
-
if (keys.length === 0) {
|
|
58
|
-
console.log(
|
|
59
|
-
"\n No API keys. Create one with: memax auth create-key <name>\n",
|
|
60
|
-
);
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
console.log("\n API Keys:\n");
|
|
65
|
-
for (const key of keys) {
|
|
66
|
-
const expires = key.expires_at
|
|
67
|
-
? new Date(key.expires_at).toLocaleDateString()
|
|
68
|
-
: "never";
|
|
69
|
-
const lastUsed = key.last_used
|
|
70
|
-
? new Date(key.last_used).toLocaleDateString()
|
|
71
|
-
: "never";
|
|
72
|
-
console.log(` ${key.prefix}... ${key.name}`);
|
|
73
|
-
console.log(
|
|
74
|
-
` ID: ${key.id} Expires: ${expires} Last used: ${lastUsed}`,
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
console.log();
|
|
78
|
-
} catch (err) {
|
|
79
|
-
console.error(` Failed to list API keys: ${(err as Error).message}\n`);
|
|
80
|
-
process.exit(1);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export async function revokeKeyCommand(id: string): Promise<void> {
|
|
85
|
-
try {
|
|
86
|
-
await apiDelete(`/v1/auth/api-keys/${id}`);
|
|
87
|
-
console.log("\n API key revoked.\n");
|
|
88
|
-
} catch (err) {
|
|
89
|
-
console.error(` Failed to revoke API key: ${(err as Error).message}\n`);
|
|
90
|
-
process.exit(1);
|
|
91
|
-
}
|
|
92
|
-
}
|
package/src/commands/capture.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
import { apiPost } from "../lib/api.js";
|
|
3
|
-
|
|
4
|
-
interface Note {
|
|
5
|
-
id: string;
|
|
6
|
-
title: string;
|
|
7
|
-
category: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
interface CaptureOptions {
|
|
11
|
-
summary?: string;
|
|
12
|
-
agent?: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* capture-session reads a session transcript from stdin and pushes it
|
|
17
|
-
* to Memax for fact extraction. The extraction pipeline (Claude Haiku)
|
|
18
|
-
* pulls out key decisions, learnings, and context — each becomes a
|
|
19
|
-
* separate searchable note.
|
|
20
|
-
*
|
|
21
|
-
* Usage:
|
|
22
|
-
* memax capture-session --agent claude-code (reads stdin)
|
|
23
|
-
* memax capture-session --summary "Implemented auth system with JWT"
|
|
24
|
-
*/
|
|
25
|
-
export async function captureSessionCommand(
|
|
26
|
-
options: CaptureOptions,
|
|
27
|
-
): Promise<void> {
|
|
28
|
-
let content = "";
|
|
29
|
-
|
|
30
|
-
// Read from stdin if available
|
|
31
|
-
if (!process.stdin.isTTY) {
|
|
32
|
-
const chunks: Buffer[] = [];
|
|
33
|
-
for await (const chunk of process.stdin) {
|
|
34
|
-
chunks.push(chunk);
|
|
35
|
-
}
|
|
36
|
-
content = Buffer.concat(chunks).toString("utf-8").trim();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// If --summary provided, use that as the content (or append to stdin)
|
|
40
|
-
if (options.summary) {
|
|
41
|
-
if (content) {
|
|
42
|
-
content = `## Session Summary\n${options.summary}\n\n## Session Transcript\n${content}`;
|
|
43
|
-
} else {
|
|
44
|
-
content = options.summary;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (!content) {
|
|
49
|
-
console.error(
|
|
50
|
-
chalk.red(
|
|
51
|
-
"No session data. Pipe transcript via stdin or use --summary:\n" +
|
|
52
|
-
" memax capture-session --summary 'Implemented JWT auth'\n" +
|
|
53
|
-
" cat transcript.md | memax capture-session --agent claude-code",
|
|
54
|
-
),
|
|
55
|
-
);
|
|
56
|
-
process.exit(1);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Truncate very long transcripts (keep first + last sections)
|
|
60
|
-
if (content.length > 20000) {
|
|
61
|
-
const head = content.slice(0, 10000);
|
|
62
|
-
const tail = content.slice(-5000);
|
|
63
|
-
content = head + "\n\n[...transcript truncated...]\n\n" + tail;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const agent = options.agent ?? "unknown";
|
|
67
|
-
|
|
68
|
-
try {
|
|
69
|
-
const note = await apiPost<Note>("/v1/notes", {
|
|
70
|
-
content,
|
|
71
|
-
title: `Session capture (${agent}) — ${new Date().toLocaleDateString()}`,
|
|
72
|
-
content_type: "transcript",
|
|
73
|
-
source: `auto-capture/${agent}`,
|
|
74
|
-
category: "chat/agent",
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
console.log(
|
|
78
|
-
chalk.green(" Session captured."),
|
|
79
|
-
chalk.gray(`Facts will be extracted in the background.`),
|
|
80
|
-
);
|
|
81
|
-
console.log(chalk.gray(` id: ${note.id} category: ${note.category}\n`));
|
|
82
|
-
} catch (err) {
|
|
83
|
-
console.error(chalk.red(` Capture failed: ${(err as Error).message}\n`));
|
|
84
|
-
process.exit(1);
|
|
85
|
-
}
|
|
86
|
-
}
|
package/src/commands/config.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
import { loadConfig, saveConfig, getConfigDir } from "../lib/config.js";
|
|
3
|
-
|
|
4
|
-
export function configGetCommand(key: string | undefined): void {
|
|
5
|
-
const config = loadConfig();
|
|
6
|
-
|
|
7
|
-
if (!key) {
|
|
8
|
-
console.log(chalk.gray(`Config directory: ${getConfigDir()}`));
|
|
9
|
-
console.log();
|
|
10
|
-
for (const [k, v] of Object.entries(config)) {
|
|
11
|
-
console.log(`${chalk.bold(k)}: ${v}`);
|
|
12
|
-
}
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const value = (config as unknown as Record<string, unknown>)[key];
|
|
17
|
-
if (value === undefined) {
|
|
18
|
-
console.error(chalk.red(`Unknown config key: ${key}`));
|
|
19
|
-
process.exit(1);
|
|
20
|
-
}
|
|
21
|
-
console.log(String(value));
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function configSetCommand(key: string, value: string): void {
|
|
25
|
-
saveConfig({ [key]: value });
|
|
26
|
-
console.log(chalk.green("Set"), `${key} = ${value}`);
|
|
27
|
-
}
|
package/src/commands/delete.ts
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
import { createInterface } from "node:readline";
|
|
3
|
-
import { apiGet, apiDelete } from "../lib/api.js";
|
|
4
|
-
|
|
5
|
-
interface Note {
|
|
6
|
-
id: string;
|
|
7
|
-
title: string;
|
|
8
|
-
category: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export async function deleteCommand(
|
|
12
|
-
id: string,
|
|
13
|
-
options: { yes?: boolean },
|
|
14
|
-
): Promise<void> {
|
|
15
|
-
if (!id) {
|
|
16
|
-
console.error(chalk.red("Provide a note ID: memax forget <id>"));
|
|
17
|
-
process.exit(1);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Show what's being deleted and confirm
|
|
21
|
-
if (!options.yes) {
|
|
22
|
-
try {
|
|
23
|
-
const note = await apiGet<Note>(`/v1/notes/${id}`);
|
|
24
|
-
console.log(
|
|
25
|
-
chalk.yellow(`\n Delete "${note.title}" [${note.category}]?\n`),
|
|
26
|
-
);
|
|
27
|
-
} catch {
|
|
28
|
-
console.log(chalk.yellow(`\n Delete note ${id}?\n`));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const confirmed = await confirm(" Type y to confirm: ");
|
|
32
|
-
if (!confirmed) {
|
|
33
|
-
console.log(chalk.gray(" Cancelled.\n"));
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
try {
|
|
39
|
-
await apiDelete(`/v1/notes/${id}`);
|
|
40
|
-
console.log(chalk.green(" Forgotten."), chalk.gray(id + "\n"));
|
|
41
|
-
} catch (err) {
|
|
42
|
-
console.error(chalk.red(` Delete failed: ${(err as Error).message}\n`));
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function confirm(prompt: string): Promise<boolean> {
|
|
48
|
-
return new Promise((resolve) => {
|
|
49
|
-
const rl = createInterface({
|
|
50
|
-
input: process.stdin,
|
|
51
|
-
output: process.stdout,
|
|
52
|
-
});
|
|
53
|
-
rl.question(prompt, (answer) => {
|
|
54
|
-
rl.close();
|
|
55
|
-
resolve(answer.trim().toLowerCase() === "y");
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
}
|