@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
@@ -0,0 +1,7 @@
1
+ import { StateStore } from '../../core/state-store.js';
2
+ interface ListOptions {
3
+ json?: boolean;
4
+ }
5
+ export declare function listEnvironments(store: StateStore, options?: ListOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BlG"}
@@ -0,0 +1,28 @@
1
+ import chalk from 'chalk';
2
+ export async function listEnvironments(store, options = {}) {
3
+ const environments = await store.listEnvironments();
4
+ if (options.json) {
5
+ console.log(JSON.stringify(environments, null, 2));
6
+ return;
7
+ }
8
+ if (environments.length === 0) {
9
+ console.log(chalk.yellow('No environments found.'));
10
+ console.log(chalk.gray('Run "sandman create <name>" to create one.'));
11
+ return;
12
+ }
13
+ console.log(chalk.bold('\nEnvironments:\n'));
14
+ for (const env of environments) {
15
+ const statusColor = env.status === 'active' ? chalk.green :
16
+ env.status === 'failed' ? chalk.red :
17
+ chalk.gray;
18
+ console.log(` ${chalk.bold(env.name)}`);
19
+ console.log(` Provider: ${env.provider}`);
20
+ console.log(` Status: ${statusColor(env.status)}`);
21
+ console.log(` Created: ${new Date(env.createdAt).toLocaleString()}`);
22
+ if (env.services.length > 0) {
23
+ console.log(` Services: ${env.services.join(', ')}`);
24
+ }
25
+ console.log();
26
+ }
27
+ }
28
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAiB,EAAE,UAAuB,EAAE;IACjF,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAEpD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE7C,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC;QAE/B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { StateStore } from '../../core/state-store.js';
2
+ interface StatusOptions {
3
+ json?: boolean;
4
+ }
5
+ export declare function statusEnvironment(name: string, store: StateStore, options?: StatusOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAQvD,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAoDf"}
@@ -0,0 +1,49 @@
1
+ import chalk from 'chalk';
2
+ const COST_ESTIMATES = {
3
+ gcp: { hourly: '~$0.01-0.05/hour', description: 'Project base + APIs enabled' },
4
+ aws: { hourly: '~$0.01-0.10/hour', description: 'S3 storage + Lambda requests' },
5
+ };
6
+ export async function statusEnvironment(name, store, options = {}) {
7
+ const env = await store.getEnvironment(name);
8
+ if (!env) {
9
+ console.log(chalk.red(`Environment "${name}" not found.`));
10
+ process.exit(1);
11
+ }
12
+ if (options.json) {
13
+ console.log(JSON.stringify(env, null, 2));
14
+ return;
15
+ }
16
+ const cost = COST_ESTIMATES[env.provider] || { hourly: 'Unknown', description: '' };
17
+ const age = Date.now() - new Date(env.createdAt).getTime();
18
+ const hours = Math.floor(age / (1000 * 60 * 60));
19
+ const minutes = Math.floor((age % (1000 * 60 * 60)) / (1000 * 60));
20
+ console.log(chalk.bold(`\nEnvironment: ${env.name}\n`));
21
+ console.log(` ${chalk.gray('Provider:')} ${env.provider}`);
22
+ console.log(` ${chalk.gray('Status:')} ${env.status === 'active' ? chalk.green(env.status) : chalk.red(env.status)}`);
23
+ console.log(` ${chalk.gray('Created:')} ${new Date(env.createdAt).toLocaleString()}`);
24
+ console.log(` ${chalk.gray('Age:')} ${hours}h ${minutes}m`);
25
+ if (env.projectId) {
26
+ console.log(` ${chalk.gray('Project ID:')} ${env.projectId}`);
27
+ }
28
+ if (env.accountId) {
29
+ console.log(` ${chalk.gray('Account ID:')} ${env.accountId}`);
30
+ }
31
+ if (env.region) {
32
+ console.log(` ${chalk.gray('Region:')} ${env.region}`);
33
+ }
34
+ if (env.services.length > 0) {
35
+ console.log(` ${chalk.gray('Services:')} ${env.services.join(', ')}`);
36
+ }
37
+ const resourceCount = Object.keys(env.resources).length;
38
+ if (resourceCount > 0) {
39
+ console.log(` ${chalk.gray('Resources:')} ${resourceCount} created`);
40
+ }
41
+ console.log(`\n ${chalk.gray('Est. cost:')} ${cost.hourly}`);
42
+ console.log(chalk.gray(` ${cost.description}`));
43
+ if (env.error) {
44
+ console.log(`\n ${chalk.red('Error:')} ${env.error}`);
45
+ }
46
+ console.log(chalk.cyan(`\n→ Run "sandman connect ${name}" to get credentials`));
47
+ console.log(chalk.cyan(`→ Run "sandman destroy ${name}" to clean up`));
48
+ }
49
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import { StateStore } from '../core/state-store.js';
3
+ declare const program: Command;
4
+ declare const store: StateStore;
5
+ export { program, store };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AASpD,QAAA,MAAM,OAAO,SAAgB,CAAC;AAC9B,QAAA,MAAM,KAAK,YAAmB,CAAC;AA2E/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { Command } from 'commander';
2
+ import { StateStore } from '../core/state-store.js';
3
+ import { listEnvironments } from './commands/list.js';
4
+ import { statusEnvironment } from './commands/status.js';
5
+ import { initProvider } from './commands/init.js';
6
+ import { createEnvironment } from './commands/create.js';
7
+ import { enableServices } from './commands/enable.js';
8
+ import { connectEnvironment } from './commands/connect.js';
9
+ import { destroyEnvironment } from './commands/destroy.js';
10
+ const program = new Command();
11
+ const store = new StateStore();
12
+ program
13
+ .name('sandman')
14
+ .description('Provision disposable cloud environments in seconds')
15
+ .version('0.1.0');
16
+ program
17
+ .command('init')
18
+ .description('Initialize a cloud provider')
19
+ .argument('<provider>', 'Provider to initialize (aws or gcp)')
20
+ .option('-r, --region <region>', 'Default region')
21
+ .action(async (provider, options) => {
22
+ await initProvider(provider, options.region, store);
23
+ });
24
+ program
25
+ .command('create')
26
+ .description('Create a sandbox environment')
27
+ .argument('<name>', 'Environment name')
28
+ .option('-p, --provider <provider>', 'Cloud provider (aws or gcp)')
29
+ .option('-r, --region <region>', 'Region')
30
+ .option('--dry-run', 'Preview actions without executing')
31
+ .action(async (name, options) => {
32
+ await createEnvironment(name, { provider: options.provider, region: options.region }, store, { dryRun: options.dryRun });
33
+ });
34
+ program
35
+ .command('enable')
36
+ .description('Enable services for an environment')
37
+ .argument('<services...>', 'Services to enable')
38
+ .option('-e, --environment <name>', 'Environment name')
39
+ .action(async (services, options) => {
40
+ await enableServices(services, options.environment, store);
41
+ });
42
+ program
43
+ .command('list')
44
+ .description('List all environments')
45
+ .option('--json', 'Output as JSON')
46
+ .action(async (options) => {
47
+ await listEnvironments(store, options);
48
+ });
49
+ program
50
+ .command('status')
51
+ .description('Show environment status')
52
+ .argument('<name>', 'Environment name')
53
+ .option('--json', 'Output as JSON')
54
+ .action(async (name, options) => {
55
+ await statusEnvironment(name, store, options);
56
+ });
57
+ program
58
+ .command('connect')
59
+ .description('Connect to an environment')
60
+ .argument('<name>', 'Environment name')
61
+ .action(async (name) => {
62
+ await connectEnvironment(name, store);
63
+ });
64
+ program
65
+ .command('destroy')
66
+ .description('Destroy an environment')
67
+ .argument('<name>', 'Environment name')
68
+ .option('-y, --yes', 'Skip confirmation')
69
+ .action(async (name, options) => {
70
+ await destroyEnvironment(name, store, { confirmed: options.yes ?? false });
71
+ });
72
+ export { program, store };
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Config, EnvironmentRecord } from "../types/index.js";
2
+ export declare class StateStore {
3
+ private configPath;
4
+ private config;
5
+ constructor(configPath?: string);
6
+ load(): Promise<Config>;
7
+ save(config: Config): Promise<void>;
8
+ getEnvironment(name: string): Promise<EnvironmentRecord | undefined>;
9
+ saveEnvironment(env: EnvironmentRecord): Promise<void>;
10
+ deleteEnvironment(name: string): Promise<void>;
11
+ listEnvironments(): Promise<EnvironmentRecord[]>;
12
+ setProvider(provider: "aws" | "gcp", region?: string): Promise<void>;
13
+ getProvider(): Promise<{
14
+ provider?: "aws" | "gcp";
15
+ region?: string;
16
+ }>;
17
+ }
18
+ //# sourceMappingURL=state-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/core/state-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAgB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAS5E,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAuB;gBAEzB,UAAU,GAAE,MAAiC;IAInD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAevB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAKpE,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKhD,WAAW,CAAC,QAAQ,EAAE,KAAK,GAAG,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,WAAW,IAAI,OAAO,CAAC;QAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAO5E"}
@@ -0,0 +1,71 @@
1
+ import { promises as fs } from "fs";
2
+ import { dirname } from "path";
3
+ import { homedir } from "os";
4
+ import { ConfigSchema } from "../types/index.js";
5
+ function expandPath(path) {
6
+ if (path.startsWith("~/")) {
7
+ return path.replace("~", homedir());
8
+ }
9
+ return path;
10
+ }
11
+ export class StateStore {
12
+ configPath;
13
+ config = null;
14
+ constructor(configPath = "~/.sandman/config.json") {
15
+ this.configPath = expandPath(configPath);
16
+ }
17
+ async load() {
18
+ try {
19
+ const content = await fs.readFile(this.configPath, "utf-8");
20
+ const parsed = JSON.parse(content);
21
+ this.config = ConfigSchema.parse(parsed);
22
+ return this.config;
23
+ }
24
+ catch {
25
+ this.config = {
26
+ version: "1.0.0",
27
+ environments: {},
28
+ };
29
+ return this.config;
30
+ }
31
+ }
32
+ async save(config) {
33
+ await fs.mkdir(dirname(this.configPath), { recursive: true });
34
+ await fs.writeFile(this.configPath, JSON.stringify(config, null, 2));
35
+ this.config = config;
36
+ }
37
+ async getEnvironment(name) {
38
+ const config = await this.load();
39
+ return config.environments[name];
40
+ }
41
+ async saveEnvironment(env) {
42
+ const config = await this.load();
43
+ config.environments[env.name] = env;
44
+ await this.save(config);
45
+ }
46
+ async deleteEnvironment(name) {
47
+ const config = await this.load();
48
+ delete config.environments[name];
49
+ await this.save(config);
50
+ }
51
+ async listEnvironments() {
52
+ const config = await this.load();
53
+ return Object.values(config.environments);
54
+ }
55
+ async setProvider(provider, region) {
56
+ const config = await this.load();
57
+ config.provider = provider;
58
+ if (region) {
59
+ config.defaultRegion = region;
60
+ }
61
+ await this.save(config);
62
+ }
63
+ async getProvider() {
64
+ const config = await this.load();
65
+ return {
66
+ provider: config.provider,
67
+ region: config.defaultRegion,
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/core/state-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=state-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.test.d.ts","sourceRoot":"","sources":["../../src/core/state-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,183 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { StateStore } from './state-store.js';
3
+ describe('StateStore', () => {
4
+ let store;
5
+ const testConfigPath = '/tmp/sandman-test-config.json';
6
+ beforeEach(async () => {
7
+ vi.resetModules();
8
+ const fs = await import('fs/promises');
9
+ try {
10
+ await fs.unlink(testConfigPath);
11
+ }
12
+ catch { }
13
+ store = new StateStore(testConfigPath);
14
+ });
15
+ describe('load', () => {
16
+ it('should return default config when file does not exist', async () => {
17
+ const fs = await import('fs/promises');
18
+ try {
19
+ await fs.unlink(testConfigPath);
20
+ }
21
+ catch { }
22
+ const config = await store.load();
23
+ expect(config).toEqual({
24
+ version: '1.0.0',
25
+ environments: {},
26
+ });
27
+ });
28
+ it('should load existing config from file', async () => {
29
+ const fs = await import('fs/promises');
30
+ await fs.writeFile(testConfigPath, JSON.stringify({
31
+ version: '1.0.0',
32
+ environments: { 'test-env': { name: 'test-env', provider: 'gcp', status: 'active', services: [], resources: {}, createdAt: '2026-01-01T00:00:00Z', updatedAt: '2026-01-01T00:00:00Z' } },
33
+ }));
34
+ const config = await store.load();
35
+ expect(config.environments['test-env']).toBeDefined();
36
+ expect(config.environments['test-env'].name).toBe('test-env');
37
+ });
38
+ });
39
+ describe('save', () => {
40
+ it('should save config to file', async () => {
41
+ const config = {
42
+ version: '1.0.0',
43
+ environments: {},
44
+ };
45
+ await store.save(config);
46
+ const fs = await import('fs/promises');
47
+ const content = await fs.readFile(testConfigPath, 'utf-8');
48
+ expect(JSON.parse(content)).toEqual(config);
49
+ });
50
+ });
51
+ describe('getEnvironment', () => {
52
+ it('should return environment by name', async () => {
53
+ const fs = await import('fs/promises');
54
+ await fs.writeFile(testConfigPath, JSON.stringify({
55
+ version: '1.0.0',
56
+ environments: {
57
+ 'my-env': {
58
+ name: 'my-env',
59
+ provider: 'gcp',
60
+ status: 'active',
61
+ services: [],
62
+ resources: {},
63
+ createdAt: '2026-01-01T00:00:00.000Z',
64
+ updatedAt: '2026-01-01T00:00:00.000Z',
65
+ },
66
+ },
67
+ }));
68
+ const env = await store.getEnvironment('my-env');
69
+ expect(env?.name).toBe('my-env');
70
+ });
71
+ it('should return undefined for non-existent environment', async () => {
72
+ const env = await store.getEnvironment('non-existent');
73
+ expect(env).toBeUndefined();
74
+ });
75
+ });
76
+ describe('saveEnvironment', () => {
77
+ it('should add new environment', async () => {
78
+ const env = {
79
+ name: 'new-env',
80
+ provider: 'aws',
81
+ status: 'active',
82
+ services: ['s3'],
83
+ resources: { bucketName: 'test-bucket' },
84
+ createdAt: '2026-01-01T00:00:00.000Z',
85
+ updatedAt: '2026-01-01T00:00:00.000Z',
86
+ };
87
+ await store.saveEnvironment(env);
88
+ const config = await store.load();
89
+ expect(config.environments['new-env']).toBeDefined();
90
+ });
91
+ it('should update existing environment', async () => {
92
+ const fs = await import('fs/promises');
93
+ await fs.writeFile(testConfigPath, JSON.stringify({
94
+ version: '1.0.0',
95
+ environments: {
96
+ 'existing-env': {
97
+ name: 'existing-env',
98
+ provider: 'gcp',
99
+ status: 'active',
100
+ services: [],
101
+ resources: {},
102
+ createdAt: '2026-01-01T00:00:00.000Z',
103
+ updatedAt: '2026-01-01T00:00:00.000Z',
104
+ },
105
+ },
106
+ }));
107
+ const env = {
108
+ name: 'existing-env',
109
+ provider: 'gcp',
110
+ status: 'failed',
111
+ services: [],
112
+ resources: {},
113
+ createdAt: '2026-01-01T00:00:00.000Z',
114
+ updatedAt: '2026-01-02T00:00:00.000Z',
115
+ error: 'Test error',
116
+ };
117
+ await store.saveEnvironment(env);
118
+ const config = await store.load();
119
+ expect(config.environments['existing-env']?.status).toBe('failed');
120
+ });
121
+ });
122
+ describe('deleteEnvironment', () => {
123
+ it('should remove environment by name', async () => {
124
+ const fs = await import('fs/promises');
125
+ await fs.writeFile(testConfigPath, JSON.stringify({
126
+ version: '1.0.0',
127
+ environments: {
128
+ 'to-delete': {
129
+ name: 'to-delete',
130
+ provider: 'gcp',
131
+ status: 'active',
132
+ services: [],
133
+ resources: {},
134
+ createdAt: '2026-01-01T00:00:00.000Z',
135
+ updatedAt: '2026-01-01T00:00:00.000Z',
136
+ },
137
+ },
138
+ }));
139
+ await store.deleteEnvironment('to-delete');
140
+ const config = await store.load();
141
+ expect(config.environments['to-delete']).toBeUndefined();
142
+ });
143
+ });
144
+ describe('listEnvironments', () => {
145
+ it('should return all environments', async () => {
146
+ const fs = await import('fs/promises');
147
+ await fs.writeFile(testConfigPath, JSON.stringify({
148
+ version: '1.0.0',
149
+ environments: {
150
+ env1: {
151
+ name: 'env1',
152
+ provider: 'gcp',
153
+ status: 'active',
154
+ services: [],
155
+ resources: {},
156
+ createdAt: '2026-01-01T00:00:00.000Z',
157
+ updatedAt: '2026-01-01T00:00:00.000Z',
158
+ },
159
+ env2: {
160
+ name: 'env2',
161
+ provider: 'aws',
162
+ status: 'active',
163
+ services: [],
164
+ resources: {},
165
+ createdAt: '2026-01-02T00:00:00.000Z',
166
+ updatedAt: '2026-01-02T00:00:00.000Z',
167
+ },
168
+ },
169
+ }));
170
+ const envs = await store.listEnvironments();
171
+ expect(envs).toHaveLength(2);
172
+ });
173
+ });
174
+ describe('setProvider', () => {
175
+ it('should set provider config', async () => {
176
+ await store.setProvider('gcp', 'us-central1');
177
+ const config = await store.load();
178
+ expect(config.provider).toBe('gcp');
179
+ expect(config.defaultRegion).toBe('us-central1');
180
+ });
181
+ });
182
+ });
183
+ //# sourceMappingURL=state-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.test.js","sourceRoot":"","sources":["../../src/core/state-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { program } from './cli/index.js';
3
+ program.parse(process.argv);
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { ProviderAdapter } from "../base.js";
2
+ import { EnvironmentRecord, ServiceName } from "../../types/index.js";
3
+ export declare class AwsAdapter implements ProviderAdapter {
4
+ private accountId;
5
+ private region;
6
+ init(): Promise<void>;
7
+ createEnvironment(name: string): Promise<EnvironmentRecord>;
8
+ enableServices(env: EnvironmentRecord, services: ServiceName[]): Promise<void>;
9
+ connect(env: EnvironmentRecord): Promise<Record<string, string>>;
10
+ destroyEnvironment(env: EnvironmentRecord): Promise<void>;
11
+ getStatus(env: EnvironmentRecord): Promise<EnvironmentRecord>;
12
+ getAccountInfo(): {
13
+ accountId: string | null;
14
+ region: string;
15
+ };
16
+ }
17
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/aws/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtE,qBAAa,UAAW,YAAW,eAAe;IAChD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAuB;IAE/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmC3D,cAAc,CAClB,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC;IAIV,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAkBhE,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CzD,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAInE,cAAc,IAAI;QAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAM/D"}