@itssergio91/sandman 0.2.1 → 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 +46 -266
  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
@@ -8,74 +8,54 @@
8
8
  |____/ \__,_|_| |_|\__,_|_| |_| |_|\__,_|_| |_|
9
9
  ```
10
10
 
11
- Provision disposable cloud environments in seconds.
11
+ **Disposable cloud environments in seconds.**
12
12
 
13
- Sandman is an open-source CLI that creates disposable cloud environments for AWS and GCP in seconds.
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.
14
17
 
15
- Perfect for:
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
16
22
 
17
- - DevTool demos
18
- - AI builders testing infrastructure
19
- - Rapid prototyping
20
- - Disposable sandbox environments
21
- - Infrastructure experimentation
22
-
23
- Instead of manually configuring billing, IAM, APIs, and services, Sandman spins up a working environment instantly.
23
+ All commands accept `--json` for machine-readable output, built for humans and agents alike.
24
24
 
25
25
  ---
26
26
 
27
- ## Why Sandman?
28
-
29
- Creating cloud infrastructure manually is slow.
30
-
31
- Even experienced engineers must:
32
-
33
- ### AWS
34
-
35
- • configure IAM
36
- • create VPCs
37
- • provision compute
38
- • configure credentials
27
+ ## Quick start
39
28
 
40
- ### GCP
41
-
42
- create a project
43
- connect billing
44
- enable APIs
45
- configure service accounts
46
-
47
- This can take **30–90 minutes**.
29
+ ```bash
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
35
+ ```
48
36
 
49
- Sandman reduces that to **seconds**.
37
+ For AWS, enable services with `sandman enable ec2 s3 lambda`.
50
38
 
51
39
  ---
52
40
 
53
- ## Features
54
-
55
- • Create disposable cloud environments
56
- • Automatic project provisioning
57
- • Billing configuration helpers
58
- • Enable common cloud services
59
- • Credential management
60
- • Environment teardown
61
-
62
- Supported providers:
63
-
64
- - AWS
65
- - GCP
66
-
67
- Future support:
41
+ ## Commands
68
42
 
69
- - Cloudflare
70
- - DigitalOcean
71
- - Render
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`) |
72
54
 
73
55
  ---
74
56
 
75
57
  ## Installation
76
58
 
77
- ### Using npm
78
-
79
59
  ```bash
80
60
  npm install -g @itssergio91/sandman
81
61
  ```
@@ -88,235 +68,35 @@ npx @itssergio91/sandman
88
68
 
89
69
  ---
90
70
 
91
- ## Quick Start
92
-
93
- Initialize a cloud provider.
94
-
95
- ```bash
96
- sandman init gcp
97
- ```
98
-
99
- Create a sandbox environment.
100
-
101
- ```bash
102
- sandman create demo
103
- ```
104
-
105
- Enable services.
106
-
107
- ```bash
108
- sandman enable compute storage cloudrun
109
- ```
110
-
111
- Connect to the environment.
112
-
113
- ```bash
114
- sandman connect demo
115
- ```
116
-
117
- Destroy the environment when finished.
118
-
119
- ```bash
120
- sandman destroy demo
121
- ```
122
-
123
- ---
124
-
125
- ## Example Workflow
126
-
127
- Create a sandbox for testing.
128
-
129
- ```bash
130
- sandman init gcp
131
- sandman create demo-env
132
- sandman enable compute storage cloudrun
133
- sandman connect demo-env
134
- ```
135
-
136
- Run your application or tests against the environment.
137
-
138
- Then destroy it when finished.
139
-
140
- ```bash
141
- sandman destroy demo-env
142
- ```
143
-
144
- ---
145
-
146
- ## Commands
147
-
148
- ### Initialize provider
149
-
150
- ```bash
151
- sandman init aws
152
- sandman init gcp
153
- ```
154
-
155
- Authenticates and configures credentials.
156
-
157
- ---
158
-
159
- ### Create environment
160
-
161
- ```bash
162
- sandman create <environment-name>
163
- ```
164
-
165
- Example:
166
-
167
- ```bash
168
- sandman create demo
169
- ```
170
-
171
- ---
172
-
173
- ### Enable services
174
-
175
- AWS example:
176
-
177
- ```bash
178
- sandman enable ec2 s3 lambda
179
- ```
180
-
181
- GCP example:
182
-
183
- ```bash
184
- sandman enable compute storage cloudrun
185
- ```
186
-
187
- ---
188
-
189
- ### List environments
190
-
191
- ```bash
192
- sandman list
193
- ```
194
-
195
- ---
196
-
197
- ### Connect environment
198
-
199
- ```bash
200
- sandman connect <environment-name>
201
- ```
202
-
203
- Outputs environment credentials.
204
-
205
- ---
206
-
207
- ### Destroy environment
208
-
209
- ```bash
210
- sandman destroy <environment-name>
211
- ```
212
-
213
- Deletes all associated resources.
214
-
215
- ---
216
-
217
- ## Architecture
218
-
219
- Sandman consists of three layers.
220
-
221
- CLI
222
-
223
- Provisioning Engine
224
-
225
- Cloud Provider APIs
226
-
227
- Components:
228
-
229
- - CLI layer
230
- - Provisioning engine
231
- - Provider adapters
232
-
233
- ---
234
-
235
71
  ## Providers
