@voltro/cli 0.33.0 → 0.35.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 (343) hide show
  1. package/CHANGELOG.md +1968 -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-B8aoJvuw.js +2 -0
  10. package/dist/{apiBuild-h9VHtnlw.js → apiBuild-DYD_ONLD.js} +46 -46
  11. package/dist/{appGraph-gQ_6GkQQ.js → appGraph-KGDPTuTy.js} +1 -1
  12. package/dist/appGraph-zuMGKVYX.js +2 -0
  13. package/dist/appPort-B_HpJ_ck.js +48 -0
  14. package/dist/baselineCommand-C2ClWZN3.js +2 -0
  15. package/dist/baselineCommand-DIttzO8A.js +227 -0
  16. package/dist/bin.js +71 -28
  17. package/dist/build-CD8K4XOr.js +711 -0
  18. package/dist/cacheCommand-DA4OH9xt.js +42 -0
  19. package/dist/capabilitiesCommand-nq_pz5xd.js +123 -0
  20. package/dist/checkCommand-Ct9xkTrS.js +232 -0
  21. package/dist/checkCommand-DKpDLlqu.js +2 -0
  22. package/dist/{cliArgs-qdZSElM3.js → cliArgs-D4p8n7EE.js} +12 -1
  23. package/dist/cliError-BmdYnghb.js +10 -0
  24. package/dist/cliOutput-D1tSBoRM.js +15 -0
  25. package/dist/{cliRuntime-Oh517vCV.js → cliRuntime-Dh7UDinH.js} +20 -20
  26. package/dist/cloudClient-DWL-Hw_T.js +67 -0
  27. package/dist/cloudCmd-Cvv5HGaZ.js +364 -0
  28. package/dist/clusterCmd-D5wsCmA_.js +54 -0
  29. package/dist/codegen-CYM3Zqrf.js +605 -0
  30. package/dist/codegen-ChBi_hVa.js +2 -0
  31. package/dist/codegenCommand-C4YoQIc2.js +30 -0
  32. package/dist/codemodRunner-BnFq3Fgu.js +5384 -0
  33. package/dist/commandRunner-BLAEFLjp.js +47 -0
  34. package/dist/commands-BE8E7zF3.js +816 -0
  35. package/dist/connectionConfig-UFlIEiys.js +66 -0
  36. package/dist/dashboardCommand-D7SgZGaN.js +25 -0
  37. package/dist/dataCommand-BhYwDgg-.js +537 -0
  38. package/dist/dataProfile-dW-PsfLB.js +15 -0
  39. package/dist/dbCommand-DS4b97Is.js +2 -0
  40. package/dist/{dbCommand-DTLKAfbA.js → dbCommand-O8HA63s2.js} +552 -402
  41. package/dist/{dev-C_P8FLSx.js → dev-C7sFZq3m.js} +3670 -3169
  42. package/dist/dev-D2BikO7a.js +3 -0
  43. package/dist/devActivity-Dx_3nnGv.js +100 -0
  44. package/dist/devActivity.js +1 -1
  45. package/dist/dialectDriver-CgXnDfec.js +39 -0
  46. package/dist/discover-C9XKJDco.js +25 -0
  47. package/dist/doctorCommand-CM4Ch9C7.js +2 -0
  48. package/dist/{checkCommand-xGhRFFg2.js → doctorCommand-DnimF5IM.js} +523 -1278
  49. package/dist/dormancyCommand-QewYug_s.js +69 -0
  50. package/dist/e2eCmd-BRabZww-.js +147 -0
  51. package/dist/embeddingsCommand-BfiLS_QI.js +73 -0
  52. package/dist/envCommand-CCGPRQY1.js +60 -0
  53. package/dist/evalCommand-6RUfPen4.js +118 -0
  54. package/dist/evolveCommand-CHsLCtDf.js +281 -0
  55. package/dist/fileTaxonomy-CJfgOllU.js +457 -0
  56. package/dist/frameworkTableAssembly-YyVe32Cb.js +2 -0
  57. package/dist/frameworkTableAssembly-oMPBKqlE.js +511 -0
  58. package/dist/generateCommand-DbgcUpGw.js +147 -0
  59. package/dist/index.d.ts +45 -0
  60. package/dist/index.js +4 -3
  61. package/dist/infoCommand-DwOgK1t6.js +60 -0
  62. package/dist/{inspect-BUUjt773.js → inspect-CjTYzAs_.js} +113 -41
  63. package/dist/inspect-P4pxoMaV.js +2 -0
  64. package/dist/inspectCmd-EHFZ9yYu.js +224 -0
  65. package/dist/inspectFetch-EMuhTG_9.js +151 -0
  66. package/dist/inspectMetrics-CfdKLh6t.js +72 -0
  67. package/dist/loadEnv-D9nEOClM.js +44 -0
  68. package/dist/logFileSink-C_D2wRN1.js +105 -0
  69. package/dist/logsCmd-D36xK7Zu.js +260 -0
  70. package/dist/manifestBuild-COkJoyAr.js +2 -0
  71. package/dist/{manifestBuild-BLrVuSlM.js → manifestBuild-hpPLaGxV.js} +1 -1
  72. package/dist/metaCommands-7MJfZ5cf.js +196 -0
  73. package/dist/migrate-BV7I-ZHZ.js +83 -0
  74. package/dist/mssqlClusterPatch-_4cE_nun.js +44 -0
  75. package/dist/newCommand-COWOJ1_E.js +156 -0
  76. package/dist/nodeEnvironment-cGFAj1J8.js +28 -0
  77. package/dist/packageCommand-Cug_3Ogl.js +271 -0
  78. package/dist/pageConvention-cEiRxdab.js +5 -0
  79. package/dist/privacyCommand-C-Df56U_.js +146 -0
  80. package/dist/probeCommand-CZfaaUOZ.js +122 -0
  81. package/dist/projectScaffold-DmzEKHib.js +2 -0
  82. package/dist/projectScaffold-LMMtaavR.js +814 -0
  83. package/dist/renderModeScan-D7J1B7Kw.js +105 -0
  84. package/dist/renderProfile-1OWWAAtx.js +81 -0
  85. package/dist/runtimeRegistry-DMeKfTHP.js +81 -0
  86. package/dist/runtimeTrace-CH3eUiMw.js +91 -0
  87. package/dist/scheduleCmd-DQRu6BZC.js +149 -0
  88. package/dist/scheduleManifestCmd-D2x0CTTY.js +249 -0
  89. package/dist/schemaIr-UJybUUZW.js +103 -0
  90. package/dist/{sdkgen-C81QIkiL.js → sdkgen-BLkvGRfX.js} +111 -209
  91. package/dist/seedRunner-ZmLSqNe2.js +333 -0
  92. package/dist/serveCommand-CbDHU6l-.js +2 -0
  93. package/dist/serveCommand-iwlUBNS1.js +1766 -0
  94. package/dist/serveEntry.js +5 -5
  95. package/dist/serverlessCommand-CfJZy6dS.js +482 -0
  96. package/dist/start-BgN62boB.js +3 -0
  97. package/dist/start-T4VesWiM.js +1087 -0
  98. package/dist/startEntry.js +2 -2
  99. package/dist/staticCommand-Dr2M6tpU.js +304 -0
  100. package/dist/storageCommand-Co6NfLqN.js +42 -0
  101. package/dist/templates-De8IR5-c.js +102 -0
  102. package/dist/test-CI6iDsYc.js +115 -0
  103. package/dist/tracesCmd-DStmCJPi.js +232 -0
  104. package/dist/tsconfigPaths-BWXBWgcl.js +107 -0
  105. package/dist/tsxLoader-EuXmSJ1K.js +51 -0
  106. package/dist/typecheckCommand-BlsWiCNq.js +61 -0
  107. package/dist/updateCommand-BlMZhWgO.js +2 -0
  108. package/dist/updateCommand-x0pI_x-B.js +585 -0
  109. package/dist/webDev-BcykISYQ2.js +2 -0
  110. package/dist/{inspectMetrics-1xzTKAFx.js → webDev-Dybxew86.js} +988 -1560
  111. package/dist/webhookDiscovery-CrGAfhIG.js +2 -0
  112. package/dist/webhookDiscovery-D7VaeMlz.js +51 -0
  113. package/dist/webhooksCommand-DlAgS2Iw.js +267 -0
  114. package/dist/workflowsCmd-BGF-mRZ5.js +608 -0
  115. package/package.json +209 -17
  116. package/templates/AGENTS.core.md +58 -3
  117. package/templates/AGENTS.md +64 -7
  118. package/templates/agent-docs/_index.md +6 -4
  119. package/templates/agent-docs/_manifest.json +23 -6
  120. package/templates/agent-docs/ai.md +370 -0
  121. package/templates/agent-docs/authentication.md +313 -31
  122. package/templates/agent-docs/caching.md +6 -0
  123. package/templates/agent-docs/cli.md +853 -50
  124. package/templates/agent-docs/data.md +608 -12
  125. package/templates/agent-docs/database/migrations.md +223 -25
  126. package/templates/agent-docs/database/misc.md +156 -40
  127. package/templates/agent-docs/database/querying.md +19 -1
  128. package/templates/agent-docs/database/scaling.md +60 -0
  129. package/templates/agent-docs/database/schema.md +1 -0
  130. package/templates/agent-docs/database/seedsdialects.md +208 -19
  131. package/templates/agent-docs/database/transactions.md +68 -0
  132. package/templates/agent-docs/deployment.md +284 -25
  133. package/templates/agent-docs/introduction.md +88 -17
  134. package/templates/agent-docs/local-first-mobile.md +79 -4
  135. package/templates/agent-docs/multi-tenancy.md +188 -42
  136. package/templates/agent-docs/observability.md +58 -3
  137. package/templates/agent-docs/plugins/ai-flows.md +247 -2
  138. package/templates/agent-docs/plugins/analytics-postgres.md +1 -1
  139. package/templates/agent-docs/plugins/audit.md +37 -1
  140. package/templates/agent-docs/plugins/auth-social.md +143 -0
  141. package/templates/agent-docs/plugins/auth-workos.md +4 -2
  142. package/templates/agent-docs/plugins/auth.md +131 -6
  143. package/templates/agent-docs/plugins/billing.md +132 -15
  144. package/templates/agent-docs/plugins/cdc-out.md +46 -7
  145. package/templates/agent-docs/plugins/clickhouse.md +32 -1
  146. package/templates/agent-docs/plugins/duckdb.md +1 -1
  147. package/templates/agent-docs/plugins/flags.md +132 -0
  148. package/templates/agent-docs/plugins/governance.md +105 -7
  149. package/templates/agent-docs/plugins/multitenancy.md +9 -4
  150. package/templates/agent-docs/plugins/presence.md +13 -2
  151. package/templates/agent-docs/plugins/ratelimit.md +9 -0
  152. package/templates/agent-docs/plugins/search.md +162 -8
  153. package/templates/agent-docs/plugins/sso-saml.md +47 -8
  154. package/templates/agent-docs/plugins/storage.md +11 -0
  155. package/templates/agent-docs/plugins/webhooks.md +105 -0
  156. package/templates/agent-docs/plugins.md +152 -18
  157. package/templates/agent-docs/reference.md +60 -3
  158. package/templates/agent-docs/releases.md +1117 -0
  159. package/templates/agent-docs/routing.md +43 -25
  160. package/templates/agent-docs/scheduling.md +27 -0
  161. package/templates/agent-docs/schema-driven-ui.md +92 -12
  162. package/templates/agent-docs/security.md +426 -0
  163. package/templates/agent-docs/templates/apibackends.md +87 -18
  164. package/templates/agent-docs/templates/appshells.md +32 -14
  165. package/templates/agent-docs/templates/overview.md +13 -8
  166. package/templates/agent-docs/testing.md +211 -14
  167. package/templates/agent-docs/whats-new.md +98 -136
  168. package/templates/agent-docs/workflows.md +231 -14
  169. package/templates/apps/api-ai/actions/summarize.action.ts +11 -0
  170. package/templates/apps/api-ai/package.json +8 -7
  171. package/templates/apps/api-auth/actions/me.action.ts +13 -0
  172. package/templates/apps/api-auth/package.json +9 -8
  173. package/templates/apps/api-backend/mutations/notes.create.mutation.ts +9 -0
  174. package/templates/apps/api-backend/package.json +12 -8
  175. package/templates/apps/api-backend/queries/notes.query.ts +30 -8
  176. package/templates/apps/api-backend-deactivation/actions/users.get.action.ts +14 -0
  177. package/templates/apps/api-backend-deactivation/mutations/users.create.mutation.ts +8 -0
  178. package/templates/apps/api-backend-deactivation/mutations/users.deactivate.mutation.ts +10 -0
  179. package/templates/apps/api-backend-deactivation/package.json +8 -7
  180. package/templates/apps/api-backend-mail/actions/sendWelcome.action.ts +17 -0
  181. package/templates/apps/api-backend-mail/mutations/notes.create.mutation.ts +9 -0
  182. package/templates/apps/api-backend-mail/package.json +9 -8
  183. package/templates/apps/api-backend-mail/queries/notes.query.ts +30 -8
  184. package/templates/apps/api-backend-mariadb/.env.example +14 -0
  185. package/templates/apps/api-backend-mariadb/mutations/notes.create.mutation.ts +9 -0
  186. package/templates/apps/api-backend-mariadb/package.json +10 -9
  187. package/templates/apps/api-backend-mariadb/queries/notes.query.ts +30 -8
  188. package/templates/apps/api-backend-sqlite/.env.example +14 -0
  189. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +9 -0
  190. package/templates/apps/api-backend-sqlite/package.json +9 -8
  191. package/templates/apps/api-backend-sqlite/queries/notes.query.ts +30 -8
  192. package/templates/apps/api-backend-storage/actions/uploadAvatar.action.ts +13 -0
  193. package/templates/apps/api-backend-storage/actions/uploadDocument.action.ts +12 -0
  194. package/templates/apps/api-backend-storage/mutations/notes.create.mutation.ts +9 -0
  195. package/templates/apps/api-backend-storage/package.json +9 -8
  196. package/templates/apps/api-backend-storage/queries/notes.query.ts +30 -8
  197. package/templates/apps/api-cms/actions/content.get.action.ts +7 -0
  198. package/templates/apps/api-cms/actions/content.types.action.ts +6 -0
  199. package/templates/apps/api-cms/actions/me.action.ts +13 -0
  200. package/templates/apps/api-cms/app.config.ts +19 -0
  201. package/templates/apps/api-cms/authz.ts +63 -0
  202. package/templates/apps/api-cms/mutations/content.publish.mutation.ts +10 -0
  203. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +10 -0
  204. package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +5 -0
  205. package/templates/apps/api-cms/package.json +11 -10
  206. package/templates/apps/api-cms/queries/content.list.query.ts +23 -7
  207. package/templates/apps/api-cms/tests/accessDecisions.test.ts +121 -0
  208. package/templates/apps/api-cms/tests/content.descriptors.test.ts +8 -4
  209. package/templates/apps/api-collab/mutations/documents.create.mutation.ts +8 -0
  210. package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +13 -0
  211. package/templates/apps/api-collab/package.json +9 -8
  212. package/templates/apps/api-collab/queries/documents.query.ts +19 -7
  213. package/templates/apps/api-data-advanced/package.json +9 -8
  214. package/templates/apps/api-data-advanced/queries/authors.withBooks.query.ts +12 -0
  215. package/templates/apps/api-data-advanced/queries/books.search.query.ts +9 -0
  216. package/templates/apps/api-durable/mutations/orders.approve.mutation.ts +17 -0
  217. package/templates/apps/api-durable/mutations/orders.place.mutation.ts +9 -0
  218. package/templates/apps/api-durable/package.json +9 -8
  219. package/templates/apps/api-feature-flags/actions/notes.export.action.ts +16 -0
  220. package/templates/apps/api-feature-flags/mutations/notes.create.mutation.ts +12 -0
  221. package/templates/apps/api-feature-flags/package.json +10 -9
  222. package/templates/apps/api-governance/README.md +30 -8
  223. package/templates/apps/api-governance/actions/profiles.get.action.server.ts +17 -1
  224. package/templates/apps/api-governance/actions/profiles.get.action.ts +29 -4
  225. package/templates/apps/api-governance/database/schema.ts +16 -4
  226. package/templates/apps/api-governance/mutations/profiles.create.mutation.ts +12 -0
  227. package/templates/apps/api-governance/package.json +9 -8
  228. package/templates/apps/api-kv/actions/sync.pull.action.ts +15 -0
  229. package/templates/apps/api-kv/actions/sync.reset.action.ts +13 -0
  230. package/templates/apps/api-kv/actions/sync.status.action.ts +7 -0
  231. package/templates/apps/api-kv/package.json +9 -8
  232. package/templates/apps/api-kv/queries/events.list.query.ts +19 -8
  233. package/templates/apps/api-moderation/mutations/comments.create.mutation.ts +11 -0
  234. package/templates/apps/api-moderation/mutations/posts.create.mutation.ts +13 -0
  235. package/templates/apps/api-moderation/package.json +9 -8
  236. package/templates/apps/api-observability/mutations/notes.create.mutation.ts +8 -0
  237. package/templates/apps/api-observability/package.json +9 -8
  238. package/templates/apps/api-observability/queries/notes.list.query.ts +13 -0
  239. package/templates/apps/api-ratelimit/mutations/notes.create.mutation.ts +14 -0
  240. package/templates/apps/api-ratelimit/package.json +9 -8
  241. package/templates/apps/api-rbac/package.json +9 -8
  242. package/templates/apps/api-rest/package.json +8 -7
  243. package/templates/apps/api-saas/mutations/projects.create.mutation.ts +13 -0
  244. package/templates/apps/api-saas/package.json +12 -11
  245. package/templates/apps/api-saas/queries/projects.list.query.ts +11 -0
  246. package/templates/apps/api-saas-starter/actions/me.action.ts +13 -0
  247. package/templates/apps/api-saas-starter/app.config.ts +19 -0
  248. package/templates/apps/api-saas-starter/authz.ts +75 -0
  249. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +10 -0
  250. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +9 -0
  251. package/templates/apps/api-saas-starter/package.json +15 -11
  252. package/templates/apps/api-saas-starter/queries/invites.list.query.ts +19 -8
  253. package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -7
  254. package/templates/apps/api-saas-starter/tests/accessDecisions.test.ts +135 -0
  255. package/templates/apps/api-search/mutations/articles.create.mutation.ts +14 -0
  256. package/templates/apps/api-search/package.json +9 -8
  257. package/templates/apps/api-search/queries/articles.list.query.ts +21 -8
  258. package/templates/apps/api-status/README.md +10 -3
  259. package/templates/apps/api-status/app.config.ts +8 -3
  260. package/templates/apps/api-status/authz.ts +5 -3
  261. package/templates/apps/api-status/package.json +9 -8
  262. package/templates/apps/api-status/queries/components.list.query.ts +14 -6
  263. package/templates/apps/api-status/queries/incidents.live.query.ts +23 -10
  264. package/templates/apps/api-status/queries/updates.list.query.ts +16 -9
  265. package/templates/apps/api-status/tests/status.test.ts +9 -1
  266. package/templates/apps/api-versioning/actions/documents.asOf.action.ts +12 -0
  267. package/templates/apps/api-versioning/actions/documents.history.action.ts +13 -0
  268. package/templates/apps/api-versioning/mutations/documents.create.mutation.ts +9 -0
  269. package/templates/apps/api-versioning/mutations/documents.update.mutation.ts +12 -0
  270. package/templates/apps/api-versioning/package.json +9 -8
  271. package/templates/apps/api-webhooks/mutations/orders.fulfill.mutation.ts +16 -0
  272. package/templates/apps/api-webhooks/package.json +10 -9
  273. package/templates/apps/api-webhooks/queries/orders.list.query.ts +10 -0
  274. package/templates/apps/changelog/package.json +8 -6
  275. package/templates/apps/edge-functions/package.json +2 -2
  276. package/templates/apps/frontend-admin/package.json +10 -8
  277. package/templates/apps/frontend-admin/src/lib/admin.ts +20 -9
  278. package/templates/apps/frontend-admin/src/locales/de.ts +11 -1
  279. package/templates/apps/frontend-admin/src/locales/en.ts +13 -1
  280. package/templates/apps/frontend-admin/src/pages/admin/[entity]/page.tsx +65 -22
  281. package/templates/apps/frontend-admin/src/pages/admin/entity.test.tsx +130 -23
  282. package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +3 -2
  283. package/templates/apps/frontend-admin/src/pages/admin/page.test.tsx +19 -2
  284. package/templates/apps/frontend-admin/src/pages/admin/page.tsx +9 -4
  285. package/templates/apps/frontend-app/app.config.ts +4 -3
  286. package/templates/apps/frontend-app/package.json +11 -8
  287. package/templates/apps/frontend-app/src/lib/api.ts +25 -0
  288. package/templates/apps/frontend-app/src/pages/page.test.tsx +130 -82
  289. package/templates/apps/frontend-app/src/pages/page.tsx +14 -18
  290. package/templates/apps/frontend-auth/package.json +10 -8
  291. package/templates/apps/frontend-blank/package.json +9 -7
  292. package/templates/apps/frontend-cms/package.json +11 -9
  293. package/templates/apps/frontend-collab/package.json +12 -9
  294. package/templates/apps/frontend-collab/src/pages/page.test.tsx +122 -78
  295. package/templates/apps/frontend-contact/package.json +9 -7
  296. package/templates/apps/frontend-dashboard/package.json +9 -7
  297. package/templates/apps/frontend-docs/package.json +9 -7
  298. package/templates/apps/frontend-i18n/package.json +8 -6
  299. package/templates/apps/frontend-landing/package.json +9 -7
  300. package/templates/apps/frontend-portal/package.json +10 -8
  301. package/templates/apps/frontend-saas/app.config.ts +10 -6
  302. package/templates/apps/frontend-saas/package.json +10 -8
  303. package/templates/apps/frontend-saas/src/lib/api.ts +27 -32
  304. package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +7 -8
  305. package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +27 -3
  306. package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +4 -4
  307. package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +3 -4
  308. package/templates/apps/frontend-spa/package.json +9 -7
  309. package/templates/apps/frontend-ssr/package.json +9 -7
  310. package/templates/apps/frontend-ssr-api/package.json +10 -8
  311. package/templates/apps/frontend-static-blog/package.json +8 -6
  312. package/templates/apps/frontend-status/package.json +10 -8
  313. package/templates/apps/mobile-app/README.md +1 -0
  314. package/templates/apps/mobile-app/package.json +4 -2
  315. package/templates/apps/mobile-app/src/app/index.tsx +22 -12
  316. package/templates/apps/mobile-app/src/app/orders/[id].tsx +1 -1
  317. package/templates/apps/mobile-app/src/lib/api.ts +34 -0
  318. package/templates/apps/mobile-app/voltro.mobile.ts +4 -2
  319. package/templates/baselines/bare/.env.example +14 -0
  320. package/templates/baselines/bare/baseline.json +4 -4
  321. package/templates/baselines/compose/.env.example +14 -0
  322. package/templates/baselines/compose/README.md +1 -1
  323. package/templates/baselines/compose/baseline.json +5 -5
  324. package/templates/baselines/compose-mariadb/.env.example +14 -0
  325. package/templates/baselines/compose-mariadb/README.md +1 -1
  326. package/templates/baselines/compose-mariadb/baseline.json +5 -5
  327. package/templates/baselines/helm/.env.example +14 -0
  328. package/templates/baselines/helm/baseline.json +4 -4
  329. package/dist/apiBuild-C-x9YacA.js +0 -2
  330. package/dist/appGraph-CvQCte0z.js +0 -2
  331. package/dist/checkCommand-DRovTKza.js +0 -2
  332. package/dist/commands-CJfepbm4.js +0 -11541
  333. package/dist/dbCommand-b1gum4td.js +0 -2
  334. package/dist/dev-iiMtlkfs.js +0 -3
  335. package/dist/devActivity-BhIu6ncs.js +0 -159
  336. package/dist/frameworkTableAssembly-BwIrO5nv.js +0 -638
  337. package/dist/frameworkTableAssembly-D-EebUQX.js +0 -2
  338. package/dist/inspect-mmBuRXmy.js +0 -2
  339. package/dist/manifestBuild-Dj8Jjoto.js +0 -2
  340. package/dist/seedRunner-Bqxgp7HZ.js +0 -230
  341. package/dist/serveCommand-DdaM4Hup.js +0 -1608
  342. package/dist/start-C0koT0UO.js +0 -1084
  343. /package/templates/apps/api-ai/actions/{summarize.action.server.tsx → summarize.action.server.ts} +0 -0
