@upstash/box-cli 0.1.3 → 0.1.4
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 +29 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +7 -9
- package/dist/auth.js.map +1 -1
- package/dist/commands/connect.d.ts +3 -6
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +15 -15
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/create.d.ts +7 -7
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +26 -27
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/from-snapshot.d.ts +8 -11
- package/dist/commands/from-snapshot.d.ts.map +1 -1
- package/dist/commands/from-snapshot.js +26 -27
- package/dist/commands/from-snapshot.js.map +1 -1
- package/dist/commands/get.d.ts +2 -2
- package/dist/commands/get.js +4 -4
- package/dist/commands/init-demo.d.ts +15 -0
- package/dist/commands/init-demo.d.ts.map +1 -0
- package/dist/commands/init-demo.js +202 -0
- package/dist/commands/init-demo.js.map +1 -0
- package/dist/commands/list.d.ts +2 -2
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +15 -15
- package/dist/commands/list.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +45 -34
- package/dist/index.js.map +1 -1
- package/dist/output.d.ts +1 -1
- package/dist/output.js +3 -3
- package/dist/repl-commands/delete.d.ts +1 -1
- package/dist/repl-commands/delete.js +4 -4
- package/dist/repl-commands/exec.d.ts +1 -1
- package/dist/repl-commands/exec.js +9 -8
- package/dist/repl-commands/files.d.ts +1 -1
- package/dist/repl-commands/files.js +53 -53
- package/dist/repl-commands/git.d.ts +1 -1
- package/dist/repl-commands/git.js +32 -32
- package/dist/repl-commands/pause.d.ts +6 -0
- package/dist/repl-commands/pause.d.ts.map +1 -0
- package/dist/repl-commands/pause.js +9 -0
- package/dist/repl-commands/pause.js.map +1 -0
- package/dist/repl-commands/run.d.ts +1 -1
- package/dist/repl-commands/run.js +9 -9
- package/dist/repl-commands/snapshot.d.ts +1 -1
- package/dist/repl-commands/snapshot.js +4 -4
- package/dist/repl.d.ts +1 -1
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +51 -47
- package/dist/repl.js.map +1 -1
- package/package.json +4 -3
- package/dist/repl-commands/stop.d.ts +0 -6
- package/dist/repl-commands/stop.d.ts.map +0 -1
- package/dist/repl-commands/stop.js +0 -9
- package/dist/repl-commands/stop.js.map +0 -1
package/dist/commands/list.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { Box } from "@upstash/box";
|
|
2
2
|
import { resolveToken } from "../auth.js";
|
|
3
3
|
export async function listCommand(flags) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
4
|
+
const apiKey = resolveToken(flags.token);
|
|
5
|
+
const boxes = await Box.list({ apiKey });
|
|
6
|
+
if (boxes.length === 0) {
|
|
7
|
+
console.log("No boxes found.");
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const headers = ["ID", "STATUS", "MODEL", "CREATED"];
|
|
11
|
+
const rows = boxes.map((b) => [b.id, b.status, b.model ?? "", String(b.created_at)]);
|
|
12
|
+
const colWidths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
|
|
13
|
+
const formatRow = (row) => row.map((val, i) => val.padEnd(colWidths[i])).join(" ");
|
|
14
|
+
console.log(formatRow(headers));
|
|
15
|
+
for (const row of rows) {
|
|
16
|
+
console.log(formatRow(row));
|
|
17
|
+
}
|
|
18
18
|
}
|
|
19
|
-
//# sourceMappingURL=list.js.map
|
|
19
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAgB;IAChD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAErF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAgB;IAChD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAErF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE9F,MAAM,SAAS,GAAG,CAAC,GAAa,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/F,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -6,45 +6,56 @@ import { connectCommand } from "./commands/connect.js";
|
|
|
6
6
|
import { fromSnapshotCommand } from "./commands/from-snapshot.js";
|
|
7
7
|
import { listCommand } from "./commands/list.js";
|
|
8
8
|
import { getCommand } from "./commands/get.js";
|
|
9
|
+
import { initDemoCommand } from "./commands/init-demo.js";
|
|
9
10
|
const program = new Command();
|
|
10
11
|
program
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
.name("box")
|
|
13
|
+
.description("CLI for Upstash Box — REPL-first interface for AI coding agents")
|
|
14
|
+
.version("0.1.0");
|
|
14
15
|
program
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
.command("create")
|
|
17
|
+
.description("Create a new box and enter the REPL")
|
|
18
|
+
.option("--token <token>", "Upstash Box API token")
|
|
19
|
+
.option("--runtime <runtime>", "Runtime environment (node, python, golang, ruby, rust)")
|
|
20
|
+
.option("--agent-model <model>", "Agent model identifier")
|
|
21
|
+
.option("--agent-api-key <key>", "Agent API key (Anthropic or OpenAI)")
|
|
22
|
+
.option("--git-token <token>", "GitHub personal access token")
|
|
23
|
+
.option("--env <KEY=VAL>", "Environment variable (repeatable)", (val, prev) => [...prev, val], [])
|
|
24
|
+
.action((opts) => createCommand(opts));
|
|
24
25
|
program
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
.command("connect [box-id]")
|
|
27
|
+
.description("Connect to an existing box (or most recent) and enter the REPL")
|
|
28
|
+
.option("--token <token>", "Upstash Box API token")
|
|
29
|
+
.action((boxId, opts) => connectCommand(boxId, opts));
|
|
29
30
|
program
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
.command("from-snapshot <snapshot-id>")
|
|
32
|
+
.description("Create a new box from a snapshot and enter the REPL")
|
|
33
|
+
.option("--token <token>", "Upstash Box API token")
|
|
34
|
+
.option("--runtime <runtime>", "Runtime environment")
|
|
35
|
+
.option("--agent-model <model>", "Agent model identifier")
|
|
36
|
+
.option("--agent-api-key <key>", "Agent API key")
|
|
37
|
+
.option("--git-token <token>", "GitHub personal access token")
|
|
38
|
+
.option("--env <KEY=VAL>", "Environment variable (repeatable)", (val, prev) => [...prev, val], [])
|
|
39
|
+
.action((snapshotId, opts) => fromSnapshotCommand(snapshotId, opts));
|
|
39
40
|
program
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
.command("list")
|
|
42
|
+
.description("List all boxes")
|
|
43
|
+
.option("--token <token>", "Upstash Box API token")
|
|
44
|
+
.action((opts) => listCommand(opts));
|
|
44
45
|
program
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
.command("get <box-id>")
|
|
47
|
+
.description("Get details about a box")
|
|
48
|
+
.option("--token <token>", "Upstash Box API token")
|
|
49
|
+
.action((boxId, opts) => getCommand(boxId, opts));
|
|
50
|
+
program
|
|
51
|
+
.command("init-demo")
|
|
52
|
+
.description("Scaffold a standalone demo project for @upstash/box")
|
|
53
|
+
.option("--token <token>", "Upstash Box API token")
|
|
54
|
+
.option("--agent-model <model>", "Agent model identifier")
|
|
55
|
+
.option("--agent-api-key <key>", "Agent API key (required if --agent-model is set)")
|
|
56
|
+
.option("--runtime <runtime>", "Runtime environment", "node")
|
|
57
|
+
.option("--git-token <token>", "GitHub personal access token")
|
|
58
|
+
.option("--directory <dir>", "Output directory", "box-demo")
|
|
59
|
+
.action((opts) => initDemoCommand(opts));
|
|
49
60
|
program.parse();
|
|
50
|
-
//# sourceMappingURL=index.js.map
|
|
61
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
CHANGED
package/dist/output.js
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* Format data as JSON for display.
|
|
3
3
|
*/
|
|
4
4
|
export function formatJSON(data) {
|
|
5
|
-
|
|
5
|
+
return JSON.stringify(data, null, 2);
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
8
|
* Format raw text for display.
|
|
9
9
|
*/
|
|
10
10
|
export function formatRaw(text) {
|
|
11
|
-
|
|
11
|
+
return text;
|
|
12
12
|
}
|
|
13
|
-
//# sourceMappingURL=output.js.map
|
|
13
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Delete the box. Returns true to signal the REPL to exit.
|
|
3
3
|
*/
|
|
4
4
|
export async function handleDelete(box, _args) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
await box.delete();
|
|
6
|
+
console.log(`Box ${box.id} deleted.`);
|
|
7
|
+
return true;
|
|
8
8
|
}
|
|
9
|
-
//# sourceMappingURL=delete.js.map
|
|
9
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
* Execute a shell command in the box.
|
|
3
3
|
*/
|
|
4
4
|
export async function handleExec(box, command) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
if (!command) {
|
|
6
|
+
console.log("Usage: exec <command>");
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const run = await box.exec(command);
|
|
10
|
+
const result = await run.result();
|
|
11
|
+
if (result)
|
|
12
|
+
console.log(result);
|
|
12
13
|
}
|
|
13
|
-
//# sourceMappingURL=exec.js.map
|
|
14
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -2,58 +2,58 @@
|
|
|
2
2
|
* Handle file subcommands: read, write, list, upload, download.
|
|
3
3
|
*/
|
|
4
4
|
export async function handleFiles(box, args) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
const parts = args.split(/\s+/);
|
|
6
|
+
const sub = parts[0];
|
|
7
|
+
switch (sub) {
|
|
8
|
+
case "read": {
|
|
9
|
+
const path = parts[1];
|
|
10
|
+
if (!path) {
|
|
11
|
+
console.log("Usage: files read <path>");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const content = await box.files.read(path);
|
|
15
|
+
console.log(content);
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
case "write": {
|
|
19
|
+
const path = parts[1];
|
|
20
|
+
const content = parts.slice(2).join(" ");
|
|
21
|
+
if (!path || !content) {
|
|
22
|
+
console.log("Usage: files write <path> <content>");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
await box.files.write({ path, content });
|
|
26
|
+
console.log(`Written to ${path}`);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
case "list": {
|
|
30
|
+
const path = parts[1];
|
|
31
|
+
const files = await box.files.list(path);
|
|
32
|
+
for (const f of files) {
|
|
33
|
+
const indicator = f.is_dir ? "/" : "";
|
|
34
|
+
console.log(`${f.name}${indicator}\t${f.size}`);
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case "upload": {
|
|
39
|
+
const localPath = parts[1];
|
|
40
|
+
const destination = parts[2];
|
|
41
|
+
if (!localPath || !destination) {
|
|
42
|
+
console.log("Usage: files upload <local-path> <destination>");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
await box.files.upload([{ path: localPath, destination }]);
|
|
46
|
+
console.log(`Uploaded ${localPath} → ${destination}`);
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case "download": {
|
|
50
|
+
const path = parts[1];
|
|
51
|
+
await box.files.download(path ? { path } : undefined);
|
|
52
|
+
console.log("Downloaded.");
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
default:
|
|
56
|
+
console.log("Usage: files <read|write|list|upload|download> [args...]");
|
|
17
57
|
}
|
|
18
|
-
case "write": {
|
|
19
|
-
const path = parts[1];
|
|
20
|
-
const content = parts.slice(2).join(" ");
|
|
21
|
-
if (!path || !content) {
|
|
22
|
-
console.log("Usage: files write <path> <content>");
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
await box.files.write({ path, content });
|
|
26
|
-
console.log(`Written to ${path}`);
|
|
27
|
-
break;
|
|
28
|
-
}
|
|
29
|
-
case "list": {
|
|
30
|
-
const path = parts[1];
|
|
31
|
-
const files = await box.files.list(path);
|
|
32
|
-
for (const f of files) {
|
|
33
|
-
const indicator = f.is_dir ? "/" : "";
|
|
34
|
-
console.log(`${f.name}${indicator}\t${f.size}`);
|
|
35
|
-
}
|
|
36
|
-
break;
|
|
37
|
-
}
|
|
38
|
-
case "upload": {
|
|
39
|
-
const localPath = parts[1];
|
|
40
|
-
const destination = parts[2];
|
|
41
|
-
if (!localPath || !destination) {
|
|
42
|
-
console.log("Usage: files upload <local-path> <destination>");
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
await box.files.upload([{ path: localPath, destination }]);
|
|
46
|
-
console.log(`Uploaded ${localPath} → ${destination}`);
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
case "download": {
|
|
50
|
-
const path = parts[1];
|
|
51
|
-
await box.files.download(path ? { path } : undefined);
|
|
52
|
-
console.log("Downloaded.");
|
|
53
|
-
break;
|
|
54
|
-
}
|
|
55
|
-
default:
|
|
56
|
-
console.log("Usage: files <read|write|list|upload|download> [args...]");
|
|
57
|
-
}
|
|
58
58
|
}
|
|
59
|
-
//# sourceMappingURL=files.js.map
|
|
59
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -2,37 +2,37 @@
|
|
|
2
2
|
* Handle git subcommands: clone, diff, create-pr.
|
|
3
3
|
*/
|
|
4
4
|
export async function handleGit(box, args) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
5
|
+
const parts = args.split(/\s+/);
|
|
6
|
+
const sub = parts[0];
|
|
7
|
+
switch (sub) {
|
|
8
|
+
case "clone": {
|
|
9
|
+
const repo = parts[1];
|
|
10
|
+
const branch = parts[2];
|
|
11
|
+
if (!repo) {
|
|
12
|
+
console.log("Usage: git clone <repo> [branch]");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
await box.git.clone({ repo, branch });
|
|
16
|
+
console.log(`Cloned ${repo}`);
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
case "diff": {
|
|
20
|
+
const diff = await box.git.diff();
|
|
21
|
+
console.log(diff || "(no changes)");
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
case "create-pr": {
|
|
25
|
+
const title = parts.slice(1).join(" ");
|
|
26
|
+
if (!title) {
|
|
27
|
+
console.log("Usage: git create-pr <title>");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const pr = await box.git.createPR({ title });
|
|
31
|
+
console.log(`PR #${pr.number}: ${pr.url}`);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
default:
|
|
35
|
+
console.log("Usage: git <clone|diff|create-pr> [args...]");
|
|
18
36
|
}
|
|
19
|
-
case "diff": {
|
|
20
|
-
const diff = await box.git.diff();
|
|
21
|
-
console.log(diff || "(no changes)");
|
|
22
|
-
break;
|
|
23
|
-
}
|
|
24
|
-
case "create-pr": {
|
|
25
|
-
const title = parts.slice(1).join(" ");
|
|
26
|
-
if (!title) {
|
|
27
|
-
console.log("Usage: git create-pr <title>");
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const pr = await box.git.createPR({ title });
|
|
31
|
-
console.log(`PR #${pr.number}: ${pr.url}`);
|
|
32
|
-
break;
|
|
33
|
-
}
|
|
34
|
-
default:
|
|
35
|
-
console.log("Usage: git <clone|diff|create-pr> [args...]");
|
|
36
|
-
}
|
|
37
37
|
}
|
|
38
|
-
//# sourceMappingURL=git.js.map
|
|
38
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../src/repl-commands/pause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI3E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pause.js","sourceRoot":"","sources":["../../src/repl-commands/pause.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAQ,EAAE,KAAa;IACvD,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* Run the agent with a prompt, streaming output to stdout.
|
|
3
3
|
*/
|
|
4
4
|
export async function handleRun(box, prompt) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
if (!prompt) {
|
|
6
|
+
console.log("Usage: run <prompt>");
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
for await (const chunk of box.agent.stream({ prompt })) {
|
|
10
|
+
process.stdout.write(chunk);
|
|
11
|
+
}
|
|
12
|
+
console.log();
|
|
13
13
|
}
|
|
14
|
-
//# sourceMappingURL=run.js.map
|
|
14
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Create a snapshot of the current box state.
|
|
3
3
|
*/
|
|
4
4
|
export async function handleSnapshot(box, args) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
const name = args.trim() || `snapshot-${Date.now()}`;
|
|
6
|
+
const snapshot = await box.snapshot({ name });
|
|
7
|
+
console.log(`Snapshot created: ${snapshot.id} (${snapshot.name})`);
|
|
8
8
|
}
|
|
9
|
-
//# sourceMappingURL=snapshot.js.map
|
|
9
|
+
//# sourceMappingURL=snapshot.js.map
|
package/dist/repl.d.ts
CHANGED
package/dist/repl.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAmBxC;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAmBxC;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CvD"}
|
package/dist/repl.js
CHANGED
|
@@ -5,60 +5,64 @@ import { handleExec } from "./repl-commands/exec.js";
|
|
|
5
5
|
import { handleFiles } from "./repl-commands/files.js";
|
|
6
6
|
import { handleGit } from "./repl-commands/git.js";
|
|
7
7
|
import { handleSnapshot } from "./repl-commands/snapshot.js";
|
|
8
|
-
import {
|
|
8
|
+
import { handlePause } from "./repl-commands/pause.js";
|
|
9
9
|
import { handleDelete } from "./repl-commands/delete.js";
|
|
10
10
|
const COMMANDS = {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
run: handleRun,
|
|
12
|
+
exec: handleExec,
|
|
13
|
+
files: handleFiles,
|
|
14
|
+
git: handleGit,
|
|
15
|
+
snapshot: handleSnapshot,
|
|
16
|
+
pause: handlePause,
|
|
17
|
+
delete: handleDelete,
|
|
18
18
|
};
|
|
19
19
|
/**
|
|
20
20
|
* Start an interactive REPL session for the given box.
|
|
21
21
|
*/
|
|
22
22
|
export async function startRepl(box) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
23
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
24
|
+
console.log(`\nConnected to box ${box.id}`);
|
|
25
|
+
console.log(`Type a prompt to run the agent, or use commands: ${Object.keys(COMMANDS).join(", ")}, exit\n`);
|
|
26
|
+
try {
|
|
27
|
+
while (true) {
|
|
28
|
+
const input = await rl.question(`${box.id}> `);
|
|
29
|
+
const trimmed = input.trim();
|
|
30
|
+
if (!trimmed)
|
|
31
|
+
continue;
|
|
32
|
+
if (trimmed === "exit" || trimmed === "/exit") {
|
|
33
|
+
console.log("Goodbye.");
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
// Strip leading slash if present
|
|
37
|
+
const normalized = trimmed.startsWith("/") ? trimmed.slice(1) : trimmed;
|
|
38
|
+
// Find matching command
|
|
39
|
+
const spaceIdx = normalized.indexOf(" ");
|
|
40
|
+
const cmdName = spaceIdx === -1 ? normalized : normalized.slice(0, spaceIdx);
|
|
41
|
+
const args = spaceIdx === -1 ? "" : normalized.slice(spaceIdx + 1).trim();
|
|
42
|
+
const handler = COMMANDS[cmdName];
|
|
43
|
+
if (handler) {
|
|
44
|
+
try {
|
|
45
|
+
const shouldExit = await handler(box, args);
|
|
46
|
+
if (shouldExit === true)
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// Bare text → implicit run
|
|
55
|
+
try {
|
|
56
|
+
await handleRun(box, trimmed);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
50
62
|
}
|
|
51
|
-
} else {
|
|
52
|
-
// Bare text → implicit run
|
|
53
|
-
try {
|
|
54
|
-
await handleRun(box, trimmed);
|
|
55
|
-
} catch (err) {
|
|
56
|
-
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
63
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
finally {
|
|
65
|
+
rl.close();
|
|
66
|
+
}
|
|
63
67
|
}
|
|
64
|
-
//# sourceMappingURL=repl.js.map
|
|
68
|
+
//# sourceMappingURL=repl.js.map
|