@supatype/cli 0.1.0-alpha.9 → 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 (407) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/.turbo/turbo-test.log +285 -69
  3. package/.turbo/turbo-typecheck.log +1 -1
  4. package/assets/supatype-logo-wordmark.ascii.txt +6 -0
  5. package/bin/dev-entry.ts +2 -1
  6. package/dist/app/framework.js +1 -3
  7. package/dist/app/framework.js.map +1 -1
  8. package/dist/app/proxy-dev-app.d.ts +14 -0
  9. package/dist/app/proxy-dev-app.d.ts.map +1 -1
  10. package/dist/app/proxy-dev-app.js +110 -6
  11. package/dist/app/proxy-dev-app.js.map +1 -1
  12. package/dist/app-config.d.ts +10 -0
  13. package/dist/app-config.d.ts.map +1 -1
  14. package/dist/app-config.js +72 -0
  15. package/dist/app-config.js.map +1 -1
  16. package/dist/assets/supatype-logo-wordmark.ascii.txt +6 -0
  17. package/dist/binary-cache.d.ts +19 -7
  18. package/dist/binary-cache.d.ts.map +1 -1
  19. package/dist/binary-cache.js +92 -46
  20. package/dist/binary-cache.js.map +1 -1
  21. package/dist/cli.d.ts +1 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +17 -2
  24. package/dist/cli.js.map +1 -1
  25. package/dist/commands/add.d.ts +3 -0
  26. package/dist/commands/add.d.ts.map +1 -0
  27. package/dist/commands/add.js +86 -0
  28. package/dist/commands/add.js.map +1 -0
  29. package/dist/commands/admin.d.ts +28 -1
  30. package/dist/commands/admin.d.ts.map +1 -1
  31. package/dist/commands/admin.js +297 -149
  32. package/dist/commands/admin.js.map +1 -1
  33. package/dist/commands/adopt.d.ts +3 -0
  34. package/dist/commands/adopt.d.ts.map +1 -0
  35. package/dist/commands/adopt.js +55 -0
  36. package/dist/commands/adopt.js.map +1 -0
  37. package/dist/commands/app.d.ts.map +1 -1
  38. package/dist/commands/app.js +20 -17
  39. package/dist/commands/app.js.map +1 -1
  40. package/dist/commands/cache.d.ts.map +1 -1
  41. package/dist/commands/cache.js +11 -10
  42. package/dist/commands/cache.js.map +1 -1
  43. package/dist/commands/cloud.d.ts +4 -9
  44. package/dist/commands/cloud.d.ts.map +1 -1
  45. package/dist/commands/cloud.js +75 -125
  46. package/dist/commands/cloud.js.map +1 -1
  47. package/dist/commands/db.d.ts.map +1 -1
  48. package/dist/commands/db.js +37 -58
  49. package/dist/commands/db.js.map +1 -1
  50. package/dist/commands/deploy.d.ts.map +1 -1
  51. package/dist/commands/deploy.js +140 -96
  52. package/dist/commands/deploy.js.map +1 -1
  53. package/dist/commands/dev.d.ts.map +1 -1
  54. package/dist/commands/dev.js +74 -39
  55. package/dist/commands/dev.js.map +1 -1
  56. package/dist/commands/diff.d.ts.map +1 -1
  57. package/dist/commands/diff.js +39 -39
  58. package/dist/commands/diff.js.map +1 -1
  59. package/dist/commands/doctor.d.ts +3 -0
  60. package/dist/commands/doctor.d.ts.map +1 -0
  61. package/dist/commands/doctor.js +78 -0
  62. package/dist/commands/doctor.js.map +1 -0
  63. package/dist/commands/engine.d.ts.map +1 -1
  64. package/dist/commands/engine.js +5 -4
  65. package/dist/commands/engine.js.map +1 -1
  66. package/dist/commands/functions.d.ts.map +1 -1
  67. package/dist/commands/functions.js +172 -119
  68. package/dist/commands/functions.js.map +1 -1
  69. package/dist/commands/generate.d.ts.map +1 -1
  70. package/dist/commands/generate.js +5 -4
  71. package/dist/commands/generate.js.map +1 -1
  72. package/dist/commands/init.d.ts +35 -1
  73. package/dist/commands/init.d.ts.map +1 -1
  74. package/dist/commands/init.js +883 -107
  75. package/dist/commands/init.js.map +1 -1
  76. package/dist/commands/introspect.d.ts +3 -0
  77. package/dist/commands/introspect.d.ts.map +1 -0
  78. package/dist/commands/introspect.js +35 -0
  79. package/dist/commands/introspect.js.map +1 -0
  80. package/dist/commands/keys.d.ts +15 -1
  81. package/dist/commands/keys.d.ts.map +1 -1
  82. package/dist/commands/keys.js +46 -10
  83. package/dist/commands/keys.js.map +1 -1
  84. package/dist/commands/link-helpers.d.ts +15 -0
  85. package/dist/commands/link-helpers.d.ts.map +1 -0
  86. package/dist/commands/link-helpers.js +225 -0
  87. package/dist/commands/link-helpers.js.map +1 -0
  88. package/dist/commands/logs.d.ts.map +1 -1
  89. package/dist/commands/logs.js +5 -4
  90. package/dist/commands/logs.js.map +1 -1
  91. package/dist/commands/migrate-from-v1.d.ts.map +1 -1
  92. package/dist/commands/migrate-from-v1.js +3 -2
  93. package/dist/commands/migrate-from-v1.js.map +1 -1
  94. package/dist/commands/migrate.d.ts.map +1 -1
  95. package/dist/commands/migrate.js +119 -26
  96. package/dist/commands/migrate.js.map +1 -1
  97. package/dist/commands/pg.d.ts.map +1 -1
  98. package/dist/commands/pg.js +11 -12
  99. package/dist/commands/pg.js.map +1 -1
  100. package/dist/commands/plugins.d.ts.map +1 -1
  101. package/dist/commands/plugins.js +55 -46
  102. package/dist/commands/plugins.js.map +1 -1
  103. package/dist/commands/pull.d.ts.map +1 -1
  104. package/dist/commands/pull.js +33 -5
  105. package/dist/commands/pull.js.map +1 -1
  106. package/dist/commands/push.d.ts.map +1 -1
  107. package/dist/commands/push.js +111 -138
  108. package/dist/commands/push.js.map +1 -1
  109. package/dist/commands/seed.d.ts.map +1 -1
  110. package/dist/commands/seed.js +4 -3
  111. package/dist/commands/seed.js.map +1 -1
  112. package/dist/commands/self-host.d.ts +2 -2
  113. package/dist/commands/self-host.d.ts.map +1 -1
  114. package/dist/commands/self-host.js +65 -50
  115. package/dist/commands/self-host.js.map +1 -1
  116. package/dist/commands/self-update.d.ts.map +1 -1
  117. package/dist/commands/self-update.js +3 -2
  118. package/dist/commands/self-update.js.map +1 -1
  119. package/dist/commands/status.d.ts +1 -1
  120. package/dist/commands/status.d.ts.map +1 -1
  121. package/dist/commands/status.js +95 -29
  122. package/dist/commands/status.js.map +1 -1
  123. package/dist/commands/types.d.ts.map +1 -1
  124. package/dist/commands/types.js +3 -2
  125. package/dist/commands/types.js.map +1 -1
  126. package/dist/commands/update.d.ts.map +1 -1
  127. package/dist/commands/update.js +54 -21
  128. package/dist/commands/update.js.map +1 -1
  129. package/dist/compose-rename.d.ts +10 -0
  130. package/dist/compose-rename.d.ts.map +1 -0
  131. package/dist/compose-rename.js +67 -0
  132. package/dist/compose-rename.js.map +1 -0
  133. package/dist/config.d.ts +2 -1
  134. package/dist/config.d.ts.map +1 -1
  135. package/dist/config.js.map +1 -1
  136. package/dist/dev-compose.d.ts +26 -0
  137. package/dist/dev-compose.d.ts.map +1 -1
  138. package/dist/dev-compose.js +357 -79
  139. package/dist/dev-compose.js.map +1 -1
  140. package/dist/dev-log-bus.d.ts +30 -0
  141. package/dist/dev-log-bus.d.ts.map +1 -0
  142. package/dist/dev-log-bus.js +87 -0
  143. package/dist/dev-log-bus.js.map +1 -0
  144. package/dist/dev-log-filter.d.ts +10 -0
  145. package/dist/dev-log-filter.d.ts.map +1 -0
  146. package/dist/dev-log-filter.js +36 -0
  147. package/dist/dev-log-filter.js.map +1 -0
  148. package/dist/dev-logo.d.ts +12 -0
  149. package/dist/dev-logo.d.ts.map +1 -0
  150. package/dist/dev-logo.js +56 -0
  151. package/dist/dev-logo.js.map +1 -0
  152. package/dist/dev-ports.d.ts +27 -0
  153. package/dist/dev-ports.d.ts.map +1 -0
  154. package/dist/dev-ports.js +171 -0
  155. package/dist/dev-ports.js.map +1 -0
  156. package/dist/dev-session-lock.d.ts +25 -0
  157. package/dist/dev-session-lock.d.ts.map +1 -0
  158. package/dist/dev-session-lock.js +81 -0
  159. package/dist/dev-session-lock.js.map +1 -0
  160. package/dist/dev-session.d.ts +26 -0
  161. package/dist/dev-session.d.ts.map +1 -0
  162. package/dist/dev-session.js +106 -0
  163. package/dist/dev-session.js.map +1 -0
  164. package/dist/dev-shutdown.d.ts +25 -0
  165. package/dist/dev-shutdown.d.ts.map +1 -0
  166. package/dist/dev-shutdown.js +114 -0
  167. package/dist/dev-shutdown.js.map +1 -0
  168. package/dist/dev-task-colors.d.ts +13 -0
  169. package/dist/dev-task-colors.d.ts.map +1 -0
  170. package/dist/dev-task-colors.js +43 -0
  171. package/dist/dev-task-colors.js.map +1 -0
  172. package/dist/dev-tui.d.ts +24 -0
  173. package/dist/dev-tui.d.ts.map +1 -0
  174. package/dist/dev-tui.js +188 -0
  175. package/dist/dev-tui.js.map +1 -0
  176. package/dist/diff-output.d.ts +5 -1
  177. package/dist/diff-output.d.ts.map +1 -1
  178. package/dist/diff-output.js +69 -0
  179. package/dist/diff-output.js.map +1 -1
  180. package/dist/docker-runtime.d.ts +30 -0
  181. package/dist/docker-runtime.d.ts.map +1 -0
  182. package/dist/docker-runtime.js +118 -0
  183. package/dist/docker-runtime.js.map +1 -0
  184. package/dist/engine-client.d.ts +10 -1
  185. package/dist/engine-client.d.ts.map +1 -1
  186. package/dist/engine-client.js +76 -17
  187. package/dist/engine-client.js.map +1 -1
  188. package/dist/engine-push-output.d.ts +17 -0
  189. package/dist/engine-push-output.d.ts.map +1 -0
  190. package/dist/engine-push-output.js +64 -0
  191. package/dist/engine-push-output.js.map +1 -0
  192. package/dist/ensure-binary.js +2 -2
  193. package/dist/ensure-binary.js.map +1 -1
  194. package/dist/env-file.d.ts +5 -0
  195. package/dist/env-file.d.ts.map +1 -0
  196. package/dist/env-file.js +33 -0
  197. package/dist/env-file.js.map +1 -0
  198. package/dist/gitignore.d.ts +8 -0
  199. package/dist/gitignore.d.ts.map +1 -0
  200. package/dist/gitignore.js +41 -0
  201. package/dist/gitignore.js.map +1 -0
  202. package/dist/kong-config.d.ts +9 -0
  203. package/dist/kong-config.d.ts.map +1 -1
  204. package/dist/kong-config.js +18 -1
  205. package/dist/kong-config.js.map +1 -1
  206. package/dist/link.d.ts +66 -0
  207. package/dist/link.d.ts.map +1 -0
  208. package/dist/link.js +160 -0
  209. package/dist/link.js.map +1 -0
  210. package/dist/process-manager.d.ts +8 -0
  211. package/dist/process-manager.d.ts.map +1 -1
  212. package/dist/process-manager.js +53 -9
  213. package/dist/process-manager.js.map +1 -1
  214. package/dist/project-config.d.ts +30 -3
  215. package/dist/project-config.d.ts.map +1 -1
  216. package/dist/project-config.js +37 -4
  217. package/dist/project-config.js.map +1 -1
  218. package/dist/prompts.d.ts +3 -0
  219. package/dist/prompts.d.ts.map +1 -0
  220. package/dist/prompts.js +3 -0
  221. package/dist/prompts.js.map +1 -0
  222. package/dist/pull-utils.d.ts +50 -14
  223. package/dist/pull-utils.d.ts.map +1 -1
  224. package/dist/pull-utils.js +152 -12
  225. package/dist/pull-utils.js.map +1 -1
  226. package/dist/resolve-target.d.ts +86 -0
  227. package/dist/resolve-target.d.ts.map +1 -0
  228. package/dist/resolve-target.js +291 -0
  229. package/dist/resolve-target.js.map +1 -0
  230. package/dist/restore-system-relation-targets.d.ts +3 -0
  231. package/dist/restore-system-relation-targets.d.ts.map +1 -0
  232. package/dist/restore-system-relation-targets.js +45 -0
  233. package/dist/restore-system-relation-targets.js.map +1 -0
  234. package/dist/runtime-routes.d.ts.map +1 -1
  235. package/dist/runtime-routes.js +7 -0
  236. package/dist/runtime-routes.js.map +1 -1
  237. package/dist/schema-ast-v2.d.ts +1 -1
  238. package/dist/schema-ast-v2.d.ts.map +1 -1
  239. package/dist/schema-ast-v2.js +2 -2
  240. package/dist/schema-ast-v2.js.map +1 -1
  241. package/dist/schema-sources.d.ts +40 -0
  242. package/dist/schema-sources.d.ts.map +1 -0
  243. package/dist/schema-sources.js +183 -0
  244. package/dist/schema-sources.js.map +1 -0
  245. package/dist/scripts/postinstall.js +5 -1
  246. package/dist/scripts/postinstall.js.map +1 -1
  247. package/dist/self-host-compose.d.ts +37 -1
  248. package/dist/self-host-compose.d.ts.map +1 -1
  249. package/dist/self-host-compose.js +234 -43
  250. package/dist/self-host-compose.js.map +1 -1
  251. package/dist/storage-provision.d.ts +4 -0
  252. package/dist/storage-provision.d.ts.map +1 -1
  253. package/dist/storage-provision.js +24 -2
  254. package/dist/storage-provision.js.map +1 -1
  255. package/dist/supatype-eval-1781522769253.d.mts +2 -0
  256. package/dist/supatype-eval-1781522769253.d.mts.map +1 -0
  257. package/dist/supatype-eval-1781522769253.mjs +3 -0
  258. package/dist/supatype-eval-1781522769253.mjs.map +1 -0
  259. package/dist/systemd.js +2 -2
  260. package/dist/systemd.js.map +1 -1
  261. package/dist/target-client.d.ts +10 -0
  262. package/dist/target-client.d.ts.map +1 -0
  263. package/dist/target-client.js +22 -0
  264. package/dist/target-client.js.map +1 -0
  265. package/dist/type-extractor.d.ts +11 -0
  266. package/dist/type-extractor.d.ts.map +1 -1
  267. package/dist/type-extractor.js +95 -8
  268. package/dist/type-extractor.js.map +1 -1
  269. package/dist/ui/brand.d.ts +9 -0
  270. package/dist/ui/brand.d.ts.map +1 -0
  271. package/dist/ui/brand.js +11 -0
  272. package/dist/ui/brand.js.map +1 -0
  273. package/dist/ui/confirm.d.ts +12 -0
  274. package/dist/ui/confirm.d.ts.map +1 -0
  275. package/dist/ui/confirm.js +28 -0
  276. package/dist/ui/confirm.js.map +1 -0
  277. package/dist/ui/fatal.d.ts +10 -0
  278. package/dist/ui/fatal.d.ts.map +1 -0
  279. package/dist/ui/fatal.js +34 -0
  280. package/dist/ui/fatal.js.map +1 -0
  281. package/dist/ui/index.d.ts +9 -0
  282. package/dist/ui/index.d.ts.map +1 -0
  283. package/dist/ui/index.js +9 -0
  284. package/dist/ui/index.js.map +1 -0
  285. package/dist/ui/interactive.d.ts +3 -0
  286. package/dist/ui/interactive.d.ts.map +1 -0
  287. package/dist/ui/interactive.js +5 -0
  288. package/dist/ui/interactive.js.map +1 -0
  289. package/dist/ui/messages.d.ts +10 -0
  290. package/dist/ui/messages.d.ts.map +1 -0
  291. package/dist/ui/messages.js +35 -0
  292. package/dist/ui/messages.js.map +1 -0
  293. package/dist/ui/next-steps.d.ts +3 -0
  294. package/dist/ui/next-steps.d.ts.map +1 -0
  295. package/dist/ui/next-steps.js +10 -0
  296. package/dist/ui/next-steps.js.map +1 -0
  297. package/dist/ui/progress.d.ts +5 -0
  298. package/dist/ui/progress.d.ts.map +1 -0
  299. package/dist/ui/progress.js +24 -0
  300. package/dist/ui/progress.js.map +1 -0
  301. package/dist/ui/prompts.d.ts +14 -0
  302. package/dist/ui/prompts.d.ts.map +1 -0
  303. package/dist/ui/prompts.js +34 -0
  304. package/dist/ui/prompts.js.map +1 -0
  305. package/package.json +5 -2
  306. package/src/app/framework.ts +1 -3
  307. package/src/app/proxy-dev-app.ts +114 -6
  308. package/src/app-config.ts +80 -0
  309. package/src/binary-cache.ts +102 -52
  310. package/src/cli.ts +16 -2
  311. package/src/commands/add.ts +97 -0
  312. package/src/commands/admin.ts +381 -190
  313. package/src/commands/adopt.ts +82 -0
  314. package/src/commands/app.ts +20 -17
  315. package/src/commands/cache.ts +11 -10
  316. package/src/commands/cloud.ts +91 -142
  317. package/src/commands/db.ts +40 -63
  318. package/src/commands/deploy.ts +186 -126
  319. package/src/commands/dev.ts +98 -55
  320. package/src/commands/diff.ts +52 -43
  321. package/src/commands/doctor.ts +103 -0
  322. package/src/commands/engine.ts +5 -4
  323. package/src/commands/functions.ts +187 -123
  324. package/src/commands/generate.ts +5 -4
  325. package/src/commands/init.ts +1087 -104
  326. package/src/commands/introspect.ts +48 -0
  327. package/src/commands/keys.ts +56 -14
  328. package/src/commands/link-helpers.ts +273 -0
  329. package/src/commands/logs.ts +5 -4
  330. package/src/commands/migrate-from-v1.ts +3 -2
  331. package/src/commands/migrate.ts +167 -27
  332. package/src/commands/pg.ts +13 -18
  333. package/src/commands/plugins.ts +55 -46
  334. package/src/commands/pull.ts +38 -9
  335. package/src/commands/push.ts +148 -175
  336. package/src/commands/seed.ts +5 -4
  337. package/src/commands/self-host.ts +85 -54
  338. package/src/commands/self-update.ts +3 -2
  339. package/src/commands/status.ts +102 -33
  340. package/src/commands/types.ts +3 -2
  341. package/src/commands/update.ts +59 -23
  342. package/src/compose-rename.ts +76 -0
  343. package/src/config.ts +2 -1
  344. package/src/dev-compose.ts +462 -76
  345. package/src/dev-log-bus.ts +101 -0
  346. package/src/dev-log-filter.ts +32 -0
  347. package/src/dev-logo.ts +61 -0
  348. package/src/dev-ports.ts +212 -0
  349. package/src/dev-session-lock.ts +101 -0
  350. package/src/dev-session.ts +130 -0
  351. package/src/dev-shutdown.ts +147 -0
  352. package/src/dev-task-colors.ts +47 -0
  353. package/src/dev-tui.ts +232 -0
  354. package/src/diff-output.ts +79 -1
  355. package/src/docker-runtime.ts +151 -0
  356. package/src/engine-client.ts +81 -17
  357. package/src/engine-push-output.ts +75 -0
  358. package/src/ensure-binary.ts +2 -2
  359. package/src/env-file.ts +37 -0
  360. package/src/gitignore.ts +48 -0
  361. package/src/kong-config.ts +24 -1
  362. package/src/link.ts +243 -0
  363. package/src/process-manager.ts +66 -10
  364. package/src/project-config.ts +62 -7
  365. package/src/prompts.ts +2 -0
  366. package/src/pull-utils.ts +217 -23
  367. package/src/resolve-target.ts +419 -0
  368. package/src/restore-system-relation-targets.ts +45 -0
  369. package/src/runtime-routes.ts +7 -0
  370. package/src/schema-ast-v2.ts +2 -1
  371. package/src/schema-sources.ts +248 -0
  372. package/src/scripts/postinstall.ts +7 -1
  373. package/src/self-host-compose.ts +262 -46
  374. package/src/storage-provision.ts +33 -1
  375. package/src/supatype-eval-1781522769253.mts +1 -0
  376. package/src/systemd.ts +2 -2
  377. package/src/target-client.ts +40 -0
  378. package/src/type-extractor.ts +124 -11
  379. package/src/ui/README.md +17 -0
  380. package/src/ui/brand.ts +12 -0
  381. package/src/ui/confirm.ts +38 -0
  382. package/src/ui/fatal.ts +43 -0
  383. package/src/ui/index.ts +8 -0
  384. package/src/ui/interactive.ts +4 -0
  385. package/src/ui/messages.ts +43 -0
  386. package/src/ui/next-steps.ts +10 -0
  387. package/src/ui/progress.ts +28 -0
  388. package/src/ui/prompts.ts +40 -0
  389. package/tests/admin-ensure.test.ts +59 -0
  390. package/tests/cli-help.test.ts +27 -2
  391. package/tests/config.test.ts +29 -2
  392. package/tests/dev-ports.test.ts +41 -0
  393. package/tests/dev-session-lock.test.ts +54 -0
  394. package/tests/dev-ui.test.ts +162 -0
  395. package/tests/docker-runtime.test.ts +236 -0
  396. package/tests/engine-push-output.test.ts +67 -0
  397. package/tests/init.test.ts +197 -18
  398. package/tests/link.test.ts +148 -0
  399. package/tests/minisign.test.ts +102 -0
  400. package/tests/proxy-dev-app.test.ts +45 -1
  401. package/tests/pull-utils.test.ts +5 -4
  402. package/tests/runtime-contract.test.ts +186 -2
  403. package/tests/schema-sources.test.ts +119 -0
  404. package/tests/storage-provision.test.ts +100 -0
  405. package/tests/ui-confirm.test.ts +41 -0
  406. package/tests/ui-messages.test.ts +66 -0
  407. package/tsconfig.tsbuildinfo +1 -1
