hatchkit 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/completion.d.ts +2 -0
  2. package/dist/completion.d.ts.map +1 -0
  3. package/dist/completion.js +207 -0
  4. package/dist/completion.js.map +1 -0
  5. package/dist/config.d.ts +33 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +439 -127
  8. package/dist/config.js.map +1 -1
  9. package/dist/deploy/coolify-mongo.d.ts +12 -0
  10. package/dist/deploy/coolify-mongo.d.ts.map +1 -0
  11. package/dist/deploy/coolify-mongo.js +109 -0
  12. package/dist/deploy/coolify-mongo.js.map +1 -0
  13. package/dist/deploy/gpu.d.ts +9 -2
  14. package/dist/deploy/gpu.d.ts.map +1 -1
  15. package/dist/deploy/gpu.js +63 -39
  16. package/dist/deploy/gpu.js.map +1 -1
  17. package/dist/deploy/keys.d.ts +6 -2
  18. package/dist/deploy/keys.d.ts.map +1 -1
  19. package/dist/deploy/keys.js +16 -2
  20. package/dist/deploy/keys.js.map +1 -1
  21. package/dist/deploy/pages.d.ts +2 -0
  22. package/dist/deploy/pages.d.ts.map +1 -0
  23. package/dist/deploy/pages.js +537 -0
  24. package/dist/deploy/pages.js.map +1 -0
  25. package/dist/deploy/rename-domain.d.ts +55 -0
  26. package/dist/deploy/rename-domain.d.ts.map +1 -0
  27. package/dist/deploy/rename-domain.js +290 -0
  28. package/dist/deploy/rename-domain.js.map +1 -0
  29. package/dist/deploy/terraform.d.ts.map +1 -1
  30. package/dist/deploy/terraform.js +90 -0
  31. package/dist/deploy/terraform.js.map +1 -1
  32. package/dist/dns.d.ts +7 -0
  33. package/dist/dns.d.ts.map +1 -0
  34. package/dist/dns.js +124 -0
  35. package/dist/dns.js.map +1 -0
  36. package/dist/doctor.d.ts +13 -0
  37. package/dist/doctor.d.ts.map +1 -0
  38. package/dist/doctor.js +368 -0
  39. package/dist/doctor.js.map +1 -0
  40. package/dist/explain.d.ts +4 -0
  41. package/dist/explain.d.ts.map +1 -0
  42. package/dist/explain.js +173 -0
  43. package/dist/explain.js.map +1 -0
  44. package/dist/index.js +521 -61
  45. package/dist/index.js.map +1 -1
  46. package/dist/prompts.d.ts +15 -2
  47. package/dist/prompts.d.ts.map +1 -1
  48. package/dist/prompts.js +52 -7
  49. package/dist/prompts.js.map +1 -1
  50. package/dist/provision/glitchtip.d.ts +3 -0
  51. package/dist/provision/glitchtip.d.ts.map +1 -1
  52. package/dist/provision/glitchtip.js +18 -0
  53. package/dist/provision/glitchtip.js.map +1 -1
  54. package/dist/provision/index.d.ts +26 -0
  55. package/dist/provision/index.d.ts.map +1 -1
  56. package/dist/provision/index.js +435 -60
  57. package/dist/provision/index.js.map +1 -1
  58. package/dist/provision/openpanel.d.ts +7 -0
  59. package/dist/provision/openpanel.d.ts.map +1 -1
  60. package/dist/provision/openpanel.js +113 -48
  61. package/dist/provision/openpanel.js.map +1 -1
  62. package/dist/provision/resend.d.ts +23 -1
  63. package/dist/provision/resend.d.ts.map +1 -1
  64. package/dist/provision/resend.js +62 -1
  65. package/dist/provision/resend.js.map +1 -1
  66. package/dist/provision/write-env.d.ts +31 -0
  67. package/dist/provision/write-env.d.ts.map +1 -0
  68. package/dist/provision/write-env.js +94 -0
  69. package/dist/provision/write-env.js.map +1 -0
  70. package/dist/scaffold/app.js +8 -0
  71. package/dist/scaffold/app.js.map +1 -1
  72. package/dist/scaffold/dotenvx.d.ts.map +1 -1
  73. package/dist/scaffold/dotenvx.js +8 -1
  74. package/dist/scaffold/dotenvx.js.map +1 -1
  75. package/dist/scaffold/infra.d.ts.map +1 -1
  76. package/dist/scaffold/infra.js +18 -1
  77. package/dist/scaffold/infra.js.map +1 -1
  78. package/dist/scaffold/manifest.d.ts +4 -2
  79. package/dist/scaffold/manifest.d.ts.map +1 -1
  80. package/dist/scaffold/manifest.js +1 -1
  81. package/dist/scaffold/manifest.js.map +1 -1
  82. package/dist/scaffold/ml-client.d.ts +9 -2
  83. package/dist/scaffold/ml-client.d.ts.map +1 -1
  84. package/dist/scaffold/ml-client.js +11 -1
  85. package/dist/scaffold/ml-client.js.map +1 -1
  86. package/dist/status.d.ts +30 -0
  87. package/dist/status.d.ts.map +1 -0
  88. package/dist/status.js +169 -0
  89. package/dist/status.js.map +1 -0
  90. package/dist/templates/addons/analytics/sentry.ts.hbs +6 -0
  91. package/dist/templates/base/env.example.hbs +10 -0
  92. package/dist/templates/base/src/config.ts.hbs +24 -4
  93. package/dist/utils/cloudflare-api.d.ts +30 -0
  94. package/dist/utils/cloudflare-api.d.ts.map +1 -0
  95. package/dist/utils/cloudflare-api.js +85 -0
  96. package/dist/utils/cloudflare-api.js.map +1 -0
  97. package/dist/utils/coolify-api.d.ts +47 -1
  98. package/dist/utils/coolify-api.d.ts.map +1 -1
  99. package/dist/utils/coolify-api.js +75 -4
  100. package/dist/utils/coolify-api.js.map +1 -1
  101. package/dist/utils/flags.d.ts.map +1 -1
  102. package/dist/utils/flags.js +4 -0
  103. package/dist/utils/flags.js.map +1 -1
  104. package/dist/utils/inwx-api.d.ts +36 -0
  105. package/dist/utils/inwx-api.d.ts.map +1 -0
  106. package/dist/utils/inwx-api.js +105 -0
  107. package/dist/utils/inwx-api.js.map +1 -0
  108. package/dist/utils/secrets.d.ts +8 -1
  109. package/dist/utils/secrets.d.ts.map +1 -1
  110. package/dist/utils/secrets.js +8 -1
  111. package/dist/utils/secrets.js.map +1 -1
  112. package/package.json +5 -4
  113. package/scripts/release-prep.mjs +130 -0
