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
|
@@ -1,38 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
// CIL[BEGIN chunk_id="doctor_module_header_1784071456" type="module_header" identity="module_header" parent="none"]
|
|
22
|
-
// CIL[DOC-MACRO purpose="Import dependencies for doctor CLI commands"]
|
|
23
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Provide imports and utilities for health checks"]
|
|
24
|
-
// CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
25
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="imports" errors="none" side_effects="none"]
|
|
26
|
-
// CIL[DOC-MICRO logic_summary="Imports Command type, context, database, and file system modules" notable_decisions="[]"]
|
|
27
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/cli/commands/doctor.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Provides CLI commands for the doctor (system health) functionality, integrating with CLI context and shared database functions."]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Expose health-check CLI commands and report system installation status."]
|
|
4
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="[]" errors="[]" side_effects="[]"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Defines the doctor module and its intent, invariant, and related utilities." notable_decisions="Commands must be executed within a valid CLI context."]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
28
8
|
// CIL[DOC-STABILITY stability="stable"]
|
|
29
|
-
// CIL[DOC-AUDIENCE audience="
|
|
30
|
-
|
|
31
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
32
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
33
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
34
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
35
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="internal"]
|
|
10
|
+
|
|
36
11
|
import type { Command } from 'commander'
|
|
37
12
|
import { buildCliContext, handleError } from '../context.ts'
|
|
38
13
|
import { adminDb } from '../../functions/_shared/index.ts'
|
|
@@ -40,23 +15,57 @@ import { readFileSync, existsSync, readdirSync } from 'fs'
|
|
|
40
15
|
import { resolve, dirname } from 'path'
|
|
41
16
|
import { fileURLToPath } from 'url'
|
|
42
17
|
|
|
18
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provides CLI commands for the doctor (system health) functionality, integrating with CLI context and shared database functions.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
19
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
20
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
21
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
22
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
23
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
24
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:module_header:module_header"]
|
|
25
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:__filename:constant" type="constant" identity="__filename" parent="~/.framework/cli/commands/doctor.ts"]
|
|
26
|
+
// CIL[DOC-MACRO purpose="Resolves the current module's file URL to a filesystem path."]
|
|
27
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide a stable __filename reference for the module."]
|
|
28
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
29
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="string" errors="[]" side_effects="none"]
|
|
30
|
+
// CIL[DOC-MICRO logic_summary="Call fileURLToPath(import.meta.url) and assign to const __filename." notable_decisions=""]
|
|
31
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
32
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
33
|
+
|
|
43
34
|
const __filename = fileURLToPath(import.meta.url)
|
|
44
|
-
|
|
45
|
-
// CIL[
|
|
46
|
-
// CIL[
|
|
47
|
-
// CIL[DOC-
|
|
48
|
-
// CIL[DOC-
|
|
49
|
-
// CIL[DOC-
|
|
50
|
-
// CIL[
|
|
51
|
-
// CIL[
|
|
52
|
-
// CIL[DOC-
|
|
35
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Resolves the current module's file URL to a filesystem path.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
36
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
37
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
38
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
39
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
40
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
41
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:__filename:constant"]
|
|
42
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:__dirname:constant" type="constant" identity="__dirname" parent="~/.framework/cli/commands/doctor.ts"]
|
|
43
|
+
// CIL[DOC-MACRO purpose="Provides the directory name of the current module for relative path resolution."]
|
|
44
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Derive the current module's directory from __filename."]
|
|
45
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
46
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="string" errors="[]" side_effects="none"]
|
|
47
|
+
// CIL[DOC-MICRO logic_summary="Call dirname(__filename) and assign to const __dirname." notable_decisions=""]
|
|
48
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
53
49
|
// CIL[DOC-STABILITY stability="stable"]
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
// CIL[DOC-VECTOR type="
|
|
57
|
-
// CIL[DOC-VECTOR type="
|
|
50
|
+
|
|
51
|
+
const __dirname = dirname(__filename)
|
|
52
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provides the directory name of the current module for relative path resolution.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
53
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
54
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
55
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
58
56
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
59
57
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
58
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:__dirname:constant"]
|
|
59
|
+
|
|
60
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:CheckResult:interface" type="interface" identity="CheckResult" parent="~/.framework/cli/commands/doctor.ts"]
|
|
61
|
+
// CIL[DOC-MACRO purpose="Defines the structure for health check results."]
|
|
62
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Standardize status reporting across health checks."]
|
|
63
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
64
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="[]" errors="[]" side_effects="[]"]
|
|
65
|
+
// CIL[DOC-MICRO logic_summary="Declare an interface with name, status, message, optional details, and fixability." notable_decisions=""]
|
|
66
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
67
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
68
|
+
|
|
60
69
|
interface CheckResult {
|
|
61
70
|
name: string
|
|
62
71
|
status: 'pass' | 'fail' | 'warn'
|
|
@@ -64,21 +73,23 @@ interface CheckResult {
|
|
|
64
73
|
details?: Record<string, any>
|
|
65
74
|
fixable?: boolean
|
|
66
75
|
}
|
|
67
|
-
// CIL[
|
|
68
|
-
// CIL[
|
|
69
|
-
// CIL[DOC-
|
|
70
|
-
// CIL[DOC-
|
|
71
|
-
// CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
72
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
|
|
73
|
-
// CIL[DOC-MICRO logic_summary="Defines report with overall status and check summaries" notable_decisions="[]"]
|
|
74
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
75
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
76
|
-
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
77
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
78
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
79
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
76
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Defines the structure for health check results.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
77
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
78
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
79
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
80
80
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
81
81
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
82
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:CheckResult:interface"]
|
|
83
|
+
|
|
84
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:DoctorReport:interface" type="interface" identity="DoctorReport" parent="~/.framework/cli/commands/doctor.ts"]
|
|
85
|
+
// CIL[DOC-MACRO purpose="Defines the structure for aggregated doctor health reports."]
|
|
86
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Summarize overall health and counts from a collection of CheckResult objects."]
|
|
87
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
88
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="[]" errors="[]" side_effects="[]"]
|
|
89
|
+
// CIL[DOC-MICRO logic_summary="Declare an interface with overall status, checks array, and summary counts." notable_decisions=""]
|
|
90
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
91
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
92
|
+
|
|
82
93
|
interface DoctorReport {
|
|
83
94
|
overall: 'healthy' | 'degraded' | 'unhealthy'
|
|
84
95
|
checks: CheckResult[]
|
|
@@ -89,21 +100,23 @@ interface DoctorReport {
|
|
|
89
100
|
fixable: number
|
|
90
101
|
}
|
|
91
102
|
}
|
|
92
|
-
// CIL[
|
|
93
|
-
// CIL[
|
|
94
|
-
// CIL[DOC-
|
|
95
|
-
// CIL[DOC-
|
|
96
|
-
// CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
97
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="CheckResult" errors="none" side_effects="reads environment variables"]
|
|
98
|
-
// CIL[DOC-MICRO logic_summary="Validates required env vars and checks for .xenv file" notable_decisions="[]"]
|
|
99
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
100
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
101
|
-
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
102
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
103
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
104
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
103
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Defines the structure for aggregated doctor health reports.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
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"]
|
|
105
107
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
106
108
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
109
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:DoctorReport:interface"]
|
|
110
|
+
|
|
111
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkEnvironment:function" type="function" identity="checkEnvironment" parent="~/.framework/cli/commands/doctor.ts"]
|
|
112
|
+
// CIL[DOC-MACRO purpose="Validates required environment variables and optional .xenv file presence."]
|
|
113
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Determine whether the runtime environment is configured for Spine."]
|
|
114
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
115
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="none"]
|
|
116
|
+
// CIL[DOC-MICRO logic_summary="Filter required env vars against process.env, then check for .xenv file at the project root, returning a CheckResult." notable_decisions="Returns fail when required variables are missing; reports .xenv presence on success."]
|
|
117
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
118
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
119
|
+
|
|
107
120
|
async function checkEnvironment(): Promise<CheckResult> {
|
|
108
121
|
const required = ['SUPABASE_URL', 'SUPABASE_SERVICE_ROLE_KEY']
|
|
109
122
|
const missing = required.filter(v => !process.env[v])
|
|
@@ -129,21 +142,23 @@ async function checkEnvironment(): Promise<CheckResult> {
|
|
|
129
142
|
details: { has_xenv: hasXenv, vars_present: required.length }
|
|
130
143
|
}
|
|
131
144
|
}
|
|
132
|
-
// CIL[
|
|
133
|
-
// CIL[
|
|
134
|
-
// CIL[DOC-
|
|
135
|
-
// CIL[DOC-
|
|
136
|
-
// CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
137
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="CheckResult" errors="database connection errors" side_effects="queries database"]
|
|
138
|
-
// CIL[DOC-MICRO logic_summary="Tests database connection with simple query and measures latency" notable_decisions="[]"]
|
|
139
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
140
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
141
|
-
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
142
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
143
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
144
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
145
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Validates required environment variables and optional .xenv file presence.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
146
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
147
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
148
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
145
149
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
146
150
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
151
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkEnvironment:function"]
|
|
152
|
+
|
|
153
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkDatabase:function" type="function" identity="checkDatabase" parent="~/.framework/cli/commands/doctor.ts"]
|
|
154
|
+
// CIL[DOC-MACRO purpose="Tests database connectivity and measures query latency."]
|
|
155
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Verify that the Supabase database is reachable."]
|
|
156
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
157
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="Queries the accounts table."]
|
|
158
|
+
// CIL[DOC-MICRO logic_summary="Select a single account row, compute elapsed latency, and return pass or fail based on the query result." notable_decisions="Catches and returns structured failure for exceptions; reports latency on success."]
|
|
159
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
160
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
161
|
+
|
|
147
162
|
async function checkDatabase(): Promise<CheckResult> {
|
|
148
163
|
const start = Date.now()
|
|
149
164
|
try {
|
|
@@ -175,21 +190,23 @@ async function checkDatabase(): Promise<CheckResult> {
|
|
|
175
190
|
}
|
|
176
191
|
}
|
|
177
192
|
}
|
|
178
|
-
// CIL[
|
|
179
|
-
// CIL[
|
|
180
|
-
// CIL[DOC-
|
|
181
|
-
// CIL[DOC-
|
|
182
|
-
// CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[]"]
|
|
183
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="CheckResult" errors="database query errors" side_effects="queries database, reads filesystem"]
|
|
184
|
-
// CIL[DOC-MICRO logic_summary="Compares local SQL files with database migration records" notable_decisions="[]"]
|
|
185
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
186
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
187
|
-
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
188
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
189
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
190
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
193
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Tests database connectivity and measures query latency.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
194
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
195
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
196
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
191
197
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
192
198
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
199
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkDatabase:function"]
|
|
200
|
+
|
|
201
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkMigrations:function" type="function" identity="checkMigrations" parent="~/.framework/cli/commands/doctor.ts"]
|
|
202
|
+
// CIL[DOC-MACRO purpose="Compares local migration files against applied database migrations."]
|
|
203
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Identify pending or missing database migrations."]
|
|
204
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
205
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="Reads migration directory and queries schema_migrations."]
|
|
206
|
+
// CIL[DOC-MICRO logic_summary="List local SQL files, query applied migration versions, and report any local files not yet applied." notable_decisions="Returns warn for pending migrations and fail when the directory or query errors."]
|
|
207
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
208
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
209
|
+
|
|
193
210
|
async function checkMigrations(): Promise<CheckResult> {
|
|
194
211
|
const migrationsDir = resolve(__dirname, '../../migrations_dayzero')
|
|
195
212
|
|
|
@@ -251,21 +268,23 @@ async function checkMigrations(): Promise<CheckResult> {
|
|
|
251
268
|
}
|
|
252
269
|
}
|
|
253
270
|
}
|
|
254
|
-
// CIL[
|
|
255
|
-
// CIL[
|
|
256
|
-
// CIL[DOC-
|
|
257
|
-
// CIL[DOC-
|
|
258
|
-
// CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[]"]
|
|
259
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="CheckResult" errors="file system errors" side_effects="reads manifest file"]
|
|
260
|
-
// CIL[DOC-MICRO logic_summary="Checks for manifest file and validates integrity hash presence" notable_decisions="[]"]
|
|
261
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
262
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
263
|
-
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
264
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
265
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
266
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
271
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Compares local migration files against applied database migrations.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
272
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
273
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
274
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
267
275
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
268
276
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
277
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkMigrations:function"]
|
|
278
|
+
|
|
279
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkIntegrity:function" type="function" identity="checkIntegrity" parent="~/.framework/cli/commands/doctor.ts"]
|
|
280
|
+
// CIL[DOC-MACRO purpose="Validates the presence and integrity hash of the Spine manifest."]
|
|
281
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Confirm that the installation manifest exists and contains an integrity reference."]
|
|
282
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
283
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="Reads the manifest file from disk."]
|
|
284
|
+
// CIL[DOC-MICRO logic_summary="Check for .spine-manifest.json, parse it, and verify that manifest.integrity.src is present." notable_decisions="Warns if manifest is missing or lacks integrity hash; returns pass when valid."]
|
|
285
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
286
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
287
|
+
|
|
269
288
|
async function checkIntegrity(): Promise<CheckResult> {
|
|
270
289
|
const manifestPath = resolve(__dirname, '../../.spine-manifest.json')
|
|
271
290
|
|
|
@@ -308,21 +327,23 @@ async function checkIntegrity(): Promise<CheckResult> {
|
|
|
308
327
|
}
|
|
309
328
|
}
|
|
310
329
|
}
|
|
311
|
-
// CIL[
|
|
312
|
-
// CIL[
|
|
313
|
-
// CIL[DOC-
|
|
314
|
-
// CIL[DOC-
|
|
315
|
-
// CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[]"]
|
|
316
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="CheckResult" errors="database query errors" side_effects="queries test_runs table"]
|
|
317
|
-
// CIL[DOC-MICRO logic_summary="Retrieves most recent test run and reports its status" notable_decisions="[]"]
|
|
318
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
319
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
320
|
-
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
321
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
322
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
323
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
330
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Validates the presence and integrity hash of the Spine manifest.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
331
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
332
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
333
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
324
334
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
325
335
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
336
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkIntegrity:function"]
|
|
337
|
+
|
|
338
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkTestRuns:function" type="function" identity="checkTestRuns" parent="~/.framework/cli/commands/doctor.ts"]
|
|
339
|
+
// CIL[DOC-MACRO purpose="Fetches the latest test run from the database."]
|
|
340
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Report the status of the most recent test suite execution."]
|
|
341
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
342
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="Queries the test_runs table."]
|
|
343
|
+
// CIL[DOC-MICRO logic_summary="Select the newest test run, translate its status to pass or warn, and return details." notable_decisions="Warns on query errors or when no test runs exist; maps status 'passed' to pass."]
|
|
344
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
345
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
346
|
+
|
|
326
347
|
async function checkTestRuns(): Promise<CheckResult> {
|
|
327
348
|
try {
|
|
328
349
|
const { data, error } = await adminDb
|
|
@@ -367,21 +388,114 @@ async function checkTestRuns(): Promise<CheckResult> {
|
|
|
367
388
|
}
|
|
368
389
|
}
|
|
369
390
|
}
|
|
370
|
-
// CIL[
|
|
371
|
-
// CIL[
|
|
372
|
-
// CIL[DOC-
|
|
373
|
-
// CIL[DOC-
|
|
374
|
-
// CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[]"]
|
|
375
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
|
|
376
|
-
// CIL[DOC-MICRO logic_summary="Maps check names to specific fix commands and instructions" notable_decisions="[]"]
|
|
377
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
378
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
379
|
-
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
380
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
381
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
382
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
391
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Fetches the latest test run from the database.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
392
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
393
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
394
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
383
395
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
384
396
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
397
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkTestRuns:function"]
|
|
398
|
+
|
|
399
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkRuntimeWiring:function" type="function" identity="checkRuntimeWiring" parent="~/.framework/cli/commands/doctor.ts"]
|
|
400
|
+
// CIL[DOC-MACRO purpose="Verify declared runtime wiring resolves — generic referential integrity over triggers, pipelines, and actions"]
|
|
401
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Confirm every active trigger's declared type slugs and pipeline references resolve to existing, active rows, and every active pipeline's stages reference existing actions"]
|
|
402
|
+
// CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="Queries triggers, types, pipelines, actions"]
|
|
403
|
+
// CIL[DOC-MICRO logic_summary="Load all active triggers, all types, all pipelines, and all active actions; report each dangling config.type_slug / config.filters.type_slug / config.pipeline_slug / pipeline_id / stage_type reference as a problem line, and flag active pipelines whose stages array is missing or empty (they complete without doing anything)" notable_decisions="App-agnostic — checks only that declared references resolve, never that a particular app's workflow exists; entity/kind on trigger config scopes the type check when declared"]
|
|
404
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
405
|
+
export async function checkRuntimeWiring(): Promise<CheckResult> {
|
|
406
|
+
const problems: string[] = []
|
|
407
|
+
try {
|
|
408
|
+
const [{ data: triggers }, { data: types }, { data: pipelines }, { data: actions }] =
|
|
409
|
+
await Promise.all([
|
|
410
|
+
adminDb.from('triggers').select('id, slug, event_type, pipeline_id, config').eq('is_active', true),
|
|
411
|
+
adminDb.from('types').select('slug, kind'),
|
|
412
|
+
adminDb.from('pipelines').select('id, slug, is_active, stages'),
|
|
413
|
+
adminDb.from('actions').select('slug').eq('is_active', true),
|
|
414
|
+
])
|
|
415
|
+
|
|
416
|
+
// Trigger configs name entities as table names ('items'); the types
|
|
417
|
+
// registry uses singular kinds ('item').
|
|
418
|
+
const ENTITY_KIND: Record<string, string> = {
|
|
419
|
+
items: 'item', threads: 'thread', messages: 'message', links: 'link',
|
|
420
|
+
attachments: 'attachment', watchers: 'watcher', people: 'person', accounts: 'account',
|
|
421
|
+
}
|
|
422
|
+
const declaredKindOf = (config: any): string | null => {
|
|
423
|
+
const raw = config?.kind || config?.entity || config?.entity_type || null
|
|
424
|
+
return typeof raw === 'string' && raw ? (ENTITY_KIND[raw] || raw) : null
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
const typeSlugs = new Set<string>((types || []).map((t: any) => t.slug))
|
|
428
|
+
const typeKindSlugs = new Set<string>((types || []).map((t: any) => `${t.kind}:${t.slug}`))
|
|
429
|
+
const pipelinesById = new Map<string, any>((pipelines || []).map((p: any) => [p.id, p]))
|
|
430
|
+
const pipelinesBySlug = new Map<string, any>((pipelines || []).map((p: any) => [p.slug, p]))
|
|
431
|
+
const actionSlugs = new Set<string>((actions || []).map((a: any) => a.slug))
|
|
432
|
+
|
|
433
|
+
for (const t of triggers || []) {
|
|
434
|
+
const label = `trigger '${t.slug || t.id}'`
|
|
435
|
+
const cfg = t.config || {}
|
|
436
|
+
const declaredKind = declaredKindOf(cfg)
|
|
437
|
+
for (const slug of new Set([cfg.type_slug, cfg.filters?.type_slug].filter(Boolean) as string[])) {
|
|
438
|
+
const found = declaredKind ? typeKindSlugs.has(`${declaredKind}:${slug}`) : typeSlugs.has(slug)
|
|
439
|
+
if (!found) problems.push(`${label}: type '${slug}' not found`)
|
|
440
|
+
}
|
|
441
|
+
if (cfg.pipeline_slug) {
|
|
442
|
+
const p = pipelinesBySlug.get(cfg.pipeline_slug)
|
|
443
|
+
if (!p) problems.push(`${label}: pipeline '${cfg.pipeline_slug}' not found`)
|
|
444
|
+
else if (!p.is_active) problems.push(`${label}: pipeline '${cfg.pipeline_slug}' is inactive`)
|
|
445
|
+
}
|
|
446
|
+
if (t.pipeline_id) {
|
|
447
|
+
const p = pipelinesById.get(t.pipeline_id)
|
|
448
|
+
if (!p) problems.push(`${label}: pipeline_id '${t.pipeline_id}' not found`)
|
|
449
|
+
else if (!p.is_active) problems.push(`${label}: pipeline '${p.slug || t.pipeline_id}' is inactive`)
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
for (const p of (pipelines || []).filter((row: any) => row.is_active)) {
|
|
454
|
+
const stages = Array.isArray(p.stages) ? p.stages : []
|
|
455
|
+
// An active pipeline with no stages completes successfully while doing
|
|
456
|
+
// nothing — a silent no-op worth flagging as a wiring problem.
|
|
457
|
+
if (!stages.length) {
|
|
458
|
+
problems.push(`pipeline '${p.slug}' is active but has no stages (completes without doing anything)`)
|
|
459
|
+
continue
|
|
460
|
+
}
|
|
461
|
+
for (let i = 0; i < stages.length; i++) {
|
|
462
|
+
const stageType = stages[i]?.stage_type
|
|
463
|
+
if (stageType && !actionSlugs.has(stageType)) {
|
|
464
|
+
problems.push(`pipeline '${p.slug}': stage ${i} references missing action '${stageType}'`)
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
const activePipelines = (pipelines || []).filter((p: any) => p.is_active).length
|
|
470
|
+
if (problems.length) {
|
|
471
|
+
return {
|
|
472
|
+
name: 'runtime_wiring',
|
|
473
|
+
status: 'fail',
|
|
474
|
+
message: `Runtime wiring broken: ${problems.join('; ')}`,
|
|
475
|
+
details: { problems },
|
|
476
|
+
fixable: true,
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
return {
|
|
480
|
+
name: 'runtime_wiring',
|
|
481
|
+
status: 'pass',
|
|
482
|
+
message: `Runtime wiring intact (${(triggers || []).length} active triggers, ${activePipelines} active pipelines)`,
|
|
483
|
+
}
|
|
484
|
+
} catch (err: any) {
|
|
485
|
+
return { name: 'runtime_wiring', status: 'fail', message: `Wiring check error: ${err.message}`, fixable: false }
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkRuntimeWiring:function"]
|
|
489
|
+
|
|
490
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:tryFix:function" type="function" identity="tryFix" parent="~/.framework/cli/commands/doctor.ts"]
|
|
491
|
+
// CIL[DOC-MACRO purpose="Provides automated fix instructions for failed or warned checks."]
|
|
492
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Map a CheckResult name to a human-readable remediation hint."]
|
|
493
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
494
|
+
// CIL[DOC-CONTRACT inputs="check: CheckResult" outputs="Promise<string>" errors="[]" side_effects="none"]
|
|
495
|
+
// CIL[DOC-MICRO logic_summary="Use a switch on check.name to return a context-specific remediation message." notable_decisions="Returns 'No automatic fix available' for unrecognized check names."]
|
|
496
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
497
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
498
|
+
|
|
385
499
|
async function tryFix(check: CheckResult): Promise<string> {
|
|
386
500
|
switch (check.name) {
|
|
387
501
|
case 'environment':
|
|
@@ -396,31 +510,37 @@ async function tryFix(check: CheckResult): Promise<string> {
|
|
|
396
510
|
case 'test_runs':
|
|
397
511
|
return 'Run `npm run test` to execute test suites'
|
|
398
512
|
|
|
513
|
+
case 'runtime_wiring':
|
|
514
|
+
return 'Fix the dangling trigger/pipeline references listed in details (re-install the owning app or correct the type_slug / pipeline reference)'
|
|
515
|
+
|
|
399
516
|
default:
|
|
400
517
|
return 'No automatic fix available'
|
|
401
518
|
}
|
|
402
519
|
}
|
|
403
|
-
// CIL[
|
|
404
|
-
// CIL[
|
|
405
|
-
// CIL[DOC-
|
|
406
|
-
// CIL[DOC-
|
|
407
|
-
// CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[]"]
|
|
408
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="doctor command registration" errors="CLI context errors" side_effects="outputs health report"]
|
|
409
|
-
// CIL[DOC-MICRO logic_summary="Runs all checks in dependency order and formats results" notable_decisions="[]"]
|
|
410
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
411
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
412
|
-
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
413
|
-
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
414
|
-
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
415
|
-
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
520
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provides automated fix instructions for failed or warned checks.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
521
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
522
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
523
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
416
524
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
417
525
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
526
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:tryFix:function"]
|
|
527
|
+
|
|
528
|
+
// CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:registerDoctorCommands:function" type="function" identity="registerDoctorCommands" parent="~/.framework/cli/commands/doctor.ts"]
|
|
529
|
+
// CIL[DOC-MACRO purpose="Registers the 'doctor' CLI command and runs the health check sequence."]
|
|
530
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Expose a CLI entrypoint that executes health checks and renders the report."]
|
|
531
|
+
// CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
532
|
+
// CIL[DOC-CONTRACT inputs="program: Command" outputs="Promise<void>" errors="[]" side_effects="Writes health report to stdout and exits the process."]
|
|
533
|
+
// CIL[DOC-MICRO logic_summary="Chain conditional checks (environment, database, migrations, test runs, runtime wiring, integrity), build a DoctorReport, and render it as JSON or formatted console output." notable_decisions="Skips database-dependent checks when prior checks fail; exits with code 1 for unhealthy, 2 for degraded, 0 for healthy."]
|
|
534
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
535
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
536
|
+
|
|
418
537
|
export function registerDoctorCommands(program: Command) {
|
|
419
538
|
program
|
|
420
539
|
.command('doctor')
|
|
421
540
|
.description('Validate Spine installation health')
|
|
422
541
|
.option('--json', 'Output as JSON')
|
|
423
542
|
.option('--fix', 'Show fix instructions for failed checks')
|
|
543
|
+
.option('--ticket <id>', 'Attach the sanitized diagnostic report to a support ticket')
|
|
424
544
|
.action(async (opts) => {
|
|
425
545
|
try {
|
|
426
546
|
|
|
@@ -444,6 +564,7 @@ export function registerDoctorCommands(program: Command) {
|
|
|
444
564
|
if (checks[1].status === 'pass') {
|
|
445
565
|
checks.push(await checkMigrations())
|
|
446
566
|
checks.push(await checkTestRuns())
|
|
567
|
+
checks.push(await checkRuntimeWiring())
|
|
447
568
|
} else {
|
|
448
569
|
checks.push({
|
|
449
570
|
name: 'migrations',
|
|
@@ -457,6 +578,12 @@ export function registerDoctorCommands(program: Command) {
|
|
|
457
578
|
message: 'Skipped - database not connected',
|
|
458
579
|
fixable: false
|
|
459
580
|
})
|
|
581
|
+
checks.push({
|
|
582
|
+
name: 'runtime_wiring',
|
|
583
|
+
status: 'fail',
|
|
584
|
+
message: 'Skipped - database not connected',
|
|
585
|
+
fixable: false
|
|
586
|
+
})
|
|
460
587
|
}
|
|
461
588
|
} else {
|
|
462
589
|
checks.push({
|
|
@@ -477,6 +604,12 @@ export function registerDoctorCommands(program: Command) {
|
|
|
477
604
|
message: 'Skipped - environment variables missing',
|
|
478
605
|
fixable: false
|
|
479
606
|
})
|
|
607
|
+
checks.push({
|
|
608
|
+
name: 'runtime_wiring',
|
|
609
|
+
status: 'fail',
|
|
610
|
+
message: 'Skipped - environment variables missing',
|
|
611
|
+
fixable: false
|
|
612
|
+
})
|
|
480
613
|
}
|
|
481
614
|
|
|
482
615
|
checks.push(await checkIntegrity())
|
|
@@ -506,6 +639,39 @@ export function registerDoctorCommands(program: Command) {
|
|
|
506
639
|
}
|
|
507
640
|
}
|
|
508
641
|
|
|
642
|
+
// Attach the diagnostic bundle to a support ticket when requested.
|
|
643
|
+
// The report contains check names and messages only — never env
|
|
644
|
+
// values, credentials, or customer data — so it is safe to store.
|
|
645
|
+
if (opts.ticket) {
|
|
646
|
+
try {
|
|
647
|
+
const { data: ticket } = await adminDb
|
|
648
|
+
.from('items').select('id, data').eq('id', opts.ticket).maybeSingle()
|
|
649
|
+
if (!ticket) {
|
|
650
|
+
console.warn(`ticket ${opts.ticket} not found — diagnostics not attached`)
|
|
651
|
+
} else {
|
|
652
|
+
const diagnostics = {
|
|
653
|
+
attached_at: new Date().toISOString(),
|
|
654
|
+
overall: report.overall,
|
|
655
|
+
checks: report.checks.map(c => ({
|
|
656
|
+
name: c.name, status: c.status, message: c.message, details: c.details,
|
|
657
|
+
})),
|
|
658
|
+
summary: report.summary,
|
|
659
|
+
runtime: { node: process.version, platform: process.platform },
|
|
660
|
+
}
|
|
661
|
+
await adminDb
|
|
662
|
+
.from('items')
|
|
663
|
+
.update({
|
|
664
|
+
data: { ...(ticket.data || {}), diagnostics },
|
|
665
|
+
updated_at: new Date().toISOString(),
|
|
666
|
+
})
|
|
667
|
+
.eq('id', ticket.id)
|
|
668
|
+
console.log(`Diagnostics attached to ticket ${opts.ticket}`)
|
|
669
|
+
}
|
|
670
|
+
} catch (err: any) {
|
|
671
|
+
console.warn(`diagnostic attach failed: ${err.message}`)
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
|
|
509
675
|
|
|
510
676
|
if (opts.json) {
|
|
511
677
|
console.log(JSON.stringify(report, null, 2))
|
|
@@ -549,4 +715,10 @@ export function registerDoctorCommands(program: Command) {
|
|
|
549
715
|
}
|
|
550
716
|
})
|
|
551
717
|
}
|
|
552
|
-
// CIL[
|
|
718
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Registers the 'doctor' CLI command and runs the health check sequence.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
|
|
719
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
720
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
721
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
722
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
723
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
724
|
+
// CIL[END stable_id="~/.framework/cli/commands/doctor.ts:registerDoctorCommands:function"]
|