@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.
Files changed (57) hide show
  1. package/README.md +29 -0
  2. package/dist/auth.d.ts +1 -1
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +7 -9
  5. package/dist/auth.js.map +1 -1
  6. package/dist/commands/connect.d.ts +3 -6
  7. package/dist/commands/connect.d.ts.map +1 -1
  8. package/dist/commands/connect.js +15 -15
  9. package/dist/commands/connect.js.map +1 -1
  10. package/dist/commands/create.d.ts +7 -7
  11. package/dist/commands/create.d.ts.map +1 -1
  12. package/dist/commands/create.js +26 -27
  13. package/dist/commands/create.js.map +1 -1
  14. package/dist/commands/from-snapshot.d.ts +8 -11
  15. package/dist/commands/from-snapshot.d.ts.map +1 -1
  16. package/dist/commands/from-snapshot.js +26 -27
  17. package/dist/commands/from-snapshot.js.map +1 -1
  18. package/dist/commands/get.d.ts +2 -2
  19. package/dist/commands/get.js +4 -4
  20. package/dist/commands/init-demo.d.ts +15 -0
  21. package/dist/commands/init-demo.d.ts.map +1 -0
  22. package/dist/commands/init-demo.js +202 -0
  23. package/dist/commands/init-demo.js.map +1 -0
  24. package/dist/commands/list.d.ts +2 -2
  25. package/dist/commands/list.d.ts.map +1 -1
  26. package/dist/commands/list.js +15 -15
  27. package/dist/commands/list.js.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.js +45 -34
  30. package/dist/index.js.map +1 -1
  31. package/dist/output.d.ts +1 -1
  32. package/dist/output.js +3 -3
  33. package/dist/repl-commands/delete.d.ts +1 -1
  34. package/dist/repl-commands/delete.js +4 -4
  35. package/dist/repl-commands/exec.d.ts +1 -1
  36. package/dist/repl-commands/exec.js +9 -8
  37. package/dist/repl-commands/files.d.ts +1 -1
  38. package/dist/repl-commands/files.js +53 -53
  39. package/dist/repl-commands/git.d.ts +1 -1
  40. package/dist/repl-commands/git.js +32 -32
  41. package/dist/repl-commands/pause.d.ts +6 -0
  42. package/dist/repl-commands/pause.d.ts.map +1 -0
  43. package/dist/repl-commands/pause.js +9 -0
  44. package/dist/repl-commands/pause.js.map +1 -0
  45. package/dist/repl-commands/run.d.ts +1 -1
  46. package/dist/repl-commands/run.js +9 -9
  47. package/dist/repl-commands/snapshot.d.ts +1 -1
  48. package/dist/repl-commands/snapshot.js +4 -4
  49. package/dist/repl.d.ts +1 -1
  50. package/dist/repl.d.ts.map +1 -1
  51. package/dist/repl.js +51 -47
  52. package/dist/repl.js.map +1 -1
  53. package/package.json +4 -3
  54. package/dist/repl-commands/stop.d.ts +0 -6
  55. package/dist/repl-commands/stop.d.ts.map +0 -1
  56. package/dist/repl-commands/stop.js +0 -9
  57. package/dist/repl-commands/stop.js.map +0 -1
package/README.md CHANGED
@@ -83,6 +83,35 @@ Print box details as JSON.
83
83
  box get box_abc123
