@voltro/cli 0.34.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 (137) hide show
  1. package/CHANGELOG.md +167 -0
  2. package/dist/apiBuild-B8aoJvuw.js +2 -0
  3. package/dist/{apiBuild-DZF_f0_I.js → apiBuild-DYD_ONLD.js} +2 -2
  4. package/dist/{appGraph-gQ_6GkQQ.js → appGraph-KGDPTuTy.js} +1 -1
  5. package/dist/appGraph-zuMGKVYX.js +2 -0
  6. package/dist/bin.js +1 -1
  7. package/dist/{build-CE7Ca9gm.js → build-CD8K4XOr.js} +7 -7
  8. package/dist/{checkCommand-Dv8r9tGO.js → checkCommand-Ct9xkTrS.js} +8 -7
  9. package/dist/{checkCommand-YZDmkAGd.js → checkCommand-DKpDLlqu.js} +1 -1
  10. package/dist/{clusterCmd-CNXKlcvD.js → clusterCmd-D5wsCmA_.js} +1 -1
  11. package/dist/{codegenCommand-DC6w2tNZ.js → codegenCommand-C4YoQIc2.js} +3 -3
  12. package/dist/{codemodRunner-DRRqXR74.js → codemodRunner-BnFq3Fgu.js} +175 -34
  13. package/dist/{commands-gutsz-Ac.js → commands-BE8E7zF3.js} +37 -29
  14. package/dist/{dashboardCommand-3YG8p-UA.js → dashboardCommand-D7SgZGaN.js} +3 -3
  15. package/dist/{dataCommand-qL0r7fPO.js → dataCommand-BhYwDgg-.js} +56 -54
  16. package/dist/dbCommand-DS4b97Is.js +2 -0
  17. package/dist/{dbCommand-B6X0FZbq.js → dbCommand-O8HA63s2.js} +6 -6
  18. package/dist/{dev-CerMd0mW.js → dev-C7sFZq3m.js} +2696 -2188
  19. package/dist/{dev-CoG-ZPx8.js → dev-D2BikO7a.js} +1 -1
  20. package/dist/doctorCommand-CM4Ch9C7.js +2 -0
  21. package/dist/{doctorCommand-CnDXQxfa.js → doctorCommand-DnimF5IM.js} +76 -73
  22. package/dist/{dormancyCommand-Dszo57d6.js → dormancyCommand-QewYug_s.js} +1 -1
  23. package/dist/{embeddingsCommand-C0sKVRo1.js → embeddingsCommand-BfiLS_QI.js} +1 -1
  24. package/dist/{envCommand-DPgdV1Bq.js → envCommand-CCGPRQY1.js} +2 -2
  25. package/dist/{evolveCommand-DHpkgjgH.js → evolveCommand-CHsLCtDf.js} +2 -2
  26. package/dist/frameworkTableAssembly-YyVe32Cb.js +2 -0
  27. package/dist/frameworkTableAssembly-oMPBKqlE.js +511 -0
  28. package/dist/{generateCommand-oibemh97.js → generateCommand-DbgcUpGw.js} +1 -1
  29. package/dist/index.js +1 -1
  30. package/dist/{infoCommand-BJw9nLUR.js → infoCommand-DwOgK1t6.js} +1 -1
  31. package/dist/{inspect-CBqFtAKA.js → inspect-CjTYzAs_.js} +32 -2
  32. package/dist/inspect-P4pxoMaV.js +2 -0
  33. package/dist/{inspectCmd-Bppy-GGw.js → inspectCmd-EHFZ9yYu.js} +1 -1
  34. package/dist/{inspectFetch-Cm8_wVvp.js → inspectFetch-EMuhTG_9.js} +1 -1
  35. package/dist/{logsCmd-CCca3KRZ.js → logsCmd-D36xK7Zu.js} +1 -1
  36. package/dist/manifestBuild-COkJoyAr.js +2 -0
  37. package/dist/{manifestBuild-sxpwdKY1.js → manifestBuild-hpPLaGxV.js} +1 -1
  38. package/dist/{migrate-CBwOt_iV.js → migrate-BV7I-ZHZ.js} +3 -3
  39. package/dist/probeCommand-CZfaaUOZ.js +122 -0
  40. package/dist/{runtimeTrace-CRxalXTs.js → runtimeTrace-CH3eUiMw.js} +1 -1
  41. package/dist/scheduleCmd-DQRu6BZC.js +149 -0
  42. package/dist/{sdkgen-CYJscZC7.js → sdkgen-BLkvGRfX.js} +1 -1
  43. package/dist/{seedRunner-TFHHiToI.js → seedRunner-ZmLSqNe2.js} +74 -70
  44. package/dist/serveCommand-CbDHU6l-.js +2 -0
  45. package/dist/serveCommand-iwlUBNS1.js +1766 -0
  46. package/dist/serveEntry.js +1 -1
  47. package/dist/{start-B-9Nsp-S.js → start-BgN62boB.js} +1 -1
  48. package/dist/{start-9LiUOfES.js → start-T4VesWiM.js} +2 -2
  49. package/dist/startEntry.js +1 -1
  50. package/dist/{tracesCmd-CkEZQrtt.js → tracesCmd-DStmCJPi.js} +1 -1
  51. package/dist/updateCommand-BlMZhWgO.js +2 -0
  52. package/dist/{updateCommand-Bkptutss.js → updateCommand-x0pI_x-B.js} +1 -1
  53. package/dist/webDev-BcykISYQ2.js +2 -0
  54. package/dist/{webDev-CBYvPqQr.js → webDev-Dybxew86.js} +14 -2
  55. package/dist/{webhooksCommand-CID96Rga.js → webhooksCommand-DlAgS2Iw.js} +1 -1
  56. package/dist/{workflowsCmd-D1VTmLMY.js → workflowsCmd-BGF-mRZ5.js} +1 -1
  57. package/package.json +47 -17
  58. package/templates/AGENTS.md +1 -1
  59. package/templates/agent-docs/_index.md +1 -1
  60. package/templates/agent-docs/_manifest.json +1 -1
  61. package/templates/agent-docs/authentication.md +55 -7
  62. package/templates/agent-docs/cli.md +59 -0
  63. package/templates/agent-docs/data.md +59 -2
  64. package/templates/agent-docs/database/migrations.md +50 -1
  65. package/templates/agent-docs/deployment.md +214 -21
  66. package/templates/agent-docs/introduction.md +1 -1
  67. package/templates/agent-docs/multi-tenancy.md +93 -22
  68. package/templates/agent-docs/plugins/ai-flows.md +86 -0
  69. package/templates/agent-docs/plugins/billing.md +1 -1
  70. package/templates/agent-docs/plugins/clickhouse.md +31 -0
  71. package/templates/agent-docs/plugins/search.md +6 -3
  72. package/templates/agent-docs/plugins/storage.md +11 -0
  73. package/templates/agent-docs/plugins.md +3 -1
  74. package/templates/agent-docs/scheduling.md +17 -0
  75. package/templates/agent-docs/security.md +2 -2
  76. package/templates/agent-docs/whats-new.md +95 -1729
  77. package/templates/agent-docs/workflows.md +101 -0
  78. package/templates/apps/api-ai/package.json +7 -7
  79. package/templates/apps/api-auth/package.json +8 -8
  80. package/templates/apps/api-backend/package.json +7 -7
  81. package/templates/apps/api-backend-deactivation/package.json +7 -7
  82. package/templates/apps/api-backend-mail/package.json +8 -8
  83. package/templates/apps/api-backend-mariadb/package.json +9 -9
  84. package/templates/apps/api-backend-sqlite/package.json +8 -8
  85. package/templates/apps/api-backend-storage/package.json +8 -8
  86. package/templates/apps/api-cms/package.json +10 -10
  87. package/templates/apps/api-collab/package.json +8 -8
  88. package/templates/apps/api-data-advanced/package.json +8 -8
  89. package/templates/apps/api-durable/package.json +8 -8
  90. package/templates/apps/api-feature-flags/package.json +9 -9
  91. package/templates/apps/api-governance/package.json +8 -8
  92. package/templates/apps/api-kv/package.json +8 -8
  93. package/templates/apps/api-moderation/package.json +8 -8
  94. package/templates/apps/api-observability/package.json +8 -8
  95. package/templates/apps/api-ratelimit/package.json +8 -8
  96. package/templates/apps/api-rbac/package.json +8 -8
  97. package/templates/apps/api-rest/package.json +7 -7
  98. package/templates/apps/api-saas/package.json +11 -11
  99. package/templates/apps/api-saas-starter/package.json +10 -10
  100. package/templates/apps/api-search/package.json +8 -8
  101. package/templates/apps/api-status/package.json +8 -8
  102. package/templates/apps/api-versioning/package.json +8 -8
  103. package/templates/apps/api-webhooks/package.json +9 -9
  104. package/templates/apps/changelog/package.json +6 -6
  105. package/templates/apps/edge-functions/package.json +2 -2
  106. package/templates/apps/frontend-admin/package.json +8 -8
  107. package/templates/apps/frontend-app/package.json +9 -9
  108. package/templates/apps/frontend-auth/package.json +8 -8
  109. package/templates/apps/frontend-blank/package.json +7 -7
  110. package/templates/apps/frontend-cms/package.json +9 -9
  111. package/templates/apps/frontend-collab/package.json +10 -10
  112. package/templates/apps/frontend-contact/package.json +7 -7
  113. package/templates/apps/frontend-dashboard/package.json +7 -7
  114. package/templates/apps/frontend-docs/package.json +7 -7
  115. package/templates/apps/frontend-i18n/package.json +6 -6
  116. package/templates/apps/frontend-landing/package.json +7 -7
  117. package/templates/apps/frontend-portal/package.json +8 -8
  118. package/templates/apps/frontend-saas/package.json +8 -8
  119. package/templates/apps/frontend-spa/package.json +7 -7
  120. package/templates/apps/frontend-ssr/package.json +7 -7
  121. package/templates/apps/frontend-ssr-api/package.json +8 -8
  122. package/templates/apps/frontend-static-blog/package.json +6 -6
  123. package/templates/apps/frontend-status/package.json +8 -8
  124. package/templates/apps/mobile-app/package.json +3 -3
  125. package/dist/apiBuild-BICVGnEC.js +0 -2
  126. package/dist/appGraph-CvQCte0z.js +0 -2
  127. package/dist/dbCommand-CpdKLeQq.js +0 -2
  128. package/dist/doctorCommand-BvqGBwNG.js +0 -2
  129. package/dist/frameworkTableAssembly-BGHmck-x.js +0 -2
  130. package/dist/frameworkTableAssembly-DkkP6BgC.js +0 -674
  131. package/dist/inspect-C_T_WGvl.js +0 -2
  132. package/dist/manifestBuild-ChsKAhmn.js +0 -2
  133. package/dist/scheduleCmd--jksTrf6.js +0 -69
  134. package/dist/serveCommand-B_isw7q4.js +0 -1647
  135. package/dist/serveCommand-DOvbgRnQ.js +0 -2
  136. package/dist/updateCommand-us1_hdIC.js +0 -2
  137. package/dist/webDev-Cg-fFiyd2.js +0 -2
