hatchkit 0.1.4 → 0.1.5

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 (63) hide show
  1. package/dist/adopt.d.ts +2 -0
  2. package/dist/adopt.d.ts.map +1 -0
  3. package/dist/adopt.js +552 -0
  4. package/dist/adopt.js.map +1 -0
  5. package/dist/completion.d.ts.map +1 -1
  6. package/dist/completion.js +3 -0
  7. package/dist/completion.js.map +1 -1
  8. package/dist/config.d.ts +30 -1
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +108 -0
  11. package/dist/config.js.map +1 -1
  12. package/dist/deploy/pages.js +50 -9
  13. package/dist/deploy/pages.js.map +1 -1
  14. package/dist/deploy/rename-domain.d.ts.map +1 -1
  15. package/dist/deploy/rename-domain.js +26 -6
  16. package/dist/deploy/rename-domain.js.map +1 -1
  17. package/dist/deploy/rollback.d.ts +10 -0
  18. package/dist/deploy/rollback.d.ts.map +1 -0
  19. package/dist/deploy/rollback.js +295 -0
  20. package/dist/deploy/rollback.js.map +1 -0
  21. package/dist/deploy/terraform.d.ts +10 -1
  22. package/dist/deploy/terraform.d.ts.map +1 -1
  23. package/dist/deploy/terraform.js +177 -42
  24. package/dist/deploy/terraform.js.map +1 -1
  25. package/dist/doctor.d.ts.map +1 -1
  26. package/dist/doctor.js +25 -0
  27. package/dist/doctor.js.map +1 -1
  28. package/dist/explain.d.ts.map +1 -1
  29. package/dist/explain.js +5 -0
  30. package/dist/explain.js.map +1 -1
  31. package/dist/index.js +356 -122
  32. package/dist/index.js.map +1 -1
  33. package/dist/prompts.d.ts.map +1 -1
  34. package/dist/prompts.js +283 -11
  35. package/dist/prompts.js.map +1 -1
  36. package/dist/provision/stripe.d.ts +19 -0
  37. package/dist/provision/stripe.d.ts.map +1 -0
  38. package/dist/provision/stripe.js +58 -0
  39. package/dist/provision/stripe.js.map +1 -0
  40. package/dist/scaffold/dotenvx.d.ts.map +1 -1
  41. package/dist/scaffold/dotenvx.js +35 -11
  42. package/dist/scaffold/dotenvx.js.map +1 -1
  43. package/dist/scaffold/infra.d.ts +21 -1
  44. package/dist/scaffold/infra.d.ts.map +1 -1
  45. package/dist/scaffold/infra.js +66 -20
  46. package/dist/scaffold/infra.js.map +1 -1
  47. package/dist/status.d.ts.map +1 -1
  48. package/dist/status.js +7 -0
  49. package/dist/status.js.map +1 -1
  50. package/dist/utils/coolify-api.d.ts +12 -0
  51. package/dist/utils/coolify-api.d.ts.map +1 -1
  52. package/dist/utils/coolify-api.js +33 -0
  53. package/dist/utils/coolify-api.js.map +1 -1
  54. package/dist/utils/run-ledger.d.ts +68 -0
  55. package/dist/utils/run-ledger.d.ts.map +1 -0
  56. package/dist/utils/run-ledger.js +99 -0
  57. package/dist/utils/run-ledger.js.map +1 -0
  58. package/dist/utils/secrets.d.ts +2 -0
  59. package/dist/utils/secrets.d.ts.map +1 -1
  60. package/dist/utils/secrets.js +2 -0
  61. package/dist/utils/secrets.js.map +1 -1
  62. package/package.json +2 -2
  63. package/scripts/release-prep.mjs +56 -98
