@voltro/cli 0.33.0 → 0.34.0

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 (337) hide show
  1. package/CHANGELOG.md +1801 -0
  2. package/bin/nodeEnvironment.d.mts +30 -0
  3. package/bin/nodeEnvironment.mjs +158 -0
  4. package/bin/voltro.mjs +69 -5
  5. package/dist/addCommand-BNeoeSxe.js +124 -0
  6. package/dist/addCommand-aXSQveak.js +2 -0
  7. package/dist/agentsMd-BTchIZku.js +2 -0
  8. package/dist/agentsMd-mhQMF1bx.js +254 -0
  9. package/dist/apiBuild-BICVGnEC.js +2 -0
  10. package/dist/{apiBuild-h9VHtnlw.js → apiBuild-DZF_f0_I.js} +46 -46
  11. package/dist/appPort-B_HpJ_ck.js +48 -0
  12. package/dist/baselineCommand-C2ClWZN3.js +2 -0
  13. package/dist/baselineCommand-DIttzO8A.js +227 -0
  14. package/dist/bin.js +71 -28
  15. package/dist/build-CE7Ca9gm.js +711 -0
  16. package/dist/cacheCommand-DA4OH9xt.js +42 -0
  17. package/dist/capabilitiesCommand-nq_pz5xd.js +123 -0
  18. package/dist/checkCommand-Dv8r9tGO.js +231 -0
  19. package/dist/checkCommand-YZDmkAGd.js +2 -0
  20. package/dist/{cliArgs-qdZSElM3.js → cliArgs-D4p8n7EE.js} +12 -1
  21. package/dist/cliError-BmdYnghb.js +10 -0
  22. package/dist/cliOutput-D1tSBoRM.js +15 -0
  23. package/dist/{cliRuntime-Oh517vCV.js → cliRuntime-Dh7UDinH.js} +20 -20
  24. package/dist/cloudClient-DWL-Hw_T.js +67 -0
  25. package/dist/cloudCmd-Cvv5HGaZ.js +364 -0
  26. package/dist/clusterCmd-CNXKlcvD.js +54 -0
  27. package/dist/codegen-CYM3Zqrf.js +605 -0
  28. package/dist/codegen-ChBi_hVa.js +2 -0
  29. package/dist/codegenCommand-DC6w2tNZ.js +30 -0
  30. package/dist/codemodRunner-DRRqXR74.js +5243 -0
  31. package/dist/commandRunner-BLAEFLjp.js +47 -0
  32. package/dist/commands-gutsz-Ac.js +808 -0
  33. package/dist/connectionConfig-UFlIEiys.js +66 -0
  34. package/dist/dashboardCommand-3YG8p-UA.js +25 -0
  35. package/dist/dataCommand-qL0r7fPO.js +535 -0
  36. package/dist/dataProfile-dW-PsfLB.js +15 -0
  37. package/dist/{dbCommand-DTLKAfbA.js → dbCommand-B6X0FZbq.js} +551 -401
  38. package/dist/dbCommand-CpdKLeQq.js +2 -0
  39. package/dist/{dev-C_P8FLSx.js → dev-CerMd0mW.js} +3122 -3129
  40. package/dist/dev-CoG-ZPx8.js +3 -0
  41. package/dist/devActivity-Dx_3nnGv.js +100 -0
  42. package/dist/devActivity.js +1 -1
  43. package/dist/dialectDriver-CgXnDfec.js +39 -0
  44. package/dist/discover-C9XKJDco.js +25 -0
  45. package/dist/doctorCommand-BvqGBwNG.js +2 -0
  46. package/dist/{checkCommand-xGhRFFg2.js → doctorCommand-CnDXQxfa.js} +520 -1278
  47. package/dist/dormancyCommand-Dszo57d6.js +69 -0
  48. package/dist/e2eCmd-BRabZww-.js +147 -0
  49. package/dist/embeddingsCommand-C0sKVRo1.js +73 -0
  50. package/dist/envCommand-DPgdV1Bq.js +60 -0
  51. package/dist/evalCommand-6RUfPen4.js +118 -0
  52. package/dist/evolveCommand-DHpkgjgH.js +281 -0
  53. package/dist/fileTaxonomy-CJfgOllU.js +457 -0
  54. package/dist/frameworkTableAssembly-BGHmck-x.js +2 -0
  55. package/dist/{frameworkTableAssembly-BwIrO5nv.js → frameworkTableAssembly-DkkP6BgC.js} +184 -148
  56. package/dist/generateCommand-oibemh97.js +147 -0
  57. package/dist/index.d.ts +45 -0
  58. package/dist/index.js +4 -3
  59. package/dist/infoCommand-BJw9nLUR.js +60 -0
  60. package/dist/{inspect-BUUjt773.js → inspect-CBqFtAKA.js} +82 -40
  61. package/dist/inspect-C_T_WGvl.js +2 -0
  62. package/dist/inspectCmd-Bppy-GGw.js +224 -0
  63. package/dist/inspectFetch-Cm8_wVvp.js +151 -0
  64. package/dist/inspectMetrics-CfdKLh6t.js +72 -0
  65. package/dist/loadEnv-D9nEOClM.js +44 -0
  66. package/dist/logFileSink-C_D2wRN1.js +105 -0
  67. package/dist/logsCmd-CCca3KRZ.js +260 -0
  68. package/dist/manifestBuild-ChsKAhmn.js +2 -0
  69. package/dist/{manifestBuild-BLrVuSlM.js → manifestBuild-sxpwdKY1.js} +1 -1
  70. package/dist/metaCommands-7MJfZ5cf.js +196 -0
  71. package/dist/migrate-CBwOt_iV.js +83 -0
  72. package/dist/mssqlClusterPatch-_4cE_nun.js +44 -0
  73. package/dist/newCommand-COWOJ1_E.js +156 -0
  74. package/dist/nodeEnvironment-cGFAj1J8.js +28 -0
  75. package/dist/packageCommand-Cug_3Ogl.js +271 -0
  76. package/dist/pageConvention-cEiRxdab.js +5 -0
  77. package/dist/privacyCommand-C-Df56U_.js +146 -0
  78. package/dist/projectScaffold-DmzEKHib.js +2 -0
  79. package/dist/projectScaffold-LMMtaavR.js +814 -0
  80. package/dist/renderModeScan-D7J1B7Kw.js +105 -0
  81. package/dist/renderProfile-1OWWAAtx.js +81 -0
  82. package/dist/runtimeRegistry-DMeKfTHP.js +81 -0
  83. package/dist/runtimeTrace-CRxalXTs.js +91 -0
  84. package/dist/scheduleCmd--jksTrf6.js +69 -0
  85. package/dist/scheduleManifestCmd-D2x0CTTY.js +249 -0
  86. package/dist/schemaIr-UJybUUZW.js +103 -0
  87. package/dist/{sdkgen-C81QIkiL.js → sdkgen-CYJscZC7.js} +111 -209
  88. package/dist/seedRunner-TFHHiToI.js +329 -0
  89. package/dist/serveCommand-B_isw7q4.js +1647 -0
  90. package/dist/serveCommand-DOvbgRnQ.js +2 -0
  91. package/dist/serveEntry.js +5 -5
  92. package/dist/serverlessCommand-CfJZy6dS.js +482 -0
  93. package/dist/start-9LiUOfES.js +1087 -0
  94. package/dist/start-B-9Nsp-S.js +3 -0
  95. package/dist/startEntry.js +2 -2
  96. package/dist/staticCommand-Dr2M6tpU.js +304 -0
  97. package/dist/storageCommand-Co6NfLqN.js +42 -0
  98. package/dist/templates-De8IR5-c.js +102 -0
  99. package/dist/test-CI6iDsYc.js +115 -0
  100. package/dist/tracesCmd-CkEZQrtt.js +232 -0
  101. package/dist/tsconfigPaths-BWXBWgcl.js +107 -0
  102. package/dist/tsxLoader-EuXmSJ1K.js +51 -0
  103. package/dist/typecheckCommand-BlsWiCNq.js +61 -0
  104. package/dist/updateCommand-Bkptutss.js +585 -0
  105. package/dist/updateCommand-us1_hdIC.js +2 -0
  106. package/dist/{inspectMetrics-1xzTKAFx.js → webDev-CBYvPqQr.js} +975 -1559
  107. package/dist/webDev-Cg-fFiyd2.js +2 -0
  108. package/dist/webhookDiscovery-CrGAfhIG.js +2 -0
  109. package/dist/webhookDiscovery-D7VaeMlz.js +51 -0
  110. package/dist/webhooksCommand-CID96Rga.js +267 -0
  111. package/dist/workflowsCmd-D1VTmLMY.js +608 -0
  112. package/package.json +179 -17
  113. package/templates/AGENTS.core.md +58 -3
  114. package/templates/AGENTS.md +64 -7
  115. package/templates/agent-docs/_index.md +6 -4
  116. package/templates/agent-docs/_manifest.json +22 -5
  117. package/templates/agent-docs/ai.md +370 -0
  118. package/templates/agent-docs/authentication.md +265 -31
  119. package/templates/agent-docs/caching.md +6 -0
  120. package/templates/agent-docs/cli.md +794 -50
  121. package/templates/agent-docs/data.md +550 -11
  122. package/templates/agent-docs/database/migrations.md +174 -25
  123. package/templates/agent-docs/database/misc.md +156 -40
  124. package/templates/agent-docs/database/querying.md +19 -1
  125. package/templates/agent-docs/database/scaling.md +60 -0
  126. package/templates/agent-docs/database/schema.md +1 -0
  127. package/templates/agent-docs/database/seedsdialects.md +208 -19
  128. package/templates/agent-docs/database/transactions.md +68 -0
  129. package/templates/agent-docs/deployment.md +69 -3
  130. package/templates/agent-docs/introduction.md +87 -16
  131. package/templates/agent-docs/local-first-mobile.md +79 -4
  132. package/templates/agent-docs/multi-tenancy.md +95 -20
  133. package/templates/agent-docs/observability.md +58 -3
  134. package/templates/agent-docs/plugins/ai-flows.md +161 -2
  135. package/templates/agent-docs/plugins/analytics-postgres.md +1 -1
  136. package/templates/agent-docs/plugins/audit.md +37 -1
  137. package/templates/agent-docs/plugins/auth-social.md +143 -0
  138. package/templates/agent-docs/plugins/auth-workos.md +4 -2
  139. package/templates/agent-docs/plugins/auth.md +131 -6
  140. package/templates/agent-docs/plugins/billing.md +132 -15
  141. package/templates/agent-docs/plugins/cdc-out.md +46 -7
  142. package/templates/agent-docs/plugins/clickhouse.md +1 -1
  143. package/templates/agent-docs/plugins/duckdb.md +1 -1
  144. package/templates/agent-docs/plugins/flags.md +132 -0
  145. package/templates/agent-docs/plugins/governance.md +105 -7
  146. package/templates/agent-docs/plugins/multitenancy.md +9 -4
  147. package/templates/agent-docs/plugins/presence.md +13 -2
  148. package/templates/agent-docs/plugins/ratelimit.md +9 -0
  149. package/templates/agent-docs/plugins/search.md +157 -6
  150. package/templates/agent-docs/plugins/sso-saml.md +47 -8
  151. package/templates/agent-docs/plugins/webhooks.md +105 -0
  152. package/templates/agent-docs/plugins.md +150 -18
  153. package/templates/agent-docs/reference.md +60 -3
  154. package/templates/agent-docs/releases.md +1117 -0
  155. package/templates/agent-docs/routing.md +43 -25
  156. package/templates/agent-docs/scheduling.md +10 -0
  157. package/templates/agent-docs/schema-driven-ui.md +92 -12
  158. package/templates/agent-docs/security.md +426 -0
  159. package/templates/agent-docs/templates/apibackends.md +87 -18
  160. package/templates/agent-docs/templates/appshells.md +32 -14
  161. package/templates/agent-docs/templates/overview.md +13 -8
  162. package/templates/agent-docs/testing.md +211 -14
  163. package/templates/agent-docs/whats-new.md +1700 -104
  164. package/templates/agent-docs/workflows.md +130 -14
  165. package/templates/apps/api-ai/actions/summarize.action.ts +11 -0
  166. package/templates/apps/api-ai/package.json +8 -7
  167. package/templates/apps/api-auth/actions/me.action.ts +13 -0
  168. package/templates/apps/api-auth/package.json +9 -8
  169. package/templates/apps/api-backend/mutations/notes.create.mutation.ts +9 -0
  170. package/templates/apps/api-backend/package.json +12 -8
  171. package/templates/apps/api-backend/queries/notes.query.ts +30 -8
  172. package/templates/apps/api-backend-deactivation/actions/users.get.action.ts +14 -0
  173. package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.ts +8 -0
  174. package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.ts +10 -0
  175. package/templates/apps/api-backend-deactivation/package.json +8 -7
  176. package/templates/apps/api-backend-mail/actions/sendWelcome.action.ts +17 -0
  177. package/templates/apps/api-backend-mail/mutations/notes.create.mutation.ts +9 -0
  178. package/templates/apps/api-backend-mail/package.json +9 -8
  179. package/templates/apps/api-backend-mail/queries/notes.query.ts +30 -8
  180. package/templates/apps/api-backend-mariadb/.env.example +14 -0
  181. package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.ts +9 -0
  182. package/templates/apps/api-backend-mariadb/package.json +10 -9
  183. package/templates/apps/api-backend-mariadb/queries/notes.query.ts +30 -8
  184. package/templates/apps/api-backend-sqlite/.env.example +14 -0
  185. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +9 -0
  186. package/templates/apps/api-backend-sqlite/package.json +9 -8
  187. package/templates/apps/api-backend-sqlite/queries/notes.query.ts +30 -8
  188. package/templates/apps/api-backend-storage/actions/uploadAvatar.action.ts +13 -0
  189. package/templates/apps/api-backend-storage/actions/uploadDocument.action.ts +12 -0
  190. package/templates/apps/api-backend-storage/mutations/notes.create.mutation.ts +9 -0
  191. package/templates/apps/api-backend-storage/package.json +9 -8
  192. package/templates/apps/api-backend-storage/queries/notes.query.ts +30 -8
  193. package/templates/apps/api-cms/actions/content.get.action.ts +7 -0
  194. package/templates/apps/api-cms/actions/content.types.action.ts +6 -0
  195. package/templates/apps/api-cms/actions/me.action.ts +13 -0
  196. package/templates/apps/api-cms/app.config.ts +19 -0
  197. package/templates/apps/api-cms/authz.ts +63 -0
  198. package/templates/apps/api-cms/mutations/content.publish.mutation.ts +10 -0
  199. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +10 -0
  200. package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +5 -0
  201. package/templates/apps/api-cms/package.json +11 -10
  202. package/templates/apps/api-cms/queries/content.list.query.ts +23 -7
  203. package/templates/apps/api-cms/tests/accessDecisions.test.ts +121 -0
  204. package/templates/apps/api-cms/tests/content.descriptors.test.ts +8 -4
  205. package/templates/apps/api-collab/mutations/documents.create.mutation.ts +8 -0
  206. package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +13 -0
  207. package/templates/apps/api-collab/package.json +9 -8
  208. package/templates/apps/api-collab/queries/documents.query.ts +19 -7
  209. package/templates/apps/api-data-advanced/package.json +9 -8
  210. package/templates/apps/api-data-advanced/queries/authors.withBooks.query.ts +12 -0
  211. package/templates/apps/api-data-advanced/queries/books.search.query.ts +9 -0
  212. package/templates/apps/api-durable/mutations/orders.approve.mutation.ts +17 -0
  213. package/templates/apps/api-durable/mutations/orders.place.mutation.ts +9 -0
  214. package/templates/apps/api-durable/package.json +9 -8
  215. package/templates/apps/api-feature-flags/actions/notes.export.action.ts +16 -0
  216. package/templates/apps/api-feature-flags/mutations/notes.create.mutation.ts +12 -0
  217. package/templates/apps/api-feature-flags/package.json +10 -9
  218. package/templates/apps/api-governance/README.md +30 -8
  219. package/templates/apps/api-governance/actions/profiles.get.action.server.ts +17 -1
  220. package/templates/apps/api-governance/actions/profiles.get.action.ts +29 -4
  221. package/templates/apps/api-governance/database/schema.ts +16 -4
  222. package/templates/apps/api-governance/mutations/profiles.create.mutation.ts +12 -0
  223. package/templates/apps/api-governance/package.json +9 -8
  224. package/templates/apps/api-kv/actions/sync.pull.action.ts +15 -0
  225. package/templates/apps/api-kv/actions/sync.reset.action.ts +13 -0
  226. package/templates/apps/api-kv/actions/sync.status.action.ts +7 -0
  227. package/templates/apps/api-kv/package.json +9 -8
  228. package/templates/apps/api-kv/queries/events.list.query.ts +19 -8
  229. package/templates/apps/api-moderation/mutations/comments.create.mutation.ts +11 -0
  230. package/templates/apps/api-moderation/mutations/posts.create.mutation.ts +13 -0
  231. package/templates/apps/api-moderation/package.json +9 -8
  232. package/templates/apps/api-observability/mutations/notes.create.mutation.ts +8 -0
  233. package/templates/apps/api-observability/package.json +9 -8
  234. package/templates/apps/api-observability/queries/notes.list.query.ts +13 -0
  235. package/templates/apps/api-ratelimit/mutations/notes.create.mutation.ts +14 -0
  236. package/templates/apps/api-ratelimit/package.json +9 -8
  237. package/templates/apps/api-rbac/package.json +9 -8
  238. package/templates/apps/api-rest/package.json +8 -7
  239. package/templates/apps/api-saas/mutations/projects.create.mutation.ts +13 -0
  240. package/templates/apps/api-saas/package.json +12 -11
  241. package/templates/apps/api-saas/queries/projects.list.query.ts +11 -0
  242. package/templates/apps/api-saas-starter/actions/me.action.ts +13 -0
  243. package/templates/apps/api-saas-starter/app.config.ts +19 -0
  244. package/templates/apps/api-saas-starter/authz.ts +75 -0
  245. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +10 -0
  246. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +9 -0
  247. package/templates/apps/api-saas-starter/package.json +15 -11
  248. package/templates/apps/api-saas-starter/queries/invites.list.query.ts +19 -8
  249. package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -7
  250. package/templates/apps/api-saas-starter/tests/accessDecisions.test.ts +135 -0
  251. package/templates/apps/api-search/mutations/articles.create.mutation.ts +14 -0
  252. package/templates/apps/api-search/package.json +9 -8
  253. package/templates/apps/api-search/queries/articles.list.query.ts +21 -8
  254. package/templates/apps/api-status/README.md +10 -3
  255. package/templates/apps/api-status/app.config.ts +8 -3
  256. package/templates/apps/api-status/authz.ts +5 -3
  257. package/templates/apps/api-status/package.json +9 -8
  258. package/templates/apps/api-status/queries/components.list.query.ts +14 -6
  259. package/templates/apps/api-status/queries/incidents.live.query.ts +23 -10
  260. package/templates/apps/api-status/queries/updates.list.query.ts +16 -9
  261. package/templates/apps/api-status/tests/status.test.ts +9 -1
  262. package/templates/apps/api-versioning/actions/documents.asOf.action.ts +12 -0
  263. package/templates/apps/api-versioning/actions/documents.history.action.ts +13 -0
  264. package/templates/apps/api-versioning/mutations/documents.create.mutation.ts +9 -0
  265. package/templates/apps/api-versioning/mutations/documents.update.mutation.ts +12 -0
  266. package/templates/apps/api-versioning/package.json +9 -8
  267. package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.ts +16 -0
  268. package/templates/apps/api-webhooks/package.json +10 -9
  269. package/templates/apps/api-webhooks/queries/orders.list.query.ts +10 -0
  270. package/templates/apps/changelog/package.json +8 -6
  271. package/templates/apps/edge-functions/package.json +2 -2
  272. package/templates/apps/frontend-admin/package.json +10 -8
  273. package/templates/apps/frontend-admin/src/lib/admin.ts +20 -9
  274. package/templates/apps/frontend-admin/src/locales/de.ts +11 -1
  275. package/templates/apps/frontend-admin/src/locales/en.ts +13 -1
  276. package/templates/apps/frontend-admin/src/pages/admin/[entity]/page.tsx +65 -22
  277. package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +130 -23
  278. package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +3 -2
  279. package/templates/apps/frontend-admin/src/pages/admin/page.test.tsx +19 -2
  280. package/templates/apps/frontend-admin/src/pages/admin/page.tsx +9 -4
  281. package/templates/apps/frontend-app/app.config.ts +4 -3
  282. package/templates/apps/frontend-app/package.json +11 -8
  283. package/templates/apps/frontend-app/src/lib/api.ts +25 -0
  284. package/templates/apps/frontend-app/src/pages/page.test.tsx +130 -82
  285. package/templates/apps/frontend-app/src/pages/page.tsx +14 -18
  286. package/templates/apps/frontend-auth/package.json +10 -8
  287. package/templates/apps/frontend-blank/package.json +9 -7
  288. package/templates/apps/frontend-cms/package.json +11 -9
  289. package/templates/apps/frontend-collab/package.json +12 -9
  290. package/templates/apps/frontend-collab/src/pages/page.test.tsx +122 -78
  291. package/templates/apps/frontend-contact/package.json +9 -7
  292. package/templates/apps/frontend-dashboard/package.json +9 -7
  293. package/templates/apps/frontend-docs/package.json +9 -7
  294. package/templates/apps/frontend-i18n/package.json +8 -6
  295. package/templates/apps/frontend-landing/package.json +9 -7
  296. package/templates/apps/frontend-portal/package.json +10 -8
  297. package/templates/apps/frontend-saas/app.config.ts +10 -6
  298. package/templates/apps/frontend-saas/package.json +10 -8
  299. package/templates/apps/frontend-saas/src/lib/api.ts +27 -32
  300. package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +7 -8
  301. package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +27 -3
  302. package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +4 -4
  303. package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +3 -4
  304. package/templates/apps/frontend-spa/package.json +9 -7
  305. package/templates/apps/frontend-ssr/package.json +9 -7
  306. package/templates/apps/frontend-ssr-api/package.json +10 -8
  307. package/templates/apps/frontend-static-blog/package.json +8 -6
  308. package/templates/apps/frontend-status/package.json +10 -8
  309. package/templates/apps/mobile-app/README.md +1 -0
  310. package/templates/apps/mobile-app/package.json +4 -2
  311. package/templates/apps/mobile-app/src/app/index.tsx +22 -12
  312. package/templates/apps/mobile-app/src/app/orders/[id].tsx +1 -1
  313. package/templates/apps/mobile-app/src/lib/api.ts +34 -0
  314. package/templates/apps/mobile-app/voltro.mobile.ts +4 -2
  315. package/templates/baselines/bare/.env.example +14 -0
  316. package/templates/baselines/bare/baseline.json +4 -4
  317. package/templates/baselines/compose/.env.example +14 -0
  318. package/templates/baselines/compose/README.md +1 -1
  319. package/templates/baselines/compose/baseline.json +5 -5
  320. package/templates/baselines/compose-mariadb/.env.example +14 -0
  321. package/templates/baselines/compose-mariadb/README.md +1 -1
  322. package/templates/baselines/compose-mariadb/baseline.json +5 -5
  323. package/templates/baselines/helm/.env.example +14 -0
  324. package/templates/baselines/helm/baseline.json +4 -4
  325. package/dist/apiBuild-C-x9YacA.js +0 -2
  326. package/dist/checkCommand-DRovTKza.js +0 -2
  327. package/dist/commands-CJfepbm4.js +0 -11541
  328. package/dist/dbCommand-b1gum4td.js +0 -2
  329. package/dist/dev-iiMtlkfs.js +0 -3
  330. package/dist/devActivity-BhIu6ncs.js +0 -159
  331. package/dist/frameworkTableAssembly-D-EebUQX.js +0 -2
  332. package/dist/inspect-mmBuRXmy.js +0 -2
  333. package/dist/manifestBuild-Dj8Jjoto.js +0 -2
  334. package/dist/seedRunner-Bqxgp7HZ.js +0 -230
  335. package/dist/serveCommand-DdaM4Hup.js +0 -1608
  336. package/dist/start-C0koT0UO.js +0 -1084
  337. /package/templates/apps/api-ai/actions/{summarize.action.server.tsx → summarize.action.server.ts} +0 -0
