hatchkit 0.1.2 → 0.1.3

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 (82) hide show
  1. package/dist/completion.d.ts +2 -0
  2. package/dist/completion.d.ts.map +1 -0
  3. package/dist/completion.js +207 -0
  4. package/dist/completion.js.map +1 -0
  5. package/dist/config.d.ts +33 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +439 -127
  8. package/dist/config.js.map +1 -1
  9. package/dist/deploy/keys.d.ts +6 -2
  10. package/dist/deploy/keys.d.ts.map +1 -1
  11. package/dist/deploy/keys.js +16 -2
  12. package/dist/deploy/keys.js.map +1 -1
  13. package/dist/deploy/pages.d.ts +2 -0
  14. package/dist/deploy/pages.d.ts.map +1 -0
  15. package/dist/deploy/pages.js +537 -0
  16. package/dist/deploy/pages.js.map +1 -0
  17. package/dist/deploy/rename-domain.d.ts +55 -0
  18. package/dist/deploy/rename-domain.d.ts.map +1 -0
  19. package/dist/deploy/rename-domain.js +290 -0
  20. package/dist/deploy/rename-domain.js.map +1 -0
  21. package/dist/deploy/terraform.d.ts.map +1 -1
  22. package/dist/deploy/terraform.js +90 -0
  23. package/dist/deploy/terraform.js.map +1 -1
  24. package/dist/dns.d.ts +7 -0
  25. package/dist/dns.d.ts.map +1 -0
  26. package/dist/dns.js +124 -0
  27. package/dist/dns.js.map +1 -0
  28. package/dist/doctor.d.ts +13 -0
  29. package/dist/doctor.d.ts.map +1 -0
  30. package/dist/doctor.js +368 -0
  31. package/dist/doctor.js.map +1 -0
  32. package/dist/explain.d.ts +4 -0
  33. package/dist/explain.d.ts.map +1 -0
  34. package/dist/explain.js +173 -0
  35. package/dist/explain.js.map +1 -0
  36. package/dist/index.js +477 -46
  37. package/dist/index.js.map +1 -1
  38. package/dist/provision/glitchtip.d.ts +3 -0
  39. package/dist/provision/glitchtip.d.ts.map +1 -1
  40. package/dist/provision/glitchtip.js +18 -0
  41. package/dist/provision/glitchtip.js.map +1 -1
  42. package/dist/provision/index.d.ts +26 -0
  43. package/dist/provision/index.d.ts.map +1 -1
  44. package/dist/provision/index.js +435 -60
  45. package/dist/provision/index.js.map +1 -1
  46. package/dist/provision/openpanel.d.ts +7 -0
  47. package/dist/provision/openpanel.d.ts.map +1 -1
  48. package/dist/provision/openpanel.js +113 -48
  49. package/dist/provision/openpanel.js.map +1 -1
  50. package/dist/provision/resend.d.ts +23 -1
  51. package/dist/provision/resend.d.ts.map +1 -1
  52. package/dist/provision/resend.js +62 -1
  53. package/dist/provision/resend.js.map +1 -1
  54. package/dist/provision/write-env.d.ts +31 -0
  55. package/dist/provision/write-env.d.ts.map +1 -0
  56. package/dist/provision/write-env.js +94 -0
  57. package/dist/provision/write-env.js.map +1 -0
  58. package/dist/scaffold/infra.d.ts.map +1 -1
  59. package/dist/scaffold/infra.js +18 -1
  60. package/dist/scaffold/infra.js.map +1 -1
  61. package/dist/status.d.ts +30 -0
  62. package/dist/status.d.ts.map +1 -0
  63. package/dist/status.js +169 -0
  64. package/dist/status.js.map +1 -0
  65. package/dist/templates/addons/analytics/sentry.ts.hbs +6 -0
  66. package/dist/utils/cloudflare-api.d.ts +30 -0
  67. package/dist/utils/cloudflare-api.d.ts.map +1 -0
  68. package/dist/utils/cloudflare-api.js +85 -0
  69. package/dist/utils/cloudflare-api.js.map +1 -0
  70. package/dist/utils/coolify-api.d.ts +3 -1
  71. package/dist/utils/coolify-api.d.ts.map +1 -1
  72. package/dist/utils/coolify-api.js +29 -4
  73. package/dist/utils/coolify-api.js.map +1 -1
  74. package/dist/utils/inwx-api.d.ts +36 -0
  75. package/dist/utils/inwx-api.d.ts.map +1 -0
  76. package/dist/utils/inwx-api.js +105 -0
  77. package/dist/utils/inwx-api.js.map +1 -0
  78. package/dist/utils/secrets.d.ts +8 -1
  79. package/dist/utils/secrets.d.ts.map +1 -1
  80. package/dist/utils/secrets.js +8 -1
  81. package/dist/utils/secrets.js.map +1 -1
  82. package/package.json +1 -1
