spine-framework 0.1.61 → 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 +223 -0
- package/README.md +327 -0
- package/package.json +107 -216
- 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 -126
- 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 -72
- 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 -64
- package/scripts/app-install-cli.ts +0 -286
- package/scripts/assemble-frontend.sh +0 -79
- 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,166 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/**
|
|
3
|
-
* @module cli/commands/uninstall-app
|
|
4
|
-
* @audience installer
|
|
5
|
-
* @layer cli
|
|
6
|
-
* @stability stable
|
|
7
|
-
*
|
|
8
|
-
* `spine-framework uninstall-app <slug>` — Soft-uninstall an app.
|
|
9
|
-
*
|
|
10
|
-
* Deactivates the app's types, link types, and triggers in the database.
|
|
11
|
-
* Does NOT delete data (items, threads, etc.) — those remain for audit.
|
|
12
|
-
* Does NOT remove filesystem files — the app code stays in custom/apps/.
|
|
13
|
-
*
|
|
14
|
-
* To fully remove: manually delete the app directory after uninstall.
|
|
15
|
-
*
|
|
16
|
-
* **Usage:**
|
|
17
|
-
* ```bash
|
|
18
|
-
* spine-framework uninstall-app cortex
|
|
19
|
-
* spine-framework uninstall-app cortex --hard # Also deactivate items
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import type { Command } from 'commander'
|
|
24
|
-
import { adminDb } from '../../functions/_shared/index.ts'
|
|
25
|
-
|
|
26
|
-
interface UninstallOptions {
|
|
27
|
-
hard: boolean
|
|
28
|
-
dryRun: boolean
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async function uninstallApp(slug: string, options: UninstallOptions): Promise<void> {
|
|
32
|
-
console.log(`\n🗑️ Uninstalling app '${slug}'...\n`)
|
|
33
|
-
|
|
34
|
-
// 1. Find the app
|
|
35
|
-
const { data: app, error: appErr } = await adminDb
|
|
36
|
-
.from('apps')
|
|
37
|
-
.select('id, name')
|
|
38
|
-
.eq('slug', slug)
|
|
39
|
-
.single()
|
|
40
|
-
|
|
41
|
-
if (appErr || !app) {
|
|
42
|
-
console.error(` ❌ App '${slug}' not found in database`)
|
|
43
|
-
process.exit(1)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const appId = app.id
|
|
47
|
-
|
|
48
|
-
// 2. Deactivate types
|
|
49
|
-
if (options.dryRun) {
|
|
50
|
-
const { data: types } = await adminDb
|
|
51
|
-
.from('types').select('slug').eq('app_id', appId).eq('is_active', true)
|
|
52
|
-
console.log(` [dry-run] Would deactivate ${types?.length || 0} types`)
|
|
53
|
-
} else {
|
|
54
|
-
const { data: updated } = await adminDb
|
|
55
|
-
.from('types')
|
|
56
|
-
.update({ is_active: false })
|
|
57
|
-
.eq('app_id', appId)
|
|
58
|
-
.eq('is_active', true)
|
|
59
|
-
.select('id')
|
|
60
|
-
|
|
61
|
-
console.log(` ✓ Deactivated ${updated?.length || 0} types`)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// 3. Deactivate link types
|
|
65
|
-
if (options.dryRun) {
|
|
66
|
-
const { data: lt } = await adminDb
|
|
67
|
-
.from('link_types').select('slug').eq('app_id', appId).eq('is_active', true)
|
|
68
|
-
console.log(` [dry-run] Would deactivate ${lt?.length || 0} link types`)
|
|
69
|
-
} else {
|
|
70
|
-
const { data: updated } = await adminDb
|
|
71
|
-
.from('link_types')
|
|
72
|
-
.update({ is_active: false })
|
|
73
|
-
.eq('app_id', appId)
|
|
74
|
-
.eq('is_active', true)
|
|
75
|
-
.select('id')
|
|
76
|
-
|
|
77
|
-
console.log(` ✓ Deactivated ${updated?.length || 0} link types`)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// 4. Deactivate triggers
|
|
81
|
-
if (options.dryRun) {
|
|
82
|
-
const { data: triggers } = await adminDb
|
|
83
|
-
.from('triggers').select('name').eq('app_id', appId).eq('is_active', true)
|
|
84
|
-
console.log(` [dry-run] Would deactivate ${triggers?.length || 0} triggers`)
|
|
85
|
-
} else {
|
|
86
|
-
const { data: updated } = await adminDb
|
|
87
|
-
.from('triggers')
|
|
88
|
-
.update({ is_active: false })
|
|
89
|
-
.eq('app_id', appId)
|
|
90
|
-
.eq('is_active', true)
|
|
91
|
-
.select('id')
|
|
92
|
-
|
|
93
|
-
console.log(` ✓ Deactivated ${updated?.length || 0} triggers`)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// 5. Hard mode: deactivate items of this app's types
|
|
97
|
-
if (options.hard) {
|
|
98
|
-
if (options.dryRun) {
|
|
99
|
-
const { data: types } = await adminDb
|
|
100
|
-
.from('types').select('id').eq('app_id', appId)
|
|
101
|
-
const typeIds = types?.map(t => t.id) || []
|
|
102
|
-
if (typeIds.length > 0) {
|
|
103
|
-
const { data: items } = await adminDb
|
|
104
|
-
.from('items').select('id').in('type_id', typeIds).eq('is_active', true)
|
|
105
|
-
console.log(` [dry-run] Would deactivate ${items?.length || 0} items (--hard)`)
|
|
106
|
-
}
|
|
107
|
-
} else {
|
|
108
|
-
const { data: types } = await adminDb
|
|
109
|
-
.from('types').select('id').eq('app_id', appId)
|
|
110
|
-
const typeIds = types?.map(t => t.id) || []
|
|
111
|
-
|
|
112
|
-
if (typeIds.length > 0) {
|
|
113
|
-
const { data: updated } = await adminDb
|
|
114
|
-
.from('items')
|
|
115
|
-
.update({ is_active: false })
|
|
116
|
-
.in('type_id', typeIds)
|
|
117
|
-
.eq('is_active', true)
|
|
118
|
-
.select('id')
|
|
119
|
-
|
|
120
|
-
console.log(` ✓ Deactivated ${updated?.length || 0} items (--hard)`)
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// 6. Mark installation as disabled
|
|
126
|
-
if (!options.dryRun) {
|
|
127
|
-
await adminDb
|
|
128
|
-
.from('app_installations')
|
|
129
|
-
.update({ is_enabled: false, updated_at: new Date().toISOString() })
|
|
130
|
-
.eq('app_slug', slug)
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// 7. Deactivate app record
|
|
134
|
-
if (!options.dryRun) {
|
|
135
|
-
await adminDb
|
|
136
|
-
.from('apps')
|
|
137
|
-
.update({ is_active: false })
|
|
138
|
-
.eq('id', appId)
|
|
139
|
-
|
|
140
|
-
console.log(` ✓ App '${slug}' deactivated`)
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
console.log(`\n✅ App '${app.name}' uninstalled (soft-delete)`)
|
|
144
|
-
if (!options.hard) {
|
|
145
|
-
console.log(` Items created by this app are preserved.`)
|
|
146
|
-
console.log(` Use --hard to also deactivate items.`)
|
|
147
|
-
}
|
|
148
|
-
console.log(` App files remain in custom/apps/${slug}/ — delete manually if desired.`)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export function registerUninstallAppCommands(program: Command) {
|
|
152
|
-
program
|
|
153
|
-
.command('uninstall-app <slug>')
|
|
154
|
-
.description('Soft-uninstall an app (deactivate types, triggers, link types)')
|
|
155
|
-
.option('--hard', 'Also deactivate items created by this app', false)
|
|
156
|
-
.option('--dry-run', 'Show what would happen without making changes', false)
|
|
157
|
-
.action(async (slug, opts) => {
|
|
158
|
-
try {
|
|
159
|
-
await uninstallApp(slug, opts)
|
|
160
|
-
} catch (err: any) {
|
|
161
|
-
console.error('Error:', err.message)
|
|
162
|
-
if (process.env.SPINE_CLI_DEBUG) console.error(err.stack)
|
|
163
|
-
process.exit(1)
|
|
164
|
-
}
|
|
165
|
-
})
|
|
166
|
-
}
|
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/**
|
|
3
|
-
* @module cli/context
|
|
4
|
-
* @audience installer
|
|
5
|
-
* @layer cli
|
|
6
|
-
* @stability stable
|
|
7
|
-
*
|
|
8
|
-
* CLI context builder and output utilities. This is the CLI equivalent of
|
|
9
|
-
* `createHandler()` in `middleware.ts` — it resolves the principal, picks the
|
|
10
|
-
* correct Supabase client, and returns a `CoreContext` that every CLI command
|
|
11
|
-
* passes directly to core functions.
|
|
12
|
-
*
|
|
13
|
-
* **Environment variables read from `.xenv` or `process.env`:**
|
|
14
|
-
* | Variable | Required | Purpose |
|
|
15
|
-
* |---------------------------|----------|------------------------------------|
|
|
16
|
-
* | `SUPABASE_URL` | yes | Project API URL |
|
|
17
|
-
* | `SUPABASE_SERVICE_ROLE_KEY` | yes | Service-role client (admin ops) |
|
|
18
|
-
* | `SUPABASE_ANON_KEY` | yes | User-scoped client (JWT mode) |
|
|
19
|
-
* | `SPINE_CLI_ACCOUNT_ID` | no | Default account scope |
|
|
20
|
-
* | `SPINE_CLI_JWT` | no | Human principal (Supabase JWT) |
|
|
21
|
-
* | `SPINE_CLI_API_KEY` | no | Machine principal (hashed key) |
|
|
22
|
-
* | `SPINE_CLI_DEBUG` | no | Print stack traces on error |
|
|
23
|
-
*
|
|
24
|
-
* **Principal resolution priority** (first match wins):
|
|
25
|
-
* 1. `SPINE_CLI_JWT` → human principal (RLS-scoped `getUserDb`)
|
|
26
|
-
* 2. `SPINE_CLI_API_KEY` → machine principal (`adminDb`)
|
|
27
|
-
* 3. Fallback → `SYSTEM_PRINCIPAL` (`adminDb` — admin ops only)
|
|
28
|
-
*
|
|
29
|
-
* @seeAlso functions/_shared/middleware.ts (createHandler — server-side equivalent)
|
|
30
|
-
* @seeAlso functions/_shared/principal.ts (Principal type and SYSTEM_PRINCIPAL)
|
|
31
|
-
* @seeAlso cli/index.ts (entry point that imports all commands)
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
import { readFileSync, existsSync } from 'fs'
|
|
35
|
-
import { resolve, dirname } from 'path'
|
|
36
|
-
import { fileURLToPath } from 'url'
|
|
37
|
-
import { CoreContext, adminDb, SYSTEM_PRINCIPAL, Principal, getUserDb } from '../functions/_shared/index.ts'
|
|
38
|
-
|
|
39
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
40
|
-
const __dirname = dirname(__filename)
|
|
41
|
-
|
|
42
|
-
// ─── ENV LOADING ────────────────────────────────────────────────────────────
|
|
43
|
-
|
|
44
|
-
// ─── CHUNK_START: CLI_CONTEXT_LOAD_ENV ──────────────────────────────────────────────
|
|
45
|
-
/**
|
|
46
|
-
* @chunk-id CLI_CONTEXT_LOAD_ENV_1_0_0
|
|
47
|
-
* @version 1.0.0
|
|
48
|
-
* @hash 0adefa52a0c93821ee538ffe32a4069061bd75e7cada7175b11be3e11027e369
|
|
49
|
-
* @macro Environment Variable Loader
|
|
50
|
-
* @micro Reads .xenv file and populates process.env with missing vars
|
|
51
|
-
* @inputs none — reads from .xenv file path
|
|
52
|
-
* @outputs void — mutates process.env
|
|
53
|
-
* @depends-on [fs, path]
|
|
54
|
-
* @depended-by [buildCliContext]
|
|
55
|
-
* @side-effects [mutates process.env, file system reads]
|
|
56
|
-
* @tags environment, configuration, cli, dotenv
|
|
57
|
-
*/
|
|
58
|
-
function loadEnv() {
|
|
59
|
-
const envPath = resolve(__dirname, '../.xenv')
|
|
60
|
-
if (existsSync(envPath)) {
|
|
61
|
-
const lines = readFileSync(envPath, 'utf8').split('\n')
|
|
62
|
-
for (const line of lines) {
|
|
63
|
-
const trimmed = line.trim()
|
|
64
|
-
if (!trimmed || trimmed.startsWith('#')) continue
|
|
65
|
-
const eqIdx = trimmed.indexOf('=')
|
|
66
|
-
if (eqIdx === -1) continue
|
|
67
|
-
const key = trimmed.slice(0, eqIdx).trim()
|
|
68
|
-
const value = trimmed.slice(eqIdx + 1).trim().replace(/^["']|["']$/g, '')
|
|
69
|
-
if (!process.env[key]) {
|
|
70
|
-
process.env[key] = value
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// ─── CHUNK_END: CLI_CONTEXT_LOAD_ENV ────────────────────────────────────────────────
|
|
76
|
-
|
|
77
|
-
// ─── TYPES ──────────────────────────────────────────────────────────────────
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Options passed from CLI command `.action()` callbacks to `buildCliContext`.
|
|
81
|
-
*
|
|
82
|
-
* @inputSpec account: string | undefined — UUID of the target account; overrides
|
|
83
|
-
* `SPINE_CLI_ACCOUNT_ID` if both are present.
|
|
84
|
-
* @calledBy All `registerXxxCommands` functions before calling core functions
|
|
85
|
-
*/
|
|
86
|
-
export interface CliOptions {
|
|
87
|
-
account?: string
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// ─── CONTEXT BUILDER ─────────────────────────────────────────────────────────
|
|
91
|
-
|
|
92
|
-
// ─── CHUNK_START: CLI_CONTEXT_BUILD ──────────────────────────────────────────────
|
|
93
|
-
/**
|
|
94
|
-
* @chunk-id CLI_CONTEXT_BUILD_1_0_0
|
|
95
|
-
* @version 1.0.0
|
|
96
|
-
* @hash 501162983b1b24e9a15267ca7b8398b3733f540b2a65a96d8277ec3d780f2003
|
|
97
|
-
* @macro CLI Context Builder
|
|
98
|
-
* @micro Constructs CoreContext with principal resolution and Supabase client
|
|
99
|
-
* @inputs opts: CliOptions — Optional overrides including account ID
|
|
100
|
-
* @outputs CoreContext — Fully resolved context with principal, DB client, and request ID
|
|
101
|
-
* @depends-on [loadEnv, adminDb, getUserDb, SYSTEM_PRINCIPAL]
|
|
102
|
-
* @depended-by [All CLI command handlers]
|
|
103
|
-
* @side-effects [DB queries, environment reads, crypto.randomUUID]
|
|
104
|
-
* @tags cli, authentication, principal-resolution, context
|
|
105
|
-
*/
|
|
106
|
-
export async function buildCliContext(opts: CliOptions = {}): Promise<CoreContext> {
|
|
107
|
-
loadEnv()
|
|
108
|
-
|
|
109
|
-
if (!process.env.SUPABASE_URL || !process.env.SUPABASE_SERVICE_ROLE_KEY) {
|
|
110
|
-
throw new Error(
|
|
111
|
-
'Missing required env vars: SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY.\n' +
|
|
112
|
-
'Set them in v2-core/.xenv or export them before running spine commands.'
|
|
113
|
-
)
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const accountId = opts.account || process.env.SPINE_CLI_ACCOUNT_ID || null
|
|
117
|
-
const requestId = crypto.randomUUID()
|
|
118
|
-
|
|
119
|
-
// Machine API key auth
|
|
120
|
-
const apiKey = process.env.SPINE_CLI_API_KEY
|
|
121
|
-
if (apiKey) {
|
|
122
|
-
const { data: keyRecord } = await adminDb
|
|
123
|
-
.from('api_keys')
|
|
124
|
-
.select('id, account_id, scopes, principal_id')
|
|
125
|
-
.eq('key_hash', apiKey)
|
|
126
|
-
.eq('is_active', true)
|
|
127
|
-
.single()
|
|
128
|
-
|
|
129
|
-
if (!keyRecord) {
|
|
130
|
-
throw new Error('Invalid or inactive SPINE_CLI_API_KEY')
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const principal: Principal = {
|
|
134
|
-
id: keyRecord.principal_id || keyRecord.id,
|
|
135
|
-
type: 'machine',
|
|
136
|
-
accountId: keyRecord.account_id,
|
|
137
|
-
scopes: keyRecord.scopes || [],
|
|
138
|
-
provenance: {
|
|
139
|
-
sourceType: 'api_key',
|
|
140
|
-
createdBy: null,
|
|
141
|
-
apiKeyId: keyRecord.id,
|
|
142
|
-
invokedAt: new Date().toISOString()
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return {
|
|
147
|
-
principal,
|
|
148
|
-
accountId: accountId || keyRecord.account_id,
|
|
149
|
-
db: adminDb,
|
|
150
|
-
requestId
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// JWT auth (human principal)
|
|
155
|
-
const jwt = process.env.SPINE_CLI_JWT
|
|
156
|
-
if (jwt) {
|
|
157
|
-
const userDb = getUserDb(jwt)
|
|
158
|
-
const { data: { user } } = await userDb.auth.getUser()
|
|
159
|
-
|
|
160
|
-
if (!user) {
|
|
161
|
-
throw new Error('Invalid or expired SPINE_CLI_JWT')
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const { data: person } = await adminDb
|
|
165
|
-
.from('people')
|
|
166
|
-
.select('id, full_name, email, roles:people_roles(role:roles(slug))')
|
|
167
|
-
.eq('auth_user_id', user.id)
|
|
168
|
-
.single()
|
|
169
|
-
|
|
170
|
-
const roles = (person?.roles as any[])?.map((r: any) => r.role?.slug).filter(Boolean) || []
|
|
171
|
-
|
|
172
|
-
const principal: Principal = {
|
|
173
|
-
id: person?.id || user.id,
|
|
174
|
-
type: 'human',
|
|
175
|
-
accountId: accountId,
|
|
176
|
-
displayName: person?.full_name || user.email,
|
|
177
|
-
email: person?.email || user.email,
|
|
178
|
-
roles,
|
|
179
|
-
provenance: {
|
|
180
|
-
sourceType: 'jwt',
|
|
181
|
-
createdBy: person?.id || user.id,
|
|
182
|
-
invokedAt: new Date().toISOString()
|
|
183
|
-
},
|
|
184
|
-
authContext: { jwt }
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return {
|
|
188
|
-
principal,
|
|
189
|
-
accountId,
|
|
190
|
-
db: userDb,
|
|
191
|
-
requestId
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// Fallback: system principal (admin ops)
|
|
196
|
-
return {
|
|
197
|
-
principal: SYSTEM_PRINCIPAL,
|
|
198
|
-
accountId,
|
|
199
|
-
db: adminDb,
|
|
200
|
-
requestId
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// ─── CHUNK_END: CLI_CONTEXT_BUILD ────────────────────────────────────────────────
|
|
204
|
-
|
|
205
|
-
// ─── OUTPUT UTILITIES ─────────────────────────────────────────────────────────
|
|
206
|
-
|
|
207
|
-
// ─── CHUNK_START: CLI_CONTEXT_PRINT_RESULT ──────────────────────────────────────────────
|
|
208
|
-
/**
|
|
209
|
-
* @chunk-id CLI_CONTEXT_PRINT_RESULT_1_0_0
|
|
210
|
-
* @version 1.0.0
|
|
211
|
-
* @hash 06e492defa9012290a5c8b2d4fca27f01df11bdc194ffbdf4f4b4518aa683c2b
|
|
212
|
-
* @macro CLI Output Formatter
|
|
213
|
-
* @micro Pretty-prints query results as JSON or ASCII tables
|
|
214
|
-
* @inputs data: any — Result data to display (array or single value)
|
|
215
|
-
* @inputs opts: { json?: boolean } — Output format options
|
|
216
|
-
* @outputs void — Console output only
|
|
217
|
-
* @depends-on [console, JSON]
|
|
218
|
-
* @depended-by [All CLI command list/get handlers]
|
|
219
|
-
* @side-effects [console.log output]
|
|
220
|
-
* @tags cli, output, formatting, tables, json
|
|
221
|
-
*/
|
|
222
|
-
export function printResult(data: any, opts: { json?: boolean } = {}) {
|
|
223
|
-
if (opts.json) {
|
|
224
|
-
console.log(JSON.stringify(data, null, 2))
|
|
225
|
-
return
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
if (Array.isArray(data)) {
|
|
229
|
-
if (data.length === 0) {
|
|
230
|
-
console.log('(no results)')
|
|
231
|
-
return
|
|
232
|
-
}
|
|
233
|
-
const keys = Object.keys(data[0])
|
|
234
|
-
const rows = data.map(row => keys.map(k => String(row[k] ?? '')))
|
|
235
|
-
const widths = keys.map((k, i) => Math.max(k.length, ...rows.map(r => r[i].length)))
|
|
236
|
-
const hr = widths.map(w => '-'.repeat(w)).join(' ')
|
|
237
|
-
console.log(keys.map((k, i) => k.padEnd(widths[i])).join(' '))
|
|
238
|
-
console.log(hr)
|
|
239
|
-
rows.forEach(row => console.log(row.map((v, i) => v.padEnd(widths[i])).join(' ')))
|
|
240
|
-
console.log(`\n(${data.length} row${data.length !== 1 ? 's' : ''})`)
|
|
241
|
-
} else {
|
|
242
|
-
console.log(JSON.stringify(data, null, 2))
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
// ─── CHUNK_END: CLI_CONTEXT_PRINT_RESULT ────────────────────────────────────────────────
|
|
246
|
-
|
|
247
|
-
// ─── CHUNK_START: CLI_CONTEXT_HANDLE_ERROR ──────────────────────────────────────────────
|
|
248
|
-
/**
|
|
249
|
-
* @chunk-id CLI_CONTEXT_HANDLE_ERROR_1_0_0
|
|
250
|
-
* @version 1.0.0
|
|
251
|
-
* @hash 61aca7e4bce61b5b790e8f27ef3f505a6a6fe9a8cd6643e577f610d9dd15b1cd
|
|
252
|
-
* @macro CLI Error Handler
|
|
253
|
-
* @micro Prints formatted error and exits with proper debug information
|
|
254
|
-
* @inputs err: any — Error object or string message
|
|
255
|
-
* @outputs void — Process termination (exit code 1)
|
|
256
|
-
* @depends-on [console, process]
|
|
257
|
-
* @depended-by [All CLI command action handlers]
|
|
258
|
-
* @side-effects [console.error output, process.exit]
|
|
259
|
-
* @tags cli, error-handling, debug, process-exit
|
|
260
|
-
*/
|
|
261
|
-
export function handleError(err: any) {
|
|
262
|
-
console.error(`\nError: ${err.message || err}`)
|
|
263
|
-
if (process.env.SPINE_CLI_DEBUG) {
|
|
264
|
-
console.error(err.stack)
|
|
265
|
-
}
|
|
266
|
-
process.exit(1)
|
|
267
|
-
}
|
|
268
|
-
// ─── CHUNK_END: CLI_CONTEXT_HANDLE_ERROR ────────────────────────────────────────────────
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/**
|
|
3
|
-
* @module cli/env-loader
|
|
4
|
-
* @audience installer
|
|
5
|
-
* @layer cli
|
|
6
|
-
* @stability stable
|
|
7
|
-
*
|
|
8
|
-
* Side-effect module: loads `v2-core/.xenv` into `process.env` before any
|
|
9
|
-
* other CLI module is imported. Must be the first import in `cli/index.ts`
|
|
10
|
-
* so that `db.ts` (which reads env vars at module-load time) sees the values.
|
|
11
|
-
*
|
|
12
|
-
* @sideEffects Mutates process.env — only sets keys not already present
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { readFileSync, existsSync } from 'fs'
|
|
16
|
-
import { resolve, dirname } from 'path'
|
|
17
|
-
import { fileURLToPath } from 'url'
|
|
18
|
-
|
|
19
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
20
|
-
const __dirname = dirname(__filename)
|
|
21
|
-
|
|
22
|
-
const envPath = resolve(__dirname, '../.xenv')
|
|
23
|
-
if (existsSync(envPath)) {
|
|
24
|
-
const lines = readFileSync(envPath, 'utf8').split('\n')
|
|
25
|
-
for (const line of lines) {
|
|
26
|
-
const trimmed = line.trim()
|
|
27
|
-
if (!trimmed || trimmed.startsWith('#')) continue
|
|
28
|
-
const eqIdx = trimmed.indexOf('=')
|
|
29
|
-
if (eqIdx === -1) continue
|
|
30
|
-
const key = trimmed.slice(0, eqIdx).trim()
|
|
31
|
-
const value = trimmed.slice(eqIdx + 1).trim().replace(/^["']|["']$/g, '')
|
|
32
|
-
if (!process.env[key]) {
|
|
33
|
-
process.env[key] = value
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
package/.framework/cli/index.ts
DELETED
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
/**
|
|
4
|
-
* @module cli/index
|
|
5
|
-
* @audience installer
|
|
6
|
-
* @layer cli
|
|
7
|
-
* @stability stable
|
|
8
|
-
*
|
|
9
|
-
* Spine CLI entry point (`npx spine-framework`). Registers all command groups via
|
|
10
|
-
* Commander and delegates each subcommand to the same core logic used by
|
|
11
|
-
* API handlers and direct imports. No business logic lives here — only
|
|
12
|
-
* command registration and top-level error handling.
|
|
13
|
-
*
|
|
14
|
-
* **Command groups registered:**
|
|
15
|
-
* | Group | File |
|
|
16
|
-
* |-------------|----------------------------|
|
|
17
|
-
* | auth | commands/auth.ts |
|
|
18
|
-
* | pipelines | commands/pipelines.ts |
|
|
19
|
-
* | items | commands/items.ts |
|
|
20
|
-
* | agents | commands/agents.ts |
|
|
21
|
-
* | migrations | commands/migrations.ts |
|
|
22
|
-
* | init | commands/init.ts |
|
|
23
|
-
* | install-app | commands/install-app.ts |
|
|
24
|
-
* | status | commands/status.ts |
|
|
25
|
-
* | uninstall | commands/uninstall-app.ts |
|
|
26
|
-
*
|
|
27
|
-
* **Usage:**
|
|
28
|
-
* ```bash
|
|
29
|
-
* npx spine-framework --help
|
|
30
|
-
* npx spine-framework auth whoami
|
|
31
|
-
* npx spine-framework pipelines run <id> --data '{"key":"value"}'
|
|
32
|
-
* npx spine-framework items list --type support_ticket
|
|
33
|
-
* npx spine-framework items get <id>
|
|
34
|
-
* npx spine-framework agents run <thread-id> --message "Hello"
|
|
35
|
-
* npx spine-framework migrations list
|
|
36
|
-
* ```
|
|
37
|
-
*
|
|
38
|
-
* @seeAlso cli/context.ts (buildCliContext — constructs CoreContext for every command)
|
|
39
|
-
* @seeAlso functions/_shared/index.ts (core functions exposed to CLI)
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
import { Command } from 'commander'
|
|
43
|
-
|
|
44
|
-
const program = new Command()
|
|
45
|
-
|
|
46
|
-
program
|
|
47
|
-
.name('spine-framework')
|
|
48
|
-
.description('Spine v2 CLI — interact with your Spine instance from the terminal or agentic IDE')
|
|
49
|
-
.version('2.0.0')
|
|
50
|
-
.option('--account <id>', 'Override the account ID for this command')
|
|
51
|
-
|
|
52
|
-
// Commands that do NOT need DB/env — safe to run on a fresh install
|
|
53
|
-
const { registerInitCommands } = await import('./commands/init.ts')
|
|
54
|
-
const { registerMigrateCommands } = await import('./commands/migrate.ts')
|
|
55
|
-
registerInitCommands(program)
|
|
56
|
-
registerMigrateCommands(program)
|
|
57
|
-
|
|
58
|
-
// All other commands require SUPABASE_URL to be set — only load if not init/migrate
|
|
59
|
-
const subcommand = process.argv[2]
|
|
60
|
-
const noDbCommands = ['init', 'migrate', '--help', '-h', '--version', '-V', undefined]
|
|
61
|
-
|
|
62
|
-
if (!noDbCommands.includes(subcommand)) {
|
|
63
|
-
await import('./env-loader.ts')
|
|
64
|
-
|
|
65
|
-
const [
|
|
66
|
-
{ registerAuthCommands },
|
|
67
|
-
{ registerPipelineCommands },
|
|
68
|
-
{ registerItemCommands },
|
|
69
|
-
{ registerAgentCommands },
|
|
70
|
-
{ registerMigrationCommands },
|
|
71
|
-
{ registerDoctorCommands },
|
|
72
|
-
{ registerDevCommands },
|
|
73
|
-
{ registerTestCommands },
|
|
74
|
-
{ registerSystemCommands },
|
|
75
|
-
{ registerGenerateCommands },
|
|
76
|
-
{ registerCreateAppCommands },
|
|
77
|
-
{ registerInstallAppCommands },
|
|
78
|
-
{ registerStatusCommands },
|
|
79
|
-
{ registerUninstallAppCommands },
|
|
80
|
-
] = await Promise.all([
|
|
81
|
-
import('./commands/auth.ts'),
|
|
82
|
-
import('./commands/pipelines.ts'),
|
|
83
|
-
import('./commands/items.ts'),
|
|
84
|
-
import('./commands/agents.ts'),
|
|
85
|
-
import('./commands/migrations.ts'),
|
|
86
|
-
import('./commands/doctor.ts'),
|
|
87
|
-
import('./commands/dev.ts'),
|
|
88
|
-
import('./commands/test.ts'),
|
|
89
|
-
import('./commands/system.ts'),
|
|
90
|
-
import('./commands/generate.ts'),
|
|
91
|
-
import('./commands/create-app.ts'),
|
|
92
|
-
import('./commands/install-app.ts'),
|
|
93
|
-
import('./commands/status.ts'),
|
|
94
|
-
import('./commands/uninstall-app.ts'),
|
|
95
|
-
])
|
|
96
|
-
|
|
97
|
-
registerAuthCommands(program)
|
|
98
|
-
registerPipelineCommands(program)
|
|
99
|
-
registerItemCommands(program)
|
|
100
|
-
registerAgentCommands(program)
|
|
101
|
-
registerMigrationCommands(program)
|
|
102
|
-
registerDoctorCommands(program)
|
|
103
|
-
registerDevCommands(program)
|
|
104
|
-
registerTestCommands(program)
|
|
105
|
-
registerSystemCommands(program)
|
|
106
|
-
registerGenerateCommands(program)
|
|
107
|
-
registerCreateAppCommands(program)
|
|
108
|
-
registerInstallAppCommands(program)
|
|
109
|
-
registerStatusCommands(program)
|
|
110
|
-
registerUninstallAppCommands(program)
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
program.parseAsync(process.argv).catch((err) => {
|
|
114
|
-
console.error('Error:', err.message)
|
|
115
|
-
process.exit(1)
|
|
116
|
-
})
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Postinstall welcome message — runs automatically after npm install spine-framework.
|
|
3
|
-
// Tells the agent (or developer) exactly what to do next.
|
|
4
|
-
// Uses only Node built-ins — no dependencies.
|
|
5
|
-
|
|
6
|
-
const lines = [
|
|
7
|
-
'',
|
|
8
|
-
'╭──────────────────────────────────────────────────────────────╮',
|
|
9
|
-
'│ │',
|
|
10
|
-
'│ ███████╗██████╗ ██╗███╗ ██╗███████╗ │',
|
|
11
|
-
'│ ██╔════╝██╔══██╗██║████╗ ██║██╔════╝ │',
|
|
12
|
-
'│ ███████╗██████╔╝██║██╔██╗ ██║█████╗ │',
|
|
13
|
-
'│ ╚════██║██╔═══╝ ██║██║╚██╗██║██╔══╝ │',
|
|
14
|
-
'│ ███████║██║ ██║██║ ╚████║███████╗ │',
|
|
15
|
-
'│ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝ Framework v0.1 │',
|
|
16
|
-
'│ │',
|
|
17
|
-
'╰──────────────────────────────────────────────────────────────╯',
|
|
18
|
-
'',
|
|
19
|
-
' Spine Framework installed successfully!',
|
|
20
|
-
'',
|
|
21
|
-
' To complete setup you need a Supabase project.',
|
|
22
|
-
' ─────────────────────────────────────────────',
|
|
23
|
-
' If you have one already, run:',
|
|
24
|
-
'',
|
|
25
|
-
' spine-framework init \\',
|
|
26
|
-
' --url https://<project>.supabase.co \\',
|
|
27
|
-
' --anon-key <anon-key> \\',
|
|
28
|
-
' --service-role-key <service-role-key>',
|
|
29
|
-
'',
|
|
30
|
-
' Your credentials are at:',
|
|
31
|
-
' Supabase Dashboard → Your Project → Settings → API',
|
|
32
|
-
'',
|
|
33
|
-
' ─────────────────────────────────────────────',
|
|
34
|
-
' If you need a Supabase project, create one at:',
|
|
35
|
-
' https://supabase.com/dashboard → New project',
|
|
36
|
-
'',
|
|
37
|
-
' After init:',
|
|
38
|
-
' spine-framework install-app <app-slug> # optional apps',
|
|
39
|
-
' npm run assemble && netlify dev # start dev server',
|
|
40
|
-
'',
|
|
41
|
-
' Docs: https://github.com/art-mojo-admin/spine',
|
|
42
|
-
'',
|
|
43
|
-
]
|
|
44
|
-
|
|
45
|
-
console.log(lines.join('\n'))
|