@@ -1512,7 +1512,8 @@ The mirror is **opt-in** (omit `mirrorTables` → events-only) and **idempotent*
1512
1512
 
1513
1513
  - **Retried, not dropped.** A failing mirror write is retried with exponential backoff (`retryAttempts`, default 5). A write that outlives its retries is queued for **repair**: a timer re-reads the row's *current* state from your database and re-applies it, so the mirror converges on the truth rather than on a stale change that happened to be in flight.
1514
1514
  - **Ordered per row.** Writes for the same primary key are applied one at a time, in commit order, and every write carries a **version** stamped when the change left the store — never a clock read inside the warehouse client. A change that arrives late therefore *loses*: ClickHouse's `ReplacingMergeTree(version)` keeps the highest version, and the DuckDB / postgres mirrors apply the update only when the incoming version is newer. Different rows are still mirrored concurrently.
1515
- - **A delete is a tombstone, not a row removal.** Filter `is_deleted = false` (`is_deleted = 0` / `FINAL` on ClickHouse). A physical delete would leave nothing for a late, stale insert of the same key to lose against — the row would silently come back.
1515
+ - **A delete is a tombstone, not a row removal.** Filter `is_deleted = false` (`is_deleted = 0` / `FINAL` on ClickHouse). A physical delete would leave nothing for a late, stale insert of the same key to lose against — the row would silently come back. The tombstone also keeps its version, which is what lets a replacement replica seed a key's numbering after a delete.
1516
+ - **N replicas converge to ONE row per change.** Under postgres CDC / mysql binlog every replica observes every change and mirrors it, so a change is written N times — but the version is derived from the CHANGE (the warehouse's own high-water mark for the key, plus the change's position in the fleet stream), never from a replica's clock. The N duplicates are byte-identical, and the sink's version guard collapses them for free: no leader election, and no clock-skew window in which an older image could out-version a newer one. A replica that boots mid-stream reads each key's high-water mark from the warehouse before its first write, so it continues the fleet's numbering instead of restarting it.
1516
1517
  - **Never surfaces to the request.** The OLTP write that produced the change has already committed; a warehouse outage is isolated into the log channel and the metrics below.
