@itssergio91/sandman 0.2.0 → 0.3.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.
Files changed (136) hide show
  1. package/README.md +54 -272
  2. package/dist/cli/commands/cli-contract.test.d.ts +2 -0
  3. package/dist/cli/commands/cli-contract.test.d.ts.map +1 -0
  4. package/dist/cli/commands/cli-contract.test.js +217 -0
  5. package/dist/cli/commands/cli-contract.test.js.map +1 -0
  6. package/dist/cli/commands/connect.d.ts +1 -0
  7. package/dist/cli/commands/connect.d.ts.map +1 -1
  8. package/dist/cli/commands/connect.js +67 -42
  9. package/dist/cli/commands/connect.js.map +1 -1
  10. package/dist/cli/commands/create.d.ts +7 -2
  11. package/dist/cli/commands/create.d.ts.map +1 -1
  12. package/dist/cli/commands/create.js +158 -46
  13. package/dist/cli/commands/create.js.map +1 -1
  14. package/dist/cli/commands/destroy.d.ts.map +1 -1
  15. package/dist/cli/commands/destroy.js +27 -23
  16. package/dist/cli/commands/destroy.js.map +1 -1
  17. package/dist/cli/commands/doctor.d.ts +8 -0
  18. package/dist/cli/commands/doctor.d.ts.map +1 -0
  19. package/dist/cli/commands/doctor.js +124 -0
  20. package/dist/cli/commands/doctor.js.map +1 -0
  21. package/dist/cli/commands/enable.d.ts +1 -2
  22. package/dist/cli/commands/enable.d.ts.map +1 -1
  23. package/dist/cli/commands/enable.js +75 -46
  24. package/dist/cli/commands/enable.js.map +1 -1
  25. package/dist/cli/commands/init.d.ts +2 -2
  26. package/dist/cli/commands/init.d.ts.map +1 -1
  27. package/dist/cli/commands/init.js +49 -17
  28. package/dist/cli/commands/init.js.map +1 -1
  29. package/dist/cli/commands/list.d.ts.map +1 -1
  30. package/dist/cli/commands/list.js +25 -18
  31. package/dist/cli/commands/list.js.map +1 -1
  32. package/dist/cli/commands/providers.d.ts +6 -0
  33. package/dist/cli/commands/providers.d.ts.map +1 -0
  34. package/dist/cli/commands/providers.js +20 -0
  35. package/dist/cli/commands/providers.js.map +1 -0
  36. package/dist/cli/commands/status.d.ts.map +1 -1
  37. package/dist/cli/commands/status.js +88 -50
  38. package/dist/cli/commands/status.js.map +1 -1
  39. package/dist/cli/env-name.d.ts +7 -0
  40. package/dist/cli/env-name.d.ts.map +1 -0
  41. package/dist/cli/env-name.js +9 -0
  42. package/dist/cli/env-name.js.map +1 -0
  43. package/dist/cli/env-name.test.d.ts +2 -0
  44. package/dist/cli/env-name.test.d.ts.map +1 -0
  45. package/dist/cli/env-name.test.js +38 -0
  46. package/dist/cli/env-name.test.js.map +1 -0
  47. package/dist/cli/index.d.ts.map +1 -1
  48. package/dist/cli/index.js +43 -11
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/cli/output.d.ts +28 -0
  51. package/dist/cli/output.d.ts.map +1 -0
  52. package/dist/cli/output.js +60 -0
  53. package/dist/cli/output.js.map +1 -0
  54. package/dist/cli/output.test.d.ts +2 -0
  55. package/dist/cli/output.test.d.ts.map +1 -0
  56. package/dist/cli/output.test.js +78 -0
  57. package/dist/cli/output.test.js.map +1 -0
  58. package/dist/cli/reap.d.ts +11 -0
  59. package/dist/cli/reap.d.ts.map +1 -0
  60. package/dist/cli/reap.js +32 -0
  61. package/dist/cli/reap.js.map +1 -0
  62. package/dist/cli/secrets.d.ts +8 -0
  63. package/dist/cli/secrets.d.ts.map +1 -0
  64. package/dist/cli/secrets.js +30 -0
  65. package/dist/cli/secrets.js.map +1 -0
  66. package/dist/core/state-store.d.ts +15 -1
  67. package/dist/core/state-store.d.ts.map +1 -1
  68. package/dist/core/state-store.js +168 -33
  69. package/dist/core/state-store.js.map +1 -1
  70. package/dist/core/state-store.test.js +40 -0
  71. package/dist/core/state-store.test.js.map +1 -1
  72. package/dist/index.js +0 -0
  73. package/dist/providers/aws/adapter.d.ts +13 -2
  74. package/dist/providers/aws/adapter.d.ts.map +1 -1
  75. package/dist/providers/aws/adapter.js +402 -63
  76. package/dist/providers/aws/adapter.js.map +1 -1
  77. package/dist/providers/aws/adapter.test.js +300 -191
  78. package/dist/providers/aws/adapter.test.js.map +1 -1
  79. package/dist/providers/base.d.ts +1 -9
  80. package/dist/providers/base.d.ts.map +1 -1
  81. package/dist/providers/base.js.map +1 -1
  82. package/dist/providers/base.test.js +12 -2
  83. package/dist/providers/base.test.js.map +1 -1
  84. package/dist/providers/catalog.d.ts +15 -0
  85. package/dist/providers/catalog.d.ts.map +1 -0
  86. package/dist/providers/catalog.js +53 -0
  87. package/dist/providers/catalog.js.map +1 -0
  88. package/dist/providers/cloudflare/adapter.d.ts +5 -2
  89. package/dist/providers/cloudflare/adapter.d.ts.map +1 -1
  90. package/dist/providers/cloudflare/adapter.js +17 -5
  91. package/dist/providers/cloudflare/adapter.js.map +1 -1
  92. package/dist/providers/cloudflare/adapter.test.js +4 -4
  93. package/dist/providers/cloudflare/adapter.test.js.map +1 -1
  94. package/dist/providers/enable-result.d.ts +9 -0
  95. package/dist/providers/enable-result.d.ts.map +1 -0
  96. package/dist/providers/enable-result.js +26 -0
  97. package/dist/providers/enable-result.js.map +1 -0
  98. package/dist/providers/gcp/adapter.d.ts +9 -3
  99. package/dist/providers/gcp/adapter.d.ts.map +1 -1
  100. package/dist/providers/gcp/adapter.js +115 -20
  101. package/dist/providers/gcp/adapter.js.map +1 -1
  102. package/dist/providers/gcp/adapter.test.js +52 -0
  103. package/dist/providers/gcp/adapter.test.js.map +1 -1
  104. package/dist/providers/index.d.ts +5 -2
  105. package/dist/providers/index.d.ts.map +1 -1
  106. package/dist/providers/index.js +13 -0
  107. package/dist/providers/index.js.map +1 -1
  108. package/dist/providers/vercel/adapter.d.ts +5 -2
  109. package/dist/providers/vercel/adapter.d.ts.map +1 -1
  110. package/dist/providers/vercel/adapter.js +17 -5
  111. package/dist/providers/vercel/adapter.js.map +1 -1
  112. package/dist/providers/vercel/adapter.test.js +4 -4
  113. package/dist/providers/vercel/adapter.test.js.map +1 -1
  114. package/dist/types/index.d.ts +40 -1
  115. package/dist/types/index.d.ts.map +1 -1
  116. package/dist/types/index.js +4 -0
  117. package/dist/types/index.js.map +1 -1
  118. package/dist/utils/cost-estimator.d.ts +2 -0
  119. package/dist/utils/cost-estimator.d.ts.map +1 -1
  120. package/dist/utils/cost-estimator.js +23 -0
  121. package/dist/utils/cost-estimator.js.map +1 -1
  122. package/dist/utils/cost-estimator.test.js +16 -1
  123. package/dist/utils/cost-estimator.test.js.map +1 -1
  124. package/dist/utils/logger.d.ts +8 -0
  125. package/dist/utils/logger.d.ts.map +1 -0
  126. package/dist/utils/logger.js +12 -0
  127. package/dist/utils/logger.js.map +1 -0
  128. package/dist/utils/ttl.d.ts +13 -0
  129. package/dist/utils/ttl.d.ts.map +1 -0
  130. package/dist/utils/ttl.js +35 -0
  131. package/dist/utils/ttl.js.map +1 -0
  132. package/dist/utils/ttl.test.d.ts +2 -0
  133. package/dist/utils/ttl.test.d.ts.map +1 -0
  134. package/dist/utils/ttl.test.js +27 -0
  135. package/dist/utils/ttl.test.js.map +1 -0
  136. package/package.json +12 -5