@@ -0,0 +1,156 @@
1
+ import { i as e, n as t, r as n } from "./cliArgs-D4p8n7EE.js";
2
+ import { dirname as r, join as i, resolve as a } from "node:path";
3
+ import { existsSync as o, mkdirSync as s, writeFileSync as c } from "node:fs";
4
+ //#region src/newCommand.ts
5
+ var l = [
6
+ "query",
7
+ "mutation",
8
+ "action",
9
+ "workflow",
10
+ "page"
11
+ ], u = (e) => {
12
+ let t = e.split(/[^A-Za-z0-9]+/).filter((e) => e.length > 0);
13
+ if (t.length === 0) return "handler";
14
+ let n = t[0] + t.slice(1).map((e) => e[0].toUpperCase() + e.slice(1)).join("");
15
+ return /^[0-9]/.test(n) ? `p${n[0].toUpperCase()}${n.slice(1)}` : n;
16
+ }, d = (e) => e.replace(/\//g, ".").replace(/[^A-Za-z0-9.]/g, "-"), f = (e) => {
17
+ let t = u(e), n = d(e);
18
+ return [{
19
+ rel: `${n}.query.ts`,
20
+ content: `import { defineQuery } from '@voltro/protocol'
21
+ import { Schema } from 'effect'
22
+
23
+ // DESCRIPTOR (browser-safe): imports only @voltro/protocol + effect. The web
24
+ // client value-imports this, so it must reach NOTHING server-only.
25
+ export const ${t} = defineQuery({
26
+ name: '${e}',
27
+ input: Schema.Struct({}),
28
+ output: Schema.Array(Schema.Struct({
29
+ id: Schema.String,
30
+ })),
31
+ })
32
+ `
33
+ }, {
34
+ rel: `${n}.query.server.ts`,
35
+ content: "import type { AppContext } from '@voltro/runtime'\n\n// EXECUTOR (server-only): paired to the descriptor by filename. Read through\n// `ctx.store` and return rows matching the descriptor's `output` schema.\nconst execute = async (_input: Record<string, never>, ctx: AppContext) => {\n void ctx // TODO: query ctx.store\n return [] as ReadonlyArray<{ id: string }>\n}\n\nexport default execute\n"
36
+ }];
37
+ }, p = (e) => {
38
+ let t = u(e), n = d(e);
39
+ return [{
40
+ rel: `${n}.mutation.ts`,
41
+ content: `import { defineMutation } from '@voltro/protocol'
42
+ import { Schema } from 'effect'
43
+
44
+ // DESCRIPTOR (browser-safe): imports only @voltro/protocol + effect.
45
+ export const ${t} = defineMutation({
46
+ name: '${e}',
47
+ input: Schema.Struct({
48
+ // TODO: the fields the caller sends.
49
+ }),
50
+ output: Schema.Struct({
51
+ id: Schema.String,
52
+ }),
53
+ })
54
+ `
55
+ }, {
56
+ rel: `${n}.mutation.server.ts`,
57
+ content: "import type { AppContext } from '@voltro/runtime'\n\n// EXECUTOR (server-only): perform the write via `ctx.store` and return the row.\nconst execute = async (input: Record<string, never>, ctx: AppContext) => {\n void input\n void ctx // TODO: ctx.store.insert(...) / update(...)\n return { id: '' }\n}\n\nexport default execute\n"
58
+ }];
59
+ }, m = (e) => {
60
+ let t = u(e), n = d(e);
61
+ return [{
62
+ rel: `${n}.action.ts`,
63
+ content: `import { defineAction } from '@voltro/protocol'
64
+ import { Schema } from 'effect'
65
+
66
+ // DESCRIPTOR (browser-safe): an action is a free-form server call (no declared
67
+ // store target). Imports only @voltro/protocol + effect.
68
+ export const ${t} = defineAction({
69
+ name: '${e}',
70
+ input: Schema.Struct({}),
71
+ output: Schema.Struct({
72
+ ok: Schema.Boolean,
73
+ }),
74
+ })
75
+ `
76
+ }, {
77
+ rel: `${n}.action.server.ts`,
78
+ content: "import type { AppContext } from '@voltro/runtime'\n\n// EXECUTOR (server-only): do the work and return a value matching `output`.\nconst execute = async (_input: Record<string, never>, ctx: AppContext) => {\n void ctx // TODO\n return { ok: true }\n}\n\nexport default execute\n"
79
+ }];
80
+ }, h = (e) => {
81
+ let t = u(e), n = d(e), r = t[0].toUpperCase() + t.slice(1);
82
+ return [{
83
+ rel: `${n}.workflow.tsx`,
84
+ content: `import { workflow } from '@voltro/workflow/define'
85
+ import { Schema } from 'effect'
86
+
87
+ // DESCRIPTOR (browser-safe): imports the '@voltro/workflow/define' contract
88
+ // surface ONLY — never the executor's server graph, which would drag
89
+ // database/cluster into the client bundle.
90
+ export const ${r} = workflow({
91
+ name: '${e}',
92
+ payload: {
93
+ id: Schema.String,
94
+ },
95
+ success: Schema.Struct({
96
+ id: Schema.String,
97
+ }),
98
+ })
99
+ `
100
+ }, {
101
+ rel: `${n}.workflow.server.tsx`,
102
+ content: "import { step } from '@voltro/workflow'\nimport { Effect, Schema } from 'effect'\nimport type { AppContext } from '@voltro/runtime'\n\n// EXECUTOR (server-only): a factory `(ctx) => execute`. The CLI calls\n// `workflow.toLayer(execute)` at boot so the run closes over the live AppContext.\n// Every `step` is durable — replayed from its journaled result on resume.\nconst buildExecute = (ctx: AppContext) =>\n (payload: { id: string }, _executionId: string) =>\n Effect.gen(function* () {\n void ctx // TODO: real work via ctx.store / ctx.events\n yield* step({\n name: 'first-step',\n input: { id: payload.id },\n success: Schema.Struct({ id: Schema.String }),\n execute: Effect.succeed({ id: payload.id }),\n })\n return { id: payload.id }\n })\n\nexport default buildExecute\n"
103
+ }];
104
+ }, g = (e) => {
105
+ let t = d(e).replace(/\./g, "/");
106
+ return [{
107
+ rel: e === "" || e === "index" ? "page.tsx" : `${t}/page.tsx`,
108
+ content: `import type { ReactNode } from 'react'
109
+ import type { PageMeta } from '@voltro/web'
110
+
111
+ // Mounted at the URL derived from this file's path under src/pages/.
112
+ export const meta = (): PageMeta => ({
113
+ title: '${e || "Home"}',
114
+ })
115
+
116
+ export default function Page(): ReactNode {
117
+ return (
118
+ <main>
119
+ <h1>${e || "Home"}</h1>
120
+ </main>
121
+ )
122
+ }
123
+ `
124
+ }];
125
+ }, _ = (e, t) => {
126
+ switch (e) {
127
+ case "query": return f(t);
128
+ case "mutation": return p(t);
129
+ case "action": return m(t);
130
+ case "workflow": return h(t);
131
+ case "page": return g(t);
132
+ default: return null;
133
+ }
134
+ }, v = () => {
135
+ console.error("voltro new <kind> <name> [--dir <path>] [--force]"), console.error(` kinds: ${l.join(", ")}`), console.error(" e.g.: voltro new query notes.list"), console.error(" voltro new workflow orders.fulfill --dir workflows");
136
+ }, y = ["--dir"], b = async (u) => {
137
+ let d = e(u, y), f = d[0], p = d[1] ?? "";
138
+ if (f === void 0) return v(), 1;
139
+ if (!l.includes(f)) return console.error(`voltro new: unknown kind '${f}'.`), v(), 1;
140
+ if (p === "" && f !== "page") return console.error(`voltro new ${f}: a name is required, e.g. \`voltro new ${f} notes.list\`.`), 1;
141
+ let m = _(f, p);
142
+ if (m === null) return v(), 1;
143
+ let h = a(t(u, "--dir") ?? "."), g = n(u, "--force"), b = m.map((e) => i(h, e.rel)).filter((e) => o(e));
144
+ if (b.length > 0 && !g) {
145
+ console.error("voltro new: refusing to overwrite existing file(s) (use --force):");
146
+ for (let e of b) console.error(` ${e}`);
147
+ return 1;
148
+ }
149
+ for (let e of m) {
150
+ let t = i(h, e.rel);
151
+ s(r(t), { recursive: !0 }), c(t, e.content, "utf8"), console.log(` created ${t}`);
152
+ }
153
+ return console.log(`\nvoltro new ${f}: ${m.length} file(s) written. Fill in the TODOs, then \`voltro dev\` picks them up.`), 0;
154
+ };
155
+ //#endregion
156
+ export { b as runNewCommand };
@@ -0,0 +1,28 @@
1
+ //#region bin/nodeEnvironment.mjs
2
+ var e = Object.freeze({
3
+ serve: "production",
4
+ start: "production",
5
+ db: "production",
6
+ migrate: "production",
7
+ dev: "development"
8
+ }), t = (e) => typeof e == "string" && e.length > 0, n = (e) => {
9
+ for (let t of e ?? []) if (typeof t == "string" && !t.startsWith("-")) return t.toLowerCase();
10
+ }, r = (r, i) => {
11
+ let a = i ?? process.env;
12
+ if (t(a.NODE_ENV)) return a.NODE_ENV.toLowerCase();
13
+ let o = n(r);
14
+ if (o !== void 0) return e[o];
15
+ }, i = !1, a = () => i, o = (e, n) => {
16
+ let a = n ?? process.env;
17
+ if (t(a.NODE_ENV)) return a.NODE_ENV.toLowerCase();
18
+ let o = r(e, a);
19
+ if (o !== void 0) return a.NODE_ENV = o, i = !0, o;
20
+ }, s = (e = process.env) => {
21
+ let t = (e.NODE_ENV ?? "").toLowerCase();
22
+ return t === "production" ? "prod" : t === "staging" ? "staging" : "dev";
23
+ }, c = (e = process.env) => {
24
+ let t = (e.NODE_ENV ?? "").toLowerCase();
25
+ return t === "production" || t === "staging";
26
+ }, l = () => a() ? "\n NODE_ENV was not set, so this run resolved to PRODUCTION — the same way `voltro serve`\n resolves it, which is what keeps the declared schema of a pre-deploy job identical to\n the serving container's. Set NODE_ENV=development for a local database." : "", u = (e) => o([e]);
27
+ //#endregion
28
+ export { o as a, c as i, l as n, s as r, u as t };
@@ -0,0 +1,271 @@
1
+ import { i as e, n as t } from "./cliArgs-D4p8n7EE.js";
2
+ import { dirname as n, isAbsolute as r, join as i, relative as a, resolve as o } from "node:path";
3
+ import { existsSync as s, mkdirSync as c, promises as l, readFileSync as u } from "node:fs";
4
+ import { createLogger as d } from "@voltro/logger";
5
+ import { spawnSync as f } from "node:child_process";
6
+ //#region src/packageCommand.ts
7
+ var p = d({ scope: "voltro:package" }), m = (e) => {
8
+ let t = [], n = !1;
9
+ for (let r of e.split("\n")) {
10
+ let e = r.replace(/#.*$/, "");
11
+ if (/^packages:\s*$/.test(e)) {
12
+ n = !0;
13
+ continue;
14
+ }
15
+ if (n) {
16
+ let r = e.match(/^\s*-\s*['"]?([^'"]+?)['"]?\s*$/);
17
+ if (r) {
18
+ t.push(r[1]);
19
+ continue;
20
+ }
21
+ /^\S/.test(e) && (n = !1);
22
+ }
23
+ }
24
+ return t;
25
+ }, h = (e) => {
26
+ if (typeof e != "string") return null;
27
+ let t = e.match(/^(@[^/]+)\//);
28
+ return t ? t[1] : null;
29
+ }, g = (e) => {
30
+ let t = o(e);
31
+ for (let e = 0; e < 16; e++) {
32
+ let e = i(t, "pnpm-workspace.yaml"), r = i(t, "package.json"), a = null;
33
+ if (s(r)) try {
34
+ a = JSON.parse(u(r, "utf8"));
35
+ } catch {
36
+ a = null;
37
+ }
38
+ if (s(e)) {
39
+ let n = [];
40
+ try {
41
+ n = m(u(e, "utf8"));
42
+ } catch {
43
+ n = [];
44
+ }
45
+ return {
46
+ root: t,
47
+ kind: "pnpm",
48
+ globs: n,
49
+ scope: h(a?.name)
50
+ };
51
+ }
52
+ if (a && Array.isArray(a.workspaces)) return {
53
+ root: t,
54
+ kind: "npm",
55
+ globs: a.workspaces.filter((e) => typeof e == "string"),
56
+ scope: h(a.name)
57
+ };
58
+ if (a && typeof a.workspaces == "object" && a.workspaces !== null && Array.isArray(a.workspaces.packages)) return {
59
+ root: t,
60
+ kind: "npm",
61
+ globs: a.workspaces.packages.filter((e) => typeof e == "string"),
62
+ scope: h(a.name)
63
+ };
64
+ let o = n(t);
65
+ if (o === t) break;
66
+ t = o;
67
+ }
68
+ return null;
69
+ }, _ = (e, t) => {
70
+ let r = n(t);
71
+ return e.some((e) => {
72
+ let n = e.replace(/\/+$/, "");
73
+ return n === t || n === `${r}/*` || n === `${r}/**` || n === "*" || n === "**";
74
+ });
75
+ }, v = "0.1.0", y = "vite build", b = "@voltro/build", x = "SEE LICENSE IN LICENSE", S = (e, t) => t.publishable ? `{
76
+ "extends": "${e}/tsconfig.base.json",
77
+ "compilerOptions": { "rootDir": "src", "outDir": "dist" },
78
+ "include": ["src/**/*"]
79
+ }
80
+ ` : `{
81
+ "extends": "${e}/tsconfig.base.json",
82
+ "compilerOptions": { "noEmit": true },
83
+ "include": ["src"]
84
+ }
85
+ `, C = (e) => {
86
+ let t = (e) => {
87
+ let t = e.match(/^\.\/src\/(.+)\.tsx?$/);
88
+ if (!t) return null;
89
+ let n = t[1];
90
+ return {
91
+ types: `./dist/${n}.d.ts`,
92
+ import: `./dist/${n}.js`,
93
+ default: `./dist/${n}.js`
94
+ };
95
+ };
96
+ if (typeof e == "string") return t(e) ?? e;
97
+ if (e && typeof e == "object") {
98
+ let n = {};
99
+ for (let [r, i] of Object.entries(e)) typeof i == "string" ? n[r] = t(i) ?? i : n[r] = i;
100
+ return n;
101
+ }
102
+ return e;
103
+ }, w = (e, t = {}) => {
104
+ let n = { ...e };
105
+ delete n.private, !n.version || n.version === "0.0.0" ? n.version = t.version ?? v : t.version && (n.version = t.version), n.files = ["dist", "src"], n.sideEffects = !1, n.publishConfig = {
106
+ access: t.access ?? "public",
107
+ exports: C(n.exports),
108
+ main: "./dist/index.js",
109
+ module: "./dist/index.js",
110
+ types: "./dist/index.d.ts"
111
+ };
112
+ let r = { ...n.scripts ?? {} };
113
+ return r.build = y, r.prepack = y, n.scripts = r, n;
114
+ }, T = (e) => {
115
+ let t = { ...e };
116
+ if (t.private = !0, delete t.files, delete t.publishConfig, delete t.sideEffects, t.scripts) {
117
+ let e = { ...t.scripts };
118
+ delete e.prepack, t.scripts = e;
119
+ }
120
+ return t;
121
+ }, E = (e) => e.private !== !0 && !!e.publishConfig, D = (e, t = "workspace:*") => {
122
+ if (e.name === b) return e;
123
+ let n = { ...e.devDependencies ?? {} };
124
+ return n[b] || (n[b] = t), {
125
+ ...e,
126
+ devDependencies: n
127
+ };
128
+ }, O = async (e) => JSON.parse(await l.readFile(e, "utf8")), k = async (e, t) => {
129
+ await l.writeFile(e, JSON.stringify(t, null, 2) + "\n", "utf8");
130
+ }, A = "import { voltroLib } from '@voltro/build'\n\n// Library build preset (Vite lib mode): bundles this package's own `.ts`\n// files, keeps every bare specifier (effect, @effect/*, @voltro/*, react,\n// drivers) external, emits `.d.ts`. Multi-export packages pass an entry map:\n// voltroLib({ entry: { index: 'src/index.ts', server: 'src/server.ts' } }).\nexport default voltroLib()\n", j = (e) => {
131
+ if (!e || typeof e != "object") return null;
132
+ let t = {};
133
+ for (let n of Object.values(e)) {
134
+ if (typeof n != "string") continue;
135
+ let e = n.match(/^\.\/src\/(.+)\.tsx?$/);
136
+ e && (t[e[1]] = n.replace(/^\.\//, ""));
137
+ }
138
+ let n = Object.keys(t);
139
+ return n.length === 0 || n.length === 1 && n[0] === "index" ? null : t;
140
+ }, M = async (e, t) => {
141
+ let n = i(e, "vite.config.ts");
142
+ if (s(n)) return !1;
143
+ let r = j(t), a = r ? `import { voltroLib } from '@voltro/build'\n\nexport default voltroLib({ entry: ${JSON.stringify(r)} })\n` : A;
144
+ return await l.writeFile(n, a, "utf8"), !0;
145
+ }, N = async (e, t) => {
146
+ let n = i(e, "LICENSE");
147
+ if (s(n)) return !0;
148
+ let r = i(t.root, "LICENSE");
149
+ return s(r) ? (await l.copyFile(r, n), !0) : !1;
150
+ }, P = async (e, t) => {
151
+ let n = i(e, "tsconfig.json"), r = a(e, t.root) || ".";
152
+ if (!s(n)) {
153
+ await l.writeFile(n, S(r, { publishable: !0 }), "utf8");
154
+ return;
155
+ }
156
+ try {
157
+ let e = JSON.parse(await l.readFile(n, "utf8")), t = { ...e.compilerOptions ?? {} };
158
+ delete t.noEmit, t.rootDir = "src", t.outDir = "dist", e.compilerOptions = t, await l.writeFile(n, JSON.stringify(e, null, 2) + "\n", "utf8");
159
+ } catch {
160
+ p.warn(`could not patch ${a(t.root, e) || "."}/tsconfig.json — set compilerOptions.rootDir:"src" + outDir:"dist" (drop noEmit) so the publishable build emits to ./dist`);
161
+ }
162
+ }, F = (e) => {
163
+ let t = i(e.root, "scripts", "gen-api-extractor.mjs");
164
+ if (!s(t)) return null;
165
+ let n = f(process.execPath, [t], {
166
+ cwd: e.root,
167
+ encoding: "utf8"
168
+ }), r = (e) => e.trim().split("\n").filter(Boolean).pop() ?? "";
169
+ return n.status === 0 ? r(n.stdout || "") || "wired" : `FAILED — run \`node scripts/gen-api-extractor.mjs\` manually (${r(n.stderr || n.stdout || "") || "unknown error"})`;
170
+ }, I = (e, t) => {
171
+ let a = r(t) ? t : o(process.cwd(), t);
172
+ if (s(i(a, "package.json"))) return a;
173
+ let c = t.replace(/^@[^/]+\//, ""), l = /* @__PURE__ */ new Set(["packages"]);
174
+ for (let t of e.globs) {
175
+ let e = n(t.replace(/\/+$/, ""));
176
+ e && e !== "." && l.add(e);
177
+ }
178
+ for (let t of l) {
179
+ let n = i(e.root, t, c);
180
+ if (s(i(n, "package.json"))) return n;
181
+ }
182
+ return null;
183
+ }, L = (e, n) => t(e, `--${n}`), R = [
184
+ "--dir",
185
+ "--scope",
186
+ "--description",
187
+ "--version",
188
+ "--access"
189
+ ], z = (e, t) => e.includes(`--${t}`), B = /^[a-z][a-z0-9-]*$/, V = async (t) => {
190
+ let n = e(t, R)[0];
191
+ if (!n) return p.error("usage: voltro package create <name> [--publishable] [--dir <reldir>] [--scope <@scope>]"), 2;
192
+ let r = n.replace(/^@[^/]+\//, "");
193
+ if (!B.test(r)) return p.error(`invalid package name: ${r}`, { rule: "lowercase kebab-case (npm forbids uppercase): ^[a-z][a-z0-9-]*$" }), 2;
194
+ let o = g(process.cwd());
195
+ if (!o) return p.error("no workspace root found (looked for pnpm-workspace.yaml or a package.json with \"workspaces\")", {
196
+ cwd: process.cwd(),
197
+ hint: "run inside a workspace, or create one first"
198
+ }), 2;
199
+ let u = L(t, "dir") ?? "packages", d = L(t, "scope") ?? n.match(/^(@[^/]+)\//)?.[1] ?? o.scope, f = d ? `${d}/${r}` : r, m = L(t, "description") ?? `${f} package`, h = z(t, "publishable"), v = i(u, r), y = i(o.root, v);
200
+ if (s(y)) return p.error(`target already exists: ${v}`, { abs: y }), 1;
201
+ c(i(y, "src"), { recursive: !0 });
202
+ let b = {
203
+ name: f,
204
+ version: "0.0.0",
205
+ private: !0,
206
+ type: "module",
207
+ description: m,
208
+ exports: { ".": "./src/index.ts" },
209
+ scripts: {
210
+ typecheck: "tsc --noEmit",
211
+ test: "vitest run"
212
+ },
213
+ devDependencies: {
214
+ typescript: "^5.7.0",
215
+ vitest: "^3.0.0"
216
+ }
217
+ }, C = h && s(i(o.root, "LICENSE"));
218
+ h && (b = D(w(b, {})), C && (b.license = x)), await k(i(y, "package.json"), b), await l.writeFile(i(y, "tsconfig.json"), S(a(y, o.root) || ".", { publishable: h }), "utf8");
219
+ let T = null, E = !1;
220
+ return h && (await M(y, b.exports), E = await N(y, o), T = F(o)), await l.writeFile(i(y, "src", "index.ts"), `// ${f}\n\nexport const ${W(r)} = (): string => '${f}'\n`, "utf8"), await l.writeFile(i(y, "README.md"), `# ${f}\n\n${m}\n`, "utf8"), console.log(), console.log(`Created package: ${f}`), console.log(` path: ${v}`), console.log(` mode: ${h ? "publishable (npm-ready)" : "private (in-workspace source)"}`), h ? (E && console.log(" license: LICENSE copied from workspace root"), T && console.log(` api-extract: ${T}`), console.log(` publish via: pnpm --filter ${f} publish (runs vite build via prepack)`)) : console.log(` make publishable later: voltro package publishable ${r}`), _(o.globs, v) || (console.log(), p.warn(`workspace globs may not cover ${v}`, {
221
+ globs: o.globs,
222
+ hint: o.kind === "pnpm" ? `add '- "${u}/*"' under packages: in pnpm-workspace.yaml` : `add "${u}/*" to "workspaces" in the root package.json`
223
+ })), 0;
224
+ }, H = async (t, n) => {
225
+ let r = e(t, R)[0];
226
+ if (!r) return p.error(`usage: voltro package ${n} <name|path>`), 2;
227
+ let a = g(process.cwd());
228
+ if (!a) return p.error("no workspace root found", { cwd: process.cwd() }), 2;
229
+ let o = I(a, r);
230
+ if (!o) return p.error(`package not found: ${r}`, { hint: "pass a bare name (resolved under packages/) or a path to the package dir" }), 1;
231
+ let c = i(o, "package.json"), l = await O(c), u = E(l);
232
+ if (n === "publishable") {
233
+ let e = L(t, "version"), n = L(t, "access"), d = D(w(l, {
234
+ ...e ? { version: e } : {},
235
+ ...n ? { access: n } : {}
236
+ }));
237
+ s(i(a.root, "LICENSE")) && (d.license = x), await k(c, d);
238
+ let f = await M(o, l.exports);
239
+ await P(o, a);
240
+ let p = await N(o, a), m = F(a);
241
+ return console.log(), console.log(`${l.name ?? r} → publishable${u ? " (already was; refreshed)" : ""}`), console.log(` version: ${d.version}`), console.log(" build: vite build (via @voltro/build preset)"), console.log(" publishConfig: exports/main/types → ./dist (dev exports unchanged)"), console.log(" tsconfig: rootDir:\"src\" + outDir:\"dist\" (emits to ./dist)"), f && console.log(" wrote: vite.config.ts"), p && console.log(" license: LICENSE copied from workspace root"), m && console.log(` api-extract: ${m}`), console.log(` publish via: pnpm --filter ${d.name} publish`), 0;
242
+ } else return await k(c, T(l)), console.log(), console.log(`${l.name ?? r} → private (in-workspace source)${u ? "" : " (already was)"}`), console.log(" private: true; publishConfig/files/prepack removed; exports unchanged"), 0;
243
+ }, U = async (t) => {
244
+ let n = g(process.cwd());
245
+ if (!n) return p.error("no workspace root found", { cwd: process.cwd() }), 2;
246
+ let r = e(t, R)[0] ?? process.cwd(), o = I(n, r);
247
+ if (!o) return p.error(`package not found: ${r}`), 1;
248
+ let c = await O(i(o, "package.json")), l = E(c) ? "publishable" : "private";
249
+ return console.log(`package: ${c.name ?? "(unnamed)"}`), console.log(`path: ${a(n.root, o) || "."}`), console.log(`version: ${c.version ?? "(none)"}`), console.log(`mode: ${l}`), console.log(`private: ${c.private === !0}`), console.log(`build: ${s(i(o, "vite.config.ts")) ? "vite.config.ts present" : "no vite.config.ts"}`), 0;
250
+ }, W = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), G = () => {
251
+ console.log("voltro package <subcommand>"), console.log(), console.log("Subcommands:"), console.log(" create <name> [--publishable] Scaffold a new workspace package."), console.log(" [--dir <reldir>] Parent dir (default: packages)."), console.log(" [--scope <@scope>] Package scope (default: root pkg scope)."), console.log(" publishable <name|path> Convert a package → publishable (npm-ready)."), console.log(" [--version <semver>] [--access public|restricted]"), console.log(" private <name|path> Convert a package → non-publishable (source)."), console.log(" status [<name|path>] Show a package's current mode."), console.log(" help"), console.log(), console.log("The publishable<->private toggle is lossless & reversible: it only"), console.log("adds/removes publishConfig + files + private + build/prepack scripts."), console.log("The dev-facing `exports` (./src/index.ts) never changes, so the"), console.log("in-workspace dev loop is identical in both modes. Publish via pnpm"), console.log("(its publishConfig.exports override + workspace: rewriting are what"), console.log("make the ./dist tarball shape work).");
252
+ }, K = async (e) => {
253
+ let t = e[0];
254
+ if (!t || t === "help" || t === "--help" || t === "-h") return G(), +!t;
255
+ let n = e.slice(1);
256
+ switch (t) {
257
+ case "create": return V(n);
258
+ case "publishable": return H(n, "publishable");
259
+ case "private": return H(n, "private");
260
+ case "status": return U(n);
261
+ default: return p.error(`unknown subcommand: ${t}`, { valid: [
262
+ "create",
263
+ "publishable",
264
+ "private",
265
+ "status",
266
+ "help"
267
+ ] }), 2;
268
+ }
269
+ }, q = async (e) => V(e);
270
+ //#endregion
271
+ export { q as runCreatePackage, K as runPackageCommand };
@@ -0,0 +1,5 @@
1
+ import { T as e } from "./fileConventions-Cof68_BL.js";
2
+ //#region src/pageConvention.ts
3
+ var t = (t) => e.test(t), n = (e) => e.replace(/page\.tsx$/, "page.test.tsx");
4
+ //#endregion
5
+ export { n, t };
@@ -0,0 +1,146 @@
1
+ import { t as e } from "./cliError-BmdYnghb.js";
2
+ import { i as t, n, t as r } from "./cliArgs-D4p8n7EE.js";
3
+ import { b as i, y as a } from "./fileConventions-Cof68_BL.js";
4
+ import { n as o } from "./cliOutput-D1tSBoRM.js";
5
+ import { join as s, resolve as c } from "node:path";
6
+ import { promises as l } from "node:fs";
7
+ import { pathToFileURL as u } from "node:url";
8
+ import { createLogger as d } from "@voltro/logger";
9
+ import { clearRelationsRegistry as f, deriveSubjectGraph as p, ensureTableRegistered as m, formatSubjectGraph as h, registerDiscoveredRelations as g } from "@voltro/database";
10
+ //#region src/privacyCommand.ts
11
+ var _ = d({ scope: "voltro:privacy" }), v = /* @__PURE__ */ new Set([
12
+ "node_modules",
13
+ "dist",
14
+ "build",
15
+ ".turbo",
16
+ ".vite",
17
+ ".next",
18
+ ".git",
19
+ ".framework"
20
+ ]), y = [
21
+ "--depth",
22
+ "--exclude",
23
+ "--mode",
24
+ "--out",
25
+ "--root",
26
+ "--subject-table",
27
+ "--token",
28
+ "--url"
29
+ ], b = async (e, t) => {
30
+ let n = [], r = async (e) => {
31
+ let i = await l.readdir(e, { withFileTypes: !0 }).catch(() => []);
32
+ for (let a of i) {
33
+ if (v.has(a.name) || a.name.startsWith(".")) continue;
34
+ let i = s(e, a.name);
35
+ a.isDirectory() ? await r(i) : a.isFile() && t.test(a.name) && n.push(i);
36
+ }
37
+ };
38
+ return await r(e), n;
39
+ }, x = (e) => typeof e == "object" && !!e && "tableName" in e && "fields" in e && typeof e.tableName == "string", S = async (e) => {
40
+ f();
41
+ let t = 0, n = 0, r = [...await b(e, i), ...await b(e, a)];
42
+ for (let e of r) {
43
+ let r;
44
+ try {
45
+ r = await import(u(e).href);
46
+ } catch (t) {
47
+ _.warn("privacy: failed to import a schema file — its tables are NOT in the graph below", {
48
+ file: e,
49
+ error: String(t)
50
+ });
51
+ continue;
52
+ }
53
+ for (let e of Object.values(r)) x(e) && (m(e), t += 1);
54
+ n += g(r);
55
+ }
56
+ return {
57
+ tables: t,
58
+ relations: n
59
+ };
60
+ }, C = (t) => {
61
+ if (t === void 0) return;
62
+ let n = Number(t);
63
+ if (!Number.isInteger(n) || n < 1) throw new e(`voltro privacy: --depth must be a positive integer, got "${t}"`);
64
+ return n;
65
+ }, w = (e) => e === void 0 ? void 0 : e.split(",").map((e) => e.trim()).filter((e) => e !== ""), T = async (e) => {
66
+ let t = c(r(e, y) ?? process.cwd()), i = n(e, "--subject-table") ?? "actors", a = C(n(e, "--depth")), s = w(n(e, "--exclude"));
67
+ if ((await S(t)).tables === 0) return _.error("voltro privacy scope: no schema files found", {
68
+ root: t,
69
+ hint: "looked for *.entity.ts / *.schema.ts / schema.ts"
70
+ }), 1;
71
+ let l = p({
72
+ subjectTable: i,
73
+ ...a === void 0 ? {} : { maxDepth: a },
74
+ ...s === void 0 ? {} : { exclude: s }
75
+ });
76
+ return e.includes("--json") ? o({
77
+ subjectTable: l.subjectTable,
78
+ paths: l.paths,
79
+ limitations: l.limitations,
80
+ summary: {
81
+ reachable: l.paths.length,
82
+ unreachable: l.limitations.filter((e) => e.kind === "unreachable").length,
83
+ depthTruncated: l.limitations.filter((e) => e.kind === "depth-truncated").length
84
+ }
85
+ }) : (console.log(""), console.log(h(l)), console.log("")), +(l.paths.length === 0);
86
+ }, E = (t) => {
87
+ let r = n(t, "--url");
88
+ if (r === void 0 || r === "") throw new e("voltro privacy: --url <app base url> is required — this runs against the RUNNING app's admin-gated governance endpoint, so the erasure log and the configured anonymize fields apply.");
89
+ let i = n(t, "--token") ?? process.env.VOLTRO_INSPECT_TOKEN;
90
+ if (i === void 0 || i === "") throw new e("voltro privacy: no inspect credential — pass --token or set VOLTRO_INSPECT_TOKEN. The governance export/erase endpoints are fail-closed and will answer 401 without one.");
91
+ return {
92
+ base: `${r.replace(/\/+$/, "")}/_voltro/inspect/plugins/governance`,
93
+ headers: {
94
+ accept: "application/json",
95
+ "content-type": "application/json",
96
+ authorization: `Bearer ${i}`
97
+ }
98
+ };
99
+ }, D = async (e, t, n) => {
100
+ let r = await fetch(`${e.base}${t}`, {
101
+ method: "POST",
102
+ headers: e.headers,
103
+ body: JSON.stringify(n)
104
+ }), i = await r.json().catch(() => ({}));
105
+ return {
106
+ ok: r.ok,
107
+ status: r.status,
108
+ data: i
109
+ };
110
+ }, O = (n, r) => {
111
+ let i = t(n, y)[0];
112
+ if (i === void 0) throw new e(`voltro privacy ${r}: a <subjectId> is required.`);
113
+ return i;
114
+ }, k = {
115
+ scope: T,
116
+ export: async (e) => {
117
+ let t = O(e, "export"), r = await D(E(e), "/export", { subjectId: t });
118
+ if (!r.ok) return _.error(`voltro privacy export: the app answered ${r.status}`, { error: String(r.data.error ?? "") }), 1;
119
+ let i = n(e, "--out"), a = r.data.bundle, s = JSON.stringify(a ?? {}, null, 2);
120
+ if (i !== void 0) {
121
+ await l.writeFile(c(i), `${s}\n`, "utf8");
122
+ let e = Object.keys(a ?? {});
123
+ _.info(`voltro privacy export: wrote ${e.length} table(s) to ${i}`, { tables: e });
124
+ } else o(a ?? {});
125
+ return 0;
126
+ },
127
+ erase: async (t) => {
128
+ let r = O(t, "erase"), i = n(t, "--mode") ?? "delete";
129
+ if (i !== "delete" && i !== "anonymize") throw new e(`voltro privacy erase: --mode must be delete|anonymize, got "${i}"`);
130
+ if (!t.includes("--confirm")) return _.error("voltro privacy erase: refusing without --confirm."), console.error(` This performs an IRREVERSIBLE ${i} of subject '${r}' across every table in the`), console.error(" configured subject scope, on the app at --url. Run `voltro privacy scope` first to see"), console.error(" which tables that is — and which it cannot reach."), 2;
131
+ let a = await D(E(t), "/erase", {
132
+ subjectId: r,
133
+ mode: i
134
+ });
135
+ if (!a.ok) return _.error(`voltro privacy erase: the app answered ${a.status}`, { error: String(a.data.error ?? "") }), 1;
136
+ let s = a.data.entry;
137
+ return o(s ?? {}), s?.truncated !== void 0 && s.truncated.length > 0 ? (_.error(`voltro privacy erase: INCOMPLETE — the row cap was hit on ${s.truncated.join(", ")}. Re-run until 'truncated' is absent.`), 1) : 0;
138
+ }
139
+ }, A = async (e) => {
140
+ let [t, ...n] = e;
141
+ if (t === void 0) return console.error("voltro privacy <subcommand> [args]"), console.error(" scope [root] [--subject-table <t>] [--depth <n>] [--exclude a,b] [--json]"), console.error(" Derive the DSAR subject graph from the schema — and print what it CANNOT see."), console.error(" export <subjectId> --url <app> [--token <t>] [--out <file>]"), console.error(" erase <subjectId> --url <app> [--token <t>] [--mode delete|anonymize] --confirm"), console.error(" Both run against the RUNNING app's admin-gated governance endpoint, so the"), console.error(" configured anonymize fields and the erasure log apply."), 1;
142
+ let r = k[t];
143
+ return r === void 0 ? (console.error(`voltro privacy: unknown subcommand '${t}'`), 2) : r(n);
144
+ };
145
+ //#endregion
146
+ export { A as runPrivacyCommand };