hatchkit 0.1.1

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 (149) hide show
  1. package/dist/config.d.ts +131 -0
  2. package/dist/config.d.ts.map +1 -0
  3. package/dist/config.js +629 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/deploy/coolify.d.ts +4 -0
  6. package/dist/deploy/coolify.d.ts.map +1 -0
  7. package/dist/deploy/coolify.js +20 -0
  8. package/dist/deploy/coolify.js.map +1 -0
  9. package/dist/deploy/github.d.ts +4 -0
  10. package/dist/deploy/github.d.ts.map +1 -0
  11. package/dist/deploy/github.js +39 -0
  12. package/dist/deploy/github.js.map +1 -0
  13. package/dist/deploy/gpu.d.ts +4 -0
  14. package/dist/deploy/gpu.d.ts.map +1 -0
  15. package/dist/deploy/gpu.js +97 -0
  16. package/dist/deploy/gpu.js.map +1 -0
  17. package/dist/deploy/keys.d.ts +9 -0
  18. package/dist/deploy/keys.d.ts.map +1 -0
  19. package/dist/deploy/keys.js +73 -0
  20. package/dist/deploy/keys.js.map +1 -0
  21. package/dist/deploy/terraform.d.ts +4 -0
  22. package/dist/deploy/terraform.d.ts.map +1 -0
  23. package/dist/deploy/terraform.js +55 -0
  24. package/dist/deploy/terraform.js.map +1 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +599 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/prompts.d.ts +52 -0
  30. package/dist/prompts.d.ts.map +1 -0
  31. package/dist/prompts.js +313 -0
  32. package/dist/prompts.js.map +1 -0
  33. package/dist/provision/glitchtip.d.ts +6 -0
  34. package/dist/provision/glitchtip.d.ts.map +1 -0
  35. package/dist/provision/glitchtip.js +46 -0
  36. package/dist/provision/glitchtip.js.map +1 -0
  37. package/dist/provision/index.d.ts +9 -0
  38. package/dist/provision/index.d.ts.map +1 -0
  39. package/dist/provision/index.js +108 -0
  40. package/dist/provision/index.js.map +1 -0
  41. package/dist/provision/openpanel.d.ts +8 -0
  42. package/dist/provision/openpanel.d.ts.map +1 -0
  43. package/dist/provision/openpanel.js +66 -0
  44. package/dist/provision/openpanel.js.map +1 -0
  45. package/dist/provision/resend.d.ts +16 -0
  46. package/dist/provision/resend.d.ts.map +1 -0
  47. package/dist/provision/resend.js +43 -0
  48. package/dist/provision/resend.js.map +1 -0
  49. package/dist/scaffold/app.d.ts +13 -0
  50. package/dist/scaffold/app.d.ts.map +1 -0
  51. package/dist/scaffold/app.js +340 -0
  52. package/dist/scaffold/app.js.map +1 -0
  53. package/dist/scaffold/dotenvx.d.ts +30 -0
  54. package/dist/scaffold/dotenvx.d.ts.map +1 -0
  55. package/dist/scaffold/dotenvx.js +142 -0
  56. package/dist/scaffold/dotenvx.js.map +1 -0
  57. package/dist/scaffold/infra.d.ts +17 -0
  58. package/dist/scaffold/infra.d.ts.map +1 -0
  59. package/dist/scaffold/infra.js +200 -0
  60. package/dist/scaffold/infra.js.map +1 -0
  61. package/dist/scaffold/manifest.d.ts +50 -0
  62. package/dist/scaffold/manifest.d.ts.map +1 -0
  63. package/dist/scaffold/manifest.js +83 -0
  64. package/dist/scaffold/manifest.js.map +1 -0
  65. package/dist/scaffold/ml-client.d.ts +20 -0
  66. package/dist/scaffold/ml-client.d.ts.map +1 -0
  67. package/dist/scaffold/ml-client.js +38 -0
  68. package/dist/scaffold/ml-client.js.map +1 -0
  69. package/dist/scaffold/pkg-json.d.ts +20 -0
  70. package/dist/scaffold/pkg-json.d.ts.map +1 -0
  71. package/dist/scaffold/pkg-json.js +113 -0
  72. package/dist/scaffold/pkg-json.js.map +1 -0
  73. package/dist/scaffold/starter-files.d.ts +40 -0
  74. package/dist/scaffold/starter-files.d.ts.map +1 -0
  75. package/dist/scaffold/starter-files.js +197 -0
  76. package/dist/scaffold/starter-files.js.map +1 -0
  77. package/dist/scaffold/update.d.ts +8 -0
  78. package/dist/scaffold/update.d.ts.map +1 -0
  79. package/dist/scaffold/update.js +255 -0
  80. package/dist/scaffold/update.js.map +1 -0
  81. package/dist/templates/addons/analytics/middleware.ts.hbs +13 -0
  82. package/dist/templates/addons/analytics/sentry.ts.hbs +16 -0
  83. package/dist/templates/addons/storage/s3.ts.hbs +40 -0
  84. package/dist/templates/addons/storage/upload.ts.hbs +23 -0
  85. package/dist/templates/addons/stripe/checkout.ts.hbs +27 -0
  86. package/dist/templates/addons/stripe/client.ts.hbs +6 -0
  87. package/dist/templates/addons/stripe/webhook.ts.hbs +39 -0
  88. package/dist/templates/addons/websocket/redis.ts.hbs +25 -0
  89. package/dist/templates/addons/websocket/ws.ts.hbs +32 -0
  90. package/dist/templates/base/.dockerignore.hbs +7 -0
  91. package/dist/templates/base/Dockerfile.hbs +18 -0
  92. package/dist/templates/base/env.example.hbs +60 -0
  93. package/dist/templates/base/github-actions.yml.hbs +35 -0
  94. package/dist/templates/base/gitignore.hbs +5 -0
  95. package/dist/templates/base/package.json.hbs +36 -0
  96. package/dist/templates/base/src/auth/auth.ts.hbs +13 -0
  97. package/dist/templates/base/src/auth/routes.ts.hbs +19 -0
  98. package/dist/templates/base/src/config.ts.hbs +36 -0
  99. package/dist/templates/base/src/db.ts.hbs +12 -0
  100. package/dist/templates/base/src/index.ts.hbs +80 -0
  101. package/dist/templates/base/src/routes/health.ts.hbs +12 -0
  102. package/dist/templates/base/tsconfig.json.hbs +18 -0
  103. package/dist/templates/ml-clients/3d-extraction.ts.hbs +20 -0
  104. package/dist/templates/ml-clients/background-removal.ts.hbs +17 -0
  105. package/dist/templates/ml-clients/custom-hf.ts.hbs +20 -0
  106. package/dist/templates/ml-clients/image-recognition.ts.hbs +22 -0
  107. package/dist/templates/ml-clients/subtitles.ts.hbs +26 -0
  108. package/dist/utils/coolify-api.d.ts +45 -0
  109. package/dist/utils/coolify-api.d.ts.map +1 -0
  110. package/dist/utils/coolify-api.js +72 -0
  111. package/dist/utils/coolify-api.js.map +1 -0
  112. package/dist/utils/errors.d.ts +2 -0
  113. package/dist/utils/errors.d.ts.map +1 -0
  114. package/dist/utils/errors.js +31 -0
  115. package/dist/utils/errors.js.map +1 -0
  116. package/dist/utils/exec.d.ts +23 -0
  117. package/dist/utils/exec.d.ts.map +1 -0
  118. package/dist/utils/exec.js +47 -0
  119. package/dist/utils/exec.js.map +1 -0
  120. package/dist/utils/flags.d.ts +17 -0
  121. package/dist/utils/flags.d.ts.map +1 -0
  122. package/dist/utils/flags.js +116 -0
  123. package/dist/utils/flags.js.map +1 -0
  124. package/dist/utils/hf-api.d.ts +13 -0
  125. package/dist/utils/hf-api.d.ts.map +1 -0
  126. package/dist/utils/hf-api.js +30 -0
  127. package/dist/utils/hf-api.js.map +1 -0
  128. package/dist/utils/ports.d.ts +29 -0
  129. package/dist/utils/ports.d.ts.map +1 -0
  130. package/dist/utils/ports.js +86 -0
  131. package/dist/utils/ports.js.map +1 -0
  132. package/dist/utils/secrets.d.ts +25 -0
  133. package/dist/utils/secrets.d.ts.map +1 -0
  134. package/dist/utils/secrets.js +51 -0
  135. package/dist/utils/secrets.js.map +1 -0
  136. package/dist/utils/template.d.ts +7 -0
  137. package/dist/utils/template.d.ts.map +1 -0
  138. package/dist/utils/template.js +35 -0
  139. package/dist/utils/template.js.map +1 -0
  140. package/dist/utils/validate.d.ts +16 -0
  141. package/dist/utils/validate.d.ts.map +1 -0
  142. package/dist/utils/validate.js +60 -0
  143. package/dist/utils/validate.js.map +1 -0
  144. package/dist/utils/version.d.ts +2 -0
  145. package/dist/utils/version.d.ts.map +1 -0
  146. package/dist/utils/version.js +21 -0
  147. package/dist/utils/version.js.map +1 -0
  148. package/package.json +48 -0
  149. package/scripts/copy-templates.mjs +20 -0
