@supatype/cli 0.1.0 → 0.1.2

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 (331) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/.turbo/turbo-test.log +121 -86
  3. package/.turbo/turbo-typecheck.log +2 -2
  4. package/dist/binary-cache.d.ts +2 -0
  5. package/dist/binary-cache.d.ts.map +1 -1
  6. package/dist/binary-cache.js +36 -0
  7. package/dist/binary-cache.js.map +1 -1
  8. package/dist/binary-download-lock.d.ts +12 -0
  9. package/dist/binary-download-lock.d.ts.map +1 -0
  10. package/dist/binary-download-lock.js +106 -0
  11. package/dist/binary-download-lock.js.map +1 -0
  12. package/dist/cli-package-version.d.ts +3 -0
  13. package/dist/cli-package-version.d.ts.map +1 -0
  14. package/dist/cli-package-version.js +15 -0
  15. package/dist/cli-package-version.js.map +1 -0
  16. package/dist/cli.d.ts.map +1 -1
  17. package/dist/cli.js +5 -2
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/add.js +25 -19
  20. package/dist/commands/add.js.map +1 -1
  21. package/dist/commands/admin.d.ts +28 -1
  22. package/dist/commands/admin.d.ts.map +1 -1
  23. package/dist/commands/admin.js +290 -112
  24. package/dist/commands/admin.js.map +1 -1
  25. package/dist/commands/cache.d.ts +1 -1
  26. package/dist/commands/cache.d.ts.map +1 -1
  27. package/dist/commands/cache.js +98 -5
  28. package/dist/commands/cache.js.map +1 -1
  29. package/dist/commands/dev.d.ts.map +1 -1
  30. package/dist/commands/dev.js +28 -22
  31. package/dist/commands/dev.js.map +1 -1
  32. package/dist/commands/init.d.ts +8 -4
  33. package/dist/commands/init.d.ts.map +1 -1
  34. package/dist/commands/init.js +278 -139
  35. package/dist/commands/init.js.map +1 -1
  36. package/dist/commands/link-helpers.d.ts.map +1 -1
  37. package/dist/commands/link-helpers.js +26 -25
  38. package/dist/commands/link-helpers.js.map +1 -1
  39. package/dist/commands/push.js +3 -3
  40. package/dist/commands/push.js.map +1 -1
  41. package/dist/compose-local-server-image.d.ts +13 -0
  42. package/dist/compose-local-server-image.d.ts.map +1 -0
  43. package/dist/compose-local-server-image.js +57 -0
  44. package/dist/compose-local-server-image.js.map +1 -0
  45. package/dist/compose-rename.d.ts +10 -0
  46. package/dist/compose-rename.d.ts.map +1 -0
  47. package/dist/compose-rename.js +64 -0
  48. package/dist/compose-rename.js.map +1 -0
  49. package/dist/dev-compose.d.ts.map +1 -1
  50. package/dist/dev-compose.js +138 -97
  51. package/dist/dev-compose.js.map +1 -1
  52. package/dist/dev-log-bus.d.ts +5 -0
  53. package/dist/dev-log-bus.d.ts.map +1 -1
  54. package/dist/dev-log-bus.js +14 -0
  55. package/dist/dev-log-bus.js.map +1 -1
  56. package/dist/dev-log-filter.d.ts +4 -0
  57. package/dist/dev-log-filter.d.ts.map +1 -1
  58. package/dist/dev-log-filter.js +52 -0
  59. package/dist/dev-log-filter.js.map +1 -1
  60. package/dist/dev-ports.d.ts +27 -0
  61. package/dist/dev-ports.d.ts.map +1 -0
  62. package/dist/dev-ports.js +178 -0
  63. package/dist/dev-ports.js.map +1 -0
  64. package/dist/dev-ready-panel.d.ts +19 -0
  65. package/dist/dev-ready-panel.d.ts.map +1 -0
  66. package/dist/dev-ready-panel.js +49 -0
  67. package/dist/dev-ready-panel.js.map +1 -0
  68. package/dist/dev-session-lock.d.ts +25 -0
  69. package/dist/dev-session-lock.d.ts.map +1 -0
  70. package/dist/dev-session-lock.js +78 -0
  71. package/dist/dev-session-lock.js.map +1 -0
  72. package/dist/dev-session.d.ts +18 -5
  73. package/dist/dev-session.d.ts.map +1 -1
  74. package/dist/dev-session.js +91 -18
  75. package/dist/dev-session.js.map +1 -1
  76. package/dist/dev-shutdown.d.ts +20 -2
  77. package/dist/dev-shutdown.d.ts.map +1 -1
  78. package/dist/dev-shutdown.js +88 -10
  79. package/dist/dev-shutdown.js.map +1 -1
  80. package/dist/dev-task-colors.d.ts +3 -1
  81. package/dist/dev-task-colors.d.ts.map +1 -1
  82. package/dist/dev-task-colors.js +23 -3
  83. package/dist/dev-task-colors.js.map +1 -1
  84. package/dist/docker-runtime.js +1 -1
  85. package/dist/docker-runtime.js.map +1 -1
  86. package/dist/engine-push-output.d.ts +1 -0
  87. package/dist/engine-push-output.d.ts.map +1 -1
  88. package/dist/engine-push-output.js +4 -1
  89. package/dist/engine-push-output.js.map +1 -1
  90. package/dist/ensure-binary.d.ts.map +1 -1
  91. package/dist/ensure-binary.js +14 -2
  92. package/dist/ensure-binary.js.map +1 -1
  93. package/dist/ensure-component-binaries.d.ts +17 -0
  94. package/dist/ensure-component-binaries.d.ts.map +1 -0
  95. package/dist/ensure-component-binaries.js +45 -0
  96. package/dist/ensure-component-binaries.js.map +1 -0
  97. package/dist/ensure-dev-api-config.d.ts +3 -0
  98. package/dist/ensure-dev-api-config.d.ts.map +1 -0
  99. package/dist/ensure-dev-api-config.js +17 -0
  100. package/dist/ensure-dev-api-config.js.map +1 -0
  101. package/dist/env-file.d.ts +5 -0
  102. package/dist/env-file.d.ts.map +1 -0
  103. package/dist/env-file.js +33 -0
  104. package/dist/env-file.js.map +1 -0
  105. package/dist/init-dependency-versions.d.ts +13 -0
  106. package/dist/init-dependency-versions.d.ts.map +1 -0
  107. package/dist/init-dependency-versions.js +53 -0
  108. package/dist/init-dependency-versions.js.map +1 -0
  109. package/dist/init-package-json.d.ts +21 -0
  110. package/dist/init-package-json.d.ts.map +1 -0
  111. package/dist/init-package-json.js +46 -0
  112. package/dist/init-package-json.js.map +1 -0
  113. package/dist/postgres-ctl.d.ts.map +1 -1
  114. package/dist/postgres-ctl.js +2 -1
  115. package/dist/postgres-ctl.js.map +1 -1
  116. package/dist/required-host-components.d.ts +11 -0
  117. package/dist/required-host-components.d.ts.map +1 -0
  118. package/dist/required-host-components.js +25 -0
  119. package/dist/required-host-components.js.map +1 -0
  120. package/dist/resolve-api-url.d.ts +6 -0
  121. package/dist/resolve-api-url.d.ts.map +1 -0
  122. package/dist/resolve-api-url.js +39 -0
  123. package/dist/resolve-api-url.js.map +1 -0
  124. package/dist/rest-cache-admin.d.ts +33 -0
  125. package/dist/rest-cache-admin.d.ts.map +1 -0
  126. package/dist/rest-cache-admin.js +96 -0
  127. package/dist/rest-cache-admin.js.map +1 -0
  128. package/dist/scripts/postinstall.d.ts +4 -6
  129. package/dist/scripts/postinstall.d.ts.map +1 -1
  130. package/dist/scripts/postinstall.js +8 -41
  131. package/dist/scripts/postinstall.js.map +1 -1
  132. package/dist/self-host-compose.d.ts.map +1 -1
  133. package/dist/self-host-compose.js +24 -13
  134. package/dist/self-host-compose.js.map +1 -1
  135. package/dist/studio-dev-server.d.ts +4 -2
  136. package/dist/studio-dev-server.d.ts.map +1 -1
  137. package/dist/studio-dev-server.js +3 -2
  138. package/dist/studio-dev-server.js.map +1 -1
  139. package/dist/ui/brand.d.ts +2 -5
  140. package/dist/ui/brand.d.ts.map +1 -1
  141. package/dist/ui/brand.js +2 -7
  142. package/dist/ui/brand.js.map +1 -1
  143. package/dist/ui/clack-api.d.ts +44 -0
  144. package/dist/ui/clack-api.d.ts.map +1 -0
  145. package/dist/ui/clack-api.js +76 -0
  146. package/dist/ui/clack-api.js.map +1 -0
  147. package/dist/ui/clack.d.ts +14 -0
  148. package/dist/ui/clack.d.ts.map +1 -0
  149. package/dist/ui/clack.js +147 -0
  150. package/dist/ui/clack.js.map +1 -0
  151. package/dist/ui/components/FlowSpinner.d.ts +5 -0
  152. package/dist/ui/components/FlowSpinner.d.ts.map +1 -0
  153. package/dist/ui/components/FlowSpinner.js +8 -0
  154. package/dist/ui/components/FlowSpinner.js.map +1 -0
  155. package/dist/ui/components/LogoWordmark.d.ts +9 -0
  156. package/dist/ui/components/LogoWordmark.d.ts.map +1 -0
  157. package/dist/ui/components/LogoWordmark.js +17 -0
  158. package/dist/ui/components/LogoWordmark.js.map +1 -0
  159. package/dist/ui/components/PromptPanel.d.ts +5 -0
  160. package/dist/ui/components/PromptPanel.d.ts.map +1 -0
  161. package/dist/ui/components/PromptPanel.js +7 -0
  162. package/dist/ui/components/PromptPanel.js.map +1 -0
  163. package/dist/ui/components/SelectField.d.ts +11 -0
  164. package/dist/ui/components/SelectField.d.ts.map +1 -0
  165. package/dist/ui/components/SelectField.js +19 -0
  166. package/dist/ui/components/SelectField.js.map +1 -0
  167. package/dist/ui/confirm.d.ts +2 -1
  168. package/dist/ui/confirm.d.ts.map +1 -1
  169. package/dist/ui/confirm.js +4 -4
  170. package/dist/ui/confirm.js.map +1 -1
  171. package/dist/ui/dev/DevDashboard.d.ts +8 -0
  172. package/dist/ui/dev/DevDashboard.d.ts.map +1 -0
  173. package/dist/ui/dev/DevDashboard.js +151 -0
  174. package/dist/ui/dev/DevDashboard.js.map +1 -0
  175. package/dist/ui/dev/DevReadyPanelView.d.ts +7 -0
  176. package/dist/ui/dev/DevReadyPanelView.d.ts.map +1 -0
  177. package/dist/ui/dev/DevReadyPanelView.js +29 -0
  178. package/dist/ui/dev/DevReadyPanelView.js.map +1 -0
  179. package/dist/ui/fatal.d.ts.map +1 -1
  180. package/dist/ui/fatal.js +5 -11
  181. package/dist/ui/fatal.js.map +1 -1
  182. package/dist/ui/flows/FlowApp.d.ts +8 -0
  183. package/dist/ui/flows/FlowApp.d.ts.map +1 -0
  184. package/dist/ui/flows/FlowApp.js +42 -0
  185. package/dist/ui/flows/FlowApp.js.map +1 -0
  186. package/dist/ui/flows/prompt-fields.d.ts +48 -0
  187. package/dist/ui/flows/prompt-fields.d.ts.map +1 -0
  188. package/dist/ui/flows/prompt-fields.js +88 -0
  189. package/dist/ui/flows/prompt-fields.js.map +1 -0
  190. package/dist/ui/flows/types.d.ts +41 -0
  191. package/dist/ui/flows/types.d.ts.map +1 -0
  192. package/dist/ui/flows/types.js +2 -0
  193. package/dist/ui/flows/types.js.map +1 -0
  194. package/dist/ui/index.d.ts +1 -1
  195. package/dist/ui/index.js +1 -1
  196. package/dist/ui/messages.d.ts +1 -0
  197. package/dist/ui/messages.d.ts.map +1 -1
  198. package/dist/ui/messages.js +48 -8
  199. package/dist/ui/messages.js.map +1 -1
  200. package/dist/ui/progress.d.ts +5 -1
  201. package/dist/ui/progress.d.ts.map +1 -1
  202. package/dist/ui/progress.js +12 -3
  203. package/dist/ui/progress.js.map +1 -1
  204. package/dist/ui/prompts.d.ts +7 -5
  205. package/dist/ui/prompts.d.ts.map +1 -1
  206. package/dist/ui/prompts.js +15 -8
  207. package/dist/ui/prompts.js.map +1 -1
  208. package/dist/ui/runtime/cancel.d.ts +4 -0
  209. package/dist/ui/runtime/cancel.d.ts.map +1 -0
  210. package/dist/ui/runtime/cancel.js +6 -0
  211. package/dist/ui/runtime/cancel.js.map +1 -0
  212. package/dist/ui/runtime/command-chrome.d.ts +17 -0
  213. package/dist/ui/runtime/command-chrome.d.ts.map +1 -0
  214. package/dist/ui/runtime/command-chrome.js +123 -0
  215. package/dist/ui/runtime/command-chrome.js.map +1 -0
  216. package/dist/ui/runtime/dev-prompt-queue.d.ts +30 -0
  217. package/dist/ui/runtime/dev-prompt-queue.d.ts.map +1 -0
  218. package/dist/ui/runtime/dev-prompt-queue.js +57 -0
  219. package/dist/ui/runtime/dev-prompt-queue.js.map +1 -0
  220. package/dist/ui/runtime/flow-session.d.ts +4 -0
  221. package/dist/ui/runtime/flow-session.d.ts.map +1 -0
  222. package/dist/ui/runtime/flow-session.js +8 -0
  223. package/dist/ui/runtime/flow-session.js.map +1 -0
  224. package/dist/ui/runtime/run-clack-flow.d.ts +5 -0
  225. package/dist/ui/runtime/run-clack-flow.d.ts.map +1 -0
  226. package/dist/ui/runtime/run-clack-flow.js +34 -0
  227. package/dist/ui/runtime/run-clack-flow.js.map +1 -0
  228. package/dist/ui/theme.d.ts +24 -0
  229. package/dist/ui/theme.d.ts.map +1 -0
  230. package/dist/ui/theme.js +34 -0
  231. package/dist/ui/theme.js.map +1 -0
  232. package/dist/valkey-sidecar.d.ts +17 -0
  233. package/dist/valkey-sidecar.d.ts.map +1 -0
  234. package/dist/valkey-sidecar.js +94 -0
  235. package/dist/valkey-sidecar.js.map +1 -0
  236. package/package.json +11 -3
  237. package/src/binary-cache.ts +61 -0
  238. package/src/binary-download-lock.ts +124 -0
  239. package/src/cli-package-version.ts +15 -0
  240. package/src/cli.ts +6 -2
  241. package/src/commands/add.ts +26 -19
  242. package/src/commands/admin.ts +380 -137
  243. package/src/commands/cache.ts +105 -5
  244. package/src/commands/dev.ts +29 -21
  245. package/src/commands/init.ts +217 -46
  246. package/src/commands/link-helpers.ts +30 -29
  247. package/src/commands/push.ts +3 -3
  248. package/src/compose-local-server-image.ts +68 -0
  249. package/src/compose-rename.ts +73 -0
  250. package/src/dev-compose.ts +175 -96
  251. package/src/dev-log-bus.ts +18 -0
  252. package/src/dev-log-filter.ts +42 -0
  253. package/src/dev-ports.ts +223 -0
  254. package/src/dev-ready-panel.ts +63 -0
  255. package/src/dev-session-lock.ts +98 -0
  256. package/src/dev-session.ts +98 -18
  257. package/src/dev-shutdown.ts +114 -9
  258. package/src/dev-task-colors.ts +22 -3
  259. package/src/docker-runtime.ts +1 -1
  260. package/src/engine-push-output.ts +5 -1
  261. package/src/ensure-binary.ts +21 -1
  262. package/src/ensure-component-binaries.ts +71 -0
  263. package/src/ensure-dev-api-config.ts +18 -0
  264. package/src/env-file.ts +37 -0
  265. package/src/init-dependency-versions.ts +69 -0
  266. package/src/init-package-json.ts +63 -0
  267. package/src/postgres-ctl.ts +2 -1
  268. package/src/required-host-components.ts +37 -0
  269. package/src/resolve-api-url.ts +43 -0
  270. package/src/rest-cache-admin.ts +135 -0
  271. package/src/scripts/postinstall.ts +9 -46
  272. package/src/self-host-compose.ts +23 -12
  273. package/src/studio-dev-server.ts +5 -4
  274. package/src/ui/README.md +13 -9
  275. package/src/ui/brand.ts +2 -8
  276. package/src/ui/clack-api.ts +123 -0
  277. package/src/ui/clack.ts +153 -0
  278. package/src/ui/components/FlowSpinner.tsx +15 -0
  279. package/src/ui/components/LogoWordmark.tsx +36 -0
  280. package/src/ui/components/PromptPanel.tsx +17 -0
  281. package/src/ui/components/SelectField.tsx +58 -0
  282. package/src/ui/confirm.ts +5 -4
  283. package/src/ui/dev/DevDashboard.tsx +213 -0
  284. package/src/ui/dev/DevReadyPanelView.tsx +67 -0
  285. package/src/ui/fatal.ts +5 -10
  286. package/src/ui/flows/FlowApp.tsx +67 -0
  287. package/src/ui/flows/prompt-fields.tsx +192 -0
  288. package/src/ui/flows/types.ts +50 -0
  289. package/src/ui/index.ts +1 -1
  290. package/src/ui/messages.ts +50 -8
  291. package/src/ui/progress.ts +14 -3
  292. package/src/ui/prompts.ts +17 -9
  293. package/src/ui/runtime/cancel.ts +6 -0
  294. package/src/ui/runtime/command-chrome.ts +147 -0
  295. package/src/ui/runtime/dev-prompt-queue.ts +84 -0
  296. package/src/ui/runtime/flow-session.ts +11 -0
  297. package/src/ui/runtime/run-clack-flow.tsx +52 -0
  298. package/src/ui/theme.ts +41 -0
  299. package/src/valkey-sidecar.ts +126 -0
  300. package/tests/admin-ensure.test.ts +59 -0
  301. package/tests/binary-cache-cloud-overrides.test.ts +2 -2
  302. package/tests/binary-download-lock.test.ts +41 -0
  303. package/tests/cli-help.test.ts +7 -4
  304. package/tests/cli-package-version.test.ts +15 -0
  305. package/tests/command-chrome-coverage.test.ts +149 -0
  306. package/tests/command-chrome-wrap.test.ts +51 -0
  307. package/tests/config.test.ts +8 -4
  308. package/tests/dev-ports.test.ts +41 -0
  309. package/tests/dev-ready-panel.test.ts +20 -0
  310. package/tests/dev-session-lock.test.ts +54 -0
  311. package/tests/dev-ui.test.ts +66 -3
  312. package/tests/docker-runtime.test.ts +9 -20
  313. package/tests/ensure-dev-api-config.test.ts +22 -0
  314. package/tests/init-dependency-versions.test.ts +62 -0
  315. package/tests/init-package-json.test.ts +18 -0
  316. package/tests/init.test.ts +30 -3
  317. package/tests/required-host-components.test.ts +51 -0
  318. package/tests/resolve-api-url.test.ts +23 -0
  319. package/tests/rest-cache-admin.test.ts +28 -0
  320. package/tests/runtime-contract.test.ts +12 -3
  321. package/tests/tsconfig.json +8 -2
  322. package/tests/ui-confirm.test.ts +13 -9
  323. package/tests/ui-messages.test.ts +4 -18
  324. package/tsconfig.json +1 -0
  325. package/tsconfig.tsbuildinfo +1 -1
  326. package/vitest.config.ts +3 -0
  327. package/dist/dev-tui.d.ts +0 -24
  328. package/dist/dev-tui.d.ts.map +0 -1
  329. package/dist/dev-tui.js +0 -188
  330. package/dist/dev-tui.js.map +0 -1
  331. package/src/dev-tui.ts +0 -232
