hatchkit 0.1.11 → 0.1.13

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 (55) hide show
  1. package/dist/adopt.d.ts.map +1 -1
  2. package/dist/adopt.js +39 -80
  3. package/dist/adopt.js.map +1 -1
  4. package/dist/deploy/coolify-app.d.ts +12 -0
  5. package/dist/deploy/coolify-app.d.ts.map +1 -1
  6. package/dist/deploy/coolify-app.js +42 -101
  7. package/dist/deploy/coolify-app.js.map +1 -1
  8. package/dist/deploy/coolify-mongo.d.ts.map +1 -1
  9. package/dist/deploy/coolify-mongo.js +16 -4
  10. package/dist/deploy/coolify-mongo.js.map +1 -1
  11. package/dist/deploy/coolify.d.ts +28 -2
  12. package/dist/deploy/coolify.d.ts.map +1 -1
  13. package/dist/deploy/coolify.js +162 -12
  14. package/dist/deploy/coolify.js.map +1 -1
  15. package/dist/deploy/gh-actions-secrets.d.ts +44 -0
  16. package/dist/deploy/gh-actions-secrets.d.ts.map +1 -0
  17. package/dist/deploy/gh-actions-secrets.js +111 -0
  18. package/dist/deploy/gh-actions-secrets.js.map +1 -0
  19. package/dist/deploy/github.d.ts +10 -1
  20. package/dist/deploy/github.d.ts.map +1 -1
  21. package/dist/deploy/github.js +32 -3
  22. package/dist/deploy/github.js.map +1 -1
  23. package/dist/deploy/pages.d.ts.map +1 -1
  24. package/dist/deploy/pages.js +19 -40
  25. package/dist/deploy/pages.js.map +1 -1
  26. package/dist/index.js +47 -3
  27. package/dist/index.js.map +1 -1
  28. package/dist/prompts.d.ts +54 -0
  29. package/dist/prompts.d.ts.map +1 -1
  30. package/dist/prompts.js +115 -20
  31. package/dist/prompts.js.map +1 -1
  32. package/dist/scaffold/app.js +1 -1
  33. package/dist/scaffold/app.js.map +1 -1
  34. package/dist/scaffold/infra.d.ts.map +1 -1
  35. package/dist/scaffold/infra.js +17 -8
  36. package/dist/scaffold/infra.js.map +1 -1
  37. package/dist/scaffold/manifest.d.ts.map +1 -1
  38. package/dist/scaffold/manifest.js +2 -1
  39. package/dist/scaffold/manifest.js.map +1 -1
  40. package/dist/scaffold/update.js +1 -1
  41. package/dist/scaffold/update.js.map +1 -1
  42. package/dist/templates/build-pipeline/deploy.yml.hbs +15 -5
  43. package/dist/utils/cloudflare-api.d.ts.map +1 -1
  44. package/dist/utils/cloudflare-api.js +10 -8
  45. package/dist/utils/cloudflare-api.js.map +1 -1
  46. package/dist/utils/coolify-api.d.ts.map +1 -1
  47. package/dist/utils/coolify-api.js.map +1 -1
  48. package/dist/utils/coolify-server-ips.d.ts +26 -0
  49. package/dist/utils/coolify-server-ips.d.ts.map +1 -0
  50. package/dist/utils/coolify-server-ips.js +135 -0
  51. package/dist/utils/coolify-server-ips.js.map +1 -0
  52. package/dist/utils/errors.js +1 -1
  53. package/dist/utils/errors.js.map +1 -1
  54. package/package.json +2 -2
  55. package/scripts/release-prep.mjs +5 -23
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * Flow:
12
12
  * 1. Resolve the Coolify project_uuid (it was created by
13
- * `setup-coolify-stack.sh` with the project name).
13
+ * `runCoolifySetup` with the project name).
14
14
  * 2. Resolve the server_uuid by IP (Hetzner deploys carry the IP)
15
15
  * or fall back to the first listed server.
16
16
  * 3. POST /databases/mongodb with `instant_deploy: true`.
