hatchkit 0.1.3 → 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.
- package/dist/adopt.d.ts +2 -0
- package/dist/adopt.d.ts.map +1 -0
- package/dist/adopt.js +552 -0
- package/dist/adopt.js.map +1 -0
- package/dist/completion.d.ts.map +1 -1
- package/dist/completion.js +3 -0
- package/dist/completion.js.map +1 -1
- package/dist/config.d.ts +30 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +108 -0
- package/dist/config.js.map +1 -1
- package/dist/deploy/coolify-mongo.d.ts +12 -0
- package/dist/deploy/coolify-mongo.d.ts.map +1 -0
- package/dist/deploy/coolify-mongo.js +109 -0
- package/dist/deploy/coolify-mongo.js.map +1 -0
- package/dist/deploy/gpu.d.ts +9 -2
- package/dist/deploy/gpu.d.ts.map +1 -1
- package/dist/deploy/gpu.js +63 -39
- package/dist/deploy/gpu.js.map +1 -1
- package/dist/deploy/pages.js +50 -9
- package/dist/deploy/pages.js.map +1 -1
- package/dist/deploy/rename-domain.d.ts.map +1 -1
- package/dist/deploy/rename-domain.js +26 -6
- package/dist/deploy/rename-domain.js.map +1 -1
- package/dist/deploy/rollback.d.ts +10 -0
- package/dist/deploy/rollback.d.ts.map +1 -0
- package/dist/deploy/rollback.js +295 -0
- package/dist/deploy/rollback.js.map +1 -0
- package/dist/deploy/terraform.d.ts +10 -1
- package/dist/deploy/terraform.d.ts.map +1 -1
- package/dist/deploy/terraform.js +177 -42
- package/dist/deploy/terraform.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +25 -0
- package/dist/doctor.js.map +1 -1
- package/dist/explain.d.ts.map +1 -1
- package/dist/explain.js +5 -0
- package/dist/explain.js.map +1 -1
- package/dist/index.js +351 -88
- package/dist/index.js.map +1 -1
- package/dist/prompts.d.ts +15 -2
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +334 -17
- package/dist/prompts.js.map +1 -1
- package/dist/provision/stripe.d.ts +19 -0
- package/dist/provision/stripe.d.ts.map +1 -0
- package/dist/provision/stripe.js +58 -0
- package/dist/provision/stripe.js.map +1 -0
- package/dist/scaffold/app.js +8 -0
- package/dist/scaffold/app.js.map +1 -1
- package/dist/scaffold/dotenvx.d.ts.map +1 -1
- package/dist/scaffold/dotenvx.js +41 -10
- package/dist/scaffold/dotenvx.js.map +1 -1
- package/dist/scaffold/infra.d.ts +21 -1
- package/dist/scaffold/infra.d.ts.map +1 -1
- package/dist/scaffold/infra.js +66 -20
- package/dist/scaffold/infra.js.map +1 -1
- package/dist/scaffold/manifest.d.ts +4 -2
- package/dist/scaffold/manifest.d.ts.map +1 -1
- package/dist/scaffold/manifest.js +1 -1
- package/dist/scaffold/manifest.js.map +1 -1
- package/dist/scaffold/ml-client.d.ts +9 -2
- package/dist/scaffold/ml-client.d.ts.map +1 -1
- package/dist/scaffold/ml-client.js +11 -1
- package/dist/scaffold/ml-client.js.map +1 -1
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +7 -0
- package/dist/status.js.map +1 -1
- package/dist/templates/base/env.example.hbs +10 -0
- package/dist/templates/base/src/config.ts.hbs +24 -4
- package/dist/utils/coolify-api.d.ts +56 -0
- package/dist/utils/coolify-api.d.ts.map +1 -1
- package/dist/utils/coolify-api.js +79 -0
- package/dist/utils/coolify-api.js.map +1 -1
- package/dist/utils/flags.d.ts.map +1 -1
- package/dist/utils/flags.js +4 -0
- package/dist/utils/flags.js.map +1 -1
- package/dist/utils/run-ledger.d.ts +68 -0
- package/dist/utils/run-ledger.d.ts.map +1 -0
- package/dist/utils/run-ledger.js +99 -0
- package/dist/utils/run-ledger.js.map +1 -0
- package/dist/utils/secrets.d.ts +2 -0
- package/dist/utils/secrets.d.ts.map +1 -1
- package/dist/utils/secrets.js +2 -0
- package/dist/utils/secrets.js.map +1 -1
- package/package.json +6 -5
- package/scripts/release-prep.mjs +88 -0
package/dist/adopt.d.ts
ADDED
|
@@ -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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"}
|
package/dist/completion.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/completion.js
CHANGED
|
@@ -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":
|
package/dist/completion.js.map
CHANGED
|
@@ -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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"}
|