spine-framework 0.1.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/.framework/README.md +129 -0
- package/.framework/cli/bin.cjs +14 -0
- package/.framework/cli/commands/agents.ts +153 -0
- package/.framework/cli/commands/auth.ts +94 -0
- package/.framework/cli/commands/create-app.ts +185 -0
- package/.framework/cli/commands/dev.ts +295 -0
- package/.framework/cli/commands/doctor.ts +442 -0
- package/.framework/cli/commands/generate.ts +332 -0
- package/.framework/cli/commands/init.ts +272 -0
- package/.framework/cli/commands/install-app.ts +391 -0
- package/.framework/cli/commands/items.ts +253 -0
- package/.framework/cli/commands/migrations.ts +141 -0
- package/.framework/cli/commands/pipelines.ts +166 -0
- package/.framework/cli/commands/status.ts +197 -0
- package/.framework/cli/commands/system.ts +184 -0
- package/.framework/cli/commands/test.ts +227 -0
- package/.framework/cli/commands/uninstall-app.ts +166 -0
- package/.framework/cli/context.ts +268 -0
- package/.framework/cli/env-loader.ts +36 -0
- package/.framework/cli/index.ts +106 -0
- package/.framework/cli/welcome.cjs +45 -0
- package/.framework/docs/API.md +384 -0
- package/.framework/docs/STABILITY.md +52 -0
- package/.framework/docs/admin-routes.md +76 -0
- package/.framework/docs/api-docs-progress.md +38 -0
- package/.framework/docs/api-governance.md +146 -0
- package/.framework/docs/api-testing-results.md +212 -0
- package/.framework/docs/apis/admin-configs.md +567 -0
- package/.framework/docs/apis/admin-data.md +272 -0
- package/.framework/docs/apis/index.md +231 -0
- package/.framework/docs/apis/internal.md +295 -0
- package/.framework/docs/apis/runtime.md +537 -0
- package/.framework/docs/assembly-launch-guide.md +138 -0
- package/.framework/docs/audit-results.md +590 -0
- package/.framework/docs/authorization-model.md +170 -0
- package/.framework/docs/db-api-inventory.md +95 -0
- package/.framework/docs/examples/custom-app/README.md +77 -0
- package/.framework/docs/examples/custom-function/README.md +27 -0
- package/.framework/docs/examples/custom-function/handler.ts +48 -0
- package/.framework/docs/examples/custom-webhook/README.md +68 -0
- package/.framework/docs/gap-remediation-backlog.md +103 -0
- package/.framework/docs/guides/cli-guide.md +224 -0
- package/.framework/docs/guides/getting-started.md +103 -0
- package/.framework/docs/guides/import-guide.md +193 -0
- package/.framework/docs/guides/testing-guide.md +229 -0
- package/.framework/docs/permission-examples.md +326 -0
- package/.framework/docs/ui-adoption-verification.md +111 -0
- package/.framework/docs/ui-api-coverage.md +84 -0
- package/.framework/docs/v2-compatibility-audit.md +228 -0
- package/.framework/functions/.gitkeep +1 -0
- package/.framework/functions/_shared/agent-runner.ts +1097 -0
- package/.framework/functions/_shared/app-manifest.ts +184 -0
- package/.framework/functions/_shared/audit.ts +150 -0
- package/.framework/functions/_shared/db.ts +174 -0
- package/.framework/functions/_shared/index.ts +382 -0
- package/.framework/functions/_shared/middleware.ts +490 -0
- package/.framework/functions/_shared/permissions.ts +1325 -0
- package/.framework/functions/_shared/pipeline-runner.ts +731 -0
- package/.framework/functions/_shared/principal.ts +760 -0
- package/.framework/functions/_shared/schema-utils.ts +967 -0
- package/.framework/functions/_shared/testing.ts +258 -0
- package/.framework/functions/_shared/trigger-engine.ts +425 -0
- package/.framework/functions/_shared/webhook-registration.ts +168 -0
- package/.framework/functions/_shared/webhook-registry.ts +129 -0
- package/.framework/functions/account-nodes.ts +111 -0
- package/.framework/functions/admin-data.ts +606 -0
- package/.framework/functions/ai-agents.ts +323 -0
- package/.framework/functions/api-keys.ts +376 -0
- package/.framework/functions/apps.ts +483 -0
- package/.framework/functions/auth.ts +196 -0
- package/.framework/functions/debug-auth.ts +107 -0
- package/.framework/functions/embeddings.ts +556 -0
- package/.framework/functions/integration-routes.ts +523 -0
- package/.framework/functions/integrations.ts +319 -0
- package/.framework/functions/item-progress.ts +272 -0
- package/.framework/functions/logs.ts +438 -0
- package/.framework/functions/observability.ts +275 -0
- package/.framework/functions/pipeline-executions.ts +494 -0
- package/.framework/functions/pipelines.ts +485 -0
- package/.framework/functions/prompt-configs.ts +339 -0
- package/.framework/functions/roles.ts +387 -0
- package/.framework/functions/system-cron.ts +742 -0
- package/.framework/functions/system.ts +323 -0
- package/.framework/functions/tests.ts +119 -0
- package/.framework/functions/timers.ts +357 -0
- package/.framework/functions/triggers.ts +563 -0
- package/.framework/functions/types.ts +604 -0
- package/.framework/migrations/000_foundation.sql +1256 -0
- package/.framework/migrations/001_seed.sql +92 -0
- package/.framework/migrations/002_seed_constraints.sql +13 -0
- package/.framework/migrations/003_auth_user_trigger.sql +59 -0
- package/.framework/src/App.tsx +126 -0
- package/.framework/src/apps/admin/index.tsx +173 -0
- package/.framework/src/components/AppWrapper.tsx +56 -0
- package/.framework/src/components/CustomAppLoader.tsx +116 -0
- package/.framework/src/components/admin/AdminListPage.tsx +151 -0
- package/.framework/src/components/admin/AdminSidebar.tsx +166 -0
- package/.framework/src/components/admin/AdminStatsCard.tsx +62 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +42 -0
- package/.framework/src/components/app-shell/GenericAppShell.tsx +181 -0
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +200 -0
- package/.framework/src/components/app-shell/GenericListPage.tsx +116 -0
- package/.framework/src/components/app-sidebar.tsx +228 -0
- package/.framework/src/components/auth/ProtectedRoute.tsx +88 -0
- package/.framework/src/components/layout/AppShell.tsx +91 -0
- package/.framework/src/components/layout/Header.tsx +88 -0
- package/.framework/src/components/layout/Layout.tsx +95 -0
- package/.framework/src/components/layout/Sidebar.tsx +329 -0
- package/.framework/src/components/runtime/DataDetailHeader.tsx +77 -0
- package/.framework/src/components/runtime/DataDetailPage.tsx +171 -0
- package/.framework/src/components/runtime/DataFilters.tsx +91 -0
- package/.framework/src/components/runtime/DataHeader.tsx +68 -0
- package/.framework/src/components/runtime/DataListPage.tsx +124 -0
- package/.framework/src/components/runtime/DataStats.tsx +70 -0
- package/.framework/src/components/runtime/DataTable.tsx +174 -0
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +134 -0
- package/.framework/src/components/runtime/index.ts +18 -0
- package/.framework/src/components/search-form.tsx +29 -0
- package/.framework/src/components/shared/AgentView.tsx +213 -0
- package/.framework/src/components/shared/FieldRenderer.tsx +478 -0
- package/.framework/src/components/shared/SchemaFields.tsx +226 -0
- package/.framework/src/components/ui/DataTable.tsx +343 -0
- package/.framework/src/components/ui/Form.tsx +281 -0
- package/.framework/src/components/ui/ItemCard.tsx +296 -0
- package/.framework/src/components/ui/ItemListView.tsx +308 -0
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -0
- package/.framework/src/components/ui/Modal.tsx +61 -0
- package/.framework/src/components/ui/RichTextEditor.tsx +210 -0
- package/.framework/src/components/ui/accordion.tsx +82 -0
- package/.framework/src/components/ui/alert-dialog.tsx +197 -0
- package/.framework/src/components/ui/alert.tsx +76 -0
- package/.framework/src/components/ui/aspect-ratio.tsx +11 -0
- package/.framework/src/components/ui/avatar.tsx +110 -0
- package/.framework/src/components/ui/badge.tsx +49 -0
- package/.framework/src/components/ui/breadcrumb.tsx +122 -0
- package/.framework/src/components/ui/button-group.tsx +83 -0
- package/.framework/src/components/ui/button.tsx +65 -0
- package/.framework/src/components/ui/calendar.tsx +222 -0
- package/.framework/src/components/ui/card.tsx +100 -0
- package/.framework/src/components/ui/carousel.tsx +240 -0
- package/.framework/src/components/ui/chart.tsx +373 -0
- package/.framework/src/components/ui/checkbox.tsx +31 -0
- package/.framework/src/components/ui/collapsible.tsx +33 -0
- package/.framework/src/components/ui/combobox.tsx +299 -0
- package/.framework/src/components/ui/command.tsx +193 -0
- package/.framework/src/components/ui/context-menu.tsx +261 -0
- package/.framework/src/components/ui/dialog.tsx +165 -0
- package/.framework/src/components/ui/direction.tsx +22 -0
- package/.framework/src/components/ui/drawer.tsx +132 -0
- package/.framework/src/components/ui/dropdown-menu.tsx +269 -0
- package/.framework/src/components/ui/empty.tsx +104 -0
- package/.framework/src/components/ui/field.tsx +238 -0
- package/.framework/src/components/ui/hover-card.tsx +42 -0
- package/.framework/src/components/ui/input-group.tsx +153 -0
- package/.framework/src/components/ui/input-otp.tsx +87 -0
- package/.framework/src/components/ui/input.tsx +19 -0
- package/.framework/src/components/ui/item.tsx +196 -0
- package/.framework/src/components/ui/kbd.tsx +26 -0
- package/.framework/src/components/ui/label.tsx +22 -0
- package/.framework/src/components/ui/menubar.tsx +277 -0
- package/.framework/src/components/ui/native-select.tsx +61 -0
- package/.framework/src/components/ui/navigation-menu.tsx +164 -0
- package/.framework/src/components/ui/pagination.tsx +129 -0
- package/.framework/src/components/ui/popover.tsx +87 -0
- package/.framework/src/components/ui/progress.tsx +31 -0
- package/.framework/src/components/ui/radio-group.tsx +42 -0
- package/.framework/src/components/ui/resizable.tsx +50 -0
- package/.framework/src/components/ui/scroll-area.tsx +53 -0
- package/.framework/src/components/ui/select.tsx +195 -0
- package/.framework/src/components/ui/separator.tsx +26 -0
- package/.framework/src/components/ui/sheet.tsx +145 -0
- package/.framework/src/components/ui/sidebar.tsx +706 -0
- package/.framework/src/components/ui/skeleton.tsx +13 -0
- package/.framework/src/components/ui/slider.tsx +59 -0
- package/.framework/src/components/ui/sonner.tsx +47 -0
- package/.framework/src/components/ui/spinner.tsx +10 -0
- package/.framework/src/components/ui/switch.tsx +33 -0
- package/.framework/src/components/ui/table-primitives.tsx +141 -0
- package/.framework/src/components/ui/table.tsx +114 -0
- package/.framework/src/components/ui/tabs.tsx +90 -0
- package/.framework/src/components/ui/textarea.tsx +18 -0
- package/.framework/src/components/ui/toggle-group.tsx +89 -0
- package/.framework/src/components/ui/toggle.tsx +45 -0
- package/.framework/src/components/ui/tooltip.tsx +57 -0
- package/.framework/src/contexts/AppContext.tsx +133 -0
- package/.framework/src/contexts/AuthContext.tsx +371 -0
- package/.framework/src/hooks/use-mobile.ts +19 -0
- package/.framework/src/hooks/useApi.ts +526 -0
- package/.framework/src/hooks/useApps.ts +114 -0
- package/.framework/src/hooks/useEntityList.ts +190 -0
- package/.framework/src/hooks/useEntityRecord.ts +308 -0
- package/.framework/src/hooks/useForm.ts +307 -0
- package/.framework/src/hooks/useListSchema.ts +264 -0
- package/.framework/src/hooks/useSchemaRecord.ts +223 -0
- package/.framework/src/index.css +128 -0
- package/.framework/src/lib/api.ts +156 -0
- package/.framework/src/lib/supabase.ts +94 -0
- package/.framework/src/lib/utils.ts +317 -0
- package/.framework/src/main.tsx +27 -0
- package/.framework/src/pages/DashboardPage.tsx +181 -0
- package/.framework/src/pages/NotFoundPage.tsx +39 -0
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +161 -0
- package/.framework/src/pages/admin/AIAgentsPage.tsx +318 -0
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +199 -0
- package/.framework/src/pages/admin/APIKeysPage.tsx +303 -0
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +523 -0
- package/.framework/src/pages/admin/AppDetailPage.tsx +493 -0
- package/.framework/src/pages/admin/AppsPage.tsx +355 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +491 -0
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +534 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +424 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +176 -0
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +109 -0
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +402 -0
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +187 -0
- package/.framework/src/pages/admin/IntegrationsPage.tsx +301 -0
- package/.framework/src/pages/admin/LogsPage.tsx +283 -0
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +85 -0
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +470 -0
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +183 -0
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +279 -0
- package/.framework/src/pages/admin/PipelinesPage.tsx +390 -0
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +299 -0
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +292 -0
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +434 -0
- package/.framework/src/pages/admin/RoleDetailPage.tsx +273 -0
- package/.framework/src/pages/admin/RolesPage.tsx +292 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +61 -0
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +588 -0
- package/.framework/src/pages/admin/SimpleDashboard.tsx +387 -0
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +172 -0
- package/.framework/src/pages/admin/TestingDashboard.tsx +257 -0
- package/.framework/src/pages/admin/TimerDetailPage.tsx +151 -0
- package/.framework/src/pages/admin/TimersPage.tsx +376 -0
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +149 -0
- package/.framework/src/pages/admin/TriggersPage.tsx +381 -0
- package/.framework/src/pages/admin/TypeDetailPage.tsx +694 -0
- package/.framework/src/pages/admin/TypesPage.tsx +295 -0
- package/.framework/src/pages/auth/LoginPage.tsx +188 -0
- package/.framework/src/pages/auth/RegisterPage.tsx +163 -0
- package/.framework/src/pages/spine-framework/APIPage.tsx +17 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +25 -0
- package/.framework/src/types/auth.ts +125 -0
- package/.framework/src/types/types.ts +407 -0
- package/STRUCTURE.md +150 -0
- package/config/components.json +25 -0
- package/config/deno.lock +108 -0
- package/config/package-lock.json +17183 -0
- package/config/postcss.config.cjs +10 -0
- package/config/tailwind.config.cjs +78 -0
- package/config/tsconfig.build.json +32 -0
- package/config/tsconfig.cli.json +18 -0
- package/config/tsconfig.json +41 -0
- package/config/tsconfig.node.json +17 -0
- package/config/tsconfig.node.tsbuildinfo +1 -0
- package/config/tsconfig.tsbuildinfo +1 -0
- package/config/typedoc.json +16 -0
- package/config/vite.config.d.ts +2 -0
- package/config/vite.config.ts +72 -0
- package/dist/cli/commands/agents.d.ts +39 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/auth.d.ts +36 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/create-app.d.ts +23 -0
- package/dist/cli/commands/create-app.d.ts.map +1 -0
- package/dist/cli/commands/dev.d.ts +39 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/doctor.d.ts +42 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/generate.d.ts +36 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/init.d.ts +30 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/install-app.d.ts +30 -0
- package/dist/cli/commands/install-app.d.ts.map +1 -0
- package/dist/cli/commands/items.d.ts +45 -0
- package/dist/cli/commands/items.d.ts.map +1 -0
- package/dist/cli/commands/migrations.d.ts +41 -0
- package/dist/cli/commands/migrations.d.ts.map +1 -0
- package/dist/cli/commands/pipelines.d.ts +40 -0
- package/dist/cli/commands/pipelines.d.ts.map +1 -0
- package/dist/cli/commands/status.d.ts +23 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/system.d.ts +29 -0
- package/dist/cli/commands/system.d.ts.map +1 -0
- package/dist/cli/commands/test.d.ts +46 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/uninstall-app.d.ts +23 -0
- package/dist/cli/commands/uninstall-app.d.ts.map +1 -0
- package/dist/cli/context.d.ts +88 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/env-loader.d.ts +14 -0
- package/dist/cli/env-loader.d.ts.map +1 -0
- package/dist/cli/index.d.ts +41 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/functions/_shared/agent-runner.d.ts +156 -0
- package/dist/functions/_shared/agent-runner.d.ts.map +1 -0
- package/dist/functions/_shared/app-manifest.d.ts +68 -0
- package/dist/functions/_shared/app-manifest.d.ts.map +1 -0
- package/dist/functions/_shared/audit.d.ts +91 -0
- package/dist/functions/_shared/audit.d.ts.map +1 -0
- package/dist/functions/_shared/db.d.ts +125 -0
- package/dist/functions/_shared/db.d.ts.map +1 -0
- package/dist/functions/_shared/index.d.ts +298 -0
- package/dist/functions/_shared/index.d.ts.map +1 -0
- package/dist/functions/_shared/middleware.d.ts +315 -0
- package/dist/functions/_shared/middleware.d.ts.map +1 -0
- package/dist/functions/_shared/permissions.d.ts +626 -0
- package/dist/functions/_shared/permissions.d.ts.map +1 -0
- package/dist/functions/_shared/pipeline-runner.d.ts +124 -0
- package/dist/functions/_shared/pipeline-runner.d.ts.map +1 -0
- package/dist/functions/_shared/principal.d.ts +284 -0
- package/dist/functions/_shared/principal.d.ts.map +1 -0
- package/dist/functions/_shared/schema-utils.d.ts +181 -0
- package/dist/functions/_shared/schema-utils.d.ts.map +1 -0
- package/dist/functions/_shared/testing.d.ts +172 -0
- package/dist/functions/_shared/testing.d.ts.map +1 -0
- package/dist/functions/_shared/trigger-engine.d.ts +140 -0
- package/dist/functions/_shared/trigger-engine.d.ts.map +1 -0
- package/dist/functions/_shared/webhook-registration.d.ts +81 -0
- package/dist/functions/_shared/webhook-registration.d.ts.map +1 -0
- package/dist/functions/_shared/webhook-registry.d.ts +57 -0
- package/dist/functions/_shared/webhook-registry.d.ts.map +1 -0
- package/dist/functions/account-nodes.d.ts +48 -0
- package/dist/functions/account-nodes.d.ts.map +1 -0
- package/dist/functions/admin-data.d.ts +178 -0
- package/dist/functions/admin-data.d.ts.map +1 -0
- package/dist/functions/ai-agents.d.ts +125 -0
- package/dist/functions/ai-agents.d.ts.map +1 -0
- package/dist/functions/api-keys.d.ts +140 -0
- package/dist/functions/api-keys.d.ts.map +1 -0
- package/dist/functions/apps.d.ts +163 -0
- package/dist/functions/apps.d.ts.map +1 -0
- package/dist/functions/auth.d.ts +74 -0
- package/dist/functions/auth.d.ts.map +1 -0
- package/dist/functions/debug-auth.d.ts +33 -0
- package/dist/functions/debug-auth.d.ts.map +1 -0
- package/dist/functions/embeddings.d.ts +205 -0
- package/dist/functions/embeddings.d.ts.map +1 -0
- package/dist/functions/integration-routes.d.ts +45 -0
- package/dist/functions/integration-routes.d.ts.map +1 -0
- package/dist/functions/integrations.d.ts +124 -0
- package/dist/functions/integrations.d.ts.map +1 -0
- package/dist/functions/item-progress.d.ts +41 -0
- package/dist/functions/item-progress.d.ts.map +1 -0
- package/dist/functions/logs.d.ts +162 -0
- package/dist/functions/logs.d.ts.map +1 -0
- package/dist/functions/observability.d.ts +123 -0
- package/dist/functions/observability.d.ts.map +1 -0
- package/dist/functions/pipeline-executions.d.ts +190 -0
- package/dist/functions/pipeline-executions.d.ts.map +1 -0
- package/dist/functions/pipelines.d.ts +171 -0
- package/dist/functions/pipelines.d.ts.map +1 -0
- package/dist/functions/prompt-configs.d.ts +125 -0
- package/dist/functions/prompt-configs.d.ts.map +1 -0
- package/dist/functions/roles.d.ts +118 -0
- package/dist/functions/roles.d.ts.map +1 -0
- package/dist/functions/system-cron.d.ts +65 -0
- package/dist/functions/system-cron.d.ts.map +1 -0
- package/dist/functions/system.d.ts +29 -0
- package/dist/functions/system.d.ts.map +1 -0
- package/dist/functions/tests.d.ts +28 -0
- package/dist/functions/tests.d.ts.map +1 -0
- package/dist/functions/timers.d.ts +139 -0
- package/dist/functions/timers.d.ts.map +1 -0
- package/dist/functions/triggers.d.ts +203 -0
- package/dist/functions/triggers.d.ts.map +1 -0
- package/dist/functions/types.d.ts +151 -0
- package/dist/functions/types.d.ts.map +1 -0
- package/dist/src/types/types.d.ts +364 -0
- package/dist/src/types/types.d.ts.map +1 -0
- package/package.json +192 -0
- package/scripts/app-install-cli.ts +286 -0
- package/scripts/assemble-frontend.sh +79 -0
- package/scripts/assemble-functions.sh +62 -0
- package/scripts/assemble.sh +35 -0
- package/scripts/boundary-check.sh +106 -0
- package/scripts/build-manifest.sh +80 -0
- package/scripts/check-core-integrity.sh +82 -0
- package/scripts/ingest-chunks.cjs +202 -0
- package/scripts/kb-chunk-parser.cjs +312 -0
- package/scripts/kb-chunk-parser.ts +330 -0
- package/scripts/load-test-app-install.ts +484 -0
- package/scripts/netlify-dev-wrapper.sh +22 -0
- package/scripts/verify-integrity.sh +69 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Testing Guide
|
|
2
|
+
|
|
3
|
+
Spine's test suite covers four surfaces: **unit**, **integration**, **API**, and **UI (Playwright)**.
|
|
4
|
+
All tests target the **public schema** (`DB_SCHEMA=public`). Results are persisted to
|
|
5
|
+
`public.test_runs` / `public.test_results` and surfaced in the admin UI at `/admin/testing`.
|
|
6
|
+
|
|
7
|
+
The primary purpose of running tests against the public schema is to discover **day-zero gaps** —
|
|
8
|
+
missing seed data, structural issues, or RLS mismatches that must be resolved before production.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Running Tests
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# All tests (unit + integration + api)
|
|
16
|
+
npm test
|
|
17
|
+
|
|
18
|
+
# Unit tests only (fast, no network)
|
|
19
|
+
npm run test:unit
|
|
20
|
+
|
|
21
|
+
# Integration tests (requires SUPABASE_URL + SUPABASE_SERVICE_ROLE_KEY + SPINE_TEST_ACCOUNT_ID)
|
|
22
|
+
npm run test:integration
|
|
23
|
+
|
|
24
|
+
# API tests (requires dev server running + SPINE_DEV_JWT)
|
|
25
|
+
SPINE_DEV_JWT=<jwt> vitest run v2-core/tests/api
|
|
26
|
+
|
|
27
|
+
# UI sweep (requires dev server + playwright)
|
|
28
|
+
tsx v2-core/tests/ui/ui-sweep.ts
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
See `.windsurf/workflows/run-tests.md` for the full step-by-step workflow.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Environment Setup
|
|
36
|
+
|
|
37
|
+
Integration, API, and UI tests need credentials in `v2-core/.xenv` or `v2-core/.xenv.test`:
|
|
38
|
+
|
|
39
|
+
```env
|
|
40
|
+
SUPABASE_URL=https://uyokuiibztwfasdprsov.supabase.co
|
|
41
|
+
SUPABASE_SERVICE_ROLE_KEY=<service-role-key>
|
|
42
|
+
SPINE_TEST_ACCOUNT_ID=<uuid>
|
|
43
|
+
DB_SCHEMA=public
|
|
44
|
+
# For API tests:
|
|
45
|
+
SPINE_DEV_JWT=<user-jwt>
|
|
46
|
+
SPINE_DEV_URL=http://localhost:8888
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Test Suites
|
|
52
|
+
|
|
53
|
+
### Unit Tests (`v2-core/tests/unit/`)
|
|
54
|
+
|
|
55
|
+
Pure function tests — no network, no DB. Mock `db.ts` with `vi.mock`.
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
// v2-core/tests/unit/pipeline-runner.test.ts
|
|
59
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
60
|
+
import { runPipeline } from '../../functions/_shared/pipeline-runner.ts'
|
|
61
|
+
import { SYSTEM_PRINCIPAL } from '../../functions/_shared/principal.ts'
|
|
62
|
+
import type { CoreContext } from '../../functions/_shared/middleware.ts'
|
|
63
|
+
|
|
64
|
+
// Mock adminDb
|
|
65
|
+
vi.mock('../../functions/_shared/db.ts', () => ({
|
|
66
|
+
adminDb: {
|
|
67
|
+
from: vi.fn().mockReturnThis(),
|
|
68
|
+
select: vi.fn().mockReturnThis(),
|
|
69
|
+
insert: vi.fn().mockReturnThis(),
|
|
70
|
+
update: vi.fn().mockReturnThis(),
|
|
71
|
+
eq: vi.fn().mockReturnThis(),
|
|
72
|
+
single: vi.fn()
|
|
73
|
+
}
|
|
74
|
+
}))
|
|
75
|
+
|
|
76
|
+
function makeCtx(overrides: Partial<CoreContext> = {}): CoreContext {
|
|
77
|
+
return {
|
|
78
|
+
principal: SYSTEM_PRINCIPAL,
|
|
79
|
+
accountId: 'test-account-id',
|
|
80
|
+
db: {}, // mocked via vi.mock above
|
|
81
|
+
requestId: 'test-request-id',
|
|
82
|
+
...overrides
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Example unit test
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
describe('runPipeline', () => {
|
|
91
|
+
it('throws when pipeline not found', async () => {
|
|
92
|
+
const { adminDb } = await import('../../functions/_shared/db.ts')
|
|
93
|
+
vi.mocked(adminDb.from('pipelines').select('*').eq('id', 'x').eq('is_active', true).single)
|
|
94
|
+
.mockResolvedValue({ data: null, error: { message: 'Not found' } })
|
|
95
|
+
|
|
96
|
+
await expect(
|
|
97
|
+
runPipeline('nonexistent-id', {}, makeCtx())
|
|
98
|
+
).rejects.toThrow('Pipeline not found or inactive')
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Integration Tests (`v2-core/tests/integration/`)
|
|
106
|
+
|
|
107
|
+
Run against the live Supabase public schema via `adminDb`. Failures are **day-zero gaps**.
|
|
108
|
+
|
|
109
|
+
Key files:
|
|
110
|
+
- `helpers.ts` — `adminDb`, `makeTestCtx()`, `TEST_ACCOUNT_ID`
|
|
111
|
+
- `admin-data-accounts.test.ts` — accounts table shape + HTTP endpoint
|
|
112
|
+
- `admin-data-people.test.ts` — people table shape + HTTP endpoint
|
|
113
|
+
- `schema-validation.test.ts` — `design_schema` completeness across all types
|
|
114
|
+
- `custom-integrity.test.ts` — public schema connectivity, RLS isolation, export surface
|
|
115
|
+
|
|
116
|
+
Tests use `describe.skipIf(!TEST_ACCOUNT_ID)` to skip gracefully when env is not configured.
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
describe.skipIf(!TEST_ACCOUNT_ID)('my integration test', () => {
|
|
120
|
+
it('checks something in public schema', async () => {
|
|
121
|
+
const { data, error } = await adminDb.from('types').select('*').limit(1)
|
|
122
|
+
expect(error).toBeNull()
|
|
123
|
+
// Gap warning pattern:
|
|
124
|
+
if (!data?.length) console.warn('[gap] public.types is empty')
|
|
125
|
+
})
|
|
126
|
+
})
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## API Tests (`v2-core/tests/api/`)
|
|
132
|
+
|
|
133
|
+
HTTP fetch tests against the local dev server. Requires `SPINE_DEV_JWT`.
|
|
134
|
+
|
|
135
|
+
- `api-surface.test.ts` — auth matrix, CRUD lifecycle, error handling across all entities
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
SPINE_DEV_JWT=<jwt> vitest run v2-core/tests/api
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## UI Tests (`v2-core/tests/ui/`)
|
|
144
|
+
|
|
145
|
+
Playwright sweep over all admin routes. Checks for zero console errors per page.
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
tsx v2-core/tests/ui/ui-sweep.ts
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Results written to `public.test_runs` with `suite='ui'`.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Result Reporter
|
|
156
|
+
|
|
157
|
+
`tests/reporter.ts` is a Vitest custom reporter that persists results to `public.test_runs`
|
|
158
|
+
and `public.test_results` after every test run. Also exports `writeRunResults()` for use
|
|
159
|
+
by non-Vitest runners (UI sweep, API tests).
|
|
160
|
+
|
|
161
|
+
It is registered in `vitest.config.ts`:
|
|
162
|
+
```ts
|
|
163
|
+
reporters: ['default', './v2-core/tests/reporter.ts']
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
View results in the admin UI at `/admin/testing`.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Fixtures
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# Seed test data into public schema (idempotent)
|
|
174
|
+
tsx v2-core/tests/fixtures/seed.ts
|
|
175
|
+
|
|
176
|
+
# Remove test-* rows from public schema
|
|
177
|
+
tsx v2-core/tests/fixtures/teardown.ts
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Gap Report
|
|
183
|
+
|
|
184
|
+
After running integration + API + UI tests, document every failure in
|
|
185
|
+
`v2-core/docs/dayzero-gap-report.md`:
|
|
186
|
+
|
|
187
|
+
```markdown
|
|
188
|
+
## Gap: public.types is empty
|
|
189
|
+
- **Test**: schema-validation.test.ts — "all active types have a non-empty design_schema"
|
|
190
|
+
- **Root cause**: `migrations_dayzero/007_seeds.sql` not yet applied to public schema
|
|
191
|
+
- **Fix**: Apply seeds or add missing type rows
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Testing Custom Code
|
|
197
|
+
|
|
198
|
+
Import from the stable `_shared` index:
|
|
199
|
+
|
|
200
|
+
```ts
|
|
201
|
+
import { runPipeline, adminDb, SYSTEM_PRINCIPAL, CoreContext } from '../../_shared/index.ts'
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Test File Structure
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
v2-core/tests/
|
|
210
|
+
unit/
|
|
211
|
+
pipeline-runner.test.ts
|
|
212
|
+
permissions.test.ts
|
|
213
|
+
schema-utils.test.ts
|
|
214
|
+
principal.test.ts
|
|
215
|
+
integration/
|
|
216
|
+
auth.test.ts
|
|
217
|
+
isolation.test.ts
|
|
218
|
+
permissions.test.ts
|
|
219
|
+
pipeline.test.ts
|
|
220
|
+
machine-principal.test.ts
|
|
221
|
+
cli-smoke.test.ts
|
|
222
|
+
helpers.ts
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## CI Integration
|
|
228
|
+
|
|
229
|
+
Tests run automatically in GitHub Actions via `.github/workflows/smoke-test.yml`. Unit tests run on every push; integration tests run on PRs against `main` using the Supabase staging branch credentials stored in GitHub Secrets.
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
# Permission Examples
|
|
2
|
+
|
|
3
|
+
## Support Ticket Use Case
|
|
4
|
+
|
|
5
|
+
### Customer (user role)
|
|
6
|
+
- Can create tickets in their own account
|
|
7
|
+
- Can only see/update their own tickets
|
|
8
|
+
- Cannot see ARR field
|
|
9
|
+
|
|
10
|
+
### Master Support Agent (master-support role)
|
|
11
|
+
- Assigned to client accounts via v2.people_roles
|
|
12
|
+
- Can read all client tickets
|
|
13
|
+
- Can update most ticket fields
|
|
14
|
+
- Cannot see ARR field (field override)
|
|
15
|
+
|
|
16
|
+
### Master CSM (master-csm role)
|
|
17
|
+
- Assigned to client accounts via v2.people_roles
|
|
18
|
+
- Can read all client tickets
|
|
19
|
+
- Can update ARR field (field override)
|
|
20
|
+
- Cannot delete tickets
|
|
21
|
+
|
|
22
|
+
## Schema Example
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"record_permissions": {
|
|
27
|
+
"user": {
|
|
28
|
+
"create": true,
|
|
29
|
+
"read": "own",
|
|
30
|
+
"update": "own",
|
|
31
|
+
"delete": false
|
|
32
|
+
},
|
|
33
|
+
"master-support": {
|
|
34
|
+
"create": false,
|
|
35
|
+
"read": "all",
|
|
36
|
+
"update": "all",
|
|
37
|
+
"delete": false
|
|
38
|
+
},
|
|
39
|
+
"master-csm": {
|
|
40
|
+
"create": false,
|
|
41
|
+
"read": "all",
|
|
42
|
+
"update": false,
|
|
43
|
+
"delete": false
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"fields": {
|
|
47
|
+
"arr": {
|
|
48
|
+
"type": "number",
|
|
49
|
+
"permissions": {
|
|
50
|
+
"master-support": {
|
|
51
|
+
"read": false,
|
|
52
|
+
"write": false
|
|
53
|
+
},
|
|
54
|
+
"master-csm": {
|
|
55
|
+
"read": true,
|
|
56
|
+
"write": true
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## API Behavior Examples
|
|
65
|
+
|
|
66
|
+
### Creating a Ticket
|
|
67
|
+
|
|
68
|
+
**Customer Request:**
|
|
69
|
+
```typescript
|
|
70
|
+
POST /functions/items
|
|
71
|
+
{
|
|
72
|
+
"item_type": "support_ticket",
|
|
73
|
+
"title": "Login issue",
|
|
74
|
+
"data": {
|
|
75
|
+
"description": "Cannot login to account",
|
|
76
|
+
"priority": "high"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Permission Check:**
|
|
82
|
+
- User has `user` role
|
|
83
|
+
- `record_permissions.user.create` is `true`
|
|
84
|
+
- **Result:** Ticket created successfully
|
|
85
|
+
|
|
86
|
+
**Master Support Request:**
|
|
87
|
+
```typescript
|
|
88
|
+
POST /functions/items
|
|
89
|
+
{
|
|
90
|
+
"item_type": "support_ticket",
|
|
91
|
+
"title": "System maintenance",
|
|
92
|
+
"data": {
|
|
93
|
+
"description": "Scheduled maintenance",
|
|
94
|
+
"priority": "low"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Permission Check:**
|
|
100
|
+
- User has `master-support` role
|
|
101
|
+
- `record_permissions.master-support.create` is `false`
|
|
102
|
+
- **Result:** Permission denied
|
|
103
|
+
|
|
104
|
+
### Reading Tickets
|
|
105
|
+
|
|
106
|
+
**Customer Reading Their Own Ticket:**
|
|
107
|
+
```typescript
|
|
108
|
+
GET /functions/items?id=customer-ticket-123
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Permission Check:**
|
|
112
|
+
- User has `user` role
|
|
113
|
+
- `record_permissions.user.read` is `"own"`
|
|
114
|
+
- Ticket was created by this user
|
|
115
|
+
- **Result:** Returns ticket with all fields visible to user
|
|
116
|
+
|
|
117
|
+
**Customer Reading Another Customer's Ticket:**
|
|
118
|
+
```typescript
|
|
119
|
+
GET /functions/items?id=other-customer-ticket-456
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Permission Check:**
|
|
123
|
+
- User has `user` role
|
|
124
|
+
- `record_permissions.user.read` is `"own"`
|
|
125
|
+
- Ticket was NOT created by this user
|
|
126
|
+
- **Result:** Permission denied
|
|
127
|
+
|
|
128
|
+
**Master Support Reading Any Client Ticket:**
|
|
129
|
+
```typescript
|
|
130
|
+
GET /functions/items?id=client-ticket-789
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Permission Check:**
|
|
134
|
+
- User has `master-support` role
|
|
135
|
+
- `record_permissions.master-support.read` is `"all"`
|
|
136
|
+
- **Result:** Returns ticket, but ARR field is filtered out due to field override
|
|
137
|
+
|
|
138
|
+
### Updating Tickets
|
|
139
|
+
|
|
140
|
+
**Customer Updating Their Own Ticket:**
|
|
141
|
+
```typescript
|
|
142
|
+
PATCH /functions/items?id=customer-ticket-123
|
|
143
|
+
{
|
|
144
|
+
"data": {
|
|
145
|
+
"description": "Updated description"
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Permission Check:**
|
|
151
|
+
- User has `user` role
|
|
152
|
+
- `record_permissions.user.update` is `"own"`
|
|
153
|
+
- Ticket was created by this user
|
|
154
|
+
- Field has no specific override for `user` role
|
|
155
|
+
- **Result:** Update successful
|
|
156
|
+
|
|
157
|
+
**Customer Trying to Update ARR Field:**
|
|
158
|
+
```typescript
|
|
159
|
+
PATCH /functions/items?id=customer-ticket-123
|
|
160
|
+
{
|
|
161
|
+
"data": {
|
|
162
|
+
"arr": 50000
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Permission Check:**
|
|
168
|
+
- User has `user` role
|
|
169
|
+
- `record_permissions.user.update` is `"own"`
|
|
170
|
+
- Ticket was created by this user
|
|
171
|
+
- Field `arr` has no permission override for `user` role
|
|
172
|
+
- Falls back to record-level permission: `"own"` allows update
|
|
173
|
+
- **Result:** Update successful (if this is desired behavior, add field override to prevent)
|
|
174
|
+
|
|
175
|
+
**Master CSM Updating ARR Field:**
|
|
176
|
+
```typescript
|
|
177
|
+
PATCH /functions/items?id=client-ticket-789
|
|
178
|
+
{
|
|
179
|
+
"data": {
|
|
180
|
+
"arr": 75000
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Permission Check:**
|
|
186
|
+
- User has `master-csm` role
|
|
187
|
+
- `record_permissions.master-csm.update` is `false`
|
|
188
|
+
- Field `arr` has override: `permissions.master-csm.write` is `true`
|
|
189
|
+
- **Result:** Update successful due to field override
|
|
190
|
+
|
|
191
|
+
**Master Support Trying to Update ARR Field:**
|
|
192
|
+
```typescript
|
|
193
|
+
PATCH /functions/items?id=client-ticket-789
|
|
194
|
+
{
|
|
195
|
+
"data": {
|
|
196
|
+
"arr": 75000
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Permission Check:**
|
|
202
|
+
- User has `master-support` role
|
|
203
|
+
- `record_permissions.master-support.update` is `"all"`
|
|
204
|
+
- Field `arr` has override: `permissions.master-support.write` is `false`
|
|
205
|
+
- **Result:** Permission denied due to field override
|
|
206
|
+
|
|
207
|
+
## List Endpoint Behavior
|
|
208
|
+
|
|
209
|
+
**Customer Listing Tickets:**
|
|
210
|
+
```typescript
|
|
211
|
+
GET /functions/items?item_type=support_ticket
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Permission Check:**
|
|
215
|
+
- Returns only tickets user can read
|
|
216
|
+
- Filters out fields user cannot see
|
|
217
|
+
- **Result:** List of user's own tickets with appropriate field filtering
|
|
218
|
+
|
|
219
|
+
**Master Support Listing Tickets:**
|
|
220
|
+
```typescript
|
|
221
|
+
GET /functions/items?item_type=support_ticket
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Permission Check:**
|
|
225
|
+
- Returns all tickets in account
|
|
226
|
+
- Filters out ARR field for all tickets
|
|
227
|
+
- **Result:** All client tickets with ARR field removed
|
|
228
|
+
|
|
229
|
+
## System Admin Behavior
|
|
230
|
+
|
|
231
|
+
**System Admin Any Operation:**
|
|
232
|
+
```typescript
|
|
233
|
+
// Any operation as system admin
|
|
234
|
+
GET /functions/items?id=any-ticket
|
|
235
|
+
PATCH /functions/items?id=any-ticket
|
|
236
|
+
DELETE /functions/items?id=any-ticket
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**Permission Check:**
|
|
240
|
+
- `systemRole === 'system_admin'`
|
|
241
|
+
- **Result:** All operations succeed, no field filtering, full audit trail maintained
|
|
242
|
+
|
|
243
|
+
## Multi-Role User Behavior
|
|
244
|
+
|
|
245
|
+
**User with Both user and master-support Roles:**
|
|
246
|
+
```typescript
|
|
247
|
+
GET /functions/items?id=other-user-ticket
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Permission Check:**
|
|
251
|
+
- User has `user` role: `record_permissions.user.read` is `"own"` - denied
|
|
252
|
+
- User has `master-support` role: `record_permissions.master-support.read` is `"all"` - allowed
|
|
253
|
+
- **Result:** Access granted (highest effective permission wins)
|
|
254
|
+
|
|
255
|
+
## Error Messages
|
|
256
|
+
|
|
257
|
+
### Permission Denied Errors
|
|
258
|
+
- `"Insufficient permissions to create this type of item"`
|
|
259
|
+
- `"Insufficient permissions to update this item"`
|
|
260
|
+
- `"Insufficient permissions to delete this item"`
|
|
261
|
+
- `"Insufficient permissions to view this item"`
|
|
262
|
+
- `"Insufficient permissions to update field 'field_name'"`
|
|
263
|
+
|
|
264
|
+
### Context Errors
|
|
265
|
+
- `"Authentication required"`
|
|
266
|
+
- `"Account context required"`
|
|
267
|
+
- `"Item not found"`
|
|
268
|
+
|
|
269
|
+
## Debugging Permission Issues
|
|
270
|
+
|
|
271
|
+
### Step 1: Check Authentication
|
|
272
|
+
```sql
|
|
273
|
+
-- Verify user is authenticated
|
|
274
|
+
SELECT person_id, system_role FROM v2.people WHERE auth_uid = 'user_auth_uid';
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Step 2: Check Account Membership
|
|
278
|
+
```sql
|
|
279
|
+
-- Verify user is member of account
|
|
280
|
+
SELECT * FROM v2.people_accounts
|
|
281
|
+
WHERE person_id = 'user_person_id' AND account_id = 'target_account_id' AND is_active = true;
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Step 3: Check Role Assignments
|
|
285
|
+
```sql
|
|
286
|
+
-- Verify user has required roles
|
|
287
|
+
SELECT pr.role_slug, r.name
|
|
288
|
+
FROM v2.people_roles pr
|
|
289
|
+
JOIN v2.roles r ON pr.role_id = r.id
|
|
290
|
+
WHERE pr.person_id = 'user_person_id' AND pr.account_id = 'target_account_id' AND pr.is_active = true;
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Step 4: Check Type Schema
|
|
294
|
+
```sql
|
|
295
|
+
-- Verify type schema has permissions for user's roles
|
|
296
|
+
SELECT schema FROM v2.types
|
|
297
|
+
WHERE slug = 'support_ticket' AND is_active = true;
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Step 5: Check System Admin Override
|
|
301
|
+
```sql
|
|
302
|
+
-- Verify system admin status
|
|
303
|
+
SELECT system_role FROM v2.people WHERE id = 'user_person_id';
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Common Pitfalls and Solutions
|
|
307
|
+
|
|
308
|
+
### Pitfall: Missing Role Assignment
|
|
309
|
+
**Problem:** User cannot access records despite having correct schema
|
|
310
|
+
**Solution:** Verify role assignment in v2.people_roles
|
|
311
|
+
|
|
312
|
+
### Pitfall: Incorrect Account Context
|
|
313
|
+
**Problem:** Permission checks failing for cross-account operations
|
|
314
|
+
**Solution:** Ensure correct account_id in request headers
|
|
315
|
+
|
|
316
|
+
### Pitfall: Field Override Missing
|
|
317
|
+
**Problem:** Users can see fields they shouldn't
|
|
318
|
+
**Solution:** Add field-level permission overrides
|
|
319
|
+
|
|
320
|
+
### Pitfall: Access Level Misconfiguration
|
|
321
|
+
**Problem:** Users can't access their own records
|
|
322
|
+
**Solution:** Ensure read access level is set to "own" or "all"
|
|
323
|
+
|
|
324
|
+
### Pitfall: System Admin Not Working
|
|
325
|
+
**Problem:** System admin still getting permission denied
|
|
326
|
+
**Solution:** Verify systemRole is set correctly in middleware
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# UI Adoption Verification Report
|
|
2
|
+
|
|
3
|
+
## Data Management UIs (admin/data/*)
|
|
4
|
+
|
|
5
|
+
### Accounts Management
|
|
6
|
+
- **AccountsPage**: Uses `apiFetch('/.netlify/functions/accounts')` - ADOPTED
|
|
7
|
+
- **AccountCreatePage**: Uses accounts API - ADOPTED
|
|
8
|
+
- **AccountDetailPage**: Uses accounts API - ADOPTED
|
|
9
|
+
- **Status**: Complete API adoption
|
|
10
|
+
|
|
11
|
+
### People Management
|
|
12
|
+
- **PeoplePage**: Uses `apiFetch('/.netlify/functions/people')` - ADOPTED
|
|
13
|
+
- **PersonCreatePage**: Uses people API - ADOPTED
|
|
14
|
+
- **PersonDetailPage**: Uses people API - ADOPTED
|
|
15
|
+
- **Status**: Complete API adoption
|
|
16
|
+
|
|
17
|
+
### Items Management
|
|
18
|
+
- **ItemsPage**: Uses `apiFetch('/.netlify/functions/items')` - ADOPTED
|
|
19
|
+
- **ItemCreatePage**: Uses items API - ADOPTED
|
|
20
|
+
- **ItemDetailPage**: Uses items API - ADOPTED
|
|
21
|
+
- **Status**: Complete API adoption
|
|
22
|
+
|
|
23
|
+
## Configuration Management UIs (admin/configs/*)
|
|
24
|
+
|
|
25
|
+
### Type Definitions
|
|
26
|
+
- **TypesPage**: Uses `apiFetch('/.netlify/functions/types')` - ADOPTED
|
|
27
|
+
- **TypeDetailPage**: Uses types API - ADOPTED
|
|
28
|
+
- **AccountTypesPage**: Uses `apiFetch('/.netlify/functions/types')` - ADOPTED
|
|
29
|
+
- **AccountTypeDetailPage**: Uses types API - ADOPTED
|
|
30
|
+
- **PersonTypesPage**: Uses `apiFetch('/.netlify/functions/types')` - ADOPTED
|
|
31
|
+
- **PersonTypeDetailPage**: Uses types API - ADOPTED
|
|
32
|
+
- **Status**: Complete API adoption
|
|
33
|
+
|
|
34
|
+
### App Definitions
|
|
35
|
+
- **AppsPage**: Uses `apiFetch('/.netlify/functions/apps')` - ADOPTED
|
|
36
|
+
- **AppDetailPage**: Uses apps API - ADOPTED
|
|
37
|
+
- **Status**: Complete API adoption
|
|
38
|
+
|
|
39
|
+
### Workflow Definitions
|
|
40
|
+
- **PipelinesPage**: Uses `apiFetch('/.netlify/functions/pipelines')` - ADOPTED
|
|
41
|
+
- **PipelineDetailPage**: Uses pipelines API - ADOPTED
|
|
42
|
+
- **TriggersPage**: Uses `apiFetch('/.netlify/functions/triggers')` - ADOPTED
|
|
43
|
+
- **TriggerDetailPage**: Uses triggers API - ADOPTED
|
|
44
|
+
- **Status**: Complete API adoption
|
|
45
|
+
|
|
46
|
+
### AI & Integration Definitions
|
|
47
|
+
- **AIAgentsPage**: Uses `apiFetch('/.netlify/functions/ai-agents')` - ADOPTED
|
|
48
|
+
- **AIAgentDetailPage**: Uses ai-agents API - ADOPTED
|
|
49
|
+
- **EmbeddingsPage**: Uses `apiFetch('/.netlify/functions/embeddings')` - ADOPTED
|
|
50
|
+
- **EmbeddingDetailPage**: Uses embeddings API - ADOPTED
|
|
51
|
+
- **IntegrationsPage**: Uses `apiFetch('/.netlify/functions/integrations')` - ADOPTED
|
|
52
|
+
- **IntegrationDetailPage**: Uses integrations API - ADOPTED
|
|
53
|
+
- **Status**: Complete API adoption
|
|
54
|
+
|
|
55
|
+
### Scheduling Definitions
|
|
56
|
+
- **TimersPage**: Previously used mock data - NOW ADOPTED
|
|
57
|
+
- **TimerDetailPage**: Uses timers API - ADOPTED
|
|
58
|
+
- **Status**: Complete API adoption (FIXED)
|
|
59
|
+
|
|
60
|
+
## Legacy Routes (Removed)
|
|
61
|
+
|
|
62
|
+
All legacy routes have been removed from routing and will now return 404:
|
|
63
|
+
- ~~`/admin/accounts`~~ -> Use `/admin/data/accounts`
|
|
64
|
+
- ~~`/admin/people`~~ -> Use `/admin/data/people`
|
|
65
|
+
- ~~`/admin/types`~~ -> Use `/admin/configs/types`
|
|
66
|
+
- ~~`/admin/apps`~~ -> Use `/admin/configs/apps`
|
|
67
|
+
- ~~`/admin/pipelines`~~ -> Use `/admin/configs/pipelines`
|
|
68
|
+
- ~~`/admin/triggers`~~ -> Use `/admin/configs/triggers`
|
|
69
|
+
- ~~`/admin/ai-agents`~~ -> Use `/admin/configs/ai-agents`
|
|
70
|
+
- ~~`/admin/embeddings`~~ -> Use `/admin/configs/embeddings`
|
|
71
|
+
- ~~`/admin/timers`~~ -> Use `/admin/configs/timers`
|
|
72
|
+
|
|
73
|
+
**Status**: All legacy routes removed - will return 404
|
|
74
|
+
|
|
75
|
+
## Issues Resolved
|
|
76
|
+
|
|
77
|
+
### Fixed: TimersPage Mock Data
|
|
78
|
+
- **Issue**: TimersPage was using mock data instead of API
|
|
79
|
+
- **Action**: Replaced mock data with `fetch('/.netlify/functions/timers')`
|
|
80
|
+
- **Status**: RESOLVED
|
|
81
|
+
- **Impact**: TimersPage now properly uses timers API
|
|
82
|
+
|
|
83
|
+
## Compliance Status
|
|
84
|
+
|
|
85
|
+
### Complete Adoption: 100%
|
|
86
|
+
- All 25 active admin UI routes now use proper APIs
|
|
87
|
+
- No remaining mock data usage
|
|
88
|
+
- All CRUD operations go through API layer
|
|
89
|
+
- Proper error handling implemented
|
|
90
|
+
|
|
91
|
+
### Security Status: Good
|
|
92
|
+
- Config endpoints have admin-only role guards
|
|
93
|
+
- Data endpoints respect account scoping
|
|
94
|
+
- Auth middleware applied where needed
|
|
95
|
+
|
|
96
|
+
### Standards Compliance: Good
|
|
97
|
+
- All endpoints use soft delete
|
|
98
|
+
- Consistent response formats
|
|
99
|
+
- Proper audit logging
|
|
100
|
+
- v2 schema compliance verified
|
|
101
|
+
|
|
102
|
+
## Recommendations
|
|
103
|
+
|
|
104
|
+
1. **Redirect Legacy Routes**: Consider adding redirects from legacy to new routes
|
|
105
|
+
2. **Monitor API Usage**: Track which endpoints are actually used by UIs
|
|
106
|
+
3. **Performance Review**: Ensure API calls are properly cached/debounced
|
|
107
|
+
4. **Error Handling**: Verify consistent error handling across all UIs
|
|
108
|
+
|
|
109
|
+
## Summary
|
|
110
|
+
|
|
111
|
+
All admin UIs are now properly adopting APIs with no mock data remaining. The critical issue with TimersPage has been resolved. The system is ready for production use with proper API-driven architecture.
|