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,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"framework_dirs": [
|
|
3
|
+
".framework/cli",
|
|
4
|
+
".framework/functions",
|
|
5
|
+
".framework/migrations",
|
|
6
|
+
".framework/public",
|
|
7
|
+
".framework/scripts",
|
|
8
|
+
".framework/seeds",
|
|
9
|
+
".framework/src",
|
|
10
|
+
".framework/tests",
|
|
11
|
+
".framework/docs",
|
|
12
|
+
".framework/mcp",
|
|
13
|
+
".framework/templates"
|
|
14
|
+
],
|
|
15
|
+
"framework_files": [
|
|
16
|
+
".framework/index.html",
|
|
17
|
+
".framework/README.md"
|
|
18
|
+
],
|
|
19
|
+
"config_files": [
|
|
20
|
+
"config/vite.config.ts",
|
|
21
|
+
"config/tsconfig.json",
|
|
22
|
+
"config/tsconfig.node.json",
|
|
23
|
+
"config/tsconfig.cli.json",
|
|
24
|
+
"config/tsconfig.functions.json",
|
|
25
|
+
"config/tailwind.config.cjs",
|
|
26
|
+
"config/postcss.config.cjs",
|
|
27
|
+
"config/components.json",
|
|
28
|
+
"vitest.config.ts",
|
|
29
|
+
".env.example",
|
|
30
|
+
"LICENSE.md"
|
|
31
|
+
],
|
|
32
|
+
"root_scripts": [
|
|
33
|
+
"scripts/assemble.sh",
|
|
34
|
+
"scripts/assemble-frontend.sh",
|
|
35
|
+
"scripts/assemble-functions.sh",
|
|
36
|
+
"scripts/dev-netlify.sh",
|
|
37
|
+
"scripts/dev-clean.sh",
|
|
38
|
+
"scripts/netlify-dev-wrapper.sh",
|
|
39
|
+
"scripts/verify-integrity.sh",
|
|
40
|
+
"scripts/build-manifest.sh",
|
|
41
|
+
"scripts/checksum-manifest.mts",
|
|
42
|
+
"scripts/verify-manifest.mts",
|
|
43
|
+
"scripts/boundary-check.sh",
|
|
44
|
+
"scripts/verify-install.ts"
|
|
45
|
+
],
|
|
46
|
+
"bin": [
|
|
47
|
+
"bin/spine-framework.cjs",
|
|
48
|
+
"bin/spine-framework.js",
|
|
49
|
+
"bin/ws-shim.mts",
|
|
50
|
+
"bin/ws-shim.ts"
|
|
51
|
+
],
|
|
52
|
+
"exclude_globs": [
|
|
53
|
+
"**/.env",
|
|
54
|
+
"**/.env.local",
|
|
55
|
+
"**/.env.production",
|
|
56
|
+
"**/.env.development",
|
|
57
|
+
"**/.env.test",
|
|
58
|
+
"**/.xenv",
|
|
59
|
+
"**/.xenv.*",
|
|
60
|
+
"**/node_modules/**",
|
|
61
|
+
"**/.DS_Store",
|
|
62
|
+
"**/dist/**",
|
|
63
|
+
"**/.assembled/**",
|
|
64
|
+
"**/*.tsbuildinfo",
|
|
65
|
+
".framework/migrations/archive/**",
|
|
66
|
+
".framework/functions/_quarantine/**",
|
|
67
|
+
".framework/tests/integration/**",
|
|
68
|
+
".framework/public/spine.config.json"
|
|
69
|
+
],
|
|
70
|
+
"package_scripts": {
|
|
71
|
+
"dev": "vite --config config/vite.config.ts",
|
|
72
|
+
"dev:netlify": "bash scripts/dev-netlify.sh",
|
|
73
|
+
"dev:stop": "bash scripts/dev-clean.sh",
|
|
74
|
+
"predev:netlify": "npm run assemble",
|
|
75
|
+
"assemble": "bash scripts/assemble.sh",
|
|
76
|
+
"prebuild": "npm run verify && npm run assemble",
|
|
77
|
+
"build": "vite build --config config/vite.config.ts",
|
|
78
|
+
"verify": "bash scripts/verify-integrity.sh",
|
|
79
|
+
"manifest": "bash scripts/build-manifest.sh",
|
|
80
|
+
"verify:install": "tsx scripts/verify-install.ts",
|
|
81
|
+
"typecheck": "tsc -b config/tsconfig.json",
|
|
82
|
+
"typecheck:functions": "tsc --noEmit -p config/tsconfig.functions.json",
|
|
83
|
+
"test": "vitest run",
|
|
84
|
+
"upgrade": "spine-framework upgrade",
|
|
85
|
+
"spine-framework": "tsx .framework/cli/index.ts"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:file_header:constant" type="constant" identity="file_header" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Top-level file documentation and environment reference for the API surface test suite."]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide file-level metadata, module description, and JSDoc tags for the test file."]
|
|
4
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="file-level JSDoc metadata" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Documents test scope, auth matrix, and skip conditions." notable_decisions="[]"]
|
|
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/api/api-surface
|
|
12
|
+
* @audience core-contributor
|
|
13
|
+
* @layer test-api
|
|
14
|
+
* @stability stable
|
|
15
|
+
*
|
|
16
|
+
* HTTP API surface tests. Runs fetch requests against the local dev server
|
|
17
|
+
* (SPINE_DEV_URL, default http://localhost:8888) and validates the auth matrix,
|
|
18
|
+
* CRUD lifecycle, and error handling — all against the **public schema**.
|
|
19
|
+
*
|
|
20
|
+
* **Auth matrix tested:**
|
|
21
|
+
* - No auth token → 401
|
|
22
|
+
* - Valid JWT (system admin) → 200 with full records
|
|
23
|
+
* - Invalid token → 401 / 403
|
|
24
|
+
* - Machine API key (if SPINE_TEST_API_KEY set) → 200
|
|
25
|
+
*
|
|
26
|
+
* Skips when SPINE_DEV_JWT is not set (server not running or not logged in).
|
|
27
|
+
*
|
|
28
|
+
* @seeAlso tests/integration/helpers.ts
|
|
29
|
+
* @seeAlso functions/admin-data.ts
|
|
30
|
+
*/
|
|
31
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Top-level file documentation and environment reference for the API surface test suite.'; No verified external callers; imports: none"]
|
|
32
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
33
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
34
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
35
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
36
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
37
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:file_header:constant"]
|
|
38
|
+
|
|
39
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
40
|
+
// CIL[DOC-MACRO purpose="Import vitest testing utilities and mark the module header."]
|
|
41
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Set up the test runner imports for this module."]
|
|
42
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
43
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="imported describe, it, expect" errors="none" side_effects="none"]
|
|
44
|
+
// CIL[DOC-MICRO logic_summary="Imports vitest functions used throughout the test file." notable_decisions="[]"]
|
|
45
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
46
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
47
|
+
// CIL[DOC-AUDIENCE audience="core-contributor"]
|
|
48
|
+
import { describe, it, expect } from 'vitest'
|
|
49
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Import vitest testing utilities and mark the module header.'; No verified external callers; imports: none"]
|
|
50
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
51
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
52
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
53
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
54
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
55
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:module_header:module_header"]
|
|
56
|
+
|
|
57
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:dev_url:constant" type="constant" identity="dev_url" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
58
|
+
// CIL[DOC-MACRO purpose="Define the dev server base URL from environment or default."]
|
|
59
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Read SPINE_DEV_URL env var and provide a fallback localhost URL."]
|
|
60
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
61
|
+
// CIL[DOC-CONTRACT inputs="process.env.SPINE_DEV_URL" outputs="DEV_URL string" errors="none" side_effects="none"]
|
|
62
|
+
// CIL[DOC-MICRO logic_summary="Resolves the target server URL with a localhost default." notable_decisions="[]"]
|
|
63
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
64
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
65
|
+
const DEV_URL = process.env.SPINE_DEV_URL || 'http://localhost:8888'
|
|
66
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Define the dev server base URL from environment or default.'; No verified external callers; imports: none"]
|
|
67
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
68
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
69
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
70
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
71
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
72
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:dev_url:constant"]
|
|
73
|
+
|
|
74
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:dev_jwt:constant" type="constant" identity="dev_jwt" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
75
|
+
// CIL[DOC-MACRO purpose="Provide the JWT token for authenticated requests from environment."]
|
|
76
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Read SPINE_DEV_JWT environment variable or default to empty string."]
|
|
77
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
78
|
+
// CIL[DOC-CONTRACT inputs="process.env.SPINE_DEV_JWT" outputs="DEV_JWT string" errors="none" side_effects="none"]
|
|
79
|
+
// CIL[DOC-MICRO logic_summary="Loads bearer token used in auth headers." notable_decisions="[]"]
|
|
80
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
81
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
82
|
+
const DEV_JWT = process.env.SPINE_DEV_JWT || ''
|
|
83
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provide the JWT token for authenticated requests from environment.'; No verified external callers; imports: none"]
|
|
84
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
85
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
86
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
87
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
88
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
89
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:dev_jwt:constant"]
|
|
90
|
+
|
|
91
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:test_api_key:constant" type="constant" identity="test_api_key" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
92
|
+
// CIL[DOC-MACRO purpose="Provide the machine API key for machine principal tests."]
|
|
93
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Read SPINE_TEST_API_KEY environment variable or default to empty string."]
|
|
94
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
95
|
+
// CIL[DOC-CONTRACT inputs="process.env.SPINE_TEST_API_KEY" outputs="TEST_API_KEY string" errors="none" side_effects="none"]
|
|
96
|
+
// CIL[DOC-MICRO logic_summary="Loads optional machine API key used in API-key auth tests." notable_decisions="[]"]
|
|
97
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
98
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
99
|
+
const TEST_API_KEY = process.env.SPINE_TEST_API_KEY || ''
|
|
100
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provide the machine API key for machine principal tests.'; No verified external callers; imports: none"]
|
|
101
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
102
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
103
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
104
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
105
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
106
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:test_api_key:constant"]
|
|
107
|
+
|
|
108
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:has_server:constant" type="constant" identity="has_server" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
109
|
+
// CIL[DOC-MACRO purpose="Determine whether the dev server is available based on the presence of a JWT."]
|
|
110
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Evaluate whether authenticated integration tests should run."]
|
|
111
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
112
|
+
// CIL[DOC-CONTRACT inputs="DEV_JWT" outputs="hasServer boolean" errors="none" side_effects="none"]
|
|
113
|
+
// CIL[DOC-MICRO logic_summary="Converts the JWT presence into a boolean gate for skipping tests." notable_decisions="[]"]
|
|
114
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
115
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
116
|
+
const hasServer = !!DEV_JWT
|
|
117
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Determine whether the dev server is available based on the presence of a JWT.'; No verified external callers; imports: none"]
|
|
118
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
119
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
120
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
121
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
122
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
123
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:has_server:constant"]
|
|
124
|
+
|
|
125
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:api:function" type="function" identity="api" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
126
|
+
// CIL[DOC-MACRO purpose="Perform an HTTP request against the dev server and return status/body."]
|
|
127
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Abstract fetch calls with JSON body parsing and error swallowing."]
|
|
128
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
129
|
+
// CIL[DOC-CONTRACT inputs="path: string, opts: RequestInit" outputs="{ status: number, body: any }" errors="network or parse errors are caught and returned as {status:0,body:null}" side_effects="initiates an HTTP request"]
|
|
130
|
+
// CIL[DOC-MICRO logic_summary="Fetches JSON from DEV_URL+path, parses body, and suppresses exceptions." notable_decisions="[]"]
|
|
131
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
132
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
133
|
+
async function api(path: string, opts: RequestInit = {}) {
|
|
134
|
+
try {
|
|
135
|
+
const res = await fetch(`${DEV_URL}${path}`, opts)
|
|
136
|
+
let body: any = null
|
|
137
|
+
try { body = await res.json() } catch {}
|
|
138
|
+
return { status: res.status, body }
|
|
139
|
+
} catch {
|
|
140
|
+
return { status: 0, body: null }
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Perform an HTTP request against the dev server and return status/body.'; No verified external callers; imports: none"]
|
|
144
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
145
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
146
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
147
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
148
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
149
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:api:function"]
|
|
150
|
+
|
|
151
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_unauthenticated_requests:block" type="block" identity="describe_unauthenticated_requests" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
152
|
+
// CIL[DOC-MACRO purpose="Verify unauthenticated requests to protected endpoints return 401."]
|
|
153
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Test auth gate for public API endpoints without a token."]
|
|
154
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
155
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="vitest describe/it blocks asserting 401 status" errors="assertion failures reported by vitest" side_effects="none"]
|
|
156
|
+
// CIL[DOC-MICRO logic_summary="Iterates a list of endpoints and checks status equals 401." notable_decisions="[]"]
|
|
157
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
158
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
159
|
+
// ─── 1. Unauthenticated → 401 ─────────────────────────────────────────────────
|
|
160
|
+
describe.skipIf(!hasServer)('auth — unauthenticated requests', () => {
|
|
161
|
+
const endpoints = [
|
|
162
|
+
'/.netlify/functions/admin-data?entity=accounts&method=GET',
|
|
163
|
+
'/.netlify/functions/admin-data?entity=people&method=GET',
|
|
164
|
+
'/.netlify/functions/admin-data?entity=types&method=GET',
|
|
165
|
+
'/.netlify/functions/types?action=list',
|
|
166
|
+
]
|
|
167
|
+
|
|
168
|
+
for (const path of endpoints) {
|
|
169
|
+
it(`${path} → 401 without auth`, async () => {
|
|
170
|
+
const { status } = await api(path)
|
|
171
|
+
expect(status).toBe(401)
|
|
172
|
+
})
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Verify unauthenticated requests to protected endpoints return 401.'; No verified external callers; imports: none"]
|
|
176
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
177
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
178
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
179
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
180
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
181
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_unauthenticated_requests:block"]
|
|
182
|
+
|
|
183
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_system_admin_gets_full_records:block" type="block" identity="describe_system_admin_gets_full_records" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
184
|
+
// CIL[DOC-MACRO purpose="Verify valid JWT system admin requests return 200 with data arrays."]
|
|
185
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Test happy path for accounts, people, types list and response envelope."]
|
|
186
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
187
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="passing/failing test results" errors="assertion or runtime errors raised by vitest" side_effects="console.log of statuses and counts"]
|
|
188
|
+
// CIL[DOC-MICRO logic_summary="Uses authHeader to call protected endpoints and validates response shape." notable_decisions="[]"]
|
|
189
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
190
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
191
|
+
// ─── 2. System admin gets full records ────────────────────────────────────────
|
|
192
|
+
describe.skipIf(!hasServer)('auth — system admin gets full records', () => {
|
|
193
|
+
const authHeader = { Authorization: `Bearer ${DEV_JWT}` }
|
|
194
|
+
|
|
195
|
+
it('GET accounts → 200 with data array', async () => {
|
|
196
|
+
const { status, body } = await api(
|
|
197
|
+
'/.netlify/functions/admin-data?entity=accounts&method=GET',
|
|
198
|
+
{ headers: authHeader }
|
|
199
|
+
)
|
|
200
|
+
console.log('[api-gap] accounts status:', status, '| count:', body?.data?.length ?? '?')
|
|
201
|
+
expect(status).toBe(200)
|
|
202
|
+
expect(body?.error).toBeNull()
|
|
203
|
+
expect(Array.isArray(body?.data)).toBe(true)
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
it('GET people → 200 with data array', async () => {
|
|
207
|
+
const { status, body } = await api(
|
|
208
|
+
'/.netlify/functions/admin-data?entity=people&method=GET',
|
|
209
|
+
{ headers: authHeader }
|
|
210
|
+
)
|
|
211
|
+
console.log('[api-gap] people status:', status, '| count:', body?.data?.length ?? '?')
|
|
212
|
+
expect(status).toBe(200)
|
|
213
|
+
expect(body?.error).toBeNull()
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
it('GET types → 200 with data array', async () => {
|
|
217
|
+
const { status, body } = await api(
|
|
218
|
+
'/.netlify/functions/types?action=list',
|
|
219
|
+
{ headers: authHeader }
|
|
220
|
+
)
|
|
221
|
+
console.log('[api-gap] types status:', status, '| count:', body?.data?.length ?? '?')
|
|
222
|
+
if (body?.data?.length === 0) {
|
|
223
|
+
console.warn('[gap] public.types empty — day-zero seeds missing from public schema')
|
|
224
|
+
}
|
|
225
|
+
expect(status).toBe(200)
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
it('response envelope shape is { data, error: null, meta }', async () => {
|
|
229
|
+
const { body } = await api(
|
|
230
|
+
'/.netlify/functions/admin-data?entity=accounts&method=GET',
|
|
231
|
+
{ headers: authHeader }
|
|
232
|
+
)
|
|
233
|
+
expect(body).toHaveProperty('data')
|
|
234
|
+
expect(body?.error).toBeNull()
|
|
235
|
+
expect(body?.meta?.requestId).toBeTruthy()
|
|
236
|
+
})
|
|
237
|
+
})
|
|
238
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Verify valid JWT system admin requests return 200 with data arrays.'; No verified external callers; imports: none"]
|
|
239
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
240
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
241
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
242
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
243
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
244
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_system_admin_gets_full_records:block"]
|
|
245
|
+
|
|
246
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_invalid_token_rejected:block" type="block" identity="describe_invalid_token_rejected" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
247
|
+
// CIL[DOC-MACRO purpose="Verify malformed bearer token is rejected with 401."]
|
|
248
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Negative auth test for an invalid JWT."]
|
|
249
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
250
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="test assertions" errors="vitest failures" side_effects="none"]
|
|
251
|
+
// CIL[DOC-MICRO logic_summary="Calls admin-data with a fake bearer token and expects 401." notable_decisions="[]"]
|
|
252
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
253
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
254
|
+
// ─── 3. Invalid token → 401 ───────────────────────────────────────────────────
|
|
255
|
+
describe.skipIf(!hasServer)('auth — invalid token rejected', () => {
|
|
256
|
+
it('malformed bearer token → 401', async () => {
|
|
257
|
+
const { status } = await api(
|
|
258
|
+
'/.netlify/functions/admin-data?entity=accounts&method=GET',
|
|
259
|
+
{ headers: { Authorization: 'Bearer not-a-real-jwt' } }
|
|
260
|
+
)
|
|
261
|
+
expect(status).toBe(401)
|
|
262
|
+
})
|
|
263
|
+
})
|
|
264
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Verify malformed bearer token is rejected with 401.'; No verified external callers; imports: none"]
|
|
265
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
266
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
267
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
268
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
269
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
270
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_invalid_token_rejected:block"]
|
|
271
|
+
|
|
272
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_crud_lifecycle_items_via_admin_data:block" type="block" identity="describe_crud_lifecycle_items_via_admin_data" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
273
|
+
// CIL[DOC-MACRO purpose="Exercise CRUD and query operations on items via admin-data endpoint."]
|
|
274
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Validate GET items, unknown entity handling, and limit parameter."]
|
|
275
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
276
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="test results" errors="assertion or runtime failures" side_effects="console.log and console.warn of data gaps"]
|
|
277
|
+
// CIL[DOC-MICRO logic_summary="Fetches items, checks unknown entity returns error, and verifies limit=1." notable_decisions="[]"]
|
|
278
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
279
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
280
|
+
// ─── 4. CRUD lifecycle on items ───────────────────────────────────────────────
|
|
281
|
+
describe.skipIf(!hasServer)('CRUD lifecycle — items via admin-data', () => {
|
|
282
|
+
const authHeader = { Authorization: `Bearer ${DEV_JWT}` }
|
|
283
|
+
let createdId: string | null = null
|
|
284
|
+
|
|
285
|
+
it('GET items returns 200', async () => {
|
|
286
|
+
const { status, body } = await api(
|
|
287
|
+
'/.netlify/functions/admin-data?entity=items&method=GET',
|
|
288
|
+
{ headers: authHeader }
|
|
289
|
+
)
|
|
290
|
+
console.log('[api-gap] items status:', status, '| count:', body?.data?.length ?? '?')
|
|
291
|
+
expect(status).toBe(200)
|
|
292
|
+
if (!body?.data?.length) {
|
|
293
|
+
console.warn('[gap] public.items is empty')
|
|
294
|
+
}
|
|
295
|
+
})
|
|
296
|
+
|
|
297
|
+
it('unknown entity returns error not crash', async () => {
|
|
298
|
+
const { status, body } = await api(
|
|
299
|
+
'/.netlify/functions/admin-data?entity=passwords&method=GET',
|
|
300
|
+
{ headers: authHeader }
|
|
301
|
+
)
|
|
302
|
+
expect([400, 422, 500]).toContain(status)
|
|
303
|
+
expect(body?.error).toBeTruthy()
|
|
304
|
+
})
|
|
305
|
+
|
|
306
|
+
it('?limit=1 is honoured', async () => {
|
|
307
|
+
const { body } = await api(
|
|
308
|
+
'/.netlify/functions/admin-data?entity=items&method=GET&limit=1',
|
|
309
|
+
{ headers: authHeader }
|
|
310
|
+
)
|
|
311
|
+
const records: any[] = body?.data ?? []
|
|
312
|
+
expect(records.length).toBeLessThanOrEqual(1)
|
|
313
|
+
})
|
|
314
|
+
})
|
|
315
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Exercise CRUD and query operations on items via admin-data endpoint.'; No verified external callers; imports: none"]
|
|
316
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
317
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
318
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
319
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
320
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
321
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_crud_lifecycle_items_via_admin_data:block"]
|
|
322
|
+
|
|
323
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_machine_principal_api_key:block" type="block" identity="describe_machine_principal_api_key" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
324
|
+
// CIL[DOC-MACRO purpose="Verify machine principal API key authentication succeeds on types list."]
|
|
325
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Test x-api-key header acceptance."]
|
|
326
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
327
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="test results" errors="vitest failures" side_effects="none"]
|
|
328
|
+
// CIL[DOC-MICRO logic_summary="Calls types list with x-api-key header and expects 200 with no error." notable_decisions="[]"]
|
|
329
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
330
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
331
|
+
// ─── 5. Machine principal (API key) ───────────────────────────────────────────
|
|
332
|
+
describe.skipIf(!hasServer || !TEST_API_KEY)('auth — machine principal (API key)', () => {
|
|
333
|
+
it('valid API key → 200 on types list', async () => {
|
|
334
|
+
const { status, body } = await api(
|
|
335
|
+
'/.netlify/functions/types?action=list',
|
|
336
|
+
{ headers: { 'x-api-key': TEST_API_KEY } }
|
|
337
|
+
)
|
|
338
|
+
expect(status).toBe(200)
|
|
339
|
+
expect(body?.error).toBeNull()
|
|
340
|
+
})
|
|
341
|
+
})
|
|
342
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Verify machine principal API key authentication succeeds on types list.'; No verified external callers; imports: none"]
|
|
343
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
344
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
345
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
346
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
347
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
348
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_machine_principal_api_key:block"]
|
|
349
|
+
|
|
350
|
+
// CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_validation_required_field_checks:block" type="block" identity="describe_validation_required_field_checks" parent="~/.framework/tests/api/api-surface.test.ts"]
|
|
351
|
+
// CIL[DOC-MACRO purpose="Verify missing required fields return 400/422 rather than crashing."]
|
|
352
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Negative validation test for POST with empty data."]
|
|
353
|
+
// CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
|
|
354
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="test results" errors="vitest failures" side_effects="none"]
|
|
355
|
+
// CIL[DOC-MICRO logic_summary="POSTs empty data to items and expects 400/422 with a truthy error." notable_decisions="[]"]
|
|
356
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
357
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
358
|
+
// ─── 6. Validation errors ─────────────────────────────────────────────────────
|
|
359
|
+
describe.skipIf(!hasServer)('validation — required field checks', () => {
|
|
360
|
+
const authHeader = { Authorization: `Bearer ${DEV_JWT}` }
|
|
361
|
+
|
|
362
|
+
it('missing required field returns 400 not 500', async () => {
|
|
363
|
+
const { status, body } = await api(
|
|
364
|
+
'/.netlify/functions/admin-data?entity=items&method=POST',
|
|
365
|
+
{
|
|
366
|
+
method: 'POST',
|
|
367
|
+
headers: { ...authHeader, 'Content-Type': 'application/json' },
|
|
368
|
+
body: JSON.stringify({ data: {} })
|
|
369
|
+
}
|
|
370
|
+
)
|
|
371
|
+
expect([400, 422]).toContain(status)
|
|
372
|
+
expect(body?.error).toBeTruthy()
|
|
373
|
+
})
|
|
374
|
+
})
|
|
375
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Verify missing required fields return 400/422 rather than crashing.'; No verified external callers; imports: none"]
|
|
376
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
377
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
378
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
379
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
380
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
381
|
+
// CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_validation_required_field_checks:block"]
|