@voltro/cli 0.30.1 → 0.31.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.
- package/CHANGELOG.md +163 -0
- package/dist/apiBuild-BOqL1dlg.js +2 -0
- package/dist/{apiBuild-DmkzRyv7.js → apiBuild-CLPt-pX6.js} +2 -2
- package/dist/appGraph-CvQCte0z.js +2 -0
- package/dist/appGraph-gQ_6GkQQ.js +110 -0
- package/dist/bin.js +3 -3
- package/dist/checkCommand-ClRvH_SN.js +2 -0
- package/dist/{checkCommand-C4konUy9.js → checkCommand-D7r6_pk7.js} +439 -530
- package/dist/{commands-BkJft9K2.js → commands-CNVVv03h.js} +1941 -1880
- package/dist/{dbCommand-qn__kLEt.js → dbCommand-BH8GAYuf.js} +76 -19
- package/dist/dbCommand-BwQ_Jl98.js +2 -0
- package/dist/{dev-DXhhZ7-f.js → dev-DOZVMVfi.js} +1 -1
- package/dist/{dev-C_NPcLDp.js → dev-DdQEn2Ia.js} +1986 -1967
- package/dist/{frameworkTableAssembly-Cpgn2e88.js → frameworkTableAssembly-BwIrO5nv.js} +122 -103
- package/dist/frameworkTableAssembly-D-EebUQX.js +2 -0
- package/dist/index.js +1 -1
- package/dist/{inspectMetrics-CkB2J0Zn.js → inspectMetrics-BeEAnjqw.js} +774 -527
- package/dist/{sdkgen-wsWLrq4l.js → sdkgen-v9WV8zRi.js} +1 -1
- package/dist/{serveCommand-HtI4X5kj.js → serveCommand-KsKXXWn4.js} +294 -293
- package/dist/serveEntry.js +2 -2
- package/dist/{start-egkbpugc.js → start-CI2QdKy9.js} +351 -346
- package/dist/startEntry.js +2 -2
- package/package.json +17 -17
- package/templates/AGENTS.md +43 -43
- package/templates/agent-docs/_index.md +43 -43
- package/templates/agent-docs/_manifest.json +84 -42
- package/templates/agent-docs/cli.md +4 -2
- package/templates/agent-docs/database/migrations.md +14 -1
- package/templates/agent-docs/internationalization.md +54 -3
- package/templates/agent-docs/plugins/ai-flows.md +148 -0
- package/templates/agent-docs/plugins/analytics-postgres.md +90 -0
- package/templates/agent-docs/plugins/atlassian.md +378 -0
- package/templates/agent-docs/plugins/audit.md +324 -0
- package/templates/agent-docs/plugins/auth-auth0.md +92 -0
- package/templates/agent-docs/plugins/auth-clerk.md +90 -0
- package/templates/agent-docs/plugins/auth-kinde.md +88 -0
- package/templates/agent-docs/plugins/auth-oidc.md +95 -0
- package/templates/agent-docs/plugins/auth-supabase.md +103 -0
- package/templates/agent-docs/plugins/auth-workos.md +105 -0
- package/templates/agent-docs/plugins/auth.md +227 -0
- package/templates/agent-docs/plugins/billing.md +324 -0
- package/templates/agent-docs/plugins/broadcast.md +144 -0
- package/templates/agent-docs/plugins/cdc-out.md +116 -0
- package/templates/agent-docs/plugins/clickhouse.md +91 -0
- package/templates/agent-docs/plugins/datadog.md +105 -0
- package/templates/agent-docs/plugins/deactivation.md +114 -0
- package/templates/agent-docs/plugins/duckdb.md +82 -0
- package/templates/agent-docs/plugins/flags.md +146 -0
- package/templates/agent-docs/plugins/governance.md +143 -0
- package/templates/agent-docs/plugins/licensing.md +74 -0
- package/templates/agent-docs/plugins/logship.md +56 -0
- package/templates/agent-docs/plugins/mail.md +334 -0
- package/templates/agent-docs/plugins/moderation.md +65 -0
- package/templates/agent-docs/plugins/multitenancy.md +99 -0
- package/templates/agent-docs/plugins/notifications.md +252 -0
- package/templates/agent-docs/plugins/openapi.md +94 -0
- package/templates/agent-docs/plugins/postgis.md +140 -0
- package/templates/agent-docs/plugins/posthog.md +91 -0
- package/templates/agent-docs/plugins/presence.md +115 -0
- package/templates/agent-docs/plugins/prometheus.md +124 -0
- package/templates/agent-docs/plugins/ratelimit.md +274 -0
- package/templates/agent-docs/plugins/rbac.md +270 -0
- package/templates/agent-docs/plugins/scim.md +63 -0
- package/templates/agent-docs/plugins/search.md +116 -0
- package/templates/agent-docs/plugins/sentry.md +192 -0
- package/templates/agent-docs/plugins/soft-delete.md +72 -0
- package/templates/agent-docs/plugins/sso-saml.md +132 -0
- package/templates/agent-docs/plugins/storage.md +709 -0
- package/templates/agent-docs/plugins/tinybird.md +92 -0
- package/templates/agent-docs/plugins/versioning.md +226 -0
- package/templates/agent-docs/plugins/webhooks.md +585 -0
- package/templates/agent-docs/security.md +12 -1
- package/templates/agent-docs/whats-new.md +81 -37
- package/templates/apps/api-ai/package.json +7 -7
- package/templates/apps/api-auth/package.json +8 -8
- package/templates/apps/api-backend/package.json +7 -7
- package/templates/apps/api-backend-deactivation/package.json +7 -7
- package/templates/apps/api-backend-mail/package.json +8 -8
- package/templates/apps/api-backend-mariadb/package.json +9 -9
- package/templates/apps/api-backend-sqlite/package.json +8 -8
- package/templates/apps/api-backend-storage/package.json +8 -8
- package/templates/apps/api-cms/package.json +10 -10
- package/templates/apps/api-collab/package.json +8 -8
- package/templates/apps/api-data-advanced/package.json +8 -8
- package/templates/apps/api-durable/package.json +8 -8
- package/templates/apps/api-feature-flags/package.json +9 -9
- package/templates/apps/api-governance/package.json +8 -8
- package/templates/apps/api-kv/package.json +8 -8
- package/templates/apps/api-moderation/package.json +8 -8
- package/templates/apps/api-observability/package.json +8 -8
- package/templates/apps/api-ratelimit/package.json +8 -8
- package/templates/apps/api-rbac/package.json +8 -8
- package/templates/apps/api-rest/package.json +7 -7
- package/templates/apps/api-saas/package.json +11 -11
- package/templates/apps/api-saas-starter/package.json +10 -10
- package/templates/apps/api-search/package.json +8 -8
- package/templates/apps/api-status/package.json +8 -8
- package/templates/apps/api-versioning/package.json +8 -8
- package/templates/apps/api-webhooks/package.json +9 -9
- package/templates/apps/changelog/package.json +6 -6
- package/templates/apps/edge-functions/package.json +2 -2
- package/templates/apps/frontend-admin/package.json +8 -8
- package/templates/apps/frontend-app/package.json +8 -8
- package/templates/apps/frontend-auth/package.json +8 -8
- package/templates/apps/frontend-blank/package.json +7 -7
- package/templates/apps/frontend-cms/package.json +9 -9
- package/templates/apps/frontend-collab/package.json +9 -9
- package/templates/apps/frontend-contact/package.json +7 -7
- package/templates/apps/frontend-dashboard/package.json +7 -7
- package/templates/apps/frontend-docs/package.json +7 -7
- package/templates/apps/frontend-i18n/package.json +6 -6
- package/templates/apps/frontend-landing/package.json +7 -7
- package/templates/apps/frontend-portal/package.json +8 -8
- package/templates/apps/frontend-saas/package.json +8 -8
- package/templates/apps/frontend-spa/package.json +7 -7
- package/templates/apps/frontend-ssr/package.json +7 -7
- package/templates/apps/frontend-ssr-api/package.json +8 -8
- package/templates/apps/frontend-static-blog/package.json +6 -6
- package/templates/apps/frontend-status/package.json +8 -8
- package/templates/apps/mobile-app/package.json +2 -2
- package/dist/apiBuild-Ca6Sq5jy.js +0 -2
- package/dist/checkCommand-DHD0aBeR.js +0 -2
- package/dist/dbCommand-wfGi3FgG.js +0 -2
- package/dist/frameworkTableAssembly-Bn_c4Mnl.js +0 -2
|
@@ -341,294 +341,336 @@
|
|
|
341
341
|
"title": "AI Flows",
|
|
342
342
|
"description": "Durable multi-step AI pipelines — deterministic or agentic, with human-in-the-loop, chaining, and cadence. Author flows in code (defineFlow) or as data (visual-editor rows); one engine runs both.",
|
|
343
343
|
"pkg": "@voltro/plugin-ai-flows",
|
|
344
|
-
"doc": "plugins/ai-flows.md"
|
|
344
|
+
"doc": "plugins/ai-flows.md",
|
|
345
|
+
"module": "agent-docs/plugins/ai-flows.md"
|
|
345
346
|
},
|
|
346
347
|
{
|
|
347
348
|
"slug": "analytics-postgres",
|
|
348
349
|
"title": "Postgres analytics",
|
|
349
350
|
"description": "First-party lite AnalyticsSink — stores events in the main DataStore, cross-dialect, zero external infra. ~10M events/day ceiling.",
|
|
350
351
|
"pkg": "@voltro/plugin-analytics-postgres",
|
|
351
|
-
"doc": "plugins/analytics-postgres.md"
|
|
352
|
+
"doc": "plugins/analytics-postgres.md",
|
|
353
|
+
"module": "agent-docs/plugins/analytics-postgres.md"
|
|
352
354
|
},
|
|
353
355
|
{
|
|
354
356
|
"slug": "atlassian",
|
|
355
357
|
"title": "Atlassian",
|
|
356
358
|
"description": "JiraService + ConfluenceService over the Atlassian REST / Greenhopper / Agile APIs, with a per-subject PAT resolver, transient retry, SSRF guard, an avatar proxy, and per-tenant caching.",
|
|
357
359
|
"pkg": "@voltro/plugin-atlassian",
|
|
358
|
-
"doc": "plugins/atlassian.md"
|
|
360
|
+
"doc": "plugins/atlassian.md",
|
|
361
|
+
"module": "agent-docs/plugins/atlassian.md"
|
|
359
362
|
},
|
|
360
363
|
{
|
|
361
364
|
"slug": "audit",
|
|
362
365
|
"title": "Audit",
|
|
363
366
|
"description": "Mutation audit log — sinks (console/memory/custom), include/exclude filters, the audit() mixin, testing with the memory buffer.",
|
|
364
367
|
"pkg": "@voltro/plugin-audit",
|
|
365
|
-
"doc": "plugins/audit.md"
|
|
368
|
+
"doc": "plugins/audit.md",
|
|
369
|
+
"module": "agent-docs/plugins/audit.md"
|
|
366
370
|
},
|
|
367
371
|
{
|
|
368
372
|
"slug": "auth",
|
|
369
373
|
"title": "Auth",
|
|
370
374
|
"description": "Password + session-cookie auth — overview. Full docs in the Authentication section.",
|
|
371
375
|
"pkg": "@voltro/plugin-auth",
|
|
372
|
-
"doc": "plugins/auth.md"
|
|
376
|
+
"doc": "plugins/auth.md",
|
|
377
|
+
"module": "agent-docs/plugins/auth.md"
|
|
373
378
|
},
|
|
374
379
|
{
|
|
375
380
|
"slug": "auth-auth0",
|
|
376
381
|
"title": "Auth0",
|
|
377
382
|
"description": "Auth0 AuthStrategy — verifies Auth0-issued JWTs via the tenant's JWKS (no client secret) and maps a namespaced custom claim → tenantId.",
|
|
378
383
|
"pkg": "@voltro/plugin-auth-auth0",
|
|
379
|
-
"doc": "plugins/auth-auth0.md"
|
|
384
|
+
"doc": "plugins/auth-auth0.md",
|
|
385
|
+
"module": "agent-docs/plugins/auth-auth0.md"
|
|
380
386
|
},
|
|
381
387
|
{
|
|
382
388
|
"slug": "auth-clerk",
|
|
383
389
|
"title": "Clerk",
|
|
384
390
|
"description": "Clerk AuthStrategy — verifies Clerk-issued __session JWTs via the Frontend API JWKS (no secret key) and maps org_id → tenantId.",
|
|
385
391
|
"pkg": "@voltro/plugin-auth-clerk",
|
|
386
|
-
"doc": "plugins/auth-clerk.md"
|
|
392
|
+
"doc": "plugins/auth-clerk.md",
|
|
393
|
+
"module": "agent-docs/plugins/auth-clerk.md"
|
|
387
394
|
},
|
|
388
395
|
{
|
|
389
396
|
"slug": "auth-kinde",
|
|
390
397
|
"title": "Kinde",
|
|
391
398
|
"description": "Kinde AuthStrategy — verifies Kinde-issued JWTs via JWKS at the configured issuer (no client secret) and maps org_code → tenantId.",
|
|
392
399
|
"pkg": "@voltro/plugin-auth-kinde",
|
|
393
|
-
"doc": "plugins/auth-kinde.md"
|
|
400
|
+
"doc": "plugins/auth-kinde.md",
|
|
401
|
+
"module": "agent-docs/plugins/auth-kinde.md"
|
|
394
402
|
},
|
|
395
403
|
{
|
|
396
404
|
"slug": "auth-oidc",
|
|
397
405
|
"title": "OIDC (generic)",
|
|
398
406
|
"description": "Generic OIDC AuthStrategy — verifies any OpenID-Connect IdP's JWTs via JWKS (Okta, Keycloak, Cognito, Azure AD, Google Workspace). Discovery or explicit JWKS URL; maps a claim → tenantId.",
|
|
399
407
|
"pkg": "@voltro/plugin-auth-oidc",
|
|
400
|
-
"doc": "plugins/auth-oidc.md"
|
|
408
|
+
"doc": "plugins/auth-oidc.md",
|
|
409
|
+
"module": "agent-docs/plugins/auth-oidc.md"
|
|
401
410
|
},
|
|
402
411
|
{
|
|
403
412
|
"slug": "auth-supabase",
|
|
404
413
|
"title": "Supabase Auth",
|
|
405
414
|
"description": "Supabase Auth (GoTrue) AuthStrategy — verifies Supabase-issued JWTs via the project's JWKS and maps app_metadata.tenant_id → tenantId.",
|
|
406
415
|
"pkg": "@voltro/plugin-auth-supabase",
|
|
407
|
-
"doc": "plugins/auth-supabase.md"
|
|
416
|
+
"doc": "plugins/auth-supabase.md",
|
|
417
|
+
"module": "agent-docs/plugins/auth-supabase.md"
|
|
408
418
|
},
|
|
409
419
|
{
|
|
410
420
|
"slug": "auth-workos",
|
|
411
421
|
"title": "WorkOS",
|
|
412
422
|
"description": "WorkOS AuthStrategy — verifies WorkOS AuthKit / SSO JWTs via JWKS (no API key) and maps org_id → tenantId.",
|
|
413
423
|
"pkg": "@voltro/plugin-auth-workos",
|
|
414
|
-
"doc": "plugins/auth-workos.md"
|
|
424
|
+
"doc": "plugins/auth-workos.md",
|
|
425
|
+
"module": "agent-docs/plugins/auth-workos.md"
|
|
415
426
|
},
|
|
416
427
|
{
|
|
417
428
|
"slug": "billing",
|
|
418
429
|
"title": "Billing",
|
|
419
430
|
"description": "Subscriptions, plans, entitlements, and usage metering over a pluggable provider (Stripe + mock). Money is integer minor units.",
|
|
420
431
|
"pkg": "@voltro/plugin-billing",
|
|
421
|
-
"doc": "plugins/billing.md"
|
|
432
|
+
"doc": "plugins/billing.md",
|
|
433
|
+
"module": "agent-docs/plugins/billing.md"
|
|
422
434
|
},
|
|
423
435
|
{
|
|
424
436
|
"slug": "broadcast",
|
|
425
437
|
"title": "Broadcast",
|
|
426
438
|
"description": "Cross-replica reactivity over a pub/sub bus (Redis / NATS) for non-postgres dialects — closes the single-instance gap so a write on one pod surfaces on another.",
|
|
427
439
|
"pkg": "@voltro/plugin-broadcast",
|
|
428
|
-
"doc": "plugins/broadcast.md"
|
|
440
|
+
"doc": "plugins/broadcast.md",
|
|
441
|
+
"module": "agent-docs/plugins/broadcast.md"
|
|
429
442
|
},
|
|
430
443
|
{
|
|
431
444
|
"slug": "cdc-out",
|
|
432
445
|
"title": "CDC-out (reverse-ETL)",
|
|
433
446
|
"description": "Declaratively mirror table changes outward to external sinks (webhook / Kafka / Snowflake / BigQuery) through a durable outbox — ordered per pipe, at-least-once from enqueue, retried with backoff, dead-lettered.",
|
|
434
447
|
"pkg": "@voltro/plugin-cdc-out",
|
|
435
|
-
"doc": "plugins/cdc-out.md"
|
|
448
|
+
"doc": "plugins/cdc-out.md",
|
|
449
|
+
"module": "agent-docs/plugins/cdc-out.md"
|
|
436
450
|
},
|
|
437
451
|
{
|
|
438
452
|
"slug": "clickhouse",
|
|
439
453
|
"title": "ClickHouse",
|
|
440
454
|
"description": "Production-grade OLAP AnalyticsSink over ClickHouse — self-hosted or ClickHouse Cloud — for billions of events with millisecond aggregates.",
|
|
441
455
|
"pkg": "@voltro/plugin-clickhouse",
|
|
442
|
-
"doc": "plugins/clickhouse.md"
|
|
456
|
+
"doc": "plugins/clickhouse.md",
|
|
457
|
+
"module": "agent-docs/plugins/clickhouse.md"
|
|
443
458
|
},
|
|
444
459
|
{
|
|
445
460
|
"slug": "datadog",
|
|
446
461
|
"title": "Datadog",
|
|
447
462
|
"description": "Agentless Datadog metrics exporter — pushes the unified Metrics-API to Datadog's /api/v2/series HTTP intake.",
|
|
448
463
|
"pkg": "@voltro/plugin-datadog",
|
|
449
|
-
"doc": "plugins/datadog.md"
|
|
464
|
+
"doc": "plugins/datadog.md",
|
|
465
|
+
"module": "agent-docs/plugins/datadog.md"
|
|
450
466
|
},
|
|
451
467
|
{
|
|
452
468
|
"slug": "deactivation",
|
|
453
469
|
"title": "Deactivation",
|
|
454
470
|
"description": "A schema mixin that marks a subject as deactivated (can't log in) while keeping its data fully visible — the deliberate opposite of soft-delete.",
|
|
455
471
|
"pkg": "@voltro/plugin-deactivation",
|
|
456
|
-
"doc": "plugins/deactivation.md"
|
|
472
|
+
"doc": "plugins/deactivation.md",
|
|
473
|
+
"module": "agent-docs/plugins/deactivation.md"
|
|
457
474
|
},
|
|
458
475
|
{
|
|
459
476
|
"slug": "duckdb",
|
|
460
477
|
"title": "DuckDB",
|
|
461
478
|
"description": "Embedded DuckDB AnalyticsSink — real column-store OLAP in-process, no external service to run.",
|
|
462
479
|
"pkg": "@voltro/plugin-duckdb",
|
|
463
|
-
"doc": "plugins/duckdb.md"
|
|
480
|
+
"doc": "plugins/duckdb.md",
|
|
481
|
+
"module": "agent-docs/plugins/duckdb.md"
|
|
464
482
|
},
|
|
465
483
|
{
|
|
466
484
|
"slug": "flags",
|
|
467
485
|
"title": "Feature flags",
|
|
468
486
|
"description": "Feature flags — per-subject / per-tenant targeting, deterministic % rollouts, kill-switch, declarative rpc gating + client UI gating.",
|
|
469
487
|
"pkg": "@voltro/plugin-flags",
|
|
470
|
-
"doc": "plugins/flags.md"
|
|
488
|
+
"doc": "plugins/flags.md",
|
|
489
|
+
"module": "agent-docs/plugins/flags.md"
|
|
471
490
|
},
|
|
472
491
|
{
|
|
473
492
|
"slug": "governance",
|
|
474
493
|
"title": "Governance",
|
|
475
494
|
"description": "Data governance — retention TTL sweep, GDPR export + erasure, consent ledger, and field-level encryption for .encrypted() columns. Builds on audit + soft-delete.",
|
|
476
495
|
"pkg": "@voltro/plugin-governance",
|
|
477
|
-
"doc": "plugins/governance.md"
|
|
496
|
+
"doc": "plugins/governance.md",
|
|
497
|
+
"module": "agent-docs/plugins/governance.md"
|
|
478
498
|
},
|
|
479
499
|
{
|
|
480
500
|
"slug": "licensing",
|
|
481
501
|
"title": "Licensing",
|
|
482
502
|
"description": "Offline-verified EdDSA license keys + cloud-issued entitlement snapshots that feed plugin-billing; pricing decided server-side, never baked into a published version.",
|
|
483
503
|
"pkg": "@voltro/plugin-licensing",
|
|
484
|
-
"doc": "plugins/licensing.md"
|
|
504
|
+
"doc": "plugins/licensing.md",
|
|
505
|
+
"module": "agent-docs/plugins/licensing.md"
|
|
485
506
|
},
|
|
486
507
|
{
|
|
487
508
|
"slug": "logship",
|
|
488
509
|
"title": "Log shipping",
|
|
489
510
|
"description": "Ship structured logs to Better Stack / Axiom / Loki / any HTTP sink — batched, redacted, fail-soft. Rides the framework log-sink hook.",
|
|
490
511
|
"pkg": "@voltro/plugin-logship",
|
|
491
|
-
"doc": "plugins/logship.md"
|
|
512
|
+
"doc": "plugins/logship.md",
|
|
513
|
+
"module": "agent-docs/plugins/logship.md"
|
|
492
514
|
},
|
|
493
515
|
{
|
|
494
516
|
"slug": "mail",
|
|
495
517
|
"title": "Mail",
|
|
496
518
|
"description": "Transactional email — Resend / Postmark / SendGrid / SMTP, React-Email templates with auto-discovery, per-tenant suppression, bounce/complaint handling, durable delivery via workflows.",
|
|
497
519
|
"pkg": "@voltro/plugin-mail",
|
|
498
|
-
"doc": "plugins/mail.md"
|
|
520
|
+
"doc": "plugins/mail.md",
|
|
521
|
+
"module": "agent-docs/plugins/mail.md"
|
|
499
522
|
},
|
|
500
523
|
{
|
|
501
524
|
"slug": "moderation",
|
|
502
525
|
"title": "Moderation",
|
|
503
526
|
"description": "Moderate user content before it commits — keyword denylist or AI provider, block or flag via rpc interceptor, plus an in-handler redact helper.",
|
|
504
527
|
"pkg": "@voltro/plugin-moderation",
|
|
505
|
-
"doc": "plugins/moderation.md"
|
|
528
|
+
"doc": "plugins/moderation.md",
|
|
529
|
+
"module": "agent-docs/plugins/moderation.md"
|
|
506
530
|
},
|
|
507
531
|
{
|
|
508
532
|
"slug": "multitenancy",
|
|
509
533
|
"title": "Multi-tenancy",
|
|
510
534
|
"description": "The tenant() schema mixin (auto-scope reads + auto-fill writes), the assertOwnTenant write-guard, and the typed TenantMismatch error.",
|
|
511
535
|
"pkg": "@voltro/plugin-multitenancy",
|
|
512
|
-
"doc": "plugins/multitenancy.md"
|
|
536
|
+
"doc": "plugins/multitenancy.md",
|
|
537
|
+
"module": "agent-docs/plugins/multitenancy.md"
|
|
513
538
|
},
|
|
514
539
|
{
|
|
515
540
|
"slug": "notifications",
|
|
516
541
|
"title": "Notifications",
|
|
517
542
|
"description": "Unified notifications — one send API across email / Slack / SMS / push / in-app, with per-user channel preferences, an in-app inbox, and delivery records.",
|
|
518
543
|
"pkg": "@voltro/plugin-notifications",
|
|
519
|
-
"doc": "plugins/notifications.md"
|
|
544
|
+
"doc": "plugins/notifications.md",
|
|
545
|
+
"module": "agent-docs/plugins/notifications.md"
|
|
520
546
|
},
|
|
521
547
|
{
|
|
522
548
|
"slug": "openapi",
|
|
523
549
|
"title": "OpenAPI",
|
|
524
550
|
"description": "Generate an OpenAPI 3.1 spec + Swagger-UI docs from your defineRestRoute descriptors and (opt-in) your rpc procedures. Your routes ARE the API docs — nothing hand-maintained.",
|
|
525
551
|
"pkg": "@voltro/plugin-openapi",
|
|
526
|
-
"doc": "plugins/openapi.md"
|
|
552
|
+
"doc": "plugins/openapi.md",
|
|
553
|
+
"module": "agent-docs/plugins/openapi.md"
|
|
527
554
|
},
|
|
528
555
|
{
|
|
529
556
|
"slug": "postgis",
|
|
530
557
|
"title": "PostGIS",
|
|
531
558
|
"description": "Postgres-native geography / geometry columns, geometry constructors (point/line/polygon/multi/GeoJSON), spatial predicates (ST_DWithin, ST_Within, ST_Contains, ST_Intersects, ST_Buffer, bbox &&), ST_Distance projection + <-> KNN ordering, and GiST indexes via expressionIndex. Postgres-only by design.",
|
|
532
559
|
"pkg": "@voltro/plugin-postgis",
|
|
533
|
-
"doc": "plugins/postgis.md"
|
|
560
|
+
"doc": "plugins/postgis.md",
|
|
561
|
+
"module": "agent-docs/plugins/postgis.md"
|
|
534
562
|
},
|
|
535
563
|
{
|
|
536
564
|
"slug": "posthog",
|
|
537
565
|
"title": "PostHog",
|
|
538
566
|
"description": "Track-only AnalyticsSink that forwards events to PostHog's /capture endpoint — compose it with a second sink that owns reads.",
|
|
539
567
|
"pkg": "@voltro/plugin-posthog",
|
|
540
|
-
"doc": "plugins/posthog.md"
|
|
568
|
+
"doc": "plugins/posthog.md",
|
|
569
|
+
"module": "agent-docs/plugins/posthog.md"
|
|
541
570
|
},
|
|
542
571
|
{
|
|
543
572
|
"slug": "presence",
|
|
544
573
|
"title": "Presence",
|
|
545
574
|
"description": "Ephemeral realtime presence — who's online in a channel, with heartbeat, live roster, and per-member metadata (status, cursor). Works cross-instance.",
|
|
546
575
|
"pkg": "@voltro/plugin-presence",
|
|
547
|
-
"doc": "plugins/presence.md"
|
|
576
|
+
"doc": "plugins/presence.md",
|
|
577
|
+
"module": "agent-docs/plugins/presence.md"
|
|
548
578
|
},
|
|
549
579
|
{
|
|
550
580
|
"slug": "prometheus",
|
|
551
581
|
"title": "Prometheus",
|
|
552
582
|
"description": "Prometheus exporter — scrapes the unified Metrics-API at GET /metrics in text exposition format.",
|
|
553
583
|
"pkg": "@voltro/plugin-prometheus",
|
|
554
|
-
"doc": "plugins/prometheus.md"
|
|
584
|
+
"doc": "plugins/prometheus.md",
|
|
585
|
+
"module": "agent-docs/plugins/prometheus.md"
|
|
555
586
|
},
|
|
556
587
|
{
|
|
557
588
|
"slug": "ratelimit",
|
|
558
589
|
"title": "Rate limiting",
|
|
559
590
|
"description": "Per-endpoint, per-subject and per-tenant request limits via the rpc interceptors. Sliding-window / fixed-window / token-bucket, memory / postgres / redis stores.",
|
|
560
591
|
"pkg": "@voltro/plugin-ratelimit",
|
|
561
|
-
"doc": "plugins/ratelimit.md"
|
|
592
|
+
"doc": "plugins/ratelimit.md",
|
|
593
|
+
"module": "agent-docs/plugins/ratelimit.md"
|
|
562
594
|
},
|
|
563
595
|
{
|
|
564
596
|
"slug": "rbac",
|
|
565
597
|
"title": "RBAC",
|
|
566
598
|
"description": "Roles + permissions + the permission() handler guard. Roles compile to scopes.",
|
|
567
599
|
"pkg": "@voltro/plugin-rbac",
|
|
568
|
-
"doc": "plugins/rbac.md"
|
|
600
|
+
"doc": "plugins/rbac.md",
|
|
601
|
+
"module": "agent-docs/plugins/rbac.md"
|
|
569
602
|
},
|
|
570
603
|
{
|
|
571
604
|
"slug": "scim",
|
|
572
605
|
"title": "SCIM",
|
|
573
606
|
"description": "SCIM 2.0 provisioning — Users + Groups REST endpoints so an enterprise IdP (Okta, Entra, OneLogin) can create / update / deactivate users in your app.",
|
|
574
607
|
"pkg": "@voltro/plugin-scim",
|
|
575
|
-
"doc": "plugins/scim.md"
|
|
608
|
+
"doc": "plugins/scim.md",
|
|
609
|
+
"module": "agent-docs/plugins/scim.md"
|
|
576
610
|
},
|
|
577
611
|
{
|
|
578
612
|
"slug": "search",
|
|
579
613
|
"title": "Search",
|
|
580
614
|
"description": "Keep an external search index (Typesense / Meilisearch / Algolia) in sync with your tables via the ChangeEvent tap, query it tenant-scoped through a typed action + hook.",
|
|
581
615
|
"pkg": "@voltro/plugin-search",
|
|
582
|
-
"doc": "plugins/search.md"
|
|
616
|
+
"doc": "plugins/search.md",
|
|
617
|
+
"module": "agent-docs/plugins/search.md"
|
|
583
618
|
},
|
|
584
619
|
{
|
|
585
620
|
"slug": "sentry",
|
|
586
621
|
"title": "Sentry",
|
|
587
622
|
"description": "Deep Sentry integration — errors correlated to the distributed trace, breadcrumbs from the log sink, and opt-in performance traces.",
|
|
588
623
|
"pkg": "@voltro/plugin-sentry",
|
|
589
|
-
"doc": "plugins/sentry.md"
|
|
624
|
+
"doc": "plugins/sentry.md",
|
|
625
|
+
"module": "agent-docs/plugins/sentry.md"
|
|
590
626
|
},
|
|
591
627
|
{
|
|
592
628
|
"slug": "soft-delete",
|
|
593
629
|
"title": "Soft delete",
|
|
594
630
|
"description": "The softDelete() schema mixin — deletedAt / deletedBy columns, delete() redirected to an UPDATE, default reads filtered, hardDelete() bypass.",
|
|
595
631
|
"pkg": "@voltro/plugin-soft-delete",
|
|
596
|
-
"doc": "plugins/soft-delete.md"
|
|
632
|
+
"doc": "plugins/soft-delete.md",
|
|
633
|
+
"module": "agent-docs/plugins/soft-delete.md"
|
|
597
634
|
},
|
|
598
635
|
{
|
|
599
636
|
"slug": "sso-saml",
|
|
600
637
|
"title": "SAML SSO",
|
|
601
638
|
"description": "Enterprise SAML 2.0 SSO — SP-initiated login, ACS assertion consumer, SP metadata. Signature verification via @node-saml/node-saml; framework session minting built in.",
|
|
602
639
|
"pkg": "@voltro/plugin-sso-saml",
|
|
603
|
-
"doc": "plugins/sso-saml.md"
|
|
640
|
+
"doc": "plugins/sso-saml.md",
|
|
641
|
+
"module": "agent-docs/plugins/sso-saml.md"
|
|
604
642
|
},
|
|
605
643
|
{
|
|
606
644
|
"slug": "storage",
|
|
607
645
|
"title": "Storage",
|
|
608
646
|
"description": "File storage behind one StorageService — public objects served direct from the bucket/CDN, private objects gated by an access policy + per-object grants. S3 / R2 / GCS / MinIO / filesystem / memory providers, presigned URLs, a dashboard browser.",
|
|
609
647
|
"pkg": "@voltro/plugin-storage",
|
|
610
|
-
"doc": "plugins/storage.md"
|
|
648
|
+
"doc": "plugins/storage.md",
|
|
649
|
+
"module": "agent-docs/plugins/storage.md"
|
|
611
650
|
},
|
|
612
651
|
{
|
|
613
652
|
"slug": "tinybird",
|
|
614
653
|
"title": "Tinybird",
|
|
615
654
|
"description": "Hosted-ClickHouse AnalyticsSink over Tinybird's Events API + Pipes — pay-as-you-go OLAP without operating a cluster.",
|
|
616
655
|
"pkg": "@voltro/plugin-tinybird",
|
|
617
|
-
"doc": "plugins/tinybird.md"
|
|
656
|
+
"doc": "plugins/tinybird.md",
|
|
657
|
+
"module": "agent-docs/plugins/tinybird.md"
|
|
618
658
|
},
|
|
619
659
|
{
|
|
620
660
|
"slug": "versioning",
|
|
621
661
|
"title": "Row versioning",
|
|
622
662
|
"description": "Full row history + time-travel. audit() records who/when; versioning records what-changed-to-what — a value snapshot of every row on every write, with as-of queries.",
|
|
623
663
|
"pkg": "@voltro/plugin-versioning",
|
|
624
|
-
"doc": "plugins/versioning.md"
|
|
664
|
+
"doc": "plugins/versioning.md",
|
|
665
|
+
"module": "agent-docs/plugins/versioning.md"
|
|
625
666
|
},
|
|
626
667
|
{
|
|
627
668
|
"slug": "webhooks",
|
|
628
669
|
"title": "Webhooks",
|
|
629
670
|
"description": "First-class outgoing + incoming webhooks — declared events with a webhook: block, defineIncomingWebhook in *.webhook.tsx files, runtime subscriptions, durable delivery via @effect/workflow, HMAC signing, provider presets, and idempotency.",
|
|
630
671
|
"pkg": "@voltro/plugin-webhooks",
|
|
631
|
-
"doc": "plugins/webhooks.md"
|
|
672
|
+
"doc": "plugins/webhooks.md",
|
|
673
|
+
"module": "agent-docs/plugins/webhooks.md"
|
|
632
674
|
}
|
|
633
675
|
],
|
|
634
676
|
"templates": {
|
|
@@ -1193,8 +1193,10 @@ inquiries.publicFeed reviewed=public by design; returns only published rows
|
|
|
1193
1193
|
The reason is required: `reviewed=` with no why is the claim without the
|
|
1194
1194
|
evidence, and doctor refuses it. A bare tag is always available and is the honest
|
|
1195
1195
|
alternative. The two are counted and printed apart, and
|
|
1196
|
-
`--write-authz-allowlist` **
|
|
1197
|
-
|
|
1196
|
+
`--write-authz-allowlist` is **additive**: it keeps the existing file verbatim —
|
|
1197
|
+
entries, comments, grouping, order — and appends only tags it does not already
|
|
1198
|
+
contain. It cannot remove a line. Removing one is your edit, or it happens on its
|
|
1199
|
+
own when an executor gains a guard and its line stops mattering.
|
|
1198
1200
|
|
|
1199
1201
|
#### Reading the whole list
|
|
1200
1202
|
|
|
@@ -3281,7 +3281,7 @@ sides (key-sorted, space-free) before comparing. Update the framework.
|
|
|
3281
3281
|
|
|
3282
3282
|
Cross-dialect: object literal defaults are now emitted to DDL on **every**
|
|
3283
3283
|
dialect, in each one's json idiom — postgres `'<json>'::jsonb`, mysql/mariadb
|
|
3284
|
-
`(
|
|
3284
|
+
`(CONVERT('<json>' USING utf8mb4))` (a literal default is rejected on a JSON column),
|
|
3285
3285
|
mssql/sqlite a `'<json>'` string literal — and the comparison canonicalises
|
|
3286
3286
|
each engine's introspected form (postgres reorders + spaces; mysql wraps in
|
|
3287
3287
|
`cast(…)`; mssql wraps in `('…')`). Arrays are unaffected (an array default
|
|
@@ -3289,6 +3289,19 @@ stays as-is — its `json[]` vs native `array()` column is ambiguous). If you
|
|
|
3289
3289
|
need a per-insert dynamic value instead of a fixed literal, use a factory
|
|
3290
3290
|
`.default(() => ({ … }))` (the store applies it at insert).
|
|
3291
3291
|
|
|
3292
|
+
> **`CAST(… AS JSON)` is MySQL-only, and shipping it for both cost a
|
|
3293
|
+
> part-applied migration.** MariaDB has no JSON *type* — the column is
|
|
3294
|
+
> `LONGTEXT` with `CHECK (json_valid(...))` — so `AS JSON` is not a cast target
|
|
3295
|
+
> it accepts, and `json().default([])` died mid-plan with
|
|
3296
|
+
> `ERROR 1064 … near 'JSON))'`. The obvious MariaDB spelling
|
|
3297
|
+
> `DEFAULT ('[]')` then fails on MySQL with
|
|
3298
|
+
> `ERROR 1101 BLOB, TEXT, GEOMETRY or JSON column can't have a default value`,
|
|
3299
|
+
> because a parenthesised literal is still a literal there. `CONVERT(… USING
|
|
3300
|
+
> utf8mb4)` is the one expression both accept; measured against MariaDB 11.8.8
|
|
3301
|
+
> and MySQL 8.4.10, and covered by an integration test that boots both.
|
|
3302
|
+
> Reported against 0.30.2, fixed in 0.31.0.
|
|
3303
|
+
|
|
3304
|
+
|
|
3292
3305
|
## MySQL `db plan` / `db apply` crashes: `Cannot read properties of undefined (reading 'toLowerCase')`
|
|
3293
3306
|
|
|
3294
3307
|
MySQL 8 returns `information_schema` result columns in UPPERCASE
|
|
@@ -29,8 +29,8 @@ export default {
|
|
|
29
29
|
type: 'web' as const,
|
|
30
30
|
name: 'myApp',
|
|
31
31
|
port: 5191,
|
|
32
|
-
//
|
|
33
|
-
//
|
|
32
|
+
// The languages this app serves. Drives `<html lang>`, the resolved
|
|
33
|
+
// locale, and the `locale` your page `meta` receives.
|
|
34
34
|
locales: ['en', 'de'] as const,
|
|
35
35
|
// Fallback locale when no cookie / Accept-Language matches a
|
|
36
36
|
// supported one. MUST be in `locales`. Pick your source-of-truth
|
|
@@ -39,7 +39,29 @@ export default {
|
|
|
39
39
|
}
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
The framework's generated `.framework/app.tsx` wraps the Router in `<I18nProvider>` automatically
|
|
42
|
+
The framework's generated `.framework/app.tsx` wraps the Router in `<I18nProvider>` automatically when your app **ships catalogs**. You don't write the provider yourself; you don't import `@voltro/i18n` in your layout.
|
|
43
|
+
|
|
44
|
+
### Declaring languages is not the same as adopting the catalogs
|
|
45
|
+
|
|
46
|
+
`locales:` states which languages the app serves. Whether `@voltro/i18n` gets
|
|
47
|
+
wired is decided separately, by whether `src/locales/<code>.ts` exists for every
|
|
48
|
+
listed code:
|
|
49
|
+
|
|
50
|
+
| `locales:` | `src/locales/*` | what you get |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| declared | present | `<I18nProvider>` wired, `useT()` works, plus the language facts |
|
|
53
|
+
| declared | absent | the language facts ONLY — `<html lang>`, the resolved locale, `meta.locale`. Bring your own i18n stack. |
|
|
54
|
+
| absent | — | everything falls back to `'en'` |
|
|
55
|
+
|
|
56
|
+
The second row exists because the two used to be one switch, and that made
|
|
57
|
+
`locales:` unusable for an app with its own i18n: declaring it demanded catalog
|
|
58
|
+
files and failed the boot, so the option got left out — and then `<html lang>`
|
|
59
|
+
was `"en"` and every page's `meta` received `locale: 'en'`, for every visitor, in
|
|
60
|
+
an app that is not English. That is worse than useless: a page that trusted the
|
|
61
|
+
value would have rendered the wrong language.
|
|
62
|
+
|
|
63
|
+
`voltro dev` prints which mode it is in, so a declared-but-unwired app is never a
|
|
64
|
+
silent surprise.
|
|
43
65
|
|
|
44
66
|
## Locale resolution order
|
|
45
67
|
|
|
@@ -59,6 +81,35 @@ The client **adopts what the server resolved**, reading it from the `<html lang>
|
|
|
59
81
|
|
|
60
82
|
See [Catalogs](/docs/i18n/catalogs) for the type-safe catalog convention and the component hooks, [Plurals & formatting](/docs/i18n/formatting) for CLDR plural selection and the `Intl`-backed date / number / relative-time hooks, and [URL strategies](/docs/i18n/url-strategies) for cookie-only vs URL-prefix routing.
|
|
61
83
|
|
|
84
|
+
## The cookie names are exported
|
|
85
|
+
|
|
86
|
+
`LOCALE_COOKIE` and `THEME_COOKIE` come from **`@voltro/i18n`** (and from `@voltro/ui-shadcn` if you use the kit):
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
import { LOCALE_COOKIE, THEME_COOKIE } from '@voltro/i18n'
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Import them rather than retyping `'voltro:locale'`. A cookie name the framework READS and your app WRITES is a public API, and it is the only kind where both sides can disagree without anything failing: nothing throws, no page breaks, the resolver simply finds nothing and falls back to `Accept-Language`. The symptom is a preference that stops working for the subset of users whose browser language differs from their choice — the least likely thing anyone tests.
|
|
93
|
+
|
|
94
|
+
> Until 0.31.0 the only package exporting these was `@voltro/ui-shadcn`, and `voltro doctor` told you to import from there. An app on this package and not on the shadcn kit had no constant to reach for, and would have had to adopt a UI kit for two strings. Reported by a consumer, who added that the rule "does not fire for us, and we think that is correct-by-accident".
|
|
95
|
+
|
|
96
|
+
## `Could not find required 'intl' object` during SSR
|
|
97
|
+
|
|
98
|
+
This throw has two causes that produce byte-identical output: there is no provider above the component, or there IS one and it was built from a **different physical copy** of `react-intl`. React contexts are object identities, so a provider from one copy is invisible to a `useT()` from the other.
|
|
99
|
+
|
|
100
|
+
`voltro dev` knows whether it supplied a provider for that request, and since 0.31.0 it also counts the live copies. The diagnosis printed with the failure names both:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
── voltro diagnosis ───────────────────────────────────────────────────
|
|
104
|
+
ssr-dev DID wrap this render in <I18nProvider>, and this process
|
|
105
|
+
holds 2 live copies of @voltro/i18n bound to
|
|
106
|
+
2 distinct react-intl instances.
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Do not use `pnpm ls` to rule this out.** It enumerates versions ON DISK; the failure is module INSTANCES in a running process, and one file loaded down two paths is two instances. A consumer reported a 500 on every SSR page with exactly one version of each installed — they were right, and the check we had published could not observe the cause. If the count says one of each, it is a framework bug and the diagnosis says so.
|
|
110
|
+
|
|
111
|
+
The framework keeps both packages on one SSR instance by bundling them together (`ssr.noExternal`) and deduping them, in `voltro dev`, `voltro build` and `voltro start` alike. The remaining way to get a second copy is in your own code: building a provider from `react-intl` **directly** rather than from `@voltro/i18n`.
|
|
112
|
+
|
|
62
113
|
|
|
63
114
|
|
|
64
115
|
---
|