@supatype/cli 0.1.0-alpha.12 → 0.1.0-alpha.14

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 (67) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +207 -89
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/dist/app-config.d.ts +10 -0
  5. package/dist/app-config.d.ts.map +1 -1
  6. package/dist/app-config.js +72 -0
  7. package/dist/app-config.js.map +1 -1
  8. package/dist/binary-cache.d.ts +11 -3
  9. package/dist/binary-cache.d.ts.map +1 -1
  10. package/dist/binary-cache.js +62 -39
  11. package/dist/binary-cache.js.map +1 -1
  12. package/dist/cli.d.ts.map +1 -1
  13. package/dist/cli.js +2 -0
  14. package/dist/cli.js.map +1 -1
  15. package/dist/commands/add.d.ts +3 -0
  16. package/dist/commands/add.d.ts.map +1 -0
  17. package/dist/commands/add.js +83 -0
  18. package/dist/commands/add.js.map +1 -0
  19. package/dist/commands/app.js +2 -2
  20. package/dist/commands/app.js.map +1 -1
  21. package/dist/commands/init.d.ts +29 -1
  22. package/dist/commands/init.d.ts.map +1 -1
  23. package/dist/commands/init.js +569 -90
  24. package/dist/commands/init.js.map +1 -1
  25. package/dist/commands/keys.d.ts +15 -1
  26. package/dist/commands/keys.d.ts.map +1 -1
  27. package/dist/commands/keys.js +39 -4
  28. package/dist/commands/keys.js.map +1 -1
  29. package/dist/engine-client.d.ts.map +1 -1
  30. package/dist/engine-client.js +12 -4
  31. package/dist/engine-client.js.map +1 -1
  32. package/dist/kong-config.d.ts +9 -0
  33. package/dist/kong-config.d.ts.map +1 -1
  34. package/dist/kong-config.js +18 -1
  35. package/dist/kong-config.js.map +1 -1
  36. package/dist/project-config.d.ts +16 -0
  37. package/dist/project-config.d.ts.map +1 -1
  38. package/dist/project-config.js +34 -0
  39. package/dist/project-config.js.map +1 -1
  40. package/dist/prompts.d.ts +8 -0
  41. package/dist/prompts.d.ts.map +1 -0
  42. package/dist/prompts.js +20 -0
  43. package/dist/prompts.js.map +1 -0
  44. package/dist/scripts/postinstall.js +5 -1
  45. package/dist/scripts/postinstall.js.map +1 -1
  46. package/dist/self-host-compose.d.ts.map +1 -1
  47. package/dist/self-host-compose.js +61 -17
  48. package/dist/self-host-compose.js.map +1 -1
  49. package/package.json +2 -1
  50. package/src/app-config.ts +80 -0
  51. package/src/binary-cache.ts +64 -42
  52. package/src/cli.ts +2 -0
  53. package/src/commands/add.ts +94 -0
  54. package/src/commands/app.ts +2 -2
  55. package/src/commands/init.ts +738 -88
  56. package/src/commands/keys.ts +49 -4
  57. package/src/engine-client.ts +11 -4
  58. package/src/kong-config.ts +24 -1
  59. package/src/project-config.ts +45 -0
  60. package/src/prompts.ts +21 -0
  61. package/src/scripts/postinstall.ts +7 -1
  62. package/src/self-host-compose.ts +61 -17
  63. package/tests/config.test.ts +26 -0
  64. package/tests/init.test.ts +128 -15
  65. package/tests/minisign.test.ts +102 -0
  66. package/tests/runtime-contract.test.ts +111 -1
  67. package/tsconfig.tsbuildinfo +1 -1
@@ -1,7 +1,7 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { dirname, join, relative, resolve } from "node:path";
3
3
  import { spawnSync } from "node:child_process";
4
- import { preferredFunctionsPathFromProject } from "./project-config.js";
4
+ import { preferredFunctionsPathFromProject, selfHostTlsEnabled } from "./project-config.js";
5
5
  import { hasEngineOverride, hasStudioOverride, pinnedVersion, fetchLatestVersion, VERSION_PIN_LOCAL } from "./binary-cache.js";
6
6
  import { buildKongDeclarative } from "./kong-config.js";
7
7
  /** Env keys written when `versions` pins exist in supatype.config.ts. */