@@ -1,80 +1,403 @@
1
1
  /*
2
- * Provision orchestrator — given a base name like "raptor-runner",
3
- * creates `-dev` and `-prod` clients in each selected service
4
- * (GlitchTip / OpenPanel / Resend) and prints an env block ready to
5
- * paste into an existing project.
2
+ * Provision orchestrator.
6
3
  *
7
- * Also persists the resulting env files under
8
- * ~/<conf-dir>/provisioned/<name>.{dev,prod}.env
9
- * so the output can be retrieved later without re-hitting the APIs.
4
+ * Model:
5
+ * · GlitchTip and OpenPanel are "observability" providers. Per
6
+ * product, one project handles all environments events are
7
+ * tagged with `environment: ...` on the SDK side, so dev/staging/
8
+ * prod share the same DSN/client credentials. This keeps the
9
+ * dashboards clean even as more envs get added.
10
+ * · Observability credentials are written to `.env.production`
11
+ * ONLY by default. Most teams don't want dev events polluting
12
+ * their real error / analytics metrics. Opt in via
13
+ * `--enable-dev-obs` when you need to debug the SDK wiring.
14
+ * · Resend is different: dev and prod keys are genuinely separated
15
+ * so a bug in dev can't email real users. We still mint two keys
16
+ * (`<name>-dev` / `<name>-prod`) and write them into the server's
17
+ * dev/prod env respectively.
18
+ * · Surfaces: a project can have a server, a client, or both. When
19
+ * both, the common case is a single shared GlitchTip/OpenPanel
20
+ * project (same DSN on both SDKs, each tagged automatically by
21
+ * `sdk.name`). Strict-isolation setups can opt into two projects
22
+ * via `Surfaces.mode = "separate"`.
23
+ *
24
+ * A 0600-permission cache copy of every written env is kept under
25
+ * ~/<conf-dir>/provisioned/ for recoverability. Secret values never
26
+ * touch stdout.
10
27
  */
11
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
12
- import { dirname, join } from "node:path";
13
- import { select } from "@inquirer/prompts";
28
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
29
+ import { dirname, join, relative, resolve } from "node:path";
30
+ import { confirm, input, select } from "@inquirer/prompts";
14
31
  import chalk from "chalk";
15
- import { getConfigPath } from "../config.js";
32
+ import { ensureGlitchtip, ensureOpenpanel, ensureResend, getConfigPath } from "../config.js";
16
33
  import { validateProjectName } from "../utils/validate.js";
