@novator-ai/memtask-cli 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/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # MemTask CLI
2
+
3
+ MemTask CLI creates Task Rooms from local context, pulls scoped handoff packets for external agents, pushes results back into the same room, and can run a lightweight pull worker.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @novator-ai/memtask-cli
9
+ ```
10
+
11
+ During local development:
12
+
13
+ ```bash
14
+ npm --workspace @novator-ai/memtask-cli run build
15
+ node packages/cli/dist/bin/memtask.js --help
16
+ ```
17
+
18
+ ## Configure
19
+
20
+ ```bash
21
+ memtask login --email you@example.com
22
+ memtask doctor
23
+ ```
24
+
25
+ Use a non-default backend when testing:
26
+
27
+ ```bash
28
+ memtask login --api-url https://YOUR_CONVEX_SITE.convex.site/cli/v1 --email you@example.com
29
+ ```
30
+
31
+ The config file is stored at `~/.memtask/config.json` with `0600` permissions. You can override it with `MEMTASK_CONFIG`.
32
+
33
+ ## v0.1 Commands
34
+
35
+ ```bash
36
+ memtask room create --workflow failure --from error.log
37
+ memtask packet pull <room-id> --out packet.md
38
+ memtask result push <room-id> --summary result.md --artifact patch.diff
39
+ memtask doctor --json
40
+ ```
41
+
42
+ Supported workflow aliases:
43
+
44
+ - `support`, `support-to-code`
45
+ - `failure`, `failure-room`
46
+ - `founder`, `founder-ticket`
47
+ - `review`, `scope`, `bug`, `general`
48
+
49
+ ## v0.2 Commands
50
+
51
+ Create an external-agent connection:
52
+
53
+ ```bash
54
+ memtask worker connect --name "Local coding agent"
55
+ ```
56
+
57
+ Run a pull worker once:
58
+
59
+ ```bash
60
+ memtask worker run --once --exec 'codex exec < "$MEMTASK_PACKET_PATH"'
61
+ ```
62
+
63
+ Run continuously:
64
+
65
+ ```bash
66
+ memtask worker run --exec 'your-agent-command < "$MEMTASK_PACKET_PATH"'
67
+ ```
68
+
69
+ The worker command provides:
70
+
71
+ - `MEMTASK_PACKET_PATH`
72
+ - `MEMTASK_INVOCATION_ID`
73
+ - `MEMTASK_STEP_ID`
74
+ - `MEMTASK_CONNECTION_ID`
75
+ - `MEMTASK_GATEWAY_BASE_URL`
76
+
77
+ The command stdout becomes the result returned to the Task Room. A non-zero exit code returns a failed result with stdout/stderr attached.
78
+
79
+ Replay a run:
80
+
81
+ ```bash
82
+ memtask replay <run-id>
83
+ memtask replay <run-id> --json
84
+ ```
85
+
86
+ ## Publishing
87
+
88
+ After creating the npm org/scope:
89
+
90
+ ```bash
91
+ npm login
92
+ npm --workspace @novator-ai/memtask-cli version patch
93
+ npm --workspace @novator-ai/memtask-cli publish --access public
94
+ ```
95
+
96
+ If the npm scope changes, update `packages/cli/package.json` `name` first.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { main } from "../index.js";
3
+ import { CliError, errorMessage } from "../lib/errors.js";
4
+ main(process.argv.slice(2)).catch((error) => {
5
+ console.error(errorMessage(error));
6
+ process.exit(error instanceof CliError ? error.exitCode : 1);
7
+ });
8
+ //# sourceMappingURL=memtask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memtask.js","sourceRoot":"","sources":["../../src/bin/memtask.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function main(argv: string[]): Promise<void>;
package/dist/index.js ADDED
@@ -0,0 +1,402 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdtemp, writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import path from "node:path";
5
+ import { parseArgs, flagBoolean, flagNumber, flagString, requirePositional } from "./lib/args.js";
6
+ import { configPath, gatewayBaseFromApiUrl, normalizeBaseUrl, readConfig, resolveApiUrl, resolveToken, writeConfig } from "./lib/config.js";
7
+ import { CliError, errorMessage } from "./lib/errors.js";
8
+ import { apiRequest } from "./lib/http.js";
9
+ import { promptSecret, promptText, readOptionalTextFile, readTextInput, writeOutput } from "./lib/io.js";
10
+ const VERSION = "0.1.0";
11
+ export async function main(argv) {
12
+ const parsed = parseArgs(argv);
13
+ if (flagBoolean(parsed, ["version", "v"]) || parsed.positionals[0] === "version") {
14
+ console.log(VERSION);
15
+ return;
16
+ }
17
+ if (parsed.positionals.length === 0 || flagBoolean(parsed, ["help", "h"])) {
18
+ printHelp();
19
+ return;
20
+ }
21
+ const command = parsed.positionals[0];
22
+ const subcommand = parsed.positionals[1];
23
+ if (command === "login")
24
+ return await commandLogin(stripCommand(parsed, 1));
25
+ if (command === "doctor")
26
+ return await commandDoctor(stripCommand(parsed, 1));
27
+ if (command === "room" && subcommand === "create")
28
+ return await commandRoomCreate(stripCommand(parsed, 2));
29
+ if (command === "packet" && subcommand === "pull")
30
+ return await commandPacketPull(stripCommand(parsed, 2));
31
+ if (command === "result" && subcommand === "push")
32
+ return await commandResultPush(stripCommand(parsed, 2));
33
+ if (command === "worker" && subcommand === "connect")
34
+ return await commandWorkerConnect(stripCommand(parsed, 2));
35
+ if (command === "worker" && subcommand === "run")
36
+ return await commandWorkerRun(stripCommand(parsed, 2));
37
+ if (command === "replay")
38
+ return await commandReplay(stripCommand(parsed, 1));
39
+ throw new CliError(`Unknown command: ${parsed.positionals.join(" ")}`);
40
+ }
41
+ function stripCommand(args, count) {
42
+ return {
43
+ flags: args.flags,
44
+ positionals: args.positionals.slice(count)
45
+ };
46
+ }
47
+ async function commandLogin(args) {
48
+ const config = await readConfig();
49
+ const apiUrl = resolveApiUrl(config, flagString(args, ["api-url"]));
50
+ const email = flagString(args, ["email", "e"]) ?? (await promptText("Email: "));
51
+ const password = flagString(args, ["password", "p"]) ?? process.env.MEMTASK_PASSWORD ?? (await promptSecret("Password: "));
52
+ const result = await apiRequest(apiUrl, "/auth/login", {
53
+ method: "POST",
54
+ body: { email, password }
55
+ });
56
+ await writeConfig({
57
+ ...config,
58
+ apiUrl,
59
+ sessionToken: result.sessionToken,
60
+ user: result.user
61
+ });
62
+ if (flagBoolean(args, ["json"])) {
63
+ console.log(JSON.stringify({ ok: true, apiUrl, user: result.user, expiresAt: result.expiresAt }, null, 2));
64
+ return;
65
+ }
66
+ console.log(`Logged in as ${result.user?.email ?? result.user?.username ?? result.user?.userId ?? "MemTask user"}.`);
67
+ console.log(`Config: ${configPath()}`);
68
+ }
69
+ async function commandDoctor(args) {
70
+ const config = await readConfig();
71
+ const apiUrl = resolveApiUrl(config, flagString(args, ["api-url"]));
72
+ const token = resolveToken(config, flagString(args, ["token"]));
73
+ const local = {
74
+ configPath: configPath(),
75
+ apiUrl,
76
+ authenticated: Boolean(token),
77
+ workerConfigured: Boolean(resolveWorkerConfig(config, apiUrl, args, false).connectionId && resolveWorkerConfig(config, apiUrl, args, false).token)
78
+ };
79
+ const checks = { local };
80
+ if (token) {
81
+ checks.api = await apiRequest(apiUrl, "/doctor", { token });
82
+ }
83
+ const worker = resolveWorkerConfig(config, apiUrl, args, false);
84
+ if (worker.connectionId && worker.token) {
85
+ checks.worker = await apiRequest(worker.gatewayBaseUrl, `/a2a/discover?connectionId=${encodeURIComponent(worker.connectionId)}`, {
86
+ token: worker.token,
87
+ timeoutMs: 20_000
88
+ }).catch((error) => ({ ok: false, error: errorMessage(error) }));
89
+ }
90
+ if (flagBoolean(args, ["json"])) {
91
+ console.log(JSON.stringify(checks, null, 2));
92
+ return;
93
+ }
94
+ console.log("MemTask CLI doctor");
95
+ console.log(`- Config: ${local.configPath}`);
96
+ console.log(`- API: ${apiUrl}`);
97
+ console.log(`- Login: ${local.authenticated ? "configured" : "missing"}`);
98
+ if (checks.api) {
99
+ const api = checks.api;
100
+ console.log(`- Backend: ${api.ok ? "ok" : "error"}`);
101
+ if (api.checks) {
102
+ console.log(`- Rooms: ${api.checks.rooms}`);
103
+ console.log(`- External connections: ${api.checks.externalConnections} (${api.checks.activeConnections} active)`);
104
+ }
105
+ }
106
+ if (checks.worker) {
107
+ const workerResult = checks.worker;
108
+ console.log(`- Worker gateway: ${workerResult.ok === false ? `error (${workerResult.error})` : "ok"}`);
109
+ }
110
+ }
111
+ async function commandRoomCreate(args) {
112
+ const { apiUrl, token } = await requireSession(args);
113
+ const workflow = flagString(args, ["workflow", "w"], "general");
114
+ const sourcePath = flagString(args, ["from", "f"]);
115
+ const sourceText = await readTextInput(sourcePath, "--from");
116
+ const sourceName = flagString(args, ["source-name"]) ?? (sourcePath && sourcePath !== "-" ? path.basename(sourcePath) : "stdin.txt");
117
+ const title = flagString(args, ["title", "t"]);
118
+ const result = await apiRequest(apiUrl, "/rooms", {
119
+ method: "POST",
120
+ token,
121
+ body: { workflow, sourceName, sourceText, title }
122
+ });
123
+ if (flagBoolean(args, ["json"])) {
124
+ console.log(JSON.stringify(result, null, 2));
125
+ return;
126
+ }
127
+ console.log(`Created room: ${result.title}`);
128
+ console.log(`Room ID: ${result.taskId}`);
129
+ console.log(`Workflow: ${result.workflowKind}`);
130
+ console.log(`Pull packet: memtask packet pull ${result.taskId}`);
131
+ }
132
+ async function commandPacketPull(args) {
133
+ const { apiUrl, token } = await requireSession(args);
134
+ const roomId = requirePositional(args, 0, "room id");
135
+ const format = flagString(args, ["format"], "markdown") === "json" ? "json" : "markdown";
136
+ const out = flagString(args, ["out", "o"]);
137
+ if (format === "markdown") {
138
+ const markdown = await apiRequest(apiUrl, `/rooms/${encodeURIComponent(roomId)}/packet?format=markdown&raw=1`, {
139
+ token,
140
+ rawText: true
141
+ });
142
+ await writeOutput(out, markdown);
143
+ return;
144
+ }
145
+ const payload = await apiRequest(apiUrl, `/rooms/${encodeURIComponent(roomId)}/packet?format=json`, { token });
146
+ await writeOutput(out, JSON.stringify(payload, null, 2));
147
+ }
148
+ async function commandResultPush(args) {
149
+ const { apiUrl, token } = await requireSession(args);
150
+ const roomId = requirePositional(args, 0, "room id");
151
+ const summaryPath = flagString(args, ["summary", "s"]);
152
+ const artifactPath = flagString(args, ["artifact", "a"]);
153
+ const summaryText = await readTextInput(summaryPath, "--summary");
154
+ const artifactText = await readOptionalTextFile(artifactPath);
155
+ const artifactName = flagString(args, ["artifact-name"]) ?? (artifactPath && artifactPath !== "-" ? path.basename(artifactPath) : undefined);
156
+ const result = await apiRequest(apiUrl, `/rooms/${encodeURIComponent(roomId)}/results`, {
157
+ method: "POST",
158
+ token,
159
+ body: { summaryText, artifactName, artifactText }
160
+ });
161
+ if (flagBoolean(args, ["json"])) {
162
+ console.log(JSON.stringify(result, null, 2));
163
+ return;
164
+ }
165
+ console.log(`Result pushed to room ${roomId}.`);
166
+ console.log(`Delivery ID: ${result.deliveryId}`);
167
+ }
168
+ async function commandWorkerConnect(args) {
169
+ const config = await readConfig();
170
+ const { apiUrl, token } = await requireSession(args, config);
171
+ const name = flagString(args, ["name", "n"], "MemTask CLI Worker");
172
+ const description = flagString(args, ["description", "d"], "External agent connected through the MemTask CLI. It receives scoped packets and returns results to the Task Room.");
173
+ const result = await apiRequest(apiUrl, "/workers/connect", {
174
+ method: "POST",
175
+ token,
176
+ body: { name, description, runtimeKind: flagString(args, ["runtime-kind"], "local_runtime") }
177
+ });
178
+ const gatewayBaseUrl = gatewayBaseFromApiUrl(apiUrl);
179
+ await writeConfig({
180
+ ...config,
181
+ apiUrl,
182
+ sessionToken: token,
183
+ worker: {
184
+ gatewayBaseUrl,
185
+ connectionId: result.connectionId,
186
+ gatewayToken: result.token,
187
+ label: name
188
+ }
189
+ });
190
+ if (flagBoolean(args, ["json"])) {
191
+ console.log(JSON.stringify({ ...result, gatewayBaseUrl }, null, 2));
192
+ return;
193
+ }
194
+ console.log("External agent connection created.");
195
+ console.log(`Connection ID: ${result.connectionId}`);
196
+ console.log(`Gateway: ${gatewayBaseUrl}`);
197
+ console.log(`Token: ${result.tokenPreview ?? maskToken(result.token)}`);
198
+ console.log("");
199
+ console.log("For a VM or CI worker:");
200
+ console.log(`export MEMTASK_GATEWAY_BASE_URL=${shellQuote(gatewayBaseUrl)}`);
201
+ console.log(`export MEMTASK_CONNECTION_ID=${shellQuote(result.connectionId)}`);
202
+ console.log(`export MEMTASK_GATEWAY_TOKEN=${shellQuote(result.token)}`);
203
+ console.log("memtask worker run --exec 'your-agent-command < \"$MEMTASK_PACKET_PATH\"'");
204
+ }
205
+ async function commandWorkerRun(args) {
206
+ const config = await readConfig();
207
+ const apiUrl = resolveApiUrl(config, flagString(args, ["api-url"]));
208
+ const worker = resolveWorkerConfig(config, apiUrl, args, true);
209
+ const once = flagBoolean(args, ["once"]);
210
+ const intervalMs = Math.max(1000, flagNumber(args, ["interval"], 5000));
211
+ const execCommand = flagString(args, ["exec"]);
212
+ const printOnly = flagBoolean(args, ["print-only"]);
213
+ if (!execCommand && !printOnly) {
214
+ throw new CliError("worker run needs --exec <command> or --print-only.");
215
+ }
216
+ while (true) {
217
+ const found = await runOneWorkerPoll(worker, { execCommand, printOnly });
218
+ if (once) {
219
+ if (!found)
220
+ console.log("No queued work.");
221
+ return;
222
+ }
223
+ await sleep(found ? 250 : intervalMs);
224
+ }
225
+ }
226
+ async function runOneWorkerPoll(worker, options) {
227
+ const poll = await apiRequest(worker.gatewayBaseUrl, `/a2a/tasks/poll?connectionId=${encodeURIComponent(worker.connectionId)}`, { token: worker.token });
228
+ const invocationId = poll.invocationId ?? poll.invocation?.invocationId;
229
+ const stepId = poll.stepId ?? poll.invocation?.stepId ?? poll.invocation?.activeStep?.stepId;
230
+ if (!invocationId) {
231
+ return false;
232
+ }
233
+ await appendWorkerEvent(worker, invocationId, stepId, "agent.stream", "MemTask CLI worker picked up this task.");
234
+ const detail = await apiRequest(worker.gatewayBaseUrl, `/a2a/tasks/get?connectionId=${encodeURIComponent(worker.connectionId)}&invocationId=${encodeURIComponent(invocationId)}${stepId ? `&stepId=${encodeURIComponent(stepId)}` : ""}`, { token: worker.token });
235
+ const packet = detail.invocation ?? detail.envelope ?? detail;
236
+ const packetPath = await writePacketFile(invocationId, packet);
237
+ if (options.printOnly) {
238
+ console.log(JSON.stringify(packet, null, 2));
239
+ await submitWorkerResult(worker, invocationId, stepId, "blocked", "Packet printed by MemTask CLI worker; no executor was run.", "Printed packet.");
240
+ return true;
241
+ }
242
+ const result = await runShell(options.execCommand ?? "", {
243
+ MEMTASK_PACKET_PATH: packetPath,
244
+ MEMTASK_INVOCATION_ID: invocationId,
245
+ MEMTASK_STEP_ID: stepId ?? "",
246
+ MEMTASK_CONNECTION_ID: worker.connectionId,
247
+ MEMTASK_GATEWAY_BASE_URL: worker.gatewayBaseUrl
248
+ });
249
+ const body = [result.stdout.trim(), result.stderr.trim() ? `\n\nstderr:\n${result.stderr.trim()}` : ""].join("").trim();
250
+ if (result.code === 0) {
251
+ await submitWorkerResult(worker, invocationId, stepId, "completed", body || "Executor completed without output.", firstLine(body) || "Executor completed.");
252
+ }
253
+ else {
254
+ await submitWorkerResult(worker, invocationId, stepId, "failed", body || `Executor exited with code ${result.code}.`, `Executor failed with code ${result.code}.`);
255
+ }
256
+ console.log(`Processed invocation ${invocationId}${stepId ? ` step ${stepId}` : ""}: exit ${result.code}`);
257
+ return true;
258
+ }
259
+ async function commandReplay(args) {
260
+ const { apiUrl, token } = await requireSession(args);
261
+ const runId = requirePositional(args, 0, "run id");
262
+ const result = await apiRequest(apiUrl, `/runs/${encodeURIComponent(runId)}/replay`, { token });
263
+ if (flagBoolean(args, ["json"])) {
264
+ console.log(JSON.stringify(result, null, 2));
265
+ return;
266
+ }
267
+ const invocation = result.invocation ?? {};
268
+ console.log(`Run ${invocation.id ?? runId}`);
269
+ console.log(`Status: ${invocation.status ?? "unknown"}`);
270
+ console.log(`Mode: ${invocation.mode ?? "unknown"}`);
271
+ if (result.plan) {
272
+ console.log("Plan: available");
273
+ }
274
+ const steps = Array.isArray(result.steps) ? result.steps : [];
275
+ if (steps.length) {
276
+ console.log("Steps:");
277
+ for (const step of steps) {
278
+ console.log(`- ${step.title ?? step.role ?? "Step"}: ${step.status ?? "unknown"}${step.outputSummary ? ` · ${step.outputSummary}` : ""}`);
279
+ }
280
+ }
281
+ const events = Array.isArray(result.events) ? result.events.slice(-8) : [];
282
+ if (events.length) {
283
+ console.log("Recent events:");
284
+ for (const event of events) {
285
+ console.log(`- ${event.type}: ${event.message}`);
286
+ }
287
+ }
288
+ }
289
+ async function requireSession(args, preloadedConfig) {
290
+ const config = preloadedConfig ?? (await readConfig());
291
+ const apiUrl = resolveApiUrl(config, flagString(args, ["api-url"]));
292
+ const token = resolveToken(config, flagString(args, ["token"]));
293
+ if (!token) {
294
+ throw new CliError("Not logged in. Run: memtask login --email <email>");
295
+ }
296
+ return { config, apiUrl, token };
297
+ }
298
+ function resolveWorkerConfig(config, apiUrl, args, required) {
299
+ const gatewayBaseUrl = normalizeBaseUrl(flagString(args, ["gateway-url"]) ??
300
+ process.env.MEMTASK_GATEWAY_BASE_URL ??
301
+ config.worker?.gatewayBaseUrl ??
302
+ gatewayBaseFromApiUrl(apiUrl));
303
+ const connectionId = flagString(args, ["connection-id"]) ?? process.env.MEMTASK_CONNECTION_ID ?? config.worker?.connectionId ?? "";
304
+ const token = flagString(args, ["gateway-token"]) ?? process.env.MEMTASK_GATEWAY_TOKEN ?? config.worker?.gatewayToken ?? "";
305
+ if (required && (!connectionId || !token)) {
306
+ throw new CliError("Worker is not connected. Run: memtask worker connect");
307
+ }
308
+ return { gatewayBaseUrl, connectionId, token };
309
+ }
310
+ async function appendWorkerEvent(worker, invocationId, stepId, type, message) {
311
+ await apiRequest(worker.gatewayBaseUrl, "/a2a/tasks/event", {
312
+ method: "POST",
313
+ token: worker.token,
314
+ body: { invocationId, connectionId: worker.connectionId, stepId, type, message }
315
+ }).catch(() => undefined);
316
+ }
317
+ async function submitWorkerResult(worker, invocationId, stepId, status, resultText, summary) {
318
+ return await apiRequest(worker.gatewayBaseUrl, "/a2a/tasks/result", {
319
+ method: "POST",
320
+ token: worker.token,
321
+ body: {
322
+ invocationId,
323
+ connectionId: worker.connectionId,
324
+ stepId,
325
+ status,
326
+ resultText,
327
+ summary,
328
+ artifactName: status === "completed" ? "CLI Worker Result" : "CLI Worker Update"
329
+ }
330
+ });
331
+ }
332
+ async function writePacketFile(invocationId, packet) {
333
+ const dir = await mkdtemp(path.join(tmpdir(), "memtask-"));
334
+ const file = path.join(dir, `${sanitizeFilename(invocationId)}.json`);
335
+ await writeFile(file, JSON.stringify(packet, null, 2), "utf8");
336
+ return file;
337
+ }
338
+ function runShell(command, env) {
339
+ return new Promise((resolve) => {
340
+ const child = spawn(command, {
341
+ shell: true,
342
+ env: { ...process.env, ...env },
343
+ stdio: ["ignore", "pipe", "pipe"]
344
+ });
345
+ const stdout = [];
346
+ const stderr = [];
347
+ child.stdout.on("data", (chunk) => stdout.push(Buffer.from(chunk)));
348
+ child.stderr.on("data", (chunk) => stderr.push(Buffer.from(chunk)));
349
+ child.on("close", (code) => {
350
+ resolve({
351
+ code: code ?? 1,
352
+ stdout: Buffer.concat(stdout).toString("utf8"),
353
+ stderr: Buffer.concat(stderr).toString("utf8")
354
+ });
355
+ });
356
+ });
357
+ }
358
+ function printHelp() {
359
+ console.log(`MemTask CLI ${VERSION}
360
+
361
+ Usage:
362
+ memtask login --email you@example.com
363
+ memtask doctor
364
+ memtask room create --workflow failure --from error.log
365
+ memtask packet pull <room-id> --out packet.md
366
+ memtask result push <room-id> --summary result.md --artifact patch.diff
367
+ memtask worker connect --name "Local agent"
368
+ memtask worker run --exec 'your-agent < "$MEMTASK_PACKET_PATH"'
369
+ memtask replay <run-id>
370
+
371
+ Global flags:
372
+ --api-url <url> MemTask CLI API. Default: https://mem-task.com/cli/v1
373
+ --token <token> Session token override.
374
+ --json Print machine-readable JSON.
375
+
376
+ Environment:
377
+ MEMTASK_API_URL, MEMTASK_TOKEN, MEMTASK_CONFIG
378
+ MEMTASK_GATEWAY_BASE_URL, MEMTASK_CONNECTION_ID, MEMTASK_GATEWAY_TOKEN`);
379
+ }
380
+ function maskToken(token) {
381
+ if (token.length <= 10) {
382
+ return "<configured>";
383
+ }
384
+ return `${token.slice(0, 6)}...${token.slice(-4)}`;
385
+ }
386
+ function shellQuote(value) {
387
+ return `'${value.replace(/'/g, "'\\''")}'`;
388
+ }
389
+ function sanitizeFilename(value) {
390
+ return value.replace(/[^a-zA-Z0-9._-]+/g, "_").slice(0, 120) || "packet";
391
+ }
392
+ function firstLine(value) {
393
+ return value
394
+ .split(/\r?\n/)
395
+ .map((line) => line.trim())
396
+ .find(Boolean)
397
+ ?.slice(0, 220);
398
+ }
399
+ function sleep(ms) {
400
+ return new Promise((resolve) => setTimeout(resolve, ms));
401
+ }
402
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type ParsedArgs = {
2
+ positionals: string[];
3
+ flags: Record<string, string | boolean | string[]>;
4
+ };
5
+ export declare function parseArgs(argv: string[]): ParsedArgs;
6
+ export declare function flagString(args: ParsedArgs, names: string[], fallback?: string): string | undefined;
7
+ export declare function flagNumber(args: ParsedArgs, names: string[], fallback: number): number;
8
+ export declare function flagBoolean(args: ParsedArgs, names: string[]): boolean;
9
+ export declare function requirePositional(args: ParsedArgs, index: number, label: string): string;
@@ -0,0 +1,106 @@
1
+ import { CliError } from "./errors.js";
2
+ export function parseArgs(argv) {
3
+ const positionals = [];
4
+ const flags = {};
5
+ let i = 0;
6
+ while (i < argv.length) {
7
+ const token = argv[i] ?? "";
8
+ if (token === "--") {
9
+ positionals.push(...argv.slice(i + 1));
10
+ break;
11
+ }
12
+ if (!token.startsWith("-") || token === "-") {
13
+ positionals.push(token);
14
+ i += 1;
15
+ continue;
16
+ }
17
+ if (token.startsWith("--")) {
18
+ const raw = token.slice(2);
19
+ const eqIndex = raw.indexOf("=");
20
+ const name = eqIndex >= 0 ? raw.slice(0, eqIndex) : raw;
21
+ if (!name) {
22
+ throw new CliError(`Invalid flag: ${token}`);
23
+ }
24
+ const inlineValue = eqIndex >= 0 ? raw.slice(eqIndex + 1) : undefined;
25
+ const next = argv[i + 1];
26
+ const value = inlineValue ?? (next && !next.startsWith("-") ? next : true);
27
+ setFlag(flags, name, value);
28
+ i += inlineValue === undefined && typeof value === "string" ? 2 : 1;
29
+ continue;
30
+ }
31
+ const short = token.slice(1);
32
+ if (short.length > 1 && !short.includes("=")) {
33
+ for (const name of short) {
34
+ setFlag(flags, name, true);
35
+ }
36
+ i += 1;
37
+ continue;
38
+ }
39
+ const [name, inlineValue] = short.split("=", 2);
40
+ const next = argv[i + 1];
41
+ const value = inlineValue ?? (next && !next.startsWith("-") ? next : true);
42
+ setFlag(flags, name, value);
43
+ i += inlineValue === undefined && typeof value === "string" ? 2 : 1;
44
+ }
45
+ return { positionals, flags };
46
+ }
47
+ function setFlag(flags, name, value) {
48
+ const existing = flags[name];
49
+ if (existing === undefined) {
50
+ flags[name] = value;
51
+ }
52
+ else if (Array.isArray(existing)) {
53
+ existing.push(String(value));
54
+ }
55
+ else {
56
+ flags[name] = [String(existing), String(value)];
57
+ }
58
+ }
59
+ export function flagString(args, names, fallback) {
60
+ for (const name of names) {
61
+ const value = args.flags[name];
62
+ if (typeof value === "string" && value.length > 0) {
63
+ return value;
64
+ }
65
+ if (Array.isArray(value) && value.length > 0) {
66
+ return value[value.length - 1];
67
+ }
68
+ }
69
+ return fallback;
70
+ }
71
+ export function flagNumber(args, names, fallback) {
72
+ const value = flagString(args, names);
73
+ if (value === undefined) {
74
+ return fallback;
75
+ }
76
+ const parsed = Number(value);
77
+ if (!Number.isFinite(parsed)) {
78
+ throw new CliError(`Expected a number for --${names[0]}.`);
79
+ }
80
+ return parsed;
81
+ }
82
+ export function flagBoolean(args, names) {
83
+ for (const name of names) {
84
+ const value = args.flags[name];
85
+ if (value === undefined) {
86
+ continue;
87
+ }
88
+ if (typeof value === "boolean") {
89
+ return value;
90
+ }
91
+ const normalized = String(Array.isArray(value) ? value[value.length - 1] : value).toLowerCase();
92
+ if (["0", "false", "no", "off"].includes(normalized)) {
93
+ return false;
94
+ }
95
+ return true;
96
+ }
97
+ return false;
98
+ }
99
+ export function requirePositional(args, index, label) {
100
+ const value = args.positionals[index];
101
+ if (!value) {
102
+ throw new CliError(`Missing ${label}.`);
103
+ }
104
+ return value;
105
+ }
106
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/lib/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export type MemTaskConfig = {
2
+ apiUrl?: string;
3
+ sessionToken?: string;
4
+ user?: {
5
+ userId?: string;
6
+ email?: string;
7
+ username?: string;
8
+ };
9
+ worker?: {
10
+ gatewayBaseUrl?: string;
11
+ connectionId?: string;
12
+ gatewayToken?: string;
13
+ label?: string;
14
+ };
15
+ };
16
+ export declare const defaultApiUrl = "https://mem-task.com/cli/v1";
17
+ export declare function configPath(): string;
18
+ export declare function readConfig(): Promise<MemTaskConfig>;
19
+ export declare function writeConfig(config: MemTaskConfig): Promise<void>;
20
+ export declare function resolveApiUrl(config: MemTaskConfig, override?: string): string;
21
+ export declare function resolveToken(config: MemTaskConfig, override?: string): string;
22
+ export declare function gatewayBaseFromApiUrl(apiUrl: string): string;
23
+ export declare function normalizeBaseUrl(value: string): string;
@@ -0,0 +1,42 @@
1
+ import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import path from "node:path";
4
+ import { CliError } from "./errors.js";
5
+ export const defaultApiUrl = "https://mem-task.com/cli/v1";
6
+ export function configPath() {
7
+ return process.env.MEMTASK_CONFIG || path.join(homedir(), ".memtask", "config.json");
8
+ }
9
+ export async function readConfig() {
10
+ try {
11
+ const raw = await readFile(configPath(), "utf8");
12
+ return JSON.parse(raw);
13
+ }
14
+ catch (error) {
15
+ if (error.code === "ENOENT") {
16
+ return {};
17
+ }
18
+ if (error instanceof SyntaxError) {
19
+ throw new CliError(`Invalid MemTask config JSON: ${configPath()}`);
20
+ }
21
+ return {};
22
+ }
23
+ }
24
+ export async function writeConfig(config) {
25
+ const file = configPath();
26
+ await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
27
+ await writeFile(file, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
28
+ await chmod(file, 0o600).catch(() => undefined);
29
+ }
30
+ export function resolveApiUrl(config, override) {
31
+ return normalizeBaseUrl(override || process.env.MEMTASK_API_URL || config.apiUrl || defaultApiUrl);
32
+ }
33
+ export function resolveToken(config, override) {
34
+ return override || process.env.MEMTASK_TOKEN || config.sessionToken || "";
35
+ }
36
+ export function gatewayBaseFromApiUrl(apiUrl) {
37
+ return normalizeBaseUrl(apiUrl.replace(/\/cli\/v1\/?$/i, ""));
38
+ }
39
+ export function normalizeBaseUrl(value) {
40
+ return value.replace(/\/+$/g, "");
41
+ }
42
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAkBvC,MAAM,CAAC,MAAM,aAAa,GAAG,6BAA6B,CAAC;AAE3D,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,QAAQ,CAAC,gCAAgC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAqB;IACrD,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;IAC1B,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAqB,EAAE,QAAiB;IACpE,OAAO,gBAAgB,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAqB,EAAE,QAAiB;IACnE,OAAO,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,OAAO,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare class CliError extends Error {
2
+ exitCode: number;
3
+ constructor(message: string, exitCode?: number);
4
+ }
5
+ export declare function errorMessage(error: unknown): string;
@@ -0,0 +1,15 @@
1
+ export class CliError extends Error {
2
+ exitCode;
3
+ constructor(message, exitCode = 1) {
4
+ super(message);
5
+ this.name = "CliError";
6
+ this.exitCode = exitCode;
7
+ }
8
+ }
9
+ export function errorMessage(error) {
10
+ if (error instanceof Error) {
11
+ return error.message;
12
+ }
13
+ return String(error ?? "Unknown error");
14
+ }
15
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAS;IAEjB,YAAY,OAAe,EAAE,QAAQ,GAAG,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { CliError } from "./errors.js";
2
+ export type RequestOptions = {
3
+ method?: "GET" | "POST";
4
+ token?: string;
5
+ body?: unknown;
6
+ rawText?: boolean;
7
+ timeoutMs?: number;
8
+ };
9
+ export declare class MemTaskHttpError extends CliError {
10
+ status: number;
11
+ constructor(status: number, message: string);
12
+ }
13
+ export declare function apiRequest<T>(baseUrl: string, path: string, options?: RequestOptions): Promise<T>;
@@ -0,0 +1,56 @@
1
+ import { CliError } from "./errors.js";
2
+ export class MemTaskHttpError extends CliError {
3
+ status;
4
+ constructor(status, message) {
5
+ super(message, status === 401 || status === 403 ? 2 : 1);
6
+ this.name = "MemTaskHttpError";
7
+ this.status = status;
8
+ }
9
+ }
10
+ export async function apiRequest(baseUrl, path, options = {}) {
11
+ const url = path.startsWith("http") ? path : `${baseUrl}${path.startsWith("/") ? path : `/${path}`}`;
12
+ const controller = new AbortController();
13
+ const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 120_000);
14
+ try {
15
+ const response = await fetch(url, {
16
+ method: options.method ?? (options.body === undefined ? "GET" : "POST"),
17
+ signal: controller.signal,
18
+ headers: {
19
+ Accept: options.rawText ? "text/plain" : "application/json",
20
+ ...(options.body === undefined ? {} : { "Content-Type": "application/json" }),
21
+ ...(options.token ? { Authorization: `Bearer ${options.token}` } : {})
22
+ },
23
+ ...(options.body === undefined ? {} : { body: JSON.stringify(options.body) })
24
+ });
25
+ if (options.rawText) {
26
+ const text = await response.text();
27
+ if (!response.ok) {
28
+ throw new MemTaskHttpError(response.status, text || `HTTP ${response.status}`);
29
+ }
30
+ return text;
31
+ }
32
+ const payload = (await response.json().catch(() => ({})));
33
+ if (!response.ok || payload.ok === false) {
34
+ const message = typeof payload.error === "string"
35
+ ? payload.error
36
+ : typeof payload.error?.message === "string"
37
+ ? String(payload.error.message)
38
+ : `HTTP ${response.status}`;
39
+ throw new MemTaskHttpError(response.status, message);
40
+ }
41
+ return payload;
42
+ }
43
+ catch (error) {
44
+ if (error instanceof MemTaskHttpError) {
45
+ throw error;
46
+ }
47
+ if (error instanceof Error && error.name === "AbortError") {
48
+ throw new CliError(`Request timed out: ${url}`);
49
+ }
50
+ throw error;
51
+ }
52
+ finally {
53
+ clearTimeout(timeout);
54
+ }
55
+ }
56
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAUvC,MAAM,OAAO,gBAAiB,SAAQ,QAAQ;IAC5C,MAAM,CAAS;IAEf,YAAY,MAAc,EAAE,OAAe;QACzC,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAI,OAAe,EAAE,IAAY,EAAE,UAA0B,EAAE;IAC7F,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IACrG,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC;IACnF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YACvE,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE;gBACP,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB;gBAC3D,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;gBAC7E,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvE;YACD,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;SAC9E,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,IAAS,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;QACrF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YACzC,MAAM,OAAO,GACX,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAC/B,CAAC,CAAC,OAAO,CAAC,KAAK;gBACf,CAAC,CAAC,OAAQ,OAAO,CAAC,KAA+B,EAAE,OAAO,KAAK,QAAQ;oBACrE,CAAC,CAAC,MAAM,CAAE,OAAO,CAAC,KAA6B,CAAC,OAAO,CAAC;oBACxD,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,OAAY,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,IAAI,QAAQ,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function readTextInput(source: string | undefined, label: string): Promise<string>;
2
+ export declare function readOptionalTextFile(source: string | undefined): Promise<string | undefined>;
3
+ export declare function writeOutput(destination: string | undefined, body: string): Promise<void>;
4
+ export declare function readStdin(): Promise<string>;
5
+ export declare function promptText(question: string): Promise<string>;
6
+ export declare function promptSecret(question: string): Promise<string>;
package/dist/lib/io.js ADDED
@@ -0,0 +1,83 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { stdin as input, stdout as output } from "node:process";
4
+ import readline from "node:readline/promises";
5
+ import { CliError } from "./errors.js";
6
+ export async function readTextInput(source, label) {
7
+ if (!source) {
8
+ throw new CliError(`Missing ${label}. Use --from <file> or --from -.`);
9
+ }
10
+ if (source === "-") {
11
+ return await readStdin();
12
+ }
13
+ return await readFile(path.resolve(source), "utf8");
14
+ }
15
+ export async function readOptionalTextFile(source) {
16
+ if (!source) {
17
+ return undefined;
18
+ }
19
+ if (source === "-") {
20
+ return await readStdin();
21
+ }
22
+ return await readFile(path.resolve(source), "utf8");
23
+ }
24
+ export async function writeOutput(destination, body) {
25
+ if (!destination || destination === "-") {
26
+ console.log(body);
27
+ return;
28
+ }
29
+ await writeFile(path.resolve(destination), body, "utf8");
30
+ }
31
+ export async function readStdin() {
32
+ const chunks = [];
33
+ for await (const chunk of input) {
34
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
35
+ }
36
+ return Buffer.concat(chunks).toString("utf8");
37
+ }
38
+ export async function promptText(question) {
39
+ const rl = readline.createInterface({ input, output });
40
+ try {
41
+ return (await rl.question(question)).trim();
42
+ }
43
+ finally {
44
+ rl.close();
45
+ }
46
+ }
47
+ export async function promptSecret(question) {
48
+ if (!input.isTTY) {
49
+ throw new CliError("Password is required. Pass --password or set MEMTASK_PASSWORD in non-interactive shells.");
50
+ }
51
+ output.write(question);
52
+ input.setRawMode(true);
53
+ input.resume();
54
+ let value = "";
55
+ return await new Promise((resolve, reject) => {
56
+ const cleanup = () => {
57
+ input.setRawMode(false);
58
+ input.pause();
59
+ input.off("data", onData);
60
+ output.write("\n");
61
+ };
62
+ const onData = (buffer) => {
63
+ const char = buffer.toString("utf8");
64
+ if (char === "\u0003") {
65
+ cleanup();
66
+ reject(new CliError("Cancelled.", 130));
67
+ return;
68
+ }
69
+ if (char === "\r" || char === "\n") {
70
+ cleanup();
71
+ resolve(value);
72
+ return;
73
+ }
74
+ if (char === "\u007f" || char === "\b") {
75
+ value = value.slice(0, -1);
76
+ return;
77
+ }
78
+ value += char;
79
+ };
80
+ input.on("data", onData);
81
+ });
82
+ }
83
+ //# sourceMappingURL=io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/lib/io.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@novator-ai/memtask-cli",
3
+ "version": "0.1.0",
4
+ "description": "MemTask CLI for Task Rooms, handoff packets, external workers, and run replay.",
5
+ "type": "module",
6
+ "bin": {
7
+ "memtask": "./dist/bin/memtask.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc -p tsconfig.json && chmod +x dist/bin/memtask.js",
15
+ "typecheck": "tsc --noEmit -p tsconfig.json",
16
+ "prepublishOnly": "npm run build && node ./dist/bin/memtask.js --version"
17
+ },
18
+ "engines": {
19
+ "node": ">=20.10.0"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^24.10.1",
26
+ "typescript": "^5.6.3"
27
+ }
28
+ }