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
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Declares module-level imports and dependencies for the CIL versions admin page."]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import React hooks, shared UI components, icons, and the PageInstructions helper."]
|
|
4
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/lib/api.ts"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="available module imports" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Groups all external and internal imports required by CILVersionsPage." notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="admin UI developers"]
|
|
10
|
+
|
|
11
|
+
import { useEffect, useState } from 'react'
|
|
12
|
+
import { apiFetch } from '@core/lib/api'
|
|
13
|
+
import { Card, CardContent } from '@core/components/ui/card'
|
|
14
|
+
import { Button } from '@core/components/ui/button'
|
|
15
|
+
import { Badge } from '@core/components/ui/badge'
|
|
16
|
+
import { Skeleton } from '@core/components/ui/skeleton'
|
|
17
|
+
import { Input } from '@core/components/ui/input'
|
|
18
|
+
import { Label } from '@core/components/ui/label'
|
|
19
|
+
import {
|
|
20
|
+
Table,
|
|
21
|
+
TableHeader,
|
|
22
|
+
TableBody,
|
|
23
|
+
TableRow,
|
|
24
|
+
TableHead,
|
|
25
|
+
TableCell,
|
|
26
|
+
} from '@core/components/ui/table'
|
|
27
|
+
import { GitBranch, Plus } from 'lucide-react'
|
|
28
|
+
|
|
29
|
+
import { PageInstructions } from '../../../components/admin/PageInstructions'
|
|
30
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Declares module-level imports and dependencies for the CIL versions admin page.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
31
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
32
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
33
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
34
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
35
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
36
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx:module_header:module_header"]
|
|
37
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx:project_id:constant" type="constant" identity="project_id" parent="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx"]
|
|
38
|
+
// CIL[DOC-MACRO purpose="Provides the fixed CIL redesign project UUID used to filter and create versions."]
|
|
39
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Hold the project identifier constant referenced by fetch and create operations."]
|
|
40
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILVersionsPage.tsx"]
|
|
41
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="PROJECT_ID string" errors="none" side_effects="none"]
|
|
42
|
+
// CIL[DOC-MICRO logic_summary="Hard-codes the CIL redesign project UUID for record scoping." notable_decisions="[]"]
|
|
43
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
44
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
45
|
+
|
|
46
|
+
const PROJECT_ID = '24d2bb67-24be-4cdf-a633-108588d37f00'
|
|
47
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Provides the fixed CIL redesign project UUID used to filter and create versions.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
48
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
49
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
50
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
51
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
52
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
53
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx:project_id:constant"]
|
|
54
|
+
|
|
55
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx:CILVersion:interface" type="interface" identity="CILVersion" parent="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx"]
|
|
56
|
+
// CIL[DOC-MACRO purpose="Defines the TypeScript shape for CIL version records returned by admin-data."]
|
|
57
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type the version object consumed and rendered by CILVersionsPage."]
|
|
58
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILVersionsPage.tsx"]
|
|
59
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="CILVersion type contract" errors="none" side_effects="none"]
|
|
60
|
+
// CIL[DOC-MICRO logic_summary="Describes the nested data fields and metadata of a CIL version record." notable_decisions="[]"]
|
|
61
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
62
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
63
|
+
|
|
64
|
+
interface CILVersion {
|
|
65
|
+
id: string
|
|
66
|
+
title: string
|
|
67
|
+
data: {
|
|
68
|
+
version?: string
|
|
69
|
+
status?: string
|
|
70
|
+
is_iteration?: boolean
|
|
71
|
+
published_version_id?: string | null
|
|
72
|
+
project_id?: string
|
|
73
|
+
}
|
|
74
|
+
created_at: string
|
|
75
|
+
}
|
|
76
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Defines the TypeScript shape for CIL version records returned by admin-data.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
77
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
78
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
79
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
80
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
81
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
82
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx:CILVersion:interface"]
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx:status_variant:constant" type="constant" identity="status_variant" parent="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx"]
|
|
89
|
+
// CIL[DOC-MACRO purpose="Maps CIL version status values to Badge component variants."]
|
|
90
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Supply the correct visual variant for active, inactive, and archived version statuses."]
|
|
91
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILVersionsPage.tsx"]
|
|
92
|
+
// CIL[DOC-CONTRACT inputs="status string" outputs="Badge variant name" errors="unknown status falls back to 'secondary'" side_effects="none"]
|
|
93
|
+
// CIL[DOC-MICRO logic_summary="Record lookup that maps status to one of the Badge variant options." notable_decisions="[]"]
|
|
94
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
95
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
96
|
+
|
|
97
|
+
const STATUS_VARIANT: Record<string, 'default' | 'secondary' | 'outline' | 'destructive'> = {
|
|
98
|
+
active: 'default',
|
|
99
|
+
inactive: 'secondary',
|
|
100
|
+
archived: 'outline',
|
|
101
|
+
}
|
|
102
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Maps CIL version status values to Badge component variants.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
103
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
104
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
105
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
106
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
107
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
108
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx:status_variant:constant"]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx:CILVersionsPage:component" type="component" identity="CILVersionsPage" parent="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx"]
|
|
116
|
+
// CIL[DOC-MACRO purpose="Renders and manages CIL project versions: list, create, publish, deactivate, and archive."]
|
|
117
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Fetch, display, create, and transition CIL version statuses through the admin-data API."]
|
|
118
|
+
// CIL[DOC-CONTEXT module="admin/cil" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/table.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILVersionsPage.tsx"]
|
|
119
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX page" errors="silent on network or parse failures" side_effects="GET/POST/PATCH /api/admin-data, React state updates"]
|
|
120
|
+
// CIL[DOC-MICRO logic_summary="Uses useState/useEffect; fetches versions filtered by PROJECT_ID; supports creating new versions and transitioning statuses; renders a table of versions with action buttons." notable_decisions="['Status transitions are performed via PATCH with the full status value', 'Unknown statuses render with a secondary Badge variant']"]
|
|
121
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
122
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
123
|
+
|
|
124
|
+
export default function CILVersionsPage() {
|
|
125
|
+
const [versions, setVersions] = useState<CILVersion[]>([])
|
|
126
|
+
const [loading, setLoading] = useState(true)
|
|
127
|
+
const [acting, setActing] = useState<string | null>(null)
|
|
128
|
+
const [newVersion, setNewVersion] = useState('')
|
|
129
|
+
const [creating, setCreating] = useState(false)
|
|
130
|
+
|
|
131
|
+
const fetchVersions = async () => {
|
|
132
|
+
setLoading(true)
|
|
133
|
+
try {
|
|
134
|
+
const res = await apiFetch(
|
|
135
|
+
`/api/admin-data?action=list&entity=items&type_slug=cil_version&limit=500`
|
|
136
|
+
)
|
|
137
|
+
const data = await res.json().catch(() => ({}))
|
|
138
|
+
const items: CILVersion[] = data?.data || data?.items || []
|
|
139
|
+
setVersions(items.filter(v => v.data?.project_id === PROJECT_ID))
|
|
140
|
+
} catch {
|
|
141
|
+
setVersions([])
|
|
142
|
+
} finally {
|
|
143
|
+
setLoading(false)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
useEffect(() => { fetchVersions() }, [])
|
|
148
|
+
|
|
149
|
+
const updateVersionStatus = async (id: string, status: string) => {
|
|
150
|
+
setActing(id)
|
|
151
|
+
try {
|
|
152
|
+
await apiFetch(`/api/admin-data?action=update&entity=items&id=${id}`, {
|
|
153
|
+
method: 'PATCH',
|
|
154
|
+
headers: { 'Content-Type': 'application/json' },
|
|
155
|
+
body: JSON.stringify({
|
|
156
|
+
entity: 'items',
|
|
157
|
+
type_slug: 'cil_version',
|
|
158
|
+
data: { status },
|
|
159
|
+
}),
|
|
160
|
+
})
|
|
161
|
+
} catch {
|
|
162
|
+
// silent
|
|
163
|
+
} finally {
|
|
164
|
+
setActing(null)
|
|
165
|
+
fetchVersions()
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const handleCreate = async (e: React.FormEvent) => {
|
|
170
|
+
e.preventDefault()
|
|
171
|
+
if (!newVersion.trim()) return
|
|
172
|
+
setCreating(true)
|
|
173
|
+
try {
|
|
174
|
+
await apiFetch('/api/admin-data?action=create&entity=items', {
|
|
175
|
+
method: 'POST',
|
|
176
|
+
headers: { 'Content-Type': 'application/json' },
|
|
177
|
+
body: JSON.stringify({
|
|
178
|
+
entity: 'items',
|
|
179
|
+
type_slug: 'cil_version',
|
|
180
|
+
title: newVersion.trim(),
|
|
181
|
+
data: {
|
|
182
|
+
project_id: PROJECT_ID,
|
|
183
|
+
version: newVersion.trim(),
|
|
184
|
+
status: 'inactive',
|
|
185
|
+
is_iteration: false,
|
|
186
|
+
published_version_id: null,
|
|
187
|
+
},
|
|
188
|
+
}),
|
|
189
|
+
})
|
|
190
|
+
setNewVersion('')
|
|
191
|
+
fetchVersions()
|
|
192
|
+
} catch {
|
|
193
|
+
// silent
|
|
194
|
+
} finally {
|
|
195
|
+
setCreating(false)
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return (
|
|
200
|
+
<div className="p-6 space-y-6">
|
|
201
|
+
<div className="flex items-center justify-between">
|
|
202
|
+
<div>
|
|
203
|
+
<h1 className="text-2xl font-bold flex items-center gap-2">
|
|
204
|
+
<GitBranch className="h-6 w-6 text-indigo-500" />
|
|
205
|
+
CIL Versions
|
|
206
|
+
</h1>
|
|
207
|
+
<p className="text-muted-foreground text-sm mt-1">
|
|
208
|
+
Manage published, inactive, and archived versions for the CIL redesign project.
|
|
209
|
+
</p>
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
|
|
213
|
+
<PageInstructions
|
|
214
|
+
description="Create and manage CIL project versions."
|
|
215
|
+
sections={[
|
|
216
|
+
{ title: 'What this page is for', content: 'Versions represent distinct snapshots or iterations of a CIL project. Use this page to publish, deactivate, and archive versions.' },
|
|
217
|
+
{ title: 'How to create a version', content: 'Enter a version string (e.g., 1.0.0) and click Create.' },
|
|
218
|
+
{ title: 'Actions', content: 'Publish makes an inactive version active. Deactivate sets a version back to inactive. Archive marks it as archived.' },
|
|
219
|
+
]}
|
|
220
|
+
/>
|
|
221
|
+
|
|
222
|
+
<Card>
|
|
223
|
+
<CardContent className="p-4">
|
|
224
|
+
<form onSubmit={handleCreate} className="flex items-end gap-3">
|
|
225
|
+
<div className="flex-1 min-w-0">
|
|
226
|
+
<Label htmlFor="version" className="text-sm">New version</Label>
|
|
227
|
+
<Input
|
|
228
|
+
id="version"
|
|
229
|
+
value={newVersion}
|
|
230
|
+
onChange={e => setNewVersion(e.target.value)}
|
|
231
|
+
placeholder="e.g. 1.0.0"
|
|
232
|
+
disabled={creating}
|
|
233
|
+
/>
|
|
234
|
+
</div>
|
|
235
|
+
<Button type="submit" disabled={creating || !newVersion.trim()}>
|
|
236
|
+
<Plus className="h-4 w-4 mr-2" />
|
|
237
|
+
Create
|
|
238
|
+
</Button>
|
|
239
|
+
</form>
|
|
240
|
+
</CardContent>
|
|
241
|
+
</Card>
|
|
242
|
+
|
|
243
|
+
{loading ? (
|
|
244
|
+
<div className="space-y-2">
|
|
245
|
+
<Skeleton className="h-8 w-64" />
|
|
246
|
+
<Skeleton className="h-64 w-full" />
|
|
247
|
+
</div>
|
|
248
|
+
) : versions.length === 0 ? (
|
|
249
|
+
<div className="text-center py-12 text-muted-foreground">
|
|
250
|
+
No versions found for this project.
|
|
251
|
+
</div>
|
|
252
|
+
) : (
|
|
253
|
+
<Card>
|
|
254
|
+
<CardContent className="p-0">
|
|
255
|
+
<Table>
|
|
256
|
+
<TableHeader>
|
|
257
|
+
<TableRow>
|
|
258
|
+
<TableHead>Version</TableHead>
|
|
259
|
+
<TableHead>Status</TableHead>
|
|
260
|
+
<TableHead>Is Iteration</TableHead>
|
|
261
|
+
<TableHead>Published Version ID</TableHead>
|
|
262
|
+
<TableHead>Created At</TableHead>
|
|
263
|
+
<TableHead className="text-right">Actions</TableHead>
|
|
264
|
+
</TableRow>
|
|
265
|
+
</TableHeader>
|
|
266
|
+
<TableBody>
|
|
267
|
+
{versions.map(v => {
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
const status = v.data?.status || 'inactive'
|
|
273
|
+
|
|
274
|
+
return (
|
|
275
|
+
<TableRow key={v.id}>
|
|
276
|
+
<TableCell className="font-mono">{v.data?.version || v.title}</TableCell>
|
|
277
|
+
<TableCell>
|
|
278
|
+
<Badge variant={STATUS_VARIANT[status] || 'secondary'}>{status}</Badge>
|
|
279
|
+
</TableCell>
|
|
280
|
+
<TableCell>{v.data?.is_iteration ? 'Yes' : 'No'}</TableCell>
|
|
281
|
+
<TableCell className="font-mono text-xs">{v.data?.published_version_id || '—'}</TableCell>
|
|
282
|
+
<TableCell className="text-muted-foreground text-xs">
|
|
283
|
+
{v.created_at ? new Date(v.created_at).toLocaleString() : '—'}
|
|
284
|
+
</TableCell>
|
|
285
|
+
<TableCell className="text-right">
|
|
286
|
+
<div className="flex items-center justify-end gap-2">
|
|
287
|
+
{status === 'inactive' && (
|
|
288
|
+
<Button
|
|
289
|
+
size="sm"
|
|
290
|
+
variant="outline"
|
|
291
|
+
disabled={acting === v.id}
|
|
292
|
+
onClick={() => updateVersionStatus(v.id, 'active')}
|
|
293
|
+
>
|
|
294
|
+
Publish
|
|
295
|
+
</Button>
|
|
296
|
+
)}
|
|
297
|
+
{status === 'active' && (
|
|
298
|
+
<Button
|
|
299
|
+
size="sm"
|
|
300
|
+
variant="outline"
|
|
301
|
+
disabled={acting === v.id}
|
|
302
|
+
onClick={() => updateVersionStatus(v.id, 'inactive')}
|
|
303
|
+
>
|
|
304
|
+
Deactivate
|
|
305
|
+
</Button>
|
|
306
|
+
)}
|
|
307
|
+
<Button
|
|
308
|
+
size="sm"
|
|
309
|
+
variant="ghost"
|
|
310
|
+
disabled={acting === v.id}
|
|
311
|
+
onClick={() => updateVersionStatus(v.id, 'archived')}
|
|
312
|
+
>
|
|
313
|
+
Archive
|
|
314
|
+
</Button>
|
|
315
|
+
</div>
|
|
316
|
+
</TableCell>
|
|
317
|
+
</TableRow>
|
|
318
|
+
)
|
|
319
|
+
})}
|
|
320
|
+
</TableBody>
|
|
321
|
+
</Table>
|
|
322
|
+
</CardContent>
|
|
323
|
+
</Card>
|
|
324
|
+
)}
|
|
325
|
+
</div>
|
|
326
|
+
)
|
|
327
|
+
}
|
|
328
|
+
// CIL[DOC-VECTOR type="context" content="purpose='Renders and manages CIL project versions: list, create, publish, deactivate, and archive.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
|
|
329
|
+
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
330
|
+
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
331
|
+
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
332
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
333
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
334
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/cil/CILVersionsPage.tsx:CILVersionsPage:component"]
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
|