@voltro/cli 0.53.0 → 0.55.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 (191) hide show
  1. package/CHANGELOG.md +335 -0
  2. package/dist/{agentsMd-0l980yhL.js → agentsMd-BaLC10Na.js} +110 -82
  3. package/dist/agentsMd-DCY1RSs8.js +2 -0
  4. package/dist/{apiBuild-CaPfoWku.js → apiBuild-CMvLJM_K.js} +2 -2
  5. package/dist/apiBuild-Cl0IDx8c.js +2 -0
  6. package/dist/bin.js +1 -1
  7. package/dist/{build-D-OnvNMf.js → build-S0QOzqPT.js} +115 -115
  8. package/dist/{checkCommand-D2ZduVlh.js → checkCommand-DNkY5kwF.js} +1 -1
  9. package/dist/{checkCommand-C5elt0tW.js → checkCommand-fbj9GDjN.js} +6 -6
  10. package/dist/{cloudCmd-QUXh-b5w.js → cloudCmd-DzKcSYuy.js} +1 -1
  11. package/dist/codegen-CN6vMM4J.js +2 -0
  12. package/dist/{codegen-FEk8AZHb.js → codegen-SIepQtUl.js} +76 -65
  13. package/dist/codegenCommand-3TDJezom.js +42 -0
  14. package/dist/{codemodRunner-BjtB2lq6.js → codemodRunner-C2zxZUIw.js} +64 -9
  15. package/dist/{commands-DyxAmhP0.js → commands-BBYJ7Q3B.js} +96 -73
  16. package/dist/{dashboardCommand-BdKTyT13.js → dashboardCommand-D2kmyCLL.js} +3 -3
  17. package/dist/{dataCommand-Bab9X7s8.js → dataCommand-BEPPQiTl.js} +267 -195
  18. package/dist/dbCommand-BTyBGhIA.js +2 -0
  19. package/dist/{dbCommand-06O2finM.js → dbCommand-DZTmOFT4.js} +3 -3
  20. package/dist/{dev-C6LGF4iY.js → dev-Ca_A_S9v.js} +2439 -2397
  21. package/dist/{dev-GjJWAYo2.js → dev-DfVZaoys.js} +1 -1
  22. package/dist/{doctorCommand-etMkflRc.js → doctorCommand-CGZJK_4o.js} +21 -21
  23. package/dist/doctorCommand-djmqEcDC.js +2 -0
  24. package/dist/{dormancyCommand-UwZ1AZzB.js → dormancyCommand-DY2rYpTa.js} +1 -1
  25. package/dist/{embeddingsCommand-C70zWHwo.js → embeddingsCommand-BoCqZsgp.js} +1 -1
  26. package/dist/{envCommand-dSyKvRkM.js → envCommand-Bxy2fOjc.js} +15 -15
  27. package/dist/{evolveCommand-CG0_ebO5.js → evolveCommand-BsbZ-XDg.js} +2 -2
  28. package/dist/fileConventions-l-RIXbx8.js +36 -0
  29. package/dist/{fileTaxonomy-B7uxipWS.js → fileTaxonomy-CbyMQYx_.js} +37 -37
  30. package/dist/frameworkTableAssembly-Df2Ymp2f.js +2 -0
  31. package/dist/{frameworkTableAssembly-DKx3ba3S.js → frameworkTableAssembly-Do-cf6RJ.js} +96 -102
  32. package/dist/index.js +2 -2
  33. package/dist/{infoCommand-_53iOc_j.js → infoCommand-EmM3jPKD.js} +1 -1
  34. package/dist/{inspect-Bd8-9wsi.js → inspect-DCqILJ1G.js} +4 -0
  35. package/dist/inspect-DGJwpOAb.js +2 -0
  36. package/dist/interruptedReplace-CwnkBb2X.js +41 -0
  37. package/dist/interruptedReplace-qzmFI020.js +2 -0
  38. package/dist/manifestBuild-CJ2zvPvT.js +2 -0
  39. package/dist/{manifestBuild-Cqgsx2bM.js → manifestBuild-DjX5MoXy.js} +1 -1
  40. package/dist/{metaCommands-Cn2oboG4.js → metaCommands-x7RCi2AF.js} +2 -2
  41. package/dist/{migrate-Cko9rswM.js → migrate-CGFZS-1a.js} +2 -2
  42. package/dist/mobileCommand-D9O6iq3D.js +428 -0
  43. package/dist/mobileCommand-DAum7tsG.js +2 -0
  44. package/dist/{pageConvention-C938S8oC.js → pageConvention-CMpfDN6r.js} +1 -1
  45. package/dist/{privacyCommand-DWTQMC6R.js → privacyCommand-BCa2OoZG.js} +2 -2
  46. package/dist/{probeCommand-DkGGLknv.js → probeCommand-Bs3iVBSL.js} +1 -1
  47. package/dist/{projectScaffold-EzlErR4E.js → projectScaffold-CJfP-xbT.js} +1 -1
  48. package/dist/{projectScaffold-B4dmTlwT.js → projectScaffold-CSN0OzBV.js} +2 -2
  49. package/dist/renderModeScan-43yQ2opo.js +147 -0
  50. package/dist/{renderProfile-CskIgAfn.js → renderProfile-DvrhVJHa.js} +2 -2
  51. package/dist/{runtimeTrace-c0APJz7E.js → runtimeTrace-C1BTpHGQ.js} +1 -1
  52. package/dist/{sdkgen-BiQCgIEr.js → sdkgen-CXMwLg9n.js} +1 -1
  53. package/dist/{serveCommand-CueKQgzl.js → serveCommand-C7IrCD58.js} +899 -897
  54. package/dist/serveCommand-Cjt5S9hD.js +2 -0
  55. package/dist/serveEntry.js +1 -1
  56. package/dist/start-DH7cat4-.js +3 -0
  57. package/dist/{start-ekPan8BT.js → start-EOV7s1NZ.js} +544 -527
  58. package/dist/startEntry.js +1 -1
  59. package/dist/{staticCommand-xlSL-IWk.js → staticCommand-ey0kYmOT.js} +1 -1
  60. package/dist/{subcommandNames-DpYs3DXr.js → subcommandNames-CDzfEtKV.js} +3 -3
  61. package/dist/{templates-BR-fb4SP.js → templates-BTWZkJJT.js} +41 -9
  62. package/dist/{test-BWPQcRoB.js → test-DO27-x2P.js} +1 -1
  63. package/dist/{updateCommand-C_8I8Rzo.js → updateCommand-C_jN1w18.js} +1 -1
  64. package/dist/updateCommand-nnFjDbl4.js +2 -0
  65. package/dist/{webDev-C7jWJ5dX.js → webDev-1XpVnYkW.js} +1 -1
  66. package/dist/{webDev-oczpugbx.js → webDev-B7vNj4Bq.js} +1231 -1186
  67. package/dist/{webhooksCommand-4SVPDjKg.js → webhooksCommand-B1LVcyO3.js} +1 -1
  68. package/dist/workspaceDeps-RKEkX92S.js +45 -0
  69. package/package.json +31 -19
  70. package/templates/AGENTS.core.md +2 -0
  71. package/templates/AGENTS.md +4 -2
  72. package/templates/agent-docs/_index.md +2 -2
  73. package/templates/agent-docs/_manifest.json +1 -1
  74. package/templates/agent-docs/ai.md +4 -4
  75. package/templates/agent-docs/authentication.md +115 -0
  76. package/templates/agent-docs/cli.md +98 -12
  77. package/templates/agent-docs/data.md +121 -21
  78. package/templates/agent-docs/database/advancedqueries.md +1 -1
  79. package/templates/agent-docs/database/migrations.md +1 -1
  80. package/templates/agent-docs/database/seedsdialects.md +64 -2
  81. package/templates/agent-docs/internationalization.md +2 -0
  82. package/templates/agent-docs/introduction.md +25 -0
  83. package/templates/agent-docs/local-first-mobile.md +139 -41
  84. package/templates/agent-docs/observability.md +4 -2
  85. package/templates/agent-docs/plugins/atlassian.md +2 -2
  86. package/templates/agent-docs/plugins/audit.md +2 -2
  87. package/templates/agent-docs/plugins/billing.md +1 -1
  88. package/templates/agent-docs/plugins/cdc-out.md +8 -3
  89. package/templates/agent-docs/plugins/comments.md +22 -0
  90. package/templates/agent-docs/plugins/presence.md +32 -3
  91. package/templates/agent-docs/plugins/prometheus.md +2 -0
  92. package/templates/agent-docs/plugins/queue.md +47 -4
  93. package/templates/agent-docs/plugins.md +52 -14
  94. package/templates/agent-docs/reference.md +25 -4
  95. package/templates/agent-docs/routing.md +81 -9
  96. package/templates/agent-docs/scheduling.md +1 -1
  97. package/templates/agent-docs/schema-driven-ui.md +137 -1
  98. package/templates/agent-docs/templates/appshells.md +36 -4
  99. package/templates/agent-docs/whats-new.md +75 -158
  100. package/templates/apps/api-ai/package.json +6 -6
  101. package/templates/apps/api-auth/package.json +8 -8
  102. package/templates/apps/api-backend/package.json +7 -7
  103. package/templates/apps/api-backend-deactivation/package.json +7 -7
  104. package/templates/apps/api-backend-mail/package.json +8 -8
  105. package/templates/apps/api-backend-mariadb/package.json +9 -9
  106. package/templates/apps/api-backend-sqlite/package.json +8 -8
  107. package/templates/apps/api-backend-storage/package.json +8 -8
  108. package/templates/apps/api-cms/package.json +9 -9
  109. package/templates/apps/api-collab/README.md +3 -3
  110. package/templates/apps/api-collab/app.config.ts +1 -1
  111. package/templates/apps/api-collab/database/schema.ts +12 -8
  112. package/templates/apps/api-collab/mutations/documents.create.mutation.server.ts +1 -1
  113. package/templates/apps/api-collab/mutations/documents.setBody.mutation.server.ts +1 -1
  114. package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +1 -1
  115. package/templates/apps/api-collab/package.json +8 -8
  116. package/templates/apps/api-collab/template.json +1 -1
  117. package/templates/apps/api-collab/tests/documents.setBody.test.ts +10 -2
  118. package/templates/apps/api-data-advanced/package.json +8 -8
  119. package/templates/apps/api-durable/package.json +8 -8
  120. package/templates/apps/api-feature-flags/package.json +9 -9
  121. package/templates/apps/api-governance/package.json +8 -8
  122. package/templates/apps/api-kv/package.json +8 -8
  123. package/templates/apps/api-moderation/package.json +8 -8
  124. package/templates/apps/api-observability/package.json +8 -8
  125. package/templates/apps/api-ratelimit/package.json +8 -8
  126. package/templates/apps/api-rbac/package.json +8 -8
  127. package/templates/apps/api-rest/package.json +7 -7
  128. package/templates/apps/api-row-history/package.json +8 -8
  129. package/templates/apps/api-saas/package.json +11 -10
  130. package/templates/apps/api-saas-starter/package.json +10 -10
  131. package/templates/apps/api-search/package.json +8 -8
  132. package/templates/apps/api-status/package.json +8 -8
  133. package/templates/apps/api-webhooks/package.json +9 -9
  134. package/templates/apps/changelog/package.json +7 -6
  135. package/templates/apps/edge-functions/package.json +2 -2
  136. package/templates/apps/frontend-admin/package.json +8 -8
  137. package/templates/apps/frontend-app/package.json +9 -9
  138. package/templates/apps/frontend-auth/package.json +8 -8
  139. package/templates/apps/frontend-blank/package.json +7 -7
  140. package/templates/apps/frontend-cms/package.json +9 -9
  141. package/templates/apps/frontend-collab/README.md +43 -24
  142. package/templates/apps/frontend-collab/app.config.ts +3 -3
  143. package/templates/apps/frontend-collab/package.json +14 -10
  144. package/templates/apps/frontend-collab/src/locales/de.ts +1 -2
  145. package/templates/apps/frontend-collab/src/locales/en.ts +1 -2
  146. package/templates/apps/frontend-collab/src/pages/page.test.tsx +72 -76
  147. package/templates/apps/frontend-collab/src/pages/page.tsx +45 -22
  148. package/templates/apps/frontend-collab/template.json +2 -2
  149. package/templates/apps/frontend-contact/package.json +7 -7
  150. package/templates/apps/frontend-dashboard/package.json +7 -7
  151. package/templates/apps/frontend-docs/package.json +8 -7
  152. package/templates/apps/frontend-i18n/package.json +6 -6
  153. package/templates/apps/frontend-landing/README.md +48 -0
  154. package/templates/apps/frontend-landing/app.config.ts +28 -0
  155. package/templates/apps/frontend-landing/package.json +7 -6
  156. package/templates/apps/frontend-landing/src/assets/hero.jpg +0 -0
  157. package/templates/apps/frontend-landing/src/fonts/Geist-Variable.woff2 +0 -0
  158. package/templates/apps/frontend-landing/src/fonts/LICENSE-Geist.txt +92 -0
  159. package/templates/apps/frontend-landing/src/globals.css +15 -0
  160. package/templates/apps/frontend-landing/src/globals.d.ts +17 -0
  161. package/templates/apps/frontend-landing/src/locales/de.ts +3 -2
  162. package/templates/apps/frontend-landing/src/locales/en.ts +5 -2
  163. package/templates/apps/frontend-landing/src/pages/page.test.tsx +79 -0
  164. package/templates/apps/frontend-landing/src/pages/page.tsx +26 -3
  165. package/templates/apps/frontend-landing/template.json +2 -2
  166. package/templates/apps/frontend-portal/package.json +8 -8
  167. package/templates/apps/frontend-saas/package.json +8 -8
  168. package/templates/apps/frontend-spa/package.json +7 -7
  169. package/templates/apps/frontend-ssr/package.json +7 -7
  170. package/templates/apps/frontend-ssr-api/package.json +8 -8
  171. package/templates/apps/frontend-static-blog/package.json +8 -7
  172. package/templates/apps/frontend-status/package.json +8 -8
  173. package/templates/apps/mobile-app/package.json +12 -11
  174. package/templates/apps/mobile-app/src/lib/deeplinks.ts +29 -17
  175. package/templates/apps/mobile-app/tests/deeplinks.test.ts +16 -0
  176. package/dist/agentsMd-SDDSkyl4.js +0 -2
  177. package/dist/apiBuild-DHtLXYx9.js +0 -2
  178. package/dist/codegen-BWpt3VgF.js +0 -2
  179. package/dist/codegenCommand-BOiWQ5hz.js +0 -137
  180. package/dist/dbCommand-B1EXBC6f.js +0 -2
  181. package/dist/doctorCommand-B0hX0tdz.js +0 -2
  182. package/dist/fileConventions-DASGEmj-.js +0 -35
  183. package/dist/frameworkTableAssembly-C_7Z-rMs.js +0 -2
  184. package/dist/inspect-CuoDInfZ.js +0 -2
  185. package/dist/interruptedReplace-C3O3M1MM.js +0 -28
  186. package/dist/interruptedReplace-CvmiAM9K.js +0 -2
  187. package/dist/manifestBuild-C4-J1-m_.js +0 -2
  188. package/dist/renderModeScan-CUbOeOAg.js +0 -122
  189. package/dist/serveCommand-DsnrVN3U.js +0 -2
  190. package/dist/start-BJzZLbt8.js +0 -3
  191. package/dist/updateCommand-Bqql_rsQ.js +0 -2