@@ -1,7 +1,9 @@
1
1
  // @vitest-environment jsdom
2
2
  //
3
- // Projects page — the live list + the paywall branch. We mock `@voltro/client`
4
- // (useSubscription streams the rows; useMutation is the create) and drive the
3
+ // Projects page — the live list + the paywall branch. We mock the app's TYPED
4
+ // hook binding `src/lib/api.ts` (useSubscription streams the rows; useMutation
5
+ // is the create) — mocking `@voltro/client` underneath it would leave the real
6
+ // `createHooks` running over a stub, i.e. the wrong seam. We drive the
5
7
  // create form, asserting: the SSR'd rows render, the empty state shows, and a
6
8
  // `projects.create` that rejects with a typed `EntitlementExceeded` flips the
7
9
  // page into the upgrade CTA (NOT a raw error).
@@ -14,7 +16,15 @@ import enCatalog from '../../locales/en'
14
16
 
15
17
  const subData = vi.fn<() => { data: unknown }>()
16
18
  const mutate = vi.fn<(input: { name: string }) => Promise<unknown>>()
17
- vi.mock('@voltro/client', () => ({
19
+ // Only the HOOKS are faked. `isEntitlementExceeded` comes through from the real
20
+ // module — an earlier version of this file re-implemented it inside the mock,
21
+ // which meant the paywall test asserted that a copy of the predicate agreed
22
+ // with the literal the same test had just written. That passes in every world,
23
+ // including the one where the framework hands `catch` a value with no `_tag`
24
+ // at all. `import type` is erased, so importing the original pulls in nothing
25
+ // but `@voltro/client`.
26
+ vi.mock('../../lib/api', async (importOriginal) => ({
27
+ ...(await importOriginal<typeof import('../../lib/api')>()),
18
28
  useSubscription: () => subData(),
19
29
  useMutation: () => ({ mutate, pending: false, error: undefined, data: undefined }),
20
30
  }))
@@ -104,10 +114,24 @@ describe('projects — paywall', () => {
104
114
  })
105
115
 
106
116
  test('a typed EntitlementExceeded flips the page into the upgrade CTA', async () => {
117
+ // The rejection value is the TYPED ERROR ITSELF — that is the framework's
118
+ // guarantee for `mutate` / `run` / `signal` / `upload`, and the whole reason
119
+ // this page can branch on `_tag` instead of string-matching a message.
107
120
  mutate.mockRejectedValue({ _tag: 'EntitlementExceeded', entitlement: 'projects', limit: 3 })
108
121
  render(createElement(Projects))
109
122
  await submit()
110
123
  expect(container.querySelector('.paywall')).not.toBeNull()
111
124
  expect(container.textContent).toContain('hit your plan limit')
112
125
  })
126
+
127
+ test('an UNTAGGED failure does not paywall — that branch is for a declared outcome', async () => {
128
+ // The negative control, and the exact state the app was in while a rejected
129
+ // write handed back a wrapper with no `_tag`: the create fails, and the user
130
+ // is shown nothing about why. A paywall that appears for every failure is
131
+ // as wrong as one that never appears.
132
+ mutate.mockRejectedValue(new Error('socket hang up'))
133
+ render(createElement(Projects))
134
+ await submit()
135
+ expect(container.querySelector('.paywall')).toBeNull()
136
+ })
113
137
  })
@@ -7,10 +7,9 @@
7
7
  import type { ReactNode } from 'react'
8
8
  import { useState, type FormEvent } from 'react'
9
9
  import type { PageMeta } from '@voltro/web'
10
- import { useSubscription, useMutation } from '@voltro/client'
11
10
  import { T, useT } from '@voltro/i18n'
12
11
  import { getCatalog } from '../../locales'
13
- import { isEntitlementExceeded, type Project } from '../../lib/api'
12
+ import { isEntitlementExceeded, useMutation, useSubscription } from '../../lib/api'
14
13
 
15
14
  export const renderMode = 'ssr' as const
16
15
 
@@ -19,8 +18,9 @@ export const meta = ({ locale }: { readonly locale: string }): PageMeta => ({
19
18
  })
20
19
 
21
20
  export default function Projects(): ReactNode {
22
- const { data: live } = useSubscription<ReadonlyArray<Project>>('app', 'projects.list')
23
- const { mutate, pending } = useMutation<{ name: string }, Project>('app', 'projects.create')
21
+ // Tag + row type both come from the generated procedure map — no annotation.
22
+ const { data: live } = useSubscription('projects.list')
23
+ const { mutate, pending } = useMutation('projects.create')
24
24
  const projects = live ?? []
25
25
  const [name, setName] = useState('')
26
26
  const [paywalled, setPaywalled] = useState(false)
@@ -6,10 +6,9 @@
6
6
  import type { ReactNode } from 'react'
7
7
  import { useState, type FormEvent } from 'react'
8
8
  import type { PageMeta } from '@voltro/web'
9
- import { useSubscription, useMutation } from '@voltro/client'
10
9
  import { T, useT } from '@voltro/i18n'
11
10
  import { getCatalog } from '../../../locales/index'
12
- import { isEntitlementExceeded, type Invite } from '../../../lib/api'
11
+ import { isEntitlementExceeded, useMutation, useSubscription } from '../../../lib/api'
13
12
 
14
13
  export const renderMode = 'ssr' as const
15
14
 
@@ -24,8 +23,8 @@ const STATUS_KEY: Record<string, 'team.status.pending' | 'team.status.accepted'
24
23
  }
25
24
 
26
25
  export default function Team(): ReactNode {
27
- const { data: live } = useSubscription<ReadonlyArray<Invite>>('app', 'invites.list')
28
- const { mutate, pending } = useMutation<{ email: string }, Invite>('app', 'invites.create')
26
+ const { data: live } = useSubscription('invites.list')
27
+ const { mutate, pending } = useMutation('invites.create')
29
28
  const invites = live ?? []
30
29
  const [email, setEmail] = useState('')
31
30
  const [outOfSeats, setOutOfSeats] = useState(false)
@@ -12,20 +12,22 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.33.0",
16
- "@voltro/client": "0.33.0",
17
- "@voltro/env": "0.33.0",
18
- "@voltro/i18n": "0.33.0",
19
- "@voltro/ui-shadcn": "0.33.0",
20
- "@voltro/web": "0.33.0",
15
+ "@voltro/cli": "0.34.0",
16
+ "@voltro/client": "0.34.0",
17
+ "@voltro/env": "0.34.0",
18
+ "@voltro/i18n": "0.34.0",
19
+ "@voltro/ui-shadcn": "0.34.0",
20
+ "@voltro/web": "0.34.0",
21
21
  "react": "^19.0.0",
22
22
  "react-dom": "^19.0.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/devtools": "0.33.0",
25
+ "@voltro/devtools": "0.34.0",
26
26
  "@types/react": "^19.0.0",
27
27
  "@types/react-dom": "^19.0.0",
28
+ "jsdom": "^30.0.0",
28
29
  "typescript": "^6.0.3",
30
+ "@vitest/coverage-v8": "^4.1.10",
29
31
  "vitest": "^4.1.10"
30
32
  }
31
33
  }