@@ -14,7 +14,9 @@ export declare class CoolifyApi {
14
14
  private token;
15
15
  constructor(options: CoolifyApiOptions);
16
16
  private request;
17
- /** Test connection and get Coolify version. */
17
+ /** Test connection and get Coolify version. The endpoint returns a
18
+ * plain-text version string on modern Coolify, but older builds
19
+ * wrap it as `{ version: "..." }` — accept either. */
18
20
  getVersion(): Promise<string>;
19
21
  /** List all servers. */
20
22
  listServers(): Promise<CoolifyServer[]>;
@@ -39,6 +41,50 @@ export declare class CoolifyApi {
39
41
  setAppEnv(appUuid: string, envs: Record<string, string>, options?: {
40
42
  isPreview?: boolean;
41
43
  }): Promise<void>;
44
+ /** Create a MongoDB database. Coolify will auto-generate root creds
45
+ * if they're not supplied; the returned `internal_db_url` is the
46
+ * full connection string usable from inside Coolify's Docker network
47
+ * (which is where the app container runs). */
48
+ createMongodbDatabase(params: {
49
+ serverUuid: string;
50
+ projectUuid: string;
51
+ environmentName?: string;
52
+ environmentUuid?: string;
53
+ /** Defaults to `default` (the standard Coolify env). */
54
+ name: string;
55
+ initdbDatabase?: string;
56
+ initdbRootUsername?: string;
57
+ /** Coolify auto-generates one if omitted. */
58
+ initdbRootPassword?: string;
59
+ /** Start the container immediately on creation. */
60
+ instantDeploy?: boolean;
61
+ }): Promise<{
62
+ uuid: string;
63
+ internal_db_url: string;
64
+ }>;
65
+ /** Get a database (any engine) by uuid. We use this to read the
66
+ * `internal_db_url` post-creation when the create response didn't
67
+ * include it (older Coolify builds). */
68
+ getDatabase(uuid: string): Promise<{
69
+ uuid: string;
70
+ internal_db_url?: string;
71
+ }>;
72
+ /** Find a project by exact name. Returns null if none matches. */
73
+ findProjectByName(name: string): Promise<{
74
+ uuid: string;
75
+ name: string;
76
+ } | null>;
77
+ /** Find a server by exact name OR exact IP — the script-driven
78
+ * Coolify setup typically targets the first server, but Hetzner
79
+ * deploys are keyed by IP. Returns null if nothing matches. */
80
+ findServer(query: {
81
+ name?: string;
82
+ ip?: string;
83
+ }): Promise<{
84
+ uuid: string;
85
+ name: string;
86
+ ip: string;
87
+ } | null>;
42
88
  }
43
89
  /** Verify Coolify connection. Returns version string or throws. */
44
90
  export declare function verifyCoolify(url: string, token: string): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"coolify-api.d.ts","sourceRoot":"","sources":["../../src/utils/coolify-api.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,+BAA+B;AAC/B,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,iBAAiB;YAKxB,OAAO;IA6BrB,+CAA+C;IACzC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC,wBAAwB;IAClB,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAkB7C,yBAAyB;IACnB,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAIlE,4BAA4B;IACtB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAIxE,wEAAwE;IAClE,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAI9F;mEAC+D;IACzD,SAAS,CACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO,GACpC,OAAO,CAAC,IAAI,CAAC;CAYjB;AAED,mEAAmE;AACnE,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/E"}
1
+ {"version":3,"file":"coolify-api.d.ts","sourceRoot":"","sources":["../../src/utils/coolify-api.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,+BAA+B;AAC/B,qBAAa,UAAU;IACrB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,iBAAiB;YAKxB,OAAO;IAiCrB;;2DAEuD;IACjD,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IA0BnC,wBAAwB;IAClB,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAkB7C,yBAAyB;IACnB,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAIlE,4BAA4B;IACtB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAIxE,wEAAwE;IAClE,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAI9F;mEAC+D;IACzD,SAAS,CACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO,GACpC,OAAO,CAAC,IAAI,CAAC;IAahB;;;mDAG+C;IACzC,qBAAqB,CAAC,MAAM,EAAE;QAClC,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,wDAAwD;QACxD,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,6CAA6C;QAC7C,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,mDAAmD;QACnD,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAetD;;6CAEyC;IACnC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAIpF,kEAAkE;IAC5D,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAWrF;;oEAEgE;IAC1D,UAAU,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAY/D;AAED,mEAAmE;AACnE,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG/E"}
@@ -25,16 +25,41 @@ export class CoolifyApi {
25
25
  return JSON.parse(text);
26
26
  }
27
27
  catch {
28
+ const ct = res.headers.get("content-type") ?? "unknown";
29
+ const snippet = text.slice(0, 200).replace(/\s+/g, " ").trim();
28
30
  const hint = text.trimStart().startsWith("<")
29
31
  ? " (got HTML — token may be invalid or URL points to a login page)"
30
32
  : "";
31
- throw new Error(`Coolify API ${method} ${path}: response is not JSON${hint}`);
33
+ throw new Error(`Coolify API ${method} ${path}: response is not JSON${hint}\n content-type: ${ct}\n body: ${snippet || "(empty)"}`);
32
34
  }
33
35
  }
34
- /** Test connection and get Coolify version. */
36
+ /** Test connection and get Coolify version. The endpoint returns a
37
+ * plain-text version string on modern Coolify, but older builds
38
+ * wrap it as `{ version: "..." }` — accept either. */
35
39
  async getVersion() {
36
- const data = await this.request("GET", "/version");
37
- return data.version;
40
+ const res = await fetch(`${this.url}/api/v1/version`, {
41
+ headers: {
42
+ Authorization: `Bearer ${this.token}`,
43
+ Accept: "application/json, text/plain;q=0.9",
44
+ },
45
+ });
46
+ if (!res.ok) {
47
+ const text = await res.text().catch(() => "");
48
+ throw new Error(`Coolify API GET /version failed: ${res.status} ${res.statusText}${text ? ` — ${text}` : ""}`);
49
+ }
50
+ const text = (await res.text()).trim();
51
+ try {
52
+ const parsed = JSON.parse(text);
53
+ if (typeof parsed === "string")
54
+ return parsed;
55
+ if (parsed && typeof parsed === "object" && typeof parsed.version === "string") {
56
+ return parsed.version;
57
+ }
58
+ }
59
+ catch {
60
+ // Fall through: plain-text version string (e.g. "4.0.0-beta.432")
61
+ }
62
+ return text;
38
63
  }
39
64
  /** List all servers. */
40
65
  async listServers() {
@@ -72,6 +97,52 @@ export class CoolifyApi {
72
97
  };
73
98
  await this.request("PATCH", `/applications/${appUuid}/envs/bulk`, body);
74
99
  }
100
+ /** Create a MongoDB database. Coolify will auto-generate root creds
101
+ * if they're not supplied; the returned `internal_db_url` is the
102
+ * full connection string usable from inside Coolify's Docker network
103
+ * (which is where the app container runs). */
104
+ async createMongodbDatabase(params) {
105
+ const body = {
106
+ server_uuid: params.serverUuid,
107
+ project_uuid: params.projectUuid,
108
+ environment_name: params.environmentName ?? "production",
109
+ name: params.name,
110
+ instant_deploy: params.instantDeploy ?? true,
111
+ };
112
+ if (params.environmentUuid)
113
+ body.environment_uuid = params.environmentUuid;
114
+ if (params.initdbDatabase)
115
+ body.mongo_initdb_database = params.initdbDatabase;
116
+ if (params.initdbRootUsername)
117
+ body.mongo_initdb_root_username = params.initdbRootUsername;
118
+ if (params.initdbRootPassword)
119
+ body.mongo_initdb_root_password = params.initdbRootPassword;
120
+ return this.request("POST", "/databases/mongodb", body);
121
+ }
122
+ /** Get a database (any engine) by uuid. We use this to read the
123
+ * `internal_db_url` post-creation when the create response didn't
124
+ * include it (older Coolify builds). */
125
+ async getDatabase(uuid) {
126
+ return this.request("GET", `/databases/${uuid}`);
127
+ }
128
+ /** Find a project by exact name. Returns null if none matches. */
129
+ async findProjectByName(name) {
130
+ const projects = (await this.request("GET", "/projects"));
131
+ const match = projects.find((p) => p.name === name);
132
+ if (!match || !match.uuid)
133
+ return null;
134
+ return { uuid: match.uuid, name: match.name };
135
+ }
136
+ /** Find a server by exact name OR exact IP — the script-driven
137
+ * Coolify setup typically targets the first server, but Hetzner
138
+ * deploys are keyed by IP. Returns null if nothing matches. */
139
+ async findServer(query) {
140
+ const servers = (await this.request("GET", "/servers"));
141
+ const match = servers.find((s) => (query.name && s.name === query.name) || (query.ip && s.ip === query.ip));
142
+ if (!match?.uuid)
143
+ return null;
144
+ return { uuid: match.uuid, name: match.name, ip: match.ip };
145
+ }
75
146
  }
