@itssergio91/sandman 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +54 -272
  2. package/dist/cli/commands/cli-contract.test.d.ts +2 -0
  3. package/dist/cli/commands/cli-contract.test.d.ts.map +1 -0
  4. package/dist/cli/commands/cli-contract.test.js +217 -0
  5. package/dist/cli/commands/cli-contract.test.js.map +1 -0
  6. package/dist/cli/commands/connect.d.ts +1 -0
  7. package/dist/cli/commands/connect.d.ts.map +1 -1
  8. package/dist/cli/commands/connect.js +67 -42
  9. package/dist/cli/commands/connect.js.map +1 -1
  10. package/dist/cli/commands/create.d.ts +7 -2
  11. package/dist/cli/commands/create.d.ts.map +1 -1
  12. package/dist/cli/commands/create.js +158 -46
  13. package/dist/cli/commands/create.js.map +1 -1
  14. package/dist/cli/commands/destroy.d.ts.map +1 -1
  15. package/dist/cli/commands/destroy.js +27 -23
  16. package/dist/cli/commands/destroy.js.map +1 -1
  17. package/dist/cli/commands/doctor.d.ts +8 -0
  18. package/dist/cli/commands/doctor.d.ts.map +1 -0
  19. package/dist/cli/commands/doctor.js +124 -0
  20. package/dist/cli/commands/doctor.js.map +1 -0
  21. package/dist/cli/commands/enable.d.ts +1 -2
  22. package/dist/cli/commands/enable.d.ts.map +1 -1
  23. package/dist/cli/commands/enable.js +75 -46
  24. package/dist/cli/commands/enable.js.map +1 -1
  25. package/dist/cli/commands/init.d.ts +2 -2
  26. package/dist/cli/commands/init.d.ts.map +1 -1
  27. package/dist/cli/commands/init.js +49 -17
  28. package/dist/cli/commands/init.js.map +1 -1
  29. package/dist/cli/commands/list.d.ts.map +1 -1
  30. package/dist/cli/commands/list.js +25 -18
  31. package/dist/cli/commands/list.js.map +1 -1
  32. package/dist/cli/commands/providers.d.ts +6 -0
  33. package/dist/cli/commands/providers.d.ts.map +1 -0
  34. package/dist/cli/commands/providers.js +20 -0
  35. package/dist/cli/commands/providers.js.map +1 -0
  36. package/dist/cli/commands/status.d.ts.map +1 -1
  37. package/dist/cli/commands/status.js +88 -50
  38. package/dist/cli/commands/status.js.map +1 -1
  39. package/dist/cli/env-name.d.ts +7 -0
  40. package/dist/cli/env-name.d.ts.map +1 -0
  41. package/dist/cli/env-name.js +9 -0
  42. package/dist/cli/env-name.js.map +1 -0
  43. package/dist/cli/env-name.test.d.ts +2 -0
  44. package/dist/cli/env-name.test.d.ts.map +1 -0
  45. package/dist/cli/env-name.test.js +38 -0
  46. package/dist/cli/env-name.test.js.map +1 -0
  47. package/dist/cli/index.d.ts.map +1 -1
  48. package/dist/cli/index.js +43 -11
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/cli/output.d.ts +28 -0
  51. package/dist/cli/output.d.ts.map +1 -0
  52. package/dist/cli/output.js +60 -0
  53. package/dist/cli/output.js.map +1 -0
  54. package/dist/cli/output.test.d.ts +2 -0
  55. package/dist/cli/output.test.d.ts.map +1 -0
  56. package/dist/cli/output.test.js +78 -0
  57. package/dist/cli/output.test.js.map +1 -0
  58. package/dist/cli/reap.d.ts +11 -0
  59. package/dist/cli/reap.d.ts.map +1 -0
  60. package/dist/cli/reap.js +32 -0
  61. package/dist/cli/reap.js.map +1 -0
  62. package/dist/cli/secrets.d.ts +8 -0
  63. package/dist/cli/secrets.d.ts.map +1 -0
  64. package/dist/cli/secrets.js +30 -0
  65. package/dist/cli/secrets.js.map +1 -0
  66. package/dist/core/state-store.d.ts +15 -1
  67. package/dist/core/state-store.d.ts.map +1 -1
  68. package/dist/core/state-store.js +168 -33
  69. package/dist/core/state-store.js.map +1 -1
  70. package/dist/core/state-store.test.js +40 -0
  71. package/dist/core/state-store.test.js.map +1 -1
  72. package/dist/index.js +0 -0
  73. package/dist/providers/aws/adapter.d.ts +13 -2
  74. package/dist/providers/aws/adapter.d.ts.map +1 -1
  75. package/dist/providers/aws/adapter.js +402 -63
  76. package/dist/providers/aws/adapter.js.map +1 -1
  77. package/dist/providers/aws/adapter.test.js +300 -191
  78. package/dist/providers/aws/adapter.test.js.map +1 -1
  79. package/dist/providers/base.d.ts +1 -9
  80. package/dist/providers/base.d.ts.map +1 -1
  81. package/dist/providers/base.js.map +1 -1
  82. package/dist/providers/base.test.js +12 -2
  83. package/dist/providers/base.test.js.map +1 -1
  84. package/dist/providers/catalog.d.ts +15 -0
  85. package/dist/providers/catalog.d.ts.map +1 -0
  86. package/dist/providers/catalog.js +53 -0
  87. package/dist/providers/catalog.js.map +1 -0
  88. package/dist/providers/cloudflare/adapter.d.ts +5 -2
  89. package/dist/providers/cloudflare/adapter.d.ts.map +1 -1
  90. package/dist/providers/cloudflare/adapter.js +17 -5
  91. package/dist/providers/cloudflare/adapter.js.map +1 -1
  92. package/dist/providers/cloudflare/adapter.test.js +4 -4
  93. package/dist/providers/cloudflare/adapter.test.js.map +1 -1
  94. package/dist/providers/enable-result.d.ts +9 -0
  95. package/dist/providers/enable-result.d.ts.map +1 -0
  96. package/dist/providers/enable-result.js +26 -0
  97. package/dist/providers/enable-result.js.map +1 -0
  98. package/dist/providers/gcp/adapter.d.ts +9 -3
  99. package/dist/providers/gcp/adapter.d.ts.map +1 -1
  100. package/dist/providers/gcp/adapter.js +115 -20
  101. package/dist/providers/gcp/adapter.js.map +1 -1
  102. package/dist/providers/gcp/adapter.test.js +52 -0
  103. package/dist/providers/gcp/adapter.test.js.map +1 -1
  104. package/dist/providers/index.d.ts +5 -2
  105. package/dist/providers/index.d.ts.map +1 -1
  106. package/dist/providers/index.js +13 -0
  107. package/dist/providers/index.js.map +1 -1
  108. package/dist/providers/vercel/adapter.d.ts +5 -2
  109. package/dist/providers/vercel/adapter.d.ts.map +1 -1
  110. package/dist/providers/vercel/adapter.js +17 -5
  111. package/dist/providers/vercel/adapter.js.map +1 -1
  112. package/dist/providers/vercel/adapter.test.js +4 -4
  113. package/dist/providers/vercel/adapter.test.js.map +1 -1
  114. package/dist/types/index.d.ts +40 -1
  115. package/dist/types/index.d.ts.map +1 -1
  116. package/dist/types/index.js +4 -0
  117. package/dist/types/index.js.map +1 -1
  118. package/dist/utils/cost-estimator.d.ts +2 -0
  119. package/dist/utils/cost-estimator.d.ts.map +1 -1
  120. package/dist/utils/cost-estimator.js +23 -0
  121. package/dist/utils/cost-estimator.js.map +1 -1
  122. package/dist/utils/cost-estimator.test.js +16 -1
  123. package/dist/utils/cost-estimator.test.js.map +1 -1
  124. package/dist/utils/logger.d.ts +8 -0
  125. package/dist/utils/logger.d.ts.map +1 -0
  126. package/dist/utils/logger.js +12 -0
  127. package/dist/utils/logger.js.map +1 -0
  128. package/dist/utils/ttl.d.ts +13 -0
  129. package/dist/utils/ttl.d.ts.map +1 -0
  130. package/dist/utils/ttl.js +35 -0
  131. package/dist/utils/ttl.js.map +1 -0
  132. package/dist/utils/ttl.test.d.ts +2 -0
  133. package/dist/utils/ttl.test.d.ts.map +1 -0
  134. package/dist/utils/ttl.test.js +27 -0
  135. package/dist/utils/ttl.test.js.map +1 -0
  136. package/package.json +12 -5