@@ -12,20 +12,22 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.33.0",
16
- "@voltro/client": "0.33.0",
17
- "@voltro/env": "0.33.0",
18
- "@voltro/i18n": "0.33.0",
19
- "@voltro/ui-shadcn": "0.33.0",
20
- "@voltro/web": "0.33.0",
15
+ "@voltro/cli": "0.34.0",
16
+ "@voltro/client": "0.34.0",
17
+ "@voltro/env": "0.34.0",
18
+ "@voltro/i18n": "0.34.0",
19
+ "@voltro/ui-shadcn": "0.34.0",
20
+ "@voltro/web": "0.34.0",
21
21
  "react": "^19.0.0",
22
22
  "react-dom": "^19.0.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/devtools": "0.33.0",
25
+ "@voltro/devtools": "0.34.0",
26
26
  "@types/react": "^19.0.0",
27
27
  "@types/react-dom": "^19.0.0",
28
+ "jsdom": "^30.0.0",
28
29
  "typescript": "^6.0.3",
30
+ "@vitest/coverage-v8": "^4.1.10",
29
31
  "vitest": "^4.1.10"
30
32
  }
31
33
  }
@@ -12,21 +12,23 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.33.0",
16
- "@voltro/cli": "0.33.0",
17
- "@voltro/client": "0.33.0",
18
- "@voltro/env": "0.33.0",
19
- "@voltro/i18n": "0.33.0",
20
- "@voltro/ui-shadcn": "0.33.0",
21
- "@voltro/web": "0.33.0",
15
+ "@{{projectName}}/api": "0.34.0",
16
+ "@voltro/cli": "0.34.0",
17
+ "@voltro/client": "0.34.0",
18
+ "@voltro/env": "0.34.0",
19
+ "@voltro/i18n": "0.34.0",
20
+ "@voltro/ui-shadcn": "0.34.0",
21
+ "@voltro/web": "0.34.0",
22
22
  "react": "^19.0.0",
