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,332 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/**
|
|
3
|
-
* @module cli/commands/generate
|
|
4
|
-
* @audience installer
|
|
5
|
-
* @layer cli
|
|
6
|
-
* @stability stable
|
|
7
|
-
*
|
|
8
|
-
* `spine generate` command — code scaffolding for extending Spine safely.
|
|
9
|
-
* Generates type definitions, handlers, and UI pages in v2-custom/ only.
|
|
10
|
-
*
|
|
11
|
-
* **Commands:**
|
|
12
|
-
* | Subcommand | Description |
|
|
13
|
-
* |-------------------------|-------------------------------------------------------|
|
|
14
|
-
* | `generate type <slug>` | Create new type with handler and UI stubs |
|
|
15
|
-
* | `generate function <name>` | Create new Netlify function stub |
|
|
16
|
-
*
|
|
17
|
-
* **What gets generated for `type`:**
|
|
18
|
-
* 1. Type record in database (item type by default)
|
|
19
|
-
* 2. Handler stub: `v2-custom/functions/{slug}.ts`
|
|
20
|
-
* 3. UI page stub: `v2-custom/src/pages/{slug}/index.tsx`
|
|
21
|
-
*
|
|
22
|
-
* **What gets generated for `function`:**
|
|
23
|
-
* 1. Netlify function stub: `v2-custom/functions/{name}.ts`
|
|
24
|
-
* 2. Basic handler structure with middleware imports
|
|
25
|
-
*
|
|
26
|
-
* **Usage:**
|
|
27
|
-
* ```bash
|
|
28
|
-
* spine generate type ticket-v2
|
|
29
|
-
* spine generate function webhook-handler
|
|
30
|
-
* ```
|
|
31
|
-
*
|
|
32
|
-
* @seeAlso functions/types.ts (type CRUD API)
|
|
33
|
-
* @seeAlso functions/_shared/middleware.ts (handler structure)
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
import type { Command } from 'commander'
|
|
37
|
-
import { buildCliContext, handleError } from '../context.ts'
|
|
38
|
-
import { adminDb } from '../../functions/_shared/index.ts'
|
|
39
|
-
import { existsSync, mkdirSync, writeFileSync } from 'fs'
|
|
40
|
-
import { resolve, dirname } from 'path'
|
|
41
|
-
import { fileURLToPath } from 'url'
|
|
42
|
-
|
|
43
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
44
|
-
const __dirname = dirname(__filename)
|
|
45
|
-
const PROJECT_ROOT = resolve(__dirname, '../../../')
|
|
46
|
-
|
|
47
|
-
// ─── TYPE GENERATION ─────────────────────────────────────────────────────────
|
|
48
|
-
|
|
49
|
-
async function generateType(ctx: any, slug: string, options: any): Promise<void> {
|
|
50
|
-
const name = options.name || slug.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ')
|
|
51
|
-
const kind = options.kind || 'item'
|
|
52
|
-
const description = options.description || `${name} type generated by spine CLI`
|
|
53
|
-
|
|
54
|
-
console.log(`\n🔧 Generating type '${slug}'...`)
|
|
55
|
-
|
|
56
|
-
// Step 1: Create type record in database
|
|
57
|
-
console.log(' Step 1: Creating type record in database...')
|
|
58
|
-
|
|
59
|
-
const { data: existing, error: checkErr } = await adminDb
|
|
60
|
-
.from('types')
|
|
61
|
-
.select('id')
|
|
62
|
-
.eq('slug', slug)
|
|
63
|
-
.eq('kind', kind)
|
|
64
|
-
.single()
|
|
65
|
-
|
|
66
|
-
if (checkErr && checkErr.code !== 'PGRST116') { // PGRST116 = not found
|
|
67
|
-
throw new Error(`Failed to check existing type: ${checkErr.message}`)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (existing) {
|
|
71
|
-
console.log(` ⚠️ Type '${slug}' already exists (skipping DB creation)`)
|
|
72
|
-
} else {
|
|
73
|
-
const designSchema = {
|
|
74
|
-
fields: {
|
|
75
|
-
title: {
|
|
76
|
-
type: 'string',
|
|
77
|
-
required: true,
|
|
78
|
-
label: 'Title',
|
|
79
|
-
description: `Title for this ${name}`
|
|
80
|
-
},
|
|
81
|
-
status: {
|
|
82
|
-
type: 'select',
|
|
83
|
-
options: ['open', 'in_progress', 'closed'],
|
|
84
|
-
default: 'open',
|
|
85
|
-
label: 'Status'
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
layout: {
|
|
89
|
-
detail: ['title', 'status'],
|
|
90
|
-
list: ['title', 'status']
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const { error: insertErr } = await adminDb
|
|
95
|
-
.from('types')
|
|
96
|
-
.insert({
|
|
97
|
-
kind,
|
|
98
|
-
slug,
|
|
99
|
-
name,
|
|
100
|
-
description,
|
|
101
|
-
design_schema: designSchema,
|
|
102
|
-
validation_schema: {},
|
|
103
|
-
ownership: 'system',
|
|
104
|
-
is_active: true
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
if (insertErr) {
|
|
108
|
-
throw new Error(`Failed to create type: ${insertErr.message}`)
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
console.log(' ✓ Type record created')
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Step 2: Generate handler stub
|
|
115
|
-
console.log(' Step 2: Generating handler stub...')
|
|
116
|
-
const handlerPath = resolve(PROJECT_ROOT, `v2-custom/functions/${slug}.ts`)
|
|
117
|
-
|
|
118
|
-
if (existsSync(handlerPath) && !options.force) {
|
|
119
|
-
console.log(` ⚠️ Handler stub already exists: ${handlerPath}`)
|
|
120
|
-
} else {
|
|
121
|
-
const handlerCode = generateHandlerStub(slug, kind, name)
|
|
122
|
-
writeFileSync(handlerPath, handlerCode)
|
|
123
|
-
console.log(` ✓ Handler stub created: v2-custom/functions/${slug}.ts`)
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Step 3: Generate UI page stub
|
|
127
|
-
console.log(' Step 3: Generating UI page stub...')
|
|
128
|
-
const pageDir = resolve(PROJECT_ROOT, `v2-custom/src/pages/${slug}`)
|
|
129
|
-
const pagePath = resolve(pageDir, 'index.tsx')
|
|
130
|
-
|
|
131
|
-
if (existsSync(pagePath) && !options.force) {
|
|
132
|
-
console.log(` ⚠️ UI page stub already exists: ${pagePath}`)
|
|
133
|
-
} else {
|
|
134
|
-
mkdirSync(pageDir, { recursive: true })
|
|
135
|
-
const pageCode = generatePageStub(slug, name, kind)
|
|
136
|
-
writeFileSync(pagePath, pageCode)
|
|
137
|
-
console.log(` ✓ UI page stub created: v2-custom/src/pages/${slug}/index.tsx`)
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
console.log(`\n✅ Type '${slug}' generation complete!`)
|
|
141
|
-
console.log(` Next steps:`)
|
|
142
|
-
console.log(` 1. Edit v2-custom/functions/${slug}.ts to implement custom logic`)
|
|
143
|
-
console.log(` 2. Edit v2-custom/src/pages/${slug}/index.tsx to customize the UI`)
|
|
144
|
-
console.log(` 3. Run 'spine dev' to see your changes`)
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
function generateHandlerStub(slug: string, kind: string, name: string): string {
|
|
148
|
-
return `/**
|
|
149
|
-
* @module ${slug}
|
|
150
|
-
* @audience custom
|
|
151
|
-
* @layer api-handler
|
|
152
|
-
* @stability experimental
|
|
153
|
-
*
|
|
154
|
-
* Custom handler for ${name} (${kind} type).
|
|
155
|
-
* Generated by spine CLI on ${new Date().toISOString()}.
|
|
156
|
-
*
|
|
157
|
-
* Extend this handler to add custom logic for your type.
|
|
158
|
-
*/
|
|
159
|
-
|
|
160
|
-
import { createHandler } from '../v2-core/functions/_shared/middleware'
|
|
161
|
-
|
|
162
|
-
export const handler = createHandler(async (ctx) => {
|
|
163
|
-
const method = ctx.query?.method || 'GET'
|
|
164
|
-
|
|
165
|
-
switch (method) {
|
|
166
|
-
case 'GET':
|
|
167
|
-
// TODO: Implement GET logic
|
|
168
|
-
return { message: '${name} handler - GET not implemented' }
|
|
169
|
-
|
|
170
|
-
case 'POST':
|
|
171
|
-
// TODO: Implement POST logic
|
|
172
|
-
return { message: '${name} handler - POST not implemented' }
|
|
173
|
-
|
|
174
|
-
case 'PATCH':
|
|
175
|
-
// TODO: Implement PATCH logic
|
|
176
|
-
return { message: '${name} handler - PATCH not implemented' }
|
|
177
|
-
|
|
178
|
-
case 'DELETE':
|
|
179
|
-
// TODO: Implement DELETE logic
|
|
180
|
-
return { message: '${name} handler - DELETE not implemented' }
|
|
181
|
-
|
|
182
|
-
default:
|
|
183
|
-
throw new Error('Unsupported method: ' + method)
|
|
184
|
-
}
|
|
185
|
-
})
|
|
186
|
-
`
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
function generatePageStub(slug: string, name: string, kind: string): string {
|
|
190
|
-
return `/**
|
|
191
|
-
* @page ${slug}/index
|
|
192
|
-
* @audience custom
|
|
193
|
-
* @layer page
|
|
194
|
-
* @stability experimental
|
|
195
|
-
*
|
|
196
|
-
* UI page for ${name} (${kind} type).
|
|
197
|
-
* Generated by spine CLI on ${new Date().toISOString()}.
|
|
198
|
-
*/
|
|
199
|
-
|
|
200
|
-
import React from 'react'
|
|
201
|
-
import { useParams } from 'react-router-dom'
|
|
202
|
-
import { useApi } from '../../v2-core/src/hooks/useApi'
|
|
203
|
-
import { apiFetch } from '../../v2-core/src/lib/api'
|
|
204
|
-
|
|
205
|
-
export default function ${name.replace(/\s+/g, '')}Page() {
|
|
206
|
-
const { id } = useParams()
|
|
207
|
-
|
|
208
|
-
const { data, loading, error } = useApi(
|
|
209
|
-
() => apiFetch('/.netlify/functions/${slug}' + (id ? '?id=' + id : '')),
|
|
210
|
-
{ immediate: true }
|
|
211
|
-
)
|
|
212
|
-
|
|
213
|
-
if (loading) return <div>Loading...</div>
|
|
214
|
-
if (error) return <div>Error: {error.message}</div>
|
|
215
|
-
|
|
216
|
-
return (
|
|
217
|
-
<div className="p-6">
|
|
218
|
-
<h1 className="text-2xl font-bold mb-4">${name}</h1>
|
|
219
|
-
<pre className="bg-gray-100 p-4 rounded">
|
|
220
|
-
{JSON.stringify(data, null, 2)}
|
|
221
|
-
</pre>
|
|
222
|
-
<p className="mt-4 text-gray-600">
|
|
223
|
-
Edit v2-custom/src/pages/${slug}/index.tsx to customize this page.
|
|
224
|
-
</p>
|
|
225
|
-
</div>
|
|
226
|
-
)
|
|
227
|
-
}
|
|
228
|
-
`
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// ─── FUNCTION GENERATION ─────────────────────────────────────────────────────
|
|
232
|
-
|
|
233
|
-
async function generateFunction(name: string, options: any): Promise<void> {
|
|
234
|
-
console.log(`\n🔧 Generating function '${name}'...`)
|
|
235
|
-
|
|
236
|
-
const handlerPath = resolve(PROJECT_ROOT, `v2-custom/functions/${name}.ts`)
|
|
237
|
-
|
|
238
|
-
if (existsSync(handlerPath) && !options.force) {
|
|
239
|
-
console.log(` ⚠️ Function already exists: ${handlerPath}`)
|
|
240
|
-
console.log(` Use --force to overwrite`)
|
|
241
|
-
return
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
const handlerCode = generateFunctionStub(name, options.description)
|
|
245
|
-
writeFileSync(handlerPath, handlerCode)
|
|
246
|
-
|
|
247
|
-
console.log(`✅ Function '${name}' created!`)
|
|
248
|
-
console.log(` Location: v2-custom/functions/${name}.ts`)
|
|
249
|
-
console.log(` Next steps:`)
|
|
250
|
-
console.log(` 1. Edit the handler to implement your logic`)
|
|
251
|
-
console.log(` 2. Run 'spine dev' to see your changes`)
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function generateFunctionStub(name: string, description?: string): string {
|
|
255
|
-
return `/**
|
|
256
|
-
* @module ${name}
|
|
257
|
-
* @audience custom
|
|
258
|
-
* @layer api-handler
|
|
259
|
-
* @stability experimental
|
|
260
|
-
*
|
|
261
|
-
* ${description || `Custom Netlify function: ${name}`}
|
|
262
|
-
* Generated by spine CLI on ${new Date().toISOString()}.
|
|
263
|
-
*/
|
|
264
|
-
|
|
265
|
-
import { createHandler } from '../v2-core/functions/_shared/middleware'
|
|
266
|
-
|
|
267
|
-
export const handler = createHandler(async (ctx) => {
|
|
268
|
-
// Access principal: ctx.principal (human, machine, or system)
|
|
269
|
-
// Access database: ctx.db (RLS-scoped) or import { adminDb } for admin access
|
|
270
|
-
// Access query params: ctx.query
|
|
271
|
-
|
|
272
|
-
const q = ctx.query || {}
|
|
273
|
-
const action = q.action || 'default'
|
|
274
|
-
|
|
275
|
-
switch (action) {
|
|
276
|
-
case 'default':
|
|
277
|
-
return {
|
|
278
|
-
message: 'Hello from ${name}',
|
|
279
|
-
principal: ctx.principal?.id,
|
|
280
|
-
timestamp: new Date().toISOString()
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// TODO: Add more actions here
|
|
284
|
-
// case 'custom':
|
|
285
|
-
// return { data: await yourCustomLogic(ctx) }
|
|
286
|
-
|
|
287
|
-
default:
|
|
288
|
-
return {
|
|
289
|
-
error: 'Unknown action: ' + action,
|
|
290
|
-
available_actions: ['default']
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
})
|
|
294
|
-
`
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
// ─── COMMAND REGISTRATION ────────────────────────────────────────────────────
|
|
298
|
-
|
|
299
|
-
export function registerGenerateCommands(program: Command) {
|
|
300
|
-
const generate = program
|
|
301
|
-
.command('generate')
|
|
302
|
-
.description('Generate code stubs for extending Spine')
|
|
303
|
-
|
|
304
|
-
generate
|
|
305
|
-
.command('type <slug>')
|
|
306
|
-
.description('Generate a new type with handler and UI stubs')
|
|
307
|
-
.option('--name <name>', 'Display name for the type')
|
|
308
|
-
.option('--kind <kind>', 'Type kind (item, account, person)', 'item')
|
|
309
|
-
.option('--description <desc>', 'Type description')
|
|
310
|
-
.option('--force', 'Overwrite existing files', false)
|
|
311
|
-
.action(async (slug, opts) => {
|
|
312
|
-
try {
|
|
313
|
-
const ctx = await buildCliContext()
|
|
314
|
-
await generateType(ctx, slug, opts)
|
|
315
|
-
} catch (err: any) {
|
|
316
|
-
handleError(err)
|
|
317
|
-
}
|
|
318
|
-
})
|
|
319
|
-
|
|
320
|
-
generate
|
|
321
|
-
.command('function <name>')
|
|
322
|
-
.description('Generate a new Netlify function stub')
|
|
323
|
-
.option('--description <desc>', 'Function description')
|
|
324
|
-
.option('--force', 'Overwrite existing file', false)
|
|
325
|
-
.action(async (name, opts) => {
|
|
326
|
-
try {
|
|
327
|
-
await generateFunction(name, opts)
|
|
328
|
-
} catch (err: any) {
|
|
329
|
-
handleError(err)
|
|
330
|
-
}
|
|
331
|
-
})
|
|
332
|
-
}
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/**
|
|
3
|
-
* @module cli/commands/init
|
|
4
|
-
* @audience installer
|
|
5
|
-
* @layer cli
|
|
6
|
-
* @stability stable
|
|
7
|
-
*
|
|
8
|
-
* `spine-framework init` — Write .env and scaffold the custom/ workspace.
|
|
9
|
-
*
|
|
10
|
-
* Intentionally does NOT touch the database — run `spine-framework migrate`
|
|
11
|
-
* after init to apply SQL migrations via a direct Postgres connection.
|
|
12
|
-
*
|
|
13
|
-
* **Usage:**
|
|
14
|
-
* ```bash
|
|
15
|
-
* spine-framework init --url https://xyz.supabase.co --anon-key eyJ... --service-role-key eyJ...
|
|
16
|
-
* spine-framework migrate --db-password <password>
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import type { Command } from 'commander'
|
|
21
|
-
import { existsSync, mkdirSync, writeFileSync, cpSync } from 'fs'
|
|
22
|
-
import { resolve, dirname } from 'path'
|
|
23
|
-
import { fileURLToPath } from 'url'
|
|
24
|
-
import { execSync } from 'child_process'
|
|
25
|
-
|
|
26
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
27
|
-
const __dirname = dirname(__filename)
|
|
28
|
-
const PROJECT_ROOT = process.cwd()
|
|
29
|
-
// Package root: node_modules/spine-framework/ — 3 levels up from .framework/cli/commands/
|
|
30
|
-
const PACKAGE_ROOT = resolve(__dirname, '../../..')
|
|
31
|
-
|
|
32
|
-
interface InitOptions {
|
|
33
|
-
dryRun: boolean
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function scaffoldCustomWorkspace(dryRun: boolean): void {
|
|
37
|
-
const dirs = [
|
|
38
|
-
'custom/apps',
|
|
39
|
-
'custom/functions',
|
|
40
|
-
'custom/components',
|
|
41
|
-
'custom/migrations',
|
|
42
|
-
'custom/tests',
|
|
43
|
-
]
|
|
44
|
-
|
|
45
|
-
for (const dir of dirs) {
|
|
46
|
-
const fullPath = resolve(PROJECT_ROOT, dir)
|
|
47
|
-
if (existsSync(fullPath)) {
|
|
48
|
-
console.log(` ⏭️ ${dir}/ already exists`)
|
|
49
|
-
} else if (dryRun) {
|
|
50
|
-
console.log(` [dry-run] Would create: ${dir}/`)
|
|
51
|
-
} else {
|
|
52
|
-
mkdirSync(fullPath, { recursive: true })
|
|
53
|
-
writeFileSync(resolve(fullPath, '.gitkeep'), '')
|
|
54
|
-
console.log(` ✓ Created ${dir}/`)
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function writeEnvFile(dryRun: boolean): void {
|
|
60
|
-
const envPath = resolve(PROJECT_ROOT, '.env')
|
|
61
|
-
|
|
62
|
-
if (existsSync(envPath)) {
|
|
63
|
-
console.log(' ⏭️ .env already exists, skipping')
|
|
64
|
-
return
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const envContent = [
|
|
68
|
-
'# ─── Supabase ────────────────────────────────────────────────────────────────',
|
|
69
|
-
'# Get these from: https://supabase.com/dashboard/project/_/settings/api',
|
|
70
|
-
'SUPABASE_URL=https://your-project.supabase.co',
|
|
71
|
-
'SUPABASE_ANON_KEY=your-anon-key',
|
|
72
|
-
'SUPABASE_SERVICE_ROLE_KEY=your-service-role-key',
|
|
73
|
-
'',
|
|
74
|
-
'# DB password for running migrations (direct Postgres connection)',
|
|
75
|
-
'# Get from: https://supabase.com/dashboard/project/_/settings/database',
|
|
76
|
-
'SUPABASE_DB_PASSWORD=your-db-password',
|
|
77
|
-
'',
|
|
78
|
-
'# ─── Vite / Frontend ─────────────────────────────────────────────────────────',
|
|
79
|
-
'VITE_SUPABASE_URL=https://your-project.supabase.co',
|
|
80
|
-
'VITE_SUPABASE_ANON_KEY=your-anon-key',
|
|
81
|
-
'VITE_APP_NAME=Spine',
|
|
82
|
-
'',
|
|
83
|
-
'# ─── OpenAI ──────────────────────────────────────────────────────────────────',
|
|
84
|
-
'OPENAI_API_KEY=your-openai-api-key',
|
|
85
|
-
'',
|
|
86
|
-
'# ─── App config ──────────────────────────────────────────────────────────────',
|
|
87
|
-
'DB_SCHEMA=public',
|
|
88
|
-
].join('\n') + '\n'
|
|
89
|
-
|
|
90
|
-
if (dryRun) {
|
|
91
|
-
console.log(' [dry-run] Would write .env with placeholder values')
|
|
92
|
-
return
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
writeFileSync(envPath, envContent, 'utf8')
|
|
96
|
-
console.log(' ✓ Created .env')
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function copyFrameworkFiles(dryRun: boolean): void {
|
|
100
|
-
// Directories and files to copy from the package root into the consumer project root
|
|
101
|
-
const items = [
|
|
102
|
-
{ src: '.framework', dest: '.framework' },
|
|
103
|
-
{ src: 'bin', dest: 'bin' },
|
|
104
|
-
{ src: 'config', dest: 'config' },
|
|
105
|
-
{ src: 'scripts', dest: 'scripts' },
|
|
106
|
-
{ src: 'netlify.toml', dest: 'netlify.toml' },
|
|
107
|
-
{ src: 'vitest.config.ts', dest: 'vitest.config.ts' },
|
|
108
|
-
{ src: 'index.html', dest: 'index.html' },
|
|
109
|
-
{ src: 'package-project.json', dest: 'package.json' },
|
|
110
|
-
{ src: 'STRUCTURE.md', dest: 'STRUCTURE.md' },
|
|
111
|
-
]
|
|
112
|
-
|
|
113
|
-
for (const item of items) {
|
|
114
|
-
const src = resolve(PACKAGE_ROOT, item.src)
|
|
115
|
-
const dest = resolve(PROJECT_ROOT, item.dest)
|
|
116
|
-
|
|
117
|
-
if (!existsSync(src)) {
|
|
118
|
-
console.log(` ⏭️ ${item.src} not found in package, skipping`)
|
|
119
|
-
continue
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Always overwrite package.json (npm creates a minimal one during install)
|
|
123
|
-
if (existsSync(dest) && item.dest !== 'package.json') {
|
|
124
|
-
console.log(` ⏭️ ${item.dest} already exists, skipping`)
|
|
125
|
-
continue
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (dryRun) {
|
|
129
|
-
console.log(` [dry-run] Would copy: ${item.src} → ./${item.dest}`)
|
|
130
|
-
continue
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
cpSync(src, dest, { recursive: true })
|
|
134
|
-
console.log(` ✓ Copied ${item.dest}`)
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
async function initCommand(options: InitOptions): Promise<void> {
|
|
139
|
-
console.log('\n🚀 Spine Framework — Init\n')
|
|
140
|
-
|
|
141
|
-
// Step 1: Copy framework files to project root
|
|
142
|
-
console.log('📦 Step 1: Installing framework files...')
|
|
143
|
-
copyFrameworkFiles(options.dryRun)
|
|
144
|
-
|
|
145
|
-
// Step 2: Install dev dependencies (vite, netlify-cli)
|
|
146
|
-
if (!options.dryRun) {
|
|
147
|
-
console.log('\n📦 Step 2: Installing dev dependencies...')
|
|
148
|
-
try {
|
|
149
|
-
execSync('npm install', { stdio: 'inherit', cwd: PROJECT_ROOT })
|
|
150
|
-
console.log(' ✓ Dev dependencies installed')
|
|
151
|
-
} catch (err) {
|
|
152
|
-
console.log(' ⚠️ npm install failed — run manually: npm install')
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Step 3: Scaffold custom workspace
|
|
157
|
-
console.log('\n📁 Step 3: Scaffolding custom workspace...')
|
|
158
|
-
scaffoldCustomWorkspace(options.dryRun)
|
|
159
|
-
|
|
160
|
-
// Step 4: Write .env with placeholders
|
|
161
|
-
console.log('\n🔑 Step 4: Writing environment configuration...')
|
|
162
|
-
writeEnvFile(options.dryRun)
|
|
163
|
-
|
|
164
|
-
console.log('\n✅ Project initialized!')
|
|
165
|
-
console.log('\n Next steps:')
|
|
166
|
-
console.log(' 1. Fill in your Supabase credentials in .env')
|
|
167
|
-
console.log(' (get them from https://supabase.com/dashboard/project/_/settings/api)')
|
|
168
|
-
console.log(' 2. Run: npx spine-framework migrate')
|
|
169
|
-
console.log(' (ensure SUPABASE_DB_PASSWORD is set in .env)')
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export function registerInitCommands(program: Command) {
|
|
173
|
-
program
|
|
174
|
-
.command('init')
|
|
175
|
-
.description('Install framework files, scaffold custom/ workspace, and write .env template')
|
|
176
|
-
.option('--dry-run', 'Show what would happen without making changes', false)
|
|
177
|
-
.action(async (opts) => {
|
|
178
|
-
try {
|
|
179
|
-
await initCommand(opts)
|
|
180
|
-
} catch (err: any) {
|
|
181
|
-
console.error('Error:', err.message)
|
|
182
|
-
if (process.env.SPINE_CLI_DEBUG) console.error(err.stack)
|
|
183
|
-
process.exit(1)
|
|
184
|
-
}
|
|
185
|
-
})
|
|
186
|
-
}
|