spine-framework 0.3.125 → 0.3.127
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/.framework/cli/commands/agents.ts +35 -37
- package/.framework/cli/commands/auth.ts +35 -34
- package/.framework/cli/commands/create-app.ts +104 -40
- package/.framework/cli/commands/dev.ts +104 -69
- package/.framework/cli/commands/doctor.ts +169 -97
- package/.framework/cli/commands/generate.ts +82 -161
- package/.framework/cli/commands/init.ts +72 -34
- package/.framework/cli/commands/install-app.ts +260 -125
- package/.framework/cli/commands/items.ts +33 -44
- package/.framework/cli/commands/migrate.ts +122 -40
- package/.framework/cli/commands/migrations.ts +33 -40
- package/.framework/cli/commands/pipelines.ts +31 -39
- package/.framework/cli/commands/status.ts +47 -23
- package/.framework/cli/commands/system.ts +47 -37
- package/.framework/cli/commands/test.ts +112 -68
- package/.framework/cli/commands/validate-app.ts +215 -121
- package/.framework/cli/context.ts +112 -130
- package/.framework/cli/env-loader.ts +47 -18
- package/.framework/cli/index.ts +81 -42
- package/.framework/docs/runtime-types.md +1024 -0
- package/.framework/functions/_shared/agent-runner.ts +1296 -961
- package/.framework/functions/_shared/app-manifest.ts +82 -68
- package/.framework/functions/_shared/audit.ts +135 -83
- package/.framework/functions/_shared/{cil-state.ts → cil.ts} +147 -54
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +222 -347
- package/.framework/functions/_shared/kb.ts +319 -0
- package/.framework/functions/_shared/llm.ts +92 -0
- package/.framework/functions/_shared/logging.ts +288 -0
- package/.framework/functions/_shared/middleware.ts +329 -365
- package/.framework/functions/_shared/outcomes.ts +36 -0
- package/.framework/functions/_shared/permissions.ts +359 -643
- package/.framework/functions/_shared/pipeline-runner.ts +243 -316
- package/.framework/functions/_shared/principal.ts +376 -468
- package/.framework/functions/_shared/resolve-credentials.ts +102 -0
- package/.framework/functions/_shared/resolve-ids.ts +162 -14
- package/.framework/functions/_shared/retry-deliveries.ts +104 -0
- package/.framework/functions/_shared/schema-utils.ts +611 -373
- package/.framework/functions/_shared/testing.ts +207 -137
- package/.framework/functions/_shared/tracing.ts +276 -0
- package/.framework/functions/_shared/trigger-engine.ts +159 -211
- package/.framework/functions/_shared/webhook-registration.ts +95 -81
- package/.framework/functions/_shared/webhook-registry.ts +153 -75
- package/.framework/functions/account-nodes.ts +31 -53
- package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
- package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
- package/.framework/functions/adapters/openai-outbound.ts +40 -0
- package/.framework/functions/admin-data.ts +687 -533
- package/.framework/functions/admin-funnel.ts +31 -20
- package/.framework/functions/admin-install-funnel.ts +47 -28
- package/.framework/functions/admin-signals.ts +47 -29
- package/.framework/functions/ai-agents.ts +122 -147
- package/.framework/functions/ai-interactions.ts +180 -90
- package/.framework/functions/api-keys.ts +250 -192
- package/.framework/functions/apps.ts +203 -197
- package/.framework/functions/auth.ts +98 -91
- package/.framework/functions/cil-agent-ingest.ts +773 -0
- package/.framework/functions/cil-agent.ts +592 -0
- package/.framework/functions/cil-callmap.ts +1227 -0
- package/.framework/functions/cil-config.ts +583 -0
- package/.framework/functions/cil-context.ts +445 -0
- package/.framework/functions/cil-doc.ts +1752 -0
- package/.framework/functions/cil-embeddings.ts +1202 -0
- package/.framework/functions/cil-graph.ts +585 -0
- package/.framework/functions/cil-ingest.ts +2416 -0
- package/.framework/functions/cil-pipeline.ts +318 -0
- package/.framework/functions/cil-project.ts +499 -0
- package/.framework/functions/cil-validate.ts +469 -0
- package/.framework/functions/debug-auth.ts +73 -53
- package/.framework/functions/deliveries.ts +117 -0
- package/.framework/functions/embeddings.ts +528 -516
- package/.framework/functions/eval-harness.ts +158 -106
- package/.framework/functions/integration-outbound.ts +311 -0
- package/.framework/functions/integration-routes.ts +240 -466
- package/.framework/functions/integrations.ts +132 -140
- package/.framework/functions/invites.ts +401 -201
- package/.framework/functions/item-progress.ts +113 -53
- package/.framework/functions/kb.ts +28 -0
- package/.framework/functions/logs.ts +239 -222
- package/.framework/functions/observability.ts +308 -259
- package/.framework/functions/pipeline-executions.ts +179 -235
- package/.framework/functions/pipelines.ts +163 -205
- package/.framework/functions/prompt-configs.ts +109 -156
- package/.framework/functions/roles.ts +97 -147
- package/.framework/functions/system-cron.ts +132 -218
- package/.framework/functions/system.ts +112 -52
- package/.framework/functions/tests.ts +32 -28
- package/.framework/functions/timers.ts +162 -210
- package/.framework/functions/triggers.ts +282 -346
- package/.framework/functions/types.ts +283 -400
- package/.framework/migrations/001_core_schema.sql +630 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
- package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
- package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
- package/.framework/migrations/005_core_observability.sql +598 -0
- package/.framework/migrations/006_security_hardening_rls.sql +97 -0
- package/.framework/migrations/007_kb_article_list.sql +237 -0
- package/.framework/migrations/008_items_target.sql +8 -0
- package/.framework/migrations/009_roles_slug_unique.sql +11 -0
- package/.framework/public/spine.config.json +91 -0
- package/.framework/scripts/app-install-cli.ts +112 -98
- package/.framework/src/App.tsx +67 -20
- package/.framework/src/apps/admin/index.tsx +97 -27
- package/.framework/src/components/AppWrapper.tsx +50 -11
- package/.framework/src/components/CustomAppLoader.tsx +131 -22
- package/.framework/src/components/admin/AdminListPage.tsx +75 -8
- package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
- package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
- package/.framework/src/components/admin/PageInstructions.tsx +49 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
- package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
- package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
- package/.framework/src/components/app-sidebar.tsx +50 -3
- package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
- package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
- package/.framework/src/components/kb/KBArticleList.tsx +557 -0
- package/.framework/src/components/layout/AppShell.tsx +54 -16
- package/.framework/src/components/layout/Header.tsx +50 -38
- package/.framework/src/components/layout/Layout.tsx +48 -32
- package/.framework/src/components/layout/Sidebar.tsx +167 -16
- package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
- package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
- package/.framework/src/components/runtime/DataFilters.tsx +78 -1
- package/.framework/src/components/runtime/DataHeader.tsx +32 -29
- package/.framework/src/components/runtime/DataListPage.tsx +161 -2
- package/.framework/src/components/runtime/DataStats.tsx +48 -1
- package/.framework/src/components/runtime/DataTable.tsx +153 -1
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
- package/.framework/src/components/runtime/index.ts +16 -9
- package/.framework/src/components/search-form.tsx +33 -1
- package/.framework/src/components/shared/AgentView.tsx +48 -51
- package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
- package/.framework/src/components/shared/InviteManager.tsx +113 -52
- package/.framework/src/components/shared/MemberList.tsx +182 -0
- package/.framework/src/components/shared/SchemaFields.tsx +96 -78
- package/.framework/src/components/ui/DataTable.tsx +86 -56
- package/.framework/src/components/ui/Form.tsx +188 -109
- package/.framework/src/components/ui/ItemCard.tsx +86 -58
- package/.framework/src/components/ui/ItemListView.tsx +88 -61
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
- package/.framework/src/components/ui/Modal.tsx +81 -4
- package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
- package/.framework/src/components/ui/accordion.tsx +97 -5
- package/.framework/src/components/ui/alert-dialog.tsx +225 -13
- package/.framework/src/components/ui/alert.tsx +113 -6
- package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
- package/.framework/src/components/ui/avatar.tsx +129 -7
- package/.framework/src/components/ui/badge.tsx +65 -3
- package/.framework/src/components/ui/breadcrumb.tsx +145 -8
- package/.framework/src/components/ui/button-group.tsx +81 -4
- package/.framework/src/components/ui/button.tsx +49 -2
- package/.framework/src/components/ui/calendar.tsx +65 -3
- package/.framework/src/components/ui/card.tsx +145 -8
- package/.framework/src/components/ui/carousel.tsx +129 -7
- package/.framework/src/components/ui/chart.tsx +161 -10
- package/.framework/src/components/ui/checkbox.tsx +49 -2
- package/.framework/src/components/ui/collapsible.tsx +81 -5
- package/.framework/src/components/ui/combobox.tsx +305 -20
- package/.framework/src/components/ui/command.tsx +177 -11
- package/.framework/src/components/ui/context-menu.tsx +273 -17
- package/.framework/src/components/ui/dialog.tsx +209 -27
- package/.framework/src/components/ui/direction.tsx +64 -4
- package/.framework/src/components/ui/drawer.tsx +193 -12
- package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
- package/.framework/src/components/ui/empty.tsx +145 -9
- package/.framework/src/components/ui/field.tsx +209 -14
- package/.framework/src/components/ui/hover-card.tsx +81 -4
- package/.framework/src/components/ui/input-group.tsx +162 -10
- package/.framework/src/components/ui/input-otp.tsx +98 -5
- package/.framework/src/components/ui/input.tsx +49 -2
- package/.framework/src/components/ui/item.tsx +225 -13
- package/.framework/src/components/ui/kbd.tsx +65 -3
- package/.framework/src/components/ui/label.tsx +49 -2
- package/.framework/src/components/ui/menubar.tsx +289 -17
- package/.framework/src/components/ui/native-select.tsx +97 -5
- package/.framework/src/components/ui/navigation-menu.tsx +177 -10
- package/.framework/src/components/ui/pagination.tsx +161 -9
- package/.framework/src/components/ui/popover.tsx +145 -8
- package/.framework/src/components/ui/progress.tsx +49 -2
- package/.framework/src/components/ui/radio-group.tsx +65 -3
- package/.framework/src/components/ui/resizable.tsx +82 -4
- package/.framework/src/components/ui/scroll-area.tsx +65 -3
- package/.framework/src/components/ui/select.tsx +193 -11
- package/.framework/src/components/ui/separator.tsx +49 -2
- package/.framework/src/components/ui/sheet.tsx +193 -11
- package/.framework/src/components/ui/sidebar.tsx +481 -38
- package/.framework/src/components/ui/skeleton.tsx +49 -2
- package/.framework/src/components/ui/slider.tsx +49 -2
- package/.framework/src/components/ui/sonner.tsx +49 -2
- package/.framework/src/components/ui/spinner.tsx +49 -2
- package/.framework/src/components/ui/switch.tsx +49 -2
- package/.framework/src/components/ui/table-primitives.tsx +160 -33
- package/.framework/src/components/ui/table.tsx +161 -9
- package/.framework/src/components/ui/tabs.tsx +113 -6
- package/.framework/src/components/ui/textarea.tsx +49 -2
- package/.framework/src/components/ui/toggle-group.tsx +81 -4
- package/.framework/src/components/ui/toggle.tsx +65 -3
- package/.framework/src/components/ui/tooltip.tsx +97 -5
- package/.framework/src/contexts/AppContext.tsx +129 -45
- package/.framework/src/contexts/AuthContext.tsx +173 -145
- package/.framework/src/hooks/use-mobile.ts +48 -2
- package/.framework/src/hooks/useApi.ts +208 -159
- package/.framework/src/hooks/useAppPath.ts +32 -23
- package/.framework/src/hooks/useApps.ts +51 -20
- package/.framework/src/hooks/useEntityList.ts +32 -78
- package/.framework/src/hooks/useEntityRecord.ts +35 -96
- package/.framework/src/hooks/useForm.ts +32 -92
- package/.framework/src/hooks/useListSchema.ts +49 -78
- package/.framework/src/hooks/useSchemaRecord.ts +114 -105
- package/.framework/src/lib/api.ts +192 -115
- package/.framework/src/lib/supabase.ts +98 -64
- package/.framework/src/lib/utils.ts +287 -151
- package/.framework/src/main.tsx +49 -3
- package/.framework/src/pages/DashboardPage.tsx +52 -29
- package/.framework/src/pages/NotFoundPage.tsx +32 -10
- package/.framework/src/pages/SetupPage.tsx +32 -12
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
- package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
- package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
- package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
- package/.framework/src/pages/admin/AppsPage.tsx +49 -2
- package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
- package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
- package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
- package/.framework/src/pages/admin/LogsPage.tsx +422 -75
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
- package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
- package/.framework/src/pages/admin/RolesPage.tsx +171 -18
- package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
- package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
- package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
- package/.framework/src/pages/admin/TimersPage.tsx +48 -20
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
- package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
- package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
- package/.framework/src/pages/admin/TypesPage.tsx +48 -20
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
- package/.framework/src/pages/auth/LoginPage.tsx +50 -23
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
- package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
- package/.framework/src/types/auth.ts +128 -71
- package/.framework/src/types/types.ts +373 -157
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
- package/docs/README.md +9 -130
- package/netlify.toml +3 -3
- package/package.json +13 -25
- package/scripts/kb-ingest-docs.ts +203 -0
- package/spine.config.json +65 -4
- package/.framework/migrations/001_schema.sql +0 -425
- package/.framework/migrations/002_rls_and_functions.sql +0 -763
- package/.framework/migrations/004_enhancements.sql +0 -43
- package/.framework/migrations/005_auth_user_trigger.sql +0 -105
- package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
- package/.framework/migrations/016_invites.sql +0 -27
- package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
- package/.framework/migrations/018_apps_required_roles.sql +0 -17
- package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
- package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
- package/.framework/migrations/021_app_domains.sql +0 -112
- package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
- package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
- package/.framework/migrations/024_messages_account_id.sql +0 -9
- package/.framework/migrations/025_retype_threads_messages.sql +0 -240
- package/.framework/migrations/026_fix_rls_policies.sql +0 -47
- package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
- package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
- package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
- package/.framework/migrations/030_messages_updated_by.sql +0 -6
- package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
- package/docs/APPS.md +0 -232
- package/docs/ARCHITECTURE.md +0 -246
- package/docs/INSTALL.md +0 -155
- package/docs/design-schema-spec.md +0 -1837
- package/docs/dev-guides/01-create-an-app.md +0 -183
- package/docs/dev-guides/02-create-a-function.md +0 -178
- package/docs/dev-guides/03-create-a-component.md +0 -178
- package/docs/dev-guides/04-webhook-handlers.md +0 -129
- package/docs/dev-guides/05-testing.md +0 -168
- package/docs/dev-guides/README.md +0 -40
- package/docs/npm-packages-plan.md +0 -288
- package/docs/spine-core--api-reference.md +0 -822
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
// CIL[
|
|
4
|
-
// CIL[DOC-
|
|
5
|
-
// CIL[DOC-
|
|
6
|
-
// CIL[DOC-
|
|
7
|
-
// CIL[DOC-
|
|
8
|
-
// CIL[DOC-
|
|
9
|
-
// CIL[DOC-
|
|
1
|
+
// CIL[BEGIN chunk_id="generate_moduleheader_1784069813" type="module_header" identity="module_header" parent="none"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Module imports for generate CLI commands"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide CLI context, database access, and filesystem utilities"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="cli.commands.generate" layer="cli" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="imports" errors="none" side_effects="none"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Imports Commander, CLI context, admin DB, and Node.js filesystem modules" notable_decisions="[]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
10
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
11
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
12
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
13
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
14
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
15
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
10
16
|
import type { Command } from 'commander'
|
|
11
17
|
import { buildCliContext, handleError } from '../context.ts'
|
|
12
18
|
import { adminDb } from '../../functions/_shared/index.ts'
|
|
@@ -17,17 +23,21 @@ import { fileURLToPath } from 'url'
|
|
|
17
23
|
const __filename = fileURLToPath(import.meta.url)
|
|
18
24
|
const __dirname = dirname(__filename)
|
|
19
25
|
const PROJECT_ROOT = resolve(__dirname, '../../../')
|
|
20
|
-
// CIL[END chunk_id="
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
// CIL[
|
|
25
|
-
// CIL[DOC-
|
|
26
|
-
// CIL[DOC-
|
|
27
|
-
// CIL[DOC-
|
|
28
|
-
// CIL[DOC-
|
|
29
|
-
// CIL[DOC-
|
|
30
|
-
// CIL[DOC-
|
|
26
|
+
// CIL[END chunk_id="generate_moduleheader_1784069813"]
|
|
27
|
+
// CIL[BEGIN chunk_id="generate_generatetype_1784069813" type="function" identity="generateType" parent="none"]
|
|
28
|
+
// CIL[DOC-MACRO purpose="Generate type, handler, and UI page stubs"]
|
|
29
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Create complete type scaffolding in database and filesystem"]
|
|
30
|
+
// CIL[DOC-CONTEXT module="cli.commands.generate" layer="cli" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
31
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="database records and files" errors="database errors" side_effects="database writes, file writes"]
|
|
32
|
+
// CIL[DOC-MICRO logic_summary="Creates type record, generates handler stub, creates UI page with React component" notable_decisions="[]"]
|
|
33
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
34
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
35
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
36
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
37
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
38
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
39
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
40
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
31
41
|
async function generateType(ctx: any, slug: string, options: any): Promise<void> {
|
|
32
42
|
const name = options.name || slug.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ')
|
|
33
43
|
const kind = options.kind || 'item'
|
|
@@ -35,8 +45,6 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
|
|
|
35
45
|
|
|
36
46
|
console.log(`\n🔧 Generating type '${slug}'...`)
|
|
37
47
|
|
|
38
|
-
|
|
39
|
-
|
|
40
48
|
const { data: existing, error: checkErr } = await adminDb
|
|
41
49
|
.from('types')
|
|
42
50
|
.select('id')
|
|
@@ -92,7 +100,6 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
|
|
|
92
100
|
console.log(' ✓ Type record created')
|
|
93
101
|
}
|
|
94
102
|
|
|
95
|
-
|
|
96
103
|
const handlerPath = resolve(PROJECT_ROOT, `v2-custom/functions/${slug}.ts`)
|
|
97
104
|
|
|
98
105
|
if (existsSync(handlerPath) && !options.force) {
|
|
@@ -103,7 +110,6 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
|
|
|
103
110
|
console.log(` ✓ Handler stub created: v2-custom/functions/${slug}.ts`)
|
|
104
111
|
}
|
|
105
112
|
|
|
106
|
-
|
|
107
113
|
const pageDir = resolve(PROJECT_ROOT, `v2-custom/src/pages/${slug}`)
|
|
108
114
|
const pagePath = resolve(pageDir, 'index.tsx')
|
|
109
115
|
|
|
@@ -122,15 +128,21 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
|
|
|
122
128
|
console.log(` 2. Edit v2-custom/src/pages/${slug}/index.tsx to customize the UI`)
|
|
123
129
|
console.log(` 3. Run 'spine dev' to see your changes`)
|
|
124
130
|
}
|
|
125
|
-
// CIL[END chunk_id="
|
|
126
|
-
|
|
127
|
-
// CIL[
|
|
128
|
-
// CIL[DOC-
|
|
129
|
-
// CIL[DOC-
|
|
130
|
-
// CIL[DOC-
|
|
131
|
-
// CIL[DOC-
|
|
132
|
-
// CIL[DOC-
|
|
133
|
-
// CIL[DOC-
|
|
131
|
+
// CIL[END chunk_id="generate_generatetype_1784069813"]
|
|
132
|
+
// CIL[BEGIN chunk_id="generate_generatehandlerstub_1784069813" type="function" identity="generateHandlerStub" parent="none"]
|
|
133
|
+
// CIL[DOC-MACRO purpose="Generate TypeScript handler stub code"]
|
|
134
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Create API handler template with method routing"]
|
|
135
|
+
// CIL[DOC-CONTEXT module="cli.commands.generate" layer="cli" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
136
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="handler code string" errors="none" side_effects="none"]
|
|
137
|
+
// CIL[DOC-MICRO logic_summary="Returns template code for API handler with GET, POST, PATCH, DELETE methods" notable_decisions="[]"]
|
|
138
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
139
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
140
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/schema-utils.ts, \."]
|
|
141
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
142
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
143
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
144
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
145
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
134
146
|
function generateHandlerStub(slug: string, kind: string, name: string): string {
|
|
135
147
|
return `/**
|
|
136
148
|
* @module ${slug}
|
|
@@ -151,19 +163,15 @@ export const handler = createHandler(async (ctx) => {
|
|
|
151
163
|
|
|
152
164
|
switch (method) {
|
|
153
165
|
case 'GET':
|
|
154
|
-
// TODO: Implement GET logic
|
|
155
166
|
return { message: '${name} handler - GET not implemented' }
|
|
156
167
|
|
|
157
168
|
case 'POST':
|
|
158
|
-
// TODO: Implement POST logic
|
|
159
169
|
return { message: '${name} handler - POST not implemented' }
|
|
160
170
|
|
|
161
171
|
case 'PATCH':
|
|
162
|
-
// TODO: Implement PATCH logic
|
|
163
172
|
return { message: '${name} handler - PATCH not implemented' }
|
|
164
173
|
|
|
165
174
|
case 'DELETE':
|
|
166
|
-
// TODO: Implement DELETE logic
|
|
167
175
|
return { message: '${name} handler - DELETE not implemented' }
|
|
168
176
|
|
|
169
177
|
default:
|
|
@@ -172,15 +180,21 @@ export const handler = createHandler(async (ctx) => {
|
|
|
172
180
|
})
|
|
173
181
|
`
|
|
174
182
|
}
|
|
175
|
-
// CIL[END chunk_id="
|
|
176
|
-
|
|
177
|
-
// CIL[
|
|
178
|
-
// CIL[DOC-
|
|
179
|
-
// CIL[DOC-
|
|
180
|
-
// CIL[DOC-
|
|
181
|
-
// CIL[DOC-
|
|
182
|
-
// CIL[DOC-
|
|
183
|
-
// CIL[DOC-
|
|
183
|
+
// CIL[END chunk_id="generate_generatehandlerstub_1784069813"]
|
|
184
|
+
// CIL[BEGIN chunk_id="generate_generatepagestub_1784069813" type="function" identity="generatePageStub" parent="none"]
|
|
185
|
+
// CIL[DOC-MACRO purpose="Generate React page stub code"]
|
|
186
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Create UI page template with API integration"]
|
|
187
|
+
// CIL[DOC-CONTEXT module="cli.commands.generate" layer="cli" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
188
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="page code string" errors="none" side_effects="none"]
|
|
189
|
+
// CIL[DOC-MICRO logic_summary="Returns React component template with API hooks and data display" notable_decisions="[]"]
|
|
190
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
191
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
192
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
193
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
194
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
195
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
196
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
197
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
184
198
|
function generatePageStub(slug: string, name: string, kind: string): string {
|
|
185
199
|
return `/**
|
|
186
200
|
* @page ${slug}/index
|
|
@@ -222,108 +236,28 @@ export default function ${name.replace(/\s+/g, '')}Page() {
|
|
|
222
236
|
}
|
|
223
237
|
`
|
|
224
238
|
}
|
|
225
|
-
// CIL[END chunk_id="
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
// CIL[
|
|
230
|
-
// CIL[DOC-
|
|
231
|
-
// CIL[DOC-
|
|
232
|
-
// CIL[DOC-
|
|
233
|
-
// CIL[DOC-
|
|
234
|
-
// CIL[DOC-
|
|
235
|
-
// CIL[DOC-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
if (existsSync(handlerPath) && !options.force) {
|
|
242
|
-
console.log(` ⚠️ Function already exists: ${handlerPath}`)
|
|
243
|
-
console.log(` Use --force to overwrite`)
|
|
244
|
-
return
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
const handlerCode = generateFunctionStub(name, options.description)
|
|
248
|
-
writeFileSync(handlerPath, handlerCode)
|
|
249
|
-
|
|
250
|
-
console.log(`✅ Function '${name}' created!`)
|
|
251
|
-
console.log(` Location: v2-custom/functions/${name}.ts`)
|
|
252
|
-
console.log(` Next steps:`)
|
|
253
|
-
console.log(` 1. Edit the handler to implement your logic`)
|
|
254
|
-
console.log(` 2. Run 'spine dev' to see your changes`)
|
|
255
|
-
}
|
|
256
|
-
// CIL[END chunk_id="generate_generatefunction_1783555400"]
|
|
257
|
-
|
|
258
|
-
// CIL[BEGIN chunk_id="generate_generatefunctionstub_1783555400" type="function" identity="generateFunctionStub" parent="none"]
|
|
259
|
-
// CIL[DOC-MACRO purpose="Generate standalone Netlify function template"]
|
|
260
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Create template function with action routing"]
|
|
261
|
-
// CIL[DOC-CONTEXT module="cli/commands/generate" layer="cli" related_files="[]"]
|
|
262
|
-
// CIL[DOC-CONTRACT inputs="name, description" outputs="string function code" errors="none" side_effects="none"]
|
|
263
|
-
// CIL[DOC-MICRO logic_summary="Return template string with handler structure and action switch" notable_decisions="[]"]
|
|
264
|
-
// CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
|
|
265
|
-
function generateFunctionStub(name: string, description?: string): string {
|
|
266
|
-
return `/**
|
|
267
|
-
* @module ${name}
|
|
268
|
-
* @audience custom
|
|
269
|
-
* @layer api-handler
|
|
270
|
-
* @stability experimental
|
|
271
|
-
*
|
|
272
|
-
* ${description || `Custom Netlify function: ${name}`}
|
|
273
|
-
* Generated by spine CLI on ${new Date().toISOString()}.
|
|
274
|
-
*/
|
|
275
|
-
|
|
276
|
-
import { createHandler } from '../v2-core/functions/_shared/middleware'
|
|
277
|
-
|
|
278
|
-
export const handler = createHandler(async (ctx) => {
|
|
279
|
-
// Access principal: ctx.principal (human, machine, or system)
|
|
280
|
-
// Access database: ctx.db (RLS-scoped) or import { adminDb } for admin access
|
|
281
|
-
// Access query params: ctx.query
|
|
282
|
-
|
|
283
|
-
const q = ctx.query || {}
|
|
284
|
-
const action = q.action || 'default'
|
|
285
|
-
|
|
286
|
-
switch (action) {
|
|
287
|
-
case 'default':
|
|
288
|
-
return {
|
|
289
|
-
message: 'Hello from ${name}',
|
|
290
|
-
principal: ctx.principal?.id,
|
|
291
|
-
timestamp: new Date().toISOString()
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// TODO: Add more actions here
|
|
295
|
-
// case 'custom':
|
|
296
|
-
// return { data: await yourCustomLogic(ctx) }
|
|
297
|
-
|
|
298
|
-
default:
|
|
299
|
-
return {
|
|
300
|
-
error: 'Unknown action: ' + action,
|
|
301
|
-
available_actions: ['default']
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
})
|
|
305
|
-
`
|
|
306
|
-
}
|
|
307
|
-
// CIL[END chunk_id="generate_generatefunctionstub_1783555400"]
|
|
308
|
-
|
|
309
|
-
// CIL[BEGIN chunk_id="generate_registergeneratecommands_1783555400" type="function" identity="registerGenerateCommands" parent="none"]
|
|
310
|
-
// CIL[DOC-MACRO purpose="Register generate CLI commands for type and function scaffolding"]
|
|
311
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Setup CLI interface for code generation tools"]
|
|
312
|
-
// CIL[DOC-CONTEXT module="cli/commands/generate" layer="cli" related_files="[]"]
|
|
313
|
-
// CIL[DOC-CONTRACT inputs="Command program" outputs="registered CLI commands" errors="CLI errors" side_effects="none"]
|
|
314
|
-
// CIL[DOC-MICRO logic_summary="Register 'generate type' and 'generate function' subcommands with options" notable_decisions="[]"]
|
|
315
|
-
// CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
|
|
239
|
+
// CIL[END chunk_id="generate_generatepagestub_1784069813"]
|
|
240
|
+
// CIL[BEGIN chunk_id="generate_registergeneratecommands_1784069813" type="function" identity="registerGenerateCommands" parent="none"]
|
|
241
|
+
// CIL[DOC-MACRO purpose="Register generate command with CLI program"]
|
|
242
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide CLI interface for type generation"]
|
|
243
|
+
// CIL[DOC-CONTEXT module="cli.commands.generate" layer="cli" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/db.ts\"]"]
|
|
244
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="CLI command registration" errors="command errors" side_effects="none"]
|
|
245
|
+
// CIL[DOC-MICRO logic_summary="Registers generate command with slug argument and various options" notable_decisions="[]"]
|
|
246
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
247
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
248
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/db.ts."]
|
|
249
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
250
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
251
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
252
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
253
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
316
254
|
export function registerGenerateCommands(program: Command) {
|
|
317
|
-
|
|
318
|
-
.command('generate')
|
|
319
|
-
.description('Generate
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
.
|
|
323
|
-
.description('Generate a new type with handler and UI stubs')
|
|
324
|
-
.option('--name <name>', 'Display name for the type')
|
|
325
|
-
.option('--kind <kind>', 'Type kind (item, account, person)', 'item')
|
|
326
|
-
.option('--description <desc>', 'Type description')
|
|
255
|
+
program
|
|
256
|
+
.command('generate <slug>')
|
|
257
|
+
.description('Generate type, handler, and UI stubs')
|
|
258
|
+
.option('--name <name>', 'Human-readable name')
|
|
259
|
+
.option('--kind <kind>', 'Type kind', 'item')
|
|
260
|
+
.option('--description <description>', 'Type description')
|
|
327
261
|
.option('--force', 'Overwrite existing files', false)
|
|
328
262
|
.action(async (slug, opts) => {
|
|
329
263
|
try {
|
|
@@ -333,18 +267,5 @@ export function registerGenerateCommands(program: Command) {
|
|
|
333
267
|
handleError(err)
|
|
334
268
|
}
|
|
335
269
|
})
|
|
336
|
-
|
|
337
|
-
generate
|
|
338
|
-
.command('function <name>')
|
|
339
|
-
.description('Generate a new Netlify function stub')
|
|
340
|
-
.option('--description <desc>', 'Function description')
|
|
341
|
-
.option('--force', 'Overwrite existing file', false)
|
|
342
|
-
.action(async (name, opts) => {
|
|
343
|
-
try {
|
|
344
|
-
await generateFunction(name, opts)
|
|
345
|
-
} catch (err: any) {
|
|
346
|
-
handleError(err)
|
|
347
|
-
}
|
|
348
|
-
})
|
|
349
270
|
}
|
|
350
|
-
// CIL[END chunk_id="
|
|
271
|
+
// CIL[END chunk_id="generate_registergeneratecommands_1784069813"]
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/**
|
|
3
|
-
* @module cli/commands/init
|
|
4
|
-
* @audience installer
|
|
5
|
-
* @layer cli
|
|
6
|
-
* @stability stable
|
|
7
|
-
*
|
|
8
|
-
* `spine-framework init` — scaffolds a new Spine Framework project in the
|
|
9
|
-
* current directory. Copies framework files, creates the custom/ workspace,
|
|
10
|
-
* writes package.json and .env template.
|
|
11
|
-
*
|
|
12
|
-
* **Usage:**
|
|
13
|
-
* ```bash
|
|
14
|
-
* npx spine-framework init
|
|
15
|
-
* ```
|
|
16
|
-
*/
|
|
17
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="init_moduleheader_1784069813" type="module_header" identity="module_header" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Module imports and constants for init command"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide filesystem utilities and path constants"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="cli.commands.init" layer="cli" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="constants" errors="none" side_effects="none"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports Node.js fs, path modules and defines package/project root paths" notable_decisions="[]"]
|
|
10
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
11
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
12
|
+
// CIL[DOC-AUDIENCE audience="installer"]
|
|
13
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
14
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
15
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
16
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
17
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
18
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
18
19
|
import type { Command } from 'commander'
|
|
19
20
|
import { existsSync, mkdirSync, writeFileSync, copyFileSync, readdirSync, statSync, cpSync, readFileSync } from 'fs'
|
|
20
21
|
import { resolve, dirname, join } from 'path'
|
|
@@ -24,11 +25,23 @@ import { execSync } from 'child_process'
|
|
|
24
25
|
const __filename = fileURLToPath(import.meta.url)
|
|
25
26
|
const __dirname = dirname(__filename)
|
|
26
27
|
|
|
27
|
-
// Root of the spine-framework package (node_modules/spine-framework/)
|
|
28
28
|
const PACKAGE_ROOT = resolve(__dirname, '../../../')
|
|
29
|
-
// Root of the user's project (cwd)
|
|
30
29
|
const PROJECT_ROOT = process.cwd()
|
|
31
|
-
|
|
30
|
+
// CIL[END chunk_id="init_moduleheader_1784069813"]
|
|
31
|
+
// CIL[BEGIN chunk_id="init_registerinitcommands_1784069813" type="function" identity="registerInitCommands" parent="none"]
|
|
32
|
+
// CIL[DOC-MACRO purpose="Register init command with CLI program"]
|
|
33
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Scaffold new Spine Framework projects"]
|
|
34
|
+
// CIL[DOC-CONTEXT module="cli.commands.init" layer="cli" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
|
|
35
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="CLI command registration" errors="init failures" side_effects="filesystem writes"]
|
|
36
|
+
// CIL[DOC-MICRO logic_summary="Copies framework files, creates directories, writes package.json and config files" notable_decisions="[]"]
|
|
37
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
38
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
39
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/migrations/015_simplify_apps_table.sql, .framework/src/components/ui/table-primitives.tsx, \."]
|
|
40
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
41
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
42
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
43
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
44
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
32
45
|
export function registerInitCommands(program: Command) {
|
|
33
46
|
program
|
|
34
47
|
.command('init')
|
|
@@ -37,7 +50,7 @@ export function registerInitCommands(program: Command) {
|
|
|
37
50
|
.action(async (opts) => {
|
|
38
51
|
console.log('\nInitializing Spine Framework project...\n')
|
|
39
52
|
|
|
40
|
-
|
|
53
|
+
|
|
41
54
|
const existingPkg = join(PROJECT_ROOT, 'package.json')
|
|
42
55
|
if (existsSync(existingPkg) && !opts.force) {
|
|
43
56
|
try {
|
|
@@ -52,7 +65,7 @@ export function registerInitCommands(program: Command) {
|
|
|
52
65
|
}
|
|
53
66
|
|
|
54
67
|
try {
|
|
55
|
-
|
|
68
|
+
|
|
56
69
|
console.log(' Copying .framework/...')
|
|
57
70
|
const fwSrc = join(PACKAGE_ROOT, '.framework')
|
|
58
71
|
const fwDest = join(PROJECT_ROOT, '.framework')
|
|
@@ -63,7 +76,7 @@ export function registerInitCommands(program: Command) {
|
|
|
63
76
|
console.log(' ○ .framework/ already exists, skipping')
|
|
64
77
|
}
|
|
65
78
|
|
|
66
|
-
|
|
79
|
+
|
|
67
80
|
console.log(' Creating custom/ workspace...')
|
|
68
81
|
const customDirs = [
|
|
69
82
|
'custom/apps',
|
|
@@ -78,7 +91,7 @@ export function registerInitCommands(program: Command) {
|
|
|
78
91
|
mkdirSync(full, { recursive: true })
|
|
79
92
|
}
|
|
80
93
|
}
|
|
81
|
-
|
|
94
|
+
|
|
82
95
|
const devinSrc = join(PACKAGE_ROOT, 'custom/.devin')
|
|
83
96
|
const devinDest = join(PROJECT_ROOT, 'custom/.devin')
|
|
84
97
|
if (existsSync(devinSrc) && !existsSync(devinDest)) {
|
|
@@ -86,7 +99,7 @@ export function registerInitCommands(program: Command) {
|
|
|
86
99
|
}
|
|
87
100
|
console.log(' ✓ custom/ workspace created')
|
|
88
101
|
|
|
89
|
-
|
|
102
|
+
|
|
90
103
|
console.log(' Copying config files...')
|
|
91
104
|
const configSrc = join(PACKAGE_ROOT, 'config')
|
|
92
105
|
const configDest = join(PROJECT_ROOT, 'config')
|
|
@@ -95,7 +108,7 @@ export function registerInitCommands(program: Command) {
|
|
|
95
108
|
console.log(' ✓ config/ copied')
|
|
96
109
|
}
|
|
97
110
|
|
|
98
|
-
|
|
111
|
+
|
|
99
112
|
console.log(' Copying scripts/...')
|
|
100
113
|
const scriptsSrc = join(PACKAGE_ROOT, 'scripts')
|
|
101
114
|
const scriptsDest = join(PROJECT_ROOT, 'scripts')
|
|
@@ -104,14 +117,24 @@ export function registerInitCommands(program: Command) {
|
|
|
104
117
|
console.log(' ✓ scripts/ copied')
|
|
105
118
|
}
|
|
106
119
|
|
|
107
|
-
|
|
120
|
+
|
|
108
121
|
const netlifyTomlSrc = join(PACKAGE_ROOT, 'netlify.toml')
|
|
109
122
|
if (existsSync(netlifyTomlSrc) && !existsSync(join(PROJECT_ROOT, 'netlify.toml'))) {
|
|
110
123
|
copyFileSync(netlifyTomlSrc, join(PROJECT_ROOT, 'netlify.toml'))
|
|
111
124
|
console.log(' ✓ netlify.toml copied')
|
|
112
125
|
}
|
|
113
126
|
|
|
114
|
-
|
|
127
|
+
|
|
128
|
+
const spineConfigSrc = join(PACKAGE_ROOT, 'spine.config.json')
|
|
129
|
+
const spineConfigDest = join(PROJECT_ROOT, 'spine.config.json')
|
|
130
|
+
if (existsSync(spineConfigSrc) && !existsSync(spineConfigDest)) {
|
|
131
|
+
copyFileSync(spineConfigSrc, spineConfigDest)
|
|
132
|
+
console.log(' ✓ spine.config.json copied')
|
|
133
|
+
} else if (existsSync(spineConfigDest) && !JSON.parse(readFileSync(spineConfigDest, 'utf8'))?.registration?.default_app_by_role) {
|
|
134
|
+
console.log(' ⚠ Existing spine.config.json does not have default_app_by_role; consider updating it')
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
115
138
|
console.log(' Writing package.json...')
|
|
116
139
|
const projectName = PROJECT_ROOT.split('/').pop() || 'my-spine-project'
|
|
117
140
|
const pkgJson = {
|
|
@@ -148,7 +171,7 @@ export function registerInitCommands(program: Command) {
|
|
|
148
171
|
'vitest': '^2.1.9',
|
|
149
172
|
},
|
|
150
173
|
}
|
|
151
|
-
|
|
174
|
+
|
|
152
175
|
let finalPkg = pkgJson
|
|
153
176
|
if (existsSync(join(PROJECT_ROOT, 'package.json'))) {
|
|
154
177
|
try {
|
|
@@ -157,9 +180,9 @@ export function registerInitCommands(program: Command) {
|
|
|
157
180
|
...pkgJson,
|
|
158
181
|
name: existing.name || pkgJson.name,
|
|
159
182
|
version: existing.version || pkgJson.version,
|
|
160
|
-
|
|
183
|
+
|
|
161
184
|
dependencies: { ...existing.dependencies, ...pkgJson.dependencies },
|
|
162
|
-
|
|
185
|
+
|
|
163
186
|
devDependencies: { ...pkgJson.devDependencies, ...existing.devDependencies },
|
|
164
187
|
}
|
|
165
188
|
} catch {}
|
|
@@ -170,7 +193,7 @@ export function registerInitCommands(program: Command) {
|
|
|
170
193
|
)
|
|
171
194
|
console.log(' ✓ package.json written')
|
|
172
195
|
|
|
173
|
-
|
|
196
|
+
|
|
174
197
|
console.log(' Writing .env template...')
|
|
175
198
|
if (!existsSync(join(PROJECT_ROOT, '.env'))) {
|
|
176
199
|
const envTemplate = [
|
|
@@ -195,7 +218,7 @@ export function registerInitCommands(program: Command) {
|
|
|
195
218
|
console.log(' ○ .env already exists, skipping')
|
|
196
219
|
}
|
|
197
220
|
|
|
198
|
-
|
|
221
|
+
|
|
199
222
|
if (!existsSync(join(PROJECT_ROOT, '.gitignore'))) {
|
|
200
223
|
const gitignore = [
|
|
201
224
|
'node_modules',
|
|
@@ -214,7 +237,7 @@ export function registerInitCommands(program: Command) {
|
|
|
214
237
|
console.log(' ✓ .gitignore written')
|
|
215
238
|
}
|
|
216
239
|
|
|
217
|
-
|
|
240
|
+
|
|
218
241
|
let pkgVersion = 'unknown'
|
|
219
242
|
try {
|
|
220
243
|
const pkgJson = JSON.parse(readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf8'))
|
|
@@ -236,7 +259,21 @@ export function registerInitCommands(program: Command) {
|
|
|
236
259
|
}
|
|
237
260
|
})
|
|
238
261
|
}
|
|
239
|
-
|
|
262
|
+
// CIL[END chunk_id="init_registerinitcommands_1784069813"]
|
|
263
|
+
// CIL[BEGIN chunk_id="init_getpackageversion_1784069813" type="function" identity="getPackageVersion" parent="none"]
|
|
264
|
+
// CIL[DOC-MACRO purpose="Get package version from package.json"]
|
|
265
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Read and return framework version"]
|
|
266
|
+
// CIL[DOC-CONTEXT module="cli.commands.init" layer="cli" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
267
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="version string" errors="file read errors" side_effects="none"]
|
|
268
|
+
// CIL[DOC-MICRO logic_summary="Reads package.json and returns version with fallback to 0.3.0" notable_decisions="[]"]
|
|
269
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
270
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
271
|
+
// CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
272
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
273
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
274
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
275
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
276
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
240
277
|
function getPackageVersion(): string {
|
|
241
278
|
try {
|
|
242
279
|
const pkg = JSON.parse(
|
|
@@ -247,3 +284,4 @@ function getPackageVersion(): string {
|
|
|
247
284
|
return '0.3.0'
|
|
248
285
|
}
|
|
249
286
|
}
|
|
287
|
+
// CIL[END chunk_id="init_getpackageversion_1784069813"]
|