17
- import { provisionGlitchtipClient } from "./glitchtip.js";
18
- import { provisionOpenpanelClient } from "./openpanel.js";
19
- import { listResendDomains, provisionResendClient } from "./resend.js";
34
+ import { deleteGlitchtipClient, provisionGlitchtipClient, } from "./glitchtip.js";
35
+ import { deleteOpenpanelClient, provisionOpenpanelClient, } from "./openpanel.js";
36
+ import { createResendDomain, deleteResendClient, listResendDomains, normalizeDomainInput, provisionResendClient, } from "./resend.js";
37
+ import { parseEnvLines, writeDevEnv, writeProdEnv } from "./write-env.js";
20
38
  export async function runProvision(opts) {
21
39
  const nameCheck = validateProjectName(opts.baseName);
22
40
  if (nameCheck !== true)
23
41
  throw new Error(`Invalid base name: ${nameCheck}`);
42
+ // Ensure every selected provider is configured *before* any spinner
43
+ // starts. Otherwise a lazy `ensure*` prompt fires underneath the ora
44
+ // spinner and inquirer waits forever for invisible input.
45
+ if (opts.services.includes("glitchtip"))
46
+ await ensureGlitchtip();
47
+ if (opts.services.includes("openpanel"))
48
+ await ensureOpenpanel();
49
+ if (opts.services.includes("resend"))
50
+ await ensureResend();
51
+ const surfaces = await resolveSurfaces(opts);
52
+ const enableDevObs = opts.enableDevObs ?? false;
24
53
  // Resend domain: pick once, reused across dev + prod.
25
54
  let resendDomainId = opts.resendDomainId;
26
55
  if (opts.services.includes("resend") && !resendDomainId) {
27
- const domains = await listResendDomains();
28
- const verified = domains.filter((d) => d.status === "verified");
29
- if (verified.length === 0) {
30
- console.log(chalk.yellow(" No verified Resend domains found — API keys will be created without a domain restriction (account-wide)."));
56
+ resendDomainId = await pickResendDomain();
57
+ }
58
+ const buckets = initBuckets(surfaces);
59
+ console.log(chalk.bold(`\n ── Provisioning ${opts.baseName} ──────────────────────────\n`));
60
+ // ── GlitchTip ──
61
+ if (opts.services.includes("glitchtip")) {
62
+ if (surfaces?.mode === "separate") {
63
+ for (const side of ["server", "client"]) {
64
+ const projectName = `${opts.baseName}-${side}`;
65
+ const res = await withSpinner(`GlitchTip: creating project ${projectName}`, () => provisionGlitchtipClient(projectName));
66
+ pushObsLines(buckets, side, renderGlitchtipEnv(res, side === "client"), enableDevObs);
67
+ }
68
+ }
69
+ else {
70
+ const projectName = opts.baseName;
71
+ const res = await withSpinner(`GlitchTip: creating project ${projectName}`, () => provisionGlitchtipClient(projectName));
72
+ // Shared-DSN case: the server SDK reads GLITCHTIP_DSN; the client
73
+ // SDK reads GLITCHTIP_DSN_CLIENT (same value). Both SDKs tag
74
+ // events with `sdk.name`, so filtering by surface in the UI is
75
+ // automatic.
76
+ if (surfaces && (surfaces.mode === "shared" || surfaces.mode === "server-only")) {
77
+ pushObsLines(buckets, "server", renderGlitchtipEnv(res, false), enableDevObs);
78
+ }
79
+ if (surfaces && (surfaces.mode === "shared" || surfaces.mode === "client-only")) {
80
+ pushObsLines(buckets, "client", renderGlitchtipEnv(res, true), enableDevObs);
81
+ }
82
+ }
83
+ }
84
+ // ── OpenPanel ──
85
+ if (opts.services.includes("openpanel")) {
86
+ if (surfaces?.mode === "separate") {
87
+ for (const side of ["server", "client"]) {
88
+ const projectName = `${opts.baseName}-${side}`;
89
+ const res = await withSpinner(`OpenPanel: creating project ${projectName}`, () => provisionOpenpanelClient(projectName));
90
+ pushObsLines(buckets, side, renderOpenpanelEnv(res, side === "client"), enableDevObs);
91
+ }
92
+ }
93
+ else {
94
+ const projectName = opts.baseName;
95
+ const res = await withSpinner(`OpenPanel: creating project ${projectName}`, () => provisionOpenpanelClient(projectName));
96
+ if (surfaces && (surfaces.mode === "shared" || surfaces.mode === "server-only")) {
97
+ pushObsLines(buckets, "server", renderOpenpanelEnv(res, false), enableDevObs);
98
+ }
99
+ if (surfaces && (surfaces.mode === "shared" || surfaces.mode === "client-only")) {
100
+ pushObsLines(buckets, "client", renderOpenpanelEnv(res, true), enableDevObs);
101
+ }
102
+ }
103
+ }
104
+ // ── Resend ── (always server-side; dev/prod keys are not observability)
105
+ if (opts.services.includes("resend")) {
106
+ const serverBucket = buckets.find((b) => b.label === "server");
107
+ if (!serverBucket) {
108
+ console.log(chalk.yellow(` Skipping Resend — this project has no server surface, so there's nowhere to put RESEND_API_KEY.`));
31
109
  }
32
110
  else {
33
- const picked = await select({
34
- message: "Resend sending domain (both keys will be scoped to it):",
35
- choices: [
36
- ...verified.map((d) => ({ name: d.name, value: d.id })),
37
- { name: "— no domain restriction (account-wide) —", value: "" },
38
- ],
39
- });
40
- if (picked)
41
- resendDomainId = picked;
42
- }
43
- }
44
- const sections = [];
45
- for (const env of ["dev", "prod"]) {
46
- const clientName = `${opts.baseName}-${env}`;
47
- console.log(chalk.bold(`\n ── ${clientName} ──────────────────────────────────────────\n`));
48
- const lines = [];
49
- if (opts.services.includes("glitchtip")) {
50
- const res = await withSpinner(`GlitchTip: creating project ${clientName}`, () => provisionGlitchtipClient(clientName));
51
- lines.push(...renderGlitchtipEnv(res));
52
- }
53
- if (opts.services.includes("openpanel")) {
54
- const res = await withSpinner(`OpenPanel: creating client ${clientName}`, () => provisionOpenpanelClient(clientName));
55
- lines.push(...renderOpenpanelEnv(res));
56
- }
57
- if (opts.services.includes("resend")) {
58
- const res = await withSpinner(`Resend: creating restricted API key ${clientName}`, () => provisionResendClient(clientName, resendDomainId));
59
- lines.push(...renderResendEnv(res));
60
- }
61
- sections.push({ env, lines });
111
+ const devRes = await withSpinner(`Resend: creating restricted API key ${opts.baseName}-dev`, () => provisionResendClient(`${opts.baseName}-dev`, resendDomainId));
112
+ const prodRes = await withSpinner(`Resend: creating restricted API key ${opts.baseName}-prod`, () => provisionResendClient(`${opts.baseName}-prod`, resendDomainId));
113
+ // Resend is the one case where dev gets its OWN value, not the
114
+ // prod value dev keys are audience-restricted so they can't
115
+ // email real users.
116
+ serverBucket.devLines.push(...renderResendEnv(devRes));
117
+ serverBucket.prodLines.push(...renderResendEnv(prodRes));
118
+ }
62
119
  }
120
+ // Persist 0600 cache copies keyed by surface label.
63
121
  const outDir = join(dirname(getConfigPath()), "provisioned");
64
122
  if (!existsSync(outDir))
65
123
  mkdirSync(outDir, { recursive: true });
66
- console.log(chalk.bold("\n ── Env blocks (copy-paste into the corresponding project) ─\n"));
67
- for (const section of sections) {
68
- const banner = `# --- ${opts.baseName} / ${section.env} ---`;
69
- console.log(chalk.cyan(banner));
70
- for (const line of section.lines)
71
- console.log(line);
72
- console.log();
73
- const path = join(outDir, `${opts.baseName}.${section.env}.env`);
74
- writeFileSync(path, `${banner}\n${section.lines.join("\n")}\n`, "utf-8");
75
- console.log(chalk.dim(` saved: ${path}`));
124
+ for (const b of buckets) {
125
+ for (const phase of ["dev", "prod"]) {
126
+ const lines = phase === "dev" ? b.devLines : b.prodLines;
127
+ if (lines.length === 0)
128
+ continue;
129
+ const path = join(outDir, `${opts.baseName}.${b.label}.${phase}.env`);
130
+ const banner = `# --- ${opts.baseName} / ${b.label} / ${phase} ---`;
131
+ writeFileSync(path, `${banner}\n${lines.join("\n")}\n`, { mode: 0o600 });
132
+ }
133
+ }
134
+ // Cache-only mode (surfaces === false or user said no to write):
135
+ // summarize + point at cache files.
136
+ if (surfaces === null) {
137
+ console.log(chalk.bold("\n ── Provisioned ────────────────────────────────────────────\n"));
138
+ for (const b of buckets) {
139
+ const prodKeys = parseEnvLines(b.prodLines).map((p) => p.key);
140
+ const devKeys = parseEnvLines(b.devLines).map((p) => p.key);
141
+ if (prodKeys.length > 0 || devKeys.length > 0) {
142
+ console.log(` ${chalk.bold(b.label)}:`);
143
+ if (prodKeys.length > 0) {
144
+ console.log(` prod: ${chalk.green(`${prodKeys.length} vars`)} ${chalk.dim(prodKeys.join(", "))}`);
145
+ }
146
+ if (devKeys.length > 0) {
147
+ console.log(` dev: ${chalk.green(`${devKeys.length} vars`)} ${chalk.dim(devKeys.join(", "))}`);
148
+ }
149
+ }
150
+ }
151
+ console.log(chalk.yellow(`\n Values cached at ${outDir}/${opts.baseName}.*.env (mode 0600).\n` +
152
+ ` Read them with \`cat\` or re-run with a project directory to write directly.\n`));
153
+ return;
154
+ }
155
+ // Write values into the resolved directories.
156
+ console.log(chalk.bold("\n ── Writing env into the project ──────────────────────────\n"));
157
+ for (const b of buckets) {
158
+ const prodPairs = parseEnvLines(b.prodLines);
159
+ const devPairs = parseEnvLines(b.devLines);
160
+ if (prodPairs.length === 0 && devPairs.length === 0)
161
+ continue;
162
+ const relLabel = chalk.dim(`${b.label} → ${relativeTo(b.envDir)}`);
163
+ console.log(` ${chalk.bold(b.label)} ${relLabel}`);
164
+ if (prodPairs.length > 0) {
165
+ const prodPath = join(b.envDir, ".env.production");
166
+ const keys = writeProdEnv(prodPath, prodPairs);
167
+ console.log(` ${chalk.green("✓")} .env.production (encrypted) ${chalk.dim(keys.join(", "))}`);
168
+ }
169
+ if (devPairs.length > 0) {
170
+ const devPath = join(b.envDir, ".env.development");
171
+ const keys = writeDevEnv(devPath, devPairs);
172
+ console.log(` ${chalk.green("✓")} .env.development ${chalk.dim("(plaintext, gitignored)")} ${chalk.dim(keys.join(", "))}`);
173
+ }
76
174
  }
77
175
  console.log();
176
+ if (!enableDevObs &&
177
+ (opts.services.includes("glitchtip") || opts.services.includes("openpanel"))) {
178
+ console.log(chalk.dim(" Note: observability (GlitchTip/OpenPanel) values went to prod only.\n" +
179
+ " Dev errors/events would pollute real metrics — pass --enable-dev-obs to\n" +
180
+ " also populate .env.development when you need to debug SDK wiring."));
181
+ }
182
+ console.log(chalk.dim(`\n Cached copies (0600): ${outDir}/${opts.baseName}.*.env\n`));
183
+ }
184
+ // ---------------------------------------------------------------------------
185
+ // Surface resolution
186
+ // ---------------------------------------------------------------------------
187
+ /** Resolve the Surfaces config. Returns the concrete surfaces on
188
+ * success, or `null` when the user opted out of writing (cache-only
189
+ * mode). */
190
+ async function resolveSurfaces(opts) {
191
+ if (opts.surfaces === false)
192
+ return null;
193
+ if (opts.surfaces)
194
+ return opts.surfaces;
195
+ // Step 1 — project dir. Default to `./<baseName>` if it exists.
196
+ const guess = resolve(opts.baseName);
197
+ const guessExists = existsSync(guess);
198
+ const wantWrite = await confirm({
199
+ message: guessExists
200
+ ? `Write values into ${chalk.cyan(relativeTo(guess))} (prod → encrypted .env.production)?`
201
+ : `Write values into a project directory?`,
202
+ default: true,
203
+ });
204
+ if (!wantWrite)
205
+ return null;
206
+ const projectDir = resolve((await input({
207
+ message: "Project directory (relative to cwd):",
208
+ default: guessExists ? relativeTo(guess) : `./${opts.baseName}`,
209
+ validate: (v) => {
210
+ const abs = resolve(v.trim());
211
+ return existsSync(abs) ? true : `No such directory: ${abs}`;
212
+ },
213
+ })).trim());
214
+ // Step 2 — surfaces.
215
+ const mode = (await select({
216
+ message: "What surfaces does this project have?",
217
+ choices: [
218
+ {
219
+ name: "Server + client — shared observability project (recommended)",
220
+ value: "shared",
221
+ },
222
+ { name: "Server only", value: "server-only" },
223
+ { name: "Client only", value: "client-only" },
224
+ {
225
+ name: "Server + client — separate projects per surface (strict isolation)",
226
+ value: "separate",
227
+ },
228
+ ],
229
+ default: "shared",
230
+ }));
231
+ // Step 3 — env dirs per surface. Auto-detect common monorepo layouts
232
+ // (packages/server, apps/web, etc.) and offer the first match as the
233
+ // default.
234
+ const surfaces = { mode };
235
+ if (mode === "server-only" || mode === "shared" || mode === "separate") {
236
+ const def = detectSurfaceDir(projectDir, [
237
+ "packages/server",
238
+ "apps/server",
239
+ "apps/api",
240
+ "server",
241
+ "", // project root fallback
242
+ ]);
243
+ surfaces.serverEnvDir = resolve(projectDir, (await input({
244
+ message: "Server env directory (relative to project root):",
245
+ default: def,
246
+ validate: (v) => {
247
+ const abs = resolve(projectDir, v.trim());
248
+ return existsSync(abs) ? true : `No such directory: ${abs}`;
249
+ },
250
+ })).trim());
251
+ }
252
+ if (mode === "client-only" || mode === "shared" || mode === "separate") {
253
+ const def = detectSurfaceDir(projectDir, [
254
+ "packages/client",
255
+ "packages/web",
256
+ "apps/web",
257
+ "apps/client",
258
+ "client",
259
+ "web",
260
+ "", // project root fallback
261
+ ]);
262
+ surfaces.clientEnvDir = resolve(projectDir, (await input({
263
+ message: "Client env directory (relative to project root):",
264
+ default: def,
265
+ validate: (v) => {
266
+ const abs = resolve(projectDir, v.trim());
267
+ return existsSync(abs) ? true : `No such directory: ${abs}`;
268
+ },
269
+ })).trim());
270
+ }
271
+ return surfaces;
272
+ }
273
+ function detectSurfaceDir(projectDir, candidates) {
274
+ for (const c of candidates) {
275
+ if (existsSync(join(projectDir, c)))
276
+ return c || ".";
277
+ }
278
+ return ".";
279
+ }
280
+ function relativeTo(p, from = process.cwd()) {
281
+ const rel = relative(from, p);
282
+ return rel === "" ? "." : rel.startsWith("..") ? p : `./${rel}`;
283
+ }
284
+ function initBuckets(surfaces) {
285
+ if (!surfaces) {
286
+ // Cache-only: still separate by surface label for readable output.
287
+ return [
288
+ { label: "server", envDir: "", prodLines: [], devLines: [] },
289
+ { label: "client", envDir: "", prodLines: [], devLines: [] },
290
+ ];
291
+ }
292
+ const out = [];
293
+ if (surfaces.serverEnvDir) {
294
+ out.push({ label: "server", envDir: surfaces.serverEnvDir, prodLines: [], devLines: [] });
295
+ }
296
+ if (surfaces.clientEnvDir) {
297
+ out.push({ label: "client", envDir: surfaces.clientEnvDir, prodLines: [], devLines: [] });
298
+ }
299
+ return out;
300
+ }
301
+ /** Append observability env lines to the right bucket(s). In default
302
+ * mode these go to prod only; `enableDevObs` mirrors them into dev
303
+ * too for wiring debugging. */
304
+ function pushObsLines(buckets, side, lines, enableDevObs) {
305
+ const bucket = buckets.find((b) => b.label === side);
306
+ if (!bucket)
307
+ return;
308
+ bucket.prodLines.push(...lines);
309
+ if (enableDevObs)
310
+ bucket.devLines.push(...lines);
311
+ }
312
+ export async function runUnprovision(opts) {
313
+ const nameCheck = validateProjectName(opts.baseName);
314
+ if (nameCheck !== true)
315
+ throw new Error(`Invalid base name: ${nameCheck}`);
316
+ // Configure providers before any spinner — same reasoning as runProvision.
317
+ if (opts.services.includes("glitchtip"))
318
+ await ensureGlitchtip();
319
+ if (opts.services.includes("openpanel"))
320
+ await ensureOpenpanel();
321
+ if (opts.services.includes("resend"))
322
+ await ensureResend();
323
+ if (opts.dryRun) {
324
+ console.log(chalk.yellow("\n [dry-run] No clients will be deleted.\n"));
325
+ }
326
+ console.log(chalk.bold(`\n ── Deleting ${opts.baseName} ─────────────────────────────\n`));
327
+ // Observability: try the shared name first, then the -server/-client
328
+ // split variants. Each `runDelete` quietly reports "already gone" on
329
+ // a 404, so best-effort teardown covers both layouts.
330
+ if (opts.services.includes("glitchtip")) {
331
+ for (const name of observabilityNames(opts.baseName)) {
332
+ await runDelete(`GlitchTip: deleting project ${name}`, opts.dryRun, () => deleteGlitchtipClient(name));
333
+ }
334
+ }
335
+ if (opts.services.includes("openpanel")) {
336
+ for (const name of observabilityNames(opts.baseName)) {
337
+ await runDelete(`OpenPanel: deleting project ${name}`, opts.dryRun, () => deleteOpenpanelClient(name));
338
+ }
339
+ }
340
+ // Resend keeps the -dev/-prod pair.
341
+ if (opts.services.includes("resend")) {
342
+ for (const env of ["dev", "prod"]) {
343
+ const name = `${opts.baseName}-${env}`;
344
+ await runDelete(`Resend: deleting API key ${name}`, opts.dryRun, () => deleteResendClient(name));
345
+ }
346
+ }
347
+ // Clean up the local .env cache. Mirror runProvision's write locations.
348
+ const outDir = join(dirname(getConfigPath()), "provisioned");
349
+ const cachedPaths = [
350
+ `${opts.baseName}.server.dev.env`,
351
+ `${opts.baseName}.server.prod.env`,
352
+ `${opts.baseName}.client.dev.env`,
353
+ `${opts.baseName}.client.prod.env`,
354
+ // Legacy pre-surfaces layout — clean up so re-runs don't leave junk.
355
+ `${opts.baseName}.dev.env`,
356
+ `${opts.baseName}.prod.env`,
357
+ ];
358
+ for (const name of cachedPaths) {
359
+ const path = join(outDir, name);
360
+ if (!existsSync(path))
361
+ continue;
362
+ if (opts.dryRun) {
363
+ console.log(chalk.dim(` would remove ${path}`));
364
+ continue;
365
+ }
366
+ rmSync(path);
367
+ console.log(chalk.dim(` ✓ removed ${path}`));
368
+ }
369
+ console.log();
370
+ }
371
+ /** Candidate project names for observability teardown. Covers the
372
+ * shared (single-project) and split (server/client) layouts so a
373
+ * single `hatchkit remove` cleans up either. */
374
+ function observabilityNames(baseName) {
375
+ return [baseName, `${baseName}-server`, `${baseName}-client`];
376
+ }
377
+ /** Run a delete via spinner, mapping "not-found" to a dim "already gone"
378
+ * so re-runs stay quiet. */
379
+ async function runDelete(label, dryRun, fn) {
380
+ if (dryRun) {
381
+ console.log(chalk.dim(` would ${label.toLowerCase()}`));
382
+ return;
383
+ }
384
+ const ora = (await import("ora")).default;
385
+ const spinner = ora(label).start();
386
+ try {
387
+ const result = await fn();
388
+ if (result === "deleted") {
389
+ spinner.succeed(label);
390
+ }
391
+ else {
392
+ spinner.info(`${label} — already gone`);
393
+ }
394
+ }
395
+ catch (err) {
396
+ spinner.fail(label);
397
+ // Don't throw on one failure — a single service being flaky shouldn't
398
+ // block the rest of the teardown.
399
+ console.log(chalk.red(` ${err.message}`));
400
+ }
78
401
  }
79
402
  // ---------------------------------------------------------------------------
80
403
  // Helpers
@@ -92,10 +415,62 @@ async function withSpinner(label, fn) {
92
415
  throw err;
93
416
  }
94
417
  }
