hatchkit 0.1.2 → 0.1.4

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 (113) 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/coolify-mongo.d.ts +12 -0
  10. package/dist/deploy/coolify-mongo.d.ts.map +1 -0
  11. package/dist/deploy/coolify-mongo.js +109 -0
  12. package/dist/deploy/coolify-mongo.js.map +1 -0
  13. package/dist/deploy/gpu.d.ts +9 -2
  14. package/dist/deploy/gpu.d.ts.map +1 -1
  15. package/dist/deploy/gpu.js +63 -39
  16. package/dist/deploy/gpu.js.map +1 -1
  17. package/dist/deploy/keys.d.ts +6 -2
  18. package/dist/deploy/keys.d.ts.map +1 -1
  19. package/dist/deploy/keys.js +16 -2
  20. package/dist/deploy/keys.js.map +1 -1
  21. package/dist/deploy/pages.d.ts +2 -0
  22. package/dist/deploy/pages.d.ts.map +1 -0
  23. package/dist/deploy/pages.js +537 -0
  24. package/dist/deploy/pages.js.map +1 -0
  25. package/dist/deploy/rename-domain.d.ts +55 -0
  26. package/dist/deploy/rename-domain.d.ts.map +1 -0
  27. package/dist/deploy/rename-domain.js +290 -0
  28. package/dist/deploy/rename-domain.js.map +1 -0
  29. package/dist/deploy/terraform.d.ts.map +1 -1
  30. package/dist/deploy/terraform.js +90 -0
  31. package/dist/deploy/terraform.js.map +1 -1
  32. package/dist/dns.d.ts +7 -0
  33. package/dist/dns.d.ts.map +1 -0
  34. package/dist/dns.js +124 -0
  35. package/dist/dns.js.map +1 -0
  36. package/dist/doctor.d.ts +13 -0
  37. package/dist/doctor.d.ts.map +1 -0
  38. package/dist/doctor.js +368 -0
  39. package/dist/doctor.js.map +1 -0
  40. package/dist/explain.d.ts +4 -0
  41. package/dist/explain.d.ts.map +1 -0
  42. package/dist/explain.js +173 -0
  43. package/dist/explain.js.map +1 -0
  44. package/dist/index.js +521 -61
  45. package/dist/index.js.map +1 -1
  46. package/dist/prompts.d.ts +15 -2
  47. package/dist/prompts.d.ts.map +1 -1
  48. package/dist/prompts.js +52 -7
  49. package/dist/prompts.js.map +1 -1
  50. package/dist/provision/glitchtip.d.ts +3 -0
  51. package/dist/provision/glitchtip.d.ts.map +1 -1
  52. package/dist/provision/glitchtip.js +18 -0
  53. package/dist/provision/glitchtip.js.map +1 -1
  54. package/dist/provision/index.d.ts +26 -0
  55. package/dist/provision/index.d.ts.map +1 -1
  56. package/dist/provision/index.js +435 -60
  57. package/dist/provision/index.js.map +1 -1
  58. package/dist/provision/openpanel.d.ts +7 -0
  59. package/dist/provision/openpanel.d.ts.map +1 -1
  60. package/dist/provision/openpanel.js +113 -48
  61. package/dist/provision/openpanel.js.map +1 -1
  62. package/dist/provision/resend.d.ts +23 -1
  63. package/dist/provision/resend.d.ts.map +1 -1
  64. package/dist/provision/resend.js +62 -1
  65. package/dist/provision/resend.js.map +1 -1
  66. package/dist/provision/write-env.d.ts +31 -0
  67. package/dist/provision/write-env.d.ts.map +1 -0
  68. package/dist/provision/write-env.js +94 -0
  69. package/dist/provision/write-env.js.map +1 -0
  70. package/dist/scaffold/app.js +8 -0
  71. package/dist/scaffold/app.js.map +1 -1
  72. package/dist/scaffold/dotenvx.d.ts.map +1 -1
  73. package/dist/scaffold/dotenvx.js +8 -1
  74. package/dist/scaffold/dotenvx.js.map +1 -1
  75. package/dist/scaffold/infra.d.ts.map +1 -1
  76. package/dist/scaffold/infra.js +18 -1
  77. package/dist/scaffold/infra.js.map +1 -1
  78. package/dist/scaffold/manifest.d.ts +4 -2
  79. package/dist/scaffold/manifest.d.ts.map +1 -1
  80. package/dist/scaffold/manifest.js +1 -1
  81. package/dist/scaffold/manifest.js.map +1 -1
  82. package/dist/scaffold/ml-client.d.ts +9 -2
  83. package/dist/scaffold/ml-client.d.ts.map +1 -1
  84. package/dist/scaffold/ml-client.js +11 -1
  85. package/dist/scaffold/ml-client.js.map +1 -1
  86. package/dist/status.d.ts +30 -0
  87. package/dist/status.d.ts.map +1 -0
  88. package/dist/status.js +169 -0
  89. package/dist/status.js.map +1 -0
  90. package/dist/templates/addons/analytics/sentry.ts.hbs +6 -0
  91. package/dist/templates/base/env.example.hbs +10 -0
  92. package/dist/templates/base/src/config.ts.hbs +24 -4
  93. package/dist/utils/cloudflare-api.d.ts +30 -0
  94. package/dist/utils/cloudflare-api.d.ts.map +1 -0
  95. package/dist/utils/cloudflare-api.js +85 -0
  96. package/dist/utils/cloudflare-api.js.map +1 -0
  97. package/dist/utils/coolify-api.d.ts +47 -1
  98. package/dist/utils/coolify-api.d.ts.map +1 -1
  99. package/dist/utils/coolify-api.js +75 -4
  100. package/dist/utils/coolify-api.js.map +1 -1
  101. package/dist/utils/flags.d.ts.map +1 -1
  102. package/dist/utils/flags.js +4 -0
  103. package/dist/utils/flags.js.map +1 -1
  104. package/dist/utils/inwx-api.d.ts +36 -0
  105. package/dist/utils/inwx-api.d.ts.map +1 -0
  106. package/dist/utils/inwx-api.js +105 -0
  107. package/dist/utils/inwx-api.js.map +1 -0
  108. package/dist/utils/secrets.d.ts +8 -1
  109. package/dist/utils/secrets.d.ts.map +1 -1
  110. package/dist/utils/secrets.js +8 -1
  111. package/dist/utils/secrets.js.map +1 -1
  112. package/package.json +5 -4
  113. package/scripts/release-prep.mjs +130 -0
