@upstash/box-cli 0.0.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/LICENSE +21 -0
- package/README.md +131 -0
- package/dist/auth.d.ts +5 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +12 -0
- package/dist/auth.js.map +1 -0
- package/dist/commands/connect.d.ts +6 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +21 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/create.d.ts +11 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +35 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/from-snapshot.d.ts +11 -0
- package/dist/commands/from-snapshot.d.ts.map +1 -0
- package/dist/commands/from-snapshot.js +35 -0
- package/dist/commands/from-snapshot.js.map +1 -0
- package/dist/commands/get.d.ts +6 -0
- package/dist/commands/get.d.ts.map +1 -0
- package/dist/commands/get.js +9 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +14 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +9 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +13 -0
- package/dist/output.js.map +1 -0
- package/dist/repl-commands/delete.d.ts +6 -0
- package/dist/repl-commands/delete.d.ts.map +1 -0
- package/dist/repl-commands/delete.js +9 -0
- package/dist/repl-commands/delete.js.map +1 -0
- package/dist/repl-commands/exec.d.ts +6 -0
- package/dist/repl-commands/exec.d.ts.map +1 -0
- package/dist/repl-commands/exec.js +14 -0
- package/dist/repl-commands/exec.js.map +1 -0
- package/dist/repl-commands/files.d.ts +6 -0
- package/dist/repl-commands/files.d.ts.map +1 -0
- package/dist/repl-commands/files.js +59 -0
- package/dist/repl-commands/files.js.map +1 -0
- package/dist/repl-commands/git.d.ts +6 -0
- package/dist/repl-commands/git.d.ts.map +1 -0
- package/dist/repl-commands/git.js +38 -0
- package/dist/repl-commands/git.js.map +1 -0
- package/dist/repl-commands/run.d.ts +6 -0
- package/dist/repl-commands/run.d.ts.map +1 -0
- package/dist/repl-commands/run.js +14 -0
- package/dist/repl-commands/run.js.map +1 -0
- package/dist/repl-commands/snapshot.d.ts +6 -0
- package/dist/repl-commands/snapshot.d.ts.map +1 -0
- package/dist/repl-commands/snapshot.js +9 -0
- package/dist/repl-commands/snapshot.js.map +1 -0
- package/dist/repl-commands/stop.d.ts +6 -0
- package/dist/repl-commands/stop.d.ts.map +1 -0
- package/dist/repl-commands/stop.js +9 -0
- package/dist/repl-commands/stop.js.map +1 -0
- package/dist/repl.d.ts +6 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +68 -0
- package/dist/repl.js.map +1 -0
- package/package.json +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Upstash, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# @upstash/box-cli
|
|
2
|
+
|
|
3
|
+
REPL-first CLI for [Upstash Box](https://upstash.com/docs/box) — create and interact with sandboxed AI coding agents from the terminal.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @upstash/box-cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or run directly from the monorepo:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm build
|
|
15
|
+
node packages/cli/dist/index.js --help
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Authentication
|
|
19
|
+
|
|
20
|
+
Provide your Upstash Box API token via the `--token` flag or the `UPSTASH_BOX_TOKEN` environment variable:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
export UPSTASH_BOX_TOKEN=abx_...
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Commands
|
|
27
|
+
|
|
28
|
+
### `box create`
|
|
29
|
+
|
|
30
|
+
Create a new box and enter an interactive REPL.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
box create \
|
|
34
|
+
--agent-model claude/sonnet_4_5 \
|
|
35
|
+
--agent-api-key $CLAUDE_KEY \
|
|
36
|
+
--runtime node \
|
|
37
|
+
--git-token $GITHUB_TOKEN \
|
|
38
|
+
--env NODE_ENV=production \
|
|
39
|
+
--env DEBUG=true
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
| Flag | Description |
|
|
43
|
+
|------|-------------|
|
|
44
|
+
| `--token` | Upstash Box API token |
|
|
45
|
+
| `--runtime` | Runtime environment (`node`, `python`, `golang`, `ruby`, `rust`) |
|
|
46
|
+
| `--agent-model` | Agent model identifier (required) |
|
|
47
|
+
| `--agent-api-key` | Agent API key — Anthropic or OpenAI (required) |
|
|
48
|
+
| `--git-token` | GitHub personal access token |
|
|
49
|
+
| `--env KEY=VAL` | Environment variable (repeatable) |
|
|
50
|
+
|
|
51
|
+
### `box connect [box-id]`
|
|
52
|
+
|
|
53
|
+
Connect to an existing box and enter the REPL. If no box ID is given, connects to the most recent box.
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
box connect box_abc123
|
|
57
|
+
box connect # connects to most recent
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### `box from-snapshot <snapshot-id>`
|
|
61
|
+
|
|
62
|
+
Create a new box from a snapshot and enter the REPL. Accepts the same flags as `create`.
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
box from-snapshot snap_abc123 \
|
|
66
|
+
--agent-model claude/sonnet_4_5 \
|
|
67
|
+
--agent-api-key $CLAUDE_KEY
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### `box list`
|
|
71
|
+
|
|
72
|
+
List all boxes.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
box list
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### `box get <box-id>`
|
|
79
|
+
|
|
80
|
+
Print box details as JSON.
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
box get box_abc123
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Interactive REPL
|
|
87
|
+
|
|
88
|
+
After `create`, `connect`, or `from-snapshot`, you enter an interactive REPL session:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
Connected to box box_abc123
|
|
92
|
+
Type a prompt to run the agent, or use commands: run, exec, files, git, snapshot, stop, delete, exit
|
|
93
|
+
|
|
94
|
+
box_abc123> Fix the bug in auth.ts
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### REPL commands
|
|
98
|
+
|
|
99
|
+
Any text entered is sent to the agent by default. You can also use explicit commands (with or without a `/` prefix):
|
|
100
|
+
|
|
101
|
+
| Command | Description |
|
|
102
|
+
|---------|-------------|
|
|
103
|
+
| `run <prompt>` | Run the agent with a prompt (streaming output) |
|
|
104
|
+
| `exec <command>` | Execute a shell command in the box |
|
|
105
|
+
| `files read <path>` | Read a file |
|
|
106
|
+
| `files write <path> <content>` | Write a file |
|
|
107
|
+
| `files list [path]` | List files in a directory |
|
|
108
|
+
| `files upload <local> <dest>` | Upload a local file |
|
|
109
|
+
| `files download [path]` | Download files from the box |
|
|
110
|
+
| `git clone <repo> [branch]` | Clone a repository |
|
|
111
|
+
| `git diff` | Show git diff |
|
|
112
|
+
| `git create-pr <title>` | Create a pull request |
|
|
113
|
+
| `snapshot [name]` | Save a snapshot of the current state |
|
|
114
|
+
| `stop` | Stop the box and exit |
|
|
115
|
+
| `delete` | Delete the box and exit |
|
|
116
|
+
| `exit` | Exit the REPL (box keeps running) |
|
|
117
|
+
|
|
118
|
+
### Examples
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
box_abc123> Add error handling to the payment service
|
|
122
|
+
box_abc123> exec npm test
|
|
123
|
+
box_abc123> files list src/
|
|
124
|
+
box_abc123> git diff
|
|
125
|
+
box_abc123> snapshot before-refactor
|
|
126
|
+
box_abc123> exit
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## License
|
|
130
|
+
|
|
131
|
+
MIT
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAOvD"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the API token from flag or environment variable.
|
|
3
|
+
*/
|
|
4
|
+
export function resolveToken(flagToken) {
|
|
5
|
+
const token = flagToken ?? process.env.UPSTASH_BOX_TOKEN;
|
|
6
|
+
if (!token) {
|
|
7
|
+
console.error("Error: API token required. Use --token flag or set UPSTASH_BOX_TOKEN env var.");
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
return token;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC7C,MAAM,KAAK,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACzD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC/F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAIA,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBlG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Box } from "@upstash/box";
|
|
2
|
+
import { resolveToken } from "../auth.js";
|
|
3
|
+
import { startRepl } from "../repl.js";
|
|
4
|
+
export async function connectCommand(boxId, flags) {
|
|
5
|
+
const apiKey = resolveToken(flags.token);
|
|
6
|
+
let targetId = boxId;
|
|
7
|
+
// If no box ID provided, connect to most recent
|
|
8
|
+
if (!targetId) {
|
|
9
|
+
console.log("No box ID specified, connecting to most recent...");
|
|
10
|
+
const boxes = await Box.list({ apiKey });
|
|
11
|
+
if (boxes.length === 0) {
|
|
12
|
+
console.error("No boxes found.");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
targetId = boxes[0].id;
|
|
16
|
+
}
|
|
17
|
+
console.log(`Connecting to box ${targetId}...`);
|
|
18
|
+
const box = await Box.get(targetId, { apiKey });
|
|
19
|
+
await startRepl(box);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMvC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAyB,EAAE,KAAmB;IACjF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,gDAAgD;IAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,KAAK,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface CreateFlags {
|
|
2
|
+
token?: string;
|
|
3
|
+
runtime?: string;
|
|
4
|
+
agentModel?: string;
|
|
5
|
+
agentApiKey?: string;
|
|
6
|
+
gitToken?: string;
|
|
7
|
+
env?: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function createCommand(flags: CreateFlags): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCrE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Box } from "@upstash/box";
|
|
2
|
+
import { resolveToken } from "../auth.js";
|
|
3
|
+
import { startRepl } from "../repl.js";
|
|
4
|
+
export async function createCommand(flags) {
|
|
5
|
+
const apiKey = resolveToken(flags.token);
|
|
6
|
+
if (!flags.agentModel) {
|
|
7
|
+
console.error("Error: --agent-model is required");
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
if (!flags.agentApiKey) {
|
|
11
|
+
console.error("Error: --agent-api-key is required");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const env = {};
|
|
15
|
+
if (flags.env) {
|
|
16
|
+
for (const e of flags.env) {
|
|
17
|
+
const idx = e.indexOf("=");
|
|
18
|
+
if (idx === -1) {
|
|
19
|
+
console.error(`Invalid env format: ${e} (expected KEY=VAL)`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
env[e.slice(0, idx)] = e.slice(idx + 1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
console.log("Creating box...");
|
|
26
|
+
const box = await Box.create({
|
|
27
|
+
apiKey,
|
|
28
|
+
runtime: flags.runtime,
|
|
29
|
+
agent: { model: flags.agentModel, apiKey: flags.agentApiKey },
|
|
30
|
+
git: flags.gitToken ? { token: flags.gitToken } : undefined,
|
|
31
|
+
env: Object.keys(env).length > 0 ? env : undefined,
|
|
32
|
+
});
|
|
33
|
+
await startRepl(box);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAWvC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAkB;IACpD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;QAC3B,MAAM;QACN,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE;QAC7D,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;QAC3D,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;KACnD,CAAC,CAAC;IAEH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface FromSnapshotFlags {
|
|
2
|
+
token?: string;
|
|
3
|
+
runtime?: string;
|
|
4
|
+
agentModel?: string;
|
|
5
|
+
agentApiKey?: string;
|
|
6
|
+
gitToken?: string;
|
|
7
|
+
env?: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare function fromSnapshotCommand(snapshotId: string, flags: FromSnapshotFlags): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=from-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from-snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/from-snapshot.ts"],"names":[],"mappings":"AAIA,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCrG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Box } from "@upstash/box";
|
|
2
|
+
import { resolveToken } from "../auth.js";
|
|
3
|
+
import { startRepl } from "../repl.js";
|
|
4
|
+
export async function fromSnapshotCommand(snapshotId, flags) {
|
|
5
|
+
const apiKey = resolveToken(flags.token);
|
|
6
|
+
if (!flags.agentModel) {
|
|
7
|
+
console.error("Error: --agent-model is required");
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
if (!flags.agentApiKey) {
|
|
11
|
+
console.error("Error: --agent-api-key is required");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const env = {};
|
|
15
|
+
if (flags.env) {
|
|
16
|
+
for (const e of flags.env) {
|
|
17
|
+
const idx = e.indexOf("=");
|
|
18
|
+
if (idx === -1) {
|
|
19
|
+
console.error(`Invalid env format: ${e} (expected KEY=VAL)`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
env[e.slice(0, idx)] = e.slice(idx + 1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
console.log("Creating box from snapshot...");
|
|
26
|
+
const box = await Box.fromSnapshot(snapshotId, {
|
|
27
|
+
apiKey,
|
|
28
|
+
runtime: flags.runtime,
|
|
29
|
+
agent: { model: flags.agentModel, apiKey: flags.agentApiKey },
|
|
30
|
+
git: flags.gitToken ? { token: flags.gitToken } : undefined,
|
|
31
|
+
env: Object.keys(env).length > 0 ? env : undefined,
|
|
32
|
+
});
|
|
33
|
+
await startRepl(box);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=from-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from-snapshot.js","sourceRoot":"","sources":["../../src/commands/from-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAWvC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB,EAAE,KAAwB;IACpF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE;QAC7C,MAAM;QACN,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE;QAC7D,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;QAC3D,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;KACnD,CAAC,CAAC;IAEH,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AAIA,UAAU,QAAQ;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9E"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Box } from "@upstash/box";
|
|
2
|
+
import { resolveToken } from "../auth.js";
|
|
3
|
+
import { formatJSON } from "../output.js";
|
|
4
|
+
export async function getCommand(boxId, flags) {
|
|
5
|
+
const apiKey = resolveToken(flags.token);
|
|
6
|
+
const box = await Box.get(boxId, { apiKey });
|
|
7
|
+
console.log(formatJSON({ id: box.id }));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,KAAe;IAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAIA,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAYjE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Box } from "@upstash/box";
|
|
2
|
+
import { resolveToken } from "../auth.js";
|
|
3
|
+
export async function listCommand(flags) {
|
|
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
|
+
for (const b of boxes) {
|
|
11
|
+
console.log(`${b.id}\t${b.status}\t${b.model}\t${b.created_at}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +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,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "dotenv/config";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { createCommand } from "./commands/create.js";
|
|
5
|
+
import { connectCommand } from "./commands/connect.js";
|
|
6
|
+
import { fromSnapshotCommand } from "./commands/from-snapshot.js";
|
|
7
|
+
import { listCommand } from "./commands/list.js";
|
|
8
|
+
import { getCommand } from "./commands/get.js";
|
|
9
|
+
const program = new Command();
|
|
10
|
+
program
|
|
11
|
+
.name("box")
|
|
12
|
+
.description("CLI for Upstash Box — REPL-first interface for AI coding agents")
|
|
13
|
+
.version("0.1.0");
|
|
14
|
+
program
|
|
15
|
+
.command("create")
|
|
16
|
+
.description("Create a new box and enter the REPL")
|
|
17
|
+
.option("--token <token>", "Upstash Box API token")
|
|
18
|
+
.option("--runtime <runtime>", "Runtime environment (node, python, golang, ruby, rust)")
|
|
19
|
+
.option("--agent-model <model>", "Agent model identifier")
|
|
20
|
+
.option("--agent-api-key <key>", "Agent API key (Anthropic or OpenAI)")
|
|
21
|
+
.option("--git-token <token>", "GitHub personal access token")
|
|
22
|
+
.option("--env <KEY=VAL>", "Environment variable (repeatable)", (val, prev) => [...prev, val], [])
|
|
23
|
+
.action((opts) => createCommand(opts));
|
|
24
|
+
program
|
|
25
|
+
.command("connect [box-id]")
|
|
26
|
+
.description("Connect to an existing box (or most recent) and enter the REPL")
|
|
27
|
+
.option("--token <token>", "Upstash Box API token")
|
|
28
|
+
.action((boxId, opts) => connectCommand(boxId, opts));
|
|
29
|
+
program
|
|
30
|
+
.command("from-snapshot <snapshot-id>")
|
|
31
|
+
.description("Create a new box from a snapshot and enter the REPL")
|
|
32
|
+
.option("--token <token>", "Upstash Box API token")
|
|
33
|
+
.option("--runtime <runtime>", "Runtime environment")
|
|
34
|
+
.option("--agent-model <model>", "Agent model identifier")
|
|
35
|
+
.option("--agent-api-key <key>", "Agent API key")
|
|
36
|
+
.option("--git-token <token>", "GitHub personal access token")
|
|
37
|
+
.option("--env <KEY=VAL>", "Environment variable (repeatable)", (val, prev) => [...prev, val], [])
|
|
38
|
+
.action((snapshotId, opts) => fromSnapshotCommand(snapshotId, opts));
|
|
39
|
+
program
|
|
40
|
+
.command("list")
|
|
41
|
+
.description("List all boxes")
|
|
42
|
+
.option("--token <token>", "Upstash Box API token")
|
|
43
|
+
.action((opts) => listCommand(opts));
|
|
44
|
+
program
|
|
45
|
+
.command("get <box-id>")
|
|
46
|
+
.description("Get details about a box")
|
|
47
|
+
.option("--token <token>", "Upstash Box API token")
|
|
48
|
+
.action((boxId, opts) => getCommand(boxId, opts));
|
|
49
|
+
program.parse();
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,iEAAiE,CAAC;KAC9E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,wDAAwD,CAAC;KACvF,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;KACzD,MAAM,CAAC,uBAAuB,EAAE,qCAAqC,CAAC;KACtE,MAAM,CAAC,qBAAqB,EAAE,8BAA8B,CAAC;KAC7D,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,EAAc,CAAC;KAC/H,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAEzC,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAExD,OAAO;KACJ,OAAO,CAAC,6BAA6B,CAAC;KACtC,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;KACzD,MAAM,CAAC,uBAAuB,EAAE,eAAe,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,8BAA8B,CAAC;KAC7D,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,EAAc,CAAC;KAC/H,MAAM,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AAEvE,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAEvC,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,yBAAyB,CAAC;KACtC,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAEpD,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format data as JSON for display.
|
|
3
|
+
*/
|
|
4
|
+
export function formatJSON(data) {
|
|
5
|
+
return JSON.stringify(data, null, 2);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Format raw text for display.
|
|
9
|
+
*/
|
|
10
|
+
export function formatRaw(text) {
|
|
11
|
+
return text;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/repl-commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI5E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/repl-commands/delete.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAQ,EAAE,KAAa;IACxD,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/repl-commands/exec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute a shell command in the box.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleExec(box, command) {
|
|
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);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/repl-commands/exec.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAQ,EAAE,OAAe;IACxD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IAClC,IAAI,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/repl-commands/files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDvE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle file subcommands: read, write, list, upload, download.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleFiles(box, args) {
|
|
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...]");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/repl-commands/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/repl-commands/git.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCrE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle git subcommands: clone, diff, create-pr.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleGit(box, args) {
|
|
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...]");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/repl-commands/git.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,IAAY;IACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAErB,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YACD,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YAC9B,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,cAAc,CAAC,CAAC;YACpC,MAAM;QACR,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3C,MAAM;QACR,CAAC;QACD;YACE,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/repl-commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASvE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run the agent with a prompt, streaming output to stdout.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleRun(box, prompt) {
|
|
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
|
+
}
|
|
14
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/repl-commands/run.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,MAAc;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IACD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/repl-commands/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1E"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a snapshot of the current box state.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleSnapshot(box, args) {
|
|
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
|
+
}
|
|
9
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/repl-commands/snapshot.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAQ,EAAE,IAAY;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/repl-commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAExC;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI1E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/repl-commands/stop.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAQ,EAAE,KAAa;IACtD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/repl.d.ts
ADDED
|
@@ -0,0 +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,CA4CvD"}
|
package/dist/repl.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { stdin, stdout } from "node:process";
|
|
3
|
+
import { handleRun } from "./repl-commands/run.js";
|
|
4
|
+
import { handleExec } from "./repl-commands/exec.js";
|
|
5
|
+
import { handleFiles } from "./repl-commands/files.js";
|
|
6
|
+
import { handleGit } from "./repl-commands/git.js";
|
|
7
|
+
import { handleSnapshot } from "./repl-commands/snapshot.js";
|
|
8
|
+
import { handleStop } from "./repl-commands/stop.js";
|
|
9
|
+
import { handleDelete } from "./repl-commands/delete.js";
|
|
10
|
+
const COMMANDS = {
|
|
11
|
+
run: handleRun,
|
|
12
|
+
exec: handleExec,
|
|
13
|
+
files: handleFiles,
|
|
14
|
+
git: handleGit,
|
|
15
|
+
snapshot: handleSnapshot,
|
|
16
|
+
stop: handleStop,
|
|
17
|
+
delete: handleDelete,
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Start an interactive REPL session for the given box.
|
|
21
|
+
*/
|
|
22
|
+
export async function startRepl(box) {
|
|
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
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
rl.close();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=repl.js.map
|
package/dist/repl.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@upstash/box-cli",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "CLI for Upstash Box — REPL-first interface for AI coding agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"box": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"keywords": [
|
|
11
|
+
"upstash",
|
|
12
|
+
"box",
|
|
13
|
+
"cli",
|
|
14
|
+
"ai-agent"
|
|
15
|
+
],
|
|
16
|
+
"author": "Upstash",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"commander": "^13.0.0",
|
|
20
|
+
"dotenv": "^17.3.1",
|
|
21
|
+
"@upstash/box": "0.0.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^20.10.0",
|
|
25
|
+
"typescript": "^5.3.0"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist"
|
|
32
|
+
],
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18.0.0"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc",
|
|
38
|
+
"dev": "tsc --watch",
|
|
39
|
+
"test": "vitest run"
|
|
40
|
+
}
|
|
41
|
+
}
|