spine-framework 0.3.124 → 0.3.126
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 +179 -69
- package/.framework/cli/commands/generate.ts +83 -143
- 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} +158 -56
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +224 -335
- 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 +188 -16
- 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 +685 -537
- 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 +187 -144
- 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 +195 -116
- 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 +5 -2
- 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,38 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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"]
|
|
36
16
|
import type { Command } from 'commander'
|
|
37
17
|
import { buildCliContext, handleError } from '../context.ts'
|
|
38
18
|
import { adminDb } from '../../functions/_shared/index.ts'
|
|
@@ -43,9 +23,21 @@ import { fileURLToPath } from 'url'
|
|
|
43
23
|
const __filename = fileURLToPath(import.meta.url)
|
|
44
24
|
const __dirname = dirname(__filename)
|
|
45
25
|
const PROJECT_ROOT = resolve(__dirname, '../../../')
|
|
46
|
-
|
|
47
|
-
//
|
|
48
|
-
|
|
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"]
|
|
49
41
|
async function generateType(ctx: any, slug: string, options: any): Promise<void> {
|
|
50
42
|
const name = options.name || slug.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ')
|
|
51
43
|
const kind = options.kind || 'item'
|
|
@@ -53,9 +45,6 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
|
|
|
53
45
|
|
|
54
46
|
console.log(`\n🔧 Generating type '${slug}'...`)
|
|
55
47
|
|
|
56
|
-
// Step 1: Create type record in database
|
|
57
|
-
console.log(' Step 1: Creating type record in database...')
|
|
58
|
-
|
|
59
48
|
const { data: existing, error: checkErr } = await adminDb
|
|
60
49
|
.from('types')
|
|
61
50
|
.select('id')
|
|
@@ -63,7 +52,7 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
|
|
|
63
52
|
.eq('kind', kind)
|
|
64
53
|
.single()
|
|
65
54
|
|
|
66
|
-
if (checkErr && checkErr.code !== 'PGRST116') {
|
|
55
|
+
if (checkErr && checkErr.code !== 'PGRST116') {
|
|
67
56
|
throw new Error(`Failed to check existing type: ${checkErr.message}`)
|
|
68
57
|
}
|
|
69
58
|
|
|
@@ -111,8 +100,6 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
|
|
|
111
100
|
console.log(' ✓ Type record created')
|
|
112
101
|
}
|
|
113
102
|
|
|
114
|
-
// Step 2: Generate handler stub
|
|
115
|
-
console.log(' Step 2: Generating handler stub...')
|
|
116
103
|
const handlerPath = resolve(PROJECT_ROOT, `v2-custom/functions/${slug}.ts`)
|
|
117
104
|
|
|
118
105
|
if (existsSync(handlerPath) && !options.force) {
|
|
@@ -123,8 +110,6 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
|
|
|
123
110
|
console.log(` ✓ Handler stub created: v2-custom/functions/${slug}.ts`)
|
|
124
111
|
}
|
|
125
112
|
|
|
126
|
-
// Step 3: Generate UI page stub
|
|
127
|
-
console.log(' Step 3: Generating UI page stub...')
|
|
128
113
|
const pageDir = resolve(PROJECT_ROOT, `v2-custom/src/pages/${slug}`)
|
|
129
114
|
const pagePath = resolve(pageDir, 'index.tsx')
|
|
130
115
|
|
|
@@ -143,7 +128,21 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
|
|
|
143
128
|
console.log(` 2. Edit v2-custom/src/pages/${slug}/index.tsx to customize the UI`)
|
|
144
129
|
console.log(` 3. Run 'spine dev' to see your changes`)
|
|
145
130
|
}
|
|
146
|
-
|
|
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"]
|
|
147
146
|
function generateHandlerStub(slug: string, kind: string, name: string): string {
|
|
148
147
|
return `/**
|
|
149
148
|
* @module ${slug}
|
|
@@ -164,19 +163,15 @@ export const handler = createHandler(async (ctx) => {
|
|
|
164
163
|
|
|
165
164
|
switch (method) {
|
|
166
165
|
case 'GET':
|
|
167
|
-
// TODO: Implement GET logic
|
|
168
166
|
return { message: '${name} handler - GET not implemented' }
|
|
169
167
|
|
|
170
168
|
case 'POST':
|
|
171
|
-
// TODO: Implement POST logic
|
|
172
169
|
return { message: '${name} handler - POST not implemented' }
|
|
173
170
|
|
|
174
171
|
case 'PATCH':
|
|
175
|
-
// TODO: Implement PATCH logic
|
|
176
172
|
return { message: '${name} handler - PATCH not implemented' }
|
|
177
173
|
|
|
178
174
|
case 'DELETE':
|
|
179
|
-
// TODO: Implement DELETE logic
|
|
180
175
|
return { message: '${name} handler - DELETE not implemented' }
|
|
181
176
|
|
|
182
177
|
default:
|
|
@@ -185,7 +180,21 @@ export const handler = createHandler(async (ctx) => {
|
|
|
185
180
|
})
|
|
186
181
|
`
|
|
187
182
|
}
|
|
188
|
-
|
|
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"]
|
|
189
198
|
function generatePageStub(slug: string, name: string, kind: string): string {
|
|
190
199
|
return `/**
|
|
191
200
|
* @page ${slug}/index
|
|
@@ -227,86 +236,29 @@ export default function ${name.replace(/\s+/g, '')}Page() {
|
|
|
227
236
|
}
|
|
228
237
|
`
|
|
229
238
|
}
|
|
230
|
-
|
|
231
|
-
//
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
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"]
|
|
299
254
|
export function registerGenerateCommands(program: Command) {
|
|
300
|
-
|
|
255
|
+
program
|
|
301
256
|
.command('generate')
|
|
302
|
-
.description('Generate
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
.
|
|
306
|
-
.
|
|
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')
|
|
257
|
+
.description('Generate type, handler, and UI stubs')
|
|
258
|
+
.argument('<slug>', 'Type slug (e.g., support-ticket)')
|
|
259
|
+
.option('--name <name>', 'Human-readable name')
|
|
260
|
+
.option('--kind <kind>', 'Type kind', 'item')
|
|
261
|
+
.option('--description <description>', 'Type description')
|
|
310
262
|
.option('--force', 'Overwrite existing files', false)
|
|
311
263
|
.action(async (slug, opts) => {
|
|
312
264
|
try {
|
|
@@ -316,17 +268,5 @@ export function registerGenerateCommands(program: Command) {
|
|
|
316
268
|
handleError(err)
|
|
317
269
|
}
|
|
318
270
|
})
|
|
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
271
|
}
|
|
272
|
+
// 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"]
|