@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.
- package/LICENSE +21 -0
- package/README.md +321 -0
- package/dist/cli/commands/connect.d.ts +3 -0
- package/dist/cli/commands/connect.d.ts.map +1 -0
- package/dist/cli/commands/connect.js +64 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/create.d.ts +8 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +45 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/destroy.d.ts +7 -0
- package/dist/cli/commands/destroy.d.ts.map +1 -0
- package/dist/cli/commands/destroy.js +49 -0
- package/dist/cli/commands/destroy.js.map +1 -0
- package/dist/cli/commands/enable.d.ts +4 -0
- package/dist/cli/commands/enable.d.ts.map +1 -0
- package/dist/cli/commands/enable.js +59 -0
- package/dist/cli/commands/enable.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +23 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +7 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +28 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/status.d.ts +7 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +49 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +73 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/state-store.d.ts +18 -0
- package/dist/core/state-store.d.ts.map +1 -0
- package/dist/core/state-store.js +71 -0
- package/dist/core/state-store.js.map +1 -0
- package/dist/core/state-store.test.d.ts +2 -0
- package/dist/core/state-store.test.d.ts.map +1 -0
- package/dist/core/state-store.test.js +183 -0
- package/dist/core/state-store.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/aws/adapter.d.ts +17 -0
- package/dist/providers/aws/adapter.d.ts.map +1 -0
- package/dist/providers/aws/adapter.js +106 -0
- package/dist/providers/aws/adapter.js.map +1 -0
- package/dist/providers/aws/adapter.test.d.ts +2 -0
- package/dist/providers/aws/adapter.test.d.ts.map +1 -0
- package/dist/providers/aws/adapter.test.js +154 -0
- package/dist/providers/aws/adapter.test.js.map +1 -0
- package/dist/providers/base.d.ts +12 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +13 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/base.test.d.ts +2 -0
- package/dist/providers/base.test.d.ts.map +1 -0
- package/dist/providers/base.test.js +50 -0
- package/dist/providers/base.test.js.map +1 -0
- package/dist/providers/gcp/adapter.d.ts +15 -0
- package/dist/providers/gcp/adapter.d.ts.map +1 -0
- package/dist/providers/gcp/adapter.js +87 -0
- package/dist/providers/gcp/adapter.js.map +1 -0
- package/dist/providers/gcp/adapter.test.d.ts +2 -0
- package/dist/providers/gcp/adapter.test.d.ts.map +1 -0
- package/dist/providers/gcp/adapter.test.js +135 -0
- package/dist/providers/gcp/adapter.test.js.map +1 -0
- package/dist/types/index.d.ts +139 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|