95
- function renderGlitchtipEnv(c) {
96
- return [`GLITCHTIP_DSN=${c.dsn}`];
418
+ async function pickResendDomain() {
419
+ const domains = await listResendDomains();
420
+ const sorted = [...domains].sort((a, b) => {
421
+ const av = a.status === "verified" ? 0 : 1;
422
+ const bv = b.status === "verified" ? 0 : 1;
423
+ return av - bv || a.name.localeCompare(b.name);
424
+ });
425
+ const ADD_NEW = "__add_new__";
426
+ const NONE = "";
427
+ const choices = [
428
+ ...sorted.map((d) => ({
429
+ name: d.status === "verified" ? d.name : `${d.name} ${chalk.dim(`(${d.status})`)}`,
430
+ value: d.id,
431
+ })),
432
+ { name: chalk.cyan("+ Add a new sending domain…"), value: ADD_NEW },
433
+ { name: "— no domain restriction (account-wide) —", value: NONE },
434
+ ];
435
+ const picked = await select({
436
+ message: "Resend sending domain (both keys will be scoped to it):",
437
+ choices,
438
+ });
439
+ if (picked === NONE)
440
+ return undefined;
441
+ if (picked !== ADD_NEW)
442
+ return picked;
443
+ // Add-new flow.
444
+ const raw = await input({
445
+ message: "New sending domain (bare domain — e.g. playtiao.com or mail.playtiao.com):",
446
+ validate: (v) => {
447
+ const n = normalizeDomainInput(v);
448
+ if (!n)
449
+ return "Enter a domain.";
450
+ if (!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/.test(n)) {
451
+ return "That doesn't look like a valid domain.";
452
+ }
453
+ return true;
454
+ },
455
+ });
456
+ const name = normalizeDomainInput(raw);
457
+ const created = await withSpinner(`Resend: creating domain ${name}`, () => createResendDomain(name));
458
+ console.log(chalk.yellow(` ${created.name} created (status: ${created.status}). Add the DNS records in the Resend dashboard before sending — https://resend.com/domains/${created.id}`));
459
+ return created.id;
460
+ }
461
+ /** Server env uses the plain names; browser env uses a `PUBLIC_`
462
+ * prefix (Vite / Astro / SvelteKit / Remix convention — bundlers
463
+ * typically only expose variables with this kind of prefix to
464
+ * browser code). The client SDK doesn't need OPENPANEL_CLIENT_SECRET
465
+ * — browser events are anonymous — so we omit it from the client
466
+ * bundle. */
467
+ function renderGlitchtipEnv(c, forClient) {
468
+ return [`${forClient ? "PUBLIC_GLITCHTIP_DSN" : "GLITCHTIP_DSN"}=${c.dsn}`];
97
469
  }
98
- function renderOpenpanelEnv(c) {
470
+ function renderOpenpanelEnv(c, forClient) {
471
+ if (forClient) {
472
+ return [`PUBLIC_OPENPANEL_API_URL=${c.apiUrl}`, `PUBLIC_OPENPANEL_CLIENT_ID=${c.clientId}`];
473
+ }
99
474
  return [
100
475
  `OPENPANEL_API_URL=${c.apiUrl}`,
101
476
  `OPENPANEL_CLIENT_ID=${c.clientId}`,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provision/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provision/index.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,11 @@ export interface OpenpanelClient {
5
5
  apiUrl: string;
6
6
  }
7
7
  export declare function provisionOpenpanelClient(clientName: string): Promise<OpenpanelClient>;
8
+ export type DeleteResult = "deleted" | "not-found";
9
+ /**
10
+ * Delete an OpenPanel project created by `provisionOpenpanelClient`.
11
+ * Also wipes the cached id + secret from the keychain so a future
12
+ * provision round won't hand back stale creds.
13
+ */
14
+ export declare function deleteOpenpanelClient(clientName: string): Promise<DeleteResult>;
8
15
  //# sourceMappingURL=openpanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openpanel.d.ts","sourceRoot":"","sources":["../../src/provision/openpanel.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA2D3F"}
1
+ {"version":3,"file":"openpanel.d.ts","sourceRoot":"","sources":["../../src/provision/openpanel.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAqBD,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA+E3F;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,CAAC;AAEnD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoCrF"}