@@ -0,0 +1,2 @@
1
+ export declare function runAdopt(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=adopt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt.d.ts","sourceRoot":"","sources":["../src/adopt.ts"],"names":[],"mappings":"AAqFA,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCzD"}
package/dist/adopt.js ADDED
@@ -0,0 +1,552 @@
1
+ /*
2
+ * `hatchkit adopt` — onboard an existing project into hatchkit.
3
+ *
4
+ * Inverse of `hatchkit create`: instead of generating a project from
5
+ * the starter, point hatchkit at a repo that already exists and bring
6
+ * it under management. The flow:
7
+ *
8
+ * 1. Detect — read package.json, sniff repo layout (packages/server,
9
+ * apps/server, root), check for dotenvx-encrypted .env.production
10
+ * and an existing .env.keys, look up a Coolify app by project
11
+ * name, infer features from package deps + env vars present.
12
+ * 2. Review — stepper UI mirroring `hatchkit setup` so the user can
13
+ * step back through each detected value before we touch anything.
14
+ * Same Separator-grouped layout, same ✓/· marks.
15
+ * 3. Execute —
16
+ * a. If .env.production isn't already dotenvx-encrypted, encrypt
17
+ * it (this generates packages/server/.env.keys with the
18
+ * private key).
19
+ * b. Read DOTENV_PRIVATE_KEY_PRODUCTION out of .env.keys and
20
+ * mirror it into the OS keychain (so `hatchkit keys push`
21
+ * works going forward).
22
+ * c. Write .hatchkit.json so the project is recognized by
23
+ * `update`, `add`, `keys`, etc.
24
+ * d. Optionally run the same observability/email provisioning
25
+ * that `hatchkit add` does (GlitchTip, OpenPanel, Resend),
26
+ * scoped to whichever surfaces (server/client/both) the user
27
+ * picked. DSN/clientId/keys land encrypted into the existing
28
+ * .env.production.
29
+ * e. Optionally push the dotenvx private key to Coolify so the
30
+ * deployed app can decrypt env at runtime.
31
+ *
32
+ * Adopt is intentionally idempotent on the parts that can be made so:
33
+ * a second run on the same dir notices the existing manifest and
34
+ * exits early with a "use `hatchkit update` instead" hint.
35
+ */
36
+ import { existsSync, readFileSync } from "node:fs";
37
+ import { join, relative } from "node:path";
38
+ import { Separator, checkbox, confirm, input, select } from "@inquirer/prompts";
39
+ import chalk from "chalk";
40
+ import { getCoolifyConfig } from "./config.js";
41
+ import { pushProjectKeyToCoolify } from "./deploy/keys.js";
42
+ import { runProvision } from "./provision/index.js";
43
+ import { MANIFEST_FILENAME, writeManifest } from "./scaffold/manifest.js";
44
+ import { CoolifyApi } from "./utils/coolify-api.js";
45
+ import { SECRET_KEYS, setSecret } from "./utils/secrets.js";
46
+ import { validateDomain, validateProjectName } from "./utils/validate.js";
47
+ import { getCliVersion } from "./utils/version.js";
48
+ export async function runAdopt(cwd) {
49
+ const state = await detectProject(cwd);
50
+ if (state.hasManifest) {
51
+ console.log(chalk.yellow(`\n ${MANIFEST_FILENAME} already exists in ${relativeTo(state.projectDir)}.`));
52
+ console.log(chalk.dim(" This project is already adopted. Use `hatchkit update` to add features, or\n" +
53
+ " `hatchkit add <project>` to (re-)provision per-project clients.\n"));
54
+ return;
55
+ }
56
+ console.log(chalk.bold("\n hatchkit adopt"));
57
+ printDetected(state);
58
+ // Initial plan — pre-filled from detection.
59
+ let plan = {
60
+ name: state.packageName ?? "",
61
+ domain: "",
62
+ features: state.features,
63
+ serverDir: state.serverDir ?? state.projectDir,
64
+ clientDir: state.clientDir,
65
+ services: ["glitchtip", "openpanel", "resend"],
66
+ pushKey: !!state.coolifyAppMatch,
67
+ };
68
+ plan = await reviewLoop(state, plan);
69
+ await executePlan(state, plan);
70
+ }
71
+ // ---------------------------------------------------------------------------
72
+ // Detection
73
+ // ---------------------------------------------------------------------------
74
+ async function detectProject(projectDir) {
75
+ const hasManifest = existsSync(join(projectDir, MANIFEST_FILENAME));
76
+ let packageName;
77
+ try {
78
+ const pkg = JSON.parse(readFileSync(join(projectDir, "package.json"), "utf-8"));
79
+ packageName = pkg.name?.replace(/^@[^/]+\//, ""); // strip scope
80
+ }
81
+ catch {
82
+ // No package.json at root — that's fine for a non-Node project.
83
+ }
84
+ // Walk a small set of common monorepo layouts.
85
+ const serverDir = firstExisting(projectDir, [
86
+ "packages/server",
87
+ "apps/server",
88
+ "apps/api",
89
+ "server",
90
+ ]);
91
+ const clientDir = firstExisting(projectDir, [
92
+ "packages/client",
93
+ "packages/web",
94
+ "apps/web",
95
+ "apps/client",
96
+ "client",
97
+ "web",
98
+ ]);
99
+ // Feature detection: cheap heuristics from package.json deps + env files.
100
+ const features = detectFeatures(projectDir, serverDir);
101
+ // dotenvx state. The encrypted file starts with a generated header
102
+ // + a DOTENV_PUBLIC_KEY_PRODUCTION line; .env.keys has the private
103
+ // key. Either being present means we're already in dotenvx land.
104
+ const prodEnvPath = serverDir
105
+ ? join(serverDir, ".env.production")
106
+ : join(projectDir, ".env.production");
107
+ const envKeysPath = serverDir
108
+ ? join(serverDir, ".env.keys")
109
+ : join(projectDir, ".env.keys");
110
+ let prodEnvIsEncrypted = false;
111
+ if (existsSync(prodEnvPath)) {
112
+ const head = readFileSync(prodEnvPath, "utf-8").slice(0, 2000);
113
+ prodEnvIsEncrypted = /DOTENV_PUBLIC_KEY_PRODUCTION/.test(head);
114
+ }
115
+ const hasEnvKeys = existsSync(envKeysPath);
116
+ // Coolify app match — best-effort, requires Coolify configured. If
117
+ // it isn't, leave it undefined; the user can still adopt without it.
118
+ let coolifyAppMatch;
119
+ try {
120
+ const cfg = await getCoolifyConfig();
121
+ if (cfg && packageName) {
122
+ const api = new CoolifyApi({ url: cfg.url, token: cfg.token });
123
+ const apps = await api.listApplications();
124
+ const wanted = [packageName, `${packageName}-web`, `${packageName}-server`];
125
+ const match = apps.find((a) => wanted.includes(a.name));
126
+ if (match)
127
+ coolifyAppMatch = { uuid: match.uuid, name: match.name };
128
+ }
129
+ }
130
+ catch {
131
+ // Best-effort only.
132
+ }
133
+ return {
134
+ projectDir,
135
+ packageName,
136
+ hasManifest,
137
+ serverDir,
138
+ clientDir,
139
+ features,
140
+ prodEnvIsEncrypted,
141
+ hasEnvKeys,
142
+ coolifyAppMatch,
143
+ };
144
+ }
145
+ function firstExisting(root, candidates) {
146
+ for (const c of candidates) {
147
+ const full = join(root, c);
148
+ if (existsSync(full))
149
+ return full;
150
+ }
151
+ return undefined;
152
+ }
153
+ function detectFeatures(projectDir, serverDir) {
154
+ const found = new Set();
155
+ // Look at root + server package.json deps.
156
+ const pkgJsonPaths = [
157
+ join(projectDir, "package.json"),
158
+ serverDir ? join(serverDir, "package.json") : undefined,
159
+ ].filter((p) => !!p);
160
+ for (const p of pkgJsonPaths) {
161
+ if (!existsSync(p))
162
+ continue;
163
+ let json;
164
+ try {
165
+ json = JSON.parse(readFileSync(p, "utf-8"));
166
+ }
167
+ catch {
168
+ continue;
169
+ }
170
+ const deps = { ...(json.dependencies ?? {}), ...(json.devDependencies ?? {}) };
171
+ if ("stripe" in deps || "@stripe/stripe-js" in deps)
172
+ found.add("stripe");
173
+ if ("socket.io" in deps || "ws" in deps)
174
+ found.add("websocket");
175
+ if ("@sentry/node" in deps || "@sentry/browser" in deps || "@openpanel/web" in deps) {
176
+ found.add("analytics");
177
+ }
178
+ if ("@aws-sdk/client-s3" in deps)
179
+ found.add("s3");
180
+ if ("electron" in deps || "electron-builder" in deps)
181
+ found.add("desktop");
182
+ if ("@capacitor/core" in deps)
183
+ found.add("mobile");
184
+ }
185
+ // .env.production / .env.example as a hint when package.json is sparse.
186
+ const envHints = [
187
+ serverDir ? join(serverDir, ".env.production") : undefined,
188
+ serverDir ? join(serverDir, ".env.example") : undefined,
189
+ join(projectDir, ".env.example"),
190
+ ].filter((p) => !!p);
191
+ for (const p of envHints) {
192
+ if (!existsSync(p))
193
+ continue;
194
+ const text = readFileSync(p, "utf-8");
195
+ if (/STRIPE_SECRET_KEY/.test(text))
196
+ found.add("stripe");
197
+ if (/REDIS_URL/.test(text))
198
+ found.add("websocket");
199
+ if (/GLITCHTIP_DSN|SENTRY_DSN|OPENPANEL_/.test(text))
200
+ found.add("analytics");
201
+ if (/S3_BUCKET|S3_ENDPOINT/.test(text))
202
+ found.add("s3");
203
+ }
204
+ return [...found];
205
+ }
206
+ function printDetected(state) {
207
+ const lines = [];
208
+ const row = (label, value) => ` ${chalk.dim(label.padEnd(18))} ${value}`;
209
+ lines.push(chalk.bold("\n Detected:\n"));
210
+ lines.push(row("project dir", chalk.cyan(relativeTo(state.projectDir))));
211
+ if (state.packageName)
212
+ lines.push(row("package.json", chalk.cyan(state.packageName)));
213
+ if (state.serverDir) {
214
+ lines.push(row("server dir", chalk.cyan(relativeTo(state.serverDir))));
215
+ }
216
+ else {
217
+ lines.push(row("server dir", chalk.dim("(not detected — falls back to project root)")));
218
+ }
219
+ if (state.clientDir) {
220
+ lines.push(row("client dir", chalk.cyan(relativeTo(state.clientDir))));
221
+ }
222
+ lines.push(row(".env.production", state.prodEnvIsEncrypted
223
+ ? chalk.green("dotenvx-encrypted ✓")
224
+ : state.serverDir && existsSync(join(state.serverDir, ".env.production"))
225
+ ? chalk.yellow("present, plain text — will encrypt")
226
+ : chalk.dim("not present")));
227
+ lines.push(row(".env.keys", state.hasEnvKeys ? chalk.green("present ✓") : chalk.dim("missing")));
228
+ lines.push(row("Coolify app", state.coolifyAppMatch
229
+ ? chalk.green(`${state.coolifyAppMatch.name} ✓`)
230
+ : chalk.dim("(no match — keys push will be skipped by default)")));
231
+ lines.push(row("features (guess)", state.features.length > 0 ? state.features.join(", ") : chalk.dim("none detected")));
232
+ for (const l of lines)
233
+ console.log(l);
234
+ console.log();
235
+ }
236
+ async function reviewLoop(state, initial) {
237
+ let plan = initial;
238
+ console.log(chalk.dim(" Step through each row to confirm or change. Choose 'Adopt' when ready.\n"));
239
+ for (;;) {
240
+ const groups = buildAdoptGroups(state, plan);
241
+ const allSteps = groups.flatMap((g) => g.steps);
242
+ const firstUnset = allSteps.find((s) => !s.set);
243
+ const defaultKey = firstUnset?.key ?? "__adopt__";
244
+ const choices = [];
245
+ for (const group of groups) {
246
+ choices.push(new Separator(chalk.bold(`── ${group.title} ──`)));
247
+ for (const step of group.steps) {
248
+ const mark = step.set ? chalk.green("✓") : chalk.dim("·");
249
+ choices.push({
250
+ name: `${mark} ${step.label.padEnd(18)}${chalk.dim(` — ${step.summary}`)}`,
251
+ value: step.key,
252
+ });
253
+ }
254
+ }
255
+ choices.push(new Separator(" "));
256
+ choices.push({
257
+ name: chalk.bold(chalk.green("✓ Adopt — apply changes")),
258
+ value: "__adopt__",
259
+ });
260
+ choices.push({ name: chalk.dim("✗ Cancel"), value: "__cancel__" });
261
+ const picked = await select({
262
+ message: "Next step:",
263
+ default: defaultKey,
264
+ pageSize: Math.min(30, choices.length),
265
+ choices,
266
+ });
267
+ if (picked === "__adopt__")
268
+ return plan;
269
+ if (picked === "__cancel__") {
270
+ console.log(chalk.dim("\n Cancelled. Nothing was changed.\n"));
271
+ throw new Error("Adopt cancelled by user");
272
+ }
273
+ plan = await editAdoptStep(state, plan, picked);
274
+ }
275
+ }
276
+ function buildAdoptGroups(state, plan) {
277
+ return [
278
+ {
279
+ title: "Project",
280
+ steps: [
281
+ { key: "name", label: "Project name", set: !!plan.name, summary: plan.name || "(unset)" },
282
+ {
283
+ key: "domain",
284
+ label: "Domain",
285
+ set: !!plan.domain,
286
+ summary: plan.domain
287
+ ? `${plan.domain} ${chalk.dim("→")} https://${plan.domain}/api`
288
+ : "(unset)",
289
+ },
290
+ ],
291
+ },
292
+ {
293
+ title: "Layout",
294
+ steps: [
295
+ {
296
+ key: "serverDir",
297
+ label: "Server env dir",
298
+ set: !!plan.serverDir,
299
+ summary: plan.serverDir ? relativeTo(plan.serverDir) : "(unset)",
300
+ },
301
+ {
302
+ key: "clientDir",
303
+ label: "Client env dir",
304
+ set: true, // optional — empty is fine
305
+ summary: plan.clientDir ? relativeTo(plan.clientDir) : chalk.dim("(none — server only)"),
306
+ },
307
+ ],
308
+ },
309
+ {
310
+ title: "Stack",
311
+ steps: [
312
+ {
313
+ key: "features",
314
+ label: "Features",
315
+ set: true,
316
+ summary: plan.features.length > 0 ? plan.features.join(", ") : chalk.dim("none"),
317
+ },
318
+ ],
319
+ },
320
+ {
321
+ title: "Provisioning",
322
+ steps: [
323
+ {
324
+ key: "services",
325
+ label: "Provision clients",
326
+ set: true,
327
+ summary: plan.services.length > 0 ? plan.services.join(", ") : chalk.dim("skip provisioning"),
328
+ },
329
+ {
330
+ key: "pushKey",
331
+ label: "Push key to Coolify",
332
+ set: true,
333
+ summary: plan.pushKey
334
+ ? state.coolifyAppMatch
335
+ ? `yes (${state.coolifyAppMatch.name})`
336
+ : "yes — Coolify app must exist by name"
337
+ : chalk.dim("no"),
338
+ },
339
+ ],
340
+ },
341
+ ];
342
+ }
343
+ async function editAdoptStep(state, plan, step) {
344
+ if (step === "name") {
345
+ const name = (await input({
346
+ message: "Project name (used for the Coolify app, manifest, keychain):",
347
+ default: plan.name || state.packageName,
348
+ validate: validateProjectName,
349
+ })).trim();
350
+ return { ...plan, name };
351
+ }
352
+ if (step === "domain") {
353
+ const domain = (await input({
354
+ message: "Domain (e.g. ai.trebeljahr.com):",
355
+ default: plan.domain,
356
+ validate: validateDomain,
357
+ })).trim();
358
+ return { ...plan, domain };
359
+ }
360
+ if (step === "serverDir") {
361
+ const picked = (await input({
362
+ message: "Server env directory (relative to project root):",
363
+ default: plan.serverDir ? relative(state.projectDir, plan.serverDir) || "." : ".",
364
+ validate: (v) => {
365
+ const abs = join(state.projectDir, v.trim());
366
+ return existsSync(abs) ? true : `No such directory: ${abs}`;
367
+ },
368
+ })).trim();
369
+ return { ...plan, serverDir: join(state.projectDir, picked) };
370
+ }
371
+ if (step === "clientDir") {
372
+ const useClient = await confirm({
373
+ message: "Does this project have a separate browser bundle?",
374
+ default: !!plan.clientDir,
375
+ });
376
+ if (!useClient)
377
+ return { ...plan, clientDir: undefined };
378
+ const picked = (await input({
379
+ message: "Client env directory (relative to project root):",
380
+ default: plan.clientDir
381
+ ? relative(state.projectDir, plan.clientDir) || "."
382
+ : "packages/client",
383
+ validate: (v) => {
384
+ const abs = join(state.projectDir, v.trim());
385
+ return existsSync(abs) ? true : `No such directory: ${abs}`;
386
+ },
387
+ })).trim();
388
+ return { ...plan, clientDir: join(state.projectDir, picked) };
389
+ }
390
+ if (step === "features") {
391
+ const features = await checkbox({
392
+ message: "Features active in this project:",
393
+ choices: [
394
+ { name: "websocket", value: "websocket", checked: plan.features.includes("websocket") },
395
+ { name: "stripe", value: "stripe", checked: plan.features.includes("stripe") },
396
+ { name: "analytics", value: "analytics", checked: plan.features.includes("analytics") },
397
+ { name: "s3", value: "s3", checked: plan.features.includes("s3") },
398
+ { name: "desktop", value: "desktop", checked: plan.features.includes("desktop") },
399
+ { name: "mobile", value: "mobile", checked: plan.features.includes("mobile") },
400
+ ],
401
+ });
402
+ return { ...plan, features };
403
+ }
404
+ if (step === "services") {
405
+ const services = await checkbox({
406
+ message: "Provision per-project clients now?",
407
+ choices: [
408
+ {
409
+ name: "GlitchTip (error tracking)",
410
+ value: "glitchtip",
411
+ checked: plan.services.includes("glitchtip") && plan.features.includes("analytics"),
412
+ },
413
+ {
414
+ name: "OpenPanel (analytics)",
415
+ value: "openpanel",
416
+ checked: plan.services.includes("openpanel") && plan.features.includes("analytics"),
417
+ },
418
+ {
419
+ name: "Resend (email)",
420
+ value: "resend",
421
+ checked: plan.services.includes("resend"),
422
+ },
423
+ ],
424
+ });
425
+ return { ...plan, services };
426
+ }
427
+ if (step === "pushKey") {
428
+ const pushKey = await confirm({
429
+ message: state.coolifyAppMatch
430
+ ? `Push dotenvx private key to Coolify (${state.coolifyAppMatch.name})?`
431
+ : "Push dotenvx private key to Coolify (app must exist by project name)?",
432
+ default: plan.pushKey,
433
+ });
434
+ return { ...plan, pushKey };
435
+ }
436
+ return plan;
437
+ }
438
+ // ---------------------------------------------------------------------------
439
+ // Execution
440
+ // ---------------------------------------------------------------------------
441
+ async function executePlan(state, plan) {
442
+ console.log(chalk.bold("\n ── Adopting ──────────────────────────────────────────────\n"));
443
+ // Step 1: dotenvx encryption + key import.
444
+ await encryptIfNeeded(state, plan);
445
+ await importKeyToKeychain(state, plan);
446
+ // Step 2: write the manifest. Done after key import so a partial
447
+ // failure doesn't leave a manifest pointing at no key. The
448
+ // manifest lives at the project ROOT (not under packages/server).
449
+ writeAdoptManifest(state.projectDir, plan);
450
+ console.log(chalk.green(` ✓ Wrote ${MANIFEST_FILENAME} at ${relativeTo(state.projectDir)}`));
451
+ // Step 3: provision clients via the existing `add` machinery so the
452
+ // surfaces stepper, idempotency, and env writes behave identically
453
+ // to a normal `hatchkit add`.
454
+ if (plan.services.length > 0) {
455
+ console.log();
456
+ await runProvision({
457
+ baseName: plan.name,
458
+ services: plan.services,
459
+ surfaces: {
460
+ mode: plan.clientDir ? "shared" : "server-only",
461
+ serverEnvDir: plan.serverDir,
462
+ clientEnvDir: plan.clientDir,
463
+ },
464
+ });
465
+ }
466
+ // Step 4: push key to Coolify.
467
+ if (plan.pushKey) {
468
+ try {
469
+ await pushProjectKeyToCoolify(plan.name);
470
+ console.log(chalk.green(`\n ✓ Pushed dotenvx key to Coolify`));
471
+ }
472
+ catch (err) {
473
+ console.log(chalk.yellow(`\n Couldn't push dotenvx key to Coolify: ${err.message}`));
474
+ console.log(chalk.dim(` Once the app exists, run: \`hatchkit keys push ${plan.name}\``));
475
+ }
476
+ }
477
+ console.log(chalk.bold("\n ── Adopted ───────────────────────────────────────────────\n"));
478
+ console.log(` Project: ${chalk.cyan(plan.name)}`);
479
+ console.log(` Domain: ${chalk.cyan(plan.domain)}`);
480
+ console.log(` Server: ${chalk.cyan(relativeTo(plan.serverDir))}`);
481
+ if (plan.clientDir)
482
+ console.log(` Client: ${chalk.cyan(relativeTo(plan.clientDir))}`);
483
+ console.log(` Manifest: ${chalk.dim(join(state.projectDir, MANIFEST_FILENAME))}`);
484
+ console.log(chalk.dim("\n Next: `hatchkit doctor` to verify providers, `hatchkit keys push` if you skipped that step.\n"));
485
+ }
486
+ async function encryptIfNeeded(state, plan) {
487
+ if (state.prodEnvIsEncrypted) {
488
+ console.log(chalk.dim(" · .env.production already encrypted — skipping encrypt step."));
489
+ return;
490
+ }
491
+ const prodPath = join(plan.serverDir, ".env.production");
492
+ if (!existsSync(prodPath)) {
493
+ console.log(chalk.dim(` · No .env.production at ${relativeTo(prodPath)} yet — provisioning will create + encrypt it.`));
494
+ return;
495
+ }
496
+ const ora = (await import("ora")).default;
497
+ const spinner = ora("Encrypting .env.production with dotenvx...").start();
498
+ try {
499
+ // Calling `dotenvx set` with a no-op key forces encryption of the
500
+ // existing file: it reads, encrypts, generates the keypair, and
501
+ // writes .env.keys. We use a sentinel that's a real string so it
502
+ // stays in the file (no harm, easy to grep + remove later).
503
+ const { set: dotenvxSet } = await import("@dotenvx/dotenvx");
504
+ dotenvxSet("HATCHKIT_ADOPTED", new Date().toISOString(), {
505
+ path: prodPath,
506
+ encrypt: true,
507
+ });
508
+ spinner.succeed("Encrypted .env.production");
509
+ }
510
+ catch (err) {
511
+ spinner.fail("Failed to encrypt .env.production");
512
+ throw err;
513
+ }
514
+ }
515
+ async function importKeyToKeychain(state, plan) {
516
+ const envKeysPath = join(plan.serverDir, ".env.keys");
517
+ if (!existsSync(envKeysPath)) {
518
+ console.log(chalk.yellow(` · No .env.keys at ${relativeTo(envKeysPath)} — nothing to import to keychain.`));
519
+ return;
520
+ }
521
+ const text = readFileSync(envKeysPath, "utf-8");
522
+ const m = text.match(/^DOTENV_PRIVATE_KEY_PRODUCTION="?([0-9a-fA-F]+)"?/m);
523
+ if (!m) {
524
+ console.log(chalk.yellow(` · ${relativeTo(envKeysPath)} doesn't contain DOTENV_PRIVATE_KEY_PRODUCTION — skipping import.`));
525
+ return;
526
+ }
527
+ await setSecret(SECRET_KEYS.dotenvxPrivateKey(plan.name), m[1]);
528
+ console.log(chalk.green(` ✓ Imported dotenvx private key into the OS keychain (service: hatchkit)`));
529
+ }
530
+ function writeAdoptManifest(projectDir, plan) {
531
+ // Unknown bits (ports, deployTarget specifics) get conservative
532
+ // defaults — adopt's role is to take inventory, not to make
533
+ // infra decisions. The user can edit the manifest later.
534
+ const manifest = {
535
+ version: 1,
536
+ cliVersion: getCliVersion(),
537
+ scaffoldedAt: new Date().toISOString(),
538
+ name: plan.name,
539
+ domain: plan.domain,
540
+ features: plan.features,
541
+ mlServices: [],
542
+ s3Provider: (() => (plan.features.includes("s3") ? "existing" : "none"))(),
543
+ deployTarget: "existing",
544
+ ports: { server: 3000, client: 3001 },
545
+ };
546
+ writeManifest(projectDir, manifest);
547
+ }
548
+ function relativeTo(p, from = process.cwd()) {
549
+ const rel = relative(from, p);
550
+ return rel === "" ? "." : rel.startsWith("..") ? p : `./${rel}`;
551
+ }
552
+ //# sourceMappingURL=adopt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt.js","sourceRoot":"","sources":["../src/adopt.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"AA2CA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAIvE"}
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"AA4CA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAIvE"}
@@ -14,6 +14,7 @@ const TOP_LEVEL = [
14
14
  "doctor",
15
15
  "explain",
16
16
  "create",
17
+ "adopt",
17
18
  "update",
18
19
  "add",
19
20
  "keys",
@@ -188,6 +189,8 @@ function topDesc(cmd) {
188
189
  return "One-page mental model of the CLI";
189
190
  case "create":
190
191
  return "Scaffold a new project";
192
+ case "adopt":
193
+ return "Adopt an existing project (run in project dir)";
191
194
  case "update":
192
195
  return "Add features to an already-scaffolded project";
193
196
  case "add":
@@ -1 +1 @@
1
- {"version":3,"file":"completion.js","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"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"}