@@ -1,66 +1,91 @@
1
1
  import chalk from 'chalk';
2
2
  import ora from 'ora';
3
3
  import { getAdapter } from '../../providers/index.js';
4
+ import { emitErr, emitOk, mapThrownError } from '../output.js';
5
+ import { quoteEnvValue, redactSecrets } from '../secrets.js';
6
+ import { reapIfExpired } from '../reap.js';
4
7
  export async function connectEnvironment(name, store, options = {}) {
5
8
  const env = await store.getEnvironment(name);
6
9
  if (!env) {
7
- if (options.json) {
8
- console.log(JSON.stringify({ success: false, error: `Environment "${name}" not found.` }));
9
- process.exit(1);
10
- }
11
- console.log(chalk.red(`Environment "${name}" not found.`));
12
- process.exit(1);
10
+ emitErr(options.json, {
11
+ code: 'NOT_FOUND',
12
+ error: `Environment "${name}" not found.`,
13
+ next: ['sandman list --json'],
14
+ });
13
15
  }
14
16
  if (!options.json && env.status !== 'active') {
15
17
  console.log(chalk.yellow(`Environment "${name}" is not active (status: ${env.status}).`));
16
18
  }
19
+ const reap = await reapIfExpired(store, env);
20
+ if (reap.reaped) {
21
+ emitErr(options.json, {
22
+ code: 'EXPIRED',
23
+ error: `Environment "${name}" exceeded its TTL and was destroyed.`,
24
+ next: [`sandman create ${name} --provider ${env.provider} --json`],
25
+ });
26
+ }
27
+ if (reap.error) {
28
+ emitErr(options.json, {
29
+ code: 'PROVIDER_ERROR',
30
+ error: `Environment "${name}" is expired but destroy failed: ${reap.error}`,
31
+ next: [`sandman destroy ${name} -y --json`],
32
+ });
33
+ }
17
34
  const spinner = options.json ? null : ora(`Connecting to ${name}...`).start();
18
35
  try {
19
36
  const adapter = getAdapter(env.provider);
20
- const credentials = await adapter.connect(env);
37
+ const rawCredentials = await adapter.connect(env);
38
+ const { values: credentials, secretsRedacted } = redactSecrets(rawCredentials, options.showSecrets ?? false);
21
39
  spinner?.stop();
22
- if (options.json) {
23
- console.log(JSON.stringify({ success: true, credentials }));
24
- return;
25
- }
26
- console.log(chalk.bold(`\nConnecting to environment: ${name}\n`));
27
- if (env.provider === 'gcp') {
28
- console.log(chalk.gray('# GCP Configuration'));
29
- if (credentials.GCP_PROJECT) {
30
- console.log(`export GCP_PROJECT=${credentials.GCP_PROJECT}`);
40
+ emitOk(options.json, { credentials, secretsRedacted }, () => {
41
+ console.log(chalk.bold(`\nConnecting to environment: ${name}\n`));
42
+ if (env.provider === 'gcp') {
43
+ console.log(chalk.gray('# GCP Configuration'));
44
+ if (credentials.GCP_PROJECT) {
45
+ console.log(`export GCP_PROJECT=${quoteEnvValue(credentials.GCP_PROJECT)}`);
46
+ }
47
+ console.log(chalk.gray('\n# Use with gcloud:'));
48
+ console.log(chalk.cyan(`gcloud config set project ${credentials.GCP_PROJECT || '<project-id>'}`));
49
+ console.log(chalk.cyan('gcloud auth application-default login'));
50
+ }
51
+ else if (env.provider === 'aws') {
52
+ console.log(chalk.gray('# AWS Configuration'));
53
+ if (credentials.AWS_ACCOUNT_ID) {
54
+ console.log(`export AWS_ACCOUNT_ID=${quoteEnvValue(credentials.AWS_ACCOUNT_ID)}`);
55
+ }
56
+ if (credentials.AWS_REGION) {
57
+ console.log(`export AWS_REGION=${quoteEnvValue(credentials.AWS_REGION)}`);
58
+ }
59
+ console.log(chalk.gray('\n# Use with AWS CLI:'));
60
+ console.log(chalk.cyan('aws configure'));
61
+ }
62
+ else if (env.provider === 'cloudflare') {
63
+ console.log(chalk.gray('# Cloudflare Configuration'));
64
+ console.log(chalk.cyan('export CLOUDFLARE_API_TOKEN=<set in environment>'));
31
65
  }
32
- console.log(chalk.gray('\n# Use with gcloud:'));
33
- console.log(chalk.cyan(`gcloud config set project ${credentials.GCP_PROJECT || '<project-id>'}`));
34
- console.log(chalk.cyan('gcloud auth application-default login'));
35
- }
36
- else if (env.provider === 'aws') {
37
- console.log(chalk.gray('# AWS Configuration'));
38
- if (credentials.AWS_ACCOUNT_ID) {
39
- console.log(`export AWS_ACCOUNT_ID=${credentials.AWS_ACCOUNT_ID}`);
66
+ else if (env.provider === 'vercel') {
67
+ console.log(chalk.gray('# Vercel Configuration'));
68
+ console.log(chalk.cyan('export VERCEL_TOKEN=<set in environment>'));
40
69
  }
41
- if (credentials.AWS_REGION) {
42
- console.log(`export AWS_REGION=${credentials.AWS_REGION}`);
70
+ console.log(chalk.gray('\n# Copy to .env:'));
71
+ console.log(chalk.cyan(`SANDMAN_ENV=${quoteEnvValue(name)}`));
72
+ for (const [key, value] of Object.entries(credentials)) {
73
+ if (key !== 'provider') {
74
+ console.log(chalk.cyan(`${key}=${quoteEnvValue(value)}`));
75
+ }
43
76
  }
44
- console.log(chalk.gray('\n# Use with AWS CLI:'));
45
- console.log(chalk.cyan('aws configure'));
46
- }
47
- console.log(chalk.gray('\n# Copy to .env:'));
48
- console.log(chalk.cyan('SANDMAN_ENV=' + name));
49
- for (const [key, value] of Object.entries(credentials)) {
50
- if (key !== 'provider') {
51
- console.log(chalk.cyan(`${key}=${value}`));
77
+ if (secretsRedacted) {
78
+ console.log(chalk.gray('\nSecrets redacted. Pass --show-secrets to print token values.'));
52
79
  }
53
- }
54
- console.log(chalk.green('\n✓ Environment configured'));
80
+ console.log(chalk.green('\n✓ Environment configured'));
81
+ });
55
82
  }
56
83
  catch (error) {
57
- if (options.json) {
58
- console.log(JSON.stringify({ success: false, error: error.message }));
59
- process.exit(1);
60
- }
61
84
  spinner?.fail?.(chalk.red('Failed to connect'));
62
- console.log(chalk.red(`Error: ${error.message}`));
63
- process.exit(1);
85
+ const mapped = mapThrownError(error);
86
+ emitErr(options.json, mapped, () => {
87
+ console.log(chalk.red(`Error: ${mapped.error}`));
88
+ });
64
89
  }
65
90
  }
66
91
  //# sourceMappingURL=connect.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/cli/commands/connect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/cli/commands/connect.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,14 @@
1
1
  import { StateStore } from "../../core/state-store.js";
2
- import { CreateOptions } from "../../types/index.js";
3
2
  interface CreateParams {
4
3
  dryRun?: boolean;
5
4
  json?: boolean;
5
+ strict?: boolean;
6
6
  }
7
- export declare function createEnvironment(name: string, options: CreateOptions, store: StateStore, params: CreateParams): Promise<void>;
7
+ export declare function createEnvironment(name: string, options: {
8
+ provider?: string;
9
+ region?: string;
10
+ billingAccount?: string;
11
+ ttl?: string;
12
+ }, store: StateStore, params: CreateParams): Promise<void>;
8
13
  export {};
9
14
  //# sourceMappingURL=create.d.ts.map
@@ -1 +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,EAAE,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AAOnE,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAyGf"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAevD,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,EACD,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CA4Pf"}
@@ -1,53 +1,98 @@
1
1
  import chalk from "chalk";
2
2
  import ora from "ora";
3
- import { getAdapter } from "../../providers/index.js";
4
- import { calculateEstimate, formatHourlyRate, } from "../../utils/cost-estimator.js";
3
+ import { configureAdapter, getAdapter } from "../../providers/index.js";
4
+ import { experimentalWarning, parseProvider, } from "../../providers/catalog.js";
5
+ import { calculateEstimate, defaultCreateServices, formatHourlyRate, } from "../../utils/cost-estimator.js";
6
+ import { TTL_HINT, expiresAtFromTtl } from "../../utils/ttl.js";
7
+ import { emitErr, emitOk, mapThrownError } from "../output.js";
8
+ import { ENV_NAME_HINT, isValidEnvName } from "../env-name.js";
5
9
  export async function createEnvironment(name, options, store, params) {
10
+ if (!isValidEnvName(name)) {
11
+ emitErr(params.json, {
12
+ code: "INVALID_NAME",
13
+ error: `Invalid environment name "${name}".`,
14
+ hint: ENV_NAME_HINT,
15
+ });
16
+ }
6
17
  const providerConfig = await store.getProvider();
7
- const providerType = (options.provider || providerConfig.provider);
18
+ const rawProvider = options.provider || providerConfig.provider;
19
+ const providerType = rawProvider
20
+ ? parseProvider(String(rawProvider))
21
+ : undefined;
22
+ if (rawProvider && !providerType) {
23
+ emitErr(params.json, {
24
+ code: "INVALID_PROVIDER",
25
+ error: `Unknown provider "${rawProvider}".`,
26
+ hint: 'Use "sandman providers" to see supported providers.',
27
+ next: ["sandman providers --json"],
28
+ });
29
+ }
8
30
  if (!providerType) {
9
- if (params.json) {
10
- console.log(JSON.stringify({
11
- success: false,
12
- error: 'No provider specified. Run "sandman init <provider>" first.',
13
- }));
14
- process.exit(1);
15
- }
16
- console.log(chalk.red("Error: No provider specified."));
17
- console.log(chalk.gray('Run "sandman init aws" or "sandman init gcp" first.'));
18
- process.exit(1);
31
+ emitErr(params.json, {
32
+ code: "NO_PROVIDER",
33
+ error: "No provider specified. Run \"sandman init <provider>\" first.",
34
+ next: ["sandman init aws", "sandman init gcp", "sandman providers --json"],
35
+ }, () => {
36
+ console.log(chalk.red("Error: No provider specified."));
37
+ console.log(chalk.gray('Run "sandman init aws" or "sandman init gcp" first.'));
38
+ });
19
39
  }
20
40
  const existing = await store.getEnvironment(name);
21
- if (existing) {
22
- if (params.json) {
23
- console.log(JSON.stringify({
24
- success: false,
25
- error: `Environment "${name}" already exists.`,
26
- }));
27
- process.exit(1);
41
+ if (existing && existing.status !== "destroyed") {
42
+ emitErr(params.json, {
43
+ code: "ALREADY_EXISTS",
44
+ error: `Environment "${name}" already exists.`,
45
+ next: [`sandman status ${name}`, `sandman destroy ${name}`],
46
+ });
47
+ }
48
+ let ttlInfo;
49
+ if (options.ttl) {
50
+ try {
51
+ ttlInfo = expiresAtFromTtl(options.ttl);
52
+ }
53
+ catch (error) {
54
+ emitErr(params.json, {
55
+ code: "INVALID_TTL",
56
+ error: error instanceof Error ? error.message : String(error),
57
+ hint: TTL_HINT,
58
+ });
28
59
  }
29
- console.log(chalk.red(`Environment "${name}" already exists.`));
30
- process.exit(1);
31
60
  }
61
+ const warning = experimentalWarning(providerType);
62
+ const requestedRegion = options.region || providerConfig.region;
63
+ const region = requestedRegion || "default";
64
+ const requestedBilling = options.billingAccount ||
65
+ providerConfig.billingAccount ||
66
+ process.env.GCP_BILLING_ACCOUNT;
32
67
  if (params.dryRun) {
33
68
  const dryRunResult = {
34
69
  dryRun: true,
35
70
  name,
36
71
  provider: providerType,
37
- region: options.region || providerConfig.region || "default",
72
+ region,
73
+ ...(requestedBilling ? { billingAccount: requestedBilling } : {}),
74
+ ...(ttlInfo ? { ttl: ttlInfo.ttl, expiresAt: ttlInfo.expiresAt } : {}),
75
+ ...(params.strict ? { strict: true } : {}),
76
+ ...(warning ? { warning } : {}),
38
77
  };
39
- if (params.json) {
40
- console.log(JSON.stringify(dryRunResult));
41
- return;
42
- }
43
- console.log(chalk.cyan("[DRY RUN] Would create:"));
44
- console.log(chalk.gray(` - Environment: ${name}`));
45
- console.log(chalk.gray(` - Provider: ${providerType}`));
46
- console.log(chalk.gray(` - Region: ${dryRunResult.region}`));
78
+ emitOk(params.json, dryRunResult, () => {
79
+ console.log(chalk.cyan("[DRY RUN] Would create:"));
80
+ console.log(chalk.gray(` - Environment: ${name}`));
81
+ console.log(chalk.gray(` - Provider: ${providerType}`));
82
+ console.log(chalk.gray(` - Region: ${region}`));
83
+ if (requestedBilling) {
84
+ console.log(chalk.gray(` - Billing: ${requestedBilling}`));
85
+ }
86
+ if (ttlInfo) {
87
+ console.log(chalk.gray(` - TTL: ${ttlInfo.ttl} (expires ${ttlInfo.expiresAt})`));
88
+ }
89
+ if (warning) {
90
+ console.log(chalk.yellow(` - Warning: ${warning}`));
91
+ }
92
+ });
47
93
  return;
48
94
  }
49
- // Calculate estimated cost
50
- const costEstimate = calculateEstimate(providerType, []);
95
+ const costEstimate = calculateEstimate(providerType, defaultCreateServices(providerType));
51
96
  const costDisplay = formatHourlyRate(costEstimate.hourlyRate);
52
97
  if (!params.json) {
53
98
  console.log(chalk.blue(`\nCreating environment "${name}" on ${providerType}...`));
@@ -55,28 +100,95 @@ export async function createEnvironment(name, options, store, params) {
55
100
  console.log(chalk.gray('⚠ Run "sandman destroy ' +
56
101
  name +
57
102
  '" when finished to avoid ongoing charges\n'));
103
+ if (ttlInfo) {
104
+ console.log(chalk.gray(`TTL ${ttlInfo.ttl}; expires ${ttlInfo.expiresAt}`));
105
+ }
106
+ if (warning) {
107
+ console.log(chalk.yellow(`⚠ ${warning}\n`));
108
+ }
58
109
  }
59
110
  const spinner = params.json ? null : ora("Creating environment...").start();
60
111
  try {
61
112
  const adapter = getAdapter(providerType);
113
+ await adapter.init();
114
+ configureAdapter(adapter, {
115
+ region: requestedRegion,
116
+ billingAccount: requestedBilling,
117
+ });
62
118
  const env = await adapter.createEnvironment(name);
119
+ if (requestedRegion && !env.region) {
120
+ env.region = requestedRegion;
121
+ }
122
+ if (ttlInfo) {
123
+ env.ttl = ttlInfo.ttl;
124
+ env.expiresAt = ttlInfo.expiresAt;
125
+ }
63
126
  await store.saveEnvironment(env);
64
- if (params.json) {
65
- console.log(JSON.stringify({ success: true, environment: env }));
66
- return;
127
+ const warnings = [];
128
+ if (warning)
129
+ warnings.push(warning);
130
+ if (env.status === "failed" && env.error)
131
+ warnings.push(env.error);
132
+ const partial = env.status === "failed";
133
+ const payload = {
134
+ environment: env,
135
+ ...(warning ? { warning } : {}),
136
+ ...(warnings.length ? { warnings } : {}),
137
+ ...(partial ? { partial: true } : {}),
138
+ };
139
+ if (partial && params.strict) {
140
+ emitErr(params.json, {
141
+ code: "PARTIAL",
142
+ error: env.error ||
143
+ `Environment "${name}" was created with partial or unlinkable resources.`,
144
+ ...payload,
145
+ hint: "Pass without --strict to record the failure and continue. Destroy leftovers before recreating.",
146
+ next: [
147
+ `sandman destroy ${name} -y --json`,
148
+ `sandman status ${name} --json`,
149
+ ],
150
+ }, () => {
151
+ spinner?.fail?.(chalk.red(`Environment "${name}" was saved as failed (partial resources).`));
152
+ if (env.error) {
153
+ console.log(chalk.red(`Error: ${env.error}`));
154
+ }
155
+ console.log(chalk.cyan(`\n→ Run "sandman status ${name}" to see what was created`));
156
+ console.log(chalk.cyan(`→ Run "sandman destroy ${name}" to clean up partial resources`));
157
+ });
67
158
  }
68
- spinner.succeed(chalk.green(`Environment "${name}" created successfully!`));
69
- console.log(chalk.cyan(`\n→ Run "sandman status ${name}" to see details`));
70
- console.log(chalk.cyan(`→ Run "sandman enable <services> -e ${name}" to enable services`));
159
+ emitOk(params.json, payload, () => {
160
+ if (partial) {
161
+ spinner.warn(chalk.yellow(`Environment "${name}" was saved as failed (partial resources).`));
162
+ if (env.error) {
163
+ console.log(chalk.red(`Error: ${env.error}`));
164
+ }
165
+ console.log(chalk.cyan(`\n→ Run "sandman status ${name}" to see what was created`));
166
+ console.log(chalk.cyan(`→ Run "sandman destroy ${name}" to clean up partial resources`));
167
+ if (!params.strict) {
168
+ console.log(chalk.gray('→ Agents: pass --strict to exit non-zero on failed creates'));
169
+ }
170
+ return;
171
+ }
172
+ spinner.succeed(chalk.green(`Environment "${name}" created successfully!`));
173
+ if (warning) {
174
+ console.log(chalk.yellow(`⚠ ${warning}`));
175
+ }
176
+ if (ttlInfo) {
177
+ console.log(chalk.gray(`Expires ${ttlInfo.expiresAt}. Status/connect/enable will reap it after TTL.`));
178
+ }
179
+ console.log(chalk.cyan(`\n→ Run "sandman status ${name}" to see details`));
180
+ console.log(chalk.cyan(`→ Run "sandman enable <services> -e ${name}" to enable services`));
181
+ });
71
182
  }
72
183
  catch (error) {
73
- if (params.json) {
74
- console.log(JSON.stringify({ success: false, error: error.message }));
75
- process.exit(1);
76
- }
77
- spinner.fail(chalk.red("Failed to create environment"));
78
- console.log(chalk.red(`Error: ${error.message}`));
79
- process.exit(1);
184
+ spinner?.fail?.(chalk.red("Failed to create environment"));
185
+ const mapped = mapThrownError(error);
186
+ emitErr(params.json, {
187
+ ...mapped,
188
+ hint: 'Partial cloud resources may exist. Run "sandman status" / "sandman destroy" after fixing the issue.',
189
+ }, () => {
190
+ console.log(chalk.red(`Error: ${mapped.error}`));
191
+ });
80
192
  }
81
193
  }
82
194
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EACL,mBAAmB,EACnB,aAAa,GACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAQ/D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,OAKC,EACD,KAAiB,EACjB,MAAoB;IAEpB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;YACnB,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,6BAA6B,IAAI,IAAI;YAC5C,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC;IAChE,MAAM,YAAY,GAAG,WAAW;QAC9B,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;YACnB,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,qBAAqB,WAAW,IAAI;YAC3C,IAAI,EAAE,qDAAqD;YAC3D,IAAI,EAAE,CAAC,0BAA0B,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CACL,MAAM,CAAC,IAAI,EACX;YACE,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,+DAA+D;YACtE,IAAI,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,0BAA0B,CAAC;SAC3E,EACD,GAAG,EAAE;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAClE,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;YACnB,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,gBAAgB,IAAI,mBAAmB;YAC9C,IAAI,EAAE,CAAC,kBAAkB,IAAI,EAAE,EAAE,mBAAmB,IAAI,EAAE,CAAC;SAC5D,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAuD,CAAC;IAC5D,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;gBACnB,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC;IAChE,MAAM,MAAM,GAAG,eAAe,IAAI,SAAS,CAAC;IAC5C,MAAM,gBAAgB,GACpB,OAAO,CAAC,cAAc;QACtB,cAAc,CAAC,cAAc;QAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAElC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,YAAY,GAAG;YACnB,MAAM,EAAE,IAAI;YACZ,IAAI;YACJ,QAAQ,EAAE,YAAY;YACtB,MAAM;YACN,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,YAAY,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC,CAAC;YACjD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,GAAG,aAAa,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACpF,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,iBAAiB,CACpC,YAAY,EACZ,qBAAqB,CAAC,YAAY,CAAC,CACpC,CAAC;IACF,MAAM,WAAW,GAAG,gBAAgB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAE9D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,QAAQ,YAAY,KAAK,CAAC,CACrE,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,WAAW,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,yBAAyB;YACvB,IAAI;YACJ,4CAA4C,CAC/C,CACF,CAAC;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,GAAG,aAAa,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,gBAAgB,CAAC,OAAO,EAAE;YACxB,MAAM,EAAE,eAAe;YACvB,cAAc,EAAE,gBAAgB;SACjC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,eAAe,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACnC,GAAG,CAAC,MAAM,GAAG,eAAe,CAAC;QAC/B,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;YACtB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,CAAC;QAED,MAAM,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEjC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,OAAO;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC;QACxC,MAAM,OAAO,GAAG;YACd,WAAW,EAAE,GAAG;YAChB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtC,CAAC;QAEF,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7B,OAAO,CACL,MAAM,CAAC,IAAI,EACX;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK,EACH,GAAG,CAAC,KAAK;oBACT,gBAAgB,IAAI,qDAAqD;gBAC3E,GAAG,OAAO;gBACV,IAAI,EAAE,gGAAgG;gBACtG,IAAI,EAAE;oBACJ,mBAAmB,IAAI,YAAY;oBACnC,kBAAkB,IAAI,SAAS;iBAChC;aACF,EACD,GAAG,EAAE;gBACH,OAAO,EAAE,IAAI,EAAE,CACb,KAAK,CAAC,GAAG,CACP,gBAAgB,IAAI,4CAA4C,CACjE,CACF,CAAC;gBACF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,2BAA2B,CAAC,CACvE,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,0BAA0B,IAAI,iCAAiC,CAChE,CACF,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;YAChC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAQ,CAAC,IAAI,CACX,KAAK,CAAC,MAAM,CACV,gBAAgB,IAAI,4CAA4C,CACjE,CACF,CAAC;gBACF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;oBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,2BAA2B,CAAC,CACvE,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,0BAA0B,IAAI,iCAAiC,CAChE,CACF,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CACzE,CAAC;gBACJ,CAAC;gBACD,OAAO;YACT,CAAC;YACD,OAAQ,CAAC,OAAO,CACd,KAAK,CAAC,KAAK,CAAC,gBAAgB,IAAI,yBAAyB,CAAC,CAC3D,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,WAAW,OAAO,CAAC,SAAS,iDAAiD,CAC9E,CACF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,IAAI,kBAAkB,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,uCAAuC,IAAI,sBAAsB,CAClE,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACrC,OAAO,CACL,MAAM,CAAC,IAAI,EACX;YACE,GAAG,MAAM;YACT,IAAI,EAAE,qGAAqG;SAC5G,EACD,GAAG,EAAE;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1 +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;AAIvD,UAAU,aAAa;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,MAAM,GAAE,aAAoC,GAC3C,OAAO,CAAC,IAAI,CAAC,CA+Df"}
1
+ {"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/destroy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIvD,UAAU,aAAa;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,MAAM,GAAE,aAAoC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAqEf"}
@@ -1,17 +1,25 @@
1
1
  import chalk from 'chalk';
2
2
  import ora from 'ora';
3
3
  import { getAdapter } from '../../providers/index.js';
4
+ import { emitErr, emitOk, mapThrownError } from '../output.js';
4
5
  export async function destroyEnvironment(name, store, params = { confirmed: false }) {
5
6
  const env = await store.getEnvironment(name);
6
7
  if (!env) {
7
- if (params.json) {
8
- console.log(JSON.stringify({ success: false, error: `Environment "${name}" not found.` }));
9
- process.exit(1);
10
- }
11
- console.log(chalk.red(`Environment "${name}" not found.`));
12
- process.exit(1);
8
+ emitErr(params.json, {
9
+ code: 'NOT_FOUND',
10
+ error: `Environment "${name}" not found.`,
11
+ next: ['sandman list --json'],
12
+ });
13
13
  }
14
14
  if (!params.confirmed) {
15
+ if (params.json) {
16
+ emitErr(params.json, {
17
+ code: 'CONFIRMATION_REQUIRED',
18
+ error: `Refusing to destroy "${name}" without confirmation.`,
19
+ hint: 'Pass -y to skip the interactive prompt (required for --json).',
20
+ next: [`sandman destroy ${name} -y --json`],
21
+ });
22
+ }
15
23
  console.log(chalk.yellow(`\n⚠️ This will destroy environment "${name}" on ${env.provider}.`));
16
24
  console.log(chalk.gray('All resources will be permanently deleted.\n'));
17
25
  const readline = await import('readline');
@@ -34,25 +42,21 @@ export async function destroyEnvironment(name, store, params = { confirmed: fals
34
42
  try {
35
43
  const adapter = getAdapter(env.provider);
36
44
  await adapter.destroyEnvironment(env);
37
- const now = new Date().toISOString();
38
- env.status = 'destroyed';
39
- env.updatedAt = now;
40
- await store.saveEnvironment(env);
41
- if (params.json) {
42
- console.log(JSON.stringify({ success: true, name, status: 'destroyed' }));
43
- return;
44
- }
45
- spinner.succeed(chalk.green(`✓ Environment "${name}" destroyed.`));
46
- console.log(chalk.gray('Cloud resources cleaned up.'));
45
+ await store.deleteEnvironment(name);
46
+ emitOk(params.json, { name, status: 'destroyed' }, () => {
47
+ spinner.succeed(chalk.green(`✓ Environment "${name}" destroyed.`));
48
+ console.log(chalk.gray('Cloud resources cleaned up.'));
49
+ });
47
50
  }
48
51
  catch (error) {
49
- if (params.json) {
50
- console.log(JSON.stringify({ success: false, error: error.message }));
51
- process.exit(1);
52
- }
53
- spinner.fail(chalk.red('Failed to destroy environment'));
54
- console.log(chalk.red(`Error: ${error.message}`));
55
- process.exit(1);
52
+ spinner?.fail?.(chalk.red('Failed to destroy environment'));
53
+ const mapped = mapThrownError(error);
54
+ emitErr(params.json, {
55
+ ...mapped,
56
+ hint: 'Local state was not marked destroyed. Retry after resolving the error to avoid orphaned resources.',
57
+ }, () => {
58
+ console.log(chalk.red(`Error: ${mapped.error}`));
59
+ });
56
60
  }
57
61
  }
58
62
  //# sourceMappingURL=destroy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../../src/cli/commands/destroy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../../src/cli/commands/destroy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { StateStore } from "../../core/state-store.js";
2
+ interface DoctorOptions {
3
+ json?: boolean;
4
+ reap?: boolean;
5
+ }
6
+ export declare function doctor(store: StateStore, options?: DoctorOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAOvD,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAMD,wBAAsB,MAAM,CAC1B,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA+Hf"}