23
23
  "react-dom": "^19.0.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/devtools": "0.33.0",
26
+ "@voltro/devtools": "0.34.0",
27
27
  "@types/react": "^19.0.0",
28
28
  "@types/react-dom": "^19.0.0",
29
+ "jsdom": "^30.0.0",
29
30
  "typescript": "^6.0.3",
31
+ "@vitest/coverage-v8": "^4.1.10",
30
32
  "vitest": "^4.1.10"
31
33
  }
32
34
  }
@@ -12,19 +12,21 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.33.0",
16
- "@voltro/client": "0.33.0",
17
- "@voltro/env": "0.33.0",
18
- "@voltro/i18n": "0.33.0",
19
- "@voltro/web": "0.33.0",
15
+ "@voltro/cli": "0.34.0",
16
+ "@voltro/client": "0.34.0",
17
+ "@voltro/env": "0.34.0",
18
+ "@voltro/i18n": "0.34.0",
19
+ "@voltro/web": "0.34.0",
20
20
  "react": "^19.0.0",
21
21
  "react-dom": "^19.0.0"
22
22
  },
23
23
  "devDependencies": {
24
- "@voltro/devtools": "0.33.0",
24
+ "@voltro/devtools": "0.34.0",
25
25
  "@types/react": "^19.0.0",
26
26
  "@types/react-dom": "^19.0.0",
27
+ "jsdom": "^30.0.0",
27
28
  "typescript": "^6.0.3",
29
+ "@vitest/coverage-v8": "^4.1.10",
28
30
  "vitest": "^4.1.10"
29
31
  }
