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,4 @@
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>;
4
+ //# sourceMappingURL=coolify.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,20 @@
1
+ import { join } from "node:path";
2
+ import chalk from "chalk";
3
+ 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`);
9
+ console.log(chalk.bold("\n ── Coolify Setup ─────────────────────────────────────────\n"));
10
+ const env = {};
11
+ if (coolifyConfig?.token) {
12
+ env.COOLIFY_TOKEN = coolifyConfig.token;
13
+ }
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");
17
+ }
18
+ console.log(chalk.green("\n ✓ Coolify app stack created"));
19
+ }
20
+ //# sourceMappingURL=coolify.js.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ import type { ProjectConfig } from "../prompts.js";
2
+ /** Initialize git repo, create GitHub remote, and push. */
3
+ export declare function setupGitHub(config: ProjectConfig, appDir: string): Promise<string | null>;
4
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,39 @@
1
+ import chalk from "chalk";
2
+ import { exec } from "../utils/exec.js";
3
+ /** Initialize git repo, create GitHub remote, and push. */
4
+ export async function setupGitHub(config, appDir) {
5
+ console.log(chalk.bold("\n ── GitHub ────────────────────────────────────────────────\n"));
6
+ // Git init
7
+ await exec("git", ["init"], {
8
+ cwd: appDir,
9
+ spinner: "Initializing git repo...",
10
+ });
11
+ // Initial commit
12
+ await exec("git", ["add", "-A"], { cwd: appDir });
13
+ await exec("git", ["commit", "-m", "Initial scaffold"], {
14
+ cwd: appDir,
15
+ spinner: "Creating initial commit...",
16
+ });
17
+ if (!config.createGithubRepo) {
18
+ console.log(chalk.dim(" Skipped GitHub remote creation."));
19
+ return null;
20
+ }
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}...` });
23
+ if (createResult.exitCode !== 0) {
24
+ console.log(chalk.yellow(" Could not create GitHub repo. Your local git repo is ready;"));
25
+ console.log(chalk.yellow(` push it manually once the remote exists:`));
26
+ console.log(chalk.dim(` cd ${appDir}`));
27
+ console.log(chalk.dim(` gh repo create ${config.name} --private --source=. --push`));
28
+ console.log(chalk.yellow(' Note: the Coolify env will have GITHUB_REPO_URL="" — update it after pushing.'));
29
+ return null;
30
+ }
31
+ // Get the repo URL
32
+ const urlResult = await exec("gh", ["repo", "view", "--json", "url", "-q", ".url"], {
33
+ cwd: appDir,
34
+ });
35
+ const repoUrl = urlResult.stdout.trim();
36
+ console.log(chalk.green(` ✓ GitHub repo: ${repoUrl}`));
37
+ return repoUrl;
38
+ }
39
+ //# sourceMappingURL=github.js.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ import type { GpuPlatform, MlService } from "../prompts.js";
2
+ /** Deploy ML services that don't exist in the registry. */
3
+ export declare function deployMlServices(services: MlService[], platform: GpuPlatform, repoRoot: string, customHfModelId?: string): Promise<Record<string, string>>;
4
+ //# sourceMappingURL=gpu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu.d.ts","sourceRoot":"","sources":["../../src/deploy/gpu.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG5D,2DAA2D;AAC3D,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,SAAS,EAAE,EACrB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAoDjC"}
@@ -0,0 +1,97 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { ensureGpuProvider, registerMlService } from "../config.js";
4
+ import { exec } from "../utils/exec.js";
5
+ /** Deploy ML services that don't exist in the registry. */
6
+ export async function deployMlServices(services, platform, repoRoot, customHfModelId) {
7
+ if (services.length === 0)
8
+ return {};
9
+ console.log(chalk.bold("\n ── ML Service Deployment ─────────────────────────────────\n"));
10
+ // Ensure GPU provider is configured
11
+ await ensureGpuProvider(platform);
12
+ const endpoints = {};
13
+ for (const service of services) {
14
+ const spinner = ora(`Deploying ${service} to ${platform}...`).start();
15
+ try {
16
+ let endpoint;
17
+ switch (platform) {
18
+ case "modal":
19
+ endpoint = await deployToModal(service, repoRoot, customHfModelId);
20
+ break;
21
+ case "runpod":
22
+ endpoint = await deployToRunpod(service, repoRoot, customHfModelId);
23
+ break;
24
+ case "hf":
25
+ endpoint = await deployToHf(service, customHfModelId);
26
+ break;
27
+ case "replicate":
28
+ endpoint = await deployToReplicate(service, repoRoot, customHfModelId);
29
+ break;
30
+ default:
31
+ throw new Error(`Unsupported GPU platform: ${platform}`);
32
+ }
33
+ spinner.succeed(`${service} deployed: ${endpoint}`);
34
+ endpoints[service] = endpoint;
35
+ // Register in the shared service registry
36
+ registerMlService(service, {
37
+ platform,
38
+ endpoint,
39
+ deployedAt: new Date().toISOString().split("T")[0],
40
+ gpu: "A10G",
41
+ model: service === "custom-hf" ? customHfModelId || "custom" : service,
42
+ });
43
+ }
44
+ catch (error) {
45
+ spinner.fail(`Failed to deploy ${service}`);
46
+ console.error(chalk.red(` ${error}`));
47
+ // Continue with other services
48
+ }
49
+ }
50
+ return endpoints;
51
+ }
52
+ async function deployToModal(service, repoRoot, _customHfModelId) {
53
+ const serviceDir = `${repoRoot}/ml/${service}/modal`;
54
+ const result = await exec("modal", ["deploy", "pipeline.py"], {
55
+ cwd: serviceDir,
56
+ });
57
+ if (result.exitCode !== 0) {
58
+ throw new Error(`Modal deploy failed: ${result.stderr}`);
59
+ }
60
+ // Parse endpoint URL from Modal output
61
+ const urlMatch = result.stdout.match(/https:\/\/\S+\.modal\.run/);
62
+ return urlMatch?.[0] || `https://your-org--${service}-api.modal.run`;
63
+ }
64
+ async function deployToRunpod(service, repoRoot, _customHfModelId) {
65
+ // RunPod requires: docker build → push → create endpoint via API
66
+ // For now, return a placeholder
67
+ console.log(chalk.yellow(" RunPod deployment requires manual Docker build + push."));
68
+ console.log(chalk.dim(` See: ${repoRoot}/ml/${service}/runpod/`));
69
+ return `https://api.runpod.ai/v2/${service}/runsync`;
70
+ }
71
+ async function deployToHf(service, customHfModelId) {
72
+ // HF Inference Endpoints: single API call
73
+ const modelId = customHfModelId || getDefaultModelId(service);
74
+ console.log(chalk.dim(` Creating HF Inference Endpoint for ${modelId}...`));
75
+ console.log(chalk.yellow(" Note: HF Endpoint creation via API requires huggingface_hub Python package."));
76
+ return `https://api-inference.huggingface.co/models/${modelId}`;
77
+ }
78
+ async function deployToReplicate(service, repoRoot, _customHfModelId) {
79
+ const serviceDir = `${repoRoot}/ml/${service}/replicate`;
80
+ console.log(chalk.yellow(` Replicate deployment: run 'cog push' in ${serviceDir}`));
81
+ return `https://api.replicate.com/v1/predictions`;
82
+ }
83
+ function getDefaultModelId(service) {
84
+ switch (service) {
85
+ case "3d-extraction":
86
+ return "stabilityai/stable-fast-3d";
87
+ case "subtitles":
88
+ return "openai/whisper-large-v3";
89
+ case "image-recognition":
90
+ return "openai/clip-vit-large-patch14";
91
+ case "background-removal":
92
+ return "briaai/RMBG-2.0";
93
+ default:
94
+ return "unknown";
95
+ }
96
+ }
97
+ //# sourceMappingURL=gpu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu.js","sourceRoot":"","sources":["../../src/deploy/gpu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** Print the private key for a project to stdout. */
2
+ export declare function showProjectKey(projectName: string): Promise<void>;
3
+ /** Push DOTENV_PRIVATE_KEY_PRODUCTION onto a Coolify application.
4
+ * Resolves the application by name, defaulting to `<project>-web`
5
+ * which matches scaffoldInfra's naming convention. */
6
+ export declare function pushProjectKeyToCoolify(projectName: string, options?: {
7
+ appName?: string;
8
+ }): Promise<void>;
9
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/deploy/keys.ts"],"names":[],"mappings":"AAoBA,qDAAqD;AACrD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvE;AAED;;uDAEuD;AACvD,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
@@ -0,0 +1,73 @@
1
+ /*
2
+ * `hatchkit keys` subcommands — retrieve + push the per-project
3
+ * dotenvx private key that lives in the OS keychain.
4
+ *
5
+ * keys show <project> Print the DOTENV_PRIVATE_KEY_PRODUCTION for
6
+ * the named project so the user can paste it
7
+ * into Coolify / a CI secret / etc.
8
+ *
9
+ * keys push <project> Upsert DOTENV_PRIVATE_KEY_PRODUCTION as an
10
+ * env var on the project's Coolify
11
+ * application. Requires Coolify to already be
12
+ * configured and the application to exist.
13
+ */
14
+ import chalk from "chalk";
15
+ import ora from "ora";
16
+ import { getCoolifyConfig } from "../config.js";
17
+ import { CoolifyApi } from "../utils/coolify-api.js";
18
+ import { SECRET_KEYS, getSecret } from "../utils/secrets.js";
19
+ /** Print the private key for a project to stdout. */
20
+ export async function showProjectKey(projectName) {
21
+ const key = await getSecret(SECRET_KEYS.dotenvxPrivateKey(projectName));
22
+ if (!key) {
23
+ console.error(chalk.red(` No dotenvx key found for project "${projectName}" in the keychain.`));
24
+ console.error(chalk.dim(" This usually means the project was scaffolded before dotenvx integration, or `config reset` cleared the keychain."));
25
+ process.exit(1);
26
+ }
27
+ // Print plainly so it's easy to pipe into pbcopy etc. No chalk
28
+ // around the value — chalk adds ANSI codes that corrupt the key
29
+ // when redirected.
30
+ process.stdout.write(`${key}\n`);
31
+ }
32
+ /** Push DOTENV_PRIVATE_KEY_PRODUCTION onto a Coolify application.
33
+ * Resolves the application by name, defaulting to `<project>-web`
34
+ * which matches scaffoldInfra's naming convention. */
35
+ export async function pushProjectKeyToCoolify(projectName, options = {}) {
36
+ const key = await getSecret(SECRET_KEYS.dotenvxPrivateKey(projectName));
37
+ if (!key) {
38
+ throw new Error(`No dotenvx key in keychain for project "${projectName}". Was it scaffolded with dotenvx integration?`);
39
+ }
40
+ const coolify = await getCoolifyConfig();
41
+ if (!coolify) {
42
+ throw new Error("Coolify is not configured. Run `hatchkit config add coolify` first.");
43
+ }
44
+ const api = new CoolifyApi({ url: coolify.url, token: coolify.token });
45
+ const appName = options.appName ?? `${projectName}-web`;
46
+ const spinner = ora(`Resolving Coolify app "${appName}"`).start();
47
+ let uuid;
48
+ try {
49
+ const apps = await api.listApplications();
50
+ const match = apps.find((a) => a.name === appName);
51
+ if (!match) {
52
+ spinner.fail(`No Coolify application named "${appName}". Run \`hatchkit create\` with runDeployment first.`);
53
+ throw new Error(`Coolify app not found: ${appName}`);
54
+ }
55
+ uuid = match.uuid;
56
+ spinner.succeed(`Found app ${appName} (${uuid})`);
57
+ }
58
+ catch (err) {
59
+ if (spinner.isSpinning)
60
+ spinner.fail();
61
+ throw err;
62
+ }
63
+ const pushSpinner = ora("Upserting DOTENV_PRIVATE_KEY_PRODUCTION on Coolify").start();
64
+ try {
65
+ await api.setAppEnv(uuid, { DOTENV_PRIVATE_KEY_PRODUCTION: key });
66
+ pushSpinner.succeed("Key pushed to Coolify");
67
+ }
68
+ catch (err) {
69
+ pushSpinner.fail("Coolify env update failed");
70
+ throw err;
71
+ }
72
+ }
73
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/deploy/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ProjectConfig } from "../prompts.js";
2
+ /** Run Terraform for the project. */
3
+ export declare function runTerraform(config: ProjectConfig, repoRoot: string): Promise<void>;
4
+ //# sourceMappingURL=terraform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.d.ts","sourceRoot":"","sources":["../../src/deploy/terraform.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,qCAAqC;AACrC,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkEzF"}
@@ -0,0 +1,55 @@
1
+ import { join } from "node:path";
2
+ import chalk from "chalk";
3
+ import { getDnsConfig, getHetznerToken, getS3Config } from "../config.js";
4
+ import { exec, execStream } from "../utils/exec.js";
5
+ /** Run Terraform for the project. */
6
+ export async function runTerraform(config, repoRoot) {
7
+ const hetznerToken = await getHetznerToken();
8
+ const dnsConfig = await getDnsConfig();
9
+ const stackDir = config.deployTarget === "new"
10
+ ? join(repoRoot, "terraform", "stacks", "node-realtime")
11
+ : join(repoRoot, "terraform", "stacks", "dns-only");
12
+ const tfvarsFile = join(stackDir, `${config.name}.tfvars`);
13
+ // Build env vars for Terraform
14
+ const env = {};
15
+ if (hetznerToken) {
16
+ env.TF_VAR_hcloud_token = hetznerToken;
17
+ }
18
+ if (dnsConfig?.provider === "inwx") {
19
+ env.TF_VAR_inwx_username = dnsConfig.username || "";
20
+ env.TF_VAR_inwx_password = dnsConfig.password || "";
21
+ }
22
+ if (config.features.includes("s3") &&
23
+ config.s3Provider !== "existing" &&
24
+ config.s3Provider !== "none") {
25
+ const s3 = await getS3Config(config.s3Provider);
26
+ if (s3) {
27
+ env.TF_VAR_s3_access_key = s3.accessKey;
28
+ env.TF_VAR_s3_secret_key = s3.secretKey;
29
+ }
30
+ }
31
+ console.log(chalk.bold("\n ── Terraform ──────────────────────────────────────────────\n"));
32
+ // Init
33
+ const initResult = await exec("terraform", ["init"], {
34
+ cwd: stackDir,
35
+ env,
36
+ spinner: "Initializing Terraform...",
37
+ });
38
+ if (initResult.exitCode !== 0) {
39
+ throw new Error("Terraform init failed");
40
+ }
41
+ // Plan
42
+ console.log(chalk.dim("\n Running terraform plan...\n"));
43
+ const planExitCode = await execStream("terraform", ["plan", `-var-file=${tfvarsFile}`, "-out=tfplan"], { cwd: stackDir, env });
44
+ if (planExitCode !== 0) {
45
+ throw new Error("Terraform plan failed");
46
+ }
47
+ // Apply
48
+ console.log();
49
+ const applyExitCode = await execStream("terraform", ["apply", "tfplan"], { cwd: stackDir, env });
50
+ if (applyExitCode !== 0) {
51
+ throw new Error("Terraform apply failed");
52
+ }
53
+ console.log(chalk.green("\n ✓ Terraform apply complete"));
54
+ }
55
+ //# sourceMappingURL=terraform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../src/deploy/terraform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}