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,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module src/types/auth
|
|
3
|
+
* @audience installer
|
|
4
|
+
* @layer frontend-hook
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* Authentication and principal type definitions for the Spine frontend.
|
|
8
|
+
* These shapes mirror the response from `GET /api/auth?action=context` and
|
|
9
|
+
* are used throughout `AuthContext`, hooks, and any component that needs
|
|
10
|
+
* to reason about the current user's identity, account, or permissions.
|
|
11
|
+
*
|
|
12
|
+
* **Server source:** `functions/auth.ts` → `get_account_hierarchy` RPC resolves
|
|
13
|
+
* `User.account`, `User.roles`, `User.permissions`, and `User.accessible_accounts`.
|
|
14
|
+
*
|
|
15
|
+
* @seeAlso src/contexts/AuthContext.tsx (stores and exposes User)
|
|
16
|
+
* @seeAlso src/types/types.ts (design-schema types; separate concern)
|
|
17
|
+
* @seeAlso functions/auth.ts (API endpoint that returns User shape)
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
// ─── PRINCIPAL ─────────────────────────────────────────────────────────────────
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The resolved user/principal context returned by the auth API and stored
|
|
24
|
+
* in `AuthContext`. Populated from the `people`, `accounts`, and `roles`
|
|
25
|
+
* tables via the `get_account_hierarchy` RPC.
|
|
26
|
+
*
|
|
27
|
+
* @prop id - UUID of the `people` row (matches `auth.users.id`)
|
|
28
|
+
* @prop email - Primary email address
|
|
29
|
+
* @prop full_name - Display name
|
|
30
|
+
* @prop account_id - UUID of the user's primary account
|
|
31
|
+
* @prop account - Hydrated primary `Account` object (optional join)
|
|
32
|
+
* @prop roles - Flat list of role slugs (e.g. `['admin', 'member']`)
|
|
33
|
+
* @prop permissions - Flat list of permission slugs
|
|
34
|
+
* @prop is_system_admin - Convenience flag set when `system_admin` is in roles
|
|
35
|
+
* @prop accessible_accounts - All accounts the user can act on (multi-tenancy)
|
|
36
|
+
*/
|
|
37
|
+
export interface User {
|
|
38
|
+
id: string
|
|
39
|
+
email: string
|
|
40
|
+
full_name: string
|
|
41
|
+
account_id: string
|
|
42
|
+
account?: Account
|
|
43
|
+
roles: string[] // Simplified for now
|
|
44
|
+
permissions: string[] // Simplified for now
|
|
45
|
+
is_system_admin?: boolean
|
|
46
|
+
accessible_accounts?: Account[]
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* A Spine account record. Used as the primary organisational scope for all
|
|
51
|
+
* data access.
|
|
52
|
+
*
|
|
53
|
+
* @prop slug - URL-safe unique identifier
|
|
54
|
+
* @prop display_name - Human-readable name shown in UI
|
|
55
|
+
* @prop account_type - `'tenant'` | `'organization'` | `'individual'`
|
|
56
|
+
* @prop owner_account_id - Parent account UUID for tenant hierarchy
|
|
57
|
+
* @prop metadata - Arbitrary extra fields set by the application layer
|
|
58
|
+
*/
|
|
59
|
+
export interface Account {
|
|
60
|
+
id: string
|
|
61
|
+
slug: string
|
|
62
|
+
display_name: string
|
|
63
|
+
name?: string
|
|
64
|
+
account_type?: string
|
|
65
|
+
owner_account_id?: string
|
|
66
|
+
metadata?: Record<string, any>
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ─── ROLES & PERMISSIONS ──────────────────────────────────────────────────────────
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* A role record from the `v2.roles` table.
|
|
73
|
+
*
|
|
74
|
+
* @prop slug - Unique role identifier used in permission checks
|
|
75
|
+
* @prop permissions - Granular permission list attached to this role
|
|
76
|
+
*/
|
|
77
|
+
export interface Role {
|
|
78
|
+
id: string
|
|
79
|
+
slug: string
|
|
80
|
+
name: string
|
|
81
|
+
description?: string
|
|
82
|
+
permissions: Permission[]
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* A single permission grant.
|
|
87
|
+
*
|
|
88
|
+
* @prop resource - The entity or system resource being guarded
|
|
89
|
+
* @prop action - The allowed action (`'read'`, `'write'`, `'delete'`, etc.)
|
|
90
|
+
* @prop scope - Optional scope qualifier (e.g. `'own'` vs `'any'`)
|
|
91
|
+
*/
|
|
92
|
+
export interface Permission {
|
|
93
|
+
id: string
|
|
94
|
+
resource: string
|
|
95
|
+
action: string
|
|
96
|
+
scope?: string
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ─── AUTH FLOW ─────────────────────────────────────────────────────────────────
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Shape of a successful auth response (Supabase sign-in).
|
|
103
|
+
* Not used directly by Spine — the frontend uses `supabase.auth.signInWithPassword`
|
|
104
|
+
* and then calls `fetchUserContext`; this type documents the underlying contract.
|
|
105
|
+
*/
|
|
106
|
+
export interface AuthResponse {
|
|
107
|
+
user: User
|
|
108
|
+
access_token: string
|
|
109
|
+
refresh_token: string
|
|
110
|
+
expires_in: number
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Credentials for `supabase.auth.signInWithPassword` via `AuthContext.login`. */
|
|
114
|
+
export interface LoginCredentials {
|
|
115
|
+
email: string
|
|
116
|
+
password: string
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Registration data for new user sign-up flows. */
|
|
120
|
+
export interface RegisterData {
|
|
121
|
+
email: string
|
|
122
|
+
password: string
|
|
123
|
+
full_name: string
|
|
124
|
+
account_name?: string
|
|
125
|
+
}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module src/types/types
|
|
3
|
+
* @audience installer
|
|
4
|
+
* @layer frontend-hook
|
|
5
|
+
* @stability stable
|
|
6
|
+
*
|
|
7
|
+
* Core TypeScript type definitions for the Spine frontend. These types
|
|
8
|
+
* mirror the `design_schema` and API response shapes used across hooks,
|
|
9
|
+
* components, and pages.
|
|
10
|
+
*
|
|
11
|
+
* **Type hierarchy:**
|
|
12
|
+
* ```
|
|
13
|
+
* DesignSchema
|
|
14
|
+
* ├── fields: Record<string, FieldDefinition>
|
|
15
|
+
* ├── views: Record<string, View> ← ListView | DetailView
|
|
16
|
+
* ├── record_permissions
|
|
17
|
+
* └── functionality?: FunctionalityBindings
|
|
18
|
+
* ItemType ← row in v2.types table
|
|
19
|
+
* Item ← row in v2.items table
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* **`system` flag on `FieldDefinition`:** When `system: true`, the field
|
|
23
|
+
* maps to a real DB column (e.g. `title`, `status`). When absent or false,
|
|
24
|
+
* the field value lives in the `data` JSONB column.
|
|
25
|
+
*
|
|
26
|
+
* @seeAlso src/hooks/useSchemaRecord.ts (consumes FieldDefinition[])
|
|
27
|
+
* @seeAlso src/hooks/useForm.ts (consumes FieldDefinition[] for validation)
|
|
28
|
+
* @seeAlso src/hooks/useListSchema.ts (consumes DesignSchema + View)
|
|
29
|
+
* @seeAlso functions/_shared/schema-utils.ts (server-side schema generation)
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
// ─── FIELD DEFINITIONS ───────────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Definition of a single field in a `design_schema`. Drives both UI rendering
|
|
36
|
+
* and client-side validation in `useForm`.
|
|
37
|
+
*
|
|
38
|
+
* @prop data_type - Controls rendering widget and validation rules
|
|
39
|
+
* @prop label - Human-readable display label
|
|
40
|
+
* @prop required - Whether the field must be non-empty on save
|
|
41
|
+
* @prop system - If true, maps to a top-level DB column; false/absent → `data` JSONB
|
|
42
|
+
* @prop name - Injected at runtime by hooks; not stored in the schema itself
|
|
43
|
+
* @prop validation - Type-specific constraint overrides
|
|
44
|
+
* @prop options - Choice list for select/multiselect/radio fields
|
|
45
|
+
* @prop permissions - Role-based read/write access map; absent = all roles allowed
|
|
46
|
+
*/
|
|
47
|
+
export interface FieldDefinition {
|
|
48
|
+
data_type: 'text' | 'textarea' | 'rich_text' | 'email' | 'phone' | 'url' |
|
|
49
|
+
'number' | 'currency' | 'range' | 'date' | 'datetime' | 'boolean' |
|
|
50
|
+
'checkbox' | 'select' | 'multiselect' | 'radio' | 'color' |
|
|
51
|
+
'file' | 'image' | 'json' | 'reference' | 'address'
|
|
52
|
+
label: string
|
|
53
|
+
required: boolean
|
|
54
|
+
system?: boolean // true = DB column, false/absent = custom field in .data
|
|
55
|
+
// Runtime identity — populated by SchemaFields when building field arrays from schema
|
|
56
|
+
name?: string
|
|
57
|
+
// UI hints — informational only, do not affect data contract or permissions
|
|
58
|
+
placeholder?: string
|
|
59
|
+
description?: string
|
|
60
|
+
rows?: number
|
|
61
|
+
min?: number
|
|
62
|
+
max?: number
|
|
63
|
+
step?: number
|
|
64
|
+
readonly?: boolean
|
|
65
|
+
disabled?: boolean
|
|
66
|
+
validation?: {
|
|
67
|
+
pattern?: string
|
|
68
|
+
minLength?: number
|
|
69
|
+
maxLength?: number
|
|
70
|
+
min?: number
|
|
71
|
+
max?: number
|
|
72
|
+
step?: number
|
|
73
|
+
integer?: boolean
|
|
74
|
+
precision?: number
|
|
75
|
+
maxSize?: number
|
|
76
|
+
allowedTypes?: string[]
|
|
77
|
+
maxWidth?: number
|
|
78
|
+
maxHeight?: number
|
|
79
|
+
currency_code?: string
|
|
80
|
+
reference_kind?: string
|
|
81
|
+
reference_type?: string
|
|
82
|
+
}
|
|
83
|
+
// Type-specific constraint properties (move out of validation for clarity)
|
|
84
|
+
options?: (string | { value: string; label: string })[] // For select/multiselect/radio
|
|
85
|
+
permissions?: {
|
|
86
|
+
[role: string]: string[] // Array of actions: ["read", "write"]
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ─── VIEW TYPES ─────────────────────────────────────────────────────────────────
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Per-field display/behaviour config within a view. Stored as
|
|
94
|
+
* `design_schema.views[viewSlug].fields[fieldName]`.
|
|
95
|
+
*
|
|
96
|
+
* @prop display_type - Override the default widget for this field in this view
|
|
97
|
+
* @prop sortable - Whether the column header shows a sort toggle in list views
|
|
98
|
+
* @prop searchable - Whether the field is included in free-text search
|
|
99
|
+
*/
|
|
100
|
+
export interface ViewFieldConfig {
|
|
101
|
+
display_type: 'input' | 'textarea' | 'rich_text' | 'select' | 'multiselect' |
|
|
102
|
+
'radio' | 'checkbox' | 'switch' | 'date_picker' | 'datetime_picker' |
|
|
103
|
+
'color_picker' | 'file_upload' | 'image_upload' | 'range_slider' |
|
|
104
|
+
'rating' | 'autocomplete' | 'address_form' | 'reference_picker' |
|
|
105
|
+
'text' | 'badge' | 'timestamp' | 'currency' | 'number'
|
|
106
|
+
sortable?: boolean
|
|
107
|
+
searchable?: boolean
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* A list view definition. Rendered by `DataListPage` as a table, card grid,
|
|
112
|
+
* or Kanban board depending on `display`.
|
|
113
|
+
*
|
|
114
|
+
* @prop fields - Ordered map of field name → `ViewFieldConfig`
|
|
115
|
+
* @prop default_sort - Initial sort applied before user interaction
|
|
116
|
+
* @prop filters - Field names to expose as filter controls
|
|
117
|
+
* @prop stats - Summary stat cards shown above the list
|
|
118
|
+
* @prop group_by - Field to use as board column grouping (`display: 'board'` only)
|
|
119
|
+
*/
|
|
120
|
+
export interface ListView {
|
|
121
|
+
type: 'list'
|
|
122
|
+
display: 'table' | 'card' | 'board'
|
|
123
|
+
label: string
|
|
124
|
+
fields: Record<string, ViewFieldConfig>
|
|
125
|
+
default_sort?: {
|
|
126
|
+
field: string
|
|
127
|
+
direction: 'asc' | 'desc'
|
|
128
|
+
}
|
|
129
|
+
filters?: string[]
|
|
130
|
+
stats?: Array<{
|
|
131
|
+
title: string
|
|
132
|
+
type: 'count' | 'filter_count'
|
|
133
|
+
icon?: string
|
|
134
|
+
color?: string
|
|
135
|
+
filter?: Record<string, any>
|
|
136
|
+
}>
|
|
137
|
+
group_by?: string // For board display
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* A single section within a `DetailView`. Groups related fields under
|
|
142
|
+
* an optional title. Field permissions from the schema still apply —
|
|
143
|
+
* there are no section-level permission overrides.
|
|
144
|
+
*/
|
|
145
|
+
export interface DetailViewSection {
|
|
146
|
+
title: string
|
|
147
|
+
fields: Record<string, ViewFieldConfig>
|
|
148
|
+
// Note: No view-level permissions - field permissions from schema apply
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* A detail view definition. Rendered by `DataDetailPage` as a sectioned
|
|
153
|
+
* record form.
|
|
154
|
+
*/
|
|
155
|
+
export interface DetailView {
|
|
156
|
+
type: 'detail'
|
|
157
|
+
label: string
|
|
158
|
+
sections: DetailViewSection[]
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** Discriminated union of all supported view types. */
|
|
162
|
+
export type View = ListView | DetailView
|
|
163
|
+
|
|
164
|
+
// ─── FUNCTIONALITY BINDINGS ──────────────────────────────────────────────────────────
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Optional automation and integration bindings attached to a `DesignSchema`.
|
|
168
|
+
* Each array entry describes a trigger condition and the target pipeline,
|
|
169
|
+
* agent, embedding, integration, or constraint.
|
|
170
|
+
*
|
|
171
|
+
* These bindings are evaluated by API handlers and the system cron — not
|
|
172
|
+
* by the frontend. They are included here as a type contract so the frontend
|
|
173
|
+
* can read and display binding metadata without making blind `any` casts.
|
|
174
|
+
*/
|
|
175
|
+
export interface FunctionalityBindings {
|
|
176
|
+
pipelines?: Array<{
|
|
177
|
+
pipeline_id: string
|
|
178
|
+
trigger: 'manual' | 'on_create' | 'on_update' | 'on_field_change' | 'on_delete' | 'scheduled'
|
|
179
|
+
field?: string // For on_field_change
|
|
180
|
+
condition?: string // Expression string
|
|
181
|
+
roles: string[]
|
|
182
|
+
}>
|
|
183
|
+
ai_agents?: Array<{
|
|
184
|
+
agent_id: string
|
|
185
|
+
capabilities: ('read' | 'summarize' | 'suggest' | 'update')[]
|
|
186
|
+
trigger: 'manual' | 'on_create' | 'on_update' | 'on_field_change'
|
|
187
|
+
roles: string[]
|
|
188
|
+
}>
|
|
189
|
+
embeddings?: Array<{
|
|
190
|
+
slug: string
|
|
191
|
+
fields: string[]
|
|
192
|
+
model: string
|
|
193
|
+
vector_column: string
|
|
194
|
+
trigger: 'on_create' | 'on_update' | 'on_create_or_update'
|
|
195
|
+
}>
|
|
196
|
+
integrations?: Array<{
|
|
197
|
+
integration_id: string
|
|
198
|
+
sync: 'bidirectional' | 'inbound' | 'outbound'
|
|
199
|
+
field_map: Record<string, {
|
|
200
|
+
external_field: string
|
|
201
|
+
direction: 'both' | 'inbound' | 'outbound' | 'none'
|
|
202
|
+
transform?: string
|
|
203
|
+
}>
|
|
204
|
+
trigger: 'on_create' | 'on_update' | 'on_create_or_update'
|
|
205
|
+
}>
|
|
206
|
+
constraints?: Array<{
|
|
207
|
+
type: 'unique' | 'conditional_required' | 'immutable'
|
|
208
|
+
fields?: string[] // For unique
|
|
209
|
+
field?: string // For conditional_required and immutable
|
|
210
|
+
condition?: string // For conditional_required
|
|
211
|
+
message: string
|
|
212
|
+
after?: 'create' | 'update' // For immutable
|
|
213
|
+
}>
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ─── DESIGN SCHEMA ────────────────────────────────────────────────────────────────
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* The complete design schema for a `types` record. Stored as a JSONB column
|
|
220
|
+
* (`design_schema`) and stamp-copied onto records at create time.
|
|
221
|
+
*
|
|
222
|
+
* @prop record_permissions - Role → allowed CRUD actions map for the entire record
|
|
223
|
+
* @prop fields - All field definitions keyed by field name
|
|
224
|
+
* @prop views - Named view definitions (`list`, `detail`, etc.)
|
|
225
|
+
* @prop functionality - Optional automation bindings (pipelines, agents, etc.)
|
|
226
|
+
*/
|
|
227
|
+
export interface DesignSchema {
|
|
228
|
+
record_permissions: {
|
|
229
|
+
[role: string]: string[] // Array of actions: ["create", "read", "update", "delete"]
|
|
230
|
+
}
|
|
231
|
+
fields: Record<string, FieldDefinition>
|
|
232
|
+
views: Record<string, View>
|
|
233
|
+
functionality?: FunctionalityBindings
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// ─── RECORD SHAPES ─────────────────────────────────────────────────────────────────
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* A row from the `v2.types` table. Represents a type definition (item type,
|
|
240
|
+
* account type, person type, etc.) including its full `design_schema`.
|
|
241
|
+
*
|
|
242
|
+
* @prop kind - Discriminator: `'item'` | `'account'` | `'person'` | etc.
|
|
243
|
+
* @prop design_schema - Full schema defining fields, views, and functionality
|
|
244
|
+
* @prop validation_schema - Auto-generated JSON Schema used for server-side validation
|
|
245
|
+
* @prop ownership - `'pack'` | `'tenant'` (pack-ownership tracking)
|
|
246
|
+
*/
|
|
247
|
+
export interface ItemType {
|
|
248
|
+
id: string
|
|
249
|
+
name: string
|
|
250
|
+
slug: string
|
|
251
|
+
kind: string
|
|
252
|
+
description?: string
|
|
253
|
+
icon?: string
|
|
254
|
+
color?: string
|
|
255
|
+
design_schema: DesignSchema
|
|
256
|
+
validation_schema: {
|
|
257
|
+
fields: Record<string, {
|
|
258
|
+
data_type: string
|
|
259
|
+
required?: boolean
|
|
260
|
+
[key: string]: any // Type-specific validation properties
|
|
261
|
+
}>
|
|
262
|
+
}
|
|
263
|
+
ownership: string
|
|
264
|
+
is_active: boolean
|
|
265
|
+
app_id?: string
|
|
266
|
+
app?: any
|
|
267
|
+
created_at: string
|
|
268
|
+
updated_at: string
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* A row from the `v2.items` table. The `data` JSONB column holds all
|
|
273
|
+
* custom field values; system fields (`title`, `status`, etc.) are top-level.
|
|
274
|
+
*
|
|
275
|
+
* @prop design_schema - Stamp of the type's schema at create time (for resilience
|
|
276
|
+
* to schema changes; may be stale relative to `types` table)
|
|
277
|
+
* @prop validation_schema - Stamp of the validation schema at create time
|
|
278
|
+
*/
|
|
279
|
+
export interface Item {
|
|
280
|
+
id: string
|
|
281
|
+
item_type_id: string
|
|
282
|
+
item_type_slug?: string
|
|
283
|
+
title: string
|
|
284
|
+
description?: string
|
|
285
|
+
status: string
|
|
286
|
+
is_active: boolean
|
|
287
|
+
data: Record<string, any>
|
|
288
|
+
created_at: string
|
|
289
|
+
updated_at: string
|
|
290
|
+
created_by?: string
|
|
291
|
+
account_id: string
|
|
292
|
+
app_id?: string
|
|
293
|
+
design_schema?: Record<string, any> // Schema snapshot at creation time
|
|
294
|
+
validation_schema?: Record<string, any> // Validation schema snapshot at creation time
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// ─── FORM & QUERY TYPES ───────────────────────────────────────────────────────────
|
|
298
|
+
|
|
299
|
+
/** A field-level validation failure from `useForm` or server-side validation. */
|
|
300
|
+
export interface ValidationError {
|
|
301
|
+
field: string
|
|
302
|
+
message: string
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/** Snapshot of form state — used as a shared type between `useForm` and form components. */
|
|
306
|
+
export interface FormState {
|
|
307
|
+
data: Record<string, any>
|
|
308
|
+
errors: Record<string, string>
|
|
309
|
+
touched: Record<string, boolean>
|
|
310
|
+
isSubmitting: boolean
|
|
311
|
+
isValid: boolean
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/** Pagination query parameters for list endpoints. */
|
|
315
|
+
export interface PaginationParams {
|
|
316
|
+
limit?: number
|
|
317
|
+
offset?: number
|
|
318
|
+
page?: number
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** Sort order specification for list endpoints. */
|
|
322
|
+
export interface SortParams {
|
|
323
|
+
field: string
|
|
324
|
+
direction: 'asc' | 'desc'
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/** Arbitrary key→value filter map for list endpoints. */
|
|
328
|
+
export interface FilterParams {
|
|
329
|
+
[key: string]: any
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/** Combined search, sort, filter, and pagination params for list queries. */
|
|
333
|
+
export interface SearchParams extends PaginationParams {
|
|
334
|
+
search?: string
|
|
335
|
+
sort?: SortParams
|
|
336
|
+
filters?: FilterParams
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// ─── UI DISPLAY TYPES ────────────────────────────────────────────────────────────────
|
|
340
|
+
|
|
341
|
+
/** A rendered column descriptor for list/table UI components. */
|
|
342
|
+
export interface EntityColumn {
|
|
343
|
+
key: string
|
|
344
|
+
label: string
|
|
345
|
+
sortable?: boolean
|
|
346
|
+
type?: string
|
|
347
|
+
display_type?: string
|
|
348
|
+
badgeColors?: Record<string, string>
|
|
349
|
+
maxLength?: number
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** A stat card shown above entity list pages (count or filtered count). */
|
|
353
|
+
export interface EntityStat {
|
|
354
|
+
title: string
|
|
355
|
+
type: 'count' | 'filter_count'
|
|
356
|
+
icon: string
|
|
357
|
+
color: string
|
|
358
|
+
filter?: Record<string, any>
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/** A filter control definition for entity list pages. */
|
|
362
|
+
export interface EntityFilter {
|
|
363
|
+
key: string
|
|
364
|
+
label: string
|
|
365
|
+
type: 'search' | 'enum' | 'boolean'
|
|
366
|
+
options?: string[]
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// ─── ITEM PROGRESS ───────────────────────────────────────────────────────────
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* A per-person, per-item progress record. Tracks pipeline status, score, and
|
|
373
|
+
* arbitrary interaction data for courses, onboarding, tasks, and quizzes.
|
|
374
|
+
*
|
|
375
|
+
* `title` is auto-composed as "<item title> — <person name>".
|
|
376
|
+
* `description` is auto-composed as "Completed · score 85 · 2 attempts".
|
|
377
|
+
* `data` holds extensible fields: attempts, time_spent, last_position, etc.
|
|
378
|
+
*
|
|
379
|
+
* INVARIANT: (person_id, item_id) is unique — state, not a log.
|
|
380
|
+
*/
|
|
381
|
+
export interface ItemProgress {
|
|
382
|
+
id: string
|
|
383
|
+
type_id: string
|
|
384
|
+
account_id: string
|
|
385
|
+
app_id: string | null
|
|
386
|
+
person_id: string
|
|
387
|
+
item_id: string
|
|
388
|
+
title: string | null
|
|
389
|
+
description: string | null
|
|
390
|
+
status: 'not_started' | 'in_progress' | 'completed' | string
|
|
391
|
+
score: number | null
|
|
392
|
+
data: {
|
|
393
|
+
attempts?: number
|
|
394
|
+
time_spent?: number
|
|
395
|
+
last_position?: number
|
|
396
|
+
started_at?: string
|
|
397
|
+
completed_at?: string
|
|
398
|
+
[key: string]: any
|
|
399
|
+
}
|
|
400
|
+
is_active: boolean
|
|
401
|
+
design_schema: Record<string, any>
|
|
402
|
+
validation_schema: Record<string, any>
|
|
403
|
+
created_by: string | null
|
|
404
|
+
updated_by: string | null
|
|
405
|
+
created_at: string
|
|
406
|
+
updated_at: string
|
|
407
|
+
}
|
package/STRUCTURE.md
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Spine Enterprise Directory Structure
|
|
2
|
+
|
|
3
|
+
This document explains the directory layout for the Spine framework.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
my-app/
|
|
9
|
+
├── .framework/ # 🔒 CLI-managed framework code (read-only)
|
|
10
|
+
├── custom/ # ✏️ Developer workspace (your code)
|
|
11
|
+
├── .assembled/ # 🏗️ Build output (gitignored)
|
|
12
|
+
├── config/ # ⚙️ Build tool configuration
|
|
13
|
+
├── scripts/ # 🔧 Build automation
|
|
14
|
+
├── archive/ # 📦 Historical artifacts
|
|
15
|
+
├── docs/ # 📚 Documentation
|
|
16
|
+
├── netlify.toml # 🌐 Netlify configuration (must be at root)
|
|
17
|
+
├── package.json # Root package manifest
|
|
18
|
+
└── STRUCTURE.md # This file
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Directory Details
|
|
22
|
+
|
|
23
|
+
### `.framework/` — Framework Core (Hidden)
|
|
24
|
+
**Managed by:** Spine CLI (read-only)
|
|
25
|
+
**Contains:**
|
|
26
|
+
- `functions/` — Core Netlify function handlers
|
|
27
|
+
- `src/` — Core React components (Admin shell, app router)
|
|
28
|
+
- `migrations/` — Base database schema
|
|
29
|
+
- `cli/` — Framework CLI tools
|
|
30
|
+
- `tests/` — Core test suites
|
|
31
|
+
|
|
32
|
+
**You should not edit files here.** The CLI manages updates to this directory.
|
|
33
|
+
|
|
34
|
+
### `custom/` — Developer Workspace
|
|
35
|
+
**Managed by:** You
|
|
36
|
+
**Contains:**
|
|
37
|
+
- `functions/` — Your custom Netlify function handlers
|
|
38
|
+
- `apps/` — Your applications (one folder per app)
|
|
39
|
+
- `components/` — Shared UI components across your apps
|
|
40
|
+
- `migrations/` — Your database schema changes
|
|
41
|
+
- `tests/` — Your test suites
|
|
42
|
+
|
|
43
|
+
**This is where you build your product.** Everything here is yours.
|
|
44
|
+
|
|
45
|
+
### `.assembled/` — Build Output (Hidden, Gitignored)
|
|
46
|
+
**Generated by:** Assembly scripts
|
|
47
|
+
**Contains:**
|
|
48
|
+
- `netlify/functions/` — Merged: `.framework/functions` + `custom/functions`
|
|
49
|
+
- `src/` — Merged: `.framework/src` + `custom/apps/*`
|
|
50
|
+
|
|
51
|
+
**Never edit files here.** This is rebuilt on every `netlify dev` or deployment.
|
|
52
|
+
|
|
53
|
+
### `config/` — Build Tool Configuration
|
|
54
|
+
**Contains:**
|
|
55
|
+
- `vite.config.ts` — Vite build configuration
|
|
56
|
+
- `tsconfig.json` — TypeScript configuration
|
|
57
|
+
- `tailwind.config.ts` — Styling configuration
|
|
58
|
+
- `postcss.config.js` — CSS processing
|
|
59
|
+
|
|
60
|
+
### `netlify.toml` — Netlify Configuration (Root)
|
|
61
|
+
**Must be at project root** (Netlify CLI requirement)
|
|
62
|
+
- Functions path: `.assembled/netlify/functions/`
|
|
63
|
+
- Dev server settings: port 3001 (Vite) → 8888 (Netlify proxy)
|
|
64
|
+
|
|
65
|
+
### `scripts/` — Build Automation
|
|
66
|
+
**Contains:**
|
|
67
|
+
- Assembly scripts that merge `.framework/` + `custom/` → `.assembled/`
|
|
68
|
+
- Verification scripts for integrity checking
|
|
69
|
+
|
|
70
|
+
### `archive/` — Historical Artifacts
|
|
71
|
+
**Contains:**
|
|
72
|
+
- Old audit documents
|
|
73
|
+
- Completed project reports
|
|
74
|
+
- Test artifacts
|
|
75
|
+
|
|
76
|
+
## Assembly Flow
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
Development:
|
|
80
|
+
.framework/ + custom/ ──► scripts/assemble.sh ──► .assembled/
|
|
81
|
+
──► netlify dev
|
|
82
|
+
|
|
83
|
+
Production:
|
|
84
|
+
.framework/ + custom/ ──► scripts/assemble.sh ──► .assembled/
|
|
85
|
+
──► Netlify deploy
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Path Aliases
|
|
89
|
+
|
|
90
|
+
After assembly, code uses these aliases:
|
|
91
|
+
- `@core` → `.framework/src/`
|
|
92
|
+
- `@custom` → `custom/apps/`
|
|
93
|
+
|
|
94
|
+
## Adding New Code
|
|
95
|
+
|
|
96
|
+
### New App
|
|
97
|
+
```bash
|
|
98
|
+
mkdir custom/apps/my-app
|
|
99
|
+
cd custom/apps/my-app
|
|
100
|
+
# Create src/, components/, pages/
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### New Function
|
|
104
|
+
```bash
|
|
105
|
+
touch custom/functions/my-handler.ts
|
|
106
|
+
# Edit with your logic
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### New Migration
|
|
110
|
+
```bash
|
|
111
|
+
touch custom/migrations/101_my_change.sql
|
|
112
|
+
# Write ALTER TABLE statements
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Updating Framework
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
spine-framework update
|
|
119
|
+
# CLI updates .framework/ to latest version
|
|
120
|
+
# Your custom/ code is untouched
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Important Rules
|
|
124
|
+
|
|
125
|
+
1. **Never edit `.framework/`** — use `custom/` instead
|
|
126
|
+
2. **Never commit `.assembled/`** — it's in `.gitignore`
|
|
127
|
+
3. **Always use assembly** — don't manually copy to `.assembled/`
|
|
128
|
+
4. **Test after update** — run `netlify dev` after `spine-framework update`
|
|
129
|
+
|
|
130
|
+
## Troubleshooting
|
|
131
|
+
|
|
132
|
+
### "Where do I put X?"
|
|
133
|
+
- Framework extension → `.framework/` (via CLI or PR)
|
|
134
|
+
- Custom business logic → `custom/`
|
|
135
|
+
- App-specific code → `custom/apps/{app-name}/`
|
|
136
|
+
|
|
137
|
+
### "Assembly failed"
|
|
138
|
+
1. Check both `.framework/` and `custom/` exist
|
|
139
|
+
2. Verify no duplicate function names
|
|
140
|
+
3. Run `scripts/assemble.sh` manually for error details
|
|
141
|
+
|
|
142
|
+
### "Functions not found"
|
|
143
|
+
1. Check `.assembled/netlify/functions/` exists
|
|
144
|
+
2. Verify `netlify.toml` (in project root) points to correct path
|
|
145
|
+
3. Ensure assembly ran without errors
|
|
146
|
+
|
|
147
|
+
### "Netlify dev can't connect"
|
|
148
|
+
1. Check Vite is running on port 3001
|
|
149
|
+
2. Verify `netlify.toml` is in project root (not config/)
|
|
150
|
+
3. Check `targetPort = 3001` in netlify.toml [dev] section
|