30
32
  }
@@ -12,21 +12,23 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.33.0",
16
- "@voltro/cli": "0.33.0",
17
- "@voltro/client": "0.33.0",
18
- "@voltro/env": "0.33.0",
19
- "@voltro/i18n": "0.33.0",
20
- "@voltro/ui-shadcn": "0.33.0",
21
- "@voltro/web": "0.33.0",
15
+ "@{{projectName}}/api": "0.34.0",
16
+ "@voltro/cli": "0.34.0",
17
+ "@voltro/client": "0.34.0",
18
+ "@voltro/env": "0.34.0",
19
+ "@voltro/i18n": "0.34.0",
20
+ "@voltro/ui-shadcn": "0.34.0",
21
+ "@voltro/web": "0.34.0",
22
22
  "react": "^19.0.0",
23
23
  "react-dom": "^19.0.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/devtools": "0.33.0",
26
+ "@voltro/devtools": "0.34.0",
27
27
  "@types/react": "^19.0.0",
28
28
  "@types/react-dom": "^19.0.0",
29
+ "jsdom": "^30.0.0",
29
30
  "typescript": "^6.0.3",
31
+ "@vitest/coverage-v8": "^4.1.10",
30
32
  "vitest": "^4.1.10"
31
33
  }
32
34
  }