@@ -43,10 +43,22 @@ export async function provisionCoolifyMongo(config, serverEnvDir) {
43
43
  throw new Error(`Coolify project "${config.name}" not found — did the stack script run?`);
44
44
  }
45
45
  projectUuid = project.uuid;
46
- const ip = config.serverIp;
47
46
  let server = null;
48
- if (ip)
49
- server = await api.findServer({ ip });
47
+ // Prefer the uuid we resolved up front during server selection
48
+ // (`hatchkit create` populates `config.serverUuid` after picking
49
+ // an existing Coolify server). Falls back to IP- / name-keyed
50
+ // lookups for the new-Hetzner path, where the uuid only exists
51
+ // after Terraform creates the server and we never re-prompt.
52
+ if (config.serverUuid) {
53
+ const servers = await api.listServers();
54
+ const cached = servers.find((s) => s.id === config.serverId) ?? servers[0];
55
+ server = cached
56
+ ? { uuid: config.serverUuid, name: cached.name, ip: cached.ip }
57
+ : { uuid: config.serverUuid, name: "(server)", ip: config.serverIp ?? "" };
58
+ }
59
+ if (!server && config.serverIp) {
60
+ server = await api.findServer({ ip: config.serverIp });
61
+ }
50
62
  if (!server) {
51
63
  // Fall back to the first server. Single-server Hetzner deploys
52
64
  // are the common case, and the alternative is the user picking
@@ -1 +1 @@
1
- {"version":3,"file":"coolify-mongo.js","sourceRoot":"","sources":["../../src/deploy/coolify-mongo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coolify-mongo.js","sourceRoot":"","sources":["../../src/deploy/coolify-mongo.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,30 @@
1
1
  import type { ProjectConfig } from "../prompts.js";
2
- /** Run the Coolify setup script for the project. */
3
- export declare function runCoolifySetup(config: ProjectConfig, repoRoot: string): Promise<void>;
2
+ export interface RunCoolifySetupOptions {
3
+ /** GitHub repository URL required when creating a new application
4
+ * (Coolify's `git_repository` field). Existing apps are matched by
5
+ * name and reused without it. */
6
+ repoUrl?: string;
7
+ /** Server-side container port. Coolify routes incoming traffic to
8
+ * this port via Traefik. The starter's Express server listens here
9
+ * in production (it also serves the built client assets). */
10
+ serverPort?: number;
11
+ /** Client dev port — currently unused by Coolify (no Vite dev server
12
+ * in production). Accepted for symmetry with `scaffoldInfra` and so
13
+ * future build-time / preview deploys have it. */
14
+ clientPort?: number;
15
+ }
16
+ export interface RunCoolifySetupResult {
17
+ /** Coolify uuid of the created (or reused) application. The caller
18
+ * records this in the run ledger so a partial-create rollback can
19
+ * delete it via `CoolifyApi.deleteApplication`. */
20
+ appUuid: string;
21
+ /** Coolify uuid of the project the app lives in. Recorded only for
22
+ * diagnostics — projects are NOT auto-deleted on rollback because
23
+ * they may already host other apps. */
24
+ projectUuid: string;
25
+ }
26
+ /** Create the Coolify project + application for this hatchkit project,
27
+ * idempotent across re-runs. Throws on hard failures so the caller's
28
+ * failure handler can offer a tailored cleanup. */
29
+ export declare function runCoolifySetup(config: ProjectConfig, options?: RunCoolifySetupOptions): Promise<RunCoolifySetupResult>;
4
30
  //# sourceMappingURL=coolify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coolify.d.ts","sourceRoot":"","sources":["../../src/deploy/coolify.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,oDAAoD;AACpD,wBAAsB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB5F"}
1
+ {"version":3,"file":"coolify.d.ts","sourceRoot":"","sources":["../../src/deploy/coolify.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,MAAM,WAAW,sBAAsB;IACrC;;sCAEkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;kEAE8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;uDAEmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC;;wDAEoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB;;4CAEwC;IACxC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;oDAEoD;AACpD,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAyHhC"}
@@ -1,20 +1,170 @@
1
- import { join } from "node:path";
1
+ /*
2
+ * Coolify project + application provisioning. Replaces the old
3
+ * `infra/scripts/setup-coolify-stack.sh`, which spoke an obsolete
4
+ * dialect of the Coolify REST API (`POST /databases` instead of
5
+ * `/databases/mongodb`, single-key `POST /envs` instead of bulk
6
+ * `PATCH /envs/bulk`) and silently swallowed db-creation failures.
7
+ *
8
+ * What this module owns:
9
+ * 1. Project create-or-reuse (idempotent on project name).
10
+ * 2. Server resolution (prefers `config.serverUuid` from the prompt
11
+ * flow; falls back to ip-keyed lookup or first server).
12
+ * 3. Application create-or-reuse (`<name>-web`, public-repo flavour).
13
+ * 4. Multi-domain routing (frontend + api subdomain + path-based API
14
+ * and websocket — the same five-host strategy the old script used).
15
+ * 5. Minimal env vars on the application (NODE_ENV / PORT /
16
+ * FRONTEND_URL). App secrets and DB URLs go into encrypted
17
+ * .env.production via dotenvx — not directly onto the Coolify app
18
+ * — so the keyholder is the only one who sees plaintext, and
19
+ * redeploys don't require touching the Coolify UI.
20
+ *
21
+ * What this module does NOT own:
22
+ * · MongoDB / Redis containers — `provisionCoolifyMongo` (and a
23
+ * future Redis sibling) handle those, called separately by the
24
+ * create flow after the app exists.
25
+ * · GitHub Actions deploy secrets — `setCoolifyDeploySecrets` runs
26
+ * after we return, once we know the app uuid.
27
+ */
2
28
  import chalk from "chalk";
29
+ import ora from "ora";
3
30
  import { getCoolifyConfig } from "../config.js";
4
- import { execStream } from "../utils/exec.js";
5
- /** Run the Coolify setup script for the project. */
6
- export async function runCoolifySetup(config, repoRoot) {
7
- const coolifyConfig = await getCoolifyConfig();
8
- const envFile = join(repoRoot, "stacks", `${config.name}.env`);
31
+ import { CoolifyApi } from "../utils/coolify-api.js";
32
+ /** Create the Coolify project + application for this hatchkit project,
33
+ * idempotent across re-runs. Throws on hard failures so the caller's
34
+ * failure handler can offer a tailored cleanup. */
35
+ export async function runCoolifySetup(config, options = {}) {
36
+ const cfg = await getCoolifyConfig();
37
+ if (!cfg) {
38
+ throw new Error("Coolify is not configured. Run `hatchkit config add coolify` first.");
39
+ }
40
+ const api = new CoolifyApi({ url: cfg.url, token: cfg.token });
9
41
  console.log(chalk.bold("\n ── Coolify Setup ─────────────────────────────────────────\n"));
10
- const env = {};
11
- if (coolifyConfig?.token) {
12
- env.COOLIFY_TOKEN = coolifyConfig.token;
42
+ const verify = ora(`Connecting to Coolify at ${cfg.url}`).start();
43
+ try {
44
+ const version = await api.getVersion();
45
+ verify.succeed(`Connected to Coolify v${version}`);
46
+ }
47
+ catch (err) {
48
+ verify.fail();
49
+ throw new Error(`Cannot reach Coolify API at ${cfg.url}: ${err.message}`);
50
+ }
51
+ const serverUuid = await resolveServerUuid(api, config);
52
+ // Project: reuse one with the same name when present. The old bash
53
+ // script always created a new one, which left orphan empty projects
54
+ // behind on every retry.
55
+ let projectUuid;
56
+ const existingProject = await api.findProjectByName(config.name);
57
+ if (existingProject) {
58
+ projectUuid = existingProject.uuid;
59
+ console.log(chalk.dim(` Using existing Coolify project ${config.name} (${projectUuid})`));
60
+ }
61
+ else {
62
+ const project = await api.createProject(config.name);
63
+ projectUuid = project.uuid;
64
+ console.log(chalk.green(` ✓ Project created: ${config.name} (${projectUuid})`));
65
+ }
66
+ // Domain routing: five hosts on one container.
67
+ // · https://<domain> — frontend
68
+ // · https://api.<domain> — API subdomain
69
+ // · https://<domain>/api — path-based API (same-origin → no CORS)
70
+ // · https://<domain>/api/ws — websocket via path
71
+ // · https://api.<domain>/ws — websocket via subdomain
72
+ // Traefik forwards all five to the same Coolify app; the app's
73
+ // Express router decides what to do based on Host + path.
74
+ const apiDomain = `api.${config.domain}`;
75
+ const domains = [
76
+ `https://${config.domain}`,
77
+ `https://${apiDomain}`,
78
+ `https://${config.domain}/api`,
79
+ `https://${config.domain}/api/ws`,
80
+ `https://${apiDomain}/ws`,
81
+ ];
82
+ console.log(chalk.dim(" Domain routing:"));
83
+ console.log(chalk.dim(` Frontend: https://${config.domain}`));
84
+ console.log(chalk.dim(` Backend: ${domains.slice(1).join(", ")}`));
85
+ // Application: reuse-by-name. `findApplicationByName` matches across
86
+ // every project the user can see; first hit wins. Within a single
87
+ // hatchkit-managed Coolify install, project names are unique enough
88
+ // that a hit means "the same app" — same assumption coolify-mongo
89
+ // makes when it resolves the project.
90
+ const appName = `${config.name}-web`;
91
+ let appUuid;
92
+ const existingApp = await api.findApplicationByName(appName);
93
+ if (existingApp) {
94
+ appUuid = existingApp.uuid;
95
+ console.log(chalk.dim(` Using existing Coolify application ${appName} (${appUuid})`));
13
96
  }
14
- const exitCode = await execStream(join(repoRoot, "scripts", "setup-coolify-stack.sh"), ["--config", envFile], { cwd: repoRoot, env });
15
- if (exitCode !== 0) {
16
- throw new Error("Coolify setup failed");
97
+ else {
98
+ if (!options.repoUrl) {
99
+ throw new Error("No GitHub repo URL — can't create the Coolify application. Did the GitHub step run?");
100
+ }
101
+ const create = ora(`Creating application ${appName}`).start();
102
+ try {
103
+ const created = await api.createApplicationFromPublicRepo({
104
+ projectUuid,
105
+ serverUuid,
106
+ environmentName: "production",
107
+ gitRepository: options.repoUrl,
108
+ gitBranch: "main",
109
+ buildPack: "dockerfile",
110
+ // Coolify exposes one container port. The starter's server
111
+ // listens on `serverPort` and serves client assets in prod —
112
+ // that's the right port to route to. The client dev port is a
113
+ // build-time concern only.
114
+ portsExposes: String(options.serverPort ?? 3000),
115
+ name: appName,
116
+ domains,
117
+ // First deploy lands via GitHub Actions on first push, so we
118
+ // don't need Coolify to start the (empty) container right now.
119
+ instantDeploy: false,
120
+ });
121
+ appUuid = created.uuid;
122
+ create.succeed(`Application created: ${appName} (${appUuid})`);
123
+ }
124
+ catch (err) {
125
+ create.fail();
126
+ throw err;
127
+ }
17
128
  }
129
+ // Env vars on the Coolify application. Keep this list minimal —
130
+ // anything secret (DB URLs, S3 creds, JWT secrets, …) goes into
131
+ // .env.production and is decrypted at runtime via the dotenvx
132
+ // private key that `hatchkit keys push` puts on Coolify. That keeps
133
+ // prod secrets out of Coolify's UI.
134
+ const envs = {
135
+ NODE_ENV: "production",
136
+ PORT: String(options.serverPort ?? 3000),
137
+ FRONTEND_URL: `https://${config.domain}`,
138
+ };
139
+ await api.setAppEnv(appUuid, envs);
140
+ console.log(chalk.green(` ✓ Set ${Object.keys(envs).length} env vars on application (${Object.keys(envs).join(", ")})`));
18
141
  console.log(chalk.green("\n ✓ Coolify app stack created"));
142
+ return { appUuid, projectUuid };
143
+ }
144
+ /** Resolve the Coolify server uuid for this project. The prompt flow
145
+ * populates `config.serverUuid` for `existing` deploys; for new
146
+ * Hetzner deploys (or older cached configs) we fall back to ip- or
147
+ * first-server lookup. */
148
+ async function resolveServerUuid(api, config) {
149
+ if (config.serverUuid)
150
+ return config.serverUuid;
151
+ if (config.serverIp) {
152
+ const found = await api.findServer({ ip: config.serverIp });
153
+ if (found)
154
+ return found.uuid;
155
+ }
156
+ const servers = await api.listServers();
157
+ const first = servers[0];
158
+ if (!first) {
159
+ throw new Error("No Coolify servers configured. Add one in the Coolify dashboard first.");
160
+ }
161
+ // listServers returns the numeric `id` only; resolve the uuid via
162
+ // findServer (Coolify's /servers includes both fields, our typed
163
+ // wrapper just doesn't expose uuid in the list shape).
164
+ const found = await api.findServer({ ip: first.ip });
165
+ if (!found) {
166
+ throw new Error(`Couldn't resolve Coolify uuid for server "${first.name}" (${first.ip}).`);
167
+ }
168
+ return found.uuid;
19
169
  }
20
170
  //# sourceMappingURL=coolify.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coolify.js","sourceRoot":"","sources":["../../src/deploy/coolify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAqB,EAAE,QAAgB;IAC3E,MAAM,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;IAE5F,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,IAAI,aAAa,EAAE,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC;IAC1C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAC/B,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,wBAAwB,CAAC,EACnD,CAAC,UAAU,EAAE,OAAO,CAAC,EACrB,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CACvB,CAAC;IAEF,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"coolify.js","sourceRoot":"","sources":["../../src/deploy/coolify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /** A Coolify application the workflow should redeploy on push.
2
+ * `label`:
3
+ * · undefined → single-app project (adopt-style). Sets
4
+ * COOLIFY_WEBHOOK_URL.
5
+ * · "SERVER" → starter-style server app. Sets
6
+ * COOLIFY_SERVER_RESOURCE_UUID +
7
+ * COOLIFY_SERVER_DEPLOY_WEBHOOK.
8
+ * · "CLIENT" → starter-style client app. Sets
9
+ * COOLIFY_CLIENT_RESOURCE_UUID +
10
+ * COOLIFY_CLIENT_DEPLOY_WEBHOOK. */
11
+ export interface CoolifyDeployApp {
12
+ label?: "SERVER" | "CLIENT";
13
+ /** Coolify application uuid. */
14
+ uuid: string;
15
+ }
16
+ export interface CoolifyDeploySecretsInput {
17
+ /** Working directory that has `.git` + `gh` access. */
18
+ projectDir: string;
19
+ /** GitHub `<owner>/<repo>` slug. */
20
+ repoSlug: string;
21
+ /** One or more apps to wire deploy hooks for. Pass a single
22
+ * unlabelled entry for adopt-style single-app repos; pass two
23
+ * labelled entries (SERVER + CLIENT) for the split layout the
24
+ * starter ships. */
25
+ apps: CoolifyDeployApp[];
26
+ }
27
+ export interface CoolifyDeploySecretsResult {
28
+ ok: boolean;
29
+ /** Names of the secrets that were upserted. Used by the caller for
30
+ * the success log line. */
31
+ pushed: string[];
32
+ }
33
+ /** Push the secrets that the scaffolded GH Actions workflows need
34
+ * to talk to Coolify. Best-effort — failures don't roll anything
35
+ * back; the caller gets a copy-pasteable manual recipe instead. */
36
+ export declare function setCoolifyDeploySecrets(input: CoolifyDeploySecretsInput): Promise<CoolifyDeploySecretsResult>;
37
+ /** Extract `owner/repo` from a git remote URL.
38
+ * git@github.com:owner/repo.git → owner/repo
39
+ * https://github.com/owner/repo[.git] → owner/repo
40
+ * Returns undefined for non-GitHub URLs. */
41
+ export declare function repoSlugFromRemote(url: string | undefined): string | undefined;
42
+ /** Extract the `owner` segment alone from a GitHub remote URL. */
43
+ export declare function ownerFromRemote(url: string | undefined): string | undefined;
44
+ //# sourceMappingURL=gh-actions-secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-actions-secrets.d.ts","sourceRoot":"","sources":["../../src/deploy/gh-actions-secrets.ts"],"names":[],"mappings":"AA4BA;;;;;;;;;uDASuD;AACvD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB;;;yBAGqB;IACrB,IAAI,EAAE,gBAAgB,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ;gCAC4B;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;oEAEoE;AACpE,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CA2DrC;AAWD;;;6CAG6C;AAC7C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAO9E;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG3E"}
@@ -0,0 +1,111 @@
1
+ /*
2
+ * GitHub Actions secrets helpers shared by `hatchkit adopt` and
3
+ * `hatchkit create`.
4
+ *
5
+ * Both flows scaffold a GitHub Actions workflow that builds the
6
+ * Docker image, pushes to GHCR, and triggers Coolify to redeploy.
7
+ * Setting the workflow's secrets must happen BEFORE the first git
8
+ * push, otherwise the workflow's first run hits the "secret not
9
+ * set — skipping deploy trigger" branch and silently no-ops.
10
+ *
11
+ * Two workflow shapes coexist today:
12
+ * · adopt's `deploy.yml` uses COOLIFY_WEBHOOK_URL + COOLIFY_TOKEN
13
+ * for a single app.
14
+ * · the starter's `build-and-deploy.yml` uses COOLIFY_BASE_URL +
15
+ * COOLIFY_API_TOKEN + COOLIFY_<SERVER|CLIENT>_RESOURCE_UUID +
16
+ * COOLIFY_<SERVER|CLIENT>_DEPLOY_WEBHOOK for split server/client
17
+ * apps (with API-vs-webhook fallback).
18
+ *
19
+ * setCoolifyDeploySecrets sets BOTH naming conventions so a project
20
+ * works regardless of which workflow file is checked into the repo.
21
+ * Idempotent (`gh secret set` upserts).
22
+ */
23
+ import chalk from "chalk";
24
+ import ora from "ora";
25
+ import { getCoolifyConfig } from "../config.js";
26
+ import { exec } from "../utils/exec.js";
27
+ /** Push the secrets that the scaffolded GH Actions workflows need
28
+ * to talk to Coolify. Best-effort — failures don't roll anything
29
+ * back; the caller gets a copy-pasteable manual recipe instead. */
30
+ export async function setCoolifyDeploySecrets(input) {
31
+ const cfg = await getCoolifyConfig();
32
+ if (!cfg) {
33
+ console.log(chalk.dim(" · Coolify not configured — skipping Actions secret push."));
34
+ return { ok: false, pushed: [] };
35
+ }
36
+ if (input.apps.length === 0) {
37
+ console.log(chalk.dim(" · No Coolify apps to wire deploy hooks for — skipping."));
38
+ return { ok: false, pushed: [] };
39
+ }
40
+ // Build the secret map.
41
+ // Always set the starter's API-style triple — once those are in
42
+ // place the workflow uses the per-resource uuid + bearer token to
43
+ // call Coolify directly, which is more robust than webhooks.
44
+ // Per-app webhook URLs are still set as a fallback.
45
+ const baseUrl = cfg.url.replace(/\/$/, "");
46
+ const secrets = {
47
+ COOLIFY_BASE_URL: baseUrl,
48
+ COOLIFY_API_TOKEN: cfg.token,
49
+ // Alias kept for adopt's simpler `deploy.yml` template.
50
+ COOLIFY_TOKEN: cfg.token,
51
+ };
52
+ for (const app of input.apps) {
53
+ const webhook = `${baseUrl}/api/v1/deploy?uuid=${app.uuid}`;
54
+ if (app.label === undefined) {
55
+ // Single-app convention (adopt's template).
56
+ secrets.COOLIFY_WEBHOOK_URL = webhook;
57
+ secrets.COOLIFY_RESOURCE_UUID = app.uuid;
58
+ }
59
+ else {
60
+ // Split server/client convention (starter's template).
61
+ secrets[`COOLIFY_${app.label}_RESOURCE_UUID`] = app.uuid;
62
+ secrets[`COOLIFY_${app.label}_DEPLOY_WEBHOOK`] = webhook;
63
+ }
64
+ }
65
+ const names = Object.keys(secrets);
66
+ const spinner = ora(`GitHub: setting ${names.length} Actions secret${names.length === 1 ? "" : "s"} on ${input.repoSlug}`).start();
67
+ try {
68
+ for (const [name, value] of Object.entries(secrets)) {
69
+ await ghSecretSet(input.projectDir, input.repoSlug, name, value);
70
+ }
71
+ spinner.succeed(`GitHub: Actions secrets set (${names.join(", ")})`);
72
+ return { ok: true, pushed: names };
73
+ }
74
+ catch (err) {
75
+ spinner.fail(`GitHub: setting secrets failed — ${err.message}`);
76
+ console.log(chalk.dim(` Set them manually with:\n` +
77
+ names
78
+ .map((n) => ` gh secret set ${n} --repo ${input.repoSlug} --body '${secrets[n]}'`)
79
+ .join("\n")));
80
+ return { ok: false, pushed: [] };
81
+ }
82
+ }
83
+ async function ghSecretSet(cwd, repo, name, value) {
84
+ const res = await exec("gh", ["secret", "set", name, "--repo", repo, "--body", value], {
85
+ cwd,
86
+ });
87
+ if (res.exitCode !== 0) {
88
+ throw new Error(`gh secret set ${name} exited ${res.exitCode}: ${res.stderr.trim()}`);
89
+ }
90
+ }
91
+ /** Extract `owner/repo` from a git remote URL.
92
+ * git@github.com:owner/repo.git → owner/repo
93
+ * https://github.com/owner/repo[.git] → owner/repo
94
+ * Returns undefined for non-GitHub URLs. */
95
+ export function repoSlugFromRemote(url) {
96
+ if (!url)
97
+ return undefined;
98
+ const ssh = url.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/);
99
+ if (ssh)
100
+ return `${ssh[1]}/${ssh[2]}`;
101
+ const https = url.match(/^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?(?:\/.*)?$/);
102
+ if (https)
103
+ return `${https[1]}/${https[2]}`;
104
+ return undefined;
105
+ }
106
+ /** Extract the `owner` segment alone from a GitHub remote URL. */
107
+ export function ownerFromRemote(url) {
108
+ const slug = repoSlugFromRemote(url);
109
+ return slug?.split("/")[0];
110
+ }
111
+ //# sourceMappingURL=gh-actions-secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gh-actions-secrets.js","sourceRoot":"","sources":["../../src/deploy/gh-actions-secrets.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,13 @@
1
1
  import type { ProjectConfig } from "../prompts.js";
2
- /** Initialize git repo, create GitHub remote, and push. */
2
+ /** Initialize git repo + create GitHub remote. Does NOT push — the
3
+ * caller (handleCreate / runAdopt) finishes the deploy wiring (env,
4
+ * Coolify app, GH Actions secrets) before invoking pushInitialBranch
5
+ * so the workflow's first run has the secrets it needs to redeploy
6
+ * Coolify. */
3
7
  export declare function setupGitHub(config: ProjectConfig, appDir: string): Promise<string | null>;
8
+ /** Push the working branch to `origin`. Run AFTER Coolify wiring +
9
+ * GH Actions secrets are in place so the workflow's first run can
10
+ * hit the redeploy webhook successfully. Best-effort — failures
11
+ * print a copy-pasteable manual command rather than throwing. */
12
+ export declare function pushInitialBranch(projectDir: string): Promise<void>;
4
13
  //# sourceMappingURL=github.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/deploy/github.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,2DAA2D;AAC3D,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiD/F"}
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/deploy/github.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD;;;;eAIe;AACf,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmD/F;AAED;;;kEAGkE;AAClE,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzE"}
@@ -1,6 +1,10 @@
1
1
  import chalk from "chalk";
2
2
  import { exec } from "../utils/exec.js";
3
- /** Initialize git repo, create GitHub remote, and push. */
3
+ /** Initialize git repo + create GitHub remote. Does NOT push — the
4
+ * caller (handleCreate / runAdopt) finishes the deploy wiring (env,
5
+ * Coolify app, GH Actions secrets) before invoking pushInitialBranch
6
+ * so the workflow's first run has the secrets it needs to redeploy
7
+ * Coolify. */
4
8
  export async function setupGitHub(config, appDir) {
5
9
  console.log(chalk.bold("\n ── GitHub ────────────────────────────────────────────────\n"));
6
10
  // Git init
@@ -18,8 +22,10 @@ export async function setupGitHub(config, appDir) {
18
22
  console.log(chalk.dim(" Skipped GitHub remote creation."));
19
23
  return null;
20
24
  }
21
- // Create GitHub repo
22
- const createResult = await exec("gh", ["repo", "create", config.name, "--private", "--source=.", "--push"], { cwd: appDir, spinner: `Creating GitHub repo: ${config.name}...` });
25
+ // Create GitHub repo + register `origin`, but DO NOT push yet.
26
+ // pushInitialBranch is called by the caller after Coolify wiring
27
+ // and Actions-secret upserts have completed.
28
+ const createResult = await exec("gh", ["repo", "create", config.name, "--private", "--source=."], { cwd: appDir, spinner: `Creating GitHub repo: ${config.name}...` });
23
29
  if (createResult.exitCode !== 0) {
24
30
  console.log(chalk.yellow(" Could not create GitHub repo. Your local git repo is ready;"));
25
31
  console.log(chalk.yellow(` push it manually once the remote exists:`));
@@ -36,4 +42,27 @@ export async function setupGitHub(config, appDir) {
36
42
  console.log(chalk.green(` ✓ GitHub repo: ${repoUrl}`));
37
43
  return repoUrl;
38
44
  }
45
+ /** Push the working branch to `origin`. Run AFTER Coolify wiring +
46
+ * GH Actions secrets are in place so the workflow's first run can
47
+ * hit the redeploy webhook successfully. Best-effort — failures
48
+ * print a copy-pasteable manual command rather than throwing. */
49
+ export async function pushInitialBranch(projectDir) {
50
+ // `git symbolic-ref --short HEAD` is more reliable than rev-parse
51
+ // for the brand-new `git init` case where HEAD points at an unborn
52
+ // ref (no commits yet would error on rev-parse).
53
+ const headRes = await exec("git", ["symbolic-ref", "--short", "HEAD"], {
54
+ cwd: projectDir,
55
+ silent: true,
56
+ });
57
+ const branch = headRes.exitCode === 0 ? headRes.stdout.trim() : "main";
58
+ const push = await exec("git", ["push", "-u", "origin", branch], {
59
+ cwd: projectDir,
60
+ spinner: `Pushing ${branch} to origin...`,
61
+ });
62
+ if (push.exitCode !== 0) {
63
+ console.log(chalk.yellow(` Couldn't push ${branch} to origin — push manually:\n` +
64
+ ` cd ${projectDir}\n` +
65
+ ` git push -u origin ${branch}`));
66
+ }
67
+ }
39
68
  //# sourceMappingURL=github.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/deploy/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAqB,EAAE,MAAc;IACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;IAE5F,WAAW;IACX,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;QAC1B,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,0BAA0B;KACpC,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,kBAAkB,CAAC,EAAE;QACtD,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,4BAA4B;KACtC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qBAAqB;IACrB,MAAM,YAAY,GAAG,MAAM,IAAI,CAC7B,IAAI,EACJ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,EACpE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,MAAM,CAAC,IAAI,KAAK,EAAE,CACpE,CAAC;IAEF,IAAI,YAAY,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,IAAI,8BAA8B,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,iFAAiF,CAClF,CACF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB;IACnB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE;QAClF,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/deploy/github.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/deploy/pages.ts"],"names":[],"mappings":"AAqDA,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC9D"}
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/deploy/pages.ts"],"names":[],"mappings":"AAsDA,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC9D"}