84
84
  ```
85
85
 
86
+ ### `box init-demo`
87
+
88
+ Scaffold a standalone demo project that uses the `@upstash/box` SDK. Creates a directory with a ready-to-run TypeScript script, `.env` file, and README.
89
+
90
+ ```bash
91
+ box init-demo \
92
+ --token $UPSTASH_BOX_API_KEY \
93
+ --agent-model claude/sonnet_4_5 \
94
+ --agent-api-key $CLAUDE_KEY \
95
+ --runtime node \
96
+ --git-token $GITHUB_TOKEN \
97
+ --directory my-demo
98
+ ```
99
+
100
+ | Flag | Description | Default |
101
+ | ----------------- | -------------------------------------------------- | ---------- |
102
+ | `--token` | Upstash Box API token | |
103
+ | `--agent-model` | Agent model identifier | |
104
+ | `--agent-api-key` | Agent API key (required if `--agent-model` is set) | |
105
+ | `--runtime` | Runtime environment | `node` |
106
+ | `--git-token` | GitHub personal access token | |
107
+ | `--directory` | Output directory | `box-demo` |
108
+
109
+ After scaffolding, the command offers to run the demo immediately. The generated project includes:
110
+
111
+ - `main.ts` — demo script that creates a box, writes/reads files, executes commands, and cleans up
112
+ - `.env` — pre-filled environment variables
113
+ - `README.md` — usage documentation
114
+
86
115
  ## Interactive REPL
87
116
 
88
117
  After `create`, `connect`, or `from-snapshot`, you enter an interactive REPL session:
package/dist/auth.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Resolves the API token from flag or environment variable.
3
3
  */
4
4
  export declare function resolveToken(flagToken?: string): string;
5
- //# sourceMappingURL=auth.d.ts.map
5
+ //# sourceMappingURL=auth.d.ts.map
@@ -1 +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"}
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,CASvD"}
package/dist/auth.js CHANGED
@@ -2,13 +2,11 @@
2
2
  * Resolves the API token from flag or environment variable.
3
3
  */
4
4
  export function resolveToken(flagToken) {
5
- const token = flagToken ?? process.env.UPSTASH_BOX_API_KEY;
6
- if (!token) {
7
- console.error(
8
- "Error: API token required. Use --token flag or set UPSTASH_BOX_API_KEY env var.",
9
- );
10
- process.exit(1);
11
- }
12
- return token;
5
+ const token = flagToken ?? process.env.UPSTASH_BOX_API_KEY;
6
+ if (!token) {
7
+ console.error("Error: API token required. Use --token flag or set UPSTASH_BOX_API_KEY env var.");
8
+ process.exit(1);
9
+ }
10
+ return token;
13
11
  }
14
- //# sourceMappingURL=auth.js.map
12
+ //# sourceMappingURL=auth.js.map
package/dist/auth.js.map CHANGED
@@ -1 +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,mBAAmB,CAAC;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
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,mBAAmB,CAAC;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,iFAAiF,CAClF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,9 +1,6 @@
1
1
  interface ConnectFlags {
2
- token?: string;
2
+ token?: string;
3
3
  }
4
- export declare function connectCommand(
5
- boxId: string | undefined,
6
- flags: ConnectFlags,
7
- ): Promise<void>;
4
+ export declare function connectCommand(boxId: string | undefined, flags: ConnectFlags): Promise<void>;
8
5
  export {};
9
- //# sourceMappingURL=connect.d.ts.map
6
+ //# sourceMappingURL=connect.d.ts.map
@@ -1 +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"}
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,CAClC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -2,20 +2,20 @@ import { Box } from "@upstash/box";
2
2
  import { resolveToken } from "../auth.js";
3
3
  import { startRepl } from "../repl.js";
4
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);
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;
14
16
  }
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);
17
+ console.log(`Connecting to box ${targetId}...`);
18
+ const box = await Box.get(targetId, { apiKey });
19
+ await startRepl(box);
20
20
  }
21
- //# sourceMappingURL=connect.js.map
21
+ //# sourceMappingURL=connect.js.map
@@ -1 +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"}
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,CAClC,KAAyB,EACzB,KAAmB;IAEnB,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"}
@@ -1,11 +1,11 @@
1
1
  interface CreateFlags {
2
- token?: string;
3
- runtime?: string;
4
- agentModel?: string;
5
- agentApiKey?: string;
6
- gitToken?: string;
7
- env?: string[];
2
+ token?: string;
3
+ runtime?: string;
4
+ agentModel?: string;
5
+ agentApiKey?: string;
6
+ gitToken?: string;
7
+ env?: string[];
8
8
  }
9
9
  export declare function createCommand(flags: CreateFlags): Promise<void>;
10
10
  export {};
11
- //# sourceMappingURL=create.d.ts.map
11
+ //# sourceMappingURL=create.d.ts.map
@@ -1 +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,CA8BrE"}
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,CAiCrE"}
@@ -2,33 +2,32 @@ import { Box } from "@upstash/box";
2
2
  import { resolveToken } from "../auth.js";
3
3
  import { startRepl } from "../repl.js";
4
4
  export async function createCommand(flags) {
5
- const apiKey = resolveToken(flags.token);
6
- if (flags.agentModel && !flags.agentApiKey) {
7
- console.error("Error: --agent-api-key is required if --agent-model is set");
8
- process.exit(1);
9
- }
10
- const env = {};
11
- if (flags.env) {
12
- for (const e of flags.env) {
13
- const idx = e.indexOf("=");
14
- if (idx === -1) {
15
- console.error(`Invalid env format: ${e} (expected KEY=VAL)`);
5
+ const apiKey = resolveToken(flags.token);
6
+ if (flags.agentModel && !flags.agentApiKey) {
7
+ console.error("Error: --agent-api-key is required if --agent-model is set");
16
8
  process.exit(1);
17
- }
18
- env[e.slice(0, idx)] = e.slice(idx + 1);
19
9
  }
20
- }
21
- console.log("Creating box...");
22
- const box = await Box.create({
23
- apiKey,
24
- runtime: flags.runtime,
25
- agent:
26
- flags.agentModel && flags.agentApiKey
27
- ? { model: flags.agentModel, apiKey: flags.agentApiKey }
28
- : undefined,
29
- git: flags.gitToken ? { token: flags.gitToken } : undefined,
30
- env: Object.keys(env).length > 0 ? env : undefined,
31
- });
32
- await startRepl(box);
10
+ const env = {};
11
+ if (flags.env) {
12
+ for (const e of flags.env) {
13
+ const idx = e.indexOf("=");
14
+ if (idx === -1) {
15
+ console.error(`Invalid env format: ${e} (expected KEY=VAL)`);
16
+ process.exit(1);
17
+ }
18
+ env[e.slice(0, idx)] = e.slice(idx + 1);
19
+ }
20
+ }
21
+ console.log("Creating box...");
22
+ const box = await Box.create({
23
+ apiKey,
24
+ runtime: flags.runtime,
25
+ agent: flags.agentModel && flags.agentApiKey
26
+ ? { model: flags.agentModel, apiKey: flags.agentApiKey }
27
+ : undefined,
28
+ git: flags.gitToken ? { token: flags.gitToken } : undefined,
29
+ env: Object.keys(env).length > 0 ? env : undefined,
30
+ });
31
+ await startRepl(box);
33
32
  }
34
- //# sourceMappingURL=create.js.map
33
+ //# sourceMappingURL=create.js.map
@@ -1 +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,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,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,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;QACnH,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"}
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,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,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,EACH,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,WAAW;YACnC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE;YACxD,CAAC,CAAC,SAAS;QACf,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"}
@@ -1,14 +1,11 @@
1
1
  interface FromSnapshotFlags {
2
- token?: string;
3
- runtime?: string;
4
- agentModel?: string;
5
- agentApiKey?: string;
6
- gitToken?: string;
7
- env?: string[];
2
+ token?: string;
3
+ runtime?: string;
4
+ agentModel?: string;
5
+ agentApiKey?: string;
6
+ gitToken?: string;
7
+ env?: string[];
8
8
  }
9
- export declare function fromSnapshotCommand(
10
- snapshotId: string,
11
- flags: FromSnapshotFlags,
12
- ): Promise<void>;
9
+ export declare function fromSnapshotCommand(snapshotId: string, flags: FromSnapshotFlags): Promise<void>;
13
10
  export {};
14
- //# sourceMappingURL=from-snapshot.d.ts.map
11
+ //# sourceMappingURL=from-snapshot.d.ts.map
@@ -1 +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,CA8BrG"}
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,CACvC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,IAAI,CAAC,CAiCf"}
@@ -2,33 +2,32 @@ import { Box } from "@upstash/box";
2
2
  import { resolveToken } from "../auth.js";
3
3
  import { startRepl } from "../repl.js";
4
4
  export async function fromSnapshotCommand(snapshotId, flags) {
5
- const apiKey = resolveToken(flags.token);
6
- if (flags.agentModel && !flags.agentApiKey) {
7
- console.error("Error: --agent-api-key is required if --agent-model is set");
8
- process.exit(1);
9
- }
10
- const env = {};
11
- if (flags.env) {
12
- for (const e of flags.env) {
13
- const idx = e.indexOf("=");
14
- if (idx === -1) {
15
- console.error(`Invalid env format: ${e} (expected KEY=VAL)`);
5
+ const apiKey = resolveToken(flags.token);
6
+ if (flags.agentModel && !flags.agentApiKey) {
7
+ console.error("Error: --agent-api-key is required if --agent-model is set");
16
8
  process.exit(1);
17
- }
18
- env[e.slice(0, idx)] = e.slice(idx + 1);
19
9
  }
20
- }
21
- console.log("Creating box from snapshot...");
22
- const box = await Box.fromSnapshot(snapshotId, {
23
- apiKey,
24
- runtime: flags.runtime,
25
- agent:
26
- flags.agentModel && flags.agentApiKey
27
- ? { model: flags.agentModel, apiKey: flags.agentApiKey }
28
- : undefined,
29
- git: flags.gitToken ? { token: flags.gitToken } : undefined,
30
- env: Object.keys(env).length > 0 ? env : undefined,
31
- });
32
- await startRepl(box);
10
+ const env = {};
11
+ if (flags.env) {
12
+ for (const e of flags.env) {
13
+ const idx = e.indexOf("=");
14
+ if (idx === -1) {
15
+ console.error(`Invalid env format: ${e} (expected KEY=VAL)`);
16
+ process.exit(1);
17
+ }
18
+ env[e.slice(0, idx)] = e.slice(idx + 1);
19
+ }
20
+ }
21
+ console.log("Creating box from snapshot...");
22
+ const box = await Box.fromSnapshot(snapshotId, {
23
+ apiKey,
24
+ runtime: flags.runtime,
25
+ agent: flags.agentModel && flags.agentApiKey
26
+ ? { model: flags.agentModel, apiKey: flags.agentApiKey }
27
+ : undefined,
28
+ git: flags.gitToken ? { token: flags.gitToken } : undefined,
29
+ env: Object.keys(env).length > 0 ? env : undefined,
30
+ });
31
+ await startRepl(box);
33
32
  }
34
- //# sourceMappingURL=from-snapshot.js.map
33
+ //# sourceMappingURL=from-snapshot.js.map
@@ -1 +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,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,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,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;QACnH,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"}
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,CACvC,UAAkB,EAClB,KAAwB;IAExB,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,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,EACH,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,WAAW;YACnC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE;YACxD,CAAC,CAAC,SAAS;QACf,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"}
@@ -1,6 +1,6 @@
1
1
  interface GetFlags {
2
- token?: string;
2
+ token?: string;
3
3
  }
4
4
  export declare function getCommand(boxId: string, flags: GetFlags): Promise<void>;
5
5
  export {};
6
- //# sourceMappingURL=get.d.ts.map
6
+ //# sourceMappingURL=get.d.ts.map
@@ -2,8 +2,8 @@ import { Box } from "@upstash/box";
2
2
  import { resolveToken } from "../auth.js";
3
3
  import { formatJSON } from "../output.js";
4
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 }));
5
+ const apiKey = resolveToken(flags.token);
6
+ const box = await Box.get(boxId, { apiKey });
7
+ console.log(formatJSON({ id: box.id }));
8
8
  }
9
- //# sourceMappingURL=get.js.map
9
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1,15 @@
1
+ interface InitDemoFlags {
2
+ token?: string;
3
+ agentModel?: string;
4
+ agentApiKey?: string;
5
+ runtime?: string;
6
+ gitToken?: string;
7
+ directory?: string;
8
+ }
9
+ declare function generateEnvFile(flags: InitDemoFlags, token: string): string;
10
+ declare function generateMainTs(dir: string): string;
11
+ declare function generateReadme(dir: string): string;
12
+ export declare function initDemoCommand(flags: InitDemoFlags): Promise<void>;
13
+ export { generateEnvFile, generateMainTs, generateReadme };
14
+ export type { InitDemoFlags };
15
+ //# sourceMappingURL=init-demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-demo.d.ts","sourceRoot":"","sources":["../../src/commands/init-demo.ts"],"names":[],"mappings":"AAaA,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iBAAS,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CASpE;AAED,iBAAS,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAgF3C;AAED,iBAAS,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkC3C;AAeD,wBAAsB,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DzE;AAED,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,202 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { execSync } from "node:child_process";
4
+ import readline from "node:readline";
5
+ import { resolveToken } from "../auth.js";
6
+ const bold = (s) => `\x1b[1m${s}\x1b[22m`;
7
+ const cyan = (s) => `\x1b[36m${s}\x1b[39m`;
8
+ const green = (s) => `\x1b[32m${s}\x1b[39m`;
9
+ const dim = (s) => `\x1b[2m${s}\x1b[22m`;
10
+ const red = (s) => `\x1b[31m${s}\x1b[39m`;
11
+ const yellow = (s) => `\x1b[33m${s}\x1b[39m`;
12
+ function generateEnvFile(flags, token) {
13
+ const lines = [
14
+ `UPSTASH_BOX_API_KEY=${token}`,
15
+ `AGENT_MODEL=${flags.agentModel ?? ""}`,
16
+ `AGENT_API_KEY=${flags.agentApiKey ?? ""}`,
17
+ `RUNTIME=${flags.runtime ?? "node"}`,
18
+ `GIT_TOKEN=${flags.gitToken ?? ""}`,
19
+ ];
20
+ return lines.join("\n") + "\n";
21
+ }
22
+ function generateMainTs(dir) {
23
+ return `import "dotenv/config";
24
+ import { Box } from "@upstash/box";
25
+
26
+ async function main() {
27
+ const config: Parameters<typeof Box.create>[0] = {
28
+ apiKey: process.env.UPSTASH_BOX_API_KEY!,
29
+ };
30
+
31
+ if (process.env.RUNTIME) {
32
+ config.runtime = process.env.RUNTIME;
33
+ }
34
+
35
+ if (process.env.AGENT_MODEL && process.env.AGENT_API_KEY) {
36
+ config.agent = {
37
+ model: process.env.AGENT_MODEL,
38
+ apiKey: process.env.AGENT_API_KEY,
39
+ };
40
+ }
41
+
42
+ if (process.env.GIT_TOKEN) {
43
+ config.git = { token: process.env.GIT_TOKEN };
44
+ }
45
+
46
+ console.log("Creating box...");
47
+ const box = await Box.create(config);
48
+ console.log(\`Box created: \${box.id}\`);
49
+
50
+ try {
51
+ // Write a file
52
+ console.log("\\nWriting hello.txt...");
53
+ await box.files.write({ path: "hello.txt", content: "Hello from Upstash Box!" });
54
+ console.log("File written.");
55
+
56
+ // Read it back
57
+ console.log("\\nReading hello.txt...");
58
+ const content = await box.files.read("hello.txt");
59
+ console.log(\`Content: \${content}\`);
60
+
61
+ // Execute a command
62
+ console.log("\\nRunning: ls -la");
63
+ const run = await box.exec("ls -la");
64
+ const output = await run.result();
65
+ console.log(output);
66
+
67
+ // List files
68
+ console.log("Listing files...");
69
+ const files = await box.files.list(".");
70
+ console.log(files.map((f: { name: string }) => f.name).join(" "));
71
+
72
+ // Agent demo (if configured)
73
+ if (process.env.AGENT_MODEL && process.env.AGENT_API_KEY) {
74
+ console.log("\\nRunning agent prompt...");
75
+ const stream = box.agent.stream({
76
+ prompt: "Create a file called demo.js that prints 'Hello World'",
77
+ });
78
+ for await (const chunk of stream) {
79
+ process.stdout.write(chunk);
80
+ }
81
+ console.log();
82
+ }
83
+
84
+ // Git demo (if configured)
85
+ if (process.env.GIT_TOKEN) {
86
+ console.log("\\nGit status:");
87
+ const gitRun = await box.exec("git status");
88
+ const gitOutput = await gitRun.result();
89
+ console.log(gitOutput);
90
+ }
91
+ } finally {
92
+ // Pause so you can check logs on the Upstash console
93
+ console.log("\\nPausing box...");
94
+ await box.pause();
95
+ console.log(\`Box \${box.id} paused. You can check your logs on the Upstash console.\`);
96
+ console.log(\`\\n\\x1b[2mTo reconnect to this box:\\x1b[22m\\n\\n \\x1b[36mcd ${dir} && npx @upstash/box-cli connect \${box.id}\\x1b[39m\\n\`);
97
+ }
98
+ }
99
+
100
+ main().catch(console.error);
101
+ `;
102
+ }
103
+ function generateReadme(dir) {
104
+ return `# Box Demo
105
+
106
+ A standalone demo project for the [@upstash/box](https://www.npmjs.com/package/@upstash/box) SDK.
107
+
108
+ ## Environment Variables
109
+
110
+ Configure these in the \`.env\` file:
111
+
112
+ | Variable | Description | Required |
113
+ | ---------------------- | ------------------------------------------------ | -------- |
114
+ | \`UPSTASH_BOX_API_KEY\` | Your Upstash Box API token | Yes |
115
+ | \`AGENT_MODEL\` | Agent model identifier (e.g. \`claude/sonnet_4_5\`) | No |
116
+ | \`AGENT_API_KEY\` | API key for the agent model | No |
117
+ | \`RUNTIME\` | Runtime environment (default: \`node\`) | No |
118
+ | \`GIT_TOKEN\` | GitHub personal access token | No |
119
+
120
+ ## What the demo does
121
+
122
+ 1. Creates a new box
123
+ 2. Writes a file and reads it back
124
+ 3. Executes a shell command (\`ls -la\`)
125
+ 4. Lists files in the box
126
+ 5. (If agent configured) Runs an agent prompt with streaming
127
+ 6. (If git configured) Shows git status
128
+ 7. Pauses the box so you can check logs on the Upstash console
129
+
130
+ ## Running
131
+
132
+ \`\`\`bash
133
+ cd ${dir}
134
+ npx tsx main.ts
135
+ \`\`\`
136
+ `;
137
+ }
138
+ function askQuestion(query) {
139
+ const rl = readline.createInterface({
140
+ input: process.stdin,
141
+ output: process.stdout,
142
+ });
143
+ return new Promise((resolve) => {
144
+ rl.question(query, (answer) => {
145
+ rl.close();
146
+ resolve(answer.trim().toLowerCase());
147
+ });
148
+ });
149
+ }
150
+ export async function initDemoCommand(flags) {
151
+ const token = resolveToken(flags.token);
152
+ if (flags.agentModel && !flags.agentApiKey) {
153
+ console.error(red("Error: --agent-api-key is required if --agent-model is set"));
154
+ process.exit(1);
155
+ }
156
+ const dir = flags.directory ?? "box-demo";
157
+ const absDir = path.resolve(dir);
158
+ if (fs.existsSync(absDir)) {
159
+ console.error(red(`Error: Directory "${dir}" already exists.`));
160
+ process.exit(1);
161
+ }
162
+ // Confirmation prompt
163
+ console.log(`\nThis command will:\n`);
164
+ console.log(` ${cyan("1.")} Create a directory ${bold(cyan(dir))}`);
165
+ console.log(` ${cyan("2.")} Install ${bold("@upstash/box")} and dependencies`);
166
+ console.log(` ${cyan("3.")} Prepare an example script to showcase Upstash Box\n`);
167
+ const confirm = await askQuestion(`Proceed? ${dim("(Y/n)")} `);
168
+ if (confirm !== "" && confirm !== "y" && confirm !== "yes") {
169
+ console.log(dim("Aborted."));
170
+ return;
171
+ }
172
+ fs.mkdirSync(absDir, { recursive: true });
173
+ console.log(`\nInitializing demo project in ${cyan(dir)}/...`);
174
+ execSync('npm init -y && npm pkg set type="module"', {
175
+ cwd: absDir,
176
+ stdio: "ignore",
177
+ });
178
+ console.log(`Installing dependencies...`);
179
+ execSync("npm install @upstash/box dotenv", { cwd: absDir, stdio: "ignore" });
180
+ execSync("npm install --save-dev @types/node", {
181
+ cwd: absDir,
182
+ stdio: "ignore",
183
+ });
184
+ fs.writeFileSync(path.join(absDir, ".env"), generateEnvFile(flags, token));
185
+ fs.writeFileSync(path.join(absDir, "main.ts"), generateMainTs(dir));
186
+ fs.writeFileSync(path.join(absDir, "README.md"), generateReadme(dir));
187
+ console.log(`\n${green("Demo project created in")} ${bold(cyan(dir))}/`);
188
+ console.log(` ${cyan(".env")} ${dim("—")} environment variables`);
189
+ console.log(` ${cyan("main.ts")} ${dim("—")} demo script`);
190
+ console.log(` ${cyan("README.md")} ${dim("—")} documentation\n`);
191
+ console.log(`See ${cyan("README.md")} for details on configuration and usage.\n`);
192
+ const answer = await askQuestion(`Run the demo now? ${dim("(Y/n)")} `);
193
+ if (answer === "" || answer === "y" || answer === "yes") {
194
+ console.log(yellow("\nRunning demo...\n"));
195
+ execSync("npx tsx main.ts", { cwd: absDir, stdio: "inherit" });
196
+ }
197
+ else {
198
+ console.log(`\nTo run later:\n ${cyan(`cd ${dir} && npx tsx main.ts`)}`);
199
+ }
200
+ }
201
+ export { generateEnvFile, generateMainTs, generateReadme };
202
+ //# sourceMappingURL=init-demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-demo.js","sourceRoot":"","sources":["../../src/commands/init-demo.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  interface ListFlags {
2
- token?: string;
2
+ token?: string;
3
3
  }
4
4
  export declare function listCommand(flags: ListFlags): Promise<void>;
5
5
  export {};
6
- //# sourceMappingURL=list.d.ts.map
6
+ //# sourceMappingURL=list.d.ts.map
@@ -1 +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,CAuBjE"}
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,CAoBjE"}