76
147
  /** Verify Coolify connection. Returns version string or throws. */
77
148
  export async function verifyCoolify(url, token) {
@@ -1 +1 @@
1
- {"version":3,"file":"coolify-api.js","sourceRoot":"","sources":["../../src/utils/coolify-api.ts"],"names":[],"mappings":"AAYA,+BAA+B;AAC/B,MAAM,OAAO,UAAU;IACb,GAAG,CAAS;IACZ,KAAK,CAAS;IAEtB,YAAY,OAA0B;QACpC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QACnE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,UAAU,IAAI,EAAE,EAAE;YACnD,MAAM;YACN,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;gBACrC,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,eAAe,MAAM,IAAI,IAAI,YAAY,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACnG,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;gBAC3C,CAAC,CAAC,kEAAkE;gBACpE,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,IAAI,IAAI,yBAAyB,IAAI,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAsB,KAAK,EAAE,UAAU,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAO7B,KAAK,EAAE,UAAU,CAAC,CAAC;QAErB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,yBAAyB;IACzB,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC1C,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAC9C,CAAC;IAED;mEAC+D;IAC/D,KAAK,CAAC,SAAS,CACb,OAAe,EACf,IAA4B,EAC5B,UAAmC,EAAE;QAErC,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChD,GAAG;gBACH,KAAK;gBACL,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK;gBACtC,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;SACJ,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,OAAO,YAAY,EAAE,IAAI,CAAC,CAAC;IAC1E,CAAC;CACF;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,KAAa;IAC5D,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,OAAO,GAAG,CAAC,UAAU,EAAE,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"coolify-api.js","sourceRoot":"","sources":["../../src/utils/coolify-api.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAsB,aAAa,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC;uDACmD;IACnD,GAAG,EAAE,OAAO,CAAC;IACb;2DACuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC;+CAC2C;IAC3C,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB;AAkBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CA6FlE"}
1
+ {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAsB,aAAa,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC;uDACmD;IACnD,GAAG,EAAE,OAAO,CAAC;IACb;2DACuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC;+CAC2C;IAC3C,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB;AAsBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CA6FlE"}
@@ -21,6 +21,10 @@ const KNOWN_FEATURES = [
21
21
  "mobile",
22
22
  ];
23
23
  const KNOWN_ML_SERVICES = [
24
+ "3d-sam-objects",
25
+ "3d-sam-body",
26
+ "3d-hunyuan",
27
+ "3d-trellis",
24
28
  "3d-extraction",
25
29
  "subtitles",
26
30
  "image-recognition",
@@ -1 +1 @@
1
- {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface InwxApiOptions {
2
+ username: string;
3
+ password: string;
4
+ /** Use the OTE sandbox instead of production. Set via INWX_SANDBOX=1. */
5
+ sandbox?: boolean;
6
+ }
7
+ /** INWX JSON-RPC API client. */
8
+ export declare class InwxApi {
9
+ private url;
10
+ private username;
11
+ private password;
12
+ private cookie;
13
+ constructor(options: InwxApiOptions);
14
+ private request;
15
+ /** Log in and capture the session cookie. Must be called before any
16
+ * other method. Idempotent — safe to call twice. */
17
+ login(): Promise<void>;
18
+ /** Log out and drop the session cookie. */
19
+ logout(): Promise<void>;
20
+ /** Look up a single domain. Returns the record including current
21
+ * nameservers. Throws if the domain isn't registered on this account. */
22
+ getDomainInfo(domain: string): Promise<{
23
+ domain: string;
24
+ ns: string[];
25
+ }>;
26
+ /**
27
+ * Update the nameservers delegated at the registrar for `domain`.
28
+ * Replaces the full list — pass all the NS you want, not a diff.
29
+ *
30
+ * INWX's `domain.update` also accepts many other fields (contacts,
31
+ * transferLock, authinfo, ...). We only touch `ns` here so we never
32
+ * accidentally clobber contact info set via the web UI.
33
+ */
34
+ setDomainNameservers(domain: string, nameservers: string[]): Promise<void>;
35
+ }
36
+ //# sourceMappingURL=inwx-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inwx-api.d.ts","sourceRoot":"","sources":["../../src/utils/inwx-api.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAQD,gCAAgC;AAChC,qBAAa,OAAO;IAClB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAuB;gBAEzB,OAAO,EAAE,cAAc;YAMrB,OAAO;IAsCrB;yDACqD;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,2CAA2C;IACrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ7B;8EAC0E;IACpE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAK9E;;;;;;;OAOG;IACG,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAQjF"}
@@ -0,0 +1,105 @@
1
+ // INWX JSON-RPC API client.
2
+ //
3
+ // The INWX Terraform provider can create DNS records inside a zone, but it
4
+ // can't change the nameservers that the TLD delegates a domain to. That's
5
+ // a "domain object" operation (domain.update), not a "nameserver object"
6
+ // operation — different part of the INWX API. This client handles the
7
+ // domain-level call so hatchkit can automatically point an INWX-registered
8
+ // domain at Cloudflare's nameservers after the CF zone is ready.
9
+ //
10
+ // API docs: https://www.inwx.com/en/help/apidoc
11
+ // Endpoints: https://api.domrobot.com/jsonrpc/ (OTE sandbox on api.ote)
12
+ //
13
+ // The API is JSON-RPC 2.0 over HTTPS, session-cookie authenticated. Call
14
+ // `account.login` once, capture the PHPSESSID cookie, include it on every
15
+ // follow-up request.
16
+ const PROD_URL = "https://api.domrobot.com/jsonrpc/";
17
+ const OTE_URL = "https://api.ote.domrobot.com/jsonrpc/";
18
+ /** INWX JSON-RPC API client. */
19
+ export class InwxApi {
20
+ url;
21
+ username;
22
+ password;
23
+ cookie = null;
24
+ constructor(options) {
25
+ this.url = options.sandbox ? OTE_URL : PROD_URL;
26
+ this.username = options.username;
27
+ this.password = options.password;
28
+ }
29
+ async request(method, params) {
30
+ const headers = {
31
+ "Content-Type": "application/json",
32
+ Accept: "application/json",
33
+ };
34
+ if (this.cookie)
35
+ headers.Cookie = this.cookie;
36
+ const res = await fetch(this.url, {
37
+ method: "POST",
38
+ headers,
39
+ body: JSON.stringify({ method, params }),
40
+ });
41
+ if (!res.ok) {
42
+ throw new Error(`INWX API ${method} failed: HTTP ${res.status} ${res.statusText}`);
43
+ }
44
+ // Capture the session cookie from the response on login. INWX sets
45
+ // PHPSESSID; we pass it back on every subsequent call.
46
+ const setCookie = res.headers.get("set-cookie");
47
+ if (setCookie) {
48
+ const match = setCookie.match(/(PHPSESSID=[^;]+)/);
49
+ if (match)
50
+ this.cookie = match[1];
51
+ }
52
+ const json = (await res.json());
53
+ // INWX returns HTTP 200 with an error code in the body. 1000 = success,
54
+ // anything else is a failure. The `msg` field is the human-readable
55
+ // error — surface it verbatim so callers can see what went wrong
56
+ // (e.g. "Authentication error" vs "Object does not exist").
57
+ if (json.code !== 1000) {
58
+ throw new Error(`INWX ${method} failed: ${json.code} ${json.msg}`);
59
+ }
60
+ return json.resData;
61
+ }
62
+ /** Log in and capture the session cookie. Must be called before any
63
+ * other method. Idempotent — safe to call twice. */
64
+ async login() {
65
+ await this.request("account.login", {
66
+ user: this.username,
67
+ pass: this.password,
68
+ });
69
+ if (!this.cookie) {
70
+ throw new Error("INWX login succeeded but no session cookie was set");
71
+ }
72
+ }
73
+ /** Log out and drop the session cookie. */
74
+ async logout() {
75
+ try {
76
+ await this.request("account.logout", {});
77
+ }
78
+ finally {
79
+ this.cookie = null;
80
+ }
81
+ }
82
+ /** Look up a single domain. Returns the record including current
83
+ * nameservers. Throws if the domain isn't registered on this account. */
84
+ async getDomainInfo(domain) {
85
+ const data = await this.request("domain.info", { domain });
86
+ return data;
87
+ }
88
+ /**
89
+ * Update the nameservers delegated at the registrar for `domain`.
90
+ * Replaces the full list — pass all the NS you want, not a diff.
91
+ *
92
+ * INWX's `domain.update` also accepts many other fields (contacts,
93
+ * transferLock, authinfo, ...). We only touch `ns` here so we never
94
+ * accidentally clobber contact info set via the web UI.
95
+ */
96
+ async setDomainNameservers(domain, nameservers) {
97
+ if (nameservers.length < 2) {
98
+ // Most registries require ≥2 NS records. Fail loud rather than
99
+ // letting the TLD registry reject it with a less obvious error.
100
+ throw new Error(`At least 2 nameservers required, got ${nameservers.length}`);
101
+ }
102
+ await this.request("domain.update", { domain, ns: nameservers });
103
+ }
104
+ }
105
+ //# sourceMappingURL=inwx-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inwx-api.js","sourceRoot":"","sources":["../../src/utils/inwx-api.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,18 @@ export declare const SECRET_KEYS: {
5
5
  readonly hetznerToken: "hetzner:token";
6
6
  readonly dnsInwxPassword: "dns:inwx:password";
7
7
  readonly dnsCloudflareToken: "dns:cloudflare:token";
8
+ /** Registrar password when DNS is on Cloudflare but the domain is
9
+ * registered at INWX. Used by the post-apply NS flip in deploy/terraform
10
+ * and by `hatchkit dns link-to-cloudflare`. */
11
+ readonly dnsInwxRegistrarPassword: "dns:inwx-registrar:password";
8
12
  readonly s3AccessKey: (provider: string) => string;
9
13
  readonly s3SecretKey: (provider: string) => string;
10
14
  readonly gpuApiKey: (platform: string) => string;
11
15
  readonly glitchtipToken: "glitchtip:auth-token";
12
- readonly openpanelToken: "openpanel:personal-access-token";
16
+ /** Root-mode OpenPanel client used by the Management API to auto-create
17
+ * per-project clients. Created once in the OpenPanel dashboard. */
18
+ readonly openpanelRootClientId: "openpanel:root-client-id";
19
+ readonly openpanelRootClientSecret: "openpanel:root-client-secret";
13
20
  readonly openpanelClientSecret: (name: string) => string;
14
21
  readonly resendApiKey: "resend:api-key";
15
22
  /** Per-scaffolded-project dotenvx private key for .env.production.
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/utils/secrets.ts"],"names":[],"mappings":"AAoBA;mEACmE;AACnE,eAAO,MAAM,WAAW;;;;;qCAKE,MAAM;qCACN,MAAM;mCACR,MAAM;;;2CAGE,MAAM;;IAEpC;;+DAE2D;8CAC1B,MAAM;CAC/B,CAAC;AAEX,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEnE;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzE;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhE;AAED,iEAAiE;AACjE,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrD"}
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/utils/secrets.ts"],"names":[],"mappings":"AAoBA;mEACmE;AACnE,eAAO,MAAM,WAAW;;;;;IAKtB;;oDAEgD;;qCAExB,MAAM;qCACN,MAAM;mCACR,MAAM;;IAE5B;wEACoE;;;2CAGtC,MAAM;;IAEpC;;+DAE2D;8CAC1B,MAAM;CAC/B,CAAC;AAEX,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEnE;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzE;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhE;AAED,iEAAiE;AACjE,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrD"}
@@ -22,11 +22,18 @@ export const SECRET_KEYS = {
22
22
  hetznerToken: "hetzner:token",
23
23
  dnsInwxPassword: "dns:inwx:password",
24
24
  dnsCloudflareToken: "dns:cloudflare:token",
25
+ /** Registrar password when DNS is on Cloudflare but the domain is
26
+ * registered at INWX. Used by the post-apply NS flip in deploy/terraform
27
+ * and by `hatchkit dns link-to-cloudflare`. */
28
+ dnsInwxRegistrarPassword: "dns:inwx-registrar:password",
25
29
  s3AccessKey: (provider) => `s3:${provider}:access-key`,
26
30
  s3SecretKey: (provider) => `s3:${provider}:secret-key`,
27
31
  gpuApiKey: (platform) => `gpu:${platform}:api-key`,
28
32
  glitchtipToken: "glitchtip:auth-token",
29
- openpanelToken: "openpanel:personal-access-token",
33
+ /** Root-mode OpenPanel client used by the Management API to auto-create
34
+ * per-project clients. Created once in the OpenPanel dashboard. */
35
+ openpanelRootClientId: "openpanel:root-client-id",
36
+ openpanelRootClientSecret: "openpanel:root-client-secret",
30
37
  openpanelClientSecret: (name) => `openpanel:${name}:client-secret`,
31
38
  resendApiKey: "resend:api-key",
32
39
  /** Per-scaffolded-project dotenvx private key for .env.production.
@@ -1 +1 @@
1
- {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/utils/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,iEAAiE;AACjE,uEAAuE;AACvE,sEAAsE;AACtE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,UAAU,CAAC;AAElE;mEACmE;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY,EAAE,eAAe;IAC7B,YAAY,EAAE,eAAe;IAC7B,eAAe,EAAE,mBAAmB;IACpC,kBAAkB,EAAE,sBAAsB;IAC1C,WAAW,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,MAAM,QAAQ,aAAa;IAC9D,WAAW,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,MAAM,QAAQ,aAAa;IAC9D,SAAS,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,OAAO,QAAQ,UAAU;IAC1D,cAAc,EAAE,sBAAsB;IACtC,cAAc,EAAE,iCAAiC;IACjD,qBAAqB,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,IAAI,gBAAgB;IAC1E,YAAY,EAAE,gBAAgB;IAC9B;;+DAE2D;IAC3D,iBAAiB,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,WAAW,WAAW,yBAAyB;CACnF,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa;IACxD,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC"}
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/utils/secrets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,iEAAiE;AACjE,uEAAuE;AACvE,sEAAsE;AACtE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,UAAU,CAAC;AAElE;mEACmE;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY,EAAE,eAAe;IAC7B,YAAY,EAAE,eAAe;IAC7B,eAAe,EAAE,mBAAmB;IACpC,kBAAkB,EAAE,sBAAsB;IAC1C;;oDAEgD;IAChD,wBAAwB,EAAE,6BAA6B;IACvD,WAAW,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,MAAM,QAAQ,aAAa;IAC9D,WAAW,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,MAAM,QAAQ,aAAa;IAC9D,SAAS,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,OAAO,QAAQ,UAAU;IAC1D,cAAc,EAAE,sBAAsB;IACtC;wEACoE;IACpE,qBAAqB,EAAE,0BAA0B;IACjD,yBAAyB,EAAE,8BAA8B;IACzD,qBAAqB,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,IAAI,gBAAgB;IAC1E,YAAY,EAAE,gBAAgB;IAC9B;;+DAE2D;IAC3D,iBAAiB,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,WAAW,WAAW,yBAAyB;CACnF,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IACzC,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,KAAa;IACxD,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "hatchkit",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
+ "packageManager": "pnpm@10.33.2",
4
5
  "description": "Interactive CLI for scaffolding full-stack projects and provisioning observability/email clients",
5
6
  "type": "module",
6
7
  "bin": {
@@ -23,9 +24,9 @@
23
24
  "check": "pnpm run typecheck && pnpm run lint && pnpm run test",
24
25
  "install-local": "pnpm run build && npm install -g .",
25
26
  "release": "pnpm run release:patch",
26
- "release:patch": "npm version patch -m \"chore: release v%s\" && pnpm run _release:finish",
27
- "release:minor": "npm version minor -m \"chore: release v%s\" && pnpm run _release:finish",
28
- "release:major": "npm version major -m \"chore: release v%s\" && pnpm run _release:finish",
27
+ "release:patch": "node scripts/release-prep.mjs && npm version patch -m \"chore: release v%s\" && pnpm run _release:finish",
28
+ "release:minor": "node scripts/release-prep.mjs && npm version minor -m \"chore: release v%s\" && pnpm run _release:finish",
29
+ "release:major": "node scripts/release-prep.mjs && npm version major -m \"chore: release v%s\" && pnpm run _release:finish",
29
30
  "_release:finish": "pnpm run build && pnpm run typecheck && npm publish --access public && git push --follow-tags && npm install -g .",
30
31
  "prepublishOnly": "pnpm run build"
31
32
  },
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * release-prep — run before `npm version` so any dangling working-tree
4
+ * changes get committed and shipped with the release instead of hanging
5
+ * around on main afterwards.
6
+ *
7
+ * Runs from cli/ (where the release scripts live). Finds the repo root
8
+ * via `git rev-parse --show-toplevel` and operates on the whole repo,
9
+ * not just cli/ — if you've left changes under infra/ or docs/ they get
10
+ * picked up too.
11
+ *
12
+ * Safety rails:
13
+ * - Refuses to run if any staged/untracked path looks like a secret
14
+ * (.env*, *.pem, *.key, *credentials*, *secret*).
15
+ * - Submodule pointer changes (git shows as ` M infra` vs `M infra`)
16
+ * are fine, but untracked content INSIDE a submodule is NOT auto-
17
+ * committed from the parent repo — you'd want to commit that inside
18
+ * the submodule yourself first. We warn + bail in that case.
19
+ * - Interactive: prompts for a commit message (default:
20
+ * "chore: pre-release changes").
21
+ * - Non-interactive (no TTY): uses the default message and proceeds.
22
+ * Skip the whole thing with RELEASE_SKIP_PREP=1.
23
+ */
24
+
25
+ import { execSync, spawnSync } from "node:child_process";
26
+ import { createInterface } from "node:readline";
27
+ import { stdin as input, stdout as output } from "node:process";
28
+
29
+ if (process.env.RELEASE_SKIP_PREP === "1") {
30
+ console.log(" release-prep: RELEASE_SKIP_PREP=1 — skipping.");
31
+ process.exit(0);
32
+ }
33
+
34
+ function sh(cmd, opts = {}) {
35
+ return execSync(cmd, { encoding: "utf8", ...opts }).trim();
36
+ }
37
+
38
+ // Find the repo root so git commands work no matter where the script was
39
+ // launched from (pnpm invokes scripts with cwd=cli/).
40
+ let repoRoot;
41
+ try {
42
+ repoRoot = sh("git rev-parse --show-toplevel");
43
+ } catch (err) {
44
+ console.error(" release-prep: not inside a git repo. Aborting.");
45
+ process.exit(1);
46
+ }
47
+
48
+ const porcelain = sh("git status --porcelain", { cwd: repoRoot });
49
+ if (!porcelain) {
50
+ console.log(" release-prep: working tree clean. Nothing to commit.");
51
+ process.exit(0);
52
+ }
53
+
54
+ const entries = porcelain.split("\n").map((l) => {
55
+ // Porcelain format: "XY path". X = index, Y = worktree. Submodules
56
+ // show up with `m`/`M` in position Y + 1 for content changes.
57
+ const code = l.slice(0, 2);
58
+ const path = l.slice(3);
59
+ return { code, path };
60
+ });
61
+
62
+ console.log("\n release-prep: working tree isn't clean.\n");
63
+ console.log(sh("git status --short", { cwd: repoRoot }));
64
+
65
+ // Refuse secret-looking paths. Keep the pattern conservative — better a
66
+ // false positive that requires manual commit than a leaked token.
67
+ const SECRET_RE = /(^|\/)(\.env(\.|$)|[^/]*credentials[^/]*|[^/]*secret[^/]*|[^/]*\.(pem|key|pfx|p12)$)/i;
68
+ const secretsFound = entries.filter((e) => SECRET_RE.test(e.path));
69
+ if (secretsFound.length > 0) {
70
+ console.error("\n release-prep: refusing — these paths look like secrets:\n");
71
+ for (const e of secretsFound) console.error(` ${e.path}`);
72
+ console.error(
73
+ "\n Resolve manually: gitignore, delete, or commit yourself and re-run the release.",
74
+ );
75
+ process.exit(1);
76
+ }
77
+
78
+ // Untracked content inside a submodule shows as e.g. ' m infra' with
79
+ // only the second column set to lowercase 'm'. Parent-repo `git add`
80
+ // can't reach inside; bail so the user commits in the submodule first.
81
+ const untrackedInSubmodule = entries.filter((e) => e.code === " m" || e.code === "?m");
82
+ if (untrackedInSubmodule.length > 0) {
83
+ console.error(
84
+ "\n release-prep: submodule has untracked changes inside it:\n",
85
+ );
86
+ for (const e of untrackedInSubmodule) {
87
+ console.error(` ${e.path} — commit inside the submodule first`);
88
+ }
89
+ console.error(
90
+ "\n cd into each submodule, commit, then `git add <submodule>` + re-run the release.",
91
+ );
92
+ process.exit(1);
93
+ }
94
+
95
+ // Prompt for a commit message unless we're non-interactive.
96
+ const DEFAULT_MSG = "chore: pre-release changes";
97
+ let message = DEFAULT_MSG;
98
+ if (input.isTTY && output.isTTY) {
99
+ const rl = createInterface({ input, output });
100
+ message = await new Promise((resolve) => {
101
+ rl.question(` Commit message [${DEFAULT_MSG}]: `, (answer) => {
102
+ rl.close();
103
+ resolve(answer.trim() || DEFAULT_MSG);
104
+ });
105
+ });
106
+ } else {
107
+ console.log(` release-prep: non-interactive — using default message "${DEFAULT_MSG}".`);
108
+ }
109
+
110
+ // Stage + commit at the repo root. Using `git add -A` here is intentional
111
+ // (the whole point of this helper is to sweep everything into the release
112
+ // commit); the secret-path guard above is what keeps it safe.
113
+ const add = spawnSync("git", ["add", "-A"], { cwd: repoRoot, stdio: "inherit" });
114
+ if (add.status !== 0) {
115
+ console.error(" release-prep: `git add -A` failed.");
116
+ process.exit(add.status ?? 1);
117
+ }
118
+
119
+ const commit = spawnSync("git", ["commit", "-m", message], {
120
+ cwd: repoRoot,
121
+ stdio: "inherit",
122
+ });
123
+ if (commit.status !== 0) {
124
+ console.error(
125
+ " release-prep: `git commit` failed (pre-commit hook? empty diff after filters?).",
126
+ );
127
+ process.exit(commit.status ?? 1);
128
+ }
129
+
130
+ console.log("\n release-prep: committed. Continuing release.\n");