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="~/scripts/assemble-functions.sh:module:script" type="script" identity="assemble-functions" parent="~/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="~/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
|
|
166
|
+
if [ "$CUSTOM_COUNT" -gt 0 ]; then
|
|
71
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"
|
|
@@ -29,8 +29,9 @@ fi
|
|
|
29
29
|
echo ""
|
|
30
30
|
|
|
31
31
|
# Check 2: Core importing custom_ prefixed modules
|
|
32
|
+
# Only flag actual import/require statements — comments and docs are fine
|
|
32
33
|
echo "2. Checking for custom_ module imports in core..."
|
|
33
|
-
if grep -
|
|
34
|
+
if grep -rE "^\s*(import|export).*['\"].*custom_|require\(['\"].*custom_" .framework/ --include="*.ts" --include="*.tsx" 2>/dev/null; then
|
|
34
35
|
echo " ❌ FAIL: Core files import custom_ modules"
|
|
35
36
|
VIOLATIONS=$((VIOLATIONS + 1))
|
|
36
37
|
else
|
|
@@ -39,8 +40,11 @@ fi
|
|
|
39
40
|
echo ""
|
|
40
41
|
|
|
41
42
|
# Check 2b: Custom apps using relative paths to .framework/ (should use @core alias instead)
|
|
43
|
+
# Only flag actual import/require statements — comments and docs are fine.
|
|
44
|
+
# mcp/ dirs are local dev MCP servers, not bundled frontend/function code —
|
|
45
|
+
# @core does not resolve there, so relative imports are the only option.
|
|
42
46
|
echo "2b. Checking custom apps use @core alias (not relative paths to .framework/)..."
|
|
43
|
-
if grep -
|
|
47
|
+
if grep -rE "^\s*(import|export).*from\s+['\"][^'\"]*\.framework|require\(['\"][^'\"]*\.framework" custom/ --include="*.ts" --include="*.tsx" --exclude-dir=mcp 2>/dev/null; then
|
|
44
48
|
echo " ❌ FAIL: Custom apps use relative paths to .framework/ — use @core alias instead"
|
|
45
49
|
VIOLATIONS=$((VIOLATIONS + 1))
|
|
46
50
|
else
|
|
@@ -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"
|