@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
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * self-host commands — manage self-hosted deployments.
3
3
  *
4
- * Compose-based commands are the canonical path.
5
- * Native/systemd commands are kept temporarily for migration compatibility.
4
+ * Compose-based commands are the default path.
5
+ * Native/systemd commands remain available for bare-metal deployments.
6
6
  */
7
7
 
8
8
  import { Command } from "commander"
@@ -17,7 +17,10 @@ import { resolveBinary } from "../binary-cache.js"
17
17
  import { generateUnits } from "../systemd.js"
18
18
  import { readPid } from "../process-manager.js"
19
19
  import { localStorageEnv } from "../local-storage.js"
20
- import { runDockerCompose, writeSelfHostCompose } from "../self-host-compose.js"
20
+ import { composeProjectName, exitComposeFailed, runDockerCompose, writeSelfHostCompose } from "../self-host-compose.js"
21
+ import { file, error, info, plain, warn } from "../ui/messages.js"
22
+ import { nextSteps } from "../ui/next-steps.js"
23
+ import { withSpinner } from "../ui/progress.js"
21
24
 
22
25
  export function registerSelfHost(program: Command): void {
23
26
  const selfHostCmd = program
@@ -35,20 +38,27 @@ export function registerSelfHost(program: Command): void {
35
38
  const cwd = process.cwd()
36
39
  const config = loadConfig(cwd)
37
40
  const out = writeSelfHostCompose(cwd, config)
38
- console.log(`Wrote ${out.composePath}`)
39
- console.log(`Wrote ${out.kongPath}`)
41
+ file("wrote", out.composePath)
42
+ file("wrote", out.kongPath)
40
43
  })
41
44
 
42
45
  composeCmd
43
46
  .command("up")
44
47
  .description("Render and start compose services")
45
48
  .option("-d, --detach", "Start in detached mode", true)
46
- .action((opts: { detach?: boolean }) => {
49
+ .action(async (opts: { detach?: boolean }) => {
47
50
  const cwd = process.cwd()
48
51
  const config = loadConfig(cwd)
49
- const out = writeSelfHostCompose(cwd, config)
50
- const status = runDockerCompose(out.composePath, opts.detach ? ["up", "-d"] : ["up"], cwd)
51
- process.exitCode = status
52
+ const project = composeProjectName(config.project.name)
53
+ const args = opts.detach ? ["up", "-d"] : ["up"]
54
+ const brand = { intro: "Self-host deployment" }
55
+ const status = await withSpinner("Starting self-host Compose stack", async () => {
56
+ const out = writeSelfHostCompose(cwd, config)
57
+ return runDockerCompose(out.composePath, args, cwd, project, { brand })
58
+ })
59
+ if (status !== 0) {
60
+ exitComposeFailed(status, "Could not start the self-host Compose stack.", brand)
61
+ }
52
62
  })
53
63
 
54
64
  composeCmd
@@ -58,7 +68,17 @@ export function registerSelfHost(program: Command): void {
58
68
  const cwd = process.cwd()
59
69
  const config = loadConfig(cwd)
60
70
  const out = writeSelfHostCompose(cwd, config)
61
- process.exitCode = runDockerCompose(out.composePath, ["down"], cwd)
71
+ const brand = { intro: "Self-host deployment" }
72
+ const status = runDockerCompose(
73
+ out.composePath,
74
+ ["down"],
75
+ cwd,
76
+ composeProjectName(config.project.name),
77
+ { brand },
78
+ )
79
+ if (status !== 0) {
80
+ exitComposeFailed(status, "Could not stop the self-host Compose stack.", brand)
81
+ }
62
82
  })
63
83
 
64
84
  composeCmd
@@ -68,7 +88,13 @@ export function registerSelfHost(program: Command): void {
68
88
  const cwd = process.cwd()
69
89
  const config = loadConfig(cwd)
70
90
  const out = writeSelfHostCompose(cwd, config)
71
- process.exitCode = runDockerCompose(out.composePath, ["ps"], cwd)
91
+ process.exitCode = runDockerCompose(
92
+ out.composePath,
93
+ ["ps"],
94
+ cwd,
95
+ composeProjectName(config.project.name),
96
+ { brand: { intro: "Self-host deployment" } },
97
+ )
72
98
  })
73
99
 
74
100
  composeCmd