@@ -1,24 +1,30 @@
1
1
  /**
2
- * supatype cache — list and clean cached component binaries.
2
+ * supatype cache — list and clean cached component binaries + REST Valkey cache.
3
3
  */
4
4
 
5
5
  import type { Command } from "commander"
6
6
  import { existsSync, readdirSync, rmSync, statSync } from "node:fs"
7
7
  import { join } from "node:path"
8
8
  import { cacheRoot, type Component } from "../binary-cache.js"
9
- import { info, plain } from "../ui/messages.js"
9
+ import {
10
+ deleteRestCacheEntry,
11
+ flushRestCache,
12
+ getRestCacheEntry,
13
+ listRestCacheEntries,
14
+ } from "../rest-cache-admin.js"
15
+ import { error, info, plain } from "../ui/messages.js"
10
16
 
11
17
  const COMPONENTS: Component[] = ["engine", "server", "postgres", "deno"]
12
18
 
13
19
  export function registerCache(program: Command): void {
14
20
  const cache = program
15
21
  .command("cache")
16
- .description("Manage cached component binaries")
22
+ .description("Manage cached component binaries and REST API response cache")
17
23
 
18
24
  cache
19
25
  .command("list")
20
26
  .description("List cached component binaries and their sizes")
21
- .action(() => {
27
+ .action(async () => {
22
28
  const root = cacheRoot()
23
29
  if (!existsSync(root)) {
24
30
  info("Cache is empty.")
@@ -62,7 +68,7 @@ export function registerCache(program: Command): void {
62
68
  " supatype cache clean engine # remove all engine versions\n" +
63
69
  " supatype cache clean engine 0.4.2",
64
70
  )
65
- .action((component?: string, version?: string) => {
71
+ .action(async (component?: string, version?: string) => {
66
72
  const root = cacheRoot()
67
73
  if (!existsSync(root)) {
68
74
  info("Cache is already empty.")
@@ -91,6 +97,100 @@ export function registerCache(program: Command): void {
91
97
 
92
98
  info("Done.")
93
99
  })
100
+
101
+ const rest = cache
102
+ .command("rest")
103
+ .description("Manage REST API response cache in Valkey")
104
+
105
+ rest
106
+ .command("list")
107
+ .description("List cached REST GET entries")
108
+ .option("--table <name>", "Filter by table name")
109
+ .option("--json", "Output JSON")
110
+ .action(async (opts: { table?: string; json?: boolean }) => {
111
+ const cwd = process.cwd()
112
+ try {
113
+ const result = await listRestCacheEntries(cwd, { table: opts.table, limit: 100 })
114
+ if (opts.json) {
115
+ plain(JSON.stringify(result, null, 2))
116
+ return
117
+ }
118
+ if (result.entries.length === 0) {
119
+ info("No REST cache entries.")
120
+ return
121
+ }
122
+ for (const e of result.entries) {
123
+ plain(
124
+ ` ${e.table ?? "?"} ${e.scope ?? "?"} ttl=${e.ttl_seconds}s ${e.size_bytes}B ${e.key}`,
125
+ )
126
+ }
127
+ if (result.cursor !== "0") {
128
+ plain(`\n(more available — cursor ${result.cursor})`)
129
+ }
130
+ } catch (e) {
131
+ error(e instanceof Error ? e.message : String(e))
132
+ process.exitCode = 1
133
+ }
134
+ })
135
+
136
+ rest
137
+ .command("get <key>")
138
+ .description("Show one cache entry (full Valkey key)")
139
+ .option("--json", "Output JSON")
140
+ .action(async (key: string, opts: { json?: boolean }) => {
141
+ const cwd = process.cwd()
142
+ try {
143
+ const detail = await getRestCacheEntry(cwd, key)
144
+ if (opts.json) {
145
+ plain(JSON.stringify(detail, null, 2))
146
+ return
147
+ }
148
+ plain(`key: ${detail.key}`)
149
+ plain(`table: ${detail.table ?? ""}`)
150
+ plain(`scope: ${detail.scope ?? ""}`)
151
+ plain(`ttl: ${detail.ttl_seconds}s`)
152
+ plain(`status: ${detail.status_code}`)
153
+ if (detail.body_preview) plain(`body:\n${detail.body_preview}`)
154
+ } catch (e) {
155
+ error(e instanceof Error ? e.message : String(e))
156
+ process.exitCode = 1
157
+ }
158
+ })
159
+
160
+ rest
161
+ .command("delete <key>")
162
+ .description("Delete one cache entry")
163
+ .action(async (key: string) => {
164
+ const cwd = process.cwd()
165
+ try {
166
+ await deleteRestCacheEntry(cwd, key)
167
+ info(`Deleted ${key}`)
168
+ } catch (e) {
169
+ error(e instanceof Error ? e.message : String(e))
170
+ process.exitCode = 1
171
+ }
172
+ })
173
+
174
+ rest
175
+ .command("flush")
176
+ .description("Flush REST cache entries")
177
+ .option("--table <name>", "Only flush one table")
178
+ .option("--yes", "Confirm flush")
179
+ .action(async (opts: { table?: string; yes?: boolean }) => {
180
+ if (!opts.yes) {
181
+ error("Pass --yes to confirm flush")
182
+ process.exitCode = 1
183
+ return
184
+ }
185
+ const cwd = process.cwd()
186
+ try {
187
+ await flushRestCache(cwd, opts.table)
188
+ info(opts.table ? `Flushed cache for table ${opts.table}` : "Flushed all REST cache entries")
189
+ } catch (e) {
190
+ error(e instanceof Error ? e.message : String(e))
191
+ process.exitCode = 1
192
+ }
193
+ })
94
194
  }
95
195
 
96
196
  function dirSize(dir: string): number {
@@ -36,13 +36,15 @@ import {
36
36
  import { ensureBinary } from "../ensure-binary.js"
37
37
  import { startProxyDevApp } from "../app/proxy-dev-app.js"
38
38
  import { ProcessManager } from "../process-manager.js"
39
- import { startStudioViteDevServer } from "../studio-dev-server.js"
39
+ import { STUDIO_DEV_PORT, startStudioViteDevServer } from "../studio-dev-server.js"
40
40
  import { restoreSystemRelationTargets } from "../restore-system-relation-targets.js"
41
41
  import { localStorageEnv } from "../local-storage.js"
42
42
  import { beginDevSession, endDevSession, resolveDevUiMode, startDevSession } from "../dev-session.js"
43
+ import { publishDevReady } from "../dev-ready-panel.js"
43
44
  import { probeDockerDaemon, reportDockerUnavailable } from "../docker-runtime.js"
44
45
  import { fatalError } from "../ui/fatal.js"
45
46
  import { registerDevShutdown } from "../dev-shutdown.js"
47
+ import { ensureValkeySidecar, stopValkeySidecar } from "../valkey-sidecar.js"
46
48
  import {
47
49
  initdb,
48
50
  start as pgStart,
@@ -133,7 +135,6 @@ export function registerDev(program: Command): void {
133
135
  }
134
136
 
135
137
  beginDevSession(resolveDevUiMode(opts.stream === true))
136
- startDevSession()
137
138
  if (hasMeaningfulOverrides(config)) {
138
139
  console.warn("[supatype] Local binary overrides active:")
139
140
  for (const line of describeActiveOverrides(config)) {
@@ -266,6 +267,9 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
266
267
  (e: unknown) => console.error("[supatype] Initial schema push failed:", (e as Error).message),
267
268
  )
268
269
 
270
+ const { ensureFirstAdminUser } = await import("./admin.js")
271
+ await ensureFirstAdminUser(dbURL, { cwd })
272
+
269
273
  // ── 10. Spawn supatype-server ─────────────────────────────────────────
270
274
 
271
275
  // Resolve edge functions config: only enable Deno if a functions dir exists.
@@ -323,9 +327,13 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
323
327
  ? "ses"
324
328
  : "smtp"
325
329
 
330
+ const valkeySidecar = ensureValkeySidecar(projectName)
331
+
326
332
  const serverEnv: Record<string, string> = {
327
333
  // supatype-server outer layer
328
334
  SUPATYPE_MODE: config.server.mode ?? "dev",
335
+ ...(valkeySidecar.addr ? { SUPATYPE_VALKEY_ADDR: valkeySidecar.addr } : {}),
336
+ SUPATYPE_MANAGED_PROJECT_REF: projectName,
329
337
  SUPATYPE_MANIFEST_PATH: manifestPath,
330
338
  SUPATYPE_ADMIN_CONFIG_PATH: adminConfigPath,
331
339
  SUPATYPE_POSTGREST_URL: `http://127.0.0.1:${postgrestPort}`,
@@ -468,7 +476,7 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
468
476
  }
469
477
 
470
478
  // ── 9d. Studio (optional) ─────────────────────────────────────────────
471
- const studioPort = 3002
479
+ const studioPort = STUDIO_DEV_PORT
472
480
  let studioProc: ProcessManager | null = null
473
481
 
474
482
  const studioOverride = config.overrides?.studio
@@ -486,25 +494,24 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
486
494
 
487
495
  const appProc = startProxyDevApp(cwd, config, pidDir)
488
496
 
489
- // ── Print status ──────────────────────────────────────────────────────
490
- console.log(`
491
- [supatype] Services running:
492
- Postgres ${dbURL}
493
- supatype-server http://localhost:${serverPort}
494
- REST API http://localhost:${serverPort}/rest/v1/
495
- Auth http://localhost:${serverPort}/auth/v1/
496
- Storage http://localhost:${serverPort}/storage/v1/
497
- Realtime ws://localhost:${serverPort}/realtime/v1/${studioProc ? `\n Studio http://localhost:${studioPort}` : ""}
498
-
499
- API keys (local dev only):
500
- anon key ${anonKey}
501
- service_role ${serviceRoleKey}
502
-
503
- JWT secret: ${LOCAL_JWT_SECRET}
504
-
505
- Press Ctrl+C to stop.
506
- `)
497
+ const links = [
498
+ { label: "API", url: `http://localhost:${serverPort}` },
499
+ { label: "REST", url: `http://localhost:${serverPort}/rest/v1/` },
500
+ { label: "Auth", url: `http://localhost:${serverPort}/auth/v1/` },
501
+ { label: "Storage", url: `http://localhost:${serverPort}/storage/v1/` },
502
+ { label: "Realtime", url: `ws://localhost:${serverPort}/realtime/v1/` },
503
+ ]
504
+ if (studioProc) {
505
+ links.push({ label: "Studio", url: `http://localhost:${studioPort}` })
506
+ }
507
507
 
508
+ publishDevReady({
509
+ title: "Services running",
510
+ links,
511
+ anonKey,
512
+ serviceRoleKey,
513
+ hints: [`Postgres ${dbURL}`, `JWT secret: ${LOCAL_JWT_SECRET}`],
514
+ })
508
515
 
509
516
  // ── Shutdown handler ──────────────────────────────────────────────────
510
517
  registerDevShutdown(async () => {
@@ -515,6 +522,7 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO authenticate
515
522
  studioProc?.stop(),
516
523
  appProc?.stop(),
517
524
  ])
525
+ stopValkeySidecar(valkeySidecar.containerName)
518
526
  await stopPostgres()
519
527
  })
520
528