@@ -0,0 +1,52 @@
1
+ export type DeployTarget = "existing" | "new";
2
+ export type DnsProvider = "inwx" | "cloudflare" | "manual";
3
+ export type S3Provider = "hetzner" | "r2" | "aws" | "existing" | "none";
4
+ export type GpuPlatform = "modal" | "runpod" | "hf" | "replicate";
5
+ export type Feature = "websocket" | "stripe" | "analytics" | "s3" | "desktop" | "mobile";
6
+ export type MlService = "3d-extraction" | "subtitles" | "image-recognition" | "background-removal" | "custom-hf";
7
+ export interface ProjectConfig {
8
+ name: string;
9
+ domain: string;
10
+ baseDomain: string;
11
+ subdomain: string;
12
+ deployTarget: DeployTarget;
13
+ serverId?: number;
14
+ serverIp?: string;
15
+ serverSize?: string;
16
+ serverLocation?: string;
17
+ features: Feature[];
18
+ s3Provider: S3Provider;
19
+ s3ExistingEndpoint?: string;
20
+ s3ExistingBucket?: string;
21
+ s3ExistingAccessKey?: string;
22
+ s3ExistingSecretKey?: string;
23
+ s3ExistingRegion?: string;
24
+ mlServices: MlService[];
25
+ /** Subset of mlServices the user wants to redeploy even though the
26
+ * registry has them. Used to recover from stale entries (upstream
27
+ * service was deleted) or platform migrations. */
28
+ forceRedeployMl: MlService[];
29
+ /** Optional key→value map supplied for .env.production seeding
30
+ * (STRIPE_SECRET_KEY, SENTRY_DSN, etc.). Anything unsupplied lands
31
+ * as a plaintext CHANGE_ME_<KEY> placeholder that the user can
32
+ * encrypt later with `dotenvx set`. */
33
+ envValues?: Record<string, string>;
34
+ gpuPlatform?: GpuPlatform;
35
+ customHfModelId?: string;
36
+ customHfGpuType?: string;
37
+ scaffoldRepo: boolean;
38
+ createGithubRepo: boolean;
39
+ runDeployment: boolean;
40
+ dryRun: boolean;
41
+ }
42
+ export interface CollectOptions {
43
+ dryRun?: boolean;
44
+ /** Preset values to skip prompts for. Values here override defaults
45
+ * and skip the corresponding prompt entirely. */
46
+ presets?: Partial<ProjectConfig>;
47
+ /** Non-interactive mode: any missing value falls back to its
48
+ * default if one exists, else throws. */
49
+ nonInteractive?: boolean;
50
+ }
51
+ export declare function collectProjectConfig(options: CollectOptions): Promise<ProjectConfig>;
52
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,KAAK,CAAC;AAC9C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC;AACxE,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,GAAG,WAAW,CAAC;AAElE,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzF,MAAM,MAAM,SAAS,GACjB,eAAe,GACf,WAAW,GACX,mBAAmB,GACnB,oBAAoB,GACpB,WAAW,CAAC;AAEhB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAElB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB;;uDAEmD;IACnD,eAAe,EAAE,SAAS,EAAE,CAAC;IAC7B;;;4CAGwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;CACjB;AAyBD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;sDACkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACjC;8CAC0C;IAC1C,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAoW1F"}
@@ -0,0 +1,313 @@
1
+ import { checkbox, confirm, input, select } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import { getCoolifyConfig, getMlServices } from "./config.js";
4
+ import { CoolifyApi } from "./utils/coolify-api.js";
5
+ import { parseDomain, validateDomain, validateProjectName } from "./utils/validate.js";
6
+ // ---------------------------------------------------------------------------
7
+ // Main prompt flow
8
+ // ---------------------------------------------------------------------------
9
+ /** If a preset value is provided, use it. In non-interactive mode,
10
+ * fall back to the provided default (or throw if none). Otherwise
11
+ * run the interactive prompt. */
12
+ async function presetOrPrompt(preset, nonInteractive, prompt, fallback) {
13
+ if (preset !== undefined)
14
+ return preset;
15
+ if (nonInteractive) {
16
+ if (fallback !== undefined)
17
+ return fallback;
18
+ throw new Error("Required value missing in --config / flags and no default is available. Re-run without --yes to be prompted.");
19
+ }
20
+ return prompt();
21
+ }
22
+ export async function collectProjectConfig(options) {
23
+ const presets = options.presets ?? {};
24
+ const nonInteractive = options.nonInteractive ?? false;
25
+ if (!nonInteractive) {
26
+ console.log(chalk.bold("\n ── New Project ─────────────────────────────────────────────\n"));
27
+ }
28
+ // Project basics
29
+ const name = await presetOrPrompt(presets.name, nonInteractive, () => input({ message: "Project name:", validate: (v) => validateProjectName(v) }));
30
+ // Validate preset name since we skipped the prompt's built-in check.
31
+ const nameErr = validateProjectName(name);
32
+ if (nameErr !== true)
33
+ throw new Error(`--name invalid: ${nameErr}`);
34
+ const domain = await presetOrPrompt(presets.domain, nonInteractive, () => input({
35
+ message: "Domain:",
36
+ default: `${name}.ricos.site`,
37
+ validate: (v) => validateDomain(v),
38
+ }), `${name}.ricos.site`);
39
+ const domainErr = validateDomain(domain);
40
+ if (domainErr !== true)
41
+ throw new Error(`--domain invalid: ${domainErr}`);
42
+ const { baseDomain, subdomain } = parseDomain(domain);
43
+ // Deploy target. Non-interactive default is "new" rather than
44
+ // "existing": "existing" has no sensible default (it needs a real
45
+ // serverId + serverIp that only make sense with a configured
46
+ // Coolify), while "new" provisions a Hetzner server with defaults
47
+ // (cpx21, nbg1). Users who want existing pass `--deploy-target
48
+ // existing` + serverId/serverIp via --config.
49
+ const deployTarget = await presetOrPrompt(presets.deployTarget, nonInteractive, selectDeployTarget, "new");
50
+ let serverId;
51
+ let serverIp;
52
+ let serverSize;
53
+ let serverLocation;
54
+ if (deployTarget === "existing") {
55
+ if (presets.serverId !== undefined && presets.serverIp !== undefined) {
56
+ serverId = presets.serverId;
57
+ serverIp = presets.serverIp;
58
+ }
59
+ else if (nonInteractive) {
60
+ throw new Error("--deploy-target existing requires serverId + serverIp in --config (or remove --yes to pick interactively).");
61
+ }
62
+ else {
63
+ const server = await selectExistingServer();
64
+ serverId = server.id;
65
+ serverIp = server.ip;
66
+ }
67
+ }
68
+ else {
69
+ serverSize = await presetOrPrompt(presets.serverSize, nonInteractive, () => select({
70
+ message: "Server size:",
71
+ choices: [
72
+ { name: "cpx21 — 3 vCPU / 4 GB (€4.35/mo)", value: "cpx21" },
73
+ { name: "cpx31 — 4 vCPU / 8 GB (€8.10/mo)", value: "cpx31" },
74
+ { name: "cpx41 — 8 vCPU / 16 GB (€15.90/mo)", value: "cpx41" },
75
+ ],
76
+ }), "cpx21");
77
+ serverLocation = await presetOrPrompt(presets.serverLocation, nonInteractive, () => select({
78
+ message: "Server location:",
79
+ choices: [
80
+ { name: "Nuremberg (nbg1) — Central Europe", value: "nbg1" },
81
+ { name: "Falkenstein (fsn1) — Eastern Germany", value: "fsn1" },
82
+ { name: "Helsinki (hel1) — Northern Europe", value: "hel1" },
83
+ ],
84
+ }), "nbg1");
85
+ }
86
+ // Features
87
+ const features = await presetOrPrompt(presets.features, nonInteractive, () => checkbox({
88
+ message: "Features:",
89
+ choices: [
90
+ { name: "WebSocket/realtime (includes Redis)", value: "websocket" },
91
+ { name: "Stripe billing", value: "stripe" },
92
+ { name: "S3 file storage", value: "s3" },
93
+ { name: "Analytics (OpenPanel) + Error tracking (GlitchTip)", value: "analytics" },
94
+ { name: "Desktop app (Electron + itch.io release)", value: "desktop" },
95
+ { name: "Mobile app (Capacitor / iOS + Android)", value: "mobile" },
96
+ ],
97
+ }), []);
98
+ // S3 provider (if selected)
99
+ let s3Provider = "none";
100
+ let s3ExistingEndpoint;
101
+ let s3ExistingBucket;
102
+ let s3ExistingAccessKey;
103
+ let s3ExistingSecretKey;
104
+ let s3ExistingRegion;
105
+ if (features.includes("s3")) {
106
+ s3Provider = await presetOrPrompt(presets.s3Provider, nonInteractive, () => select({
107
+ message: "S3 storage provider:",
108
+ choices: [
109
+ { name: "Hetzner Object Storage", value: "hetzner" },
110
+ { name: "Cloudflare R2 (zero egress)", value: "r2" },
111
+ { name: "AWS S3", value: "aws" },
112
+ { name: "Use existing bucket", value: "existing" },
113
+ ],
114
+ }), "hetzner");
115
+ if (s3Provider === "existing") {
116
+ // Existing-bucket credentials are never defaulted — these are
117
+ // secrets and infrastructure coords that must be explicit.
118
+ if (nonInteractive && (!presets.s3ExistingEndpoint || !presets.s3ExistingBucket)) {
119
+ throw new Error("--s3-provider existing requires s3ExistingEndpoint/Bucket/AccessKey/SecretKey/Region in --config.");
120
+ }
121
+ s3ExistingEndpoint = await presetOrPrompt(presets.s3ExistingEndpoint, nonInteractive, () => input({ message: "S3 endpoint URL:" }));
122
+ s3ExistingBucket = await presetOrPrompt(presets.s3ExistingBucket, nonInteractive, () => input({ message: "S3 bucket name:" }));
123
+ s3ExistingAccessKey = await presetOrPrompt(presets.s3ExistingAccessKey, nonInteractive, () => input({ message: "S3 access key:" }));
124
+ s3ExistingSecretKey = await presetOrPrompt(presets.s3ExistingSecretKey, nonInteractive, () => input({ message: "S3 secret key:" }));
125
+ s3ExistingRegion = await presetOrPrompt(presets.s3ExistingRegion, nonInteractive, () => input({ message: "S3 region:", default: "us-east-1" }), "us-east-1");
126
+ }
127
+ }
128
+ // ML services
129
+ const mlServices = await presetOrPrompt(presets.mlServices, nonInteractive, () => checkbox({
130
+ message: "ML services:",
131
+ choices: [
132
+ { name: "3D model extraction (photo → GLB)", value: "3d-extraction" },
133
+ { name: "Subtitle generation (audio/video → SRT)", value: "subtitles" },
134
+ { name: "Image recognition", value: "image-recognition" },
135
+ { name: "Background removal", value: "background-removal" },
136
+ { name: "Custom HuggingFace model", value: "custom-hf" },
137
+ ],
138
+ }), []);
139
+ let gpuPlatform;
140
+ let customHfModelId;
141
+ let customHfGpuType;
142
+ const forceRedeploy = new Set();
143
+ if (mlServices.length > 0) {
144
+ // Check for existing services in registry
145
+ const registry = getMlServices();
146
+ const reusable = mlServices.filter((s) => registry[s]);
147
+ if (reusable.length > 0) {
148
+ console.log(chalk.dim(`\n Found existing ML services in registry:`));
149
+ for (const svc of reusable) {
150
+ const entry = registry[svc];
151
+ console.log(chalk.dim(` ${svc}: ${entry.endpoint} (${entry.platform}, deployed ${entry.deployedAt})`));
152
+ }
153
+ // Let the user force re-deploy — covers stale entries (service
154
+ // was deleted upstream) or platform changes.
155
+ const toRedeploy = await checkbox({
156
+ message: "Redeploy any of these (leave empty to reuse all)?",
157
+ choices: reusable.map((s) => ({ name: s, value: s })),
158
+ });
159
+ for (const s of toRedeploy)
160
+ forceRedeploy.add(s);
161
+ }
162
+ const needsDeploy = mlServices.filter((s) => !registry[s] || forceRedeploy.has(s));
163
+ if (needsDeploy.length > 0) {
164
+ gpuPlatform = await presetOrPrompt(presets.gpuPlatform, nonInteractive, () => select({
165
+ message: "GPU platform for new ML services:",
166
+ choices: [
167
+ {
168
+ name: "Modal (recommended — best DX, $30/mo free, 2-4s cold starts)",
169
+ value: "modal",
170
+ },
171
+ { name: "RunPod Serverless (cheapest, Docker-native)", value: "runpod" },
172
+ { name: "HuggingFace Inference Endpoints (simplest for HF models)", value: "hf" },
173
+ { name: "Replicate (via Cog, good for sharing)", value: "replicate" },
174
+ ],
175
+ }), "modal");
176
+ }
177
+ if (mlServices.includes("custom-hf")) {
178
+ customHfModelId = await presetOrPrompt(presets.customHfModelId, nonInteractive, () => input({ message: "HuggingFace model ID (e.g. meta-llama/Llama-3-8B):" }));
179
+ customHfGpuType = await presetOrPrompt(presets.customHfGpuType, nonInteractive, () => select({
180
+ message: "GPU type for custom model:",
181
+ choices: [
182
+ { name: "T4 (16GB VRAM, cheapest)", value: "T4" },
183
+ { name: "A10G (24GB VRAM, good balance)", value: "A10G" },
184
+ { name: "A100 (40/80GB VRAM, large models)", value: "A100" },
185
+ { name: "H100 (80GB VRAM, fastest)", value: "H100" },
186
+ ],
187
+ }), "A10G");
188
+ }
189
+ }
190
+ // Scaffold options
191
+ const scaffoldRepo = await presetOrPrompt(presets.scaffoldRepo, nonInteractive, () => confirm({ message: "Scaffold app repo?", default: true }), true);
192
+ let createGithubRepo = false;
193
+ if (scaffoldRepo) {
194
+ createGithubRepo = await presetOrPrompt(presets.createGithubRepo, nonInteractive, () => confirm({
195
+ message: "Create GitHub remote repo?",
196
+ default: true,
197
+ }), true);
198
+ }
199
+ const runDeployment = options.dryRun
200
+ ? false
201
+ : await presetOrPrompt(presets.runDeployment, nonInteractive, () => confirm({
202
+ message: "Run deployment now?",
203
+ default: true,
204
+ }), true);
205
+ // Production env values. Anything not supplied gets a plaintext
206
+ // CHANGE_ME_<KEY> placeholder the user can encrypt later with
207
+ // `dotenvx set`. In non-interactive mode we only take presets —
208
+ // don't prompt. BETTER_AUTH_SECRET is auto-generated by the
209
+ // dotenvx seed helper, not prompted.
210
+ const envValues = { ...(presets.envValues ?? {}) };
211
+ if (!nonInteractive) {
212
+ if (scaffoldRepo) {
213
+ console.log(chalk.bold("\n ── Production env (press enter to leave as CHANGE_ME) ──────"));
214
+ const askOptional = async (key, label) => {
215
+ if (envValues[key])
216
+ return;
217
+ const v = await input({
218
+ message: `${label} [${key}]:`,
219
+ default: "",
220
+ });
221
+ if (v.trim())
222
+ envValues[key] = v.trim();
223
+ };
224
+ await askOptional("MONGODB_URI", "MongoDB URI");
225
+ await askOptional("BETTER_AUTH_URL", "Auth URL (https://api.<domain>)");
226
+ await askOptional("FRONTEND_URL", "Frontend URL (https://<domain>)");
227
+ if (features.includes("stripe")) {
228
+ await askOptional("STRIPE_SECRET_KEY", "Stripe secret key (sk_live_...)");
229
+ await askOptional("STRIPE_WEBHOOK_SECRET", "Stripe webhook secret (whsec_...)");
230
+ }
231
+ if (features.includes("analytics")) {
232
+ await askOptional("SENTRY_DSN", "Sentry DSN");
233
+ }
234
+ if (features.includes("s3") && s3Provider === "existing") {
235
+ await askOptional("S3_ENDPOINT", "S3 endpoint");
236
+ await askOptional("S3_BUCKET_NAME", "S3 bucket");
237
+ await askOptional("AWS_ACCESS_KEY_ID", "AWS access key id");
238
+ await askOptional("AWS_SECRET_ACCESS_KEY", "AWS secret access key");
239
+ }
240
+ }
241
+ }
242
+ return {
243
+ name,
244
+ domain,
245
+ baseDomain,
246
+ subdomain,
247
+ deployTarget,
248
+ serverId,
249
+ serverIp,
250
+ serverSize,
251
+ serverLocation,
252
+ features,
253
+ s3Provider,
254
+ s3ExistingEndpoint,
255
+ s3ExistingBucket,
256
+ s3ExistingAccessKey,
257
+ s3ExistingSecretKey,
258
+ s3ExistingRegion,
259
+ mlServices,
260
+ forceRedeployMl: [...forceRedeploy],
261
+ gpuPlatform,
262
+ customHfModelId,
263
+ customHfGpuType,
264
+ scaffoldRepo,
265
+ createGithubRepo,
266
+ runDeployment,
267
+ envValues,
268
+ dryRun: options.dryRun || false,
269
+ };
270
+ }
271
+ // ---------------------------------------------------------------------------
272
+ // Helpers
273
+ // ---------------------------------------------------------------------------
274
+ async function selectDeployTarget() {
275
+ return select({
276
+ message: "Deploy to:",
277
+ choices: [
278
+ { name: "Existing Coolify server", value: "existing" },
279
+ { name: "New Hetzner server", value: "new" },
280
+ ],
281
+ });
282
+ }
283
+ async function selectExistingServer() {
284
+ const coolifyConfig = await getCoolifyConfig();
285
+ if (!coolifyConfig?.url || !coolifyConfig?.token) {
286
+ throw new Error("Coolify is not configured. Run hatchkit init first.");
287
+ }
288
+ // Use cached server list if available, otherwise fetch live
289
+ let servers;
290
+ if (coolifyConfig.serversCache && coolifyConfig.serversCache.length > 0) {
291
+ servers = coolifyConfig.serversCache;
292
+ }
293
+ else {
294
+ const api = new CoolifyApi({ url: coolifyConfig.url, token: coolifyConfig.token });
295
+ servers = await api.listServers();
296
+ }
297
+ if (servers.length === 0) {
298
+ throw new Error("No servers found in Coolify. Create one first or choose 'New Hetzner server'.");
299
+ }
300
+ if (servers.length === 1) {
301
+ console.log(chalk.dim(` Auto-selected server: ${servers[0].name} (${servers[0].ip})`));
302
+ return servers[0];
303
+ }
304
+ const serverId = await select({
305
+ message: "Select server:",
306
+ choices: servers.map((s) => ({
307
+ name: `${s.name} (${s.ip})`,
308
+ value: s.id,
309
+ })),
310
+ });
311
+ return servers.find((s) => s.id === serverId);
312
+ }
313
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface GlitchtipClient {
2
+ projectSlug: string;
3
+ dsn: string;
4
+ }
5
+ export declare function provisionGlitchtipClient(clientName: string): Promise<GlitchtipClient>;
6
+ //# sourceMappingURL=glitchtip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glitchtip.d.ts","sourceRoot":"","sources":["../../src/provision/glitchtip.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAwC3F"}
@@ -0,0 +1,46 @@
1
+ /*
2
+ * GlitchTip provisioning — creates a project inside an existing
3
+ * self-hosted GlitchTip org and returns the public DSN.
4
+ *
5
+ * GlitchTip exposes a Sentry-compatible API:
6
+ * POST /api/0/teams/{org}/{team}/projects/ -> create project
7
+ * GET /api/0/projects/{org}/{project}/keys/ -> list client keys (DSN)
8
+ *
9
+ * Auth is a personal auth token in `Authorization: Bearer`.
10
+ */
11
+ import { ensureGlitchtip } from "../config.js";
12
+ export async function provisionGlitchtipClient(clientName) {
13
+ const cfg = await ensureGlitchtip();
14
+ const { url, organizationSlug, teamSlug, token } = cfg;
15
+ if (!organizationSlug || !teamSlug) {
16
+ throw new Error("GlitchTip config is missing organization/team slug. Re-run `hatchkit config add glitchtip`.");
17
+ }
18
+ const createRes = await fetch(`${url}/api/0/teams/${organizationSlug}/${teamSlug}/projects/`, {
19
+ method: "POST",
20
+ headers: {
21
+ Authorization: `Bearer ${token}`,
22
+ "Content-Type": "application/json",
23
+ },
24
+ body: JSON.stringify({
25
+ name: clientName,
26
+ slug: clientName,
27
+ platform: "javascript-node",
28
+ }),
29
+ });
30
+ if (!createRes.ok && createRes.status !== 409) {
31
+ throw new Error(`GlitchTip create project failed: HTTP ${createRes.status} ${await createRes.text()}`);
32
+ }
33
+ // If 409, the project already exists — fall through and fetch its key.
34
+ const keysRes = await fetch(`${url}/api/0/projects/${organizationSlug}/${clientName}/keys/`, {
35
+ headers: { Authorization: `Bearer ${token}` },
36
+ });
37
+ if (!keysRes.ok) {
38
+ throw new Error(`GlitchTip fetch keys failed: HTTP ${keysRes.status} ${await keysRes.text()}`);
39
+ }
40
+ const keys = (await keysRes.json());
41
+ if (keys.length === 0) {
42
+ throw new Error(`GlitchTip project '${clientName}' has no client keys`);
43
+ }
44
+ return { projectSlug: clientName, dsn: keys[0].dsn.public };
45
+ }
46
+ //# sourceMappingURL=glitchtip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glitchtip.js","sourceRoot":"","sources":["../../src/provision/glitchtip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAO/C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,UAAkB;IAC/D,MAAM,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;IACpC,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IACvD,IAAI,CAAC,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,gBAAgB,gBAAgB,IAAI,QAAQ,YAAY,EAAE;QAC5F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,iBAAiB;SAC5B,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CACb,yCAAyC,SAAS,CAAC,MAAM,IAAI,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,CACtF,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,mBAAmB,gBAAgB,IAAI,UAAU,QAAQ,EAAE;QAC3F,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;KAC9C,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,CAAC,MAAM,IAAI,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAuC,CAAC;IAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,sBAAsB,UAAU,sBAAsB,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type ProvisionService = "glitchtip" | "openpanel" | "resend";
2
+ export interface ProvisionOptions {
3
+ baseName: string;
4
+ services: ProvisionService[];
5
+ /** Optional pre-selected Resend domain id, skipping the picker. */
6
+ resendDomainId?: string;
7
+ }
8
+ export declare function runProvision(opts: ProvisionOptions): Promise<void>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provision/index.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAOD,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsExE"}
@@ -0,0 +1,108 @@
1
+ /*
2
+ * Provision orchestrator — given a base name like "raptor-runner",
3
+ * creates `-dev` and `-prod` clients in each selected service
4
+ * (GlitchTip / OpenPanel / Resend) and prints an env block ready to
5
+ * paste into an existing project.
6
+ *
7
+ * Also persists the resulting env files under
8
+ * ~/<conf-dir>/provisioned/<name>.{dev,prod}.env
9
+ * so the output can be retrieved later without re-hitting the APIs.
10
+ */
11
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
12
+ import { dirname, join } from "node:path";
13
+ import { select } from "@inquirer/prompts";
14
+ import chalk from "chalk";
15
+ import { getConfigPath } from "../config.js";
16
+ import { validateProjectName } from "../utils/validate.js";
17
+ import { provisionGlitchtipClient } from "./glitchtip.js";
18
+ import { provisionOpenpanelClient } from "./openpanel.js";
19
+ import { listResendDomains, provisionResendClient } from "./resend.js";
20
+ export async function runProvision(opts) {
21
+ const nameCheck = validateProjectName(opts.baseName);
22
+ if (nameCheck !== true)
23
+ throw new Error(`Invalid base name: ${nameCheck}`);
24
+ // Resend domain: pick once, reused across dev + prod.
25
+ let resendDomainId = opts.resendDomainId;
26
+ if (opts.services.includes("resend") && !resendDomainId) {
27
+ const domains = await listResendDomains();
28
+ const verified = domains.filter((d) => d.status === "verified");
29
+ if (verified.length === 0) {
30
+ console.log(chalk.yellow(" No verified Resend domains found — API keys will be created without a domain restriction (account-wide)."));
31
+ }
32
+ else {
33
+ const picked = await select({
34
+ message: "Resend sending domain (both keys will be scoped to it):",
35
+ choices: [
36
+ ...verified.map((d) => ({ name: d.name, value: d.id })),
37
+ { name: "— no domain restriction (account-wide) —", value: "" },
38
+ ],
39
+ });
40
+ if (picked)
41
+ resendDomainId = picked;
42
+ }
43
+ }
44
+ const sections = [];
45
+ for (const env of ["dev", "prod"]) {
46
+ const clientName = `${opts.baseName}-${env}`;
47
+ console.log(chalk.bold(`\n ── ${clientName} ──────────────────────────────────────────\n`));
48
+ const lines = [];
49
+ if (opts.services.includes("glitchtip")) {
50
+ const res = await withSpinner(`GlitchTip: creating project ${clientName}`, () => provisionGlitchtipClient(clientName));
51
+ lines.push(...renderGlitchtipEnv(res));
52
+ }
53
+ if (opts.services.includes("openpanel")) {
54
+ const res = await withSpinner(`OpenPanel: creating client ${clientName}`, () => provisionOpenpanelClient(clientName));
55
+ lines.push(...renderOpenpanelEnv(res));
56
+ }
57
+ if (opts.services.includes("resend")) {
58
+ const res = await withSpinner(`Resend: creating restricted API key ${clientName}`, () => provisionResendClient(clientName, resendDomainId));
59
+ lines.push(...renderResendEnv(res));
60
+ }
61
+ sections.push({ env, lines });
62
+ }
63
+ const outDir = join(dirname(getConfigPath()), "provisioned");
64
+ if (!existsSync(outDir))
65
+ mkdirSync(outDir, { recursive: true });
66
+ console.log(chalk.bold("\n ── Env blocks (copy-paste into the corresponding project) ─\n"));
67
+ for (const section of sections) {
68
+ const banner = `# --- ${opts.baseName} / ${section.env} ---`;
69
+ console.log(chalk.cyan(banner));
70
+ for (const line of section.lines)
71
+ console.log(line);
72
+ console.log();
73
+ const path = join(outDir, `${opts.baseName}.${section.env}.env`);
74
+ writeFileSync(path, `${banner}\n${section.lines.join("\n")}\n`, "utf-8");
75
+ console.log(chalk.dim(` saved: ${path}`));
76
+ }
77
+ console.log();
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // Helpers
81
+ // ---------------------------------------------------------------------------
82
+ async function withSpinner(label, fn) {
83
+ const ora = (await import("ora")).default;
84
+ const spinner = ora(label).start();
85
+ try {
86
+ const res = await fn();
87
+ spinner.succeed(label);
88
+ return res;
89
+ }
90
+ catch (err) {
91
+ spinner.fail(label);
92
+ throw err;
93
+ }
94
+ }
95
+ function renderGlitchtipEnv(c) {
96
+ return [`GLITCHTIP_DSN=${c.dsn}`];
97
+ }
98
+ function renderOpenpanelEnv(c) {
99
+ return [
100
+ `OPENPANEL_API_URL=${c.apiUrl}`,
101
+ `OPENPANEL_CLIENT_ID=${c.clientId}`,
102
+ `OPENPANEL_CLIENT_SECRET=${c.clientSecret}`,
103
+ ];
104
+ }
105
+ function renderResendEnv(c) {
106
+ return [`RESEND_API_KEY=${c.apiKey}`];
107
+ }
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provision/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface OpenpanelClient {
2
+ projectName: string;
3
+ clientId: string;
4
+ clientSecret: string;
5
+ apiUrl: string;
6
+ }
7
+ export declare function provisionOpenpanelClient(clientName: string): Promise<OpenpanelClient>;
8
+ //# sourceMappingURL=openpanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openpanel.d.ts","sourceRoot":"","sources":["../../src/provision/openpanel.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA2D3F"}