@@ -0,0 +1,537 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { confirm, input, select } from "@inquirer/prompts";
4
+ import chalk from "chalk";
5
+ import { ensureDns, getDnsConfig } from "../config.js";
6
+ import { exec } from "../utils/exec.js";
7
+ import { parseDomain, validateDomain } from "../utils/validate.js";
8
+ // GitHub's apex A records (docs: configuring-a-custom-domain-for-your-github-pages-site)
9
+ const GITHUB_APEX_A = ["185.199.108.153", "185.199.109.153", "185.199.110.153", "185.199.111.153"];
10
+ /** Directories we scan when looking for sites. Empty = repo root. */
11
+ const SCAN_DIRS = ["", "docs", "site", "www", "web"];
12
+ const WORKFLOW_FILENAME = "gh-pages.yml";
13
+ // ---------------------------------------------------------------------------
14
+ // Main entrypoint
15
+ // ---------------------------------------------------------------------------
16
+ export async function runPagesSetup(cwd) {
17
+ console.log(chalk.bold("\n ── hatchkit gh-pages ──────────────────────────────────────\n"));
18
+ // 1. Repo — must be a git repo with an `origin` pointing at GitHub.
19
+ const repo = await detectRepo(cwd);
20
+ console.log(chalk.dim(` Repo: ${repo.fullName} (${repo.private ? "private" : "public"})`));
21
+ if (repo.private) {
22
+ console.log(chalk.yellow(" ⚠ Private repos need a paid GitHub plan (Pro/Team/Enterprise) for Pages.\n Continuing anyway — will fail at API call if unsupported."));
23
+ }
24
+ // 2. Pick a site. Auto-confirm when there's one obvious candidate;
25
+ // ask when zero or many. Also let the user override the detected
26
+ // publish folder before we commit to writing anything.
27
+ const confirmed = await pickSite(cwd);
28
+ // 3. Custom domain (optional).
29
+ const domain = await promptDomain();
30
+ // 4. Enable Pages via GitHub API.
31
+ await enablePages(repo);
32
+ // 5. Write the workflow — unless the repo already has a Pages-deploying
33
+ // workflow (ours or otherwise). Avoids clobbering an existing setup.
34
+ writeWorkflow(cwd, repo, confirmed);
35
+ // 6. CNAME file — only when a custom domain is chosen.
36
+ if (domain)
37
+ writeCnameFile(cwd, confirmed, domain);
38
+ // 7. Pages CNAME + DNS wiring.
39
+ if (domain) {
40
+ await setPagesCname(repo, domain);
41
+ await configureDns(domain);
42
+ }
43
+ printSummary(repo, confirmed, domain);
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Repo detection
47
+ // ---------------------------------------------------------------------------
48
+ async function detectRepo(cwd) {
49
+ const res = await exec("gh", ["repo", "view", "--json", "nameWithOwner,visibility,defaultBranchRef,owner,name"], { cwd, silent: true });
50
+ if (res.exitCode !== 0) {
51
+ throw new Error("Couldn't resolve the GitHub repo for this directory. Make sure you're inside a git repo with an `origin` remote and that `gh auth status` works.");
52
+ }
53
+ const parsed = JSON.parse(res.stdout);
54
+ return {
55
+ owner: parsed.owner.login,
56
+ repo: parsed.name,
57
+ fullName: parsed.nameWithOwner,
58
+ defaultBranch: parsed.defaultBranchRef?.name ?? "main",
59
+ private: parsed.visibility === "PRIVATE",
60
+ };
61
+ }
62
+ // ---------------------------------------------------------------------------
63
+ // Site detection
64
+ // ---------------------------------------------------------------------------
65
+ async function pickSite(cwd) {
66
+ const candidates = findSiteCandidates(cwd);
67
+ if (candidates.length === 0) {
68
+ console.log(chalk.yellow(" No site detected in the usual spots (root / docs / site / www / web)."));
69
+ return promptManualSite(cwd);
70
+ }
71
+ let chosen;
72
+ if (candidates.length === 1) {
73
+ chosen = candidates[0];
74
+ console.log(chalk.dim(` Site: ${describeCandidate(chosen)} ${chalk.dim("(auto-detected)")}`));
75
+ }
76
+ else {
77
+ console.log(chalk.dim(` Found ${candidates.length} possible sites — pick one:`));
78
+ chosen = await select({
79
+ message: "Which site do you want to deploy?",
80
+ choices: candidates.map((c) => ({ name: describeCandidate(c), value: c })),
81
+ });
82
+ }
83
+ return confirmProjectShape(chosen.detected);
84
+ }
85
+ function describeCandidate(c) {
86
+ const loc = c.dir === "" ? "repo root" : `${c.dir}/`;
87
+ const extra = c.detected.kind === "node-build"
88
+ ? ` (${c.detected.packageManager} run ${c.detected.buildScript} → ${c.detected.publishDir}/)`
89
+ : c.detected.kind === "jekyll"
90
+ ? ` → ${c.detected.publishDir}/`
91
+ : "";
92
+ return `${c.detected.kind} at ${loc}${extra}`;
93
+ }
94
+ function findSiteCandidates(cwd) {
95
+ const results = [];
96
+ for (const sub of SCAN_DIRS) {
97
+ const abs = sub ? join(cwd, sub) : cwd;
98
+ if (sub && !existsSync(abs))
99
+ continue;
100
+ const detected = detectAt(abs, sub);
101
+ if (detected)
102
+ results.push({ dir: sub, detected });
103
+ }
104
+ return results;
105
+ }
106
+ /** Classify a single directory. Returns null if nothing site-shaped lives there. */
107
+ function detectAt(absDir, subPath) {
108
+ // Jekyll first — clearest signal (Gemfile + _config.yml).
109
+ if (existsSync(join(absDir, "Gemfile")) && existsSync(join(absDir, "_config.yml"))) {
110
+ return {
111
+ kind: "jekyll",
112
+ publishDir: subPath ? `${subPath}/_site` : "_site",
113
+ workDir: subPath,
114
+ };
115
+ }
116
+ // Node build: package.json with a "build" script.
117
+ const pkgPath = join(absDir, "package.json");
118
+ if (existsSync(pkgPath)) {
119
+ try {
120
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
121
+ const buildCmd = pkg.scripts?.build;
122
+ // Skip workspace roots (they typically fan out to children, not
123
+ // build a deployable site themselves). Heuristic: `workspaces` in
124
+ // package.json (npm/yarn/bun) or a `pnpm-workspace.yaml` sibling.
125
+ // User can still pick the root manually via promptManualSite.
126
+ const isWorkspaceRoot = pkg.workspaces !== undefined || existsSync(join(absDir, "pnpm-workspace.yaml"));
127
+ if (buildCmd && !isWorkspaceRoot) {
128
+ const outDir = guessNodeOutDir(buildCmd);
129
+ return {
130
+ kind: "node-build",
131
+ publishDir: subPath ? `${subPath}/${outDir}` : outDir,
132
+ packageManager: detectPackageManager(absDir),
133
+ buildScript: "build",
134
+ workDir: subPath,
135
+ };
136
+ }
137
+ }
138
+ catch {
139
+ // fall through
140
+ }
141
+ }
142
+ // Plain static: index.html.
143
+ if (existsSync(join(absDir, "index.html"))) {
144
+ return {
145
+ kind: "static",
146
+ publishDir: subPath || ".",
147
+ workDir: subPath,
148
+ };
149
+ }
150
+ return null;
151
+ }
152
+ function detectPackageManager(cwd) {
153
+ if (existsSync(join(cwd, "pnpm-lock.yaml")))
154
+ return "pnpm";
155
+ if (existsSync(join(cwd, "bun.lockb")))
156
+ return "bun";
157
+ if (existsSync(join(cwd, "yarn.lock")))
158
+ return "yarn";
159
+ return "npm";
160
+ }
161
+ /** Best-guess output folder from a typical build script. Users confirm it. */
162
+ function guessNodeOutDir(buildCmd) {
163
+ if (buildCmd.includes("astro"))
164
+ return "dist";
165
+ if (buildCmd.includes("next"))
166
+ return "out"; // requires `output: "export"`
167
+ if (buildCmd.includes("vite"))
168
+ return "dist";
169
+ if (buildCmd.includes("react-scripts"))
170
+ return "build";
171
+ return "dist";
172
+ }
173
+ async function confirmProjectShape(detected) {
174
+ // Jekyll always builds to _site — nothing to ask.
175
+ if (detected.kind === "jekyll")
176
+ return detected;
177
+ const publishDir = await input({
178
+ message: "Folder to publish (relative to repo root):",
179
+ default: detected.publishDir,
180
+ });
181
+ return { ...detected, publishDir };
182
+ }
183
+ /** Manual fallback when nothing was auto-detected. */
184
+ async function promptManualSite(cwd) {
185
+ const kind = await select({
186
+ message: "What kind of site is this?",
187
+ choices: [
188
+ { name: "static — plain HTML, no build step", value: "static" },
189
+ { name: "node-build — package.json with a `build` script", value: "node-build" },
190
+ { name: "jekyll", value: "jekyll" },
191
+ ],
192
+ });
193
+ const workDir = await input({
194
+ message: "Site lives in (relative to repo root, '.' for root):",
195
+ default: ".",
196
+ });
197
+ const normWorkDir = workDir === "." ? "" : workDir;
198
+ if (kind === "jekyll") {
199
+ return {
200
+ kind,
201
+ publishDir: normWorkDir ? `${normWorkDir}/_site` : "_site",
202
+ workDir: normWorkDir,
203
+ };
204
+ }
205
+ if (kind === "static") {
206
+ return { kind, publishDir: normWorkDir || ".", workDir: normWorkDir };
207
+ }
208
+ // node-build
209
+ const publishDir = await input({
210
+ message: "Build output folder (relative to repo root):",
211
+ default: normWorkDir ? `${normWorkDir}/dist` : "dist",
212
+ });
213
+ return {
214
+ kind,
215
+ publishDir,
216
+ packageManager: detectPackageManager(normWorkDir ? join(cwd, normWorkDir) : cwd),
217
+ buildScript: "build",
218
+ workDir: normWorkDir,
219
+ };
220
+ }
221
+ // ---------------------------------------------------------------------------
222
+ // Domain prompt
223
+ // ---------------------------------------------------------------------------
224
+ async function promptDomain() {
225
+ const wantCustom = await confirm({
226
+ message: "Use a custom domain?",
227
+ default: false,
228
+ });
229
+ if (!wantCustom)
230
+ return null;
231
+ return input({
232
+ message: "Domain (e.g. sprites.example.com or example.com):",
233
+ validate: validateDomain,
234
+ });
235
+ }
236
+ // ---------------------------------------------------------------------------
237
+ // GitHub Pages API
238
+ // ---------------------------------------------------------------------------
239
+ async function enablePages(repo) {
240
+ // POST creates. If Pages is already enabled, GitHub returns 409 — fall
241
+ // back to PUT so build_type=workflow lands either way.
242
+ const res = await exec("gh", ["api", "-X", "POST", `repos/${repo.fullName}/pages`, "-f", "build_type=workflow"], { silent: true, spinner: "Enabling GitHub Pages..." });
243
+ if (res.exitCode === 0)
244
+ return;
245
+ if (res.stderr.includes("409") || res.stdout.includes("already")) {
246
+ const put = await exec("gh", ["api", "-X", "PUT", `repos/${repo.fullName}/pages`, "-f", "build_type=workflow"], { silent: true, spinner: "Pages already enabled — ensuring workflow build type..." });
247
+ if (put.exitCode !== 0) {
248
+ throw new Error(`Couldn't set Pages build type: ${put.stderr.trim()}`);
249
+ }
250
+ return;
251
+ }
252
+ throw new Error(`Couldn't enable Pages: ${res.stderr.trim() || res.stdout.trim()}`);
253
+ }
254
+ async function setPagesCname(repo, domain) {
255
+ const res = await exec("gh", ["api", "-X", "PUT", `repos/${repo.fullName}/pages`, "-f", `cname=${domain}`], { silent: true, spinner: `Registering ${domain} with Pages...` });
256
+ if (res.exitCode !== 0) {
257
+ // Non-fatal: DNS might not be in place yet.
258
+ console.log(chalk.yellow(` ⚠ Couldn't set Pages CNAME to ${domain} (${res.stderr.trim()}).\n Set it manually in Settings → Pages once DNS resolves.`));
259
+ }
260
+ }
261
+ // ---------------------------------------------------------------------------
262
+ // Workflow + CNAME file
263
+ // ---------------------------------------------------------------------------
264
+ function writeWorkflow(cwd, repo, d) {
265
+ const workflowsDir = join(cwd, ".github", "workflows");
266
+ mkdirSync(workflowsDir, { recursive: true });
267
+ // Don't overwrite any existing Pages-deploying workflow. Looking for
268
+ // `actions/deploy-pages` in every workflow file catches our own
269
+ // gh-pages.yml as well as hand-written ones (e.g. docs.yml).
270
+ const existing = findExistingPagesWorkflow(workflowsDir);
271
+ if (existing) {
272
+ console.log(chalk.yellow(` ⚠ Existing Pages workflow found at .github/workflows/${existing} — leaving it untouched.\n Delete it and re-run if you want a fresh ${WORKFLOW_FILENAME}.`));
273
+ return;
274
+ }
275
+ const outPath = join(workflowsDir, WORKFLOW_FILENAME);
276
+ writeFileSync(outPath, renderWorkflow(repo, d));
277
+ console.log(chalk.green(` ✓ Wrote .github/workflows/${WORKFLOW_FILENAME}`));
278
+ }
279
+ function findExistingPagesWorkflow(workflowsDir) {
280
+ if (!existsSync(workflowsDir))
281
+ return null;
282
+ const files = readdirSync(workflowsDir).filter((f) => f.endsWith(".yml") || f.endsWith(".yaml"));
283
+ for (const f of files) {
284
+ const contents = readFileSync(join(workflowsDir, f), "utf8");
285
+ if (contents.includes("actions/deploy-pages"))
286
+ return f;
287
+ }
288
+ return null;
289
+ }
290
+ function renderWorkflow(repo, d) {
291
+ const branch = repo.defaultBranch;
292
+ const header = `name: Deploy to GitHub Pages
293
+
294
+ on:
295
+ push:
296
+ branches: [${branch}]
297
+ workflow_dispatch:
298
+
299
+ permissions:
300
+ contents: read
301
+ pages: write
302
+ id-token: write
303
+
304
+ concurrency:
305
+ group: pages
306
+ cancel-in-progress: false
307
+
308
+ jobs:
309
+ build:
310
+ runs-on: ubuntu-latest
311
+ steps:
312
+ - uses: actions/checkout@v4
313
+ `;
314
+ const tail = ` - uses: actions/configure-pages@v5
315
+ - uses: actions/upload-pages-artifact@v3
316
+ with:
317
+ path: ${d.publishDir}
318
+
319
+ deploy:
320
+ needs: build
321
+ runs-on: ubuntu-latest
322
+ environment:
323
+ name: github-pages
324
+ url: \${{ steps.deployment.outputs.page_url }}
325
+ steps:
326
+ - id: deployment
327
+ uses: actions/deploy-pages@v4
328
+ `;
329
+ if (d.kind === "static") {
330
+ return `${header}${tail}`;
331
+ }
332
+ if (d.kind === "jekyll") {
333
+ const wdLine = d.workDir ? `\n working-directory: ${d.workDir}` : "";
334
+ const jekyllWd = d.workDir ? `\n working-directory: ${d.workDir}` : "";
335
+ return `${header} - uses: ruby/setup-ruby@v1
336
+ with:
337
+ ruby-version: "3.2"
338
+ bundler-cache: true${wdLine}
339
+ - uses: actions/configure-pages@v5
340
+ id: pages
341
+ - name: Build with Jekyll
342
+ run: bundle exec jekyll build --baseurl "\${{ steps.pages.outputs.base_path }}"${jekyllWd}
343
+ env:
344
+ JEKYLL_ENV: production
345
+ - uses: actions/upload-pages-artifact@v3
346
+ with:
347
+ path: ${d.publishDir}
348
+
349
+ deploy:
350
+ needs: build
351
+ runs-on: ubuntu-latest
352
+ environment:
353
+ name: github-pages
354
+ url: \${{ steps.deployment.outputs.page_url }}
355
+ steps:
356
+ - id: deployment
357
+ uses: actions/deploy-pages@v4
358
+ `;
359
+ }
360
+ // node-build
361
+ const pm = d.packageManager ?? "npm";
362
+ const installCmd = pm === "npm" ? "npm ci" : `${pm} install --frozen-lockfile`;
363
+ const buildCmd = `${pm} run ${d.buildScript ?? "build"}`;
364
+ const wd = d.workDir ? `\n working-directory: ${d.workDir}` : "";
365
+ const nodeSetup = pm === "pnpm"
366
+ ? ` - uses: pnpm/action-setup@v4
367
+ with:
368
+ version: 9
369
+ - uses: actions/setup-node@v4
370
+ with:
371
+ node-version: 20
372
+ cache: pnpm${d.workDir ? `\n cache-dependency-path: ${d.workDir}/pnpm-lock.yaml` : ""}`
373
+ : pm === "yarn"
374
+ ? ` - uses: actions/setup-node@v4
375
+ with:
376
+ node-version: 20
377
+ cache: yarn${d.workDir ? `\n cache-dependency-path: ${d.workDir}/yarn.lock` : ""}`
378
+ : pm === "bun"
379
+ ? ` - uses: oven-sh/setup-bun@v2`
380
+ : ` - uses: actions/setup-node@v4
381
+ with:
382
+ node-version: 20
383
+ cache: npm${d.workDir ? `\n cache-dependency-path: ${d.workDir}/package-lock.json` : ""}`;
384
+ return `${header}${nodeSetup}
385
+ - name: Install dependencies
386
+ run: ${installCmd}${wd}
387
+ - name: Build
388
+ run: ${buildCmd}${wd}
389
+ ${tail}`;
390
+ }
391
+ function writeCnameFile(cwd, d, domain) {
392
+ // CNAME lives at the root of the *published* content so GitHub serves
393
+ // it from the built site. Location depends on kind + workDir.
394
+ // - jekyll / static: source dir (Jekyll copies it into _site; static
395
+ // publishes the source dir directly).
396
+ // - node-build: prefer `<workDir>/public/` (Vite/CRA/Astro copy that
397
+ // verbatim into the build output). Fall back to the build dir root.
398
+ const siteDir = d.workDir ? join(cwd, d.workDir) : cwd;
399
+ let target;
400
+ if (d.kind === "node-build") {
401
+ const publicDir = join(siteDir, "public");
402
+ if (existsSync(publicDir)) {
403
+ target = join(publicDir, "CNAME");
404
+ }
405
+ else {
406
+ target = join(siteDir, "CNAME");
407
+ console.log(chalk.yellow(` ⚠ No public/ folder in ${d.workDir || "repo root"}. Wrote CNAME there — make sure your build copies it into ${d.publishDir}/.`));
408
+ }
409
+ }
410
+ else {
411
+ target = join(siteDir, "CNAME");
412
+ }
413
+ writeFileSync(target, `${domain}\n`);
414
+ console.log(chalk.green(` ✓ Wrote ${target.slice(cwd.length + 1)}`));
415
+ }
416
+ // ---------------------------------------------------------------------------
417
+ // DNS wiring
418
+ // ---------------------------------------------------------------------------
419
+ async function configureDns(domain) {
420
+ const { baseDomain, subdomain } = parseDomain(domain);
421
+ const isApex = subdomain === "";
422
+ const ghUser = await getGitHubUser();
423
+ const target = `${ghUser}.github.io`;
424
+ let dns = await getDnsConfig();
425
+ if (!dns) {
426
+ const wantConfigure = await confirm({
427
+ message: "No DNS provider configured. Configure one now?",
428
+ default: true,
429
+ });
430
+ if (wantConfigure)
431
+ dns = await ensureDns();
432
+ }
433
+ if (!dns || dns.provider === "manual") {
434
+ printManualDnsRecords(baseDomain, subdomain, target, isApex);
435
+ return;
436
+ }
437
+ if (dns.provider === "cloudflare") {
438
+ if (!dns.apiToken) {
439
+ console.log(chalk.yellow(" ⚠ Cloudflare token missing from keychain."));
440
+ printManualDnsRecords(baseDomain, subdomain, target, isApex);
441
+ return;
442
+ }
443
+ await configureCloudflareDns(dns.apiToken, baseDomain, subdomain, target, isApex);
444
+ return;
445
+ }
446
+ // INWX auto-wiring isn't implemented — XML-RPC + rarely used for Pages.
447
+ console.log(chalk.dim(" INWX auto-configure isn't implemented for Pages — showing manual records:"));
448
+ printManualDnsRecords(baseDomain, subdomain, target, isApex);
449
+ }
450
+ async function getGitHubUser() {
451
+ const res = await exec("gh", ["api", "user", "--jq", ".login"], { silent: true });
452
+ if (res.exitCode !== 0) {
453
+ throw new Error("Couldn't resolve the GitHub user via `gh api user`.");
454
+ }
455
+ return res.stdout.trim();
456
+ }
457
+ function printManualDnsRecords(baseDomain, subdomain, target, isApex) {
458
+ console.log(chalk.bold("\n Add these DNS records at your provider:\n"));
459
+ if (isApex) {
460
+ for (const ip of GITHUB_APEX_A) {
461
+ console.log(chalk.dim(` A @ ${ip}`));
462
+ }
463
+ }
464
+ else {
465
+ console.log(chalk.dim(` CNAME ${subdomain} ${target}`));
466
+ }
467
+ console.log(chalk.dim(`\n Zone: ${baseDomain}\n`));
468
+ }
469
+ async function cfApi(token, path, init) {
470
+ const res = await fetch(`https://api.cloudflare.com/client/v4${path}`, {
471
+ method: init?.method ?? "GET",
472
+ headers: {
473
+ Authorization: `Bearer ${token}`,
474
+ "Content-Type": "application/json",
475
+ },
476
+ body: init?.body ? JSON.stringify(init.body) : undefined,
477
+ });
478
+ const data = (await res.json());
479
+ if (!data.success) {
480
+ throw new Error(`Cloudflare API ${path} failed: ${data.errors.map((e) => `${e.code} ${e.message}`).join(", ")}`);
481
+ }
482
+ return data.result;
483
+ }
484
+ async function configureCloudflareDns(token, baseDomain, subdomain, target, isApex) {
485
+ const zones = await cfApi(token, `/zones?name=${encodeURIComponent(baseDomain)}`);
486
+ if (zones.length === 0) {
487
+ console.log(chalk.yellow(` ⚠ No Cloudflare zone found for ${baseDomain}. Falling back to manual records.`));
488
+ printManualDnsRecords(baseDomain, subdomain, target, isApex);
489
+ return;
490
+ }
491
+ const zone = zones[0];
492
+ const recordName = isApex ? baseDomain : `${subdomain}.${baseDomain}`;
493
+ const records = isApex
494
+ ? GITHUB_APEX_A.map((ip) => ({ type: "A", name: recordName, content: ip, proxied: false }))
495
+ : [{ type: "CNAME", name: recordName, content: target, proxied: false }];
496
+ for (const rec of records) {
497
+ const existing = await cfApi(token, `/zones/${zone.id}/dns_records?type=${rec.type}&name=${encodeURIComponent(rec.name)}`);
498
+ const match = existing.find((r) => r.content === rec.content);
499
+ if (match) {
500
+ console.log(chalk.dim(` ${rec.type} ${rec.name} → ${rec.content} (already set)`));
501
+ continue;
502
+ }
503
+ // A different record with the same name+type — update in place to
504
+ // keep the zone tidy.
505
+ const stale = existing[0];
506
+ if (stale) {
507
+ await cfApi(token, `/zones/${zone.id}/dns_records/${stale.id}`, {
508
+ method: "PUT",
509
+ body: rec,
510
+ });
511
+ console.log(chalk.green(` ✓ ${rec.type} ${rec.name} → ${rec.content} (updated)`));
512
+ }
513
+ else {
514
+ await cfApi(token, `/zones/${zone.id}/dns_records`, { method: "POST", body: rec });
515
+ console.log(chalk.green(` ✓ ${rec.type} ${rec.name} → ${rec.content} (created)`));
516
+ }
517
+ }
518
+ }
519
+ // ---------------------------------------------------------------------------
520
+ // Summary
521
+ // ---------------------------------------------------------------------------
522
+ function printSummary(repo, d, domain) {
523
+ console.log(chalk.bold("\n ── Done ───────────────────────────────────────────────────\n"));
524
+ const url = domain ? `https://${domain}` : `https://${repo.owner}.github.io/${repo.repo}/`;
525
+ console.log(` Site: ${chalk.cyan(url)}`);
526
+ console.log(` Branch: ${chalk.dim(repo.defaultBranch)} → triggers ${WORKFLOW_FILENAME}`);
527
+ console.log(` Publish: ${chalk.dim(d.publishDir + "/")}`);
528
+ if (d.workDir) {
529
+ console.log(` Source: ${chalk.dim(d.workDir + "/")}`);
530
+ }
531
+ if (domain) {
532
+ console.log(chalk.yellow(`\n First-time DNS propagation can take a few minutes.`));
533
+ console.log(chalk.dim(` Once it resolves, GitHub will provision a cert automatically (Settings → Pages).`));
534
+ }
535
+ console.log(chalk.yellow(`\n Next: commit & push the new workflow (and CNAME file) to ${repo.defaultBranch}.\n`));
536
+ }
537
+ //# sourceMappingURL=pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/deploy/pages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { type ProjectManifest } from "../scaffold/manifest.js";
2
+ export interface RenameDomainOptions {
3
+ /** Directory of the scaffolded project. Manifest must exist here. */
4
+ projectDir: string;
5
+ /** Monorepo root — `infra/` + `stacks/` live under this. */
6
+ monorepoRoot: string;
7
+ /** Target domain. If omitted, the user is prompted. */
8
+ newDomain?: string;
9
+ /** Show the plan, don't write. */
10
+ dryRun?: boolean;
11
+ /** Skip the final confirmation prompt. */
12
+ yes?: boolean;
13
+ }
14
+ export declare function runRenameDomain(opts: RenameDomainOptions): Promise<void>;
15
+ interface FileEdit {
16
+ label: string;
17
+ path: string;
18
+ after: string;
19
+ changes: string[];
20
+ }
21
+ declare function rewriteManifest(path: string, m: ProjectManifest, newDomain: string): FileEdit;
22
+ /**
23
+ * Edit the tfvars file. Two surgical changes + a remap of subdomain keys.
24
+ *
25
+ * The tfvars file was generated from a template, so the format is
26
+ * predictable. Matching `domain = "..."` and the opening of the
27
+ * `subdomains = { ... }` block with regex is safer than a full parser
28
+ * for this narrow use.
29
+ */
30
+ declare function rewriteTfvars(path: string, oldDomain: string, newDomain: string, oldSub: string, newSub: string, newBase: string, oldBase: string): FileEdit;
31
+ /**
32
+ * Edit the Coolify stack env file. This is a plain KEY="VALUE" block,
33
+ * not a strict format — do line-by-line substitution so we don't clobber
34
+ * unrelated lines and keep the diff obvious.
35
+ *
36
+ * Swaps:
37
+ * - APP_DOMAIN="OLD" → "NEW"
38
+ * - Any other line whose value contains the old full domain gets the
39
+ * old-full-domain → new-full-domain swap (catches FRONTEND_URL,
40
+ * BETTER_AUTH_URL, TRUSTED_ORIGINS, etc).
41
+ * - Lines with the old base domain (but not the old full domain) are
42
+ * left alone — those usually refer to someone else's URL.
43
+ *
44
+ * COOLIFY_URL is explicitly skipped — that's the Coolify dashboard URL,
45
+ * not the project's public domain.
46
+ */
47
+ declare function rewriteStacksEnv(path: string, oldDomain: string, newDomain: string, _oldBase: string, _newBase: string): FileEdit;
48
+ export declare const _internals: {
49
+ rewriteTfvars: typeof rewriteTfvars;
50
+ rewriteStacksEnv: typeof rewriteStacksEnv;
51
+ rewriteManifest: typeof rewriteManifest;
52
+ };
53
+ export declare function runRenameDomainCli(args: string[], monorepoRoot: string): Promise<void>;
54
+ export {};
55
+ //# sourceMappingURL=rename-domain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-domain.d.ts","sourceRoot":"","sources":["../../src/deploy/rename-domain.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAE,KAAK,eAAe,EAAgB,MAAM,yBAAyB,CAAC;AAO7E,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmH9E;AAMD,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAQtF;AAED;;;;;;;GAOG;AACH,iBAAS,aAAa,CACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,QAAQ,CAiDV;AAED;;;;;;;;;;;;;;;GAeG;AACH,iBAAS,gBAAgB,CACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,QAAQ,CAyBV;AA4ED,eAAO,MAAM,UAAU;;;;CAItB,CAAC;AAMF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5F"}