@@ -27,6 +27,7 @@ pnpm ios # or: pnpm android · pnpm start (Expo Go)
27
27
 
28
28
  | Path | What |
29
29
  |---|---|
30
+ | `src/lib/api.ts` | the **typed hook binding** — `createHooks<AppProcedures>('app')`, imported by every screen |
30
31
  | `src/lib/deeplinks.ts` | the typed deep-link table + pure resolver (**tested**) |
31
32
  | `src/lib/sync.ts` | the background-sync decision layer (**tested**) |
32
33
  | `src/lib/notifications.ts` | build a `_voltro_devices` row from a push token (**tested**) |
@@ -12,8 +12,8 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/client": "0.33.0",
16
- "@voltro/react-native": "0.33.0",
15
+ "@voltro/client": "0.34.0",
16
+ "@voltro/react-native": "0.34.0",
17
17
  "expo": "^52.0.0",
18
18
  "expo-constants": "~17.0.0",
19
19
  "expo-linking": "~7.0.0",
@@ -26,8 +26,10 @@
26
26
  "react-native": "0.76.5"
27
27
  },
28
28
  "devDependencies": {
29
+ "@{{projectName}}/api": "0.34.0",
29
30
  "@types/react": "^19.0.0",
30
31
  "typescript": "^6.0.3",
32
+ "@vitest/coverage-v8": "^4.1.10",
31
33
  "vitest": "^4.1.10"
32
34
  }
33
35
  }
@@ -1,22 +1,29 @@
1
1
  // Home screen — the reactive end-to-end loop, on a phone.
2
2
  //
3
- // The SAME hooks as the web frontend: `useSubscription('app', 'notes.list')`
4
- // streams the server-side query; `useMutation('app', 'notes.create')` writes it.
5
- // When the mutation lands, the server pushes a delta and this list re-renders —
6
- // no refetch, no polling. (Requires the M0 client boot; see ../client.ts.)
3
+ // The SAME hooks as the web frontend: `useSubscription('notes.list')` streams
4
+ // the server-side query; `useMutation('notes.create')` writes it. When the
5
+ // mutation lands, the server pushes a delta and this list re-renders — no
6
+ // refetch, no polling. (Requires the M0 client boot; see ../client.ts.)
7
+ //
8
+ // Both come from `../lib/api`, which binds them ONCE to the api's generated
9
+ // procedure map — so the tag autocompletes, a typo is a compile error, and the
10
+ // row type is inferred rather than declared here.
7
11
  import { useState } from 'react'
8
12
  import { Link } from 'expo-router'
9
13
  import { FlatList, Pressable, Text, TextInput, View } from 'react-native'
10
- import { useMutation, useSubscription } from '@voltro/client'
11
14
 
12
- interface Note {
13
- readonly id: string
14
- readonly title: string
15
- }
15
+ import { useMutation, useSubscription } from '../lib/api'
16
+
17
+ // The dev AuthMiddleware resolves the tenant from the `x-tenant` header,
18
+ // defaulting to 'acme'. `notes.create` guards that the submitted tenantId
19
+ // matches the caller's (a typed TenantMismatch otherwise).
20
+ const TENANT = 'acme'
16
21
 
