spine-framework 0.3.145 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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 +5051 -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,65 +1,161 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
|
|
3
|
+
# CIL[BEGIN stable_id="~/.framework/scripts/assemble-functions.sh:module:script" type="script" identity="assemble-functions" parent="~/.framework/scripts/assemble-functions.sh"]
|
|
4
|
+
# CIL[DOC-MACRO purpose="Assemble .framework/functions + custom functions into the flat .assembled/netlify/functions dir Netlify deploys, with duplicate-handler detection."]
|
|
5
|
+
# CIL[DOC-RESPONSIBILITY responsibility="Stage framework functions then custom/functions and custom/apps/*/functions into a temp dir, enforcing basename uniqueness; publish via mtime-preserving rsync."]
|
|
6
|
+
# CIL[DOC-CONTEXT module="assembly" layer="build" related_files="scripts/assemble-frontend.sh,scripts/assemble.sh,netlify.toml"]
|
|
7
|
+
# CIL[DOC-CONTRACT inputs=".framework/functions,custom/functions,custom/apps/*/functions; env SPINE_PROJECT_ROOT (fixture override for tests)" outputs=".assembled/netlify/functions; exit 1 on duplicate basename" errors="hard error naming both sources on basename collision; symlink dev-aliases resolving inside .framework/functions skip silently" side_effects="rewrites .assembled/netlify/functions"]
|
|
8
|
+
# CIL[DOC-MICRO logic_summary="Manifest-tracked staging: each staged basename records its source path; collisions resolve via is_dev_alias (macOS-safe readlink resolution) or fail. Excludes _quarantine and *-test.ts/*.test.ts." notable_decisions="flat layout is required by Netlify, so last-wins overwrite is forbidden; PROJECT_ROOT canonicalized with pwd -P so /var→/private/var symlinked TMPDIR fixtures still match"]
|
|
9
|
+
# CIL[DOC-CONFIDENCE pass="first" score="0.9" flags="none"]
|
|
10
|
+
# CIL[DOC-STABILITY stability="stable"]
|
|
11
|
+
# CIL[END stable_id="~/.framework/scripts/assemble-functions.sh:module:script"]
|
|
12
|
+
|
|
3
13
|
# Functions Assembly - Merge .framework + custom functions into .assembled/
|
|
4
|
-
#
|
|
14
|
+
#
|
|
5
15
|
# Purpose: Create unified functions directory for Netlify deployment.
|
|
6
16
|
# - .framework/functions are the canonical Spine runtime
|
|
7
|
-
# - custom/functions are your custom extensions
|
|
17
|
+
# - custom/functions + custom/apps/<app>/functions are your custom extensions
|
|
8
18
|
# - Netlify requires a single functions directory, so we assemble at build time
|
|
9
|
-
#
|
|
10
|
-
# Process:
|
|
19
|
+
#
|
|
20
|
+
# Process:
|
|
11
21
|
# 1. Assemble into temp directory first (prevents Netlify observing half-deleted dir)
|
|
12
22
|
# 2. Copy core functions
|
|
13
|
-
# 3. Overlay custom functions
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
23
|
+
# 3. Overlay custom functions — with duplicate-handler detection:
|
|
24
|
+
# a custom file whose basename is already staged must either be a symlink
|
|
25
|
+
# resolving inside .framework/functions (safe dev alias → skipped silently)
|
|
26
|
+
# or a HARD ERROR naming both source paths (no silent last-wins overwrite)
|
|
27
|
+
# 4. rsync -c into target so unchanged files keep their mtimes — Netlify/esbuild
|
|
28
|
+
# then only rebundles functions that actually changed
|
|
29
|
+
#
|
|
30
|
+
# SPINE_PROJECT_ROOT (optional): override the project root — used by the
|
|
31
|
+
# fixture-based unit tests; production use leaves it unset.
|
|
32
|
+
#
|
|
33
|
+
# Dependencies: standard bash utilities, find, cp, rsync, readlink
|
|
17
34
|
|
|
18
35
|
set -euo pipefail
|
|
19
36
|
|
|
20
37
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
21
|
-
|
|
38
|
+
# Canonicalize (-P resolves symlinks) so dev-alias prefix checks compare
|
|
39
|
+
# physical paths — e.g. macOS /var → /private/var under TMPDIR.
|
|
40
|
+
PROJECT_ROOT="$(cd "${SPINE_PROJECT_ROOT:-$(dirname "$SCRIPT_DIR")}" && pwd -P)"
|
|
22
41
|
|
|
23
42
|
CORE_DIR="$PROJECT_ROOT/.framework/functions"
|
|
24
43
|
CUSTOM_DIR="$PROJECT_ROOT/custom"
|
|
25
44
|
TARGET_DIR="$PROJECT_ROOT/.assembled/netlify/functions"
|
|
26
45
|
TMP_DIR="$PROJECT_ROOT/.functions-assemble-tmp"
|
|
46
|
+
# basename → source-file map for duplicate-handler error messages
|
|
47
|
+
STAGE_MANIFEST="$TMP_DIR.manifest.tsv"
|
|
27
48
|
|
|
28
49
|
echo "🔧 Assembling functions → $TARGET_DIR"
|
|
29
50
|
|
|
30
51
|
# 1. Assemble into a temp directory first so Netlify never observes a half-deleted functions dir
|
|
31
52
|
rm -rf "$TMP_DIR"
|
|
32
53
|
mkdir -p "$TMP_DIR"
|
|
54
|
+
: > "$STAGE_MANIFEST"
|
|
55
|
+
|
|
56
|
+
# Resolve a symlink to an absolute path (macOS readlink has no -f).
|
|
57
|
+
resolve_link() {
|
|
58
|
+
local f="$1" t d
|
|
59
|
+
t="$(readlink "$f")" || return 1
|
|
60
|
+
case "$t" in
|
|
61
|
+
/*) printf '%s\n' "$t" ;;
|
|
62
|
+
*)
|
|
63
|
+
d="$(cd "$(dirname "$f")" && cd "$(dirname "$t")" && pwd -P)" || return 1
|
|
64
|
+
printf '%s/%s\n' "$d" "$(basename "$t")"
|
|
65
|
+
;;
|
|
66
|
+
esac
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# True when $1 is a symlink whose target resolves inside $CORE_DIR —
|
|
70
|
+
# a safe dev alias back to the framework copy, not an override.
|
|
71
|
+
is_dev_alias() {
|
|
72
|
+
local f="$1" resolved
|
|
73
|
+
[ -L "$f" ] || return 1
|
|
74
|
+
resolved="$(resolve_link "$f")" || return 1
|
|
75
|
+
case "$resolved" in
|
|
76
|
+
"$CORE_DIR"|"$CORE_DIR"/*) return 0 ;;
|
|
77
|
+
*) return 1 ;;
|
|
78
|
+
esac
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
# Copy top-level .ts files from $1 (excluding tests) into the flat TMP_DIR.
|
|
82
|
+
# Basename already staged → dev-alias skip or hard error naming both sources.
|
|
83
|
+
stage_fn_files() {
|
|
84
|
+
local src_dir="$1"
|
|
85
|
+
local f base staged prev
|
|
86
|
+
while IFS= read -r -d '' f; do
|
|
87
|
+
base="$(basename "$f")"
|
|
88
|
+
staged="$TMP_DIR/$base"
|
|
89
|
+
if [ -e "$staged" ]; then
|
|
90
|
+
if is_dev_alias "$f"; then
|
|
91
|
+
continue # dev alias → framework copy already staged, skip silently
|
|
92
|
+
fi
|
|
93
|
+
prev="$(awk -F '\t' -v b="$base" '$1 == b { print $2; exit }' "$STAGE_MANIFEST")"
|
|
94
|
+
echo " ✗ Duplicate function handler: '$base' is provided by both" >&2
|
|
95
|
+
echo " - $prev" >&2
|
|
96
|
+
echo " - $f" >&2
|
|
97
|
+
echo " Rename one of them — functions assemble flat, last-wins is forbidden." >&2
|
|
98
|
+
exit 1
|
|
99
|
+
fi
|
|
100
|
+
cp "$f" "$staged"
|
|
101
|
+
printf '%s\t%s\n' "$base" "$f" >> "$STAGE_MANIFEST"
|
|
102
|
+
done < <(find "$src_dir" -maxdepth 1 -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' -print0 | sort -z)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
# Copy subdirectories of $1 into TMP_DIR, merging by basename. A real custom
|
|
106
|
+
# dir may overlay a framework dir (e.g. _shared helpers); a symlinked dir is a
|
|
107
|
+
# dev alias when it resolves inside .framework/functions — skipped silently if
|
|
108
|
+
# the name is already staged — otherwise a colliding symlink is a hard error.
|
|
109
|
+
stage_fn_dirs() {
|
|
110
|
+
local src_dir="$1"
|
|
111
|
+
local d base
|
|
112
|
+
while IFS= read -r -d '' d; do
|
|
113
|
+
base="$(basename "$d")"
|
|
114
|
+
[ "$base" = "_quarantine" ] && continue
|
|
115
|
+
if [ -L "$d" ]; then
|
|
116
|
+
if [ -e "$TMP_DIR/$base" ]; then
|
|
117
|
+
if is_dev_alias "$d"; then
|
|
118
|
+
continue
|
|
119
|
+
fi
|
|
120
|
+
echo " ✗ Duplicate function path: '$base' is provided by both" >&2
|
|
121
|
+
echo " - $TMP_DIR/$base (already staged)" >&2
|
|
122
|
+
echo " - $d -> $(readlink "$d")" >&2
|
|
123
|
+
exit 1
|
|
124
|
+
fi
|
|
125
|
+
cp -R "$d" "$TMP_DIR/" 2>/dev/null || true
|
|
126
|
+
continue
|
|
127
|
+
fi
|
|
128
|
+
# real dir: merge into staged dir if present (cp of dir/. includes dotfiles)
|
|
129
|
+
mkdir -p "$TMP_DIR/$base"
|
|
130
|
+
cp -r "$d"/. "$TMP_DIR/$base/" 2>/dev/null || true
|
|
131
|
+
done < <(find "$src_dir" -mindepth 1 -maxdepth 1 \( -type d -o -type l \) -print0 | sort -z)
|
|
132
|
+
}
|
|
33
133
|
|
|
34
134
|
# 2. Copy core functions (base layer), excluding _quarantine and test files
|
|
35
135
|
if [ -d "$CORE_DIR" ]; then
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
# Copy subdirectories except _quarantine
|
|
39
|
-
find "$CORE_DIR" -maxdepth 1 -mindepth 1 -type d ! -name '_quarantine' -exec cp -r {} "$TMP_DIR"/ \;
|
|
136
|
+
stage_fn_files "$CORE_DIR"
|
|
137
|
+
stage_fn_dirs "$CORE_DIR"
|
|
40
138
|
echo " ✓ Core: $(find "$CORE_DIR" -name '*.ts' | grep -v '_quarantine' | grep -v '\-test\.ts$' | grep -v '\.test\.ts$' | wc -l | tr -d ' ') files"
|
|
41
139
|
fi
|
|
42
140
|
|
|
43
|
-
# 3. Overlay custom functions (
|
|
141
|
+
# 3. Overlay custom functions (additions; basename collisions error out above),
|
|
142
|
+
# excluding test files
|
|
44
143
|
CUSTOM_COUNT=0
|
|
45
144
|
|
|
46
|
-
# 3a.
|
|
145
|
+
# 3a. Functions from custom/functions/
|
|
47
146
|
if [ -d "$CUSTOM_DIR/functions" ]; then
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# Copy subdirectories if any
|
|
51
|
-
find "$CUSTOM_DIR/functions" -mindepth 1 -type d -exec sh -c 'dir="$1"; base=$(basename "$dir"); mkdir -p "'"$TMP_DIR"'/$base" && cp -r "$dir"/* "'"$TMP_DIR"'/$base/"' _ {} \; 2>/dev/null || true
|
|
147
|
+
stage_fn_files "$CUSTOM_DIR/functions"
|
|
148
|
+
stage_fn_dirs "$CUSTOM_DIR/functions"
|
|
52
149
|
CUSTOM_COUNT=$((CUSTOM_COUNT + $(find "$CUSTOM_DIR/functions" -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' 2>/dev/null | wc -l | tr -d ' ')))
|
|
53
150
|
fi
|
|
54
151
|
|
|
55
|
-
# 3b.
|
|
152
|
+
# 3b. Functions from custom/apps/*/functions/ — app-vs-framework AND
|
|
153
|
+
# app-vs-app basename collisions both hit the same staged-name check.
|
|
56
154
|
if [ -d "$CUSTOM_DIR/apps" ]; then
|
|
57
|
-
for app_dir in "$CUSTOM_DIR/apps"
|
|
155
|
+
for app_dir in "$CUSTOM_DIR/apps"/*/; do
|
|
58
156
|
if [ -d "$app_dir/functions" ]; then
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
# Copy subdirectories if any
|
|
62
|
-
find "$app_dir/functions" -mindepth 1 -type d -exec sh -c 'dir="$1"; base=$(basename "$dir"); mkdir -p "'"$TMP_DIR"'/$base" && cp -r "$dir"/* "'"$TMP_DIR"'/$base/"' _ {} \; 2>/dev/null || true
|
|
157
|
+
stage_fn_files "$app_dir/functions"
|
|
158
|
+
stage_fn_dirs "$app_dir/functions"
|
|
63
159
|
APP_COUNT=$(find "$app_dir/functions" -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' 2>/dev/null | wc -l | tr -d ' ')
|
|
64
160
|
CUSTOM_COUNT=$((CUSTOM_COUNT + APP_COUNT))
|
|
65
161
|
echo " ✓ $(basename "$app_dir"): $APP_COUNT files"
|
|
@@ -67,16 +163,18 @@ if [ -d "$CUSTOM_DIR/apps" ]; then
|
|
|
67
163
|
done
|
|
68
164
|
fi
|
|
69
165
|
|
|
70
|
-
if [ $CUSTOM_COUNT -gt 0 ]; then
|
|
71
|
-
echo " ✓ Custom: $CUSTOM_COUNT files"
|
|
166
|
+
if [ "$CUSTOM_COUNT" -gt 0 ]; then
|
|
167
|
+
echo " ✓ Custom: $CUSTOM_COUNT total files"
|
|
72
168
|
else
|
|
73
169
|
echo " ○ Custom: (empty)"
|
|
74
170
|
fi
|
|
75
171
|
|
|
76
|
-
# 4.
|
|
77
|
-
|
|
172
|
+
# 4. Sync temp into place. -c compares content checksums; deliberately NO -t —
|
|
173
|
+
# otherwise rsync "corrects" mtimes of unchanged files to the fresh temp-copy
|
|
174
|
+
# time and Netlify/esbuild reloads all ~100 functions on every assemble.
|
|
78
175
|
mkdir -p "$(dirname "$TARGET_DIR")"
|
|
79
|
-
|
|
176
|
+
rsync -rlc --delete "$TMP_DIR"/ "$TARGET_DIR"/
|
|
177
|
+
rm -rf "$TMP_DIR" "$STAGE_MANIFEST"
|
|
80
178
|
|
|
81
179
|
echo " ✓ Assembled: $(find "$TARGET_DIR" -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' | wc -l | tr -d ' ') total functions"
|
|
82
180
|
echo "✅ Done"
|
|
@@ -18,8 +18,9 @@ echo ""
|
|
|
18
18
|
VIOLATIONS=0
|
|
19
19
|
|
|
20
20
|
# Check 1: Core importing from custom/ directory
|
|
21
|
+
# Only flag actual import/require statements — comments and docs are fine
|
|
21
22
|
echo "1. Checking for imports from custom/ in core..."
|
|
22
|
-
if grep -
|
|
23
|
+
if grep -rE "^\s*(import|export).*['\"].*custom/|require\(['\"].*custom/" .framework/ --include="*.ts" --include="*.tsx" --exclude-dir=tests 2>/dev/null; then
|
|
23
24
|
echo " ❌ FAIL: Core files import from custom/"
|
|
24
25
|
VIOLATIONS=$((VIOLATIONS + 1))
|
|
25
26
|
else
|
|
@@ -48,8 +49,11 @@ fi
|
|
|
48
49
|
echo ""
|
|
49
50
|
|
|
50
51
|
# Check 3: App-specific references in core
|
|
52
|
+
# Only flag actual code (imports, JSX, logic) — comments, JSDoc, and string literals in examples are fine
|
|
51
53
|
echo "3. Checking for app-specific references in core..."
|
|
52
|
-
APP_REFS=$(grep -
|
|
54
|
+
APP_REFS=$(grep -rE "^\s*(import|export|from|<[A-Z])" .framework/src/ --include="*.ts" --include="*.tsx" 2>/dev/null \
|
|
55
|
+
| grep -E "cortex|funnel|support-triage|kb-chunker|portal-signals" \
|
|
56
|
+
| grep -v "manifest\.json\|webhook-registry" || true)
|
|
53
57
|
if [ -n "$APP_REFS" ]; then
|
|
54
58
|
echo " ❌ FAIL: App-specific references found in core:"
|
|
55
59
|
echo "$APP_REFS"
|
|
@@ -1,80 +1,36 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
* - In production (SPINE_INTEGRITY=enforce), mismatches fail the build
|
|
15
|
-
*
|
|
16
|
-
* **Current State**: Cannot function - references wrong directory paths.
|
|
17
|
-
*
|
|
18
|
-
* **Dependencies**: shasum, standard bash utilities
|
|
19
|
-
*
|
|
20
|
-
* @tags orphaned, build, integrity, manifest, verification
|
|
21
|
-
*/
|
|
2
|
+
# CIL[BEGIN stable_id="~/scripts/build-manifest.sh:module:script" type="script" identity="build-manifest" parent="~/scripts/build-manifest.sh"]
|
|
3
|
+
# CIL[DOC-MACRO purpose="Thin wrapper that regenerates .spine-manifest.json via scripts/checksum-manifest.mts"]
|
|
4
|
+
# CIL[DOC-RESPONSIBILITY responsibility="Resolve the repo-local tsx binary and invoke the Node manifest generator against this repo root"]
|
|
5
|
+
# CIL[DOC-CONTEXT module="spine-integrity" layer="build" related_files="scripts/checksum-manifest.mts,scripts/verify-integrity.sh,package.json"]
|
|
6
|
+
# CIL[DOC-CONTRACT inputs="optional passthrough args (e.g. --include-dir)" outputs=".spine-manifest.json at repo root" errors="exit 1 when tsx is missing or the generator fails" side_effects="rewrites .spine-manifest.json, echoes SPINE_INTEGRITY mode for compatibility"]
|
|
7
|
+
# CIL[DOC-MICRO logic_summary="Replaces the legacy inline-bash implementation that used GNU-only sort -z and a broken JSDoc header" notable_decisions="hashing lives in Node — BSD/GNU portability and deterministic ordering come free"]
|
|
8
|
+
# CIL[DOC-CONFIDENCE pass="first" score="0.9" flags="none"]
|
|
9
|
+
# CIL[DOC-STABILITY stability="stable"]
|
|
10
|
+
# CIL[DOC-AUDIENCE audience="system-admin"]
|
|
11
|
+
# CIL[DOC-VECTOR type="context" content="Invoked by npm run manifest"]
|
|
12
|
+
# CIL[DOC-VECTOR type="implementation_pattern" content="Sibling thin wrapper of verify-integrity.sh; real logic in scripts/checksum-manifest.mts" status="ready"]
|
|
13
|
+
# CIL[END stable_id="~/scripts/build-manifest.sh:module:script"]
|
|
22
14
|
|
|
23
15
|
set -euo pipefail
|
|
24
16
|
|
|
25
17
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
26
18
|
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
27
19
|
|
|
28
|
-
CORE_DIR="$PROJECT_ROOT/.framework"
|
|
29
|
-
CORE_SRC_DIR="$PROJECT_ROOT/.framework/src"
|
|
30
|
-
MANIFEST_FILE="$PROJECT_ROOT/.spine-manifest.json"
|
|
31
|
-
|
|
32
20
|
INTEGRITY_MODE="${SPINE_INTEGRITY:-warn}"
|
|
21
|
+
echo "🔒 Generating spine integrity manifest (mode: $INTEGRITY_MODE)"
|
|
33
22
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
FIRST=true
|
|
39
|
-
|
|
40
|
-
# Core functions
|
|
41
|
-
while IFS= read -r -d '' file; do
|
|
42
|
-
REL_PATH="${file#$PROJECT_ROOT/}"
|
|
43
|
-
HASH=$(shasum -a 256 "$file" | cut -d' ' -f1)
|
|
44
|
-
if [ "$FIRST" = true ]; then
|
|
45
|
-
FIRST=false
|
|
46
|
-
else
|
|
47
|
-
HASHES="$HASHES,"
|
|
48
|
-
fi
|
|
49
|
-
HASHES="$HASHES\"$REL_PATH\":\"$HASH\""
|
|
50
|
-
done < <(find "$CORE_DIR" -type f -name '*.ts' -print0 | sort -z)
|
|
51
|
-
|
|
52
|
-
# Core src components (shared, layout, hooks, lib)
|
|
53
|
-
for SUBDIR in components/shared components/layout hooks lib; do
|
|
54
|
-
DIR="$CORE_SRC_DIR/$SUBDIR"
|
|
55
|
-
if [ -d "$DIR" ]; then
|
|
56
|
-
while IFS= read -r -d '' file; do
|
|
57
|
-
REL_PATH="${file#$PROJECT_ROOT/}"
|
|
58
|
-
HASH=$(shasum -a 256 "$file" | cut -d' ' -f1)
|
|
59
|
-
HASHES="$HASHES,\"$REL_PATH\":\"$HASH\""
|
|
60
|
-
done < <(find "$DIR" -type f \( -name '*.ts' -o -name '*.tsx' \) -print0 | sort -z)
|
|
61
|
-
fi
|
|
62
|
-
done
|
|
23
|
+
if [ -f "$PROJECT_ROOT/.spine-export-manifest.json" ]; then
|
|
24
|
+
echo "❌ Frozen standalone export — .spine-manifest.json regeneration is only allowed in the monorepo (.spine-export-manifest.json present)" >&2
|
|
25
|
+
exit 1
|
|
26
|
+
fi
|
|
63
27
|
|
|
64
|
-
|
|
28
|
+
TSX="$PROJECT_ROOT/node_modules/.bin/tsx"
|
|
29
|
+
if [ ! -x "$TSX" ]; then
|
|
30
|
+
echo "❌ tsx not found at $TSX — run 'npm install' first" >&2
|
|
31
|
+
exit 1
|
|
32
|
+
fi
|
|
65
33
|
|
|
66
|
-
|
|
67
|
-
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
68
|
-
cat > "$MANIFEST_FILE" <<EOF
|
|
69
|
-
{
|
|
70
|
-
"version": "1",
|
|
71
|
-
"generated_at": "$TIMESTAMP",
|
|
72
|
-
"integrity_mode": "$INTEGRITY_MODE",
|
|
73
|
-
"file_count": $(echo "$HASHES" | tr ',' '\n' | wc -l | tr -d ' '),
|
|
74
|
-
"hashes": $HASHES
|
|
75
|
-
}
|
|
76
|
-
EOF
|
|
34
|
+
"$TSX" "$SCRIPT_DIR/checksum-manifest.mts" "$PROJECT_ROOT" "$PROJECT_ROOT/.spine-manifest.json" "$@"
|
|
77
35
|
|
|
78
|
-
echo "
|
|
79
|
-
echo " ✓ $(echo "$HASHES" | tr ',' '\n' | wc -l | tr -d ' ') files hashed"
|
|
80
|
-
echo "✅ Done"
|
|
36
|
+
echo "✅ Manifest written"
|
|
@@ -1,82 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* **Process**:
|
|
16
|
-
* 1. Check for manifest file existence
|
|
17
|
-
* 2. Calculate current hashes for src and functions
|
|
18
|
-
* 3. Compare with stored manifest values
|
|
19
|
-
* 4. Report any mismatches
|
|
20
|
-
*
|
|
21
|
-
* **Dependencies**: find, sha256sum, .spine-manifest.json
|
|
22
|
-
*
|
|
23
|
-
* @tags build, integrity, verification, v2-core, security
|
|
24
|
-
*/
|
|
2
|
+
# CIL[BEGIN stable_id="~/.framework/scripts/check-core-integrity.sh:module:script" type="script" identity="check-core-integrity" parent="~/.framework/scripts/check-core-integrity.sh"]
|
|
3
|
+
# CIL[DOC-MACRO purpose="RETIRED — deprecated shim that delegates to verify-integrity.sh"]
|
|
4
|
+
# CIL[DOC-RESPONSIBILITY responsibility="Preserve the historical entrypoint name while forwarding all integrity checks to the unified manifest verifier"]
|
|
5
|
+
# CIL[DOC-CONTEXT module="spine-integrity" layer="build" related_files="scripts/verify-integrity.sh,scripts/verify-manifest.mts,.framework/scripts/check-core-integrity.sh"]
|
|
6
|
+
# CIL[DOC-CONTRACT inputs="passthrough args" outputs="exit code of verify-integrity.sh" errors="same as verify-integrity.sh" side_effects="deprecation notice on stderr"]
|
|
7
|
+
# CIL[DOC-MICRO logic_summary="The legacy implementation compared aggregate src/functions hashes and used GNU-only tools with invalid bash markers; it had no callers" notable_decisions="kept as a shim rather than deleted so external muscle memory and docs links do not 404"]
|
|
8
|
+
# CIL[DOC-CONFIDENCE pass="first" score="0.9" flags="superseded"]
|
|
9
|
+
# CIL[DOC-STABILITY stability="deprecated"]
|
|
10
|
+
# CIL[DOC-AUDIENCE audience="system-admin"]
|
|
11
|
+
# CIL[DOC-NOTE type="deprecated" content="No repo callers found via git grep; use npm run verify / scripts/verify-integrity.sh directly"]
|
|
12
|
+
# CIL[DOC-VECTOR type="context" content="Retired in favor of scripts/verify-integrity.sh during the hard-lock manifest batch"]
|
|
13
|
+
# CIL[DOC-VECTOR type="implementation_pattern" content="exec passthrough shim" status="ready"]
|
|
14
|
+
# CIL[END stable_id="~/.framework/scripts/check-core-integrity.sh:module:script"]
|
|
25
15
|
|
|
26
16
|
set -euo pipefail
|
|
27
17
|
|
|
28
18
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
29
|
-
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
30
|
-
CORE_DIR="$PROJECT_ROOT/.framework"
|
|
31
|
-
MANIFEST_FILE="$CORE_DIR/.spine-manifest.json"
|
|
32
|
-
|
|
33
|
-
echo "Checking .framework integrity..."
|
|
34
|
-
|
|
35
|
-
if [ ! -f "$MANIFEST_FILE" ]; then
|
|
36
|
-
echo " ERROR: Manifest file not found at $MANIFEST_FILE"
|
|
37
|
-
exit 1
|
|
38
|
-
fi
|
|
39
|
-
|
|
40
|
-
// ─── CHUNK_START: CHECK_CORE_INTEGRITY_MAIN ──────────────────────────────────────────────
|
|
41
|
-
/**
|
|
42
|
-
* @chunk-id CHECK_CORE_INTEGRITY_MAIN_1_0_0
|
|
43
|
-
* @version 1.0.0
|
|
44
|
-
* @hash 3799437312b1f95c807f0862818bf01651792c0d5e2bb81d91d734251a76fc75
|
|
45
|
-
* @macro Core Integrity Verification
|
|
46
|
-
* @micro Calculate and compare v2-core file hashes against manifest
|
|
47
|
-
* @inputs $MANIFEST_FILE: string — Path to .spine-manifest.json
|
|
48
|
-
* @outputs exit code — 0 for pass, 1 for failure
|
|
49
|
-
* @depends-on [find, sha256sum, jq/grep, .spine-manifest.json]
|
|
50
|
-
* @depended-by [CI/CD pipelines, pre-deploy hooks]
|
|
51
|
-
* @side-effects [console output, exit with status code]
|
|
52
|
-
* @tags integrity, verification, security, v2-core
|
|
53
|
-
*/
|
|
54
|
-
# Calculate current hashes
|
|
55
|
-
CURRENT_SRC_HASH=$(find "$CORE_DIR/src" -type f -name '*.tsx' -o -name '*.ts' -o -name '*.css' 2>/dev/null | LC_ALL=C sort | xargs cat 2>/dev/null | sha256sum | cut -d' ' -f1)
|
|
56
|
-
CURRENT_FUNCTIONS_HASH=$(find "$CORE_DIR/functions" -type f -name '*.ts' 2>/dev/null | LC_ALL=C sort | xargs cat 2>/dev/null | sha256sum | cut -d' ' -f1)
|
|
57
|
-
|
|
58
|
-
# Extract expected hashes from manifest (using jq if available, fallback to grep)
|
|
59
|
-
if command -v jq >/dev/null 2>&1; then
|
|
60
|
-
EXPECTED_SRC_HASH=$(jq -r '.integrity.src' "$MANIFEST_FILE" | sed 's/sha256-//')
|
|
61
|
-
EXPECTED_FUNCTIONS_HASH=$(jq -r '.integrity.functions' "$MANIFEST_FILE" | sed 's/sha256-//')
|
|
62
|
-
else
|
|
63
|
-
EXPECTED_SRC_HASH=$(grep '"src"' "$MANIFEST_FILE" | cut -d'"' -f4 | sed 's/sha256-//')
|
|
64
|
-
EXPECTED_FUNCTIONS_HASH=$(grep '"functions"' "$MANIFEST_FILE" | cut -d'"' -f4 | sed 's/sha256-//')
|
|
65
|
-
fi
|
|
66
19
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
echo " Integrity check PASSED - Core files are unchanged"
|
|
70
|
-
exit 0
|
|
71
|
-
else
|
|
72
|
-
echo " INTEGRITY CHECK FAILED - Core files have been modified!"
|
|
73
|
-
echo " WARRANTY VOIDED - Core tampering detected"
|
|
74
|
-
echo ""
|
|
75
|
-
echo " Expected src hash: $EXPECTED_SRC_HASH"
|
|
76
|
-
echo " Current src hash: $CURRENT_SRC_HASH"
|
|
77
|
-
echo ""
|
|
78
|
-
echo " Expected functions hash: $EXPECTED_FUNCTIONS_HASH"
|
|
79
|
-
echo " Current functions hash: $CURRENT_FUNCTIONS_HASH"
|
|
80
|
-
exit 1
|
|
81
|
-
fi
|
|
82
|
-
// ─── CHUNK_END: CHECK_CORE_INTEGRITY_MAIN ────────────────────────────────────────────────
|
|
20
|
+
echo "⚠️ check-core-integrity.sh is retired — delegating to verify-integrity.sh" >&2
|
|
21
|
+
exec bash "$SCRIPT_DIR/verify-integrity.sh" "$@"
|