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.
Files changed (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -1,38 +1,18 @@
1
- /// <reference types="node" />
2
- /**
3
- * @module cli/commands/generate
4
- * @audience installer
5
- * @layer cli
6
- * @stability stable
7
- *
8
- * `spine generate` command — code scaffolding for extending Spine safely.
9
- * Generates type definitions, handlers, and UI pages in v2-custom/ only.
10
- *
11
- * **Commands:**
12
- * | Subcommand | Description |
13
- * |-------------------------|-------------------------------------------------------|
14
- * | `generate type <slug>` | Create new type with handler and UI stubs |
15
- * | `generate function <name>` | Create new Netlify function stub |
16
- *
17
- * **What gets generated for `type`:**
18
- * 1. Type record in database (item type by default)
19
- * 2. Handler stub: `v2-custom/functions/{slug}.ts`
20
- * 3. UI page stub: `v2-custom/src/pages/{slug}/index.tsx`
21
- *
22
- * **What gets generated for `function`:**
23
- * 1. Netlify function stub: `v2-custom/functions/{name}.ts`
24
- * 2. Basic handler structure with middleware imports
25
- *
26
- * **Usage:**
27
- * ```bash
28
- * spine generate type ticket-v2
29
- * spine generate function webhook-handler
30
- * ```
31
- *
32
- * @seeAlso functions/types.ts (type CRUD API)
33
- * @seeAlso functions/_shared/middleware.ts (handler structure)
34
- */
35
-
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
- // ─── TYPE GENERATION ─────────────────────────────────────────────────────────
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') { // PGRST116 = not found
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
- // ─── FUNCTION GENERATION ─────────────────────────────────────────────────────
232
-
233
- async function generateFunction(name: string, options: any): Promise<void> {
234
- console.log(`\n🔧 Generating function '${name}'...`)
235
-
236
- const handlerPath = resolve(PROJECT_ROOT, `v2-custom/functions/${name}.ts`)
237
-
238
- if (existsSync(handlerPath) && !options.force) {
239
- console.log(` ⚠️ Function already exists: ${handlerPath}`)
240
- console.log(` Use --force to overwrite`)
241
- return
242
- }
243
-
244
- const handlerCode = generateFunctionStub(name, options.description)
245
- writeFileSync(handlerPath, handlerCode)
246
-
247
- console.log(`✅ Function '${name}' created!`)
248
- console.log(` Location: v2-custom/functions/${name}.ts`)
249
- console.log(` Next steps:`)
250
- console.log(` 1. Edit the handler to implement your logic`)
251
- console.log(` 2. Run 'spine dev' to see your changes`)
252
- }
253
-
254
- function generateFunctionStub(name: string, description?: string): string {
255
- return `/**
256
- * @module ${name}
257
- * @audience custom
258
- * @layer api-handler
259
- * @stability experimental
260
- *
261
- * ${description || `Custom Netlify function: ${name}`}
262
- * Generated by spine CLI on ${new Date().toISOString()}.
263
- */
264
-
265
- import { createHandler } from '../v2-core/functions/_shared/middleware'
266
-
267
- export const handler = createHandler(async (ctx) => {
268
- // Access principal: ctx.principal (human, machine, or system)
269
- // Access database: ctx.db (RLS-scoped) or import { adminDb } for admin access
270
- // Access query params: ctx.query
271
-
272
- const q = ctx.query || {}
273
- const action = q.action || 'default'
274
-
275
- switch (action) {
276
- case 'default':
277
- return {
278
- message: 'Hello from ${name}',
279
- principal: ctx.principal?.id,
280
- timestamp: new Date().toISOString()
281
- }
282
-
283
- // TODO: Add more actions here
284
- // case 'custom':
285
- // return { data: await yourCustomLogic(ctx) }
286
-
287
- default:
288
- return {
289
- error: 'Unknown action: ' + action,
290
- available_actions: ['default']
291
- }
292
- }
293
- })
294
- `
295
- }
296
-
297
- // ─── COMMAND REGISTRATION ────────────────────────────────────────────────────
298
-
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
- const generate = program
255
+ program
301
256
  .command('generate')
302
- .description('Generate code stubs for extending Spine')
303
-
304
- generate
305
- .command('type <slug>')
306
- .description('Generate a new type with handler and UI stubs')
307
- .option('--name <name>', 'Display name for the type')
308
- .option('--kind <kind>', 'Type kind (item, account, person)', 'item')
309
- .option('--description <desc>', 'Type description')
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
- // Warn if this looks like an existing non-Spine project
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
- // 1. Copy .framework/ into the project
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
- // 2. Create custom/ workspace directories
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
- // Copy custom/.devin if present in package
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
- // 3. Copy config files (vite, tailwind, tsconfig, postcss)
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
- // 4. Copy scripts/
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
- // 5. Copy netlify.toml
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
- // 6. Write package.json
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
- // Merge with existing package.json if present (preserve name, version, existing deps)
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
- // spine template deps win over existing — ensures required tooling is present
183
+
161
184
  dependencies: { ...existing.dependencies, ...pkgJson.dependencies },
162
- // merge: template provides required devDeps, existing additions are preserved
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
- // 7. Write .env template
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
- // 8. Write .gitignore
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
- // Read installed package version from the package's own package.json
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"]