1517
1518
  - **A graceful shutdown is not a crash.** On SIGINT / SIGTERM the mirror stops taking new changes and then **settles** what is already queued and in flight, before the sink itself is disposed. That drain is bounded (3 s of the teardown budget you set with `VOLTRO_SHUTDOWN_GRACE_MS`, default 10 s): a warehouse that has stopped answering cannot hold the process open until the orchestrator's SIGKILL, which would lose strictly more. The two outcomes log differently — `analytics mirror drained` at info, or a `warn` naming what was still pending when the deadline cut it, because that is the moment those counters can still be read.
1518
1519
  - **Not durable across a crash.** The repair queue lives in memory. A change still awaiting repair when the process dies — SIGKILL, an OOM, a host failure — is lost, as is one evicted after `repairQueueLimit`. Both are logged at error level and counted by `voltro_analytics_mirror_dropped_total` — if that counter is non-zero, the affected tables need a re-seed.
@@ -1530,6 +1531,7 @@ Every number the mirror picks on your behalf has a default and an environment ov
1530
1531
  | `VOLTRO_ANALYTICS_MIRROR_RETRY_MAX_MS` | `30000` | Ceiling for the doubling backoff. |
1531
1532
  | `VOLTRO_ANALYTICS_MIRROR_REPAIR_INTERVAL_MS` | `60000` | How often the repair loop re-drives exhausted changes (`0` disables it). |