@@ -196,6 +196,11 @@ export function renderSelfHostCompose(config, cwd = process.cwd(), options) {
196
196
  const projectMount = projectMountPath(cwd);
197
197
  const kongMount = kongMountPath(cwd);
198
198
  const devLocal = options?.devLocal === true;
199
+ const tlsEnabled = selfHostTlsEnabled(config, devLocal);
200
+ const domain = config.server.domain?.trim() ?? "";
201
+ // When TLS is on, default external URLs to https://<domain> so auth links/redirects use HTTPS.
202
+ const externalUrlFallback = tlsEnabled ? `https://${domain}` : "http://localhost:18473";
203
+ const siteUrlFallback = tlsEnabled ? `https://${domain}` : "http://localhost:3000";
199
204
  const studioHostDev = devLocal && hasStudioOverride(config);
200
205
  const appEnv = serverAppEnvForCompose(config, devLocal);
201
206
  const staticDir = staticDirForCompose(config) ?? "./dist";
@@ -207,7 +212,7 @@ export function renderSelfHostCompose(config, cwd = process.cwd(), options) {
207
212
  studio:
208
213
  ${studioService}
209
214
  environment:
210
- SUPATYPE_CLOUD_JSON: '{"url":"\${API_EXTERNAL_URL:-http://localhost:18473}","anonKey":"\${ANON_KEY:-}"}'
215
+ SUPATYPE_CLOUD_JSON: '{"url":"\${API_EXTERNAL_URL:-${externalUrlFallback}}","anonKey":"\${ANON_KEY:-}"}'
211
216
  expose:
212
217
  - "3002"
213
218
  `;
@@ -237,6 +242,43 @@ ${studioService}
237
242
  : ` ports:
238
243
  - "9000:9000"
239
244
  - "9001:9001"
245
+ `;
246
+ const kongTlsEnv = tlsEnabled
247
+ ? ` KONG_PROXY_LISTEN: "0.0.0.0:8000, 0.0.0.0:8443 ssl"
248
+ KONG_LUA_SSL_TRUSTED_CERTIFICATE: system
249
+ `
250
+ : "";
251
+ const kongPorts = tlsEnabled
252
+ ? ` - "80:8000"
253
+ - "443:8443"`
254
+ : ` - "\${SUPATYPE_KONG_PORT:-18473}:8000"`;
255
+ const kongTlsDependsOn = tlsEnabled ? "\n - valkey" : "";
256
+ const valkeyBlock = tlsEnabled
257
+ ? `
258
+ valkey:
259
+ image: \${SUPATYPE_VALKEY_IMAGE:-valkey/valkey:8-alpine}
260
+ command: ["valkey-server", "--appendonly", "yes"]
261
+ expose:
262
+ - "6379"
263
+ volumes:
264
+ - valkey-data:/data
265
+ `
266
+ : "";
267
+ const tlsHintComment = tlsEnabled
268
+ ? ""
269
+ : ` # HTTPS is off. To enable automatic TLS (Let's Encrypt) for production, set in supatype.config.ts:
270
+ # server: { mode: "standalone", domain: "your.domain", tls: { email: "you@example.com" } }
271
+ # then re-run \`supatype self-host compose up -d\`. Kong publishes :80/:443 and provisions certs automatically.
272
+ `;
273
+ const volumesBlock = tlsEnabled
274
+ ? `volumes:
275
+ db-data:
276
+ minio-data:
277
+ valkey-data:
278
+ `
279
+ : `volumes:
280
+ db-data:
281
+ minio-data:
240
282
  `;
241
283
  return `# Generated by supatype self-host compose
242
284
  # Kong → supatype-server (unified gateway) → internal PostgREST / storage / etc.
@@ -297,12 +339,12 @@ ${dbPorts} volumes:
297
339
  SUPATYPE_FUNCTIONS_ROOT: /project/functions
298
340
  SUPATYPE_DENO_FUNCTIONS_DIR: /project/functions
299
341
  PORT: "8001"
300
- SUPATYPE_URL: \${API_EXTERNAL_URL:-http://localhost:18473}
342
+ SUPATYPE_URL: \${API_EXTERNAL_URL:-${externalUrlFallback}}
301
343
  SUPATYPE_ANON_KEY: \${ANON_KEY:-}
302
344
  SUPATYPE_SERVICE_ROLE_KEY: \${SERVICE_ROLE_KEY:-}
303
345
  STRIPE_SECRET_KEY: \${STRIPE_SECRET_KEY:-}
304
346
  STRIPE_WEBHOOK_SECRET: \${STRIPE_WEBHOOK_SECRET:-}
305
- SITE_URL: \${SITE_URL:-\${API_EXTERNAL_URL:-http://localhost:18473}}
347
+ SITE_URL: \${SITE_URL:-\${API_EXTERNAL_URL:-${externalUrlFallback}}}
306
348
  depends_on:
307
349
  db:
308
350
  condition: service_healthy
@@ -341,7 +383,7 @@ ${serverPorts} volumes:
341
383
  SUPATYPE_POSTGREST_URL: http://postgrest:3000
342
384
  SUPATYPE_GRAPHQL_URL: http://postgrest:3000
343
385
  SUPATYPE_STORAGE_URL: http://storage:5000
344
- SUPATYPE_URL: \${API_EXTERNAL_URL:-http://localhost:18473}
386
+ SUPATYPE_URL: \${API_EXTERNAL_URL:-${externalUrlFallback}}
345
387
  SUPATYPE_ANON_KEY: \${ANON_KEY:-}
346
388
  SUPATYPE_SERVICE_ROLE_KEY: \${SERVICE_ROLE_KEY:-}
347
389
  SUPATYPE_SQL_DATABASE_URL: "postgresql://\${POSTGRES_USER:-supatype_admin}:\${POSTGRES_PASSWORD:-postgres}@db:5432/\${POSTGRES_DB:-supatype}"
@@ -351,11 +393,11 @@ ${serverPorts} volumes:
351
393
  ${appEnv}
352
394
  GOTRUE_API_HOST: 0.0.0.0
353
395
  GOTRUE_API_PORT: 9999
354
- API_EXTERNAL_URL: \${API_EXTERNAL_URL:-http://localhost:18473}
355
- GOTRUE_API_EXTERNAL_URL: \${API_EXTERNAL_URL:-http://localhost:18473}
396
+ API_EXTERNAL_URL: \${API_EXTERNAL_URL:-${externalUrlFallback}}
397
+ GOTRUE_API_EXTERNAL_URL: \${API_EXTERNAL_URL:-${externalUrlFallback}}
356
398
  GOTRUE_DB_DRIVER: postgres
357
399
  GOTRUE_DB_DATABASE_URL: "postgres://\${POSTGRES_USER:-supatype_admin}:\${POSTGRES_PASSWORD:-postgres}@db:5432/\${POSTGRES_DB:-supatype}?search_path=auth"
358
- GOTRUE_SITE_URL: \${SITE_URL:-http://localhost:3000}
400
+ GOTRUE_SITE_URL: \${SITE_URL:-${siteUrlFallback}}
359
401
  GOTRUE_JWT_SECRET: \${JWT_SECRET:-super-secret-jwt-token-change-in-production}
360
402
  GOTRUE_JWT_EXP: 3600
361
403
  GOTRUE_JWT_AUD: authenticated
@@ -395,8 +437,7 @@ ${minioPorts} volumes:
395
437
  depends_on:
396
438
  db:
397
439
  condition: service_healthy
398
- ${studioBlock}
399
- kong:
440
+ ${studioBlock}${valkeyBlock}${tlsHintComment} kong:
400
441
  image: kong:3.6
401
442
  environment:
402
443
  KONG_DATABASE: "off"
@@ -405,17 +446,14 @@ ${studioBlock}
405
446
  KONG_ADMIN_ACCESS_LOG: /dev/stdout
406
447
  KONG_PROXY_ERROR_LOG: /dev/stderr
407
448
  KONG_ADMIN_ERROR_LOG: /dev/stderr
408
- volumes:
449
+ ${kongTlsEnv} volumes:
409
450
  - ${kongMount}:/etc/kong/kong.yml:ro
410
451
  ports:
411
- - "\${SUPATYPE_KONG_PORT:-18473}:8000"
452
+ ${kongPorts}
412
453
  depends_on:
413
- ${kongDependsOn}
454
+ ${kongDependsOn}${kongTlsDependsOn}
414
455
 
415
- volumes:
416
- db-data:
417
- minio-data:
418
- `;
456
+ ${volumesBlock}`;
419
457
  }
420
458
  function ensureComposeManifest(cwd) {
421
459
  const manifestPath = join(cwd, ".supatype", "manifest.json");
@@ -441,12 +479,18 @@ export function writeSelfHostCompose(cwd, config, options) {
441
479
  ensureComposeManifest(cwd);
442
480
  writeFileSync(paths.composePath, renderSelfHostCompose(config, cwd, options), "utf8");
443
481
  const studioHostDev = options?.devLocal === true && hasStudioOverride(config);
482
+ const tlsEnabled = selfHostTlsEnabled(config, options?.devLocal === true);
483
+ const domain = config.server.domain?.trim();
484
+ const acmeEmail = config.server.tls?.email?.trim();
444
485
  writeFileSync(paths.kongPath, buildKongDeclarative({
445
486
  unifiedGateway: true,
446
487
  ...(studioHostDev && {
447
488
  studioServiceUrl: COMPOSE_STUDIO_HOST_URL,
448
489
  studioStripPath: false,
449
490
  }),
491
+ ...(tlsEnabled && domain && acmeEmail
492
+ ? { acme: { email: acmeEmail, domain, redisHost: "valkey" } }
493
+ : {}),
450
494
  }), "utf8");
451
495
  return paths;
452
496
  }
@@ -1 +1 @@
1
- {"version":3,"file":"self-host-compose.js","sourceRoot":"","sources":["../src/self-host-compose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"self-host-compose.js","sourceRoot":"","sources":["../src/self-host-compose.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supatype/cli",
3
- "version": "0.1.0-alpha.12",
3
+ "version": "0.1.0-alpha.14",
4
4
  "description": "Supatype CLI — schema push, introspect, generate",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,6 +19,7 @@
19
19
  }
20
20
  },
21
21
  "dependencies": {
22
+ "@clack/prompts": "^1.6.0",
22
23
  "commander": "^12.1.0",
23
24
  "pg": "^8.13.0",
24
25
  "ts-morph": "^28.0.0",
package/src/app-config.ts CHANGED
@@ -55,6 +55,86 @@ function updateAppConfigAst(configPath: string, input: UpdateAppConfigInput): st
55
55
  return sourceFile.getFullText()
56
56
  }
57
57
 
58
+ export interface UpdateServerConfigInput {
59
+ domain: string
60
+ tlsEmail: string
61
+ provider?: "kong" | "none"
62
+ }
63
+
64
+ /**
65
+ * Set `server.mode = "standalone"` plus `domain` and `tls` in supatype.config.ts,
66
+ * enabling self-host HTTPS. Preserves other `server` keys (port, etc).
67
+ */
68
+ export function updateServerConfigInProject(cwd: string, input: UpdateServerConfigInput): string {
69
+ const configPath = resolve(cwd, "supatype.config.ts")
70
+ if (!existsSync(configPath)) {
71
+ throw new Error("supatype.config.ts not found. Run: supatype init")
72
+ }
73
+ const next = updateServerConfigAst(configPath, input)
74
+ writeFileSync(configPath, next, "utf8")
75
+ return configPath
76
+ }
77
+
78
+ function updateServerConfigAst(configPath: string, input: UpdateServerConfigInput): string {
79
+ const project = new Project({
80
+ useInMemoryFileSystem: false,
81
+ skipAddingFilesFromTsConfig: true,
82
+ manipulationSettings: {
83
+ quoteKind: QuoteKind.Double,
84
+ },
85
+ })
86
+ const srcText = readFileSync(configPath, "utf8")
87
+ const sourceFile = project.createSourceFile(configPath, srcText, { overwrite: true })
88
+ const rootObject = getRootConfigObject(sourceFile)
89
+
90
+ const serverProperty = rootObject.getProperty("server")
91
+
92
+ if (serverProperty === undefined) {
93
+ rootObject.addPropertyAssignment({
94
+ name: "server",
95
+ initializer: renderServerInitializer(input),
96
+ })
97
+ } else if (Node.isPropertyAssignment(serverProperty)) {
98
+ const init = serverProperty.getInitializer()
99
+ if (init && Node.isObjectLiteralExpression(init)) {
100
+ patchServerObject(init, input)
101
+ } else {
102
+ serverProperty.setInitializer(renderServerInitializer(input))
103
+ }
104
+ } else {
105
+ serverProperty.remove()
106
+ rootObject.addPropertyAssignment({
107
+ name: "server",
108
+ initializer: renderServerInitializer(input),
109
+ })
110
+ }
111
+
112
+ return sourceFile.getFullText()
113
+ }
114
+
115
+ function renderServerInitializer(input: UpdateServerConfigInput): string {
116
+ const provider = input.provider ?? "kong"
117
+ return `{
118
+ mode: "standalone",
119
+ domain: "${input.domain}",
120
+ tls: { email: "${input.tlsEmail}", provider: "${provider}" },
121
+ }`
122
+ }
123
+
124
+ function patchServerObject(serverObj: ObjectLiteralExpression, input: UpdateServerConfigInput): void {
125
+ upsertStringProperty(serverObj, "mode", "standalone")
126
+ upsertStringProperty(serverObj, "domain", input.domain)
127
+ const provider = input.provider ?? "kong"
128
+ const tlsInitializer = `{ email: "${input.tlsEmail}", provider: "${provider}" }`
129
+ const existing = serverObj.getProperty("tls")
130
+ if (existing && Node.isPropertyAssignment(existing)) {
131
+ existing.setInitializer(tlsInitializer)
132
+ } else {
133
+ if (existing) existing.remove()
134
+ serverObj.addPropertyAssignment({ name: "tls", initializer: tlsInitializer })
135
+ }
136
+ }
137
+
58
138
  function getRootConfigObject(sourceFile: SourceFile): ObjectLiteralExpression {
59
139
  const exportAssignment = sourceFile.getFirstDescendantByKind(SyntaxKind.ExportAssignment)
60
140
  if (!exportAssignment) {
@@ -7,10 +7,13 @@
7
7
  *
8
8
  * Security model:
9
9
  * 1. Download checksums.sha256 + checksums.sha256.minisig from CDN.
10
- * 2. Verify Ed25519 minisign signature on the checksum file using the
11
- * embedded public key (SUPATYPE_RELEASE_PUBLIC_KEY).
10
+ * 2. Verify the Ed25519 minisign signature on the checksum file using the
11
+ * release public key (embedded at publish, overridable via
12
+ * SUPATYPE_RELEASE_PUBLIC_KEY).
12
13
  * 3. Verify SHA256 of the downloaded binary against the signed checksum.
13
- * Both checks are mandatory when SUPATYPE_RELEASE_PUBLIC_KEY is set.
14
+ * Verification is mandatory and fails closed: if no public key is configured,
15
+ * the download errors out rather than silently degrading to SHA256-only.
16
+ * The only escape hatch is the explicit SUPATYPE_ALLOW_UNVERIFIED_DOWNLOADS=1.
14
17
  */
15
18
 
16
19
  import { createHash, createPublicKey, verify as cryptoVerify } from "node:crypto"
@@ -23,6 +26,7 @@ import {
23
26
  openSync,
24
27
  readFileSync,
25
28
  readSync,
29
+ rmdirSync,
26
30
  statSync,
27
31
  unlinkSync,
28
32
  writeFileSync,
@@ -135,17 +139,6 @@ export function postgresArchiveTag(version: string): string {
135
139
  return version.split(".")[0]!
136
140
  }
137
141
 
138
- /**
139
- * Supatype release signing public key (minisign format).
140
- * Generated with: minisign -G
141
- * Rotate by: generating a new pair, updating this constant, and updating
142
- * the MINISIGN_PRIVATE_KEY GitHub Actions secret.
143
- *
144
- * ⚠ PLACEHOLDER — replace with actual public key before first release.
145
- * When empty, minisign verification is skipped with a warning (SHA256 only).
146
- */
147
- const SUPATYPE_RELEASE_PUBLIC_KEY = ""
148
-
149
142
  // CDN path templates per component.
150
143
  const CDN_PATHS: Record<Component, (version: string, platform: PlatformId) => string> = {
151
144
  engine: (v, p) => `/engine/v${v}/supatype-engine-${p.os}-${p.arch}${p.os === "windows" ? ".exe" : ""}`,
@@ -340,14 +333,14 @@ export async function download(
340
333
 
341
334
  console.log(`[supatype] Downloading ${component} v${version} (${platform.os}/${platform.arch})...`)
342
335
 
343
- // ── Fetch checksums + optional minisig ────────────────────────────────────
344
- const expectedChecksum = await withRetry(() =>
345
- fetchChecksums(checksumsUrl, minisigUrl, name),
346
- )
347
-
348
- // ── Stream-download binary with progress ─────────────────────────────────
349
336
  const tmpPath = destPath + ".tmp"
350
337
  try {
338
+ // ── Fetch checksums + optional minisig (retried on transient failures) ───
339
+ const expectedChecksum = await withRetry(() =>
340
+ fetchChecksums(checksumsUrl, minisigUrl, name),
341
+ )
342
+
343
+ // ── Stream-download binary with progress (retried on transient failures) ─
351
344
  await withRetry(() => streamToFileWithProgress(binaryUrl, tmpPath))
352
345
 
353
346
  // ── Verify SHA256 ────────────────────────────────────────────────────────
@@ -359,9 +352,17 @@ export async function download(
359
352
  if (process.platform !== "win32" && EXECUTABLE_COMPONENTS.has(component)) {
360
353
  await chmod(destPath, 0o755)
361
354
  }
355
+ } catch (err) {
356
+ // Never leave a partial binary or an empty version directory behind: a stale
357
+ // empty dir makes the next resolve look fine while silently lacking a binary.
358
+ try { if (existsSync(destPath)) unlinkSync(destPath) } catch { /* ignore */ }
359
+ try { rmdirSync(dir) } catch { /* dir not empty or already removed */ }
360
+ throw new Error(
361
+ `Failed to download ${component} v${version} from ${CDN_BASE}: ${(err as Error).message}`,
362
+ )
362
363
  } finally {
363
364
  if (existsSync(tmpPath)) {
364
- try { require("node:fs").unlinkSync(tmpPath) } catch { /* ignore */ }
365
+ try { unlinkSync(tmpPath) } catch { /* ignore */ }
365
366
  }
366
367
  }
367
368
 
@@ -384,24 +385,36 @@ async function fetchChecksums(
384
385
  const checksumsText = await csResp.text()
385
386
 
386
387
  const pubKey = releasePublicKey()
387
- if (pubKey) {
388
- // Minisign signature is required when a public key is embedded.
389
- const sigResp = await fetch(minisigUrl)
390
- if (!sigResp.ok) {
391
- throw new Error(
392
- `Failed to fetch checksum signature from ${minisigUrl}: HTTP ${sigResp.status}\n` +
393
- "Cannot verify release integrity. Aborting download.",
388
+ if (!pubKey) {
389
+ // Fail closed: a missing public key means we cannot verify authenticity, only
390
+ // integrity (SHA256). Published builds always embed the key, so this only
391
+ // happens in source/contributor builds — never silently downgrade.
392
+ if (process.env["SUPATYPE_ALLOW_UNVERIFIED_DOWNLOADS"] === "1") {
393
+ console.warn(
394
+ "[supatype] \u26a0 SUPATYPE_ALLOW_UNVERIFIED_DOWNLOADS=1 no minisign public " +
395
+ "key configured; verifying SHA256 only (authenticity NOT checked).",
394
396
  )
397
+ return extractChecksum(checksumsText, binaryFilename)
395
398
  }
396
- const sigText = await sigResp.text()
397
- verifyMinisign(Buffer.from(checksumsText, "utf8"), sigText, pubKey)
398
- } else {
399
- console.warn(
400
- "[supatype] \u26a0 Minisign public key not configured " +
401
- "skipping signature verification (SHA256 only).",
399
+ throw new Error(
400
+ "No minisign public key configured — cannot verify release authenticity.\n" +
401
+ "Published @supatype/cli builds embed the key automatically; if you are building " +
402
+ "from source, set SUPATYPE_RELEASE_PUBLIC_KEY to the release public key, or set " +
403
+ "SUPATYPE_ALLOW_UNVERIFIED_DOWNLOADS=1 to download with SHA256-only verification (unsafe).",
402
404
  )
403
405
  }
404
406
 
407
+ // Minisign signature is mandatory when a public key is configured.
408
+ const sigResp = await fetch(minisigUrl)
409
+ if (!sigResp.ok) {
410
+ throw new Error(
411
+ `Failed to fetch checksum signature from ${minisigUrl}: HTTP ${sigResp.status}\n` +
412
+ "Cannot verify release integrity. Aborting download.",
413
+ )
414
+ }
415
+ const sigText = await sigResp.text()
416
+ verifyMinisign(Buffer.from(checksumsText, "utf8"), sigText, pubKey)
417
+
405
418
  return extractChecksum(checksumsText, binaryFilename)
406
419
  }
407
420
 
@@ -425,10 +438,10 @@ async function fetchChecksums(
425
438
  const ED25519_SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex")
426
439
 
427
440
  /**
428
- * Verify a minisign signature (Ed25519 legacy mode, algorithm bytes "Ed").
429
- * Throws if verification fails.
441
+ * Verify a minisign signature. Supports both Ed25519 legacy mode ("Ed", over the
442
+ * raw file) and prehashed mode ("ED", over BLAKE2b-512(file)). Throws if invalid.
430
443
  */
431
- function verifyMinisign(fileBytes: Buffer, sigFileContent: string, pubKeyStr: string): void {
444
+ export function verifyMinisign(fileBytes: Buffer, sigFileContent: string, pubKeyStr: string): void {
432
445
  // Parse public key: [2 algo][8 keyId][32 ed25519 key]
433
446
  const pkLines = pubKeyStr.trim().split("\n")
434
447
  const pkBytes = Buffer.from(pkLines[pkLines.length - 1]!.trim(), "base64")
@@ -450,14 +463,17 @@ function verifyMinisign(fileBytes: Buffer, sigFileContent: string, pubKeyStr: st
450
463
  const sigKeyId = sigBytes.subarray(2, 10)
451
464
  const signature = sigBytes.subarray(10, 74)
452
465
 
453
- // Only Ed25519 legacy mode ("Ed" = 0x45, 0x64) is supported.
454
- // Hashed mode ("ED") requires BLAKE2b prehashing not implemented.
455
- if (algo[0] !== 0x45 || algo[1] !== 0x64) {
466
+ // Both Ed25519 modes are supported:
467
+ // "Ed" (0x45, 0x64) legacy: signature is over the raw file bytes.
468
+ // "ED" (0x45, 0x44) prehashed: signature is over BLAKE2b-512(file).
469
+ // Modern minisign (and our release pipeline) default to prehashed mode.
470
+ if (algo[0] !== 0x45 || (algo[1] !== 0x64 && algo[1] !== 0x44)) {
456
471
  throw new Error(
457
- "Unsupported minisign algorithm — only Ed25519 legacy mode supported.\n" +
472
+ "Unsupported minisign algorithm — expected Ed25519 ('Ed' legacy or 'ED' prehashed).\n" +
458
473
  `Got: 0x${algo[0]?.toString(16)}${algo[1]?.toString(16)}`,
459
474
  )
460
475
  }
476
+ const prehashed = algo[1] === 0x44
461
477
 
462
478
  if (!sigKeyId.equals(pkKeyId)) {
463
479
  throw new Error(
@@ -469,7 +485,13 @@ function verifyMinisign(fileBytes: Buffer, sigFileContent: string, pubKeyStr: st
469
485
  const spkiDer = Buffer.concat([ED25519_SPKI_PREFIX, pkEd25519])
470
486
  const keyObject = createPublicKey({ key: spkiDer, format: "der", type: "spki" })
471
487
 
472
- const valid = cryptoVerify(null, fileBytes, keyObject, signature)
488
+ // Pure Ed25519 (PureEdDSA) verifies over the message directly; for prehashed
489
+ // minisign the "message" is the BLAKE2b-512 digest of the file.
490
+ const signedData = prehashed
491
+ ? createHash("blake2b512").update(fileBytes).digest()
492
+ : fileBytes
493
+
494
+ const valid = cryptoVerify(null, signedData, keyObject, signature)
473
495
  if (!valid) {
474
496
  throw new Error(
475
497
  "Minisign signature verification FAILED — the checksum file may have been tampered with.\n" +
package/src/cli.ts CHANGED
@@ -15,6 +15,7 @@ import { registerMigrate } from "./commands/migrate.js"
15
15
  import { registerSeed } from "./commands/seed.js"
16
16
  import { registerKeys } from "./commands/keys.js"
17
17
  import { registerApp } from "./commands/app.js"
18
+ import { registerAdd } from "./commands/add.js"
18
19
  import { registerSelfHost } from "./commands/self-host.js"
19
20
  import { registerCloud } from "./commands/cloud.js"
20
21
  import { registerEngine } from "./commands/engine.js"
@@ -52,6 +53,7 @@ export function run(): void {
52
53
  registerSeed(program)
53
54
  registerKeys(program)
54
55
  registerApp(program)
56
+ registerAdd(program)
55
57
  registerSelfHost(program)
56
58
  registerCloud(program)
57
59
  registerEngine(program)
@@ -0,0 +1,94 @@
1
+ import type { Command } from "commander"
2
+ import * as p from "@clack/prompts"
3
+ import { loadConfig } from "../config.js"
4
+ import { selfHostTlsEnabled } from "../project-config.js"
5
+ import { updateServerConfigInProject } from "../app-config.js"
6
+ import { ensureNotCancelled, printLogo } from "../prompts.js"
7
+
8
+ export function registerAdd(program: Command): void {
9
+ const addCmd = program
10
+ .command("add")
11
+ .description("Add capabilities to an existing project")
12
+
13
+ addCmd
14
+ .command("domain [domain]")
15
+ .description("Add a custom domain with automatic HTTPS (self-host)")
16
+ .option("--email <email>", "Email for Let's Encrypt TLS certificates")
17
+ .action(async (domainArg: string | undefined, opts: { email?: string }) => {
18
+ await addDomain(domainArg, opts.email)
19
+ })
20
+ }
21
+
22
+ async function promptDomain(initial?: string): Promise<string> {
23
+ const trimmed = initial?.trim()
24
+ if (trimmed) return trimmed
25
+ return ensureNotCancelled(
26
+ await p.text({
27
+ message: "Please provide domain:",
28
+ placeholder: "demo.supatype.com",
29
+ validate: (v) => ((v ?? "").trim().length === 0 ? "Domain is required" : undefined),
30
+ }),
31
+ ).trim()
32
+ }
33
+
34
+ async function promptEmail(initial?: string): Promise<string> {
35
+ const trimmed = initial?.trim()
36
+ if (trimmed) return trimmed
37
+ return ensureNotCancelled(
38
+ await p.text({
39
+ message: "Please provide email for TLS",
40
+ placeholder: "hello@supatype.com",
41
+ validate: (v) => ((v ?? "").trim().length === 0 ? "Email is required" : undefined),
42
+ }),
43
+ ).trim()
44
+ }
45
+
46
+ async function addDomain(domainArg?: string, emailArg?: string): Promise<void> {
47
+ const cwd = process.cwd()
48
+ const interactive = !domainArg?.trim() || !emailArg?.trim()
49
+
50
+ if (interactive) {
51
+ printLogo()
52
+ p.intro("Add a custom domain")
53
+ }
54
+
55
+ const domain = await promptDomain(domainArg)
56
+ const email = await promptEmail(emailArg)
57
+
58
+ try {
59
+ const configPath = updateServerConfigInProject(cwd, { domain, tlsEmail: email })
60
+ if (interactive) {
61
+ p.outro(`Updated ${configPath}`)
62
+ } else {
63
+ console.log(` updated ${configPath}`)
64
+ }
65
+ printDomainNextSteps(cwd, domain)
66
+ } catch (err) {
67
+ console.error((err as Error).message)
68
+ process.exit(1)
69
+ }
70
+ }
71
+
72
+ function printDomainNextSteps(cwd: string, domain: string): void {
73
+ let tlsActive = true
74
+ try {
75
+ tlsActive = selfHostTlsEnabled(loadConfig(cwd))
76
+ } catch {
77
+ // config re-load is best-effort for the warning below
78
+ }
79
+
80
+ console.log(`\nDomain set to ${domain} with automatic HTTPS.`)
81
+ if (!tlsActive) {
82
+ console.log(
83
+ "\nNote: a supatype.local.config.ts override (server.mode=dev) is suppressing HTTPS locally.\n" +
84
+ "That file is gitignored, so HTTPS still activates on your production server.",
85
+ )
86
+ }
87
+ console.log("\nGo live:")
88
+ console.log(` 1. Point DNS: an A record for ${domain} -> your server's public IP`)
89
+ console.log(" 2. Open ports 80 and 443 on the server firewall")
90
+ console.log(" 3. supatype self-host compose up -d # Kong provisions HTTPS automatically")
91
+ console.log(`\nYour Supatype platform goes live at https://${domain}`)
92
+ console.log(" Your app, REST, Auth, Storage, Realtime, Functions, and Studio — all behind one HTTPS domain.")
93
+ console.log(" Certificates persist in the valkey-data volume.\n")
94
+ }
@@ -14,7 +14,7 @@ export function registerApp(program: Command): void {
14
14
  .description("Configure app routing: --static for a built site, or proxy to a dev server")
15
15
  .option("--static", "Serve a static directory at / (default: ./public, or [dir] argument)")
16
16
  .option("--port <port>", "Port your app listens on (proxy mode)", "3000")
17
- .option("--upstream <url>", "Explicit upstream URL (proxy mode; defaults to localhost:<port>)")
17
+ .option("--upstream <url>", "URL of your running dev server (proxy mode; defaults to localhost:<port>)")
18
18
  .option("--dockerfile <path>", "(deprecated) ignored — use supatype.config.ts")
19
19
  .action(
20
20
  (
@@ -77,7 +77,7 @@ function addProxyApp(cwd: string, port: string, upstream?: string): void {
77
77
  try {
78
78
  const configPath = updateAppConfigInProject(cwd, { mode: "proxy", upstream: upstreamUrl })
79
79
  console.log(` updated ${configPath}`)
80
- console.log(`\nApp upstream set to ${upstreamUrl}. The app will be available at ${localKongBaseUrl()}/\n`)
80
+ console.log(`\nForwarding requests to your dev server at ${upstreamUrl}. The app will be available at ${localKongBaseUrl()}/\n`)
81
81
  console.log("Run: supatype self-host compose render")
82
82
  } catch (err) {
83
83
  console.error((err as Error).message)