spine-framework 0.2.1 โ 1.0.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/LICENSE.md +213 -8
- package/README.md +327 -0
- package/package.json +107 -217
- package/src/cli/commands/init.ts +192 -0
- package/src/cli/commands/install.ts +25 -0
- package/src/cli/commands/list.ts +33 -0
- package/src/cli/commands/migrate.ts +24 -0
- package/src/cli/index.ts +46 -0
- package/src/components/AppLayout.tsx +21 -0
- package/src/components/AuthGuard.tsx +21 -0
- package/src/components/RoleGuard.tsx +23 -0
- package/src/components/index.ts +3 -0
- package/src/contexts/AppContext.tsx +122 -0
- package/src/contexts/AuthContext.tsx +87 -0
- package/src/contexts/SpineContext.tsx +46 -0
- package/src/contexts/index.ts +3 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useItems.ts +78 -0
- package/src/hooks/useThreads.ts +73 -0
- package/src/hooks/useWebSocket.ts +97 -0
- package/src/index.ts +22 -0
- package/src/types/index.ts +163 -0
- package/src/utils/api.ts +88 -0
- package/src/utils/client.ts +146 -0
- package/src/utils/config.ts +20 -0
- package/src/utils/index.ts +3 -0
- package/.framework/README.md +0 -129
- package/.framework/cli/bin.cjs +0 -14
- package/.framework/cli/commands/agents.ts +0 -153
- package/.framework/cli/commands/auth.ts +0 -94
- package/.framework/cli/commands/create-app.ts +0 -185
- package/.framework/cli/commands/dev.ts +0 -113
- package/.framework/cli/commands/doctor.ts +0 -442
- package/.framework/cli/commands/generate.ts +0 -332
- package/.framework/cli/commands/init.ts +0 -186
- package/.framework/cli/commands/install-app.ts +0 -565
- package/.framework/cli/commands/items.ts +0 -253
- package/.framework/cli/commands/migrate.ts +0 -139
- package/.framework/cli/commands/migrations.ts +0 -141
- package/.framework/cli/commands/pipelines.ts +0 -166
- package/.framework/cli/commands/status.ts +0 -197
- package/.framework/cli/commands/system.ts +0 -184
- package/.framework/cli/commands/test.ts +0 -227
- package/.framework/cli/commands/uninstall-app.ts +0 -166
- package/.framework/cli/context.ts +0 -268
- package/.framework/cli/env-loader.ts +0 -36
- package/.framework/cli/index.ts +0 -116
- package/.framework/cli/welcome.cjs +0 -45
- package/.framework/docs/API.md +0 -384
- package/.framework/docs/STABILITY.md +0 -52
- package/.framework/docs/admin-routes.md +0 -76
- package/.framework/docs/api-docs-progress.md +0 -38
- package/.framework/docs/api-governance.md +0 -146
- package/.framework/docs/api-testing-results.md +0 -212
- package/.framework/docs/apis/admin-configs.md +0 -567
- package/.framework/docs/apis/admin-data.md +0 -272
- package/.framework/docs/apis/index.md +0 -231
- package/.framework/docs/apis/internal.md +0 -295
- package/.framework/docs/apis/runtime.md +0 -537
- package/.framework/docs/assembly-launch-guide.md +0 -138
- package/.framework/docs/audit-results.md +0 -590
- package/.framework/docs/authorization-model.md +0 -170
- package/.framework/docs/db-api-inventory.md +0 -95
- package/.framework/docs/examples/custom-app/README.md +0 -77
- package/.framework/docs/examples/custom-function/README.md +0 -27
- package/.framework/docs/examples/custom-function/handler.ts +0 -48
- package/.framework/docs/examples/custom-webhook/README.md +0 -68
- package/.framework/docs/gap-remediation-backlog.md +0 -103
- package/.framework/docs/guides/cli-guide.md +0 -224
- package/.framework/docs/guides/getting-started.md +0 -103
- package/.framework/docs/guides/import-guide.md +0 -193
- package/.framework/docs/guides/testing-guide.md +0 -229
- package/.framework/docs/permission-examples.md +0 -326
- package/.framework/docs/ui-adoption-verification.md +0 -111
- package/.framework/docs/ui-api-coverage.md +0 -84
- package/.framework/docs/v2-compatibility-audit.md +0 -228
- package/.framework/functions/.gitkeep +0 -1
- package/.framework/functions/_shared/agent-runner.ts +0 -1097
- package/.framework/functions/_shared/app-manifest.ts +0 -184
- package/.framework/functions/_shared/audit.ts +0 -150
- package/.framework/functions/_shared/db.ts +0 -178
- package/.framework/functions/_shared/index.ts +0 -391
- package/.framework/functions/_shared/middleware.ts +0 -490
- package/.framework/functions/_shared/permissions.ts +0 -1325
- package/.framework/functions/_shared/pipeline-runner.ts +0 -731
- package/.framework/functions/_shared/principal.ts +0 -818
- package/.framework/functions/_shared/resolve-ids.ts +0 -106
- package/.framework/functions/_shared/schema-utils.ts +0 -967
- package/.framework/functions/_shared/testing.ts +0 -258
- package/.framework/functions/_shared/trigger-engine.ts +0 -425
- package/.framework/functions/_shared/webhook-registration.ts +0 -168
- package/.framework/functions/_shared/webhook-registry.ts +0 -129
- package/.framework/functions/account-nodes.ts +0 -111
- package/.framework/functions/admin-data.ts +0 -606
- package/.framework/functions/ai-agents.ts +0 -323
- package/.framework/functions/api-keys.ts +0 -376
- package/.framework/functions/apps.ts +0 -483
- package/.framework/functions/auth.ts +0 -196
- package/.framework/functions/debug-auth.ts +0 -107
- package/.framework/functions/embeddings.ts +0 -556
- package/.framework/functions/integration-routes.ts +0 -523
- package/.framework/functions/integrations.ts +0 -319
- package/.framework/functions/item-progress.ts +0 -272
- package/.framework/functions/logs.ts +0 -438
- package/.framework/functions/observability.ts +0 -275
- package/.framework/functions/pipeline-executions.ts +0 -494
- package/.framework/functions/pipelines.ts +0 -485
- package/.framework/functions/prompt-configs.ts +0 -339
- package/.framework/functions/roles.ts +0 -387
- package/.framework/functions/system-cron.ts +0 -742
- package/.framework/functions/system.ts +0 -323
- package/.framework/functions/tests.ts +0 -119
- package/.framework/functions/timers.ts +0 -357
- package/.framework/functions/triggers.ts +0 -563
- package/.framework/functions/types.ts +0 -604
- package/.framework/index.html +0 -16
- package/.framework/migrations/000_foundation.sql +0 -1266
- package/.framework/migrations/001_seed.sql +0 -163
- package/.framework/migrations/002_seed_constraints.sql +0 -19
- package/.framework/migrations/003_auth_user_trigger.sql +0 -67
- package/.framework/src/App.tsx +0 -133
- package/.framework/src/apps/admin/index.tsx +0 -173
- package/.framework/src/components/AppWrapper.tsx +0 -56
- package/.framework/src/components/CustomAppLoader.tsx +0 -116
- package/.framework/src/components/admin/AdminListPage.tsx +0 -151
- package/.framework/src/components/admin/AdminSidebar.tsx +0 -166
- package/.framework/src/components/admin/AdminStatsCard.tsx +0 -62
- package/.framework/src/components/admin/SortableTableHeader.tsx +0 -42
- package/.framework/src/components/app-shell/GenericAppShell.tsx +0 -181
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +0 -200
- package/.framework/src/components/app-shell/GenericListPage.tsx +0 -116
- package/.framework/src/components/app-sidebar.tsx +0 -228
- package/.framework/src/components/auth/ProtectedRoute.tsx +0 -88
- package/.framework/src/components/layout/AppShell.tsx +0 -91
- package/.framework/src/components/layout/Header.tsx +0 -88
- package/.framework/src/components/layout/Layout.tsx +0 -95
- package/.framework/src/components/layout/Sidebar.tsx +0 -329
- package/.framework/src/components/runtime/DataDetailHeader.tsx +0 -77
- package/.framework/src/components/runtime/DataDetailPage.tsx +0 -171
- package/.framework/src/components/runtime/DataFilters.tsx +0 -91
- package/.framework/src/components/runtime/DataHeader.tsx +0 -68
- package/.framework/src/components/runtime/DataListPage.tsx +0 -124
- package/.framework/src/components/runtime/DataStats.tsx +0 -70
- package/.framework/src/components/runtime/DataTable.tsx +0 -174
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +0 -134
- package/.framework/src/components/runtime/index.ts +0 -18
- package/.framework/src/components/search-form.tsx +0 -29
- package/.framework/src/components/shared/AgentView.tsx +0 -213
- package/.framework/src/components/shared/FieldRenderer.tsx +0 -478
- package/.framework/src/components/shared/SchemaFields.tsx +0 -226
- package/.framework/src/components/ui/DataTable.tsx +0 -343
- package/.framework/src/components/ui/Form.tsx +0 -281
- package/.framework/src/components/ui/ItemCard.tsx +0 -296
- package/.framework/src/components/ui/ItemListView.tsx +0 -308
- package/.framework/src/components/ui/LoadingSpinner.tsx +0 -52
- package/.framework/src/components/ui/Modal.tsx +0 -61
- package/.framework/src/components/ui/RichTextEditor.tsx +0 -210
- package/.framework/src/components/ui/accordion.tsx +0 -82
- package/.framework/src/components/ui/alert-dialog.tsx +0 -197
- package/.framework/src/components/ui/alert.tsx +0 -76
- package/.framework/src/components/ui/aspect-ratio.tsx +0 -11
- package/.framework/src/components/ui/avatar.tsx +0 -110
- package/.framework/src/components/ui/badge.tsx +0 -49
- package/.framework/src/components/ui/breadcrumb.tsx +0 -122
- package/.framework/src/components/ui/button-group.tsx +0 -83
- package/.framework/src/components/ui/button.tsx +0 -65
- package/.framework/src/components/ui/calendar.tsx +0 -222
- package/.framework/src/components/ui/card.tsx +0 -100
- package/.framework/src/components/ui/carousel.tsx +0 -240
- package/.framework/src/components/ui/chart.tsx +0 -368
- package/.framework/src/components/ui/checkbox.tsx +0 -31
- package/.framework/src/components/ui/collapsible.tsx +0 -33
- package/.framework/src/components/ui/combobox.tsx +0 -299
- package/.framework/src/components/ui/command.tsx +0 -193
- package/.framework/src/components/ui/context-menu.tsx +0 -261
- package/.framework/src/components/ui/dialog.tsx +0 -165
- package/.framework/src/components/ui/direction.tsx +0 -6
- package/.framework/src/components/ui/drawer.tsx +0 -132
- package/.framework/src/components/ui/dropdown-menu.tsx +0 -269
- package/.framework/src/components/ui/empty.tsx +0 -104
- package/.framework/src/components/ui/field.tsx +0 -238
- package/.framework/src/components/ui/hover-card.tsx +0 -42
- package/.framework/src/components/ui/input-group.tsx +0 -153
- package/.framework/src/components/ui/input-otp.tsx +0 -87
- package/.framework/src/components/ui/input.tsx +0 -19
- package/.framework/src/components/ui/item.tsx +0 -196
- package/.framework/src/components/ui/kbd.tsx +0 -26
- package/.framework/src/components/ui/label.tsx +0 -22
- package/.framework/src/components/ui/menubar.tsx +0 -277
- package/.framework/src/components/ui/native-select.tsx +0 -61
- package/.framework/src/components/ui/navigation-menu.tsx +0 -164
- package/.framework/src/components/ui/pagination.tsx +0 -129
- package/.framework/src/components/ui/popover.tsx +0 -87
- package/.framework/src/components/ui/progress.tsx +0 -31
- package/.framework/src/components/ui/radio-group.tsx +0 -42
- package/.framework/src/components/ui/resizable.tsx +0 -50
- package/.framework/src/components/ui/scroll-area.tsx +0 -53
- package/.framework/src/components/ui/select.tsx +0 -195
- package/.framework/src/components/ui/separator.tsx +0 -26
- package/.framework/src/components/ui/sheet.tsx +0 -145
- package/.framework/src/components/ui/sidebar.tsx +0 -706
- package/.framework/src/components/ui/skeleton.tsx +0 -13
- package/.framework/src/components/ui/slider.tsx +0 -59
- package/.framework/src/components/ui/sonner.tsx +0 -47
- package/.framework/src/components/ui/spinner.tsx +0 -10
- package/.framework/src/components/ui/switch.tsx +0 -33
- package/.framework/src/components/ui/table-primitives.tsx +0 -141
- package/.framework/src/components/ui/table.tsx +0 -114
- package/.framework/src/components/ui/tabs.tsx +0 -90
- package/.framework/src/components/ui/textarea.tsx +0 -18
- package/.framework/src/components/ui/toggle-group.tsx +0 -89
- package/.framework/src/components/ui/toggle.tsx +0 -45
- package/.framework/src/components/ui/tooltip.tsx +0 -57
- package/.framework/src/contexts/AppContext.tsx +0 -133
- package/.framework/src/contexts/AuthContext.tsx +0 -371
- package/.framework/src/hooks/use-mobile.ts +0 -19
- package/.framework/src/hooks/useApi.ts +0 -526
- package/.framework/src/hooks/useApps.ts +0 -114
- package/.framework/src/hooks/useEntityList.ts +0 -190
- package/.framework/src/hooks/useEntityRecord.ts +0 -308
- package/.framework/src/hooks/useForm.ts +0 -307
- package/.framework/src/hooks/useListSchema.ts +0 -264
- package/.framework/src/hooks/useSchemaRecord.ts +0 -223
- package/.framework/src/index.css +0 -128
- package/.framework/src/lib/api.ts +0 -156
- package/.framework/src/lib/supabase.ts +0 -94
- package/.framework/src/lib/utils.ts +0 -317
- package/.framework/src/main.tsx +0 -27
- package/.framework/src/pages/DashboardPage.tsx +0 -181
- package/.framework/src/pages/NotFoundPage.tsx +0 -39
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +0 -161
- package/.framework/src/pages/admin/AIAgentsPage.tsx +0 -318
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +0 -199
- package/.framework/src/pages/admin/APIKeysPage.tsx +0 -303
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +0 -523
- package/.framework/src/pages/admin/AppDetailPage.tsx +0 -493
- package/.framework/src/pages/admin/AppsPage.tsx +0 -355
- package/.framework/src/pages/admin/DesignedPage.tsx +0 -491
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +0 -534
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +0 -424
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +0 -176
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +0 -109
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +0 -402
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +0 -187
- package/.framework/src/pages/admin/IntegrationsPage.tsx +0 -301
- package/.framework/src/pages/admin/LogsPage.tsx +0 -283
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +0 -85
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +0 -470
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +0 -183
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +0 -279
- package/.framework/src/pages/admin/PipelinesPage.tsx +0 -390
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +0 -299
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +0 -292
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +0 -434
- package/.framework/src/pages/admin/RoleDetailPage.tsx +0 -273
- package/.framework/src/pages/admin/RolesPage.tsx +0 -292
- package/.framework/src/pages/admin/SelectTestPage.tsx +0 -61
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +0 -588
- package/.framework/src/pages/admin/SimpleDashboard.tsx +0 -387
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +0 -172
- package/.framework/src/pages/admin/TestingDashboard.tsx +0 -257
- package/.framework/src/pages/admin/TimerDetailPage.tsx +0 -151
- package/.framework/src/pages/admin/TimersPage.tsx +0 -376
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +0 -149
- package/.framework/src/pages/admin/TriggersPage.tsx +0 -381
- package/.framework/src/pages/admin/TypeDetailPage.tsx +0 -694
- package/.framework/src/pages/admin/TypesPage.tsx +0 -295
- package/.framework/src/pages/auth/LoginPage.tsx +0 -187
- package/.framework/src/pages/auth/RegisterPage.tsx +0 -163
- package/.framework/src/pages/spine-framework/APIPage.tsx +0 -17
- package/.framework/src/pages/spine-framework/CLIPage.tsx +0 -25
- package/.framework/src/types/auth.ts +0 -125
- package/.framework/src/types/types.ts +0 -407
- package/STRUCTURE.md +0 -150
- package/bin/spine-framework.cjs +0 -62
- package/bin/welcome.cjs +0 -45
- package/bin/ws-shim.cjs +0 -8
- package/bin/ws-shim.ts +0 -10
- package/config/components.json +0 -25
- package/config/deno.lock +0 -108
- package/config/package-lock.json +0 -17183
- package/config/postcss.config.cjs +0 -10
- package/config/tailwind.config.cjs +0 -78
- package/config/tsconfig.build.json +0 -32
- package/config/tsconfig.cli.json +0 -18
- package/config/tsconfig.json +0 -41
- package/config/tsconfig.node.json +0 -17
- package/config/tsconfig.node.tsbuildinfo +0 -1
- package/config/tsconfig.tsbuildinfo +0 -1
- package/config/typedoc.json +0 -16
- package/config/vite.config.d.ts +0 -2
- package/config/vite.config.ts +0 -71
- package/dist/cli/commands/agents.d.ts +0 -39
- package/dist/cli/commands/agents.d.ts.map +0 -1
- package/dist/cli/commands/auth.d.ts +0 -36
- package/dist/cli/commands/auth.d.ts.map +0 -1
- package/dist/cli/commands/create-app.d.ts +0 -23
- package/dist/cli/commands/create-app.d.ts.map +0 -1
- package/dist/cli/commands/dev.d.ts +0 -24
- package/dist/cli/commands/dev.d.ts.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -42
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/generate.d.ts +0 -36
- package/dist/cli/commands/generate.d.ts.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -20
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/install-app.d.ts +0 -30
- package/dist/cli/commands/install-app.d.ts.map +0 -1
- package/dist/cli/commands/items.d.ts +0 -45
- package/dist/cli/commands/items.d.ts.map +0 -1
- package/dist/cli/commands/migrate.d.ts +0 -21
- package/dist/cli/commands/migrate.d.ts.map +0 -1
- package/dist/cli/commands/migrations.d.ts +0 -41
- package/dist/cli/commands/migrations.d.ts.map +0 -1
- package/dist/cli/commands/pipelines.d.ts +0 -40
- package/dist/cli/commands/pipelines.d.ts.map +0 -1
- package/dist/cli/commands/status.d.ts +0 -23
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/system.d.ts +0 -29
- package/dist/cli/commands/system.d.ts.map +0 -1
- package/dist/cli/commands/test.d.ts +0 -46
- package/dist/cli/commands/test.d.ts.map +0 -1
- package/dist/cli/commands/uninstall-app.d.ts +0 -23
- package/dist/cli/commands/uninstall-app.d.ts.map +0 -1
- package/dist/cli/context.d.ts +0 -88
- package/dist/cli/context.d.ts.map +0 -1
- package/dist/cli/env-loader.d.ts +0 -14
- package/dist/cli/env-loader.d.ts.map +0 -1
- package/dist/cli/index.d.ts +0 -41
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/functions/_shared/agent-runner.d.ts +0 -156
- package/dist/functions/_shared/agent-runner.d.ts.map +0 -1
- package/dist/functions/_shared/app-manifest.d.ts +0 -68
- package/dist/functions/_shared/app-manifest.d.ts.map +0 -1
- package/dist/functions/_shared/audit.d.ts +0 -91
- package/dist/functions/_shared/audit.d.ts.map +0 -1
- package/dist/functions/_shared/db.d.ts +0 -125
- package/dist/functions/_shared/db.d.ts.map +0 -1
- package/dist/functions/_shared/index.d.ts +0 -299
- package/dist/functions/_shared/index.d.ts.map +0 -1
- package/dist/functions/_shared/middleware.d.ts +0 -315
- package/dist/functions/_shared/middleware.d.ts.map +0 -1
- package/dist/functions/_shared/permissions.d.ts +0 -626
- package/dist/functions/_shared/permissions.d.ts.map +0 -1
- package/dist/functions/_shared/pipeline-runner.d.ts +0 -124
- package/dist/functions/_shared/pipeline-runner.d.ts.map +0 -1
- package/dist/functions/_shared/principal.d.ts +0 -284
- package/dist/functions/_shared/principal.d.ts.map +0 -1
- package/dist/functions/_shared/resolve-ids.d.ts +0 -10
- package/dist/functions/_shared/resolve-ids.d.ts.map +0 -1
- package/dist/functions/_shared/schema-utils.d.ts +0 -181
- package/dist/functions/_shared/schema-utils.d.ts.map +0 -1
- package/dist/functions/_shared/testing.d.ts +0 -172
- package/dist/functions/_shared/testing.d.ts.map +0 -1
- package/dist/functions/_shared/trigger-engine.d.ts +0 -140
- package/dist/functions/_shared/trigger-engine.d.ts.map +0 -1
- package/dist/functions/_shared/webhook-registration.d.ts +0 -81
- package/dist/functions/_shared/webhook-registration.d.ts.map +0 -1
- package/dist/functions/_shared/webhook-registry.d.ts +0 -57
- package/dist/functions/_shared/webhook-registry.d.ts.map +0 -1
- package/dist/functions/account-nodes.d.ts +0 -48
- package/dist/functions/account-nodes.d.ts.map +0 -1
- package/dist/functions/admin-data.d.ts +0 -178
- package/dist/functions/admin-data.d.ts.map +0 -1
- package/dist/functions/ai-agents.d.ts +0 -125
- package/dist/functions/ai-agents.d.ts.map +0 -1
- package/dist/functions/api-keys.d.ts +0 -140
- package/dist/functions/api-keys.d.ts.map +0 -1
- package/dist/functions/apps.d.ts +0 -163
- package/dist/functions/apps.d.ts.map +0 -1
- package/dist/functions/auth.d.ts +0 -74
- package/dist/functions/auth.d.ts.map +0 -1
- package/dist/functions/debug-auth.d.ts +0 -33
- package/dist/functions/debug-auth.d.ts.map +0 -1
- package/dist/functions/embeddings.d.ts +0 -205
- package/dist/functions/embeddings.d.ts.map +0 -1
- package/dist/functions/integration-routes.d.ts +0 -45
- package/dist/functions/integration-routes.d.ts.map +0 -1
- package/dist/functions/integrations.d.ts +0 -124
- package/dist/functions/integrations.d.ts.map +0 -1
- package/dist/functions/item-progress.d.ts +0 -41
- package/dist/functions/item-progress.d.ts.map +0 -1
- package/dist/functions/logs.d.ts +0 -162
- package/dist/functions/logs.d.ts.map +0 -1
- package/dist/functions/observability.d.ts +0 -123
- package/dist/functions/observability.d.ts.map +0 -1
- package/dist/functions/pipeline-executions.d.ts +0 -190
- package/dist/functions/pipeline-executions.d.ts.map +0 -1
- package/dist/functions/pipelines.d.ts +0 -171
- package/dist/functions/pipelines.d.ts.map +0 -1
- package/dist/functions/prompt-configs.d.ts +0 -125
- package/dist/functions/prompt-configs.d.ts.map +0 -1
- package/dist/functions/roles.d.ts +0 -118
- package/dist/functions/roles.d.ts.map +0 -1
- package/dist/functions/system-cron.d.ts +0 -65
- package/dist/functions/system-cron.d.ts.map +0 -1
- package/dist/functions/system.d.ts +0 -29
- package/dist/functions/system.d.ts.map +0 -1
- package/dist/functions/tests.d.ts +0 -28
- package/dist/functions/tests.d.ts.map +0 -1
- package/dist/functions/timers.d.ts +0 -139
- package/dist/functions/timers.d.ts.map +0 -1
- package/dist/functions/triggers.d.ts +0 -203
- package/dist/functions/triggers.d.ts.map +0 -1
- package/dist/functions/types.d.ts +0 -151
- package/dist/functions/types.d.ts.map +0 -1
- package/dist/src/types/types.d.ts +0 -364
- package/dist/src/types/types.d.ts.map +0 -1
- package/index.html +0 -13
- package/netlify.toml +0 -36
- package/package-project.json +0 -71
- package/scripts/app-install-cli.ts +0 -286
- package/scripts/assemble-frontend.sh +0 -76
- package/scripts/assemble-functions.sh +0 -62
- package/scripts/assemble.sh +0 -41
- package/scripts/boundary-check.sh +0 -106
- package/scripts/build-manifest.sh +0 -80
- 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/load-test-app-install.ts +0 -484
- package/scripts/netlify-dev-wrapper.sh +0 -22
- package/scripts/verify-integrity.sh +0 -69
- package/vitest.config.ts +0 -45
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/**
|
|
3
|
-
* @module cli/commands/status
|
|
4
|
-
* @audience installer
|
|
5
|
-
* @layer cli
|
|
6
|
-
* @stability stable
|
|
7
|
-
*
|
|
8
|
-
* `spine-framework status` โ Show the current state of the Spine installation.
|
|
9
|
-
*
|
|
10
|
-
* Displays:
|
|
11
|
-
* - Database connection status
|
|
12
|
-
* - Installed apps and their seed state
|
|
13
|
-
* - Migration history
|
|
14
|
-
* - Webhook handler registrations
|
|
15
|
-
*
|
|
16
|
-
* **Usage:**
|
|
17
|
-
* ```bash
|
|
18
|
-
* spine-framework status
|
|
19
|
-
* spine-framework status --json
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import type { Command } from 'commander'
|
|
24
|
-
import { existsSync, readdirSync } from 'fs'
|
|
25
|
-
import { resolve, dirname } from 'path'
|
|
26
|
-
import { fileURLToPath } from 'url'
|
|
27
|
-
import { adminDb } from '../../functions/_shared/index.ts'
|
|
28
|
-
import { discoverManifests } from '../../functions/_shared/app-manifest.ts'
|
|
29
|
-
|
|
30
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
31
|
-
const __dirname = dirname(__filename)
|
|
32
|
-
const PROJECT_ROOT = resolve(__dirname, '../../../')
|
|
33
|
-
|
|
34
|
-
interface StatusOptions {
|
|
35
|
-
json: boolean
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
interface StatusReport {
|
|
39
|
-
database: { connected: boolean; error?: string }
|
|
40
|
-
apps: Array<{ slug: string; name: string; hasManifest: boolean; hasSeed: boolean; installed: boolean }>
|
|
41
|
-
webhookHandlers: Array<{ name: string; functionName: string; isActive: boolean }>
|
|
42
|
-
typeCounts: { total: number; byApp: Record<string, number> }
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async function gatherStatus(): Promise<StatusReport> {
|
|
46
|
-
const report: StatusReport = {
|
|
47
|
-
database: { connected: false },
|
|
48
|
-
apps: [],
|
|
49
|
-
webhookHandlers: [],
|
|
50
|
-
typeCounts: { total: 0, byApp: {} },
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// 1. Database connection
|
|
54
|
-
try {
|
|
55
|
-
const { data, error } = await adminDb
|
|
56
|
-
.from('apps')
|
|
57
|
-
.select('slug')
|
|
58
|
-
.limit(1)
|
|
59
|
-
|
|
60
|
-
if (error) {
|
|
61
|
-
report.database = { connected: false, error: error.message }
|
|
62
|
-
} else {
|
|
63
|
-
report.database = { connected: true }
|
|
64
|
-
}
|
|
65
|
-
} catch (err: any) {
|
|
66
|
-
report.database = { connected: false, error: err.message }
|
|
67
|
-
return report
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// 2. Apps โ merge filesystem + database
|
|
71
|
-
const manifests = discoverManifests()
|
|
72
|
-
const { data: dbApps } = await adminDb
|
|
73
|
-
.from('apps')
|
|
74
|
-
.select('slug, name, is_active')
|
|
75
|
-
.eq('is_active', true)
|
|
76
|
-
.order('slug')
|
|
77
|
-
|
|
78
|
-
const { data: installations } = await adminDb
|
|
79
|
-
.from('app_installations')
|
|
80
|
-
.select('app_slug, is_enabled')
|
|
81
|
-
|
|
82
|
-
const installedSlugs = new Set(
|
|
83
|
-
(installations || []).filter(i => i.is_enabled).map(i => i.app_slug)
|
|
84
|
-
)
|
|
85
|
-
|
|
86
|
-
const allSlugs = new Set([
|
|
87
|
-
...manifests.map(m => m.slug),
|
|
88
|
-
...(dbApps || []).map(a => a.slug).filter(s => s !== 'spine-core'),
|
|
89
|
-
])
|
|
90
|
-
|
|
91
|
-
for (const slug of allSlugs) {
|
|
92
|
-
const manifest = manifests.find(m => m.slug === slug)
|
|
93
|
-
const dbApp = dbApps?.find(a => a.slug === slug)
|
|
94
|
-
const seedDir = resolve(PROJECT_ROOT, `custom/apps/${slug}/seed`)
|
|
95
|
-
|
|
96
|
-
report.apps.push({
|
|
97
|
-
slug,
|
|
98
|
-
name: dbApp?.name || slug,
|
|
99
|
-
hasManifest: !!manifest,
|
|
100
|
-
hasSeed: existsSync(seedDir) && readdirSync(seedDir).some(f => f.endsWith('.json')),
|
|
101
|
-
installed: installedSlugs.has(slug),
|
|
102
|
-
})
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// 3. Webhook handlers
|
|
106
|
-
const { data: handlers } = await adminDb
|
|
107
|
-
.from('webhook_handlers')
|
|
108
|
-
.select('name, function_name, is_active')
|
|
109
|
-
.order('name')
|
|
110
|
-
|
|
111
|
-
report.webhookHandlers = (handlers || []).map(h => ({
|
|
112
|
-
name: h.name,
|
|
113
|
-
functionName: h.function_name,
|
|
114
|
-
isActive: h.is_active,
|
|
115
|
-
}))
|
|
116
|
-
|
|
117
|
-
// 4. Type counts by app
|
|
118
|
-
const { data: types } = await adminDb
|
|
119
|
-
.from('types')
|
|
120
|
-
.select('slug, app_id, apps!inner(slug)')
|
|
121
|
-
.eq('is_active', true)
|
|
122
|
-
|
|
123
|
-
report.typeCounts.total = types?.length || 0
|
|
124
|
-
for (const t of types || []) {
|
|
125
|
-
const appSlug = (t as any).apps?.slug || 'unassigned'
|
|
126
|
-
report.typeCounts.byApp[appSlug] = (report.typeCounts.byApp[appSlug] || 0) + 1
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return report
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function printStatus(report: StatusReport): void {
|
|
133
|
-
console.log('\n๐ Spine Framework Status\n')
|
|
134
|
-
|
|
135
|
-
// Database
|
|
136
|
-
if (report.database.connected) {
|
|
137
|
-
console.log(' ๐ก Database: โ
Connected')
|
|
138
|
-
} else {
|
|
139
|
-
console.log(` ๐ก Database: โ ${report.database.error || 'Not connected'}`)
|
|
140
|
-
return
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Apps
|
|
144
|
-
console.log(`\n ๐ฑ Apps (${report.apps.length}):`)
|
|
145
|
-
if (report.apps.length === 0) {
|
|
146
|
-
console.log(' (none)')
|
|
147
|
-
} else {
|
|
148
|
-
for (const app of report.apps) {
|
|
149
|
-
const status = [
|
|
150
|
-
app.hasManifest ? '๐ manifest' : '',
|
|
151
|
-
app.hasSeed ? '๐ฑ seed' : '',
|
|
152
|
-
app.installed ? 'โ
installed' : 'โฌ not installed',
|
|
153
|
-
].filter(Boolean).join(' ')
|
|
154
|
-
console.log(` ${app.slug.padEnd(24)} ${status}`)
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Webhook handlers
|
|
159
|
-
console.log(`\n ๐ Webhook Handlers (${report.webhookHandlers.length}):`)
|
|
160
|
-
if (report.webhookHandlers.length === 0) {
|
|
161
|
-
console.log(' (none)')
|
|
162
|
-
} else {
|
|
163
|
-
for (const h of report.webhookHandlers) {
|
|
164
|
-
const status = h.isActive ? 'โ
' : 'โ'
|
|
165
|
-
console.log(` ${status} ${h.name.padEnd(24)} โ ${h.functionName}`)
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Types
|
|
170
|
-
console.log(`\n ๐ Types (${report.typeCounts.total} total):`)
|
|
171
|
-
for (const [app, count] of Object.entries(report.typeCounts.byApp).sort()) {
|
|
172
|
-
console.log(` ${app.padEnd(24)} ${count} types`)
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
console.log('')
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
export function registerStatusCommands(program: Command) {
|
|
179
|
-
program
|
|
180
|
-
.command('status')
|
|
181
|
-
.description('Show the current state of the Spine installation')
|
|
182
|
-
.option('--json', 'Output as JSON', false)
|
|
183
|
-
.action(async (opts: StatusOptions) => {
|
|
184
|
-
try {
|
|
185
|
-
const report = await gatherStatus()
|
|
186
|
-
if (opts.json) {
|
|
187
|
-
console.log(JSON.stringify(report, null, 2))
|
|
188
|
-
} else {
|
|
189
|
-
printStatus(report)
|
|
190
|
-
}
|
|
191
|
-
} catch (err: any) {
|
|
192
|
-
console.error('Error:', err.message)
|
|
193
|
-
if (process.env.SPINE_CLI_DEBUG) console.error(err.stack)
|
|
194
|
-
process.exit(1)
|
|
195
|
-
}
|
|
196
|
-
})
|
|
197
|
-
}
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/**
|
|
3
|
-
* @module cli/commands/system
|
|
4
|
-
* @audience installer
|
|
5
|
-
* @layer cli
|
|
6
|
-
* @stability stable
|
|
7
|
-
*
|
|
8
|
-
* `spine system` command โ CLI interface to system discovery endpoints.
|
|
9
|
-
* Queries the running Spine instance for manifest, health, and OpenAPI spec.
|
|
10
|
-
*
|
|
11
|
-
* **Commands:**
|
|
12
|
-
* | Subcommand | Description |
|
|
13
|
-
* |-------------------------|-------------------------------------------------------|
|
|
14
|
-
* | `system manifest` | Fetch and display system manifest |
|
|
15
|
-
* | `system health` | Fetch and display health check results |
|
|
16
|
-
* | `system openapi` | Fetch OpenAPI spec (outputs JSON) |
|
|
17
|
-
* | `system --json` | Output as JSON for all subcommands |
|
|
18
|
-
*
|
|
19
|
-
* **Usage:**
|
|
20
|
-
* ```bash
|
|
21
|
-
* spine system manifest
|
|
22
|
-
* spine system health --json
|
|
23
|
-
* spine system openapi > openapi.json
|
|
24
|
-
* ```
|
|
25
|
-
*
|
|
26
|
-
* @seeAlso functions/system.ts (HTTP endpoints this CLI consumes)
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
import type { Command } from 'commander'
|
|
30
|
-
import { buildCliContext, printResult, handleError } from '../context.ts'
|
|
31
|
-
|
|
32
|
-
// โโโ API CLIENT โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
33
|
-
|
|
34
|
-
async function fetchSystemEndpoint(ctx: any, action: string): Promise<any> {
|
|
35
|
-
const supabaseUrl = process.env.SUPABASE_URL
|
|
36
|
-
if (!supabaseUrl) {
|
|
37
|
-
throw new Error('SUPABASE_URL not configured')
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Construct the Netlify function URL
|
|
41
|
-
// When running locally, this is http://localhost:8888/.netlify/functions/system
|
|
42
|
-
// We'll try localhost:8888 first, then fall back to production URL if configured
|
|
43
|
-
const localUrl = 'http://localhost:8888/.netlify/functions/system'
|
|
44
|
-
const url = `${localUrl}?action=${action}`
|
|
45
|
-
|
|
46
|
-
try {
|
|
47
|
-
const response = await fetch(url, {
|
|
48
|
-
method: 'GET',
|
|
49
|
-
headers: {
|
|
50
|
-
'Accept': 'application/json',
|
|
51
|
-
'x-app-id': 'cli-system'
|
|
52
|
-
}
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
if (!response.ok) {
|
|
56
|
-
const text = await response.text()
|
|
57
|
-
throw new Error(`HTTP ${response.status}: ${text}`)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return await response.json()
|
|
61
|
-
} catch (err: any) {
|
|
62
|
-
// If local fails, try direct Supabase function invoke (for production)
|
|
63
|
-
if (err.message.includes('fetch failed') || err.message.includes('ECONNREFUSED')) {
|
|
64
|
-
throw new Error(
|
|
65
|
-
'Cannot connect to local dev server. ' +
|
|
66
|
-
'Ensure `spine dev` or `netlify dev` is running on port 8888.'
|
|
67
|
-
)
|
|
68
|
-
}
|
|
69
|
-
throw err
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// โโโ COMMAND REGISTRATION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
74
|
-
|
|
75
|
-
export function registerSystemCommands(program: Command) {
|
|
76
|
-
const system = program
|
|
77
|
-
.command('system')
|
|
78
|
-
.description('System discovery and health commands')
|
|
79
|
-
|
|
80
|
-
system
|
|
81
|
-
.command('manifest')
|
|
82
|
-
.description('Fetch system manifest (version, functions, migrations)')
|
|
83
|
-
.option('--json', 'Output as JSON')
|
|
84
|
-
.action(async (opts) => {
|
|
85
|
-
try {
|
|
86
|
-
const ctx = await buildCliContext()
|
|
87
|
-
const result = await fetchSystemEndpoint(ctx, 'manifest')
|
|
88
|
-
|
|
89
|
-
if (opts.json) {
|
|
90
|
-
console.log(JSON.stringify(result, null, 2))
|
|
91
|
-
} else {
|
|
92
|
-
console.log('\n๐ Spine System Manifest')
|
|
93
|
-
console.log('โ'.repeat(50))
|
|
94
|
-
|
|
95
|
-
if (result.data) {
|
|
96
|
-
const m = result.data
|
|
97
|
-
console.log(`Version: ${m.version}`)
|
|
98
|
-
console.log(`Schema: ${m.schema}`)
|
|
99
|
-
console.log(`Migrations: ${m.migrations?.applied || 0} applied` +
|
|
100
|
-
(m.migrations?.pending ? `, ${m.migrations.pending} pending` : ''))
|
|
101
|
-
console.log(`Functions: ${m.functions?.length || 0} endpoints`)
|
|
102
|
-
console.log(`Integrity: ${m.integrity?.verified ? 'โ verified' : 'โ not verified'}`)
|
|
103
|
-
|
|
104
|
-
if (m.functions?.length > 0) {
|
|
105
|
-
console.log('\nAvailable Functions:')
|
|
106
|
-
for (const fn of m.functions.slice(0, 10)) {
|
|
107
|
-
console.log(` โข ${fn.name} (${fn.methods.join(',')})`)
|
|
108
|
-
}
|
|
109
|
-
if (m.functions.length > 10) {
|
|
110
|
-
console.log(` ... and ${m.functions.length - 10} more`)
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
} else {
|
|
114
|
-
console.log('No manifest data returned')
|
|
115
|
-
}
|
|
116
|
-
console.log()
|
|
117
|
-
}
|
|
118
|
-
} catch (err: any) {
|
|
119
|
-
handleError(err)
|
|
120
|
-
}
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
system
|
|
124
|
-
.command('health')
|
|
125
|
-
.description('Fetch health check status')
|
|
126
|
-
.option('--json', 'Output as JSON')
|
|
127
|
-
.action(async (opts) => {
|
|
128
|
-
try {
|
|
129
|
-
const ctx = await buildCliContext()
|
|
130
|
-
const result = await fetchSystemEndpoint(ctx, 'health')
|
|
131
|
-
|
|
132
|
-
if (opts.json) {
|
|
133
|
-
console.log(JSON.stringify(result, null, 2))
|
|
134
|
-
} else {
|
|
135
|
-
console.log('\n๐ฅ Spine Health Check')
|
|
136
|
-
console.log('โ'.repeat(50))
|
|
137
|
-
|
|
138
|
-
if (result.data) {
|
|
139
|
-
const h = result.data
|
|
140
|
-
const statusIcon = h.status === 'healthy' ? 'โ' :
|
|
141
|
-
h.status === 'degraded' ? 'โ ' : 'โ'
|
|
142
|
-
console.log(`Status: ${statusIcon} ${h.status.toUpperCase()}`)
|
|
143
|
-
console.log()
|
|
144
|
-
|
|
145
|
-
if (h.checks) {
|
|
146
|
-
for (const [name, check] of Object.entries(h.checks)) {
|
|
147
|
-
const c = check as any
|
|
148
|
-
const icon = c.connected || c.current || c.verified ? 'โ' :
|
|
149
|
-
c.status === 'passed' ? 'โ' : 'โ '
|
|
150
|
-
console.log(`${icon} ${name}:`)
|
|
151
|
-
if (c.latency_ms !== undefined) {
|
|
152
|
-
console.log(` latency: ${c.latency_ms}ms`)
|
|
153
|
-
}
|
|
154
|
-
if (c.applied !== undefined) {
|
|
155
|
-
console.log(` applied: ${c.applied}, pending: ${c.pending}`)
|
|
156
|
-
}
|
|
157
|
-
if (c.last_suite) {
|
|
158
|
-
console.log(` last run: ${c.last_suite} (${c.last_status})`)
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
} else {
|
|
163
|
-
console.log('No health data returned')
|
|
164
|
-
}
|
|
165
|
-
console.log()
|
|
166
|
-
}
|
|
167
|
-
} catch (err: any) {
|
|
168
|
-
handleError(err)
|
|
169
|
-
}
|
|
170
|
-
})
|
|
171
|
-
|
|
172
|
-
system
|
|
173
|
-
.command('openapi')
|
|
174
|
-
.description('Fetch OpenAPI specification')
|
|
175
|
-
.action(async () => {
|
|
176
|
-
try {
|
|
177
|
-
const ctx = await buildCliContext()
|
|
178
|
-
const result = await fetchSystemEndpoint(ctx, 'openapi')
|
|
179
|
-
console.log(JSON.stringify(result.data || result, null, 2))
|
|
180
|
-
} catch (err: any) {
|
|
181
|
-
handleError(err)
|
|
182
|
-
}
|
|
183
|
-
})
|
|
184
|
-
}
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/**
|
|
3
|
-
* @module cli/commands/test
|
|
4
|
-
* @audience installer
|
|
5
|
-
* @layer cli
|
|
6
|
-
* @stability stable
|
|
7
|
-
*
|
|
8
|
-
* `spine test` command โ unified test runner for all 4 test surfaces.
|
|
9
|
-
* Runs Vitest tests and persists results to Supabase via the custom reporter.
|
|
10
|
-
*
|
|
11
|
-
* **Commands:**
|
|
12
|
-
* | Subcommand | Description |
|
|
13
|
-
* |-------------------------|-------------------------------------------------------|
|
|
14
|
-
* | `test` | Run all test suites |
|
|
15
|
-
* | `test unit` | Run unit tests only |
|
|
16
|
-
* | `test integration` | Run integration tests only |
|
|
17
|
-
* | `test api` | Run API tests only |
|
|
18
|
-
* | `test ui` | Run UI/Playwright tests only |
|
|
19
|
-
* | `test --json` | Output structured JSON summary |
|
|
20
|
-
* | `test --watch` | Run in watch mode (for unit/integration) |
|
|
21
|
-
*
|
|
22
|
-
* **Test surfaces:**
|
|
23
|
-
* - **unit**: Fast tests, no DB (v2-core/tests/unit/)
|
|
24
|
-
* - **integration**: DB tests with fixtures (v2-core/tests/integration/)
|
|
25
|
-
* - **api**: HTTP fetch tests against localhost:8888 (v2-core/tests/api/)
|
|
26
|
-
* - **ui**: Playwright browser tests (v2-core/tests/ui/)
|
|
27
|
-
*
|
|
28
|
-
* **Results:**
|
|
29
|
-
* All test runs are persisted to `public.test_runs` and `public.test_results`
|
|
30
|
-
* via the custom Vitest reporter (v2-core/tests/reporter.ts).
|
|
31
|
-
*
|
|
32
|
-
* **Usage:**
|
|
33
|
-
* ```bash
|
|
34
|
-
* spine test
|
|
35
|
-
* spine test unit --watch
|
|
36
|
-
* spine test integration --json
|
|
37
|
-
* spine test api
|
|
38
|
-
* spine test ui
|
|
39
|
-
* ```
|
|
40
|
-
*
|
|
41
|
-
* @seeAlso tests/reporter.ts (custom Vitest reporter)
|
|
42
|
-
* @seeAlso functions/tests.ts (API endpoint for querying results)
|
|
43
|
-
* @seeAlso pages/admin/TestingDashboard.tsx (UI for viewing results)
|
|
44
|
-
*/
|
|
45
|
-
|
|
46
|
-
import type { Command } from 'commander'
|
|
47
|
-
import { spawn } from 'child_process'
|
|
48
|
-
import { resolve, dirname } from 'path'
|
|
49
|
-
import { fileURLToPath } from 'url'
|
|
50
|
-
|
|
51
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
52
|
-
const __dirname = dirname(__filename)
|
|
53
|
-
const PROJECT_ROOT = resolve(__dirname, '../../../')
|
|
54
|
-
|
|
55
|
-
// โโโ TYPES โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
56
|
-
|
|
57
|
-
type TestSuite = 'unit' | 'integration' | 'api' | 'ui' | 'all'
|
|
58
|
-
|
|
59
|
-
// โโโ SUITE CONFIGURATION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
60
|
-
|
|
61
|
-
const SUITES: Record<string, { pattern: string; runner: 'vitest' | 'playwright' | 'node' }> = {
|
|
62
|
-
unit: { pattern: 'v2-core/tests/unit', runner: 'vitest' },
|
|
63
|
-
integration: { pattern: 'v2-core/tests/integration', runner: 'vitest' },
|
|
64
|
-
api: { pattern: 'v2-core/tests/api', runner: 'vitest' },
|
|
65
|
-
ui: { pattern: 'v2-core/tests/ui', runner: 'playwright' }
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// โโโ COMMAND REGISTRATION โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
69
|
-
|
|
70
|
-
export function registerTestCommands(program: Command) {
|
|
71
|
-
const testCmd = program
|
|
72
|
-
.command('test [suite]')
|
|
73
|
-
.description('Run Spine test suites')
|
|
74
|
-
.option('--json', 'Output as JSON')
|
|
75
|
-
.option('--watch', 'Watch mode (unit/integration only)')
|
|
76
|
-
.option('--reporter <name>', 'Vitest reporter', 'default')
|
|
77
|
-
.action(async (suiteArg: string | undefined, opts) => {
|
|
78
|
-
const suite: TestSuite = (suiteArg || 'all') as TestSuite
|
|
79
|
-
|
|
80
|
-
// Validate suite
|
|
81
|
-
if (suite !== 'all' && !SUITES[suite]) {
|
|
82
|
-
console.error(`\nโ Unknown test suite: ${suite}`)
|
|
83
|
-
console.log('Valid suites: unit, integration, api, ui, all')
|
|
84
|
-
process.exit(1)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Determine which suites to run
|
|
88
|
-
const suitesToRun = suite === 'all'
|
|
89
|
-
? ['unit', 'integration', 'api', 'ui']
|
|
90
|
-
: [suite]
|
|
91
|
-
|
|
92
|
-
console.log(`\n๐งช Running Spine test suites: ${suitesToRun.join(', ')}\n`)
|
|
93
|
-
|
|
94
|
-
const results: Array<{ suite: string; exitCode: number; passed: boolean }> = []
|
|
95
|
-
|
|
96
|
-
for (const s of suitesToRun) {
|
|
97
|
-
const config = SUITES[s]
|
|
98
|
-
console.log(`\nโถ๏ธ ${s.toUpperCase()} tests (${config.runner})`)
|
|
99
|
-
console.log('-'.repeat(40))
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
let exitCode: number
|
|
103
|
-
|
|
104
|
-
if (config.runner === 'vitest') {
|
|
105
|
-
exitCode = await runVitest(s, opts)
|
|
106
|
-
} else if (config.runner === 'playwright') {
|
|
107
|
-
exitCode = await runPlaywright(s, opts)
|
|
108
|
-
} else {
|
|
109
|
-
exitCode = await runNode(s, opts)
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
results.push({ suite: s, exitCode, passed: exitCode === 0 })
|
|
113
|
-
|
|
114
|
-
if (exitCode === 0) {
|
|
115
|
-
console.log(`โ ${s} tests passed\n`)
|
|
116
|
-
} else {
|
|
117
|
-
console.error(`โ ${s} tests failed (exit ${exitCode})\n`)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
} catch (err: any) {
|
|
121
|
-
console.error(`\nโ Error running ${s} tests:`, err.message)
|
|
122
|
-
results.push({ suite: s, exitCode: 1, passed: false })
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Summary
|
|
127
|
-
console.log('\n' + '='.repeat(50))
|
|
128
|
-
console.log('Test Run Summary')
|
|
129
|
-
console.log('='.repeat(50))
|
|
130
|
-
|
|
131
|
-
const totalPassed = results.filter(r => r.passed).length
|
|
132
|
-
const totalFailed = results.filter(r => !r.passed).length
|
|
133
|
-
|
|
134
|
-
for (const r of results) {
|
|
135
|
-
const icon = r.passed ? 'โ' : 'โ'
|
|
136
|
-
const status = r.passed ? 'PASSED' : 'FAILED'
|
|
137
|
-
console.log(`${icon} ${r.suite.padEnd(12)} ${status}`)
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
console.log()
|
|
141
|
-
console.log(`Total: ${totalPassed} passed, ${totalFailed} failed`)
|
|
142
|
-
|
|
143
|
-
// JSON output
|
|
144
|
-
if (opts.json) {
|
|
145
|
-
const jsonOutput = {
|
|
146
|
-
suites: results.map(r => ({
|
|
147
|
-
suite: r.suite,
|
|
148
|
-
status: r.passed ? 'passed' : 'failed',
|
|
149
|
-
exit_code: r.exitCode
|
|
150
|
-
})),
|
|
151
|
-
summary: {
|
|
152
|
-
total: results.length,
|
|
153
|
-
passed: totalPassed,
|
|
154
|
-
failed: totalFailed
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
console.log('\n' + JSON.stringify(jsonOutput, null, 2))
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Exit code
|
|
161
|
-
process.exit(totalFailed > 0 ? 1 : 0)
|
|
162
|
-
})
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// โโโ RUNNER IMPLEMENTATIONS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
166
|
-
|
|
167
|
-
async function runVitest(suite: string, opts: any): Promise<number> {
|
|
168
|
-
const config = SUITES[suite]
|
|
169
|
-
const args = [
|
|
170
|
-
'run',
|
|
171
|
-
config.pattern,
|
|
172
|
-
'--config', resolve(PROJECT_ROOT, 'vitest.config.ts')
|
|
173
|
-
]
|
|
174
|
-
|
|
175
|
-
if (opts.watch) {
|
|
176
|
-
args[0] = 'watch' // Replace 'run' with 'watch'
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Custom reporters - include both default and our custom reporter
|
|
180
|
-
if (opts.reporter === 'default') {
|
|
181
|
-
args.push('--reporter=default')
|
|
182
|
-
args.push('--reporter=' + resolve(PROJECT_ROOT, 'v2-core/tests/reporter.ts'))
|
|
183
|
-
} else {
|
|
184
|
-
args.push(`--reporter=${opts.reporter}`)
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return runCommand('npx', ['vitest', ...args], PROJECT_ROOT)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
async function runPlaywright(suite: string, opts: any): Promise<number> {
|
|
191
|
-
// Playwright tests run against a running dev server
|
|
192
|
-
// We need to ensure the server is running or start it
|
|
193
|
-
console.log(' (Playwright tests require dev server on localhost:8888)')
|
|
194
|
-
|
|
195
|
-
const args = ['playwright', 'test', SUITES[suite].pattern]
|
|
196
|
-
|
|
197
|
-
if (opts.json) {
|
|
198
|
-
args.push('--reporter=json')
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
return runCommand('npx', args, PROJECT_ROOT)
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
async function runNode(suite: string, opts: any): Promise<number> {
|
|
205
|
-
// For custom test scripts that aren't Vitest or Playwright
|
|
206
|
-
const args = [SUITES[suite].pattern]
|
|
207
|
-
return runCommand('node', args, PROJECT_ROOT)
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
function runCommand(command: string, args: string[], cwd: string): Promise<number> {
|
|
211
|
-
return new Promise((resolve, reject) => {
|
|
212
|
-
const proc = spawn(command, args, {
|
|
213
|
-
cwd,
|
|
214
|
-
stdio: 'inherit',
|
|
215
|
-
env: process.env,
|
|
216
|
-
shell: true
|
|
217
|
-
})
|
|
218
|
-
|
|
219
|
-
proc.on('exit', (code) => {
|
|
220
|
-
resolve(code || 0)
|
|
221
|
-
})
|
|
222
|
-
|
|
223
|
-
proc.on('error', (err) => {
|
|
224
|
-
reject(err)
|
|
225
|
-
})
|
|
226
|
-
})
|
|
227
|
-
}
|