package/README.md CHANGED
@@ -1,320 +1,102 @@
1
- ---
2
-
3
- / \_**_| | |
4
- | (_** ** \_ \_ ** **| |\_ ** **\_ ** \_ _ **
5
- \_** \ / _` | '_ \ / _` | '_ ` _ \ / _` | '_ \
6
- \_**_) | (_| | | | | (_| | | | | | | (_| | | | |
7
- |\_\_\_**/ \__,_|_| |_|\__,_|_| |_| |\_|\__,_|_| |_|
8
-
9
- Provision disposable cloud environments in seconds.
10
-
11
- Sandman is an open-source CLI that creates disposable cloud environments for AWS and GCP in seconds.
12
-
13
- Perfect for:
14
-
15
- - DevTool demos
16
- - AI builders testing infrastructure
17
- - Rapid prototyping
18
- - Disposable sandbox environments
19
- - Infrastructure experimentation
20
-
21
- Instead of manually configuring billing, IAM, APIs, and services, Sandman spins up a working environment instantly.
22
-
23
- ---
24
-
25
- ## Why Sandman?
26
-
27
- Creating cloud infrastructure manually is slow.
28
-
29
- Even experienced engineers must:
30
-
31
- ### AWS
32
-
33
- • configure IAM
34
- • create VPCs
35
- • provision compute
36
- • configure credentials
37
-
38
- ### GCP
39
-
40
- • create a project
41
- • connect billing
42
- • enable APIs
43
- • configure service accounts
44
-
45
- This can take **30–90 minutes**.
46
-
47
- Sandman reduces that to **seconds**.
48
-
49
- ---
50
-
51
- ## Features
52
-
53
- • Create disposable cloud environments
54
- • Automatic project provisioning
55
- • Billing configuration helpers
56
- • Enable common cloud services
57
- • Credential management
58
- • Environment teardown
59
-
60
- Supported providers:
61
-
62
- - AWS
63
- - GCP
64
-
65
- Future support:
66
-
67
- - Cloudflare
68
- - DigitalOcean
69
- - Render
70
-
71
- ---
72
-
73
- ## Installation
74
-
75
- ### Using npm
76
-
77
- ```bash
78
- npm install -g @itssergio91/sandman
79
- ```
1
+ # Sandman
80
2
 
81
- Or run without installing:
82
-
83
- ```bash
84
- npx @itssergio91/sandman
85
- ```
86
-
87
- ---
88
-
89
- ## Quick Start
90
-
91
- Initialize a cloud provider.
92
-
93
- ```bash
94
- sandman init gcp
3
+ ```text
4
+ ____ _
5
+ / ___| __ _ _ __ __| |_ __ ___ __ _ _ __
6
+ \___ \ / _` | '_ \ / _` | '_ ` _ \ / _` | '_ \
7
+ ___) | (_| | | | | (_| | | | | | | (_| | | | |
8
+ |____/ \__,_|_| |_|\__,_|_| |_| |_|\__,_|_| |_|
95
9
  ```
96
10
 
97
- Create a sandbox environment.
11
+ **Disposable cloud environments in seconds.**
98
12
 
99
- ```bash
100
- sandman create demo
101
- ```
13
+ Sandman is an open-source CLI that provisions clean, isolated environments on
14
+ AWS, GCP, Cloudflare, and Vercel — no billing setup, IAM wrangling, or API
15
+ configuration. Spin one up for a demo or experiment, tear it down when you're
16
+ done.
102
17
 
103
- Enable services.
18
+ - **DevTool demos** — a fresh environment for every product demo
19
+ - **AI builders** — test infrastructure without touching production
20
+ - **Rapid prototyping** — go from idea to a running cloud in seconds
21
+ - **Experimentation** — learn cloud services on throwaway infrastructure
104
22
 
105
- ```bash
106
- sandman enable compute storage cloudrun
107
- ```
108
-
109
- Connect to the environment.
110
-
111
- ```bash
112
- sandman connect demo
113
- ```
114
-
115
- Destroy the environment when finished.
116
-
117
- ```bash
118
- sandman destroy demo
119
- ```
23
+ All commands accept `--json` for machine-readable output, built for humans and agents alike.
120
24
 
121
25
  ---
122
26
 
123
- ## Example Workflow
124
-
125
- Create a sandbox for testing.
27
+ ## Quick start
126
28
 
127
29
  ```bash
128
- sandman init gcp
129
- sandman create demo-env
130
- sandman enable compute storage cloudrun
131
- sandman connect demo-env
30
+ sandman init gcp # authenticate and configure credentials
31
+ sandman create demo # provision a new environment
32
+ sandman enable compute storage cloudrun # turn on the services you need
33
+ sandman connect demo # print environment credentials
34
+ sandman destroy demo # delete everything when finished
132
35
  ```
133
36
 
134
- Run your application or tests against the environment.
135
-
136
- Then destroy it when finished.
137
-
138
- ```bash
139
- sandman destroy demo-env
140
- ```
37
+ For AWS, enable services with `sandman enable ec2 s3 lambda`.
141
38
 
142
39
  ---
143
40
 
144
41
  ## Commands
145
42
 
146
- ### Initialize provider
147
-
148
- ```bash
149
- sandman init aws
150
- sandman init gcp
151
- ```
152
-
153
- Authenticates and configures credentials.
43
+ | Command | Description |
44
+ | --- | --- |
45
+ | `sandman init <provider>` | Authenticate and configure credentials |
46
+ | `sandman create <name>` | Provision a new environment (supports `--ttl`, `--dry-run`) |
47
+ | `sandman enable <services...>` | Enable services in the environment |
48
+ | `sandman list` | List environments |
49
+ | `sandman status <name>` | Show status, resources, and estimated cost |
50
+ | `sandman connect <name>` | Output environment credentials |
51
+ | `sandman destroy <name>` | Delete the environment and all resources |
52
+ | `sandman providers` | Show the live provider capability matrix |
53
+ | `sandman doctor` | Check init state, auth, and reap expired environments (`--reap`) |
154
54
 
155
55
  ---
156
56
 
157
- ### Create environment
158
-
159
- ```bash
160
- sandman create <environment-name>
161
- ```
162
-
163
- Example:
164
-
165
- ```bash
166
- sandman create demo
167
- ```
168
-
169
- ---
170
-
171
- ### Enable services
172
-
173
- AWS example:
174
-
175
- ```bash
176
- sandman enable ec2 s3 lambda
177
- ```
178
-
179
- GCP example:
180
-
181
- ```bash
182
- sandman enable compute storage cloudrun
183
- ```
184
-
185
- ---
186
-
187
- ### List environments
188
-
189
- ```bash
190
- sandman list
191
- ```
192
-
193
- ---
194
-
195
- ### Connect environment
57
+ ## Installation
196
58
 
197
59
  ```bash
198
- sandman connect <environment-name>
60
+ npm install -g @itssergio91/sandman
199
61
  ```
200
62
 
201
- Outputs environment credentials.
202
-
203
- ---
204
-
205
- ### Destroy environment
63
+ Or run without installing:
206
64
 
207
65
  ```bash
208
- sandman destroy <environment-name>
66
+ npx @itssergio91/sandman
209
67
  ```
210
68
 
211
- Deletes all associated resources.
212
-
213
- ---
214
-
215
- ## Architecture
216
-
217
- Sandman consists of three layers.
218
-
219
- CLI
220
-
221
- Provisioning Engine
222
-
223
- Cloud Provider APIs
224
-
225
- Components:
226
-
227
- - CLI layer
228
- - Provisioning engine
229
- - Provider adapters
230
-
231
69
  ---
232
70
 
233
71
  ## Providers
234
72
 
235
- ### AWS
236
-
237
- Uses AWS SDK to provision:
238
-
239
- - VPC
240
- - EC2
241
- - S3
242
- - IAM roles
243
-
244
- ---
245
-
246
- ### GCP
247
-
248
- Uses Google Cloud APIs to provision:
249
-
250
- - projects
251
- - billing connections
252
- - cloud run
253
- - storage buckets
254
- - service accounts
255
-
256
- ---
257
-
258
- ## Use Cases
259
-
260
- ### DevTool demos
261
-
262
- Create disposable environments for product demos.
263
-
264
- ### Rapid experimentation
73
+ | Provider | Status |
74
+ | --- | --- |
75
+ | AWS | Supported |
76
+ | GCP | ✅ Supported |
77
+ | Cloudflare | 🧪 Experimental |
78
+ | Vercel | 🧪 Experimental |
79
+ | DigitalOcean | 🚧 Planned |
80
+ | Render | 🚧 Planned |
265
81
 
266
- Spin up temporary environments to test infrastructure or integrations.
267
-
268
- ### Learning cloud infrastructure
269
-
270
- Practice working with cloud services without maintaining long-lived infrastructure.
271
-
272
- ---
273
-
274
- ## Project Structure
275
-
276
- ```
277
- sandman/
278
-
279
- src/
280
- cli/
281
- providers/
282
- templates/
283
- utils/
284
-
285
- docs/
286
- PRD.md
287
-
288
- package.json
289
- ```
82
+ Run `sandman providers` to see the live capability matrix.
290
83
 
291
84
  ---
292
85
 
293
86
  ## Roadmap
294
87
 
295
- Planned features:
88
+ - Environment templates
89
+ - Multi-cloud provisioning (Cloudflare / Vercel beyond experimental)
90
+ - GitHub demo environments
91
+ - Local testing environments
296
92
 
297
- Environment templates
298
- • Multi-cloud provisioning
299
- • GitHub demo environments
300
- • Local testing environments
93
+ See the [issue tracker](https://github.com/BoringInfraCo/Sandman/issues) for the full list.
301
94
 
302
95
  ---
303
96
 
304
97
  ## Contributing
305
98
 
306
- Pull requests are welcome.
307
-
308
- To contribute:
309
-
310
- ```bash
311
- git clone https://github.com/your-org/sandman
312
- cd sandman
313
- npm install
314
- npm run dev
315
- ```
316
-
317
- ---
99
+ Pull requests are welcome. Clone the repo, run `npm install` and `npm test`, and open a PR.
318
100
 
319
101
  ## License
320
102
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli-contract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-contract.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cli-contract.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,217 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import { promises as fs } from "fs";
3
+ import { StateStore } from "../../core/state-store.js";
4
+ import { createEnvironment } from "./create.js";
5
+ import { destroyEnvironment } from "./destroy.js";
6
+ import { enableServices } from "./enable.js";
7
+ import { statusEnvironment } from "./status.js";
8
+ import { listProviders } from "./providers.js";
9
+ import { doctor } from "./doctor.js";
10
+ const testConfigPath = "/tmp/sandman-cli-command-tests.json";
11
+ function mockExit() {
12
+ return vi.spyOn(process, "exit").mockImplementation(((code) => {
13
+ throw new Error(`EXIT:${code}`);
14
+ }));
15
+ }
16
+ describe("CLI commands", () => {
17
+ afterEach(async () => {
18
+ vi.restoreAllMocks();
19
+ try {
20
+ await fs.unlink(testConfigPath);
21
+ }
22
+ catch {
23
+ // ignore
24
+ }
25
+ try {
26
+ await fs.unlink(`${testConfigPath}.lock`);
27
+ }
28
+ catch {
29
+ // ignore
30
+ }
31
+ });
32
+ it("rejects unsafe environment names in JSON mode", async () => {
33
+ const store = new StateStore(testConfigPath);
34
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
35
+ mockExit();
36
+ await expect(createEnvironment("Bad Name", { provider: "aws" }, store, {
37
+ json: true,
38
+ dryRun: true,
39
+ })).rejects.toThrow(/EXIT:1/);
40
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
41
+ expect(parsed.success).toBe(false);
42
+ expect(parsed.code).toBe("INVALID_NAME");
43
+ });
44
+ it("does not hang on destroy --json without -y", async () => {
45
+ const store = new StateStore(testConfigPath);
46
+ await store.saveEnvironment({
47
+ name: "demo",
48
+ provider: "aws",
49
+ status: "active",
50
+ services: [],
51
+ resources: {},
52
+ createdAt: "2026-01-01T00:00:00.000Z",
53
+ updatedAt: "2026-01-01T00:00:00.000Z",
54
+ });
55
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
56
+ mockExit();
57
+ await expect(destroyEnvironment("demo", store, { confirmed: false, json: true })).rejects.toThrow(/EXIT:1/);
58
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
59
+ expect(parsed.code).toBe("CONFIRMATION_REQUIRED");
60
+ expect(parsed.next[0]).toContain("-y");
61
+ });
62
+ it("returns JSON for status when the environment is missing", async () => {
63
+ const store = new StateStore(testConfigPath);
64
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
65
+ mockExit();
66
+ await expect(statusEnvironment("missing", store, { json: true })).rejects.toThrow(/EXIT:1/);
67
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
68
+ expect(parsed.success).toBe(false);
69
+ expect(parsed.code).toBe("NOT_FOUND");
70
+ });
71
+ it("lists valid Cloudflare services instead of crashing", async () => {
72
+ const store = new StateStore(testConfigPath);
73
+ await store.saveEnvironment({
74
+ name: "cf-demo",
75
+ provider: "cloudflare",
76
+ status: "active",
77
+ services: [],
78
+ resources: {},
79
+ createdAt: "2026-01-01T00:00:00.000Z",
80
+ updatedAt: "2026-01-01T00:00:00.000Z",
81
+ });
82
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
83
+ mockExit();
84
+ await expect(enableServices(["not-a-service"], "cf-demo", store, { json: true })).rejects.toThrow(/EXIT:1/);
85
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
86
+ expect(parsed.code).toBe("INVALID_SERVICE");
87
+ expect(parsed.validServices).toContain("workers");
88
+ });
89
+ it("exposes provider maturity for agents", async () => {
90
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
91
+ await listProviders({ json: true });
92
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
93
+ expect(parsed.success).toBe(true);
94
+ const cf = parsed.providers.find((p) => p.id === "cloudflare");
95
+ expect(cf.maturity).toBe("experimental");
96
+ const aws = parsed.providers.find((p) => p.id === "aws");
97
+ expect(aws.maturity).toBe("supported");
98
+ });
99
+ it("allows recreate after destroy via dry-run", async () => {
100
+ const store = new StateStore(testConfigPath);
101
+ await store.saveEnvironment({
102
+ name: "demo",
103
+ provider: "aws",
104
+ status: "destroyed",
105
+ services: [],
106
+ resources: {},
107
+ createdAt: "2026-01-01T00:00:00.000Z",
108
+ updatedAt: "2026-01-01T00:00:00.000Z",
109
+ });
110
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
111
+ await createEnvironment("demo", { provider: "aws" }, store, {
112
+ json: true,
113
+ dryRun: true,
114
+ });
115
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
116
+ expect(parsed.success).toBe(true);
117
+ expect(parsed.dryRun).toBe(true);
118
+ expect(parsed.name).toBe("demo");
119
+ });
120
+ it("rejects recreate when the existing record is still active", async () => {
121
+ const store = new StateStore(testConfigPath);
122
+ await store.saveEnvironment({
123
+ name: "demo",
124
+ provider: "aws",
125
+ status: "active",
126
+ services: [],
127
+ resources: {},
128
+ createdAt: "2026-01-01T00:00:00.000Z",
129
+ updatedAt: "2026-01-01T00:00:00.000Z",
130
+ });
131
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
132
+ mockExit();
133
+ await expect(createEnvironment("demo", { provider: "aws" }, store, {
134
+ json: true,
135
+ dryRun: true,
136
+ })).rejects.toThrow(/EXIT:1/);
137
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
138
+ expect(parsed.code).toBe("ALREADY_EXISTS");
139
+ });
140
+ it("passes the requested region through dry-run create", async () => {
141
+ const store = new StateStore(testConfigPath);
142
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
143
+ await createEnvironment("demo", { provider: "aws", region: "eu-west-1" }, store, { json: true, dryRun: true });
144
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
145
+ expect(parsed.success).toBe(true);
146
+ expect(parsed.region).toBe("eu-west-1");
147
+ });
148
+ it("rejects an invalid create TTL", async () => {
149
+ const store = new StateStore(testConfigPath);
150
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
151
+ mockExit();
152
+ await expect(createEnvironment("demo", { provider: "aws", ttl: "two-hours" }, store, { json: true, dryRun: true })).rejects.toThrow(/EXIT:1/);
153
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
154
+ expect(parsed.code).toBe("INVALID_TTL");
155
+ });
156
+ it("passes ttl, billing, and strict through dry-run create", async () => {
157
+ const store = new StateStore(testConfigPath);
158
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
159
+ await createEnvironment("demo", { provider: "gcp", region: "us-central1", billingAccount: "AAAAAA-BBBBBB-CCCCCC", ttl: "2h" }, store, { json: true, dryRun: true, strict: true });
160
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
161
+ expect(parsed.success).toBe(true);
162
+ expect(parsed.ttl).toBe("2h");
163
+ expect(parsed.expiresAt).toBeDefined();
164
+ expect(parsed.billingAccount).toBe("AAAAAA-BBBBBB-CCCCCC");
165
+ expect(parsed.strict).toBe(true);
166
+ });
167
+ it("reports local-only when enabling lambda on AWS", async () => {
168
+ const store = new StateStore(testConfigPath);
169
+ await store.saveEnvironment({
170
+ name: "demo",
171
+ provider: "aws",
172
+ status: "active",
173
+ services: [],
174
+ resources: { bucketName: "sandman-demo-1", instanceId: "i-1" },
175
+ createdAt: "2026-01-01T00:00:00.000Z",
176
+ updatedAt: "2026-01-01T00:00:00.000Z",
177
+ });
178
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
179
+ await enableServices(["lambda", "s3"], "demo", store, { json: true });
180
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
181
+ expect(parsed.success).toBe(true);
182
+ expect(parsed.mode).toBe("mixed");
183
+ expect(parsed.localOnly).toContain("lambda");
184
+ expect(parsed.provisioned).toContain("s3");
185
+ });
186
+ it("reaps an expired environment on status", async () => {
187
+ const store = new StateStore(testConfigPath);
188
+ await store.saveEnvironment({
189
+ name: "old",
190
+ provider: "cloudflare",
191
+ status: "active",
192
+ services: [],
193
+ resources: {},
194
+ createdAt: "2020-01-01T00:00:00.000Z",
195
+ updatedAt: "2020-01-01T00:00:00.000Z",
196
+ expiresAt: "2020-01-02T00:00:00.000Z",
197
+ ttl: "1h",
198
+ });
199
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
200
+ await statusEnvironment("old", store, { json: true });
201
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
202
+ expect(parsed.reaped).toBe(true);
203
+ expect(parsed.status).toBe("destroyed");
204
+ expect(await store.getEnvironment("old")).toBeUndefined();
205
+ });
206
+ it("prints doctor JSON without requiring cloud auth", async () => {
207
+ const store = new StateStore(testConfigPath);
208
+ const log = vi.spyOn(console, "log").mockImplementation(() => { });
209
+ await doctor(store, { json: true });
210
+ const parsed = JSON.parse(String(log.mock.calls[0][0]));
211
+ expect(parsed.success).toBe(true);
212
+ expect(parsed.initialized).toBe(false);
213
+ expect(parsed.configPath).toBe(testConfigPath);
214
+ expect(parsed.auth.VERCEL_TOKEN).toMatch(/set|missing/);
215
+ });
216
+ });
217
+ //# sourceMappingURL=cli-contract.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-contract.test.js","sourceRoot":"","sources":["../../../src/cli/commands/cli-contract.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { StateStore } from '../../core/state-store.js';
2
2
  interface ConnectOptions {
3
3
  json?: boolean;
4
+ showSecrets?: boolean;
4
5
  }
5
6
  export declare function connectEnvironment(name: string, store: StateStore, options?: ConnectOptions): Promise<void>;
6
7
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/connect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIvD,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAqEf"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/connect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAMvD,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAiGf"}