@@ -16,6 +16,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"
16
16
  import { homedir } from "node:os"
17
17
  import { isAbsolute, join, relative, resolve } from "node:path"
18
18
  import { loadConfig } from "../config.js"
19
+ import type { ExtractedSchemaAstV2 } from "../schema-ast-v2.js"
19
20
  import {
20
21
  functionsPathCandidatesFromProject,
21
22
  resolveRuntimeProvider,
@@ -36,7 +37,12 @@ import { ensureBinary } from "../ensure-binary.js"
36
37
  import { startProxyDevApp } from "../app/proxy-dev-app.js"
37
38
  import { ProcessManager } from "../process-manager.js"
38
39
  import { startStudioViteDevServer } from "../studio-dev-server.js"
40
+ import { restoreSystemRelationTargets } from "../restore-system-relation-targets.js"
39
41
  import { localStorageEnv } from "../local-storage.js"
42
+ import { beginDevSession, endDevSession, resolveDevUiMode, startDevSession } from "../dev-session.js"
43
+ import { probeDockerDaemon, reportDockerUnavailable } from "../docker-runtime.js"
44
+ import { fatalError } from "../ui/fatal.js"
45
+ import { registerDevShutdown } from "../dev-shutdown.js"
40
46
  import {
41
47
  initdb,
42
48
  start as pgStart,
@@ -63,17 +69,71 @@ function gotrueSMTPFromEmailConfig(email: SupatypeProjectConfig["email"] | undef
63
69
  return out
64
70
  }
65
71
 
72
+ const NATIVE_PG_PORT = 5432
73
+
74
+ function portCheckCommand(port: number): string {
75
+ return process.platform === "win32"
76
+ ? `netstat -ano | findstr :${port}`
77
+ : `lsof -i :${port}`
78
+ }
79
+
80
+ async function assertNativeDevPortsFree(serverPort: number, postgrestPort: number): Promise<void> {
81
+ const brand = { intro: "Local development" }
82
+ if (await isPortInUse(NATIVE_PG_PORT)) {
83
+ fatalError(
84
+ `Port ${NATIVE_PG_PORT} is already in use.`,
85
+ ["Another Postgres instance may be running.", `Check: ${portCheckCommand(NATIVE_PG_PORT)}`],
86
+ { brand },
87
+ )
88
+ }
89
+ if (await isPortInUse(serverPort)) {
90
+ fatalError(
91
+ `Port ${serverPort} is already in use.`,
92
+ ["Another supatype-server may be running.", `Check: ${portCheckCommand(serverPort)}`],
93
+ { brand },
94
+ )
95
+ }
96
+ if (await isPortInUse(postgrestPort)) {
97
+ fatalError(
98
+ `Port ${postgrestPort} is already in use.`,
99
+ ["Another service may be running.", `Check: ${portCheckCommand(postgrestPort)}`],
100
+ { brand },
101
+ )
102
+ }
103
+ }
104
+
66
105
  export function registerDev(program: Command): void {
67
106
  program
68
107
  .command("dev")
69
108
  .description("Start local Postgres, apply schema, and run supatype-server")
70
109
  .option("--no-watch", "Start services but do not watch for schema changes")
110
+ .option("--stream", "Print interleaved logs instead of the interactive TUI")
71
111
  .option("--port <port>", "Port for supatype-server (overrides config)", String)
72
- .action(async (opts: { watch: boolean; port?: string }) => {
112
+ .action(async (opts: { watch: boolean; stream?: boolean; port?: string }) => {
73
113
  const cwd = process.cwd()
74
114
 
75
- // ── 1. Load project config ─────────────────────────────────────────────
115
+ // ── 1. Load project config (before TUI — fatal errors must hit real stderr) ──
76
116
  const config = loadConfig(cwd)
117
+ const provider = resolveRuntimeProvider(config)
118
+
119
+ if (provider === "docker") {
120
+ const probe = probeDockerDaemon()
121
+ if (!probe.ok) {
122
+ reportDockerUnavailable(probe, { brand: { intro: "Local development" } })
123
+ process.exit(1)
124
+ }
125
+ }
126
+
127
+ const projectName = config.project.name
128
+ const serverPort = opts.port ?? String(config.server.port ?? 54321)
129
+ const postgrestPort = String(config.server.postgrestPort ?? 3001)
130
+
131
+ if (provider !== "docker") {
132
+ await assertNativeDevPortsFree(Number(serverPort), Number(postgrestPort))
133
+ }
134
+
135
+ beginDevSession(resolveDevUiMode(opts.stream === true))
136
+ startDevSession()
77
137
  if (hasMeaningfulOverrides(config)) {
78
138
  console.warn("[supatype] Local binary overrides active:")
79
139
  for (const line of describeActiveOverrides(config)) {
@@ -81,10 +141,6 @@ export function registerDev(program: Command): void {
81
141
  }
82
142
  console.warn("")
83
143
  }
84
- const projectName = config.project.name
85
- const serverPort = opts.port ?? String(config.server.port ?? 54321)
86
- const postgrestPort = String(config.server.postgrestPort ?? 3001)
87
- const provider = resolveRuntimeProvider(config)
88
144
 
89
145
  if (provider === "docker") {
90
146
  const { runDevCompose } = await import("../dev-compose.js")
@@ -109,33 +165,10 @@ export function registerDev(program: Command): void {
109
165
  mkdirSync(d, { recursive: true })
110
166
  }
111
167
 
112
- // ── 4. Port collision check ───────────────────────────────────────────
113
- const pgPort = 5432
114
- if (await isPortInUse(pgPort)) {
115
- console.error(
116
- `[supatype] Port ${pgPort} is already in use. Another Postgres instance may be running.\n` +
117
- ` Check: lsof -i :${pgPort}`,
118
- )
119
- process.exit(1)
120
- }
121
- if (await isPortInUse(Number(serverPort))) {
122
- console.error(
123
- `[supatype] Port ${serverPort} is already in use. Another supatype-server may be running.\n` +
124
- ` Check: lsof -i :${serverPort}`,
125
- )
126
- process.exit(1)
127
- }
128
- if (await isPortInUse(Number(postgrestPort))) {
129
- console.error(
130
- `[supatype] Port ${postgrestPort} is already in use. Another service may be running.\n` +
131
- ` Check: lsof -i :${postgrestPort}`,
132
- )
133
- process.exit(1)
134
- }
135
-
136
168
  // ── 5–7. Start Postgres ───────────────────────────────────────────────
137
169
  let dbURL: string
138
170
  let stopPostgres: () => void | Promise<void>
171
+ const pgPort = NATIVE_PG_PORT
139
172
  const pgPassword = "postgres"
140
173
  // pgBinDir is set on the native path and used to add DLL search path for
141
174
  // PostgREST on Windows (PostgREST links against libpq + SSL from MinGW).
@@ -233,6 +266,9 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
233
266
  (e: unknown) => console.error("[supatype] Initial schema push failed:", (e as Error).message),
234
267
  )
235
268
 
269
+ const { ensureFirstAdminUser } = await import("./admin.js")
270
+ await ensureFirstAdminUser(dbURL, { cwd })
271
+
236
272
  // ── 10. Spawn supatype-server ─────────────────────────────────────────
237
273
 
238
274
  // Resolve edge functions config: only enable Deno if a functions dir exists.
@@ -252,7 +288,8 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
252
288
  console.log(`[supatype] Edge functions enabled (${functionsDir})`)
253
289
  try {
254
290
  denoBinPath = await ensureBinary("deno", config)
255
- console.log(`[supatype] Deno runtime: ${denoBinPath} (v${config.versions.deno})`)
291
+ const denoVersion = await (await import("../binary-cache.js")).resolveVersionFor("deno", config)
292
+ console.log(`[supatype] Deno runtime: ${denoBinPath} (v${denoVersion})`)
256
293
  if (functionRoutes.length > 0) {
257
294
  console.log(
258
295
  `[supatype] Edge functions router: ${relative(cwd, denoServeScriptAbs) || ".supatype/functions-router.ts"} ` +
@@ -263,7 +300,7 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
263
300
  }
264
301
  } catch (err) {
265
302
  console.warn(
266
- `[supatype] ⚠ Found ${functionsDir} but could not provision Deno v${config.versions.deno} — edge functions will not run.\n` +
303
+ `[supatype] ⚠ Found ${functionsDir} but could not provision Deno — edge functions will not run.\n` +
267
304
  ` ${(err as Error).message}\n` +
268
305
  " (Functions still appear in Studio; invocations need Deno.)",
269
306
  )
@@ -473,8 +510,8 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
473
510
 
474
511
 
475
512
  // ── Shutdown handler ──────────────────────────────────────────────────
476
- const cleanup = async () => {
477
- console.log("\n[supatype] Shutting down...")
513
+ registerDevShutdown(async () => {
514
+ console.log("[supatype] Shutting down...")
478
515
  await Promise.all([
479
516
  serverProc.stop(),
480
517
  postgrestProc?.stop(),
@@ -482,10 +519,7 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
482
519
  appProc?.stop(),
483
520
  ])
484
521
  await stopPostgres()
485
- process.exit(0)
486
- }
487
- process.once("SIGINT", cleanup)
488
- process.once("SIGTERM", cleanup)
522
+ })
489
523
 
490
524
  // ── 10. Schema watch ──────────────────────────────────────────────────
491
525
  if (opts.watch) {
@@ -564,14 +598,27 @@ async function runSchemaPush(
564
598
 
565
599
  // Push schema.
566
600
  console.log("[supatype] Applying schema...")
567
- const pushResult = spawnSync(
568
- engineBin,
569
- ["push", "-i", astPath, "--database-url", dbURL, "--force", "--non-interactive"],
570
- { cwd, stdio: "inherit", encoding: "utf8" },
571
- )
572
- if (pushResult.status !== 0) {
601
+ const { ensureEngine, engineRequest } = await import("../engine-client.js")
602
+ const { writeSchemaSourcePushArtifacts } = await import("../schema-sources.js")
603
+ await ensureEngine()
604
+ const pgSchema = config?.schema?.pg_schema ?? "public"
605
+ const sources = writeSchemaSourcePushArtifacts(cwd)
606
+ try {
607
+ await engineRequest("/push", {
608
+ ast,
609
+ database_url: dbURL,
610
+ schema: pgSchema,
611
+ force: true,
612
+ ...(sources
613
+ ? {
614
+ schema_sources_gz_base64: sources.payload.dataBase64,
615
+ schema_sources_manifest: sources.payload.manifest,
616
+ }
617
+ : {}),
618
+ })
619
+ } catch (err) {
573
620
  _lastFailedAst = astJson
574
- throw new Error(`Engine schema push failed (exit ${pushResult.status})`)
621
+ throw err
575
622
  }
576
623
  _lastPushedAst = astJson
577
624
  _lastFailedAst = null
@@ -623,6 +670,7 @@ async function runSchemaPush(
623
670
  } catch {
624
671
  admin = adminResult.stdout
625
672
  }
673
+ restoreSystemRelationTargets(admin, ast)
626
674
  const merged = config ? withAdminRoles(admin, config) : admin
627
675
  writeFileSync(adminConfigPath, `${JSON.stringify(merged, null, 2)}\n`)
628
676
  }
@@ -631,10 +679,6 @@ async function runSchemaPush(
631
679
  console.log("[supatype] Schema applied.")
632
680
  }
633
681
 
634
- // ---------------------------------------------------------------------------
635
- // Storage bucket provisioning (local dev only)
636
- // ---------------------------------------------------------------------------
637
-
638
682
  function provisionStorageBuckets(
639
683
  declared: Array<{
640
684
  id: string
@@ -702,10 +746,9 @@ async function resolvePgBinDir(config: Awaited<ReturnType<typeof loadConfig>>):
702
746
  }
703
747
 
704
748
  // Locate cached Postgres archive.
705
- const { cachePath } = await import("../binary-cache.js")
706
- const version = config.versions.postgres
707
- const { currentPlatform } = await import("../binary-cache.js")
749
+ const { cachePath, currentPlatform, resolveVersionFor } = await import("../binary-cache.js")
708
750
  const platform = currentPlatform()
751
+ const version = await resolveVersionFor("postgres", config)
709
752
 
710
753
  const pgCacheDir = cachePath("postgres", version)
711
754
  const extractedDir = join(pgCacheDir, `pg-${version}`)
@@ -915,9 +958,9 @@ const EXTENSION_FIELDS: Record<string, { ext: string; fallback: AstField }> = {
915
958
  }
916
959
 
917
960
  function adaptUnsupportedKinds(
918
- ast: unknown,
961
+ ast: ExtractedSchemaAstV2,
919
962
  skipKinds: ReadonlySet<string>,
920
- ): { filtered: unknown; adapted: string[] } {
963
+ ): { filtered: ExtractedSchemaAstV2; adapted: string[] } {
921
964
  const adapted: string[] = []
922
965
  if (!ast || typeof ast !== "object") return { filtered: ast, adapted }
923
966
  const schema = ast as AstSchema
@@ -937,7 +980,7 @@ function adaptUnsupportedKinds(
937
980
  return { ...model, fields }
938
981
  })
939
982
 
940
- return { filtered: { ...schema, models }, adapted }
983
+ return { filtered: { ...schema, models } as ExtractedSchemaAstV2, adapted }
941
984
  }
942
985
 
943
986
  // ---------------------------------------------------------------------------
@@ -1,63 +1,72 @@
1
1
  import type { Command } from "commander"
2
2
  import { loadConfig, loadSchemaAst } from "../config.js"
3
- import { connectionString, schemaPathFromProject } from "../project-config.js"
4
- import { ensureEngine, engineRequest, type DiffResult } from "../engine-client.js"
5
- import { printDiffWarnings } from "../diff-output.js"
3
+ import { resolveRuntimeProvider, schemaPathFromProject } from "../project-config.js"
4
+ import { printDiffOperations, printDiffWarnings } from "../diff-output.js"
5
+ import { resolveTarget, targetSchemaDiff, schemaPgSchema } from "../resolve-target.js"
6
+ import { loadProjectLink } from "../link.js"
7
+ import { withSpinner } from "../ui/progress.js"
6
8
 
7
9
  export function registerDiff(program: Command): void {
8
10
  program
9
11
  .command("diff")
10
12
  .description("Show planned schema changes without applying them (dry run)")
11
13
  .option("--connection <url>", "Database connection URL (overrides config)")
12
- .action(async (opts: { connection?: string }) => {
14
+ .option("--env <name>", "Target environment when linked")
15
+ .option("--direct", "Use local engine subprocess")
16
+ .action(async (opts: { connection?: string; env?: string; direct?: boolean }) => {
13
17
  const cwd = process.cwd()
14
18
  const config = loadConfig(cwd)
15
- const connection = opts.connection ?? connectionString(config)
19
+ const pgSchema = schemaPgSchema(cwd)
16
20
 
17
- await ensureEngine()
21
+ const ast = await withSpinner("Loading schema", async () =>
22
+ loadSchemaAst(schemaPathFromProject(config, cwd), cwd),
23
+ )
18
24
 
19
- console.log("Loading schema...")
20
- const ast = loadSchemaAst(schemaPathFromProject(config, cwd), cwd)
25
+ const linked = loadProjectLink(cwd)
26
+ const useDirect = opts.direct || Boolean(opts.connection)
21
27
 
22
- const diff = await engineRequest<DiffResult>("/diff", {
23
- ast,
24
- database_url: connection,
25
- schema: "public",
26
- })
27
-
28
- const ops = diff.operations ?? []
29
- printDiffWarnings(diff)
30
-
31
- if (ops.length === 0) {
32
- console.log("No changes.")
28
+ if (linked && !useDirect && !opts.connection) {
29
+ const target = resolveTarget(cwd, { env: opts.env })
30
+ const diff = await withSpinner("Computing diff", () =>
31
+ targetSchemaDiff(target, ast, { schema: pgSchema }),
32
+ )
33
+ printDiffWarnings(diff)
34
+ printDiffOperations(diff)
33
35
  return
34
36
  }
35
37
 
36
- const symbol: Record<NonNullable<DiffResult["operations"][number]["risk"]>, string> = {
37
- safe: "+",
38
- warn: "~",
39
- cautious: "~",
40
- danger: "!",
41
- destructive: "!",
42
- }
43
- const legend: typeof symbol = {
44
- safe: "safe",
45
- warn: "caution",
46
- cautious: "caution",
47
- danger: "DANGER",
48
- destructive: "DANGER",
49
- }
50
-
51
- console.log(`\n${ops.length} change(s):\n`)
52
- for (const op of ops) {
53
- const r = op.risk ?? "safe"
54
- console.log(` [${symbol[r]}] ${op.description} (${legend[r]})`)
38
+ if (
39
+ !opts.connection &&
40
+ !useDirect &&
41
+ resolveRuntimeProvider(config) === "docker"
42
+ ) {
43
+ const localTarget = resolveTarget(cwd, { env: opts.env })
44
+ if (localTarget.mode === "local" && localTarget.token) {
45
+ const diff = await withSpinner("Computing diff", () =>
46
+ targetSchemaDiff(localTarget, ast, { schema: pgSchema }),
47
+ )
48
+ printDiffWarnings(diff)
49
+ printDiffOperations(diff)
50
+ return
51
+ }
52
+ const { diffSchemaDocker } = await import("../dev-compose.js")
53
+ const diff = await withSpinner("Computing diff via Docker Compose", () =>
54
+ diffSchemaDocker(cwd, config),
55
+ )
56
+ printDiffWarnings(diff)
57
+ printDiffOperations(diff)
58
+ return
55
59
  }
56
60
 
57
- const dangerous = ops.filter((o) => o.risk === "danger").length
58
- if (dangerous > 0) {
59
- console.log(`\n ${dangerous} dangerous operation(s). Review before pushing.`)
60
- }
61
- console.log()
61
+ const target = resolveTarget(cwd, {
62
+ env: opts.env,
63
+ direct: true,
64
+ connection: opts.connection,
65
+ })
66
+ const diff = await withSpinner("Computing diff", () =>
67
+ targetSchemaDiff(target, ast, { schema: pgSchema }),
68
+ )
69
+ printDiffWarnings(diff)
70
+ printDiffOperations(diff)
62
71
  })
63
72
  }
@@ -0,0 +1,103 @@
1
+ import type { Command } from "commander"
2
+ import { loadConfig, loadSchemaAst } from "../config.js"
3
+ import { info, plain } from "../ui/messages.js"
4
+ import { schemaPathFromProject } from "../project-config.js"
5
+ import { resolveTarget, targetSchemaDoctor, schemaPgSchema } from "../resolve-target.js"
6
+ import { loadProjectLink } from "../link.js"
7
+ import { resolveHostEngineDatabaseUrl } from "../dev-compose.js"
8
+
9
+ interface DoctorItem {
10
+ kind: string
11
+ table: string
12
+ name: string
13
+ fields: string[]
14
+ message: string
15
+ }
16
+
17
+ interface DoctorReport {
18
+ missing: DoctorItem[]
19
+ staleManaged: DoctorItem[]
20
+ unmanagedDrift: DoctorItem[]
21
+ }
22
+
23
+ function printSection(title: string, items: DoctorItem[]): void {
24
+ if (items.length === 0) return
25
+ plain(`\n${title} (${items.length}):\n`)
26
+ for (const item of items) {
27
+ const fields = item.fields.length > 0 ? ` (${item.fields.join(", ")})` : ""
28
+ plain(` • ${item.table}.${item.name}${fields}`)
29
+ plain(` ${item.message}`)
30
+ }
31
+ }
32
+
33
+ export function registerDoctor(program: Command): void {
34
+ program
35
+ .command("doctor")
36
+ .description("Report schema drift between schema/index.ts and the live database")
37
+ .option("--connection <url>", "Database connection URL (overrides config)")
38
+ .option("--env <name>", "Target environment when linked")
39
+ .option("--strict", "Exit non-zero when missing or stale managed drift exists")
40
+ .option("--no-cache", "Force full database introspection")
41
+ .option("--direct", "Use local engine subprocess")
42
+ .action(async (opts: {
43
+ connection?: string
44
+ env?: string
45
+ strict?: boolean
46
+ noCache?: boolean
47
+ direct?: boolean
48
+ }) => {
49
+ const cwd = process.cwd()
50
+ const config = loadConfig(cwd)
51
+ const pgSchema = schemaPgSchema(cwd)
52
+
53
+ info("Loading schema...")
54
+ const ast = loadSchemaAst(schemaPathFromProject(config, cwd), cwd)
55
+
56
+ let report: DoctorReport
57
+
58
+ const linked = loadProjectLink(cwd)
59
+ if (linked && !opts.direct && !opts.connection) {
60
+ const target = resolveTarget(cwd, { env: opts.env })
61
+ report = (await targetSchemaDoctor(target, ast, {
62
+ noCache: opts.noCache,
63
+ schema: pgSchema,
64
+ })) as DoctorReport
65
+ } else if (!opts.direct && !opts.connection) {
66
+ const connection = await resolveHostEngineDatabaseUrl(cwd, config, opts.connection)
67
+ const target = resolveTarget(cwd, { direct: true, connection })
68
+ report = (await targetSchemaDoctor(target, ast, {
69
+ noCache: opts.noCache,
70
+ schema: pgSchema,
71
+ })) as DoctorReport
72
+ void connection
73
+ } else {
74
+ const target = resolveTarget(cwd, {
75
+ env: opts.env,
76
+ direct: true,
77
+ connection: opts.connection,
78
+ })
79
+ report = (await targetSchemaDoctor(target, ast, {
80
+ noCache: opts.noCache,
81
+ schema: pgSchema,
82
+ })) as DoctorReport
83
+ }
84
+
85
+ printSection("Missing (in AST, not in DB)", report.missing ?? [])
86
+ printSection("Stale managed (stamped, not in AST)", report.staleManaged ?? [])
87
+ printSection("Unmanaged drift (manual decision)", report.unmanagedDrift ?? [])
88
+
89
+ const missing = report.missing?.length ?? 0
90
+ const stale = report.staleManaged?.length ?? 0
91
+ const unmanaged = report.unmanagedDrift?.length ?? 0
92
+
93
+ if (missing + stale + unmanaged === 0) {
94
+ info("No drift detected.")
95
+ } else {
96
+ plain(`\nSummary: ${missing} missing, ${stale} stale managed, ${unmanaged} unmanaged`)
97
+ }
98
+
99
+ if (opts.strict && (missing > 0 || stale > 0)) {
100
+ process.exit(1)
101
+ }
102
+ })
103
+ }
@@ -5,6 +5,7 @@
5
5
 
6
6
  import type { Command } from "commander"
7
7
  import { engineHealth } from "../engine-client.js"
8
+ import { error, info } from "../ui/messages.js"
8
9
 
9
10
  export function registerEngine(program: Command): void {
10
11
  const engine = program
@@ -16,14 +17,14 @@ export function registerEngine(program: Command): void {
16
17
  .description("Check if the schema engine container is reachable")
17
18
  .action(async () => {
18
19
  const url = process.env["SUPATYPE_ENGINE_URL"] ?? "http://localhost:7500"
19
- console.log(`Checking engine at ${url}...`)
20
+ info(`Checking engine at ${url}...`)
20
21
 
21
22
  const healthy = await engineHealth()
22
23
  if (healthy) {
23
- console.log("Engine is reachable and healthy.")
24
+ info("Engine is reachable and healthy.")
24
25
  } else {
25
- console.error("Engine is not reachable.")
26
- console.error("Make sure the engine container is running (supatype dev or docker compose up).")
26
+ error("Engine is not reachable.")
27
+ error("Make sure the engine container is running (supatype dev or docker compose up).")
27
28
  process.exitCode = 1
28
29
  }
29
30
  })