@itssergio91/sandman 0.1.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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +321 -0
  3. package/dist/cli/commands/connect.d.ts +3 -0
  4. package/dist/cli/commands/connect.d.ts.map +1 -0
  5. package/dist/cli/commands/connect.js +64 -0
  6. package/dist/cli/commands/connect.js.map +1 -0
  7. package/dist/cli/commands/create.d.ts +8 -0
  8. package/dist/cli/commands/create.d.ts.map +1 -0
  9. package/dist/cli/commands/create.js +45 -0
  10. package/dist/cli/commands/create.js.map +1 -0
  11. package/dist/cli/commands/destroy.d.ts +7 -0
  12. package/dist/cli/commands/destroy.d.ts.map +1 -0
  13. package/dist/cli/commands/destroy.js +49 -0
  14. package/dist/cli/commands/destroy.js.map +1 -0
  15. package/dist/cli/commands/enable.d.ts +4 -0
  16. package/dist/cli/commands/enable.d.ts.map +1 -0
  17. package/dist/cli/commands/enable.js +59 -0
  18. package/dist/cli/commands/enable.js.map +1 -0
  19. package/dist/cli/commands/init.d.ts +3 -0
  20. package/dist/cli/commands/init.d.ts.map +1 -0
  21. package/dist/cli/commands/init.js +23 -0
  22. package/dist/cli/commands/init.js.map +1 -0
  23. package/dist/cli/commands/list.d.ts +7 -0
  24. package/dist/cli/commands/list.d.ts.map +1 -0
  25. package/dist/cli/commands/list.js +28 -0
  26. package/dist/cli/commands/list.js.map +1 -0
  27. package/dist/cli/commands/status.d.ts +7 -0
  28. package/dist/cli/commands/status.d.ts.map +1 -0
  29. package/dist/cli/commands/status.js +49 -0
  30. package/dist/cli/commands/status.js.map +1 -0
  31. package/dist/cli/index.d.ts +6 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +73 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/core/state-store.d.ts +18 -0
  36. package/dist/core/state-store.d.ts.map +1 -0
  37. package/dist/core/state-store.js +71 -0
  38. package/dist/core/state-store.js.map +1 -0
  39. package/dist/core/state-store.test.d.ts +2 -0
  40. package/dist/core/state-store.test.d.ts.map +1 -0
  41. package/dist/core/state-store.test.js +183 -0
  42. package/dist/core/state-store.test.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +4 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/providers/aws/adapter.d.ts +17 -0
  48. package/dist/providers/aws/adapter.d.ts.map +1 -0
  49. package/dist/providers/aws/adapter.js +106 -0
  50. package/dist/providers/aws/adapter.js.map +1 -0
  51. package/dist/providers/aws/adapter.test.d.ts +2 -0
  52. package/dist/providers/aws/adapter.test.d.ts.map +1 -0
  53. package/dist/providers/aws/adapter.test.js +154 -0
  54. package/dist/providers/aws/adapter.test.js.map +1 -0
  55. package/dist/providers/base.d.ts +12 -0
  56. package/dist/providers/base.d.ts.map +1 -0
  57. package/dist/providers/base.js +13 -0
  58. package/dist/providers/base.js.map +1 -0
  59. package/dist/providers/base.test.d.ts +2 -0
  60. package/dist/providers/base.test.d.ts.map +1 -0
  61. package/dist/providers/base.test.js +50 -0
  62. package/dist/providers/base.test.js.map +1 -0
  63. package/dist/providers/gcp/adapter.d.ts +15 -0
  64. package/dist/providers/gcp/adapter.d.ts.map +1 -0
  65. package/dist/providers/gcp/adapter.js +87 -0
  66. package/dist/providers/gcp/adapter.js.map +1 -0
  67. package/dist/providers/gcp/adapter.test.d.ts +2 -0
  68. package/dist/providers/gcp/adapter.test.d.ts.map +1 -0
  69. package/dist/providers/gcp/adapter.test.js +135 -0
  70. package/dist/providers/gcp/adapter.test.js.map +1 -0
  71. package/dist/types/index.d.ts +139 -0
  72. package/dist/types/index.d.ts.map +1 -0
  73. package/dist/types/index.js +37 -0
  74. package/dist/types/index.js.map +1 -0
  75. package/package.json +72 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sergio Rovira
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,321 @@
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
+ ```
80
+
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
95
+ ```
96
+
97
+ Create a sandbox environment.
98
+
99
+ ```bash
100
+ sandman create demo
101
+ ```
102
+
103
+ Enable services.
104
+
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
+ ```
120
+
121
+ ---
122
+
123
+ ## Example Workflow
124
+
125
+ Create a sandbox for testing.
126
+
127
+ ```bash
128
+ sandman init gcp
129
+ sandman create demo-env
130
+ sandman enable compute storage cloudrun
131
+ sandman connect demo-env
132
+ ```
133
+
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
+ ```
141
+
142
+ ---
143
+
144
+ ## Commands
145
+
146
+ ### Initialize provider
147
+
148
+ ```bash
149
+ sandman init aws
150
+ sandman init gcp
151
+ ```
152
+
153
+ Authenticates and configures credentials.
154
+
155
+ ---
156
+
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
196
+
197
+ ```bash
198
+ sandman connect <environment-name>
199
+ ```
200
+
201
+ Outputs environment credentials.
202
+
203
+ ---
204
+
205
+ ### Destroy environment
206
+
207
+ ```bash
208
+ sandman destroy <environment-name>
209
+ ```
210
+
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
+ ---
232
+
233
+ ## Providers
234
+
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
265
+
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
+ ```
290
+
291
+ ---
292
+
293
+ ## Roadmap
294
+
295
+ Planned features:
296
+
297
+ • Environment templates
298
+ • Multi-cloud provisioning
299
+ • GitHub demo environments
300
+ • Local testing environments
301
+
302
+ ---
303
+
304
+ ## Contributing
305
+
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
+ ---
318
+
319
+ ## License
320
+
321
+ MIT
@@ -0,0 +1,3 @@
1
+ import { StateStore } from '../../core/state-store.js';
2
+ export declare function connectEnvironment(name: string, store: StateStore): Promise<void>;
3
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +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;AAKvD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAkEf"}
@@ -0,0 +1,64 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { AwsAdapter } from '../../providers/aws/adapter.js';
4
+ import { GcpAdapter } from '../../providers/gcp/adapter.js';
5
+ export async function connectEnvironment(name, store) {
6
+ const env = await store.getEnvironment(name);
7
+ if (!env) {
8
+ console.log(chalk.red(`Environment "${name}" not found.`));
9
+ process.exit(1);
10
+ }
11
+ if (env.status !== 'active') {
12
+ console.log(chalk.yellow(`Environment "${name}" is not active (status: ${env.status}).`));
13
+ }
14
+ const spinner = ora(`Connecting to ${name}...`).start();
15
+ try {
16
+ const adapter = env.provider === 'aws'
17
+ ? new AwsAdapter()
18
+ : new GcpAdapter();
19
+ const credentials = await adapter.connect(env);
20
+ spinner.stop();
21
+ console.log(chalk.bold(`\nConnecting to environment: ${name}\n`));
22
+ if (env.provider === 'gcp') {
23
+ console.log(chalk.gray('# GCP Configuration'));
24
+ if (credentials.GCP_PROJECT) {
25
+ console.log(`export GCP_PROJECT=${credentials.GCP_PROJECT}`);
26
+ }
27
+ console.log(chalk.gray('\n# Use with gcloud:'));
28
+ console.log(chalk.cyan(`gcloud config set project ${credentials.GCP_PROJECT || '<project-id>'}`));
29
+ console.log(chalk.cyan('gcloud auth application-default login'));
30
+ }
31
+ else if (env.provider === 'aws') {
32
+ console.log(chalk.gray('# AWS Configuration'));
33
+ if (credentials.AWS_ACCOUNT_ID) {
34
+ console.log(`export AWS_ACCOUNT_ID=${credentials.AWS_ACCOUNT_ID}`);
35
+ }
36
+ if (credentials.AWS_REGION) {
37
+ console.log(`export AWS_REGION=${credentials.AWS_REGION}`);
38
+ }
39
+ console.log(chalk.gray('\n# Use with AWS CLI:'));
40
+ console.log(chalk.cyan('aws configure'));
41
+ }
42
+ console.log(chalk.gray('\n# Copy to .env:'));
43
+ console.log(chalk.cyan('SANDMAN_ENV=' + name));
44
+ if (credentials.GCP_PROJECT) {
45
+ console.log(chalk.cyan('GCP_PROJECT=' + credentials.GCP_PROJECT));
46
+ }
47
+ if (credentials.AWS_ACCOUNT_ID) {
48
+ console.log(chalk.cyan('AWS_ACCOUNT_ID=' + credentials.AWS_ACCOUNT_ID));
49
+ }
50
+ if (credentials.AWS_REGION) {
51
+ console.log(chalk.cyan('AWS_REGION=' + credentials.AWS_REGION));
52
+ }
53
+ if (credentials.AWS_S3_BUCKET) {
54
+ console.log(chalk.cyan('AWS_S3_BUCKET=' + credentials.AWS_S3_BUCKET));
55
+ }
56
+ console.log(chalk.green('\n✓ Environment configured'));
57
+ }
58
+ catch (error) {
59
+ spinner?.fail?.(chalk.red('Failed to connect'));
60
+ console.log(chalk.red(`Error: ${error.message}`));
61
+ process.exit(1);
62
+ }
63
+ }
64
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/cli/commands/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { StateStore } from '../../core/state-store.js';
2
+ import { CreateOptions } from '../../types/index.js';
3
+ interface CreateParams {
4
+ dryRun?: boolean;
5
+ }
6
+ export declare function createEnvironment(name: string, options: CreateOptions, store: StateStore, params: CreateParams): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAqB,aAAa,EAAe,MAAM,sBAAsB,CAAC;AAKrF,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
@@ -0,0 +1,45 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { AwsAdapter } from '../../providers/aws/adapter.js';
4
+ import { GcpAdapter } from '../../providers/gcp/adapter.js';
5
+ export async function createEnvironment(name, options, store, params) {
6
+ const providerConfig = await store.getProvider();
7
+ const providerType = options.provider || providerConfig.provider;
8
+ if (!providerType) {
9
+ console.log(chalk.red('Error: No provider specified.'));
10
+ console.log(chalk.gray('Run "sandman init aws" or "sandman init gcp" first.'));
11
+ process.exit(1);
12
+ }
13
+ const existing = await store.getEnvironment(name);
14
+ if (existing) {
15
+ console.log(chalk.red(`Environment "${name}" already exists.`));
16
+ process.exit(1);
17
+ }
18
+ console.log(chalk.blue(`\nCreating environment "${name}" on ${providerType}...`));
19
+ console.log(chalk.yellow(`⚠ Estimated cost: ~$0.10/hour`));
20
+ console.log(chalk.gray('⚠ Run "sandman destroy ' + name + '" when finished to avoid ongoing charges\n'));
21
+ if (params.dryRun) {
22
+ console.log(chalk.cyan('[DRY RUN] Would create:'));
23
+ console.log(chalk.gray(` - Environment: ${name}`));
24
+ console.log(chalk.gray(` - Provider: ${providerType}`));
25
+ console.log(chalk.gray(` - Region: ${options.region || providerConfig.region || 'default'}`));
26
+ return;
27
+ }
28
+ const spinner = ora('Creating environment...').start();
29
+ try {
30
+ const adapter = providerType === 'aws'
31
+ ? new AwsAdapter()
32
+ : new GcpAdapter();
33
+ const env = await adapter.createEnvironment(name);
34
+ await store.saveEnvironment(env);
35
+ spinner.succeed(chalk.green(`Environment "${name}" created successfully!`));
36
+ console.log(chalk.cyan(`\n→ Run "sandman status ${name}" to see details`));
37
+ console.log(chalk.cyan(`→ Run "sandman enable <services> -e ${name}" to enable services`));
38
+ }
39
+ catch (error) {
40
+ spinner.fail(chalk.red('Failed to create environment'));
41
+ console.log(chalk.red(`Error: ${error.message}`));
42
+ process.exit(1);
43
+ }
44
+ }
45
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { StateStore } from '../../core/state-store.js';
2
+ interface DestroyParams {
3
+ confirmed: boolean;
4
+ }
5
+ export declare function destroyEnvironment(name: string, store: StateStore, params?: DestroyParams): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=destroy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/destroy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAKvD,UAAU,aAAa;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,MAAM,GAAE,aAAoC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAqDf"}
@@ -0,0 +1,49 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { AwsAdapter } from '../../providers/aws/adapter.js';
4
+ import { GcpAdapter } from '../../providers/gcp/adapter.js';
5
+ export async function destroyEnvironment(name, store, params = { confirmed: false }) {
6
+ const env = await store.getEnvironment(name);
7
+ if (!env) {
8
+ console.log(chalk.red(`Environment "${name}" not found.`));
9
+ process.exit(1);
10
+ }
11
+ if (!params.confirmed) {
12
+ console.log(chalk.yellow(`\n⚠️ This will destroy environment "${name}" on ${env.provider}.`));
13
+ console.log(chalk.gray('All resources will be permanently deleted.\n'));
14
+ const readline = await import('readline');
15
+ const rl = readline.createInterface({
16
+ input: process.stdin,
17
+ output: process.stdout,
18
+ });
19
+ const answer = await new Promise((resolve) => {
20
+ rl.question(chalk.yellow('Are you sure? (yes/no): '), (ans) => {
21
+ rl.close();
22
+ resolve(ans.toLowerCase());
23
+ });
24
+ });
25
+ if (answer !== 'yes' && answer !== 'y') {
26
+ console.log(chalk.gray('Destroy cancelled.'));
27
+ return;
28
+ }
29
+ }
30
+ const spinner = ora(`Destroying environment "${name}"...`).start();
31
+ try {
32
+ const adapter = env.provider === 'aws'
33
+ ? new AwsAdapter()
34
+ : new GcpAdapter();
35
+ await adapter.destroyEnvironment(env);
36
+ const now = new Date().toISOString();
37
+ env.status = 'destroyed';
38
+ env.updatedAt = now;
39
+ await store.saveEnvironment(env);
40
+ spinner.succeed(chalk.green(`✓ Environment "${name}" destroyed.`));
41
+ console.log(chalk.gray('Cloud resources cleaned up.'));
42
+ }
43
+ catch (error) {
44
+ spinner.fail(chalk.red('Failed to destroy environment'));
45
+ console.log(chalk.red(`Error: ${error.message}`));
46
+ process.exit(1);
47
+ }
48
+ }
49
+ //# sourceMappingURL=destroy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../../src/cli/commands/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAO5D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,KAAiB,EACjB,SAAwB,EAAE,SAAS,EAAE,KAAK,EAAE;IAE5C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAE7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,IAAI,cAAc,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wCAAwC,IAAI,QAAQ,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAExE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YACnD,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC5D,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAEnE,IAAI,CAAC;QACH,MAAM,OAAO,GAAoB,GAAG,CAAC,QAAQ,KAAK,KAAK;YACrD,CAAC,CAAC,IAAI,UAAU,EAAE;YAClB,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;QAErB,MAAM,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAEtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;QACzB,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QAEpB,MAAM,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEjC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,IAAI,cAAc,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { StateStore } from '../../core/state-store.js';
2
+ import { ServiceName } from '../../types/index.js';
3
+ export declare function enableServices(servicesInput: ServiceName[], environmentName: string | undefined, store: StateStore): Promise<void>;
4
+ //# sourceMappingURL=enable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/enable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUnD,wBAAsB,cAAc,CAClC,aAAa,EAAE,WAAW,EAAE,EAC5B,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAwDf"}
@@ -0,0 +1,59 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { AwsAdapter } from '../../providers/aws/adapter.js';
4
+ import { GcpAdapter } from '../../providers/gcp/adapter.js';
5
+ const VALID_SERVICES = {
6
+ gcp: ['compute', 'storage', 'cloudrun', 'iam'],
7
+ aws: ['ec2', 's3', 'lambda', 'iam'],
8
+ };
9
+ export async function enableServices(servicesInput, environmentName, store) {
10
+ let env;
11
+ if (environmentName) {
12
+ env = await store.getEnvironment(environmentName);
13
+ if (!env) {
14
+ console.log(chalk.red(`Environment "${environmentName}" not found.`));
15
+ process.exit(1);
16
+ }
17
+ }
18
+ else {
19
+ const environments = await store.listEnvironments();
20
+ const active = environments.filter(e => e.status === 'active');
21
+ if (active.length === 0) {
22
+ console.log(chalk.red('No active environments found.'));
23
+ process.exit(1);
24
+ }
25
+ if (active.length > 1) {
26
+ console.log(chalk.yellow('Multiple environments found. Specify one:'));
27
+ for (const e of active) {
28
+ console.log(chalk.gray(` - ${e.name}`));
29
+ }
30
+ process.exit(1);
31
+ }
32
+ env = active[0];
33
+ }
34
+ const validServices = VALID_SERVICES[env.provider];
35
+ const invalid = servicesInput.filter(s => !validServices.includes(s));
36
+ if (invalid.length > 0) {
37
+ console.log(chalk.red(`Invalid services for ${env.provider}: ${invalid.join(', ')}`));
38
+ console.log(chalk.gray(`Valid services: ${validServices.join(', ')}`));
39
+ process.exit(1);
40
+ }
41
+ const spinner = ora(`Enabling services on ${env.name}...`).start();
42
+ try {
43
+ const adapter = env.provider === 'aws'
44
+ ? new AwsAdapter()
45
+ : new GcpAdapter();
46
+ await adapter.enableServices(env, servicesInput);
47
+ const now = new Date().toISOString();
48
+ env.services = [...new Set([...env.services, ...servicesInput])];
49
+ env.updatedAt = now;
50
+ await store.saveEnvironment(env);
51
+ spinner.succeed(chalk.green(`✓ Services enabled: ${servicesInput.join(', ')}`));
52
+ }
53
+ catch (error) {
54
+ spinner.fail(chalk.red('Failed to enable services'));
55
+ console.log(chalk.red(`Error: ${error.message}`));
56
+ process.exit(1);
57
+ }
58
+ }
59
+ //# sourceMappingURL=enable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/cli/commands/enable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { StateStore } from '../../core/state-store.js';
2
+ export declare function initProvider(providerType: 'aws' | 'gcp', region: string | undefined, store: StateStore): Promise<void>;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIvD,wBAAsB,YAAY,CAChC,YAAY,EAAE,KAAK,GAAG,KAAK,EAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAqBf"}
@@ -0,0 +1,23 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { AwsAdapter } from '../../providers/aws/adapter.js';
4
+ import { GcpAdapter } from '../../providers/gcp/adapter.js';
5
+ export async function initProvider(providerType, region, store) {
6
+ const spinner = ora(`Initializing ${providerType}...`).start();
7
+ try {
8
+ const adapter = providerType === 'aws' ? new AwsAdapter() : new GcpAdapter();
9
+ await adapter.init();
10
+ spinner.succeed(chalk.green(`✓ ${providerType} initialized successfully`));
11
+ await store.setProvider(providerType, region);
12
+ console.log(chalk.gray(`Default region: ${region || 'not set'}`));
13
+ if (providerType === 'gcp') {
14
+ console.log(chalk.cyan('\n→ Run "sandman create <name>" to create an environment'));
15
+ }
16
+ }
17
+ catch (error) {
18
+ spinner.fail(chalk.red(`Failed to initialize ${providerType}`));
19
+ console.log(chalk.red(`Error: ${error.message}`));
20
+ process.exit(1);
21
+ }
22
+ }
23
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAA2B,EAC3B,MAA0B,EAC1B,KAAiB;IAEjB,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,YAAY,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC;QAE7E,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAErB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,YAAY,2BAA2B,CAAC,CAAC,CAAC;QAE3E,MAAM,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;QAElE,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}