17
22
  export default function Home() {
18
- const notes = useSubscription<ReadonlyArray<Note>>('app', 'notes.list')
19
- const createNote = useMutation<{ title: string }, Note>('app', 'notes.create')
23
+ // No row `interface` and no `<T>`: the shape comes from `notes.list`'s own
24
+ // output schema, including the client's `optimistic` marker.
25
+ const notes = useSubscription('notes.list')
26
+ const createNote = useMutation('notes.create')
20
27
  const [title, setTitle] = useState('')
21
28
 
22
29
  return (
@@ -32,7 +39,10 @@ export default function Home() {
32
39
  onPress={() => {
33
40
  if (title.trim().length === 0) return
34
41
  // Auto-optimistic: the list updates instantly, reconciles on ack.
35
- createNote.mutate({ title: title.trim() })
42
+ // `tenantId` and `body` are REQUIRED by `notes.create`'s input
43
+ // schema — the old hand-written `useMutation<{ title: string }>`
44
+ // annotation hid that, so this call decoded-failed at runtime.
45
+ createNote.mutate({ tenantId: TENANT, title: title.trim(), body: '' })
36
46
  setTitle('')
37
47
  }}
38
48
  style={{ backgroundColor: '#2563eb', borderRadius: 8, paddingHorizontal: 16, justifyContent: 'center' }}
@@ -12,7 +12,7 @@ export default function OrderDetail() {
12
12
  <Text style={{ fontSize: 20, fontWeight: '700' }}>Order {id}</Text>
13
13
  <Text style={{ color: '#666' }}>
14
14
  Reached via the typed deep-link table. Fetch this order with
15
- {' '}useSubscription('app', 'orders.get', {'{'} id {'}'}).
15
+ {' '}useSubscription('orders.get', {'{'} id {'}'}) from ../../lib/api.
16
16
  </Text>
17
17
  </View>
18
18
  )
@@ -0,0 +1,34 @@
1
+ // The typed hook surface for the `app` api — bound ONCE, here, and imported by
2
+ // every screen instead of `@voltro/client`.
3
+ //
4
+ // `AppProcedures` is emitted by codegen into the sibling api's
5
+ // `rpcGroup.generated.ts`: a type-level map of every rpc tag to the descriptor
6
+ // behind it. Feeding it to `createHooks` makes the tag a literal union and the
7
+ // input/output types INFER:
8
+ //
9
+ // const notes = useSubscription('notes.list') // rows, typed
10
+ // const create = useMutation('notes.create') // input + output typed
11
+ //
12
+ // So no screen declares a row `interface` mirroring the api any more. The old
13
+ // `useSubscription<ReadonlyArray<Note>>('app', 'notes.list')` spelled the api
14
+ // name at every call site, left the tag an unchecked string (a typo was a
15
+ // runtime error), and the `<T>` was an ASSERTION nothing compared against the
16
+ // server. All three are compile-checked now.
17
+ //
18
+ // `'app'` is the key this project's api is registered under. The api is a
19
+ // type-only import — `import type` is erased, so Metro never resolves it and
20
+ // nothing server-side reaches the bundle. It is a devDependency for exactly
21
+ // that reason; scaffold the pair (`create-project --api=api-backend --mobile`),
22
+ // which is what this template's README already assumes.
23
+ //
24
+ // RUNTIME NOTE: the hooks are typed today and live once the mobile codegen
25
+ // target lands — `buildApiHandles()` in ../client.ts still returns an empty map
26
+ // (see the seam documented there), so screens render their loading state until
27
+ // then. The TYPES are real either way; they come from the api's own descriptors.
28
+ import { createHooks } from '@voltro/client'
29
+ import type { AppProcedures } from '@{{projectName}}/api/rpcGroup'
30
+
31
+ // Destructured on purpose — `react-hooks/rules-of-hooks` only treats a member
32
+ // call as a hook when the object is PascalCase, so top-level `useX` identifiers
33
+ // are what keep the React lint rules working at every call site.
34
+ export const { useSubscription, useMutation, useAction } = createHooks<AppProcedures>('app')
@@ -1,6 +1,8 @@
1
1
  // The api(s) this mobile app consumes — mirrors a web app.config.ts's `apis:`
2
- // map. The NAME ('app') is the lookup key the hooks use:
3
- // `useSubscription('app', 'notes.list')`, `useMutation('app', 'notes.create')`.
2
+ // map. The NAME ('app') is the lookup key the hooks bind to: `src/lib/api.ts`
3
+ // spells it ONCE via `createHooks<AppProcedures>('app')`, and every screen then
4
+ // calls `useSubscription('notes.list')` / `useMutation('notes.create')` with no
5
+ // api name and no hand-written result type.
4
6
  // The `package` resolves the sibling api in this project so codegen can pull its
5
7
  // typed rpc surface (end-to-end types on a phone). Scaffold the api with
6
8
  // `--api=api-backend`.
@@ -5,6 +5,20 @@
5
5
  # override .env values, so CI can set DB_URL via env without touching
6
6
  # this file.
7
7
 
8
+ # ── Environment ────────────────────────────────────────────────────────
9
+ #
10
+ # DECLARE IT. Every `voltro db …` / `voltro migrate` invocation resolves an
11
+ # UNSET `NODE_ENV` to `production` — the same way `voltro serve` and `voltro
12
+ # start` do — so a bare `pnpm migrate` with no NODE_ENV refuses rather than
13
+ # applying an un-reviewed diff to what might be a production database. It also
14
+ # decides which `_voltro_*` bookkeeping tables the command declares, and a
15
+ # migration command that resolves it differently from the serving process
16
+ # declares a DIFFERENT schema.
17
+ #
18
+ # `voltro dev` declares `development` for itself and needs nothing from here;
19
+ # this line is what makes the explicit schema commands work locally.
20
+ NODE_ENV=development
21
+
8
22
  # Postgres connection. Bring your own (host install, docker run,
9
23
  # cloud provider URL).
10
24
  DB_URL=postgres://app:app@localhost:5432/{{projectName}}
@@ -23,9 +23,9 @@
23
23
  "deploy/voltro.service.example"
24
24
  ],
25
25
  "packageJsonScripts": {
26
- "dev": "turbo run dev",
27
- "build": "turbo run build",
28
- "test": "turbo run test",
29
- "typecheck": "turbo run typecheck"
26
+ "dev": "pnpm -r --parallel dev",
27
+ "build": "pnpm -r build",
28
+ "test": "pnpm -r test",
29
+ "typecheck": "pnpm -r typecheck"
30
30
  }
31
31
  }
@@ -5,6 +5,20 @@
5
5
  # override .env values, so CI can set DB_URL via env without touching
6
6
  # this file.
7
7
 
8
+ # ── Environment ────────────────────────────────────────────────────────
9
+ #
10
+ # DECLARE IT. Every `voltro db …` / `voltro migrate` invocation resolves an
11
+ # UNSET `NODE_ENV` to `production` — the same way `voltro serve` and `voltro
12
+ # start` do — so a bare `pnpm migrate` with no NODE_ENV refuses rather than
13
+ # applying an un-reviewed diff to what might be a production database. It also
14
+ # decides which `_voltro_*` bookkeeping tables the command declares, and a
15
+ # migration command that resolves it differently from the serving process
16
+ # declares a DIFFERENT schema.
17
+ #
18
+ # `voltro dev` declares `development` for itself and needs nothing from here;
19
+ # this line is what makes the explicit schema commands work locally.
20
+ NODE_ENV=development
21
+
8
22
  # Postgres connection — points at the postgres service in
9
23
  # docker-compose.yml (port 5433 to avoid clashing with a host pg on 5432).
10
24
  # When you run inside the docker network (dev:docker / prod:up), the
@@ -22,7 +22,7 @@ Two flavours: dev with volume-mounted HMR, prod with built images.
22
22
 
23
23
  ```sh
24
24
  pnpm db:up # boot postgres only
25
- pnpm dev # turbo run dev, native node, HMR <50ms
25
+ pnpm dev # pnpm -r --parallel dev, native node, HMR <50ms
26
26
  ```
27
27
 
28
28
  ### Daily dev — full-docker (slower HMR but zero host install)
@@ -29,15 +29,15 @@
29
29
  "docker-compose.prod.yml"
30
30
  ],
