spine-framework 0.3.145 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +76 -0
- package/.framework/.spine-manifest.json +19 -0
- package/.framework/cli/commands/agents.ts +61 -33
- package/.framework/cli/commands/auth.ts +60 -28
- package/.framework/cli/commands/create-app.ts +212 -80
- package/.framework/cli/commands/dev.ts +184 -68
- package/.framework/cli/commands/doctor.ts +324 -152
- package/.framework/cli/commands/generate.ts +119 -68
- package/.framework/cli/commands/init.ts +141 -242
- package/.framework/cli/commands/install-app.ts +1336 -314
- package/.framework/cli/commands/items.ts +31 -29
- package/.framework/cli/commands/migrate.ts +299 -156
- package/.framework/cli/commands/migrations.ts +62 -30
- package/.framework/cli/commands/pipelines.ts +31 -29
- package/.framework/cli/commands/status.ts +105 -45
- package/.framework/cli/commands/system.ts +47 -42
- package/.framework/cli/commands/test.ts +161 -102
- package/.framework/cli/commands/upgrade.ts +260 -0
- package/.framework/cli/commands/validate-app.ts +517 -161
- package/.framework/cli/context.ts +117 -85
- package/.framework/cli/env-loader.ts +74 -43
- package/.framework/cli/index.ts +70 -46
- package/.framework/cli/lib/project-files.ts +404 -0
- package/.framework/docs/guides/testing-guide.md +1 -1
- package/.framework/docs/runtime-types.md +72 -72
- package/.framework/functions/_shared/access.ts +84 -0
- package/.framework/functions/_shared/agent-runner.ts +5067 -1026
- package/.framework/functions/_shared/app-manifest.ts +214 -94
- package/.framework/functions/_shared/ast.ts +214 -0
- package/.framework/functions/_shared/audit.ts +91 -55
- package/.framework/functions/_shared/cil.ts +368 -127
- package/.framework/functions/_shared/db.ts +337 -68
- package/.framework/functions/_shared/funnel.ts +228 -0
- package/.framework/functions/_shared/geo.ts +105 -0
- package/.framework/functions/_shared/hash-api-key.ts +94 -17
- package/.framework/functions/_shared/index.ts +22 -224
- package/.framework/functions/_shared/kb.ts +832 -58
- package/.framework/functions/_shared/llm.ts +118 -18
- package/.framework/functions/_shared/logging.ts +317 -19
- package/.framework/functions/_shared/middleware.ts +701 -131
- package/.framework/functions/_shared/notify.ts +70 -0
- package/.framework/functions/_shared/outcomes.ts +34 -19
- package/.framework/functions/_shared/permissions.ts +501 -315
- package/.framework/functions/_shared/pipeline-runner.ts +704 -155
- package/.framework/functions/_shared/principal.ts +436 -263
- package/.framework/functions/_shared/rate-limit.ts +233 -0
- package/.framework/functions/_shared/resolve-credentials.ts +86 -19
- package/.framework/functions/_shared/resolve-ids.ts +203 -139
- package/.framework/functions/_shared/retry-deliveries.ts +51 -16
- package/.framework/functions/_shared/schema-utils.ts +602 -521
- package/.framework/functions/_shared/security.ts +345 -0
- package/.framework/functions/_shared/testing.ts +197 -172
- package/.framework/functions/_shared/tracing.ts +351 -21
- package/.framework/functions/_shared/trigger-engine.ts +425 -136
- package/.framework/functions/_shared/webhook-registration.ts +71 -70
- package/.framework/functions/_shared/webhook-registry.ts +126 -83
- package/.framework/functions/account-nodes.ts +30 -30
- package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
- package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
- package/.framework/functions/adapters/openai-outbound.ts +15 -16
- package/.framework/functions/admin-data.ts +596 -173
- package/.framework/functions/admin-funnel.ts +64 -60
- package/.framework/functions/admin-install-funnel.ts +84 -66
- package/.framework/functions/admin-signals.ts +69 -51
- package/.framework/functions/ai-agents.ts +431 -106
- package/.framework/functions/ai-interactions.ts +186 -112
- package/.framework/functions/api-keys.ts +107 -107
- package/.framework/functions/apps.ts +154 -136
- package/.framework/functions/auth.ts +83 -65
- package/.framework/functions/cil-agent-ingest.ts +189 -232
- package/.framework/functions/cil-agent.ts +433 -177
- package/.framework/functions/cil-callmap.ts +642 -430
- package/.framework/functions/cil-config.ts +139 -135
- package/.framework/functions/cil-context.ts +214 -127
- package/.framework/functions/cil-doc.ts +587 -458
- package/.framework/functions/cil-embeddings.ts +453 -364
- package/.framework/functions/cil-graph.ts +427 -142
- package/.framework/functions/cil-ingest.ts +1418 -1154
- package/.framework/functions/cil-pipeline.ts +276 -21
- package/.framework/functions/cil-project.ts +659 -132
- package/.framework/functions/cil-validate.ts +198 -164
- package/.framework/functions/debug-auth.ts +57 -55
- package/.framework/functions/deliveries.ts +80 -21
- package/.framework/functions/embeddings.ts +1023 -318
- package/.framework/functions/eval-harness.ts +146 -108
- package/.framework/functions/integration-outbound.ts +205 -75
- package/.framework/functions/integration-routes.ts +128 -23
- package/.framework/functions/integrations.ts +125 -100
- package/.framework/functions/invites.ts +1095 -460
- package/.framework/functions/item-progress.ts +158 -102
- package/.framework/functions/kb.ts +34 -10
- package/.framework/functions/logs.ts +133 -133
- package/.framework/functions/observability.ts +152 -122
- package/.framework/functions/pipeline-executions.ts +147 -132
- package/.framework/functions/pipelines.ts +134 -119
- package/.framework/functions/prompt-configs.ts +96 -80
- package/.framework/functions/roles.ts +112 -82
- package/.framework/functions/security.ts +450 -0
- package/.framework/functions/system-cron.ts +117 -80
- package/.framework/functions/system.ts +158 -98
- package/.framework/functions/tests.ts +29 -29
- package/.framework/functions/timers.ts +94 -95
- package/.framework/functions/trigger-scheduler.ts +10 -0
- package/.framework/functions/triggers.ts +179 -149
- package/.framework/functions/types.ts +137 -125
- package/.framework/mcp/index.ts +133 -0
- package/.framework/mcp/load-env.ts +60 -0
- package/.framework/mcp/shared/app-manifest.ts +275 -0
- package/.framework/mcp/shared/db.ts +477 -0
- package/.framework/mcp/shared/kb.ts +118 -0
- package/.framework/mcp/tools/architect.ts +431 -0
- package/.framework/mcp/tools/cil/context.ts +345 -0
- package/.framework/mcp/tools/cil/graph.ts +242 -0
- package/.framework/mcp/tools/cil/ingest.ts +1217 -0
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
- package/.framework/mcp/tools/cil/pipeline.ts +767 -0
- package/.framework/mcp/tools/cil/project.ts +791 -0
- package/.framework/mcp/tools/cil/retrieval.ts +336 -0
- package/.framework/mcp/tools/cil/search-core.ts +454 -0
- package/.framework/mcp/tools/cil/search.ts +97 -0
- package/.framework/mcp/tools/cil/suggest.ts +186 -0
- package/.framework/mcp/tools/cil/validate.ts +1369 -0
- package/.framework/mcp/tools/kb/delete.ts +139 -0
- package/.framework/mcp/tools/kb/index.ts +52 -0
- package/.framework/mcp/tools/kb/ingest.ts +84 -0
- package/.framework/mcp/tools/kb/list-types.ts +102 -0
- package/.framework/mcp/tools/kb/publish.ts +100 -0
- package/.framework/mcp/tools/kb/reindex.ts +86 -0
- package/.framework/mcp/tools/kb/revoke.ts +85 -0
- package/.framework/mcp/tools/kb/search.ts +101 -0
- package/.framework/mcp/tools/kb/upsert.ts +125 -0
- package/.framework/mcp/tools/observability.ts +510 -0
- package/.framework/migrations/001_core_schema.sql +15 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
- package/.framework/migrations/003_core_system_data.sql +16 -1
- package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
- package/.framework/migrations/005_core_observability.sql +17 -1
- package/.framework/migrations/006_security_hardening_rls.sql +15 -0
- package/.framework/migrations/007_kb_article_list.sql +17 -1
- package/.framework/migrations/008_items_target.sql +15 -0
- package/.framework/migrations/009_roles_slug_unique.sql +15 -0
- package/.framework/migrations/010_auth_user_trigger.sql +15 -0
- package/.framework/migrations/011_spine_system_account.sql +16 -0
- package/.framework/migrations/012_service_role_grants.sql +16 -0
- package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
- package/.framework/migrations/014_apps_required_roles.sql +16 -0
- package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
- package/.framework/migrations/016_cil_types.sql +281 -0
- package/.framework/migrations/017_cil_stable_ids.sql +37 -0
- package/.framework/migrations/018_runtime_tables.sql +129 -0
- package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
- package/.framework/migrations/020_schema_reconciliation.sql +67 -0
- package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
- package/.framework/migrations/032_cil_status_migration.sql +73 -0
- package/.framework/migrations/033_cil_versioning.sql +73 -0
- package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
- package/.framework/migrations/035_rate_limits.sql +55 -0
- package/.framework/migrations/036_demo_record_flags.sql +72 -0
- package/.framework/migrations/037_kb_types_canonical.sql +244 -0
- package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
- package/.framework/migrations/042_registration_hierarchy.sql +309 -0
- package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
- package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
- package/.framework/migrations/045_security_critical_rls.sql +139 -0
- package/.framework/migrations/046_security_missing_rls.sql +79 -0
- package/.framework/migrations/047_people_updated_by.sql +27 -0
- package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
- package/.framework/migrations/049_security_blocklist.sql +148 -0
- package/.framework/migrations/050_notifications.sql +49 -0
- package/.framework/migrations/051_message_agent_fields.sql +74 -0
- package/.framework/migrations/052_registration_security.sql +421 -0
- package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
- package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
- package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
- package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
- package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
- package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
- package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
- package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
- package/.framework/migrations/061_fk_dedup.sql +32 -0
- package/.framework/public/spine-logo.svg +10 -3
- package/.framework/scripts/app-install-cli.ts +190 -93
- package/.framework/scripts/assemble-frontend.sh +127 -44
- package/.framework/scripts/assemble-functions.sh +128 -30
- package/.framework/scripts/boundary-check.sh +6 -2
- package/.framework/scripts/build-manifest.sh +24 -68
- package/.framework/scripts/check-core-integrity.sh +15 -76
- package/.framework/scripts/checksum-manifest.mts +343 -0
- package/.framework/scripts/cil-migrate-markers.ts +403 -0
- package/.framework/scripts/fix-cil-markers.mjs +176 -0
- package/.framework/scripts/verify-integrity.sh +21 -57
- package/.framework/scripts/verify-manifest.mts +305 -0
- package/.framework/seeds/types/funnel_signal_use.json +74 -21
- package/.framework/seeds/types/spine_instance.json +73 -21
- package/.framework/src/App.tsx +118 -72
- package/.framework/src/apps/admin/index.tsx +855 -58
- package/.framework/src/components/AppWrapper.tsx +43 -45
- package/.framework/src/components/CustomAppLoader.tsx +160 -116
- package/.framework/src/components/admin/AdminListPage.tsx +46 -44
- package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
- package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
- package/.framework/src/components/admin/PageInstructions.tsx +98 -2
- package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
- package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
- package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
- package/.framework/src/components/app-sidebar.tsx +42 -45
- package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
- package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
- package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
- package/.framework/src/components/kb/KBArticleList.tsx +251 -10
- package/.framework/src/components/layout/AppShell.tsx +51 -45
- package/.framework/src/components/layout/Header.tsx +42 -43
- package/.framework/src/components/layout/Layout.tsx +46 -46
- package/.framework/src/components/layout/Sidebar.tsx +196 -96
- package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
- package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
- package/.framework/src/components/runtime/DataFilters.tsx +49 -74
- package/.framework/src/components/runtime/DataHeader.tsx +53 -32
- package/.framework/src/components/runtime/DataListPage.tsx +51 -155
- package/.framework/src/components/runtime/DataStats.tsx +66 -44
- package/.framework/src/components/runtime/DataTable.tsx +49 -149
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
- package/.framework/src/components/runtime/index.ts +119 -16
- package/.framework/src/components/search-form.tsx +46 -29
- package/.framework/src/components/shared/AgentView.tsx +65 -48
- package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
- package/.framework/src/components/shared/InviteManager.tsx +207 -97
- package/.framework/src/components/shared/MemberList.tsx +97 -0
- package/.framework/src/components/shared/SchemaFields.tsx +107 -86
- package/.framework/src/components/ui/DataTable.tsx +80 -68
- package/.framework/src/components/ui/Form.tsx +157 -146
- package/.framework/src/components/ui/ItemCard.tsx +74 -67
- package/.framework/src/components/ui/ItemListView.tsx +73 -68
- package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
- package/.framework/src/components/ui/Modal.tsx +78 -68
- package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
- package/.framework/src/components/ui/accordion.tsx +85 -86
- package/.framework/src/components/ui/alert-dialog.tsx +197 -184
- package/.framework/src/components/ui/alert.tsx +105 -94
- package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
- package/.framework/src/components/ui/avatar.tsx +122 -107
- package/.framework/src/components/ui/badge.tsx +60 -55
- package/.framework/src/components/ui/breadcrumb.tsx +127 -128
- package/.framework/src/components/ui/button-group.tsx +86 -72
- package/.framework/src/components/ui/button.tsx +71 -50
- package/.framework/src/components/ui/calendar.tsx +72 -57
- package/.framework/src/components/ui/card.tsx +136 -129
- package/.framework/src/components/ui/carousel.tsx +226 -107
- package/.framework/src/components/ui/chart.tsx +252 -147
- package/.framework/src/components/ui/checkbox.tsx +43 -44
- package/.framework/src/components/ui/collapsible.tsx +86 -71
- package/.framework/src/components/ui/combobox.tsx +282 -249
- package/.framework/src/components/ui/command.tsx +158 -146
- package/.framework/src/components/ui/context-menu.tsx +239 -240
- package/.framework/src/components/ui/dialog.tsx +174 -157
- package/.framework/src/components/ui/direction.tsx +72 -56
- package/.framework/src/components/ui/drawer.tsx +168 -169
- package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
- package/.framework/src/components/ui/empty.tsx +131 -120
- package/.framework/src/components/ui/field.tsx +205 -173
- package/.framework/src/components/ui/hover-card.tsx +71 -72
- package/.framework/src/components/ui/input-group.tsx +148 -133
- package/.framework/src/components/ui/input-otp.tsx +99 -86
- package/.framework/src/components/ui/input.tsx +43 -41
- package/.framework/src/components/ui/item.tsx +207 -185
- package/.framework/src/components/ui/kbd.tsx +57 -56
- package/.framework/src/components/ui/label.tsx +45 -41
- package/.framework/src/components/ui/menubar.tsx +268 -236
- package/.framework/src/components/ui/native-select.tsx +85 -86
- package/.framework/src/components/ui/navigation-menu.tsx +166 -156
- package/.framework/src/components/ui/pagination.tsx +131 -141
- package/.framework/src/components/ui/popover.tsx +125 -128
- package/.framework/src/components/ui/progress.tsx +47 -44
- package/.framework/src/components/ui/radio-group.tsx +60 -55
- package/.framework/src/components/ui/resizable.tsx +85 -72
- package/.framework/src/components/ui/scroll-area.tsx +57 -58
- package/.framework/src/components/ui/select.tsx +182 -169
- package/.framework/src/components/ui/separator.tsx +42 -43
- package/.framework/src/components/ui/sheet.tsx +170 -159
- package/.framework/src/components/ui/sidebar.tsx +395 -398
- package/.framework/src/components/ui/skeleton.tsx +42 -43
- package/.framework/src/components/ui/slider.tsx +61 -44
- package/.framework/src/components/ui/sonner.tsx +44 -44
- package/.framework/src/components/ui/spinner.tsx +47 -42
- package/.framework/src/components/ui/switch.tsx +56 -42
- package/.framework/src/components/ui/table-primitives.tsx +272 -132
- package/.framework/src/components/ui/table.tsx +140 -142
- package/.framework/src/components/ui/tabs.tsx +110 -93
- package/.framework/src/components/ui/textarea.tsx +43 -44
- package/.framework/src/components/ui/toggle-group.tsx +87 -71
- package/.framework/src/components/ui/toggle.tsx +56 -56
- package/.framework/src/components/ui/tooltip.tsx +99 -85
- package/.framework/src/contexts/AppContext.tsx +166 -114
- package/.framework/src/contexts/AuthContext.tsx +232 -137
- package/.framework/src/hooks/use-mobile.ts +43 -44
- package/.framework/src/hooks/useApi.ts +185 -172
- package/.framework/src/hooks/useAppPath.ts +31 -29
- package/.framework/src/hooks/useApps.ts +77 -42
- package/.framework/src/hooks/useEntityList.ts +66 -29
- package/.framework/src/hooks/useEntityRecord.ts +76 -32
- package/.framework/src/hooks/useForm.ts +62 -30
- package/.framework/src/hooks/useListSchema.ts +60 -43
- package/.framework/src/hooks/useSchemaRecord.ts +115 -95
- package/.framework/src/lib/api.ts +258 -134
- package/.framework/src/lib/registration.ts +181 -0
- package/.framework/src/lib/supabase.ts +118 -81
- package/.framework/src/lib/utils.ts +266 -266
- package/.framework/src/main.tsx +43 -44
- package/.framework/src/pages/DashboardPage.tsx +44 -43
- package/.framework/src/pages/NoAppPage.tsx +50 -0
- package/.framework/src/pages/NotFoundPage.tsx +32 -29
- package/.framework/src/pages/SetupPage.tsx +34 -33
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
- package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
- package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
- package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
- package/.framework/src/pages/admin/AppsPage.tsx +45 -42
- package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
- package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
- package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
- package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
- package/.framework/src/pages/admin/LogsPage.tsx +87 -137
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
- package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
- package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
- package/.framework/src/pages/admin/RolesPage.tsx +47 -164
- package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
- package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
- package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
- package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
- package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
- package/.framework/src/pages/admin/TimersPage.tsx +44 -42
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
- package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
- package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
- package/.framework/src/pages/admin/TypesPage.tsx +45 -42
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
- package/.framework/src/pages/auth/LoginPage.tsx +38 -32
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
- package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
- package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
- package/.framework/src/types/auth.ts +101 -93
- package/.framework/src/types/types.ts +283 -262
- package/.framework/templates/project.json +87 -0
- package/.framework/templates/spine.config.neutral.json +7 -0
- package/.framework/tests/api/api-surface.test.ts +381 -0
- package/.framework/tests/fixtures/seed.ts +427 -0
- package/.framework/tests/fixtures/teardown.ts +228 -0
- package/.framework/tests/reporter.ts +351 -0
- package/.framework/tests/setup.ts +135 -0
- package/.framework/tests/ui/ui-sweep.ts +278 -0
- package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
- package/.framework/tests/unit/agent-runner.test.ts +2389 -0
- package/.framework/tests/unit/ai-interactions.test.ts +81 -0
- package/.framework/tests/unit/app-manifest.test.ts +359 -0
- package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
- package/.framework/tests/unit/cil-determinism.test.ts +85 -0
- package/.framework/tests/unit/core-isolation.test.ts +153 -0
- package/.framework/tests/unit/funnel-signals.test.ts +135 -0
- package/.framework/tests/unit/install-app.test.ts +1759 -0
- package/.framework/tests/unit/invites-security.test.ts +572 -0
- package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
- package/.framework/tests/unit/kb-search.test.ts +119 -0
- package/.framework/tests/unit/migrate.test.ts +509 -0
- package/.framework/tests/unit/notify.test.ts +136 -0
- package/.framework/tests/unit/permissions.test.ts +269 -0
- package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
- package/.framework/tests/unit/principal-cache.test.ts +138 -0
- package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
- package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
- package/.framework/tests/unit/schema-utils.test.ts +225 -0
- package/.framework/tests/unit/trigger-engine.test.ts +513 -0
- package/.framework/tests/unit/validate-app.test.ts +527 -0
- package/README.md +34 -3
- package/bin/spine-framework.cjs +1 -0
- package/config/tailwind.config.cjs +7 -0
- package/config/tsconfig.functions.json +42 -0
- package/config/tsconfig.json +37 -9
- package/config/vite.config.ts +31 -2
- package/netlify.toml +31 -3
- package/package.json +46 -29
- package/scripts/assemble-frontend.sh +127 -44
- package/scripts/assemble-functions.sh +127 -29
- package/scripts/boundary-check.sh +6 -2
- package/scripts/build-manifest.sh +24 -68
- package/scripts/checksum-manifest.mts +345 -0
- package/scripts/dev-clean.sh +86 -0
- package/scripts/dev-netlify.sh +49 -0
- package/scripts/netlify-dev-wrapper.sh +2 -0
- package/scripts/verify-install.ts +358 -0
- package/scripts/verify-integrity.sh +21 -57
- package/scripts/verify-manifest.mts +305 -0
- package/templates/project/gitignore +45 -0
- package/{config → templates/project}/package-lock.json +22335 -9366
- package/vitest.config.ts +46 -0
- package/.framework/public/spine.config.json +0 -91
- package/config/deno.lock +0 -108
- package/config/tsconfig.node.tsbuildinfo +0 -1
- package/config/tsconfig.tsbuildinfo +0 -1
- package/config/vite.config.d.ts +0 -2
- package/custom/.devin/AGENT.md +0 -357
- package/custom/.devin/skills/install-app/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
- package/custom/.devin/workflows/app-install.yaml +0 -83
- package/custom/README.md +0 -79
- package/docs/README.md +0 -15
- package/scripts/app-install-cli.ts +0 -286
- package/scripts/check-core-integrity.sh +0 -82
- package/scripts/ingest-chunks.cjs +0 -202
- package/scripts/kb-chunk-parser.cjs +0 -312
- package/scripts/kb-chunk-parser.ts +0 -330
- package/scripts/kb-ingest-docs.ts +0 -203
- package/scripts/load-test-app-install.ts +0 -484
- package/scripts/test-login.js +0 -33
- package/spine.config.json +0 -91
package/custom/.devin/AGENT.md
DELETED
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
# Spine Framework — Custom Apps Agent Guide
|
|
2
|
-
|
|
3
|
-
This document explains the structure, contract, and tooling for apps under `custom/apps/`. Read this before touching any app code.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Directory Layout
|
|
8
|
-
|
|
9
|
-
Every app lives at `custom/apps/{slug}/` and must follow this structure:
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
custom/apps/{slug}/
|
|
13
|
-
├── package.json # npm identity + spine metadata block
|
|
14
|
-
├── manifest.json # runtime contract — the source of truth
|
|
15
|
-
├── index.tsx # default export: root React component
|
|
16
|
-
├── components/ # app-level shared components (sidebar, cards, etc.)
|
|
17
|
-
├── pages/ # route-mapped page components
|
|
18
|
-
│ └── {section}/
|
|
19
|
-
│ └── SomePage.tsx
|
|
20
|
-
├── functions/ # Netlify function handlers scoped to this app
|
|
21
|
-
├── hooks/ # React hooks
|
|
22
|
-
├── utils/ # Pure utility functions
|
|
23
|
-
├── public/ # Static assets copied to PROJECT_ROOT/public/ at assemble time
|
|
24
|
-
└── seed/ # Data seeded into the DB on install
|
|
25
|
-
├── roles.json
|
|
26
|
-
├── types.json
|
|
27
|
-
├── link-types.json
|
|
28
|
-
└── (any other declared seed files)
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
No other top-level directories are allowed. `validate-app` will fail on unknown directories.
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## package.json — Required Shape
|
|
36
|
-
|
|
37
|
-
```json
|
|
38
|
-
{
|
|
39
|
-
"name": "spine-framework-{slug}",
|
|
40
|
-
"version": "X.Y.Z",
|
|
41
|
-
"private": false,
|
|
42
|
-
"description": "...",
|
|
43
|
-
"peerDependencies": {
|
|
44
|
-
"spine-framework": ">=0.1.0"
|
|
45
|
-
},
|
|
46
|
-
"files": [
|
|
47
|
-
"index.tsx",
|
|
48
|
-
"manifest.json",
|
|
49
|
-
"seed/",
|
|
50
|
-
"pages/",
|
|
51
|
-
"components/",
|
|
52
|
-
"hooks/",
|
|
53
|
-
"utils/",
|
|
54
|
-
"functions/",
|
|
55
|
-
"public/",
|
|
56
|
-
"README.md"
|
|
57
|
-
],
|
|
58
|
-
"scripts": {
|
|
59
|
-
"validate": "npx spine-framework validate-app ."
|
|
60
|
-
},
|
|
61
|
-
"spine": {
|
|
62
|
-
"type": "app",
|
|
63
|
-
"slug": "{slug}",
|
|
64
|
-
"manifestPath": "manifest.json"
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
**Rules:**
|
|
70
|
-
- `"private": false` is required — apps must be publishable to npm
|
|
71
|
-
- `files` must include every directory that exists in the app
|
|
72
|
-
- `version` must match `manifest.json` version exactly
|
|
73
|
-
- `spine.slug` must match `manifest.json` slug exactly
|
|
74
|
-
- Package name convention: `spine-framework-{slug}`
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
## manifest.json — Full Contract
|
|
79
|
-
|
|
80
|
-
```json
|
|
81
|
-
{
|
|
82
|
-
"name": "My App",
|
|
83
|
-
"slug": "my-app",
|
|
84
|
-
"description": "...",
|
|
85
|
-
"version": "X.Y.Z",
|
|
86
|
-
"app_type": "full",
|
|
87
|
-
"route_prefix": "/my-app",
|
|
88
|
-
"required_roles": ["role-slug"],
|
|
89
|
-
"routes": ["/", "/page"],
|
|
90
|
-
"nav_items": [
|
|
91
|
-
{ "title": "Home", "path": "/", "icon": "Home", "order": 1 }
|
|
92
|
-
],
|
|
93
|
-
"features": ["feature-a", "feature-b"],
|
|
94
|
-
"dependencies": ["items", "accounts"],
|
|
95
|
-
"entry_point": "./index.tsx",
|
|
96
|
-
"sidebar_component": "./components/MyAppSidebar.tsx",
|
|
97
|
-
"seed": [
|
|
98
|
-
{ "file": "seed/roles.json", "table": "roles", "conflict": "app_id,slug" },
|
|
99
|
-
{ "file": "seed/types.json", "table": "types", "conflict": "app_id,kind,slug" },
|
|
100
|
-
{ "file": "seed/link-types.json", "table": "link_types", "conflict": "app_id,slug" }
|
|
101
|
-
],
|
|
102
|
-
"registration": {
|
|
103
|
-
"enabled": true,
|
|
104
|
-
"default_role": "role-slug",
|
|
105
|
-
"redirect_path": "/my-app",
|
|
106
|
-
"account_strategy": "new"
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Field Reference
|
|
112
|
-
|
|
113
|
-
| Field | Required | Notes |
|
|
114
|
-
|-------|----------|-------|
|
|
115
|
-
| `name` | yes | Display name — written to `apps.name` in DB |
|
|
116
|
-
| `slug` | yes | Unique identifier — written to `apps.slug` |
|
|
117
|
-
| `version` | yes | Must match `package.json` version |
|
|
118
|
-
| `app_type` | yes | One of: `full`, `ui`, `backend`, `data` |
|
|
119
|
-
| `route_prefix` | yes | Where the app is mounted (e.g. `/cortex`, `/`, `/workspace`). Single source of truth for routing. |
|
|
120
|
-
| `required_roles` | yes | Array of role slugs required to access the app |
|
|
121
|
-
| `routes` | recommended | Root-relative paths the app handles — **must NOT include route_prefix** |
|
|
122
|
-
| `nav_items` | recommended | Root-relative sidebar nav paths — **must NOT include route_prefix** |
|
|
123
|
-
| `entry_point` | yes (full/ui) | Path to root React component (relative to app root) |
|
|
124
|
-
| `sidebar_component` | yes (full/ui) | Path to sidebar component — used by AppWrapper |
|
|
125
|
-
| `seed` | yes | Declares all seed files (see below) |
|
|
126
|
-
| `registration` | if app supports self-registration | Controls `spine.config.json` registration entry |
|
|
127
|
-
|
|
128
|
-
### `app_type` values
|
|
129
|
-
|
|
130
|
-
- `full` — has UI (pages, components) and backend (functions). Requires `index.tsx`, `pages/`, `functions/`
|
|
131
|
-
- `ui` — frontend only. Requires `index.tsx`, `pages/`
|
|
132
|
-
- `backend` — functions only. Requires `functions/`
|
|
133
|
-
- `data` — schema/seed only. No UI or functions required
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## Dynamic route_prefix
|
|
138
|
-
|
|
139
|
-
`route_prefix` in `manifest.json` is the **single source of truth** for where an app is served. Changing it and running `update-db-app` is the only step needed to move an app to a different URL.
|
|
140
|
-
|
|
141
|
-
### How it flows
|
|
142
|
-
|
|
143
|
-
1. `manifest.json` declares `"route_prefix": "/cortex"` (or `/`, or anything)
|
|
144
|
-
2. `install-app` / `update-db-app` writes it to `apps.route_prefix` in the DB
|
|
145
|
-
3. `App.tsx` reads all app records and mounts each at `{route_prefix}/*`
|
|
146
|
-
4. Inside the app, `useAppPath()` prepends the prefix to all links — no hardcoded paths
|
|
147
|
-
|
|
148
|
-
### Rules for routes and nav_items
|
|
149
|
-
|
|
150
|
-
Routes and nav_items must be **root-relative** — declared from the app's own root, not the full URL:
|
|
151
|
-
|
|
152
|
-
```json
|
|
153
|
-
// CORRECT
|
|
154
|
-
"route_prefix": "/cortex",
|
|
155
|
-
"routes": ["/", "/dashboard", "/crm/accounts"],
|
|
156
|
-
"nav_items": [{ "title": "Dashboard", "path": "/dashboard" }]
|
|
157
|
-
|
|
158
|
-
// WRONG — validate-app will reject these
|
|
159
|
-
"routes": ["/cortex", "/cortex/dashboard", "/cortex/crm/accounts"],
|
|
160
|
-
"nav_items": [{ "title": "Dashboard", "path": "/cortex/dashboard" }]
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### useAppPath() hook
|
|
164
|
-
|
|
165
|
-
All absolute links inside an app must use `useAppPath()` instead of hardcoded strings:
|
|
166
|
-
|
|
167
|
-
```tsx
|
|
168
|
-
import { useAppPath } from '@core/hooks/useAppPath'
|
|
169
|
-
|
|
170
|
-
function MyComponent() {
|
|
171
|
-
const appPath = useAppPath()
|
|
172
|
-
|
|
173
|
-
return <a href={appPath('/dashboard')}>Dashboard</a>
|
|
174
|
-
// → '/cortex/dashboard' if route_prefix is /cortex
|
|
175
|
-
// → '/dashboard' if route_prefix is /
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
Use `useAppPath()` in: sidebar nav arrays, breadcrumbs, `navigate()` calls, any `<Link>` with an absolute path.
|
|
180
|
-
|
|
181
|
-
### Changing an app's location
|
|
182
|
-
|
|
183
|
-
```bash
|
|
184
|
-
# 1. Edit manifest.json
|
|
185
|
-
"route_prefix": "/" # was "/cortex"
|
|
186
|
-
|
|
187
|
-
# 2. Sync to DB (no npm, no file changes)
|
|
188
|
-
npx spine-framework update-db-app cortex
|
|
189
|
-
|
|
190
|
-
# 3. Rebuild and serve
|
|
191
|
-
npm run assemble && netlify dev
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
That's the entire workflow. No code changes needed.
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## Seed Block
|
|
199
|
-
|
|
200
|
-
The `seed` array in `manifest.json` declares every file to be seeded into the DB at install time. `install-app` reads this array and runs a generic upsert loop — no hardcoded file names.
|
|
201
|
-
|
|
202
|
-
### Seed entry format
|
|
203
|
-
|
|
204
|
-
```json
|
|
205
|
-
{ "file": "seed/roles.json", "table": "roles", "conflict": "app_id,slug" }
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
| Field | Required | Notes |
|
|
209
|
-
|-------|----------|-------|
|
|
210
|
-
| `file` | yes | Path relative to app root |
|
|
211
|
-
| `table` | yes | Supabase table name |
|
|
212
|
-
| `conflict` | yes | Column(s) for `onConflict` upsert (comma-separated) |
|
|
213
|
-
| `inject_app_id` | no | Default `true` — set `false` for tables without `app_id` |
|
|
214
|
-
|
|
215
|
-
### Common conflict keys
|
|
216
|
-
|
|
217
|
-
| Table | conflict |
|
|
218
|
-
|-------|----------|
|
|
219
|
-
| `roles` | `app_id,slug` |
|
|
220
|
-
| `types` | `app_id,kind,slug` |
|
|
221
|
-
| `link_types` | `app_id,slug` |
|
|
222
|
-
| `triggers` | `app_id,name` |
|
|
223
|
-
|
|
224
|
-
### Seed file format
|
|
225
|
-
|
|
226
|
-
Every seed file must be a JSON array. Each object maps to one DB row. Do NOT include `id` or `app_id` — these are set by the framework at install time.
|
|
227
|
-
|
|
228
|
-
```json
|
|
229
|
-
[
|
|
230
|
-
{
|
|
231
|
-
"slug": "my-role",
|
|
232
|
-
"name": "My Role",
|
|
233
|
-
"description": "...",
|
|
234
|
-
"permissions": ["*"],
|
|
235
|
-
"is_system": true,
|
|
236
|
-
"is_active": true,
|
|
237
|
-
"is_protected": false
|
|
238
|
-
}
|
|
239
|
-
]
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
All seed files must be idempotent — safe to run against an existing DB without creating duplicates.
|
|
243
|
-
|
|
244
|
-
---
|
|
245
|
-
|
|
246
|
-
## registration block
|
|
247
|
-
|
|
248
|
-
Controls how users self-register for this app. Written to `spine.config.json` by `install-app`.
|
|
249
|
-
|
|
250
|
-
```json
|
|
251
|
-
"registration": {
|
|
252
|
-
"enabled": true,
|
|
253
|
-
"default_role": "member",
|
|
254
|
-
"redirect_path": "/portal",
|
|
255
|
-
"account_strategy": "new"
|
|
256
|
-
}
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
| `account_strategy` | Behavior |
|
|
260
|
-
|--------------------|----------|
|
|
261
|
-
| `new` | Creates a new account per registering user (customer-facing apps) |
|
|
262
|
-
| `existing` | Assigns user to an existing account — requires `target_account` |
|
|
263
|
-
| `choice` | User chooses at registration |
|
|
264
|
-
|
|
265
|
-
If `account_strategy` is `existing`, `target_account` (account slug) is required.
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
## CLI Commands
|
|
270
|
-
|
|
271
|
-
```bash
|
|
272
|
-
# Install an app from npm (first time)
|
|
273
|
-
npx spine-framework install-app spine-framework-{slug}
|
|
274
|
-
npx spine-framework install-app spine-framework-{slug}@next # pre-release
|
|
275
|
-
|
|
276
|
-
# Sync local manifest.json changes to the DB (no npm, no file changes)
|
|
277
|
-
# Use this after changing route_prefix, nav_items, registration, etc.
|
|
278
|
-
npx spine-framework update-db-app {slug}
|
|
279
|
-
|
|
280
|
-
# Validate an app before publishing
|
|
281
|
-
npx spine-framework validate-app custom/apps/{slug}
|
|
282
|
-
# or from inside the app directory:
|
|
283
|
-
npm run validate
|
|
284
|
-
|
|
285
|
-
# Uninstall an app
|
|
286
|
-
npx spine-framework uninstall-app spine-framework-{slug}
|
|
287
|
-
|
|
288
|
-
# Update app code from npm (preserves local manifest.json)
|
|
289
|
-
npx spine-framework update-app spine-framework-{slug}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
**Key distinction:**
|
|
293
|
-
- `install-app` = get/update code from npm. After first install, `manifest.json` is preserved — the developer owns it.
|
|
294
|
-
- `update-db-app` = push local manifest changes to DB. No npm involved.
|
|
295
|
-
|
|
296
|
-
`validate-app` checks:
|
|
297
|
-
- `manifest.json` present, valid JSON, all required fields
|
|
298
|
-
- `package.json` present, versions match, `"private": false`
|
|
299
|
-
- Required files exist for `app_type`
|
|
300
|
-
- `entry_point` and `sidebar_component` files exist (if declared)
|
|
301
|
-
- `seed` block entries are valid and all declared files exist
|
|
302
|
-
- `registration.account_strategy: "existing"` has `target_account`
|
|
303
|
-
- No unknown directories
|
|
304
|
-
- `.devin/` present → must contain `AGENTS.md` or `AGENT.md`
|
|
305
|
-
- All directories in `files` array are present
|
|
306
|
-
|
|
307
|
-
---
|
|
308
|
-
|
|
309
|
-
## Assemble
|
|
310
|
-
|
|
311
|
-
`assemble-frontend.sh` and `assemble-functions.sh` pick up app files at build time:
|
|
312
|
-
|
|
313
|
-
- `functions/` → assembled into the Netlify functions directory
|
|
314
|
-
- `public/` → copied to `PROJECT_ROOT/public/` (Vite's publicDir)
|
|
315
|
-
- `pages/`, `components/`, `hooks/`, `utils/` → assembled into `.assembled/src/{slug}/`
|
|
316
|
-
|
|
317
|
-
**Important:** `public/` assets must go to `PROJECT_ROOT/public/`, not `.assembled/src/public/`. This was a known bug fixed in `spine-framework@0.3.76`.
|
|
318
|
-
|
|
319
|
-
---
|
|
320
|
-
|
|
321
|
-
## Publishing
|
|
322
|
-
|
|
323
|
-
Apps are published independently to npm, separate from `spine-framework`.
|
|
324
|
-
|
|
325
|
-
```bash
|
|
326
|
-
# From inside custom/apps/{slug}/
|
|
327
|
-
npm version patch # bump version (must match manifest.json!)
|
|
328
|
-
# Also bump version in manifest.json to match
|
|
329
|
-
npm publish --tag next --access public # pre-release
|
|
330
|
-
npm publish --tag latest --access public # stable release
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
Always publish with `--tag next` for development/testing. Promote to `--tag latest` only when stable and tested E2E in a dogfood project.
|
|
334
|
-
|
|
335
|
-
Version must be kept in sync between `package.json` and `manifest.json` — `validate-app` will fail if they differ.
|
|
336
|
-
|
|
337
|
-
---
|
|
338
|
-
|
|
339
|
-
## Current Apps
|
|
340
|
-
|
|
341
|
-
| Slug | Package | Description |
|
|
342
|
-
|------|---------|-------------|
|
|
343
|
-
| `cortex` | `spine-framework-cortex` | Internal workspace: CRM, Support, Community, KB |
|
|
344
|
-
| `portal` | `spine-framework-portal` | Customer-facing: Tickets, KB, Courses, Community |
|
|
345
|
-
|
|
346
|
-
---
|
|
347
|
-
|
|
348
|
-
## Adding a New App
|
|
349
|
-
|
|
350
|
-
1. Create `custom/apps/{slug}/` with the directory structure above
|
|
351
|
-
2. Write `package.json` and `manifest.json` following the templates above
|
|
352
|
-
3. Write `index.tsx` exporting the root React component
|
|
353
|
-
4. Write `components/{Slug}Sidebar.tsx` and declare it as `sidebar_component`
|
|
354
|
-
5. Write seed files and declare them in the `seed` block
|
|
355
|
-
6. Run `npm run validate` — fix all errors before proceeding
|
|
356
|
-
7. Publish with `--tag next`
|
|
357
|
-
8. Test E2E: `npx spine-framework install-app spine-framework-{slug}@next`
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# Install App
|
|
2
|
-
|
|
3
|
-
Installs a Spine Framework app into the custom workspace.
|
|
4
|
-
|
|
5
|
-
## When to Use
|
|
6
|
-
|
|
7
|
-
Use this skill when you need to:
|
|
8
|
-
- Install an app package (portal, cortex, or third-party) into custom/apps/
|
|
9
|
-
- Configure seed data for the app
|
|
10
|
-
- Set up migrations required by the app
|
|
11
|
-
|
|
12
|
-
## Installation Process
|
|
13
|
-
|
|
14
|
-
1. **Copy app files** from the package to `custom/apps/<app-slug>/`
|
|
15
|
-
2. **Copy seed data** to `custom/apps/<app-slug>/seed/`
|
|
16
|
-
3. **Copy migrations** (if any) to `custom/migrations/`
|
|
17
|
-
4. **Update workspace configuration** to include the app
|
|
18
|
-
|
|
19
|
-
## Critical Safeguards
|
|
20
|
-
|
|
21
|
-
- **NEVER** delete existing `custom/apps/`, `custom/functions/`, or `custom/migrations/` content
|
|
22
|
-
- **ALWAYS** preserve existing custom apps during installation
|
|
23
|
-
- Seed data is additive - existing types/roles are not modified
|
|
24
|
-
|
|
25
|
-
## Usage
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
Install the cortex app from spine-framework-cortex package
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
The skill will:
|
|
32
|
-
1. Locate the package in node_modules or local path
|
|
33
|
-
2. Copy app files to custom/apps/cortex/
|
|
34
|
-
3. Copy seed files (types.json, roles.json, link-types.json)
|
|
35
|
-
4. Report what was installed
|
|
36
|
-
|
|
37
|
-
## Output
|
|
38
|
-
|
|
39
|
-
Reports installed files and any conflicts that need manual resolution.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: spine-workbench-discovery
|
|
3
|
-
description: "Promote an idea to discovery, run the Workbench Research Agent, and optionally link relevant code chunks."
|
|
4
|
-
allowed-tools:
|
|
5
|
-
- mcp_call_tool
|
|
6
|
-
- read
|
|
7
|
-
- ask_user_question
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Spine Workbench — Discovery
|
|
11
|
-
|
|
12
|
-
Promote an existing Workbench idea to a `workbench_discovery` and gather related code or knowledge.
|
|
13
|
-
|
|
14
|
-
## When to invoke
|
|
15
|
-
|
|
16
|
-
- The user wants to start discovery on an idea.
|
|
17
|
-
- They want to investigate the problem, find related code, and decide whether to approve.
|
|
18
|
-
|
|
19
|
-
## Steps
|
|
20
|
-
|
|
21
|
-
1. **Identify the idea**
|
|
22
|
-
- Ask for the `idea_id` if not provided.
|
|
23
|
-
- If the user gave a title instead of an ID, search with `spine_cil_search_chunks` or list relevant work items to resolve it.
|
|
24
|
-
|
|
25
|
-
2. **Start discovery**
|
|
26
|
-
- Call `spine_workbench_start_discovery` with the `idea_id` and `account_id`.
|
|
27
|
-
- Capture the returned `discovery.id`.
|
|
28
|
-
|
|
29
|
-
3. **Run the Research Agent (optional)**
|
|
30
|
-
- Call `spine_workbench_run_research_agent` with the `idea_id` or new `discovery_id`.
|
|
31
|
-
- Summarize the retrieved sources and recommendations.
|
|
32
|
-
|
|
33
|
-
4. **Link relevant code (optional)**
|
|
34
|
-
- Use `spine_cil_search_chunks` to find CIL chunks related to the discovery topic.
|
|
35
|
-
- For the strongest matches, call `spine_workbench_link_code` with `link_type: workbench_concerns_chunk`.
|
|
36
|
-
|
|
37
|
-
5. **Return the result**
|
|
38
|
-
- Show the discovery `id`, `title`, `status`, and any linked code.
|
|
39
|
-
- Suggest next step: `spine-workbench-initiative` to approve, or `spine-workbench-plan` if it is small enough to skip the initiative stage.
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: spine-workbench-idea
|
|
3
|
-
description: "Capture a new idea in the Workbench and, if helpful, gather relevant context from CIL before tracking it."
|
|
4
|
-
allowed-tools:
|
|
5
|
-
- mcp_call_tool
|
|
6
|
-
- read
|
|
7
|
-
- ask_user_question
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Spine Workbench — Idea
|
|
11
|
-
|
|
12
|
-
Capture a new idea as a `workbench_work_item` with `work_type: idea`.
|
|
13
|
-
|
|
14
|
-
## When to invoke
|
|
15
|
-
|
|
16
|
-
- The user says "I have an idea", "track this", "capture a feature request", or similar.
|
|
17
|
-
- They describe something that should go through the Workbench lifecycle (idea → discovery → initiative → plan → implement).
|
|
18
|
-
|
|
19
|
-
## Steps
|
|
20
|
-
|
|
21
|
-
1. **Confirm the title and description**
|
|
22
|
-
- If the user only mentioned a vague concept, ask for a 1-sentence title and a short description before side effects.
|
|
23
|
-
- If the input is clear, proceed directly.
|
|
24
|
-
|
|
25
|
-
2. **Optionally gather context**
|
|
26
|
-
- If the idea relates to an existing file, chunk, or feature, call `spine_cil_search_chunks` to find relevant CIL context.
|
|
27
|
-
- Summarize the top 1-3 most relevant chunks in your reasoning.
|
|
28
|
-
|
|
29
|
-
3. **Track the idea**
|
|
30
|
-
- Call `spine_workbench_track_idea` with:
|
|
31
|
-
- `account_id` — ask the user if not known.
|
|
32
|
-
- `title` and `description` from the input.
|
|
33
|
-
|
|
34
|
-
4. **Return the result**
|
|
35
|
-
- Show the new idea's `id`, `title`, and `status`.
|
|
36
|
-
- Suggest next step: `spine-workbench-discovery` or `spine-workbench-plan`.
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: spine-workbench-implement
|
|
3
|
-
description: "Implement a Workbench work item: read context, edit code, verify with CIL, and post progress."
|
|
4
|
-
allowed-tools:
|
|
5
|
-
- mcp_call_tool
|
|
6
|
-
- read
|
|
7
|
-
- edit
|
|
8
|
-
- write
|
|
9
|
-
- exec
|
|
10
|
-
- ask_user_question
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Spine Workbench — Implement
|
|
14
|
-
|
|
15
|
-
Implement the code for a Workbench work item and keep CIL in sync.
|
|
16
|
-
|
|
17
|
-
## When to invoke
|
|
18
|
-
|
|
19
|
-
- The user says "implement this", "build it", "fix it", or is ready to code a planned work item.
|
|
20
|
-
|
|
21
|
-
## Steps
|
|
22
|
-
|
|
23
|
-
1. **Identify the work item**
|
|
24
|
-
- Ask for `work_item_id` if not provided.
|
|
25
|
-
|
|
26
|
-
2. **Load context**
|
|
27
|
-
- Use `spine_cil_get_context` or `spine_cil_find_context` on the most relevant chunk(s) linked to the work item.
|
|
28
|
-
- If no chunks are linked, use `spine_cil_search_chunks` first.
|
|
29
|
-
|
|
30
|
-
3. **Implement the change**
|
|
31
|
-
- Edit or create the files needed.
|
|
32
|
-
- Follow the Spine Way: core-vs-custom boundary, design schema, permissions, and admin-data for runtime records.
|
|
33
|
-
|
|
34
|
-
4. **Re-index changed files in CIL**
|
|
35
|
-
- After saving, call `spine_cil_reindex_chunk` with `also_embed: true` for each changed chunk.
|
|
36
|
-
- Use `spine_cil_validate_file` to confirm no drift remains.
|
|
37
|
-
|
|
38
|
-
5. **Run verification**
|
|
39
|
-
- Run the relevant build, lint, typecheck, or test commands for the changed code.
|
|
40
|
-
- If verification fails, fix the issues before finishing.
|
|
41
|
-
|
|
42
|
-
6. **Post progress**
|
|
43
|
-
- Call `spine_workbench_add_thread_message` with an implementation summary.
|
|
44
|
-
|
|
45
|
-
7. **Return the result**
|
|
46
|
-
- Summarize the files changed, verification status, and next step (e.g., open a PR, run end-to-end tests).
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: spine-workbench-initiative
|
|
3
|
-
description: "Approve a discovery and promote it to a workbench_initiative."
|
|
4
|
-
allowed-tools:
|
|
5
|
-
- mcp_call_tool
|
|
6
|
-
- read
|
|
7
|
-
- ask_user_question
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Spine Workbench — Initiative
|
|
11
|
-
|
|
12
|
-
Approve an existing `workbench_discovery` and create a linked `workbench_initiative`.
|
|
13
|
-
|
|
14
|
-
## When to invoke
|
|
15
|
-
|
|
16
|
-
- The user says "approve discovery", "promote to initiative", or wants to move from discovery to roadmap.
|
|
17
|
-
|
|
18
|
-
## Steps
|
|
19
|
-
|
|
20
|
-
1. **Identify the discovery**
|
|
21
|
-
- Ask for the `discovery_id` if not provided.
|
|
22
|
-
|
|
23
|
-
2. **Approve the discovery**
|
|
24
|
-
- Call `spine_workbench_approve_discovery` with the `discovery_id` and `account_id`.
|
|
25
|
-
|
|
26
|
-
3. **Return the result**
|
|
27
|
-
- Show the new initiative `id`, `title`, and `status`.
|
|
28
|
-
- Suggest next step: `spine-workbench-plan`.
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: spine-workbench-plan
|
|
3
|
-
description: "Create documentation and test-plan tickets for a work item and link the code chunks it concerns."
|
|
4
|
-
allowed-tools:
|
|
5
|
-
- mcp_call_tool
|
|
6
|
-
- read
|
|
7
|
-
- ask_user_question
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Spine Workbench — Plan
|
|
11
|
-
|
|
12
|
-
Create planning artifacts for a work item: docs ticket, test plan, and code links.
|
|
13
|
-
|
|
14
|
-
## When to invoke
|
|
15
|
-
|
|
16
|
-
- The user wants to "write a test plan", "create docs", "link code", or generally prepare a work item for implementation.
|
|
17
|
-
- The work item is an idea, discovery, or initiative.
|
|
18
|
-
|
|
19
|
-
## Steps
|
|
20
|
-
|
|
21
|
-
1. **Identify the work item**
|
|
22
|
-
- Ask for `work_item_id` if not provided.
|
|
23
|
-
- If the user mentions the initiative/discovery/idea by title, ask for the UUID or use search.
|
|
24
|
-
|
|
25
|
-
2. **Create the planning artifacts**
|
|
26
|
-
- Call `spine_workbench_create_docs_ticket` to create a `workbench_docs_ticket`.
|
|
27
|
-
- Call `spine_workbench_create_test_plan` to create a `workbench_test_plan`.
|
|
28
|
-
|
|
29
|
-
3. **Link relevant code**
|
|
30
|
-
- Use `spine_cil_search_chunks` to find the most relevant chunks/files for this work item.
|
|
31
|
-
- For each strongly relevant chunk, call `spine_workbench_link_code` with `work_item_id`, `chunk_id`, and `link_type: workbench_concerns_chunk`.
|
|
32
|
-
|
|
33
|
-
4. **Log progress**
|
|
34
|
-
- Call `spine_workbench_add_thread_message` with a short progress note.
|
|
35
|
-
|
|
36
|
-
5. **Return the result**
|
|
37
|
-
- Show the created docs ticket, test plan, and any code links.
|
|
38
|
-
- Suggest next step: `spine-workbench-implement`.
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
name: Install App
|
|
2
|
-
version: 1.0.0
|
|
3
|
-
description: Install a Spine Framework app into the custom workspace
|
|
4
|
-
|
|
5
|
-
triggers:
|
|
6
|
-
- type: user-prompt
|
|
7
|
-
patterns:
|
|
8
|
-
- "install app"
|
|
9
|
-
- "add app"
|
|
10
|
-
- "setup app"
|
|
11
|
-
|
|
12
|
-
steps:
|
|
13
|
-
- name: Identify app package
|
|
14
|
-
action: ask-user
|
|
15
|
-
prompt: "Which app would you like to install? (e.g., cortex, portal, or package name)"
|
|
16
|
-
store: app_name
|
|
17
|
-
|
|
18
|
-
- name: Check for existing installation
|
|
19
|
-
action: shell
|
|
20
|
-
command: "test -d /Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name} && echo 'exists' || echo 'new'"
|
|
21
|
-
store: exists_status
|
|
22
|
-
|
|
23
|
-
- name: Warn about existing installation
|
|
24
|
-
condition: exists_status == "exists"
|
|
25
|
-
action: ask-user
|
|
26
|
-
prompt: "App ${app_name} already exists in custom/apps/. Overwrite? (yes/no)"
|
|
27
|
-
store: confirm_overwrite
|
|
28
|
-
|
|
29
|
-
- name: Exit on no confirmation
|
|
30
|
-
condition: exists_status == "exists" && confirm_overwrite != "yes"
|
|
31
|
-
action: exit
|
|
32
|
-
message: "Installation cancelled. Existing app preserved."
|
|
33
|
-
|
|
34
|
-
- name: Locate package
|
|
35
|
-
action: shell
|
|
36
|
-
command: |
|
|
37
|
-
if [ -d "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}" ]; then
|
|
38
|
-
echo "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}"
|
|
39
|
-
elif [ -d "/Users/thistle/CascadeProjects/spine-ia/custom/npm/${app_name}" ]; then
|
|
40
|
-
echo "/Users/thistle/CascadeProjects/spine-ia/custom/npm/${app_name}"
|
|
41
|
-
else
|
|
42
|
-
echo "not_found"
|
|
43
|
-
fi
|
|
44
|
-
store: package_path
|
|
45
|
-
|
|
46
|
-
- name: Report package not found
|
|
47
|
-
condition: package_path == "not_found"
|
|
48
|
-
action: exit
|
|
49
|
-
message: "Could not find app package. Expected at custom/apps/${app_name} or custom/npm/${app_name}"
|
|
50
|
-
|
|
51
|
-
- name: Install app files
|
|
52
|
-
action: shell
|
|
53
|
-
command: |
|
|
54
|
-
mkdir -p "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}"
|
|
55
|
-
cp -r "${package_path}"/*/ "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}/" 2>/dev/null || true
|
|
56
|
-
echo "App files copied"
|
|
57
|
-
|
|
58
|
-
- name: Install seed data
|
|
59
|
-
action: shell
|
|
60
|
-
command: |
|
|
61
|
-
if [ -d "${package_path}/seed" ]; then
|
|
62
|
-
mkdir -p "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}/seed"
|
|
63
|
-
cp "${package_path}/seed/"*.json "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}/seed/" 2>/dev/null || true
|
|
64
|
-
echo "Seed data copied"
|
|
65
|
-
else
|
|
66
|
-
echo "No seed data found"
|
|
67
|
-
fi
|
|
68
|
-
|
|
69
|
-
- name: Report installation
|
|
70
|
-
action: message
|
|
71
|
-
message: |
|
|
72
|
-
App ${app_name} installed successfully!
|
|
73
|
-
|
|
74
|
-
Location: custom/apps/${app_name}/
|
|
75
|
-
|
|
76
|
-
Next steps:
|
|
77
|
-
1. Review the installed files
|
|
78
|
-
2. Apply seed data: npm run seed -- --app=${app_name}
|
|
79
|
-
3. Restart the development server
|
|
80
|
-
|
|
81
|
-
output:
|
|
82
|
-
success: "App ${app_name} installed to custom/apps/${app_name}/"
|
|
83
|
-
failure: "Failed to install app. Check the logs above."
|