@@ -1,21 +1,21 @@
1
- import { i as e, n as t, r as n, t as r } from "./subcommandNames-DpYs3DXr.js";
2
- import { dirname as i, join as a, resolve as o } from "node:path";
3
- import { readFileSync as s } from "node:fs";
4
- import { fileURLToPath as c } from "node:url";
1
+ import { a as e, i as t, n, r, t as i } from "./subcommandNames-CDzfEtKV.js";
2
+ import { dirname as a, join as o, resolve as s } from "node:path";
3
+ import { readFileSync as c } from "node:fs";
4
+ import { fileURLToPath as l } from "node:url";
5
5
  //#region src/commands.ts
6
- var l = () => {
6
+ var u = () => {
7
7
  try {
8
- let e = a(i(c(import.meta.url)), "..", "package.json");
9
- return JSON.parse(s(e, "utf8")).version ?? "0.0.0";
8
+ let e = o(a(l(import.meta.url)), "..", "package.json");
9
+ return JSON.parse(c(e, "utf8")).version ?? "0.0.0";
10
10
  } catch {
11
11
  return "0.0.0";
12
12
  }
13
- }, u = [
13
+ }, d = [
14
14
  {
15
15
  name: "list-templates",
16
16
  summary: "List available app templates (kind, summary, tags).",
17
17
  status: "wired",
18
- run: (e) => import("./projectScaffold-EzlErR4E.js").then((t) => t.runListTemplates(e)),
18
+ run: (e) => import("./projectScaffold-CJfP-xbT.js").then((t) => t.runListTemplates(e)),
19
19
  help: {
20
20
  usage: "",
21
21
  examples: [["voltro list-templates", "every template `create-project` / `add-app` can scaffold"]]
@@ -25,7 +25,7 @@ var l = () => {
25
25
  name: "create-project",
26
26
  summary: "Scaffold a new project under apps/<name>/ from one or more templates (creates the workspace root when there is none).",
27
27
  status: "wired",
28
- run: (e) => import("./projectScaffold-EzlErR4E.js").then((t) => t.runCreateProject(e)),
28
+ run: (e) => import("./projectScaffold-CJfP-xbT.js").then((t) => t.runCreateProject(e)),
29
29
  help: {
30
30
  usage: "<name> [--api <templateId>] [--web <templateId>] [--mobile[=<templateId>]] [--no-register]",
31
31
  flags: [
@@ -65,7 +65,7 @@ var l = () => {
65
65
  name: "add-app",
66
66
  summary: "Add a new app to an existing project from a template. Usage: voltro add-app <appName> --template <id> [--to <projectName>].",
67
67
  status: "wired",
68
- run: (e) => import("./projectScaffold-EzlErR4E.js").then((t) => t.runAddApp(e)),
68
+ run: (e) => import("./projectScaffold-CJfP-xbT.js").then((t) => t.runAddApp(e)),
69
69
  help: {
70
70
  usage: "<appName> --template <templateId> [--to <projectName>] [--no-register]",
71
71
  flags: [
@@ -80,7 +80,7 @@ var l = () => {
80
80
  name: "init",
81
81
  summary: "Initialise the current directory as a Voltro workspace root (pnpm-workspace.yaml, root scripts, .gitignore, git init). Idempotent; takes no arguments.",
82
82
  status: "wired",
83
- run: (e) => import("./metaCommands-Cn2oboG4.js").then((t) => t.runInit(e)),
83
+ run: (e) => import("./metaCommands-x7RCi2AF.js").then((t) => t.runInit(e)),
84
84
  help: {
85
85
  usage: "",
86
86
  examples: [["voltro init", "make the current directory a workspace root, then `voltro create-project <name>`"]],
@@ -91,7 +91,7 @@ var l = () => {
91
91
  name: "dev",
92
92
  summary: "Start the local development server (auto-discovers routes / mutations).",
93
93
  status: "wired",
94
- run: (e) => import("./dev-GjJWAYo2.js").then((t) => t.runDev(e)),
94
+ run: (e) => import("./dev-DfVZaoys.js").then((t) => t.runDev(e)),
95
95
  help: {
96
96
  usage: "[app]",
97
97
  examples: [["voltro dev", "boot the app in the current directory"], ["voltro dev apps/acme/api", "boot a specific app"]],
@@ -109,7 +109,7 @@ var l = () => {
109
109
  name: "dashboard",
110
110
  summary: "Serve the DevTools dashboard standalone (from @voltro/dashboard). Targets via VOLTRO_DASHBOARD_APPS; --port to override.",
111
111
  status: "wired",
112
- run: (e) => import("./dashboardCommand-BdKTyT13.js").then((t) => t.runDashboardCommand(e)),
112
+ run: (e) => import("./dashboardCommand-D2kmyCLL.js").then((t) => t.runDashboardCommand(e)),
113
113
  help: {
114
114
  usage: "[--port <n>]",
115
115
  flags: [["--port <n>", "port to serve the dashboard on"]],
@@ -121,7 +121,7 @@ var l = () => {
121
121
  name: "check",
122
122
  summary: "Verify the app graph (blast-radius checks) against a running api; LLM-shaped --json diagnostics. Flags: --json, --process <p>, --diff removeTable:<name>.",
123
123
  status: "wired",
124
- run: (e) => import("./checkCommand-D2ZduVlh.js").then((t) => t.runCheckCommand(e)),
124
+ run: (e) => import("./checkCommand-DNkY5kwF.js").then((t) => t.runCheckCommand(e)),
125
125
  help: {
126
126
  usage: "[--json] [--offline] [--process <name>] [--diff removeTable:<name>]",
127
127
  flags: [
@@ -155,7 +155,7 @@ var l = () => {
155
155
  name: "webhooks",
156
156
  summary: "Outbound-webhook artefacts. `consumer` generates the ZERO-DEPENDENCY Standard-Webhooks verification package a subscriber installs, from this app's own declared events; `events` lists the events a subscriber can register for. Usage: voltro webhooks <consumer|events> [path] [--out <dir>] [--name <pkg>] [--json].",
157
157
  status: "wired",
158
- run: (e) => import("./webhooksCommand-4SVPDjKg.js").then((t) => t.runWebhooksCommand(e)),
158
+ run: (e) => import("./webhooksCommand-B1LVcyO3.js").then((t) => t.runWebhooksCommand(e)),
159
159
  help: {
160
160
  usage: "<consumer|events> [path] [--out <dir>] [--name <pkg>] [--json]",
161
161
  flags: [
@@ -171,7 +171,7 @@ var l = () => {
171
171
  name: "evolve",
172
172
  summary: "Schema-evolution copilot: propose an observed-graph-driven codemod + a branch-verified backfill for a schema change (rename/retype/split/drop a column, rename a table). Dry-run by default; --write applies. Usage: voltro evolve rename-column <table>.<col> --to <newName> [--write] [--json].",
173
173
  status: "wired",
174
- run: (e) => import("./evolveCommand-CG0_ebO5.js").then((t) => t.runEvolveCommand(e)),
174
+ run: (e) => import("./evolveCommand-BsbZ-XDg.js").then((t) => t.runEvolveCommand(e)),
175
175
  help: {
176
176
  usage: "<rename-column|rename-table|retype-column|split-column|drop-column> <target> [--to <new>] [--write]",
177
177
  flags: [
@@ -188,18 +188,40 @@ var l = () => {
188
188
  name: "codegen",
189
189
  summary: "Emit rpcGroup.generated.ts from discovered route / mutation descriptors.",
190
190
  status: "wired",
191
- run: (e) => import("./codegenCommand-BOiWQ5hz.js").then((t) => t.runCodegenCommand(e)),
191
+ run: (e) => import("./codegenCommand-3TDJezom.js").then((t) => t.runCodegenCommand(e)),
192
192
  help: {
193
193
  usage: "[app]",
194
194
  examples: [["voltro codegen", "regenerate rpcGroup.generated.ts for the app in the cwd"]],
195
195
  notes: ["`voltro dev` and `voltro build` regenerate it themselves; run this by hand when a", "`voltro test` / typecheck reports the generated group is stale."]
196
196
  }
197
197
  },
198
+ {
199
+ name: "mobile",
200
+ summary: "Mobile (Expo) app steps. codegen — regenerate the api binding AND the deep-link table (every Expo Router screen becomes a deep link; `*.deepLink.ts` overrides one). links — emit apple-app-site-association + assetlinks.json from that same table, so screens, in-app routing and the /.well-known/ files cannot drift apart.",
201
+ status: "wired",
202
+ run: (e) => import("./mobileCommand-DAum7tsG.js").then((t) => t.runMobileCommand(e)),
203
+ help: {
204
+ usage: e(r),
205
+ flags: [
206
+ ["--team-id <id>", "Apple Team ID for the AASA appID (links)"],
207
+ ["--fingerprint <sha256>", "Android signing cert SHA-256; repeatable (links)"],
208
+ ["--out <dir>", "where to write the association files (default: .well-known/)"]
209
+ ],
210
+ examples: [["voltro mobile codegen apps/acme/mobile", "api binding + deep-link table"], ["voltro mobile links --team-id ABCDE12345 --fingerprint 14:6D:…:E5", "the two /.well-known/ files"]],
211
+ env: [["VOLTRO_APPLE_TEAM_ID", "default for --team-id"], ["VOLTRO_ANDROID_CERT_FINGERPRINT", "an additional --fingerprint"]],
212
+ notes: [
213
+ "`voltro codegen` inside a mobile app runs the same codegen — one implementation, so the",
214
+ "template's `pnpm ios` needs no extra step.",
215
+ "A Team ID and a signing fingerprint are per-developer facts; `links` REFUSES without them",
216
+ "rather than writing a placeholder that publishes and associates nothing."
217
+ ]
218
+ }
219
+ },
198
220
  {
199
221
  name: "migrate",
200
222
  summary: "Apply the declared schema to the database (alias of `db apply` — diffs declared vs live and emits the ALTERs). `--create-only` for the bootstrap-only CREATE TABLE IF NOT EXISTS path.",
201
223
  status: "wired",
202
- run: (e) => import("./migrate-Cko9rswM.js").then((t) => t.runMigrateCommand(e)),
224
+ run: (e) => import("./migrate-CGFZS-1a.js").then((t) => t.runMigrateCommand(e)),
203
225
  help: {
204
226
  usage: "[app] [--create-only]",
205
227
  flags: [["--create-only", "only CREATE TABLE IF NOT EXISTS — never ALTER (bootstrap)"]],
@@ -211,7 +233,7 @@ var l = () => {
211
233
  name: "test",
212
234
  summary: "Run vitest against the app at the cwd (auto-discovers *.test.ts/tsx).",
213
235
  status: "wired",
214
- run: (e) => import("./test-BWPQcRoB.js").then((t) => t.runTestCommand(e)),
236
+ run: (e) => import("./test-DO27-x2P.js").then((t) => t.runTestCommand(e)),
215
237
  help: {
216
238
  usage: "[dir] [filter…] [--watch] [-t <pattern>]",
217
239
  flags: [
@@ -259,7 +281,7 @@ var l = () => {
259
281
  name: "info",
260
282
  summary: "Report versions (CLI, node, every installed @voltro/* — flags lockstep skew), package manager, and dialect. --json for CI. Exits 1 on version skew.",
261
283
  status: "wired",
262
- run: (e) => import("./infoCommand-_53iOc_j.js").then((t) => t.runInfoCommand(e)),
284
+ run: (e) => import("./infoCommand-EmM3jPKD.js").then((t) => t.runInfoCommand(e)),
263
285
  help: {
264
286
  usage: "[--json]",
265
287
  flags: [["--json", "machine-readable report"]],
@@ -280,7 +302,7 @@ var l = () => {
280
302
  name: "env",
281
303
  summary: "Inspect/sync the typed-env manifest. Subcommands: check (default), sync (.env.example), types (env.generated.d.ts for CI tsc), turbo.",
282
304
  status: "wired",
283
- run: (e) => import("./envCommand-dSyKvRkM.js").then((t) => t.runEnvCommand(e)),
305
+ run: (e) => import("./envCommand-Bxy2fOjc.js").then((t) => t.runEnvCommand(e)),
284
306
  help: {
285
307
  usage: "[check|sync|types|turbo] [--force]",
286
308
  flags: [["--force", "overwrite the generated file instead of refusing on a conflict"]],
@@ -309,12 +331,12 @@ var l = () => {
309
331
  run: async (e) => {
310
332
  let t = e.find((e) => !e.startsWith("-")) ?? process.cwd();
311
333
  if (e.includes("--preflight")) {
312
- let { runServePreflight: e } = await import("./doctorCommand-B0hX0tdz.js");
313
- return e(o(t), !0);
334
+ let { runServePreflight: e } = await import("./doctorCommand-djmqEcDC.js");
335
+ return e(s(t), !0);
314
336
  }
315
- let { tryRunWebServe: n } = await import("./webDev-C7jWJ5dX.js"), r = await n(o(t));
337
+ let { tryRunWebServe: n } = await import("./webDev-1XpVnYkW.js"), r = await n(s(t));
316
338
  if (!r.ran) {
317
- let { runServeDispatch: t } = await import("./serveCommand-DsnrVN3U.js");
339
+ let { runServeDispatch: t } = await import("./serveCommand-Cjt5S9hD.js");
318
340
  return t(e);
319
341
  }
320
342
  return r.exitCode;
@@ -342,13 +364,13 @@ var l = () => {
342
364
  handlesHelp: !0,
343
365
  summary: "Preflight an app for production: the precompiled serve bundle, hand-rolled primitives (naming the shipped one), @voltro/* version skew, executors with no access check, `.serverOnly()` leaks, and junction-FK gaps.",
344
366
  status: "wired",
345
- run: (e) => import("./doctorCommand-B0hX0tdz.js").then((t) => t.runDoctorCommand(e))
367
+ run: (e) => import("./doctorCommand-djmqEcDC.js").then((t) => t.runDoctorCommand(e))
346
368
  },
347
369
  {
348
370
  name: "build",
349
371
  summary: "Production build for a web app (vite build + per-page SSG pre-render).",
350
372
  status: "wired",
351
- run: (e) => import("./build-D-OnvNMf.js").then((t) => t.runBuildCommand(e)),
373
+ run: (e) => import("./build-S0QOzqPT.js").then((t) => t.runBuildCommand(e)),
352
374
  help: {
353
375
  usage: "[app] [--target <t>]",
354
376
  flags: [["--target <t>", "build target"]],
@@ -364,7 +386,7 @@ var l = () => {
364
386
  name: "prune-runtime",
365
387
  summary: "Trim a deployed web tree’s node_modules to the reachable runtime set (standalone image slimming).",
366
388
  status: "wired",
367
- run: (e) => import("./runtimeTrace-c0APJz7E.js").then((t) => t.runPruneRuntimeCommand(e)),
389
+ run: (e) => import("./runtimeTrace-C1BTpHGQ.js").then((t) => t.runPruneRuntimeCommand(e)),
368
390
  hidden: !0
369
391
  },
370
392
  {
@@ -382,7 +404,7 @@ var l = () => {
382
404
  name: "dormancy",
383
405
  summary: "Single-node scale-to-zero: front the API with a wake-orchestrator that stops the app when idle and brings it back on a request or a due wakeup (cron/workflow). Needs a SQL store. Flags: --port, --app-port, --idle-grace-ms, --tick-ms.",
384
406
  status: "wired",
385
- run: (e) => import("./dormancyCommand-UwZ1AZzB.js").then((t) => t.runDormancyCommand(e)),
407
+ run: (e) => import("./dormancyCommand-DY2rYpTa.js").then((t) => t.runDormancyCommand(e)),
386
408
  help: {
387
409
  usage: "[app] [--port <n>] [--app-port <n>] [--idle-grace-ms <n>] [--tick-ms <n>]",
388
410
  flags: [
@@ -399,7 +421,7 @@ var l = () => {
399
421
  name: "start",
400
422
  summary: "Production runtime: serves dist + SSR-on-demand for ssr/isr pages.",
401
423
  status: "wired",
402
- run: (e) => import("./start-BJzZLbt8.js").then((t) => t.runStartCommand(e)),
424
+ run: (e) => import("./start-DH7cat4-.js").then((t) => t.runStartCommand(e)),
403
425
  help: {
404
426
  usage: "[app]",
405
427
  examples: [["voltro start", "serve a built web app (dist + SSR-on-demand)"]],
@@ -410,7 +432,7 @@ var l = () => {
410
432
  name: "deploy",
411
433
  summary: "Show deploy options + `voltro deploy plan` auto-detects the target tier (static-cdn / container / functions) per app + function.",
412
434
  status: "wired",
413
- run: (e) => import("./metaCommands-Cn2oboG4.js").then((t) => t.runDeploy(e)),
435
+ run: (e) => import("./metaCommands-x7RCi2AF.js").then((t) => t.runDeploy(e)),
414
436
  help: {
415
437
  usage: "[plan]",
416
438
  examples: [["voltro deploy plan", "the auto-detected target tier per app + function"]]
@@ -428,15 +450,15 @@ var l = () => {
428
450
  handlesHelp: !0,
429
451
  summary: "Deploy a pre-built static site (./dist) to a cheap external host. Subcommands: hosts, deploy --host cloudflare-pages|s3|netlify [--spa] [--dry-run].",
430
452
  status: "wired",
431
- run: (e) => import("./staticCommand-xlSL-IWk.js").then((t) => t.runStaticCommand(e))
453
+ run: (e) => import("./staticCommand-ey0kYmOT.js").then((t) => t.runStaticCommand(e))
432
454
  },
433
455
  {
434
456
  name: "privacy",
435
457
  summary: "GDPR / DSAR tooling. scope [root] — derive the subject graph from the schema AND print what it cannot see. export <subjectId> --url <app> / erase <subjectId> --url <app> --confirm — run against the RUNNING app's admin-gated governance endpoint, so the erasure log and configured anonymize fields apply.",
436
458
  status: "wired",
437
- run: (e) => import("./privacyCommand-DWTQMC6R.js").then((t) => t.runPrivacyCommand(e)),
459
+ run: (e) => import("./privacyCommand-BCa2OoZG.js").then((t) => t.runPrivacyCommand(e)),
438
460
  help: {
439
- usage: e(n),
461
+ usage: e(t),
440
462
  examples: [
441
463
  ["voltro privacy scope --subject-table users", "every table a DSAR reaches, and every table it does not"],
442
464
  ["voltro privacy export usr_123 --url https://api.example.com", "the subject's portable bundle"],
@@ -453,9 +475,9 @@ var l = () => {
453
475
  name: "db",
454
476
  summary: "Database subcommands. Declarative flow: plan, apply, branch, plans, drift [--accept], squash, restore-snapshot. File migrations: generate [name], migrate, rollback, status, files, rollback-file. Data + housekeeping: seed, gc-snapshots, adopt. Credentials at rest: scan-credentials (find plaintext), encrypt-column (migrate a populated column onto .encrypted()).",
455
477
  status: "wired",
456
- run: (e) => import("./dbCommand-B1EXBC6f.js").then((t) => t.runDbCommand(e)),
478
+ run: (e) => import("./dbCommand-BTyBGhIA.js").then((t) => t.runDbCommand(e)),
457
479
  help: {
458
- usage: e(t),
480
+ usage: e(n),
459
481
  examples: [
460
482
  ["voltro db plan", "the diff between the declared schema and the live database"],
461
483
  ["voltro db apply", "apply that diff"],
@@ -469,9 +491,9 @@ var l = () => {
469
491
  name: "data",
470
492
  summary: "Export/import + backup/restore of app data. Logical (rows + optional assets): export <dir> [--tenant <id>|--tables a,b|--exclude a,b] [--assets] [--compression zstd|gzip|none] [--consistency live|snapshot]; import <dir> [--assets] [--no-verify]; transfers — the history in all four directions, including a run in flight; inspect <file|dir>; unpack <file> <dir>. Native (vendor dump, no resume): backup <dir> [--assets] / restore <dir> [--assets] (pg_dump/mariadb-dump/…) — a restore marks the database in-progress until it finishes. Recovery: clear-replace-marker, clear-staging. Resumable + typed-NDJSON on the logical path; content-addressed assets on both.",
471
493
  status: "wired",
472
- run: (e) => import("./dataCommand-Bab9X7s8.js").then((t) => t.runDataCommand(e)),
494
+ run: (e) => import("./dataCommand-BEPPQiTl.js").then((t) => t.runDataCommand(e)),
473
495
  help: {
474
- usage: e(r),
496
+ usage: e(i),
475
497
  flags: [
476
498
  ["--tenant <id>", "export one tenant's rows"],
477
499
  ["--tables <a,b>", "restrict to these tables"],
@@ -526,27 +548,27 @@ var l = () => {
526
548
  handlesHelp: !0,
527
549
  summary: "Generate strong secrets. `generate [purpose]` (data-transfer, session, bundle-key, field-encryption, …) emits the right var+format; `generate` alone prints a generic secret; `list` shows all. Encrypted per-env storage is in Voltro Cloud.",
528
550
  status: "wired",
529
- run: (e) => import("./metaCommands-Cn2oboG4.js").then((t) => t.runSecret(e))
551
+ run: (e) => import("./metaCommands-x7RCi2AF.js").then((t) => t.runSecret(e))
530
552
  },
531
553
  {
532
554
  name: "update",
533
555
  handlesHelp: !0,
534
556
  summary: "Upgrade the app to the latest framework: bump every @voltro/* dependency (across ALL workspace members, install once at the workspace root), then run the codemods shipped with the target version. Flags: --to <version>, --from <version>, --codemods-only, --dry-run, --force, --exact, --help. After: run `voltro db apply`.",
535
557
  status: "wired",
536
- run: (e) => import("./updateCommand-Bqql_rsQ.js").then((t) => t.runUpdateCommand(e))
558
+ run: (e) => import("./updateCommand-nnFjDbl4.js").then((t) => t.runUpdateCommand(e))
537
559
  },
538
560
  {
539
561
  name: "_apply-codemods",
540
562
  summary: "Internal: apply shipped codemods for a framework version jump (re-exec target of `voltro update`).",
541
563
  status: "wired",
542
564
  hidden: !0,
543
- run: (e) => import("./updateCommand-Bqql_rsQ.js").then((t) => t.runApplyCodemods(e))
565
+ run: (e) => import("./updateCommand-nnFjDbl4.js").then((t) => t.runApplyCodemods(e))
544
566
  },
545
567
  {
546
568
  name: "embeddings",
547
569
  summary: "Embeddings tooling. Subcommand: backfill <table> --text <field> --vector <field> [--model <m>] [--model-field <f>] [--batch <n>] [--dry-run] — (re)embed rows the vectorEmbedding() mixin missed.",
548
570
  status: "wired",
549
- run: (e) => import("./embeddingsCommand-C70zWHwo.js").then((t) => t.runEmbeddingsCommand(e)),
571
+ run: (e) => import("./embeddingsCommand-BoCqZsgp.js").then((t) => t.runEmbeddingsCommand(e)),
550
572
  help: {
551
573
  usage: "backfill <table> --text <field> --vector <field> [--model <m>] [--batch <n>] [--dry-run]",
552
574
  flags: [
@@ -564,7 +586,7 @@ var l = () => {
564
586
  name: "telemetry",
565
587
  summary: "Report telemetry status — Voltro collects none (no phone-home, nothing to opt out of).",
566
588
  status: "wired",
567
- run: (e) => import("./metaCommands-Cn2oboG4.js").then((t) => t.runTelemetry(e)),
589
+ run: (e) => import("./metaCommands-x7RCi2AF.js").then((t) => t.runTelemetry(e)),
568
590
  help: {
569
591
  usage: "",
570
592
  examples: [["voltro telemetry", "confirm what is collected: nothing"]],
@@ -579,7 +601,7 @@ var l = () => {
579
601
  name: "agents-md",
580
602
  summary: "Write the framework-tailored AGENTS.md into the project root (use --force to overwrite).",
581
603
  status: "wired",
582
- run: (e) => import("./agentsMd-SDDSkyl4.js").then((t) => t.runAgentsMd(e)),
604
+ run: (e) => import("./agentsMd-DCY1RSs8.js").then((t) => t.runAgentsMd(e)),
583
605
  help: {
584
606
  usage: "[--force]",
585
607
  flags: [["--force", "overwrite existing files (both AGENTS.md and CLAUDE.md)"]],
@@ -592,7 +614,7 @@ var l = () => {
592
614
  summary: "Ask a RUNNING app whether its declared access is enforced. `access` calls every guarded procedure with NO credentials and reports any that answer (--process, --url, --strict, --format).",
593
615
  status: "wired",
594
616
  handlesHelp: !0,
595
- run: (e) => import("./probeCommand-DkGGLknv.js").then((t) => t.runProbeCommand(e))
617
+ run: (e) => import("./probeCommand-Bs3iVBSL.js").then((t) => t.runProbeCommand(e))
596
618
  },
597
619
  {
598
620
  name: "schedule",
@@ -655,7 +677,7 @@ var l = () => {
655
677
  name: "login",
656
678
  summary: "Log in to Voltro Cloud — opens a browser (WorkOS) and returns to the CLI after success. Alias for `voltro cloud login`. `--token <t>` (or VOLTRO_CLOUD_TOKEN) for headless.",
657
679
  status: "wired",
658
- run: (e) => import("./cloudCmd-QUXh-b5w.js").then((t) => t.runCloudCommand(["login", ...e])),
680
+ run: (e) => import("./cloudCmd-DzKcSYuy.js").then((t) => t.runCloudCommand(["login", ...e])),
659
681
  help: {
660
682
  usage: "[--token <t>]",
661
683
  flags: [["--token <t>", "headless login with an existing token (or set VOLTRO_CLOUD_TOKEN)"]],
@@ -667,21 +689,21 @@ var l = () => {
667
689
  handlesHelp: !0,
668
690
  summary: "Control-plane client. Subcommands: login (browser/WorkOS), whoami, projects, project create, env list|set|pull, import, deploy, scan, rollback, register. Base url via VOLTRO_CLOUD_URL.",
669
691
  status: "wired",
670
- run: (e) => import("./cloudCmd-QUXh-b5w.js").then((t) => t.runCloudCommand(e))
692
+ run: (e) => import("./cloudCmd-DzKcSYuy.js").then((t) => t.runCloudCommand(e))
671
693
  },
672
694
  {
673
695
  name: "help",
674
696
  summary: "Print this help.",
675
697
  status: "wired",
676
- run: async (e) => (p(), 0)
698
+ run: async (e) => (m(), 0)
677
699
  },
678
700
  {
679
701
  name: "version",
680
702
  summary: "Print the voltro version.",
681
703
  status: "wired",
682
- run: async () => (console.log(l()), 0)
704
+ run: async () => (console.log(u()), 0)
683
705
  }
684
- ], d = [
706
+ ], f = [
685
707
  ["Start a project", [
686
708
  "init",
687
709
  "create-project",
@@ -695,6 +717,7 @@ var l = () => {
695
717
  ["Develop", [
696
718
  "dev",
697
719
  "codegen",
720
+ "mobile",
698
721
  "test",
699
722
  "typecheck",
700
723
  "e2e",
@@ -749,32 +772,32 @@ var l = () => {
749
772
  "info"
750
773
  ]],
751
774
  ["Meta", ["help", "version"]]
752
- ], f = (e, t = 68) => {
775
+ ], p = (e, t = 68) => {
753
776
  let n = e.search(/\.(\s|$)/), r = n > 0 ? e.slice(0, n) : e;
754
777
  return r.length <= t ? r : `${r.slice(0, t - 1).trimEnd()}…`;
755
- }, p = () => {
756
- let e = u.filter((e) => !e.hidden), t = new Map(e.map((e) => [e.name, e])), n = e.reduce((e, t) => Math.max(e, t.name.length), 0);
757
- console.log(`voltro v${l()}`), console.log("voltro <command> [args]");
758
- for (let [e, r] of d) {
778
+ }, m = () => {
779
+ let e = d.filter((e) => !e.hidden), t = new Map(e.map((e) => [e.name, e])), n = e.reduce((e, t) => Math.max(e, t.name.length), 0);
780
+ console.log(`voltro v${u()}`), console.log("voltro <command> [args]");
781
+ for (let [e, r] of f) {
759
782
  let i = r.map((e) => t.get(e)).filter((e) => e !== void 0);
760
783
  if (i.length !== 0) {
761
784
  console.log(`\n${e}`);
762
785
  for (let e of i) {
763
786
  let t = " ".repeat(n - e.name.length + 2);
764
- console.log(` ${e.name}${t}${f(e.summary)}`);
787
+ console.log(` ${e.name}${t}${p(e.summary)}`);
765
788
  }
766
789
  }
767
790
  }
768
- let r = new Set(d.flatMap(([, e]) => e)), i = e.filter((e) => !r.has(e.name));
791
+ let r = new Set(f.flatMap(([, e]) => e)), i = e.filter((e) => !r.has(e.name));
769
792
  if (i.length > 0) {
770
793
  console.log("\nOther");
771
794
  for (let e of i) {
772
795
  let t = " ".repeat(n - e.name.length + 2);
773
- console.log(` ${e.name}${t}${f(e.summary)}`);
796
+ console.log(` ${e.name}${t}${p(e.summary)}`);
774
797
  }
775
798
  }
776
799
  console.log("\nRun 'voltro <command> --help' for the full description, or see https://voltro.dev/docs/cli.");
777
- }, m = (e, t) => {
800
+ }, h = (e, t) => {
778
801
  let n = Array.from({ length: t.length + 1 }, (e, t) => t), r = Array(t.length + 1).fill(0);
779
802
  for (let i = 1; i <= e.length; i++) {
780
803
  r[0] = i;
@@ -785,13 +808,13 @@ var l = () => {
785
808
  for (let e = 0; e <= t.length; e++) n[e] = r[e];
786
809
  }
787
810
  return n[t.length];
788
- }, h = (e, t = 3) => {
789
- let n = u.filter((e) => !e.hidden).map((e) => e.name), r = e.length <= 4 ? 1 : e.length <= 8 ? 2 : 3;
811
+ }, g = (e, t = 3) => {
812
+ let n = d.filter((e) => !e.hidden).map((e) => e.name), r = e.length <= 4 ? 1 : e.length <= 8 ? 2 : 3;
790
813
  return n.map((t) => ({
791
814
  name: t,
792
- score: t.startsWith(e) || e.startsWith(t) ? -2 : t.includes(e) ? -1 : m(e, t)
815
+ score: t.startsWith(e) || e.startsWith(t) ? -2 : t.includes(e) ? -1 : h(e, t)
793
816
  })).filter((e) => e.score <= r).sort((e, t) => e.score - t.score || e.name.localeCompare(t.name)).slice(0, t).map((e) => e.name);
794
- }, g = (e) => {
817
+ }, _ = (e) => {
795
818
  let t = [`voltro ${e.name} — ${e.summary}`], n = e.help, r = (e) => {
796
819
  let t = e.reduce((e, [t]) => Math.max(e, t.length), 0);
797
820
  return e.map(([e, n]) => ` ${e}${" ".repeat(t - e.length + 2)}${n}`);
@@ -801,26 +824,26 @@ var l = () => {
801
824
  for (let [e, r] of n.examples) t.push(` ${e}`, ` ${r}`);
802
825
  }
803
826
  return n?.notes !== void 0 && n.notes.length > 0 && t.push("", ...n.notes), t.push("", `Docs: https://voltro.dev/docs/cli/${e.name}`), t;
804
- }, _ = /* @__PURE__ */ new Set(["--help", "-h"]), v = async (e) => {
827
+ }, v = /* @__PURE__ */ new Set(["--help", "-h"]), y = async (e) => {
805
828
  let [t, ...n] = e;
806
- if (!t || _.has(t)) return p(), 0;
807
- if (t === "--version" || t === "-v") return console.log(l()), 0;
808
- if (t === "help" && n.length > 0 && !n[0].startsWith("-")) return v([n[0], "--help"]);
809
- let r = u.find((e) => e.name === t);
829
+ if (!t || v.has(t)) return m(), 0;
830
+ if (t === "--version" || t === "-v") return console.log(u()), 0;
831
+ if (t === "help" && n.length > 0 && !n[0].startsWith("-")) return y([n[0], "--help"]);
832
+ let r = d.find((e) => e.name === t);
810
833
  if (!r) {
811
834
  console.error(`voltro: unknown command '${t}'`);
812
- let e = h(t);
835
+ let e = g(t);
813
836
  if (e.length > 0) {
814
837
  console.error(`\nDid you mean${e.length > 1 ? " one of" : ""}?`);
815
838
  for (let t of e) console.error(` voltro ${t}`);
816
839
  }
817
840
  return console.error("\nrun 'voltro help' for available commands"), 2;
818
841
  }
819
- if (!r.handlesHelp && n.some((e) => _.has(e))) {
820
- for (let e of g(r)) console.log(e);
842
+ if (!r.handlesHelp && n.some((e) => v.has(e))) {
843
+ for (let e of _(r)) console.log(e);
821
844
  return 0;
822
845
  }
823
846
  return r.run(n);
824
847
  };
825
848
  //#endregion
826
- export { g as a, p as i, d as n, h as o, v as r, u as t };
849
+ export { _ as a, m as i, f as n, g as o, y as r, d as t };
@@ -1,6 +1,6 @@
1
- import { f as e } from "./dev-C6LGF4iY.js";
2
- import { W as t, q as n } from "./webDev-oczpugbx.js";
3
- import { t as r } from "./start-ekPan8BT.js";
1
+ import { f as e } from "./dev-Ca_A_S9v.js";
2
+ import { Z as t, et as n } from "./webDev-B7vNj4Bq.js";
3
+ import { t as r } from "./start-EOV7s1NZ.js";
4
4
  import { join as i } from "node:path";
5
5
  import { existsSync as a } from "node:fs";
6
6
  import { createLogger as o } from "@voltro/logger";