1532
1533
  | `VOLTRO_ANALYTICS_MIRROR_REPAIR_QUEUE_LIMIT` | `10000` | Maximum keys held for repair before the oldest is dropped and counted. |
1534
+ | `VOLTRO_ANALYTICS_MIRROR_VERSION_STATE_LIMIT` | `100000` | Maximum keys whose fleet-scope version state stays in memory; an evicted key re-seeds from the warehouse on its next change. |
1533
1535
 
1534
1536
  ## Default — no sink configured
1535
1537
 
@@ -569,6 +569,23 @@ Backfill runs **before** the live timer is armed, so a caught-up firing never ra
569
569
 
570
570
  Missed slots recorded under `latest` show up in the dashboard with the `missed` status — visible evidence of the gap, not a silent hole.
571
571
 
572
+ ## Backfilling an explicit range — `voltro schedule backfill`
573
+
574
+ Boot backfill only walks forward from the **last recorded run**, and cluster-cron coordination caps its own catch-up at one day. A longer outage — or a schedule added after the fact that should have "always existed" — needs an explicit operator instruction naming the range:
575
+
576
+ ```sh
577
+ voltro schedule backfill hourly-sync --from 2026-08-10T00:00:00Z --to 2026-08-12T00:00:00Z
578
+ ```
579
+
580
+ Every cron occurrence in `(from, to]` fires **sequentially, in order, each against its own cron-derived `scheduledAt`** — a handler (or a `workflow:` payload function) reading `ctx.scheduledAt` computes against its slot, not "now". Firings record as `trigger: 'manual'` in `_voltro_schedule_runs`, so the catch-up is a legible ledger; a failed slot records its failure and the next slot still fires.
581
+
582
+ The verb is **bounded and confirmable**, because a range verb that can enqueue 100k runs is an outage generator:
583
+
584
+ - Above **25** occurrences it refuses and prints the count — re-run with `--yes` after reading the number.
585
+ - Above the per-request cap (default **1,000**, raisable with `--limit` up to a hard ceiling of 10,000) it refuses outright, firing **nothing** — never a silent prefix that reports completeness. Run bigger catch-ups in slices.
586
+
587
+ The same verb is `POST /_voltro/inspect/schedules/:name/backfill` with `{ "from", "to", "confirm", "limit" }` (a refusal answers `409` with the count and reason), on `voltro dev` and `voltro serve` alike — it needs the inspect surface open (`VOLTRO_INSPECT_TOKEN`).
588
+
572
589
 
573
590
 
574
591
  ---
@@ -47,8 +47,8 @@ as protection and enforces nothing.
47
47
  The whole app can opt out with one field — `security: { defaultDeny: false }` in
48
48
  `app.config.ts`. There is no environment variable for it: the only direction
49
49
  anyone reaches for is off, and an env var is how that becomes permanent in one CI
50
- job with no diff to review. Full detail, including what the gate does not cover
51
- (a plugin's own procedures), in
50
+ job with no diff to review. Full detail including how plugin routes are
51
+ covered per-request in the dispatch spine rather than by the boot gate — in
52
52
  [Authorization](/docs/authentication/authorization).
53
53
 
54
54
  ## Outbound HTTP is SSRF-guarded by default