@@ -83,10 +109,16 @@ export function registerSelfHost(program: Command): void {
83
109
  const args = ["logs"]
84
110
  if (opts.follow) args.push("-f")
85
111
  if (opts.service) args.push(opts.service)
86
- process.exitCode = runDockerCompose(out.composePath, args, cwd)
112
+ process.exitCode = runDockerCompose(
113
+ out.composePath,
114
+ args,
115
+ cwd,
116
+ composeProjectName(config.project.name),
117
+ { brand: { intro: "Self-host deployment" } },
118
+ )
87
119
  })
88
120
 
89
- // ── Legacy native/systemd helpers (hidden; use compose for self-host) ─────
121
+ // ── Native/systemd helpers (hidden; compose is the default self-host path) ─────
90
122
 
91
123
  const legacyCmd = new Command("native")
92
124
  selfHostCmd.addCommand(legacyCmd, { hidden: true })
@@ -105,42 +137,41 @@ export function registerSelfHost(program: Command): void {
105
137
  user?: string
106
138
  enable: boolean
107
139
  }) => {
108
- logLegacyWarning("install-service")
140
+ logNativeHint("install-service")
109
141
  const cwd = process.cwd()
110
142
  const config = loadConfig(cwd)
111
143
 
112
144
  const systemdDir = opts.outputDir ?? ".supatype/systemd"
113
145
  const absSystemdDir = resolve(cwd, systemdDir)
114
146
 
115
- console.log("Generating systemd unit files...")
147
+ info("Generating systemd unit files...")
116
148
  const { postgres, server } = generateUnits(config, cwd, {
117
149
  outputDir: absSystemdDir,
118
150
  ...(opts.user !== undefined && { user: opts.user }),
119
151
  })
120
- console.log(` wrote ${postgres}`)
121
- console.log(` wrote ${server}`)
152
+ plain(` wrote ${postgres}`)
153
+ plain(` wrote ${server}`)
122
154
 
123
155
  if (!opts.enable) {
124
- console.log(
125
- `\nTo install manually:\n` +
126
- ` sudo cp ${postgres} /etc/systemd/system/\n` +
127
- ` sudo cp ${server} /etc/systemd/system/\n` +
128
- ` sudo systemctl daemon-reload\n` +
129
- ` sudo systemctl enable --now supatype-postgres supatype-server`,
130
- )
156
+ nextSteps("To install manually:", [
157
+ `sudo cp ${postgres} /etc/systemd/system/`,
158
+ `sudo cp ${server} /etc/systemd/system/`,
159
+ "sudo systemctl daemon-reload",
160
+ "sudo systemctl enable --now supatype-postgres supatype-server",
161
+ ])
131
162
  return
132
163
  }
133
164
 
134
165
  if (process.platform !== "linux") {
135
- console.log(
136
- "\nNote: systemd unit installation is only supported on Linux.\n" +
166
+ info(
167
+ "systemd unit installation is only supported on Linux. " +
137
168
  `Unit files are at ${absSystemdDir}/`,
138
169
  )
139
170
  return
140
171
  }
141
172
 
142
173
  // Install to /etc/systemd/system/
143
- console.log("\nInstalling to /etc/systemd/system/ (requires sudo)...")
174
+ info("Installing to /etc/systemd/system/ (requires sudo)...")
144
175
  const units = [
145
176
  { src: postgres, dest: "/etc/systemd/system/supatype-postgres.service" },
146
177
  { src: server, dest: "/etc/systemd/system/supatype-server.service" },
@@ -148,7 +179,7 @@ export function registerSelfHost(program: Command): void {
148
179
  for (const { src, dest } of units) {
149
180
  const cp = spawnSync("sudo", ["cp", src, dest], { stdio: "inherit" })
150
181
  if (cp.status !== 0) {
151
- console.error(`Failed to copy ${src} to ${dest}`)
182
+ error(`Failed to copy ${src} to ${dest}`)
152
183
  process.exit(1)
153
184
  }
154
185
  }
@@ -163,9 +194,9 @@ export function registerSelfHost(program: Command): void {
163
194
  )
164
195
  if (enable.status !== 0) { process.exit(1) }
165
196
 
166
- console.log("\nServices installed and started.")
167
- console.log(" supatype-postgres.service")
168
- console.log(" supatype-server.service")
197
+ info("Services installed and started.")
198
+ plain(" supatype-postgres.service")
199
+ plain(" supatype-server.service")
169
200
  },
170
201
  )
171
202
 
@@ -175,7 +206,7 @@ export function registerSelfHost(program: Command): void {
175
206
  .command("serve", "Start supatype-server in the foreground (for standalone mode)")
176
207
  .option("--port <port>", "Override port from config")
177
208
  .action(async (opts: { port?: string }) => {
178
- logLegacyWarning("serve")
209
+ logNativeHint("serve")
179
210
  const cwd = process.cwd()
180
211
  const config = loadConfig(cwd)
181
212
 
@@ -191,7 +222,7 @@ export function registerSelfHost(program: Command): void {
191
222
  const stateDir = join(homedir(), ".supatype", "projects", config.project.name)
192
223
  const storageEnv = config.storage?.provider !== "s3" ? localStorageEnv(stateDir) : {}
193
224
 
194
- console.log(`Starting supatype-server on port ${port}...`)
225
+ info(`Starting supatype-server on port ${port}...`)
195
226
  const result = spawnSync(serverBin, args, {
196
227
  stdio: "inherit",
197
228
  cwd,
@@ -205,7 +236,7 @@ export function registerSelfHost(program: Command): void {
205
236
  legacyCmd
206
237
  .command("reload", "Reload the running supatype-server (SIGHUP for config reload)")
207
238
  .action(() => {
208
- logLegacyWarning("reload")
239
+ logNativeHint("reload")
209
240
  const cwd = process.cwd()
210
241
  const config = loadConfig(cwd)
211
242
  const stateDir = join(homedir(), ".supatype", "projects", config.project.name)
@@ -218,16 +249,16 @@ export function registerSelfHost(program: Command): void {
218
249
  process.exitCode = result.status ?? 1
219
250
  return
220
251
  }
221
- console.error("Server does not appear to be running (no PID file found).")
252
+ error("Server does not appear to be running (no PID file found).")
222
253
  process.exitCode = 1
223
254
  return
224
255
  }
225
256
 
226
257
  try {
227
258
  process.kill(pid, "SIGHUP")
228
- console.log(`Sent SIGHUP to supatype-server (pid ${pid}).`)
259
+ info(`Sent SIGHUP to supatype-server (pid ${pid}).`)
229
260
  } catch (err) {
230
- console.error(`Failed to signal pid ${pid}:`, (err as Error).message)
261
+ error(`Failed to signal pid ${pid}: ${(err as Error).message}`)
231
262
  process.exitCode = 1
232
263
  }
233
264
  })
@@ -237,12 +268,12 @@ export function registerSelfHost(program: Command): void {
237
268
  legacyCmd
238
269
  .command("status", "Show running status of supatype services")
239
270
  .action(() => {
240
- logLegacyWarning("status")
271
+ logNativeHint("status")
241
272
  const cwd = process.cwd()
242
273
  const config = loadConfig(cwd)
243
274
  const stateDir = join(homedir(), ".supatype", "projects", config.project.name)
244
275
 
245
- console.log(`Project: ${config.project.name}\n`)
276
+ plain(`Project: ${config.project.name}\n`)
246
277
 
247
278
  if (process.platform === "linux" && existsSync("/run/systemd/system")) {
248
279
  // systemd is active
@@ -251,19 +282,19 @@ export function registerSelfHost(program: Command): void {
251
282
  encoding: "utf8",
252
283
  })
253
284
  const active = result.stdout?.includes("active (running)") ? "running" : "stopped"
254
- console.log(` ${svc}: ${active}`)
285
+ plain(` ${svc}: ${active}`)
255
286
  }
256
287
  } else {
257
288
  // PID file check
258
289
  const serverPid = readPid(join(stateDir, "pid"), "server")
259
290
  const pgPid = readPid(join(stateDir, "pid"), "postgres")
260
- console.log(` postgres: ${pgPid ? `running (pid ${pgPid})` : "stopped"}`)
261
- console.log(` supatype-server: ${serverPid ? `running (pid ${serverPid})` : "stopped"}`)
291
+ plain(` postgres: ${pgPid ? `running (pid ${pgPid})` : "stopped"}`)
292
+ plain(` supatype-server: ${serverPid ? `running (pid ${serverPid})` : "stopped"}`)
262
293
  }
263
294
 
264
295
  const logDir = join(stateDir, "logs")
265
296
  if (existsSync(logDir)) {
266
- console.log(`\nLogs: ${logDir}`)
297
+ plain(`\nLogs: ${logDir}`)
267
298
  }
268
299
  })
269
300
 
@@ -275,7 +306,7 @@ export function registerSelfHost(program: Command): void {
275
306
  .option("--lines <n>", "Number of lines to show", "50")
276
307
  .option("-f, --follow", "Follow log output")
277
308
  .action((opts: { service?: string; lines: string; follow?: boolean }) => {
278
- logLegacyWarning("logs")
309
+ logNativeHint("logs")
279
310
  const cwd = process.cwd()
280
311
  const config = loadConfig(cwd)
281
312
  const stateDir = join(homedir(), ".supatype", "projects", config.project.name)
@@ -301,7 +332,7 @@ export function registerSelfHost(program: Command): void {
301
332
 
302
333
  for (const { label, file } of targets) {
303
334
  if (!existsSync(file)) {
304
- console.log(`[${label}] log file not found: ${file}`)
335
+ plain(`[${label}] log file not found: ${file}`)
305
336
  continue
306
337
  }
307
338
  if (opts.follow) {
@@ -311,7 +342,7 @@ export function registerSelfHost(program: Command): void {
311
342
  const n = parseInt(opts.lines, 10)
312
343
  const content = readFileSync(file, "utf8")
313
344
  const lines = content.split("\n")
314
- console.log(lines.slice(-n).join("\n"))
345
+ plain(lines.slice(-n).join("\n"))
315
346
  }
316
347
  }
317
348
  })
@@ -323,7 +354,7 @@ export function registerSelfHost(program: Command): void {
323
354
  .option("--output <path>", "Output file path (default: ./backups/backup-<timestamp>.sql.gz)")
324
355
  .option("--connection <url>", "Database connection URL (overrides config)")
325
356
  .action((opts: { output?: string; connection?: string }) => {
326
- logLegacyWarning("backup")
357
+ logNativeHint("backup")
327
358
  const cwd = process.cwd()
328
359
  const config = loadConfig(cwd)
329
360
  const conn = opts.connection ?? connectionString(config)
@@ -335,7 +366,7 @@ export function registerSelfHost(program: Command): void {
335
366
 
336
367
  mkdirSync(resolve(outFile, ".."), { recursive: true })
337
368
 
338
- console.log(`Backing up database to ${outFile}...`)
369
+ info(`Backing up database to ${outFile}...`)
339
370
  try {
340
371
  // Avoid shell interpolation of user-supplied values.
341
372
  const pgDump = spawnSync("pg_dump", [conn], {
@@ -348,17 +379,17 @@ export function registerSelfHost(program: Command): void {
348
379
 
349
380
  const compressed = gzipSync(pgDump.stdout)
350
381
  writeFileSync(outFile, compressed)
351
- console.log("Backup complete.")
382
+ info("Backup complete.")
352
383
  } catch (err) {
353
- console.error("Backup failed:", (err as Error).message)
384
+ error(`Backup failed: ${(err as Error).message}`)
354
385
  process.exit(1)
355
386
  }
356
387
  })
357
388
  }
358
389
 
359
- function logLegacyWarning(cmd: string): void {
360
- console.warn(
361
- `[supatype] self-host native ${cmd} is deprecated. ` +
362
- "Use `supatype self-host compose` commands instead.",
390
+ function logNativeHint(cmd: string): void {
391
+ warn(
392
+ `self-host native ${cmd}: Docker Compose is the default path. ` +
393
+ "Use `supatype self-host compose` unless you need bare-metal systemd/binaries.",
363
394
  )
364
395
  }
@@ -7,6 +7,7 @@
7
7
 
8
8
  import type { Command } from "commander"
9
9
  import { sep } from "node:path"
10
+ import { error, plain } from "../ui/messages.js"
10
11
 
11
12
  function looksLikeNpmOrWorkspaceCLI(): boolean {
12
13
  const main = process.argv[1] ?? ""
@@ -27,7 +28,7 @@ export function registerSelfUpdate(program: Command): void {
27
28
  )
28
29
  .action(() => {
29
30
  if (looksLikeNpmOrWorkspaceCLI()) {
30
- console.log(
31
+ plain(
31
32
  "This CLI was installed via npm (or runs from the package workspace).\n" +
32
33
  "Update with:\n\n npm update -g @supatype/cli\n\n" +
33
34
  "To bump engine/server/postgres/deno pinned in supatype.config.ts, use:\n\n supatype update\n",
@@ -35,7 +36,7 @@ export function registerSelfUpdate(program: Command): void {
35
36
  return
36
37
  }
37
38
 
38
- console.error(
39
+ error(
39
40
  "Standalone CLI self-update (replace binary from CDN) is not published yet.\n\n" +
40
41
  "Install or upgrade via npm:\n npm install -g @supatype/cli\n\n" +
41
42
  "Component binaries (engine, server, postgres, deno):\n supatype update\n",
@@ -1,9 +1,14 @@
1
1
  /**
2
- * supatype status — show current state of local dev services.
2
+ * supatype status — show linked target or local dev stack state.
3
3
  */
4
4
  import type { Command } from "commander"
5
5
  import { spawnSync } from "node:child_process"
6
+ import { existsSync } from "node:fs"
7
+ import { resolve } from "node:path"
6
8
  import { LOCAL_KONG_HOST_PORT, localKongBaseUrl } from "../local-gateway.js"
9
+ import { loadLocalEnvironment, loadProjectLink } from "../link.js"
10
+ import { resolveTarget, targetStatus } from "../resolve-target.js"
11
+ import { error, info, plain, warn } from "../ui/messages.js"
7
12
 
8
13
  interface ServiceStatus {
9
14
  name: string
@@ -16,42 +21,106 @@ interface ServiceStatus {
16
21
  export function registerStatus(program: Command): void {
17
22
  program
18
23
  .command("status")
19
- .description("Show current state of local dev services")
20
- .action(() => {
21
- const services: ServiceStatus[] = [
22
- { name: "Postgres", container: "supatype-postgres", port: 5432 },
23
- { name: "PostgREST", container: "supatype-postgrest", port: 3000 },
24
- { name: "GoTrue", container: "supatype-gotrue", port: 9999 },
25
- { name: "Kong", container: "supatype-kong", port: LOCAL_KONG_HOST_PORT },
26
- { name: "MinIO", container: "supatype-minio", port: 9000 },
27
- { name: "Realtime", container: "supatype-realtime", port: 4000 },
28
- { name: "Studio", container: "supatype-studio", port: 3100 },
29
- ].map((svc) => {
30
- const status = getContainerStatus(svc.container)
31
- const uptime = getContainerUptime(svc.container)
32
- return { ...svc, status, ...(uptime !== undefined && { uptime }) }
33
- })
34
-
35
- console.log("Supatype Local Development Stack\n")
36
-
37
- const maxName = Math.max(...services.map((s) => s.name.length))
38
- for (const svc of services) {
39
- const icon = svc.status === "running" ? "●" : svc.status === "stopped" ? "○" : "✕"
40
- const status = svc.status.padEnd(8)
41
- const port = svc.port ? `:${svc.port}` : ""
42
- const uptime = svc.uptime ? ` (${svc.uptime})` : ""
43
- console.log(` ${icon} ${svc.name.padEnd(maxName)} ${status} ${port}${uptime}`)
24
+ .description("Show linked target status or local dev services")
25
+ .option("--env <name>", "Target environment when linked")
26
+ .action(async (opts: { env?: string }) => {
27
+ const cwd = process.cwd()
28
+ const link = loadProjectLink(cwd)
29
+ const localEnv = loadLocalEnvironment(cwd)
30
+
31
+ if (link || localEnv) {
32
+ try {
33
+ const target = resolveTarget(cwd, { env: opts.env })
34
+ if (target.mode !== "direct") {
35
+ await printLinkedStatus(target)
36
+ return
37
+ }
38
+ } catch (err) {
39
+ error((err as Error).message)
40
+ process.exitCode = 1
41
+ return
42
+ }
44
43
  }
45
44
 
46
- const running = services.filter((s) => s.status === "running")
47
- console.log(`\n${running.length}/${services.length} services running`)
45
+ printLocalStackStatus(cwd)
46
+ })
47
+ }
48
+
49
+ async function printLinkedStatus(target: ReturnType<typeof resolveTarget>): Promise<void> {
50
+ info(`Target: ${target.mode} (${target.environment})`)
51
+ info(`Project: ${target.projectRef}`)
52
+ info(`API: ${target.apiBaseUrl}${target.apiPrefix}`)
53
+ plain()
48
54
 
49
- if (running.length > 0) {
50
- console.log(`\nAPI URL: ${localKongBaseUrl()}`)
51
- console.log(`Studio: http://localhost:3100`)
52
- console.log(`Database: postgresql://supatype_admin:postgres@localhost:5432/postgres`)
55
+ try {
56
+ const data = (await targetStatus(target)) as Record<string, unknown>
57
+ if (data.functions && Array.isArray(data.functions)) {
58
+ plain(`Functions (${data.functions.length}):`)
59
+ for (const fn of data.functions as Array<{ name?: string } | string>) {
60
+ const name = typeof fn === "string" ? fn : fn.name
61
+ if (name) plain(` • ${name}`)
53
62
  }
54
- })
63
+ plain()
64
+ }
65
+ if (data.deploymentId) {
66
+ info(`Active deployment: ${data.deploymentId}`)
67
+ }
68
+ if (data.controlPlane) {
69
+ info(`Control plane: ${data.controlPlane}`)
70
+ }
71
+ } catch (err) {
72
+ warn(`Could not fetch remote status: ${(err as Error).message}`)
73
+ }
74
+ }
75
+
76
+ function printLocalStackStatus(cwd: string): void {
77
+ const localEnv = loadLocalEnvironment(cwd)
78
+ const kongPort = localEnv?.kongPort ?? LOCAL_KONG_HOST_PORT
79
+
80
+ const services: ServiceStatus[] = [
81
+ { name: "Postgres", container: "supatype-postgres", port: 5432 },
82
+ { name: "PostgREST", container: "supatype-postgrest", port: 3000 },
83
+ { name: "GoTrue", container: "supatype-gotrue", port: 9999 },
84
+ { name: "Kong", container: "supatype-kong", port: kongPort },
85
+ { name: "Control plane", container: "supatype-control-plane" },
86
+ { name: "MinIO", container: "supatype-minio", port: 9000 },
87
+ { name: "Realtime", container: "supatype-realtime", port: 4000 },
88
+ { name: "Studio", container: "supatype-studio", port: 3100 },
89
+ ].map((svc) => {
90
+ const status = getContainerStatus(svc.container)
91
+ const uptime = getContainerUptime(svc.container)
92
+ return { ...svc, status, ...(uptime !== undefined && { uptime }) }
93
+ })
94
+
95
+ plain("Supatype Local Development Stack\n")
96
+
97
+ const maxName = Math.max(...services.map((s) => s.name.length))
98
+ for (const svc of services) {
99
+ const icon = svc.status === "running" ? "●" : svc.status === "stopped" ? "○" : "✕"
100
+ const status = svc.status.padEnd(8)
101
+ const port = svc.port ? `:${svc.port}` : ""
102
+ const uptime = svc.uptime ? ` (${svc.uptime})` : ""
103
+ plain(` ${icon} ${svc.name.padEnd(maxName)} ${status} ${port}${uptime}`)
104
+ }
105
+
106
+ const running = services.filter((s) => s.status === "running")
107
+ plain(`\n${running.length}/${services.length} services running`)
108
+
109
+ if (running.length > 0) {
110
+ const apiUrl = localEnv?.apiUrl ?? localKongBaseUrl()
111
+ plain(`\nAPI URL: ${apiUrl}`)
112
+ plain(`Studio: http://localhost:3100`)
113
+ if (localEnv?.databaseUrl) {
114
+ plain(`Database: ${localEnv.databaseUrl}`)
115
+ } else {
116
+ plain(`Database: postgresql://supatype_admin:postgres@localhost:5432/postgres`)
117
+ }
118
+ }
119
+
120
+ if (existsSync(resolve(cwd, ".supatype/environment.json"))) {
121
+ plain("\nLocal environment file: .supatype/environment.json")
122
+ info("Link remote ops: supatype link --url <api> --token $SERVICE_ROLE_KEY")
123
+ }
55
124
  }
56
125
 
57
126
  function getContainerStatus(name: string): "running" | "stopped" | "error" {
@@ -3,6 +3,7 @@ import { existsSync, readFileSync } from "node:fs"
3
3
  import { resolve, relative } from "node:path"
4
4
  import ts from "typescript"
5
5
  import { loadConfig } from "../config.js"
6
+ import { error, plain } from "../ui/messages.js"
6
7
 
7
8
  export function registerTypes(program: Command): void {
8
9
  const types = program.command("types").description("Type generation and validation utilities")
@@ -63,11 +64,11 @@ export function registerTypes(program: Command): void {
63
64
  }
64
65
 
65
66
  if (errors.length > 0) {
66
- for (const err of errors) console.error(`- ${err}`)
67
+ for (const err of errors) error(err)
67
68
  process.exit(1)
68
69
  }
69
70
 
70
- console.log("types check passed")
71
+ plain("types check passed")
71
72
  })
72
73
  }
73
74