236
72
 
237
- ### AWS
238
-
239
- Uses AWS SDK to provision:
240
-
241
- - VPC
242
- - EC2
243
- - S3
244
- - IAM roles
245
-
246
- ---
247
-
248
- ### GCP
249
-
250
- Uses Google Cloud APIs to provision:
251
-
252
- - projects
253
- - billing connections
254
- - cloud run
255
- - storage buckets
256
- - service accounts
257
-
258
- ---
259
-
260
- ## Use Cases
261
-
262
- ### DevTool demos
263
-
264
- Create disposable environments for product demos.
265
-
266
- ### Rapid experimentation
73
+ | Provider | Status |
74
+ | --- | --- |
75
+ | AWS | Supported |
76
+ | GCP | ✅ Supported |
77
+ | Cloudflare | 🧪 Experimental |
78
+ | Vercel | 🧪 Experimental |
79
+ | DigitalOcean | 🚧 Planned |
80
+ | Render | 🚧 Planned |
267
81
 
268
- Spin up temporary environments to test infrastructure or integrations.
269
-
270
- ### Learning cloud infrastructure
271
-
272
- Practice working with cloud services without maintaining long-lived infrastructure.
273
-
274
- ---
275
-
276
- ## Project Structure
277
-
278
- ```
279
- sandman/
280
-
281
- src/
282
- cli/
283
- providers/
284
- templates/
285
- utils/
286
-
287
- docs/
288
- PRD.md
289
-
290
- package.json
291
- ```
82
+ Run `sandman providers` to see the live capability matrix.
292
83
 
293
84
  ---
294
85
 
295
86
  ## Roadmap
296
87
 
297
- Planned features:
88
+ - Environment templates
89
+ - Multi-cloud provisioning (Cloudflare / Vercel beyond experimental)
90
+ - GitHub demo environments
91
+ - Local testing environments
298
92
 
299
- Environment templates
300
- • Multi-cloud provisioning
301
- • GitHub demo environments
302
- • Local testing environments
93
+ See the [issue tracker](https://github.com/BoringInfraCo/Sandman/issues) for the full list.
303
94
 
304
95
  ---
305
96
 
306
97
  ## Contributing
307
98
 
308
- Pull requests are welcome.
309
-
310
- To contribute:
311
-
312
- ```bash
313
- git clone https://github.com/your-org/sandman
314
- cd sandman
315
- npm install
316
- npm run dev
317
- ```
318
-
319
- ---
99
+ Pull requests are welcome. Clone the repo, run `npm install` and `npm test`, and open a PR.
320
100
 
321
101
  ## License
322
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"}