spine-framework 0.3.145 → 0.4.1
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/.env.example +76 -0
- package/.framework/.spine-manifest.json +19 -0
- package/.framework/cli/commands/agents.ts +61 -33
- package/.framework/cli/commands/auth.ts +60 -28
- package/.framework/cli/commands/create-app.ts +212 -80
- package/.framework/cli/commands/dev.ts +184 -68
- package/.framework/cli/commands/doctor.ts +324 -152
- package/.framework/cli/commands/generate.ts +119 -68
- package/.framework/cli/commands/init.ts +141 -242
- package/.framework/cli/commands/install-app.ts +1336 -314
- package/.framework/cli/commands/items.ts +31 -29
- package/.framework/cli/commands/migrate.ts +299 -156
- package/.framework/cli/commands/migrations.ts +62 -30
- package/.framework/cli/commands/pipelines.ts +31 -29
- package/.framework/cli/commands/status.ts +105 -45
- package/.framework/cli/commands/system.ts +47 -42
- package/.framework/cli/commands/test.ts +161 -102
- package/.framework/cli/commands/upgrade.ts +260 -0
- package/.framework/cli/commands/validate-app.ts +517 -161
- package/.framework/cli/context.ts +117 -85
- package/.framework/cli/env-loader.ts +74 -43
- package/.framework/cli/index.ts +70 -46
- package/.framework/cli/lib/project-files.ts +404 -0
- package/.framework/docs/guides/testing-guide.md +1 -1
- package/.framework/docs/runtime-types.md +72 -72
- package/.framework/functions/_shared/access.ts +84 -0
- package/.framework/functions/_shared/agent-runner.ts +5067 -1026
- package/.framework/functions/_shared/app-manifest.ts +214 -94
- package/.framework/functions/_shared/ast.ts +214 -0
- package/.framework/functions/_shared/audit.ts +91 -55
- package/.framework/functions/_shared/cil.ts +368 -127
- package/.framework/functions/_shared/db.ts +337 -68
- package/.framework/functions/_shared/funnel.ts +228 -0
- package/.framework/functions/_shared/geo.ts +105 -0
- package/.framework/functions/_shared/hash-api-key.ts +94 -17
- package/.framework/functions/_shared/index.ts +22 -224
- package/.framework/functions/_shared/kb.ts +832 -58
- package/.framework/functions/_shared/llm.ts +118 -18
- package/.framework/functions/_shared/logging.ts +317 -19
- package/.framework/functions/_shared/middleware.ts +701 -131
- package/.framework/functions/_shared/notify.ts +70 -0
- package/.framework/functions/_shared/outcomes.ts +34 -19
- package/.framework/functions/_shared/permissions.ts +501 -315
- package/.framework/functions/_shared/pipeline-runner.ts +704 -155
- package/.framework/functions/_shared/principal.ts +436 -263
- package/.framework/functions/_shared/rate-limit.ts +233 -0
- package/.framework/functions/_shared/resolve-credentials.ts +86 -19
- package/.framework/functions/_shared/resolve-ids.ts +203 -139
- package/.framework/functions/_shared/retry-deliveries.ts +51 -16
- package/.framework/functions/_shared/schema-utils.ts +602 -521
- package/.framework/functions/_shared/security.ts +345 -0
- package/.framework/functions/_shared/testing.ts +197 -172
- package/.framework/functions/_shared/tracing.ts +351 -21
- package/.framework/functions/_shared/trigger-engine.ts +425 -136
- package/.framework/functions/_shared/webhook-registration.ts +71 -70
- package/.framework/functions/_shared/webhook-registry.ts +126 -83
- package/.framework/functions/account-nodes.ts +30 -30
- package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
- package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
- package/.framework/functions/adapters/openai-outbound.ts +15 -16
- package/.framework/functions/admin-data.ts +596 -173
- package/.framework/functions/admin-funnel.ts +64 -60
- package/.framework/functions/admin-install-funnel.ts +84 -66
- package/.framework/functions/admin-signals.ts +69 -51
- package/.framework/functions/ai-agents.ts +431 -106
- package/.framework/functions/ai-interactions.ts +186 -112
- package/.framework/functions/api-keys.ts +107 -107
- package/.framework/functions/apps.ts +154 -136
- package/.framework/functions/auth.ts +83 -65
- package/.framework/functions/cil-agent-ingest.ts +189 -232
- package/.framework/functions/cil-agent.ts +433 -177
- package/.framework/functions/cil-callmap.ts +642 -430
- package/.framework/functions/cil-config.ts +139 -135
- package/.framework/functions/cil-context.ts +214 -127
- package/.framework/functions/cil-doc.ts +587 -458
- package/.framework/functions/cil-embeddings.ts +453 -364
- package/.framework/functions/cil-graph.ts +427 -142
- package/.framework/functions/cil-ingest.ts +1418 -1154
- package/.framework/functions/cil-pipeline.ts +276 -21
- package/.framework/functions/cil-project.ts +659 -132
- package/.framework/functions/cil-validate.ts +198 -164
- package/.framework/functions/debug-auth.ts +57 -55
- package/.framework/functions/deliveries.ts +80 -21
- package/.framework/functions/embeddings.ts +1023 -318
- package/.framework/functions/eval-harness.ts +146 -108
- package/.framework/functions/integration-outbound.ts +205 -75
- package/.framework/functions/integration-routes.ts +128 -23
- package/.framework/functions/integrations.ts +125 -100
- package/.framework/functions/invites.ts +1095 -460
- package/.framework/functions/item-progress.ts +158 -102
- package/.framework/functions/kb.ts +34 -10
- package/.framework/functions/logs.ts +133 -133
- package/.framework/functions/observability.ts +152 -122
- package/.framework/functions/pipeline-executions.ts +147 -132
- package/.framework/functions/pipelines.ts +134 -119
- package/.framework/functions/prompt-configs.ts +96 -80
- package/.framework/functions/roles.ts +112 -82
- package/.framework/functions/security.ts +450 -0
- package/.framework/functions/system-cron.ts +117 -80
- package/.framework/functions/system.ts +158 -98
- package/.framework/functions/tests.ts +29 -29
- package/.framework/functions/timers.ts +94 -95
- package/.framework/functions/trigger-scheduler.ts +10 -0
- package/.framework/functions/triggers.ts +179 -149
- package/.framework/functions/types.ts +137 -125
- package/.framework/mcp/index.ts +133 -0
- package/.framework/mcp/load-env.ts +60 -0
- package/.framework/mcp/shared/app-manifest.ts +275 -0
- package/.framework/mcp/shared/db.ts +477 -0
- package/.framework/mcp/shared/kb.ts +118 -0
- package/.framework/mcp/tools/architect.ts +431 -0
- package/.framework/mcp/tools/cil/context.ts +345 -0
- package/.framework/mcp/tools/cil/graph.ts +242 -0
- package/.framework/mcp/tools/cil/ingest.ts +1217 -0
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
- package/.framework/mcp/tools/cil/pipeline.ts +767 -0
- package/.framework/mcp/tools/cil/project.ts +791 -0
- package/.framework/mcp/tools/cil/retrieval.ts +336 -0
- package/.framework/mcp/tools/cil/search-core.ts +454 -0
- package/.framework/mcp/tools/cil/search.ts +97 -0
- package/.framework/mcp/tools/cil/suggest.ts +186 -0
- package/.framework/mcp/tools/cil/validate.ts +1369 -0
- package/.framework/mcp/tools/kb/delete.ts +139 -0
- package/.framework/mcp/tools/kb/index.ts +52 -0
- package/.framework/mcp/tools/kb/ingest.ts +84 -0
- package/.framework/mcp/tools/kb/list-types.ts +102 -0
- package/.framework/mcp/tools/kb/publish.ts +100 -0
- package/.framework/mcp/tools/kb/reindex.ts +86 -0
- package/.framework/mcp/tools/kb/revoke.ts +85 -0
- package/.framework/mcp/tools/kb/search.ts +101 -0
- package/.framework/mcp/tools/kb/upsert.ts +125 -0
- package/.framework/mcp/tools/observability.ts +510 -0
- package/.framework/migrations/001_core_schema.sql +15 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
- package/.framework/migrations/003_core_system_data.sql +16 -1
- package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
- package/.framework/migrations/005_core_observability.sql +17 -1
- package/.framework/migrations/006_security_hardening_rls.sql +15 -0
- package/.framework/migrations/007_kb_article_list.sql +17 -1
- package/.framework/migrations/008_items_target.sql +15 -0
- package/.framework/migrations/009_roles_slug_unique.sql +15 -0
- package/.framework/migrations/010_auth_user_trigger.sql +15 -0
- package/.framework/migrations/011_spine_system_account.sql +16 -0
- package/.framework/migrations/012_service_role_grants.sql +16 -0
- package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
- package/.framework/migrations/014_apps_required_roles.sql +16 -0
- package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
- package/.framework/migrations/016_cil_types.sql +281 -0
- package/.framework/migrations/017_cil_stable_ids.sql +37 -0
- package/.framework/migrations/018_runtime_tables.sql +129 -0
- package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
- package/.framework/migrations/020_schema_reconciliation.sql +67 -0
- package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
- package/.framework/migrations/032_cil_status_migration.sql +73 -0
- package/.framework/migrations/033_cil_versioning.sql +73 -0
- package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
- package/.framework/migrations/035_rate_limits.sql +55 -0
- package/.framework/migrations/036_demo_record_flags.sql +72 -0
- package/.framework/migrations/037_kb_types_canonical.sql +244 -0
- package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
- package/.framework/migrations/042_registration_hierarchy.sql +309 -0
- package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
- package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
- package/.framework/migrations/045_security_critical_rls.sql +139 -0
- package/.framework/migrations/046_security_missing_rls.sql +79 -0
- package/.framework/migrations/047_people_updated_by.sql +27 -0
- package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
- package/.framework/migrations/049_security_blocklist.sql +148 -0
- package/.framework/migrations/050_notifications.sql +49 -0
- package/.framework/migrations/051_message_agent_fields.sql +74 -0
- package/.framework/migrations/052_registration_security.sql +421 -0
- package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
- package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
- package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
- package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
- package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
- package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
- package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
- package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
- package/.framework/migrations/061_fk_dedup.sql +32 -0
- package/.framework/public/spine-logo.svg +10 -3
- package/.framework/scripts/app-install-cli.ts +190 -93
- package/.framework/scripts/assemble-frontend.sh +127 -44
- package/.framework/scripts/assemble-functions.sh +128 -30
- package/.framework/scripts/boundary-check.sh +6 -2
- package/.framework/scripts/build-manifest.sh +24 -68
- package/.framework/scripts/check-core-integrity.sh +15 -76
- package/.framework/scripts/checksum-manifest.mts +343 -0
- package/.framework/scripts/cil-migrate-markers.ts +403 -0
- package/.framework/scripts/fix-cil-markers.mjs +176 -0
- package/.framework/scripts/verify-integrity.sh +21 -57
- package/.framework/scripts/verify-manifest.mts +305 -0
- package/.framework/seeds/types/funnel_signal_use.json +74 -21
- package/.framework/seeds/types/spine_instance.json +73 -21
- package/.framework/src/App.tsx +118 -72
- package/.framework/src/apps/admin/index.tsx +855 -58
- package/.framework/src/components/AppWrapper.tsx +43 -45
- package/.framework/src/components/CustomAppLoader.tsx +160 -116
- package/.framework/src/components/admin/AdminListPage.tsx +46 -44
- package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
- package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
- package/.framework/src/components/admin/PageInstructions.tsx +98 -2
- package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
- package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
- package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
- package/.framework/src/components/app-sidebar.tsx +42 -45
- package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
- package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
- package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
- package/.framework/src/components/kb/KBArticleList.tsx +251 -10
- package/.framework/src/components/layout/AppShell.tsx +51 -45
- package/.framework/src/components/layout/Header.tsx +42 -43
- package/.framework/src/components/layout/Layout.tsx +46 -46
- package/.framework/src/components/layout/Sidebar.tsx +196 -96
- package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
- package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
- package/.framework/src/components/runtime/DataFilters.tsx +49 -74
- package/.framework/src/components/runtime/DataHeader.tsx +53 -32
- package/.framework/src/components/runtime/DataListPage.tsx +51 -155
- package/.framework/src/components/runtime/DataStats.tsx +66 -44
- package/.framework/src/components/runtime/DataTable.tsx +49 -149
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
- package/.framework/src/components/runtime/index.ts +119 -16
- package/.framework/src/components/search-form.tsx +46 -29
- package/.framework/src/components/shared/AgentView.tsx +65 -48
- package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
- package/.framework/src/components/shared/InviteManager.tsx +207 -97
- package/.framework/src/components/shared/MemberList.tsx +97 -0
- package/.framework/src/components/shared/SchemaFields.tsx +107 -86
- package/.framework/src/components/ui/DataTable.tsx +80 -68
- package/.framework/src/components/ui/Form.tsx +157 -146
- package/.framework/src/components/ui/ItemCard.tsx +74 -67
- package/.framework/src/components/ui/ItemListView.tsx +73 -68
- package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
- package/.framework/src/components/ui/Modal.tsx +78 -68
- package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
- package/.framework/src/components/ui/accordion.tsx +85 -86
- package/.framework/src/components/ui/alert-dialog.tsx +197 -184
- package/.framework/src/components/ui/alert.tsx +105 -94
- package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
- package/.framework/src/components/ui/avatar.tsx +122 -107
- package/.framework/src/components/ui/badge.tsx +60 -55
- package/.framework/src/components/ui/breadcrumb.tsx +127 -128
- package/.framework/src/components/ui/button-group.tsx +86 -72
- package/.framework/src/components/ui/button.tsx +71 -50
- package/.framework/src/components/ui/calendar.tsx +72 -57
- package/.framework/src/components/ui/card.tsx +136 -129
- package/.framework/src/components/ui/carousel.tsx +226 -107
- package/.framework/src/components/ui/chart.tsx +252 -147
- package/.framework/src/components/ui/checkbox.tsx +43 -44
- package/.framework/src/components/ui/collapsible.tsx +86 -71
- package/.framework/src/components/ui/combobox.tsx +282 -249
- package/.framework/src/components/ui/command.tsx +158 -146
- package/.framework/src/components/ui/context-menu.tsx +239 -240
- package/.framework/src/components/ui/dialog.tsx +174 -157
- package/.framework/src/components/ui/direction.tsx +72 -56
- package/.framework/src/components/ui/drawer.tsx +168 -169
- package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
- package/.framework/src/components/ui/empty.tsx +131 -120
- package/.framework/src/components/ui/field.tsx +205 -173
- package/.framework/src/components/ui/hover-card.tsx +71 -72
- package/.framework/src/components/ui/input-group.tsx +148 -133
- package/.framework/src/components/ui/input-otp.tsx +99 -86
- package/.framework/src/components/ui/input.tsx +43 -41
- package/.framework/src/components/ui/item.tsx +207 -185
- package/.framework/src/components/ui/kbd.tsx +57 -56
- package/.framework/src/components/ui/label.tsx +45 -41
- package/.framework/src/components/ui/menubar.tsx +268 -236
- package/.framework/src/components/ui/native-select.tsx +85 -86
- package/.framework/src/components/ui/navigation-menu.tsx +166 -156
- package/.framework/src/components/ui/pagination.tsx +131 -141
- package/.framework/src/components/ui/popover.tsx +125 -128
- package/.framework/src/components/ui/progress.tsx +47 -44
- package/.framework/src/components/ui/radio-group.tsx +60 -55
- package/.framework/src/components/ui/resizable.tsx +85 -72
- package/.framework/src/components/ui/scroll-area.tsx +57 -58
- package/.framework/src/components/ui/select.tsx +182 -169
- package/.framework/src/components/ui/separator.tsx +42 -43
- package/.framework/src/components/ui/sheet.tsx +170 -159
- package/.framework/src/components/ui/sidebar.tsx +395 -398
- package/.framework/src/components/ui/skeleton.tsx +42 -43
- package/.framework/src/components/ui/slider.tsx +61 -44
- package/.framework/src/components/ui/sonner.tsx +44 -44
- package/.framework/src/components/ui/spinner.tsx +47 -42
- package/.framework/src/components/ui/switch.tsx +56 -42
- package/.framework/src/components/ui/table-primitives.tsx +272 -132
- package/.framework/src/components/ui/table.tsx +140 -142
- package/.framework/src/components/ui/tabs.tsx +110 -93
- package/.framework/src/components/ui/textarea.tsx +43 -44
- package/.framework/src/components/ui/toggle-group.tsx +87 -71
- package/.framework/src/components/ui/toggle.tsx +56 -56
- package/.framework/src/components/ui/tooltip.tsx +99 -85
- package/.framework/src/contexts/AppContext.tsx +166 -114
- package/.framework/src/contexts/AuthContext.tsx +232 -137
- package/.framework/src/hooks/use-mobile.ts +43 -44
- package/.framework/src/hooks/useApi.ts +185 -172
- package/.framework/src/hooks/useAppPath.ts +31 -29
- package/.framework/src/hooks/useApps.ts +77 -42
- package/.framework/src/hooks/useEntityList.ts +66 -29
- package/.framework/src/hooks/useEntityRecord.ts +76 -32
- package/.framework/src/hooks/useForm.ts +62 -30
- package/.framework/src/hooks/useListSchema.ts +60 -43
- package/.framework/src/hooks/useSchemaRecord.ts +115 -95
- package/.framework/src/lib/api.ts +258 -134
- package/.framework/src/lib/registration.ts +181 -0
- package/.framework/src/lib/supabase.ts +118 -81
- package/.framework/src/lib/utils.ts +266 -266
- package/.framework/src/main.tsx +43 -44
- package/.framework/src/pages/DashboardPage.tsx +44 -43
- package/.framework/src/pages/NoAppPage.tsx +50 -0
- package/.framework/src/pages/NotFoundPage.tsx +32 -29
- package/.framework/src/pages/SetupPage.tsx +34 -33
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
- package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
- package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
- package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
- package/.framework/src/pages/admin/AppsPage.tsx +45 -42
- package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
- package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
- package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
- package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
- package/.framework/src/pages/admin/LogsPage.tsx +87 -137
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
- package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
- package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
- package/.framework/src/pages/admin/RolesPage.tsx +47 -164
- package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
- package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
- package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
- package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
- package/.framework/src/pages/admin/TimersPage.tsx +44 -42
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
- package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
- package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
- package/.framework/src/pages/admin/TypesPage.tsx +45 -42
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
- package/.framework/src/pages/auth/LoginPage.tsx +38 -32
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
- package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
- package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
- package/.framework/src/types/auth.ts +101 -93
- package/.framework/src/types/types.ts +283 -262
- package/.framework/templates/project.json +87 -0
- package/.framework/templates/spine.config.neutral.json +7 -0
- package/.framework/tests/api/api-surface.test.ts +381 -0
- package/.framework/tests/fixtures/seed.ts +427 -0
- package/.framework/tests/fixtures/teardown.ts +228 -0
- package/.framework/tests/reporter.ts +351 -0
- package/.framework/tests/setup.ts +135 -0
- package/.framework/tests/ui/ui-sweep.ts +278 -0
- package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
- package/.framework/tests/unit/agent-runner.test.ts +2389 -0
- package/.framework/tests/unit/ai-interactions.test.ts +81 -0
- package/.framework/tests/unit/app-manifest.test.ts +359 -0
- package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
- package/.framework/tests/unit/cil-determinism.test.ts +85 -0
- package/.framework/tests/unit/core-isolation.test.ts +153 -0
- package/.framework/tests/unit/funnel-signals.test.ts +135 -0
- package/.framework/tests/unit/install-app.test.ts +1759 -0
- package/.framework/tests/unit/invites-security.test.ts +572 -0
- package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
- package/.framework/tests/unit/kb-search.test.ts +119 -0
- package/.framework/tests/unit/migrate.test.ts +509 -0
- package/.framework/tests/unit/notify.test.ts +136 -0
- package/.framework/tests/unit/permissions.test.ts +269 -0
- package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
- package/.framework/tests/unit/principal-cache.test.ts +138 -0
- package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
- package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
- package/.framework/tests/unit/schema-utils.test.ts +225 -0
- package/.framework/tests/unit/trigger-engine.test.ts +513 -0
- package/.framework/tests/unit/validate-app.test.ts +527 -0
- package/README.md +34 -3
- package/bin/spine-framework.cjs +1 -0
- package/config/tailwind.config.cjs +7 -0
- package/config/tsconfig.functions.json +42 -0
- package/config/tsconfig.json +37 -9
- package/config/vite.config.ts +31 -2
- package/netlify.toml +31 -3
- package/package.json +46 -29
- package/scripts/assemble-frontend.sh +127 -44
- package/scripts/assemble-functions.sh +127 -29
- package/scripts/boundary-check.sh +6 -2
- package/scripts/build-manifest.sh +24 -68
- package/scripts/checksum-manifest.mts +345 -0
- package/scripts/dev-clean.sh +86 -0
- package/scripts/dev-netlify.sh +49 -0
- package/scripts/netlify-dev-wrapper.sh +2 -0
- package/scripts/verify-install.ts +358 -0
- package/scripts/verify-integrity.sh +21 -57
- package/scripts/verify-manifest.mts +305 -0
- package/templates/project/gitignore +45 -0
- package/{config → templates/project}/package-lock.json +22335 -9366
- package/vitest.config.ts +46 -0
- package/.framework/public/spine.config.json +0 -91
- package/config/deno.lock +0 -108
- package/config/tsconfig.node.tsbuildinfo +0 -1
- package/config/tsconfig.tsbuildinfo +0 -1
- package/config/vite.config.d.ts +0 -2
- package/custom/.devin/AGENT.md +0 -357
- package/custom/.devin/skills/install-app/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
- package/custom/.devin/workflows/app-install.yaml +0 -83
- package/custom/README.md +0 -79
- package/docs/README.md +0 -15
- package/scripts/app-install-cli.ts +0 -286
- package/scripts/check-core-integrity.sh +0 -82
- package/scripts/ingest-chunks.cjs +0 -202
- package/scripts/kb-chunk-parser.cjs +0 -312
- package/scripts/kb-chunk-parser.ts +0 -330
- package/scripts/kb-ingest-docs.ts +0 -203
- package/scripts/load-test-app-install.ts +0 -484
- package/scripts/test-login.js +0 -33
- package/spine.config.json +0 -91
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:file_header:constant" type="constant" identity="file_header" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Idempotent fixture seed for integration tests"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide file-level documentation and metadata for the seed fixture"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="File metadata and JSDoc conventions" outputs="JSDoc metadata" errors="" side_effects="None; documentation only"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Declares the seed file scope, audience, layer, stability, and teardown contract" notable_decisions="test- prefix for safe teardown"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
/// <reference types="node" />
|
|
10
|
+
/**
|
|
11
|
+
* @module tests/fixtures/seed
|
|
12
|
+
* @audience core-contributor
|
|
13
|
+
* @layer test-infrastructure
|
|
14
|
+
* @stability stable
|
|
15
|
+
*
|
|
16
|
+
* Idempotent fixture seed for integration tests. Upserts canonical test data
|
|
17
|
+
* into the public schema under SPINE_TEST_ACCOUNT_ID. All rows use slugs
|
|
18
|
+
* prefixed with `test-` so teardown.ts can clean them up safely.
|
|
19
|
+
*
|
|
20
|
+
* Run before integration tests: `tsx v2-core/tests/fixtures/seed.ts`
|
|
21
|
+
*
|
|
22
|
+
* @seeAlso tests/fixtures/teardown.ts
|
|
23
|
+
*/
|
|
24
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Idempotent fixture seed for integration tests'; No verified external callers; imports: none"]
|
|
25
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
26
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
27
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
28
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
29
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
30
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:file_header:constant"]
|
|
31
|
+
|
|
32
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
33
|
+
// CIL[DOC-MACRO purpose="Load environment and initialize the Supabase client"]
|
|
34
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Resolve env files and create the Supabase client instance"]
|
|
35
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
36
|
+
// CIL[DOC-CONTRACT inputs=".xenv.test or .xenv; process.env" outputs="populated process.env; imported createClient" errors="" side_effects="Reads env files; mutates process.env"]
|
|
37
|
+
// CIL[DOC-MICRO logic_summary="Reads .xenv files and imports the createClient dependency" notable_decisions="Uses fileURLToPath for ESM __dirname"]
|
|
38
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
39
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
40
|
+
// CIL[DOC-AUDIENCE audience="core-contributor"]
|
|
41
|
+
import { readFileSync, existsSync } from 'fs'
|
|
42
|
+
import { resolve, dirname } from 'path'
|
|
43
|
+
import { fileURLToPath } from 'url'
|
|
44
|
+
|
|
45
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
46
|
+
const __dirname = dirname(__filename)
|
|
47
|
+
|
|
48
|
+
function loadEnv() {
|
|
49
|
+
for (const name of ['.xenv.test', '.xenv']) {
|
|
50
|
+
const p = resolve(__dirname, '../../', name)
|
|
51
|
+
if (existsSync(p)) {
|
|
52
|
+
const lines = readFileSync(p, 'utf8').split('\n')
|
|
53
|
+
for (const line of lines) {
|
|
54
|
+
const t = line.trim()
|
|
55
|
+
if (!t || t.startsWith('#')) continue
|
|
56
|
+
const eq = t.indexOf('=')
|
|
57
|
+
if (eq === -1) continue
|
|
58
|
+
const k = t.slice(0, eq).trim()
|
|
59
|
+
const v = t.slice(eq + 1).trim().replace(/^["']|["']$/g, '')
|
|
60
|
+
if (!process.env[k]) process.env[k] = v
|
|
61
|
+
}
|
|
62
|
+
break
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
loadEnv()
|
|
68
|
+
|
|
69
|
+
import { createClient } from '@supabase/supabase-js'
|
|
70
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Load environment and initialize the Supabase client'; No verified external callers; imports: none"]
|
|
71
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
72
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
73
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
74
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
75
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
76
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:module_header:module_header"]
|
|
77
|
+
|
|
78
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:SUPABASE_URL:constant" type="constant" identity="SUPABASE_URL" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
79
|
+
// CIL[DOC-STABILITY stability="internal"]
|
|
80
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
81
|
+
// CIL[DOC-CONTEXT module="seed" layer="tests" related_files=".framework/tests/fixtures/seed.ts"]
|
|
82
|
+
// CIL[DOC-MACRO purpose="Provide the SUPABASE_URL environment value"]
|
|
83
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the SUPABASE_URL constant"]
|
|
84
|
+
// CIL[DOC-CONTRACT inputs="process.env.SUPABASE_URL" outputs="SUPABASE_URL constant" errors="" side_effects="None; scope-level constant"]
|
|
85
|
+
// CIL[DOC-MICRO logic_summary="Reads process.env.SUPABASE_URL with non-null assertion" notable_decisions="Runtime validation happens in env_check"]
|
|
86
|
+
const SUPABASE_URL = process.env.SUPABASE_URL!
|
|
87
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:SUPABASE_URL:constant"]
|
|
88
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:SERVICE_KEY:constant" type="constant" identity="SERVICE_KEY" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
89
|
+
// CIL[DOC-MACRO purpose="Provide the SERVICE_KEY environment value"]
|
|
90
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provide the SUPABASE_URL environment value'; No verified external callers; imports: none"]
|
|
91
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
92
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
93
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
94
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
95
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
96
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the SERVICE_KEY constant"]
|
|
97
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
98
|
+
// CIL[DOC-CONTRACT inputs="process.env.SERVICE_KEY" outputs="SERVICE_KEY constant" errors="" side_effects="None; scope-level constant"]
|
|
99
|
+
// CIL[DOC-MICRO logic_summary="Reads process.env.SERVICE_KEY with non-null assertion" notable_decisions="Runtime validation happens in env_check"]
|
|
100
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
101
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
102
|
+
const SERVICE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY!
|
|
103
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provide the SERVICE_KEY environment value'; No verified external callers; imports: none"]
|
|
104
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
105
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
106
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
107
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
108
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
109
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:SERVICE_KEY:constant"]
|
|
110
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:ACCOUNT_ID:constant" type="constant" identity="ACCOUNT_ID" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
111
|
+
// CIL[DOC-MACRO purpose="Provide the ACCOUNT_ID environment value"]
|
|
112
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the ACCOUNT_ID constant"]
|
|
113
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
114
|
+
// CIL[DOC-CONTRACT inputs="process.env.ACCOUNT_ID" outputs="ACCOUNT_ID constant" errors="" side_effects="None; scope-level constant"]
|
|
115
|
+
// CIL[DOC-MICRO logic_summary="Reads process.env.ACCOUNT_ID with non-null assertion" notable_decisions="Runtime validation happens in env_check"]
|
|
116
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
117
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
118
|
+
const ACCOUNT_ID = process.env.SPINE_TEST_ACCOUNT_ID!
|
|
119
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provide the ACCOUNT_ID environment value'; No verified external callers; imports: none"]
|
|
120
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
121
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
122
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
123
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
124
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
125
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:ACCOUNT_ID:constant"]
|
|
126
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:env_check:variable" type="variable" identity="env_check" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
127
|
+
// CIL[DOC-MACRO purpose="Validate required environment variables"]
|
|
128
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Fail fast if any required variable is missing"]
|
|
129
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
130
|
+
// CIL[DOC-CONTRACT inputs="SUPABASE_URL, SERVICE_KEY, ACCOUNT_ID" outputs="Validated environment or process exit" errors="" side_effects="May terminate process"]
|
|
131
|
+
// CIL[DOC-MICRO logic_summary="Checks SUPABASE_URL, SERVICE_KEY, and ACCOUNT_ID are truthy" notable_decisions="Exits before creating the Supabase client"]
|
|
132
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
133
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
134
|
+
if (!SUPABASE_URL || !SERVICE_KEY || !ACCOUNT_ID) {
|
|
135
|
+
console.error('Missing SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, or SPINE_TEST_ACCOUNT_ID')
|
|
136
|
+
process.exit(1)
|
|
137
|
+
}
|
|
138
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Validate required environment variables'; No verified external callers; imports: none"]
|
|
139
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
140
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
141
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
142
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
143
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
144
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:env_check:variable"]
|
|
145
|
+
|
|
146
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:db:constant" type="constant" identity="db" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
147
|
+
// CIL[DOC-MACRO purpose="Initialize the Supabase client for the public schema"]
|
|
148
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Create the database client used by all upsert helpers"]
|
|
149
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
150
|
+
// CIL[DOC-CONTRACT inputs="SUPABASE_URL, SERVICE_KEY" outputs="db client" errors="" side_effects="Creates and holds a Supabase client connection"]
|
|
151
|
+
// CIL[DOC-MICRO logic_summary="Constructs a Supabase client pointing at the public schema" notable_decisions="Uses service role key for admin-level seed operations"]
|
|
152
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
153
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
154
|
+
const db = createClient(SUPABASE_URL, SERVICE_KEY, { db: { schema: 'public' } })
|
|
155
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Initialize the Supabase client for the public schema'; No verified external callers; imports: none"]
|
|
156
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
157
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
158
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
159
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
160
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
161
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:db:constant"]
|
|
162
|
+
|
|
163
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:upsertRole:function" type="function" identity="upsertRole" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
164
|
+
// CIL[DOC-MACRO purpose="Upsert a role row"]
|
|
165
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Insert or update a test role"]
|
|
166
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
167
|
+
// CIL[DOC-CONTRACT inputs="slug, name, permissions" outputs="role in public.roles" errors="" side_effects="Writes to public.roles"]
|
|
168
|
+
// CIL[DOC-MICRO logic_summary="Upserts a role with permissions and active flag by slug" notable_decisions="Uses onConflict slug for idempotency"]
|
|
169
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
170
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
171
|
+
async function upsertRole(slug: string, name: string, permissions: string[]) {
|
|
172
|
+
const { error } = await db.from('roles').upsert(
|
|
173
|
+
{ slug, name, permissions, is_active: true, account_id: ACCOUNT_ID },
|
|
174
|
+
{ onConflict: 'slug' }
|
|
175
|
+
)
|
|
176
|
+
if (error) console.warn(` [warn] role ${slug}:`, error.message)
|
|
177
|
+
}
|
|
178
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Upsert a role row'; No verified external callers; imports: none"]
|
|
179
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
180
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
181
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
182
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
183
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
184
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:upsertRole:function"]
|
|
185
|
+
|
|
186
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:upsertType:function" type="function" identity="upsertType" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
187
|
+
// CIL[DOC-MACRO purpose="Upsert a type row with design schema"]
|
|
188
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Insert or update a test type"]
|
|
189
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
190
|
+
// CIL[DOC-CONTRACT inputs="kind, slug, name, designSchema" outputs="type in public.types" errors="" side_effects="Reads public.apps; writes to public.types"]
|
|
191
|
+
// CIL[DOC-MICRO logic_summary="Looks up spine-core app id and upserts a type row" notable_decisions="Defaults validation_schema to empty object; ownership pack"]
|
|
192
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
193
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
194
|
+
async function upsertType(kind: string, slug: string, name: string, designSchema: object) {
|
|
195
|
+
const { data: app } = await db.from('apps').select('id').eq('slug', 'spine-core').single()
|
|
196
|
+
const { error } = await db.from('types').upsert(
|
|
197
|
+
{
|
|
198
|
+
slug,
|
|
199
|
+
kind,
|
|
200
|
+
name,
|
|
201
|
+
app_id: app?.id ?? null,
|
|
202
|
+
design_schema: designSchema,
|
|
203
|
+
validation_schema: {},
|
|
204
|
+
is_active: true,
|
|
205
|
+
ownership: 'pack'
|
|
206
|
+
},
|
|
207
|
+
{ onConflict: 'slug' }
|
|
208
|
+
)
|
|
209
|
+
if (error) console.warn(` [warn] type ${slug}:`, error.message)
|
|
210
|
+
}
|
|
211
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Upsert a type row with design schema'; No verified external callers; imports: none"]
|
|
212
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
213
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
214
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
215
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
216
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
217
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:upsertType:function"]
|
|
218
|
+
|
|
219
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:upsertPerson:function" type="function" identity="upsertPerson" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
220
|
+
// CIL[DOC-MACRO purpose="Upsert a person row"]
|
|
221
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Insert or update a test person"]
|
|
222
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
223
|
+
// CIL[DOC-CONTRACT inputs="slug, fullName, email" outputs="person in public.people" errors="" side_effects="Reads public.types; writes to public.people"]
|
|
224
|
+
// CIL[DOC-MICRO logic_summary="Finds active person type and upserts person by email" notable_decisions="Uses onConflict email to avoid duplicates"]
|
|
225
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
226
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
227
|
+
async function upsertPerson(slug: string, fullName: string, email: string) {
|
|
228
|
+
const { data: type } = await db.from('types').select('id').eq('kind', 'person').eq('is_active', true).limit(1).single()
|
|
229
|
+
const { error } = await db.from('people').upsert(
|
|
230
|
+
{
|
|
231
|
+
slug,
|
|
232
|
+
full_name: fullName,
|
|
233
|
+
email,
|
|
234
|
+
status: 'active',
|
|
235
|
+
is_active: true,
|
|
236
|
+
account_id: ACCOUNT_ID,
|
|
237
|
+
type_id: type?.id ?? null,
|
|
238
|
+
data: {}
|
|
239
|
+
},
|
|
240
|
+
{ onConflict: 'email' }
|
|
241
|
+
)
|
|
242
|
+
if (error) console.warn(` [warn] person ${slug}:`, error.message)
|
|
243
|
+
}
|
|
244
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Upsert a person row'; No verified external callers; imports: none"]
|
|
245
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
246
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
247
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
248
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
249
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
250
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:upsertPerson:function"]
|
|
251
|
+
|
|
252
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:upsertItem:function" type="function" identity="upsertItem" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
253
|
+
// CIL[DOC-MACRO purpose="Upsert an item row"]
|
|
254
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Insert or update a test item"]
|
|
255
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
256
|
+
// CIL[DOC-CONTRACT inputs="slug, title, isActive" outputs="item in public.items" errors="" side_effects="Reads public.types; writes to public.items"]
|
|
257
|
+
// CIL[DOC-MICRO logic_summary="Finds active item type and upserts item by slug" notable_decisions="Sets status to open and item_type to item"]
|
|
258
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
259
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
260
|
+
async function upsertItem(slug: string, title: string, isActive: boolean) {
|
|
261
|
+
const { data: type } = await db.from('types').select('id').eq('kind', 'item').eq('is_active', true).limit(1).single()
|
|
262
|
+
const { error } = await db.from('items').upsert(
|
|
263
|
+
{
|
|
264
|
+
slug,
|
|
265
|
+
title,
|
|
266
|
+
status: 'open',
|
|
267
|
+
is_active: isActive,
|
|
268
|
+
account_id: ACCOUNT_ID,
|
|
269
|
+
type_id: type?.id ?? null,
|
|
270
|
+
item_type: 'item',
|
|
271
|
+
data: {}
|
|
272
|
+
},
|
|
273
|
+
{ onConflict: 'slug' }
|
|
274
|
+
)
|
|
275
|
+
if (error) console.warn(` [warn] item ${slug}:`, error.message)
|
|
276
|
+
}
|
|
277
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Upsert an item row'; No verified external callers; imports: none"]
|
|
278
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
279
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
280
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
281
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
282
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
283
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:upsertItem:function"]
|
|
284
|
+
|
|
285
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:seed:function" type="function" identity="seed" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
286
|
+
// CIL[DOC-MACRO purpose="Run the full fixture seeding routine"]
|
|
287
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Orchestrate creation of roles, types, people, items, and pipeline"]
|
|
288
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
289
|
+
// CIL[DOC-CONTRACT inputs="Environment variables and upsert helpers" outputs="Canonical test fixtures" errors="" side_effects="Writes multiple rows to public schema"]
|
|
290
|
+
// CIL[DOC-MICRO logic_summary="Seeds roles, account/person/item types, people, items, and a pipeline" notable_decisions="Uses test- prefixed slugs; defines inline design schemas"]
|
|
291
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
292
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
293
|
+
async function seed() {
|
|
294
|
+
console.log('🌱 Seeding test fixtures into public schema...')
|
|
295
|
+
console.log(' ACCOUNT_ID:', ACCOUNT_ID)
|
|
296
|
+
|
|
297
|
+
console.log(' → roles')
|
|
298
|
+
await upsertRole('test-admin-role', 'Test Admin', ['*'])
|
|
299
|
+
await upsertRole('test-member-role', 'Test Member', ['items:read', 'people:read'])
|
|
300
|
+
await upsertRole('test-viewer-role', 'Test Viewer', ['items:read'])
|
|
301
|
+
|
|
302
|
+
console.log(' → types')
|
|
303
|
+
const accountTypeSchema = {
|
|
304
|
+
fields: {
|
|
305
|
+
slug: { data_type: 'text', label: 'Slug', required: true, system: true, validation: null },
|
|
306
|
+
display_name: { data_type: 'text', label: 'Display Name', required: true, system: true, validation: null },
|
|
307
|
+
is_active: { data_type: 'boolean', label: 'Active', required: true, system: true, validation: null },
|
|
308
|
+
created_at: { data_type: 'datetime', label: 'Created', required: false, system: true, readonly: true, validation: null }
|
|
309
|
+
},
|
|
310
|
+
views: {
|
|
311
|
+
default_list: { type: 'list', display: 'table', label: 'Accounts',
|
|
312
|
+
fields: { display_name: { sortable: true, display_type: 'text' }, is_active: { sortable: true, display_type: 'badge' } },
|
|
313
|
+
default_sort: { field: 'created_at', direction: 'desc' }
|
|
314
|
+
},
|
|
315
|
+
default_detail: { type: 'detail', label: 'Account Detail',
|
|
316
|
+
sections: [
|
|
317
|
+
{ title: 'Identity', fields: { slug: { display_type: 'input' }, display_name: { display_type: 'input' }, is_active: { display_type: 'checkbox' } } },
|
|
318
|
+
{ title: 'System', fields: { created_at: { display_type: 'timestamp' } } }
|
|
319
|
+
]
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
record_permissions: { 'system-admin': ['create', 'read', 'update', 'delete'] },
|
|
323
|
+
functionality: null
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const personTypeSchema = {
|
|
327
|
+
fields: {
|
|
328
|
+
full_name: { data_type: 'text', label: 'Full Name', required: true, system: true, validation: null },
|
|
329
|
+
email: { data_type: 'email', label: 'Email', required: true, system: true, validation: null },
|
|
330
|
+
status: { data_type: 'text', label: 'Status', required: true, system: true, validation: null },
|
|
331
|
+
is_active: { data_type: 'boolean', label: 'Active', required: true, system: true, validation: null },
|
|
332
|
+
created_at: { data_type: 'datetime', label: 'Created', required: false, system: true, readonly: true, validation: null }
|
|
333
|
+
},
|
|
334
|
+
views: {
|
|
335
|
+
default_list: { type: 'list', display: 'table', label: 'People',
|
|
336
|
+
fields: { full_name: { sortable: true, display_type: 'text' }, email: { sortable: true, display_type: 'text' }, status: { sortable: true, display_type: 'badge' } },
|
|
337
|
+
default_sort: { field: 'created_at', direction: 'desc' }
|
|
338
|
+
},
|
|
339
|
+
default_detail: { type: 'detail', label: 'Person Detail',
|
|
340
|
+
sections: [
|
|
341
|
+
{ title: 'Identity', fields: { full_name: { display_type: 'input' }, email: { display_type: 'input' }, status: { display_type: 'input' }, is_active: { display_type: 'checkbox' } } },
|
|
342
|
+
{ title: 'System', fields: { created_at: { display_type: 'timestamp' } } }
|
|
343
|
+
]
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
record_permissions: { 'system-admin': ['create', 'read', 'update', 'delete'] },
|
|
347
|
+
functionality: null
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const itemTypeSchema = {
|
|
351
|
+
fields: {
|
|
352
|
+
title: { data_type: 'text', label: 'Title', required: true, system: true, validation: null },
|
|
353
|
+
description: { data_type: 'textarea', label: 'Description', required: false, system: true, validation: null },
|
|
354
|
+
status: { data_type: 'text', label: 'Status', required: true, system: true, validation: null },
|
|
355
|
+
is_active: { data_type: 'boolean', label: 'Active', required: true, system: true, validation: null },
|
|
356
|
+
created_at: { data_type: 'datetime', label: 'Created', required: false, system: true, readonly: true, validation: null }
|
|
357
|
+
},
|
|
358
|
+
views: {
|
|
359
|
+
default_list: { type: 'list', display: 'table', label: 'Items',
|
|
360
|
+
fields: { title: { sortable: true, display_type: 'text' }, status: { sortable: true, display_type: 'badge' }, is_active: { sortable: true, display_type: 'badge' } },
|
|
361
|
+
default_sort: { field: 'created_at', direction: 'desc' }
|
|
362
|
+
},
|
|
363
|
+
default_detail: { type: 'detail', label: 'Item Detail',
|
|
364
|
+
sections: [
|
|
365
|
+
{ title: 'Core', fields: { title: { display_type: 'input' }, description: { display_type: 'textarea' }, status: { display_type: 'input' }, is_active: { display_type: 'checkbox' } } },
|
|
366
|
+
{ title: 'System', fields: { created_at: { display_type: 'timestamp' } } }
|
|
367
|
+
]
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
record_permissions: { 'system-admin': ['create', 'read', 'update', 'delete'] },
|
|
371
|
+
functionality: null
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
await upsertType('account', 'test-account-type', 'Test Account Type', accountTypeSchema)
|
|
375
|
+
await upsertType('person', 'test-person-type', 'Test Person Type', personTypeSchema)
|
|
376
|
+
await upsertType('item', 'test-item-type', 'Test Item Type', itemTypeSchema)
|
|
377
|
+
|
|
378
|
+
console.log(' → people')
|
|
379
|
+
await upsertPerson('test-admin', 'Test Admin User', 'test-admin@spine.test')
|
|
380
|
+
await upsertPerson('test-member', 'Test Member User', 'test-member@spine.test')
|
|
381
|
+
await upsertPerson('test-viewer', 'Test Viewer User', 'test-viewer@spine.test')
|
|
382
|
+
|
|
383
|
+
console.log(' → items')
|
|
384
|
+
await upsertItem('test-item-active', 'Test Active Item', true)
|
|
385
|
+
await upsertItem('test-item-inactive', 'Test Inactive Item', false)
|
|
386
|
+
|
|
387
|
+
console.log(' → pipeline')
|
|
388
|
+
const { error: pipelineErr } = await db.from('pipelines').upsert(
|
|
389
|
+
{
|
|
390
|
+
slug: 'test-pipeline-canary',
|
|
391
|
+
name: 'Test Pipeline Canary',
|
|
392
|
+
stages: [],
|
|
393
|
+
account_id: ACCOUNT_ID,
|
|
394
|
+
is_active: true
|
|
395
|
+
},
|
|
396
|
+
{ onConflict: 'slug' }
|
|
397
|
+
)
|
|
398
|
+
if (pipelineErr) console.warn(' [warn] pipeline:', pipelineErr.message)
|
|
399
|
+
|
|
400
|
+
console.log('✅ Seed complete.')
|
|
401
|
+
}
|
|
402
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:seed:function"]
|
|
403
|
+
// CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:seed_invocation:variable" type="variable" identity="seed_invocation" parent="~/.framework/tests/fixtures/seed.ts"]
|
|
404
|
+
// CIL[DOC-MACRO purpose="Execute the seed routine on import"]
|
|
405
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Run the full fixture seeding routine'; No verified external callers; imports: none"]
|
|
406
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
407
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
408
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
409
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
410
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
411
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Invoke seed and handle failures"]
|
|
412
|
+
// CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
|
|
413
|
+
// CIL[DOC-CONTRACT inputs="seed()" outputs="Promise resolution or process exit" errors="" side_effects="Runs seed side effects; may terminate process"]
|
|
414
|
+
// CIL[DOC-MICRO logic_summary="Calls seed() and exits on unhandled rejection" notable_decisions="Top-level invocation for CLI and tsx usage"]
|
|
415
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
416
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
417
|
+
seed().catch(err => {
|
|
418
|
+
console.error('Seed failed:', err)
|
|
419
|
+
process.exit(1)
|
|
420
|
+
})
|
|
421
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Execute the seed routine on import'; No verified external callers; imports: none"]
|
|
422
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
423
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
424
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
425
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
426
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
427
|
+
// CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:seed_invocation:variable"]
|