31
31
  "packageJsonScripts": {
32
- "dev": "turbo run dev",
33
- "dev:hybrid": "docker compose up -d --wait postgres && turbo run dev",
32
+ "dev": "pnpm -r --parallel dev",
33
+ "dev:hybrid": "docker compose up -d --wait postgres && pnpm -r --parallel dev",
34
34
  "dev:docker": "HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose -f docker-compose.dev.yml up",
35
35
  "dev:docker:bg": "HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose -f docker-compose.dev.yml up -d",
36
36
  "dev:docker:down": "docker compose -f docker-compose.dev.yml down",
37
37
  "dev:docker:logs": "docker compose -f docker-compose.dev.yml logs -f",
38
- "build": "turbo run build",
39
- "test": "turbo run test",
40
- "typecheck": "turbo run typecheck",
38
+ "build": "pnpm -r build",
39
+ "test": "pnpm -r test",
40
+ "typecheck": "pnpm -r typecheck",
41
41
  "db:up": "docker compose up -d --wait postgres",
42
42
  "db:down": "docker compose stop postgres",
43
43
  "db:reset": "docker compose down -v postgres && docker compose up -d --wait postgres",
@@ -4,6 +4,20 @@
4
4
  # boot. Shell exports always override .env values, so CI can set DB_URL
5
5
  # via env without touching this file.
6
6
 
7
+ # ── Environment ────────────────────────────────────────────────────────
8
+ #
9
+ # DECLARE IT. Every `voltro db …` / `voltro migrate` invocation resolves an
10
+ # UNSET `NODE_ENV` to `production` — the same way `voltro serve` and `voltro
11
+ # start` do — so a bare `pnpm migrate` with no NODE_ENV refuses rather than
12
+ # applying an un-reviewed diff to what might be a production database. It also
13
+ # decides which `_voltro_*` bookkeeping tables the command declares, and a
14
+ # migration command that resolves it differently from the serving process
15
+ # declares a DIFFERENT schema.
16
+ #
17
+ # `voltro dev` declares `development` for itself and needs nothing from here;
18
+ # this line is what makes the explicit schema commands work locally.
19
+ NODE_ENV=development
20
+
7
21
  # MariaDB connection — points at the mariadb service in docker-compose.yml
8
22
  # (port 3307 to avoid clashing with a host MySQL on 3306). Inside the
9
23
  # docker network (dev:docker) the host is `mariadb`; native (pnpm dev with
@@ -31,7 +31,7 @@ primitive; the `createbuckets` one-shot provisions the app bucket.
31
31
 
32
32
  ```sh
33
33
  pnpm db:up # boot mariadb + minio (+ create the bucket)
34
- pnpm dev # turbo run dev, native node, HMR <50ms
34
+ pnpm dev # pnpm -r --parallel dev, native node, HMR <50ms
35
35
  ```
36
36
 
37
37
  ### Daily dev — full-docker (slower HMR but zero host install)
@@ -29,15 +29,15 @@
29
29
  "docker-compose.prod.yml"
30
30
  ],
31
31
  "packageJsonScripts": {
32
- "dev": "turbo run dev",
33
- "dev:hybrid": "docker compose up -d --wait mariadb minio && docker compose up -d createbuckets && turbo run dev",
32
+ "dev": "pnpm -r --parallel dev",
33
+ "dev:hybrid": "docker compose up -d --wait mariadb minio && docker compose up -d createbuckets && pnpm -r --parallel dev",
34
34
  "dev:docker": "HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose -f docker-compose.dev.yml up",
35
35
  "dev:docker:bg": "HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose -f docker-compose.dev.yml up -d",
36
36
  "dev:docker:down": "docker compose -f docker-compose.dev.yml down",
37
37
  "dev:docker:logs": "docker compose -f docker-compose.dev.yml logs -f",
38
- "build": "turbo run build",
39
- "test": "turbo run test",
40
- "typecheck": "turbo run typecheck",
38
+ "build": "pnpm -r build",
39
+ "test": "pnpm -r test",
40
+ "typecheck": "pnpm -r typecheck",
41
41
  "db:up": "docker compose up -d --wait mariadb minio && docker compose up -d createbuckets",
42
42
  "db:down": "docker compose stop mariadb minio",
43
43
  "db:reset": "docker compose down -v && docker compose up -d --wait mariadb minio && docker compose up -d createbuckets",
@@ -6,6 +6,20 @@
6
6
  # In-cluster env values come from the Helm chart's ConfigMap +
7
7
  # Secret, NOT from this file. See charts/voltro-app/templates/.
8
8
 
9
+ # ── Environment ────────────────────────────────────────────────────────
10
+ #
11
+ # DECLARE IT. Every `voltro db …` / `voltro migrate` invocation resolves an
12
+ # UNSET `NODE_ENV` to `production` — the same way `voltro serve` and `voltro
13
+ # start` do — so a bare `pnpm migrate` with no NODE_ENV refuses rather than
14
+ # applying an un-reviewed diff to what might be a production database. It also
15
+ # decides which `_voltro_*` bookkeeping tables the command declares, and a
16
+ # migration command that resolves it differently from the serving process
17
+ # declares a DIFFERENT schema.
18
+ #
19
+ # `voltro dev` declares `development` for itself and needs nothing from here;
20
+ # this line is what makes the explicit schema commands work locally.
21
+ NODE_ENV=development
22
+
9
23
  # Local Postgres (your install — or a docker run sidecar — or any
10
24
  # managed instance you can reach from your laptop).
11
25
  DB_URL=postgres://app:app@localhost:5432/{{projectName}}
@@ -39,10 +39,10 @@
39
39
  "deploy/README.md"
40
40
  ],
41
41
  "packageJsonScripts": {
42
- "dev": "turbo run dev",
43
- "build": "turbo run build",
44
- "test": "turbo run test",
45
- "typecheck": "turbo run typecheck",
42
+ "dev": "pnpm -r --parallel dev",
43
+ "build": "pnpm -r build",
44
+ "test": "pnpm -r test",
45
+ "typecheck": "pnpm -r typecheck",
46
46
  "helm:lint": "helm lint charts/voltro-app",
47
47
  "helm:template:dev": "helm template {{projectName}}-dev charts/voltro-app -f charts/voltro-app/values-dev.yaml",
48
48
  "helm:install:dev": "helm upgrade --install {{projectName}}-dev charts/voltro-app -f charts/voltro-app/values-dev.yaml --namespace {{projectName}}-dev --create-namespace",
@@ -1,2 +0,0 @@
1
- import { c as e, l as t } from "./apiBuild-h9VHtnlw.js";
2
- export { e as runApiBuild, t as runServeBundleBuild };
@@ -1,2 +0,0 @@
1
- import { r as e, t } from "./checkCommand-xGhRFFg2.js";
2
- export { t as offlineManifest, e as toInput };