spine-framework 0.3.125 → 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 +169 -97
  6. package/.framework/cli/commands/generate.ts +82 -160
  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} +147 -54
  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 +222 -347
  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 +162 -14
  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 +687 -533
  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 +173 -145
  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 +192 -115
  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 +3 -3
  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,12 +1,18 @@
1
-
2
-
3
- // CIL[BEGIN chunk_id="generate_module_header_1783475972" type="module_header" identity="module_header" parent="none"]
4
- // CIL[DOC-MACRO purpose="Setup imports and path constants for generate command"]
5
- // CIL[DOC-RESPONSIBILITY responsibility="Configure module dependencies and file paths"]
6
- // CIL[DOC-CONTEXT module="cli/commands/generate" layer="cli" related_files="[]"]
7
- // CIL[DOC-CONTRACT inputs="none" outputs="imports, paths" errors="none" side_effects="none"]
8
- // CIL[DOC-MICRO logic_summary="Import CLI framework, database, and file system utilities" notable_decisions="[]"]
9
- // CIL[DOC-CONFIDENCE pass="first" score="0.95" flags="none"]
1
+ // CIL[BEGIN chunk_id="generate_moduleheader_1784069813" type="module_header" identity="module_header" parent="none"]
2
+ // CIL[DOC-MACRO purpose="Module imports for generate CLI commands"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide CLI context, database access, and filesystem utilities"]
4
+ // CIL[DOC-CONTEXT module="cli.commands.generate" layer="cli" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="imports" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Imports Commander, CLI context, admin DB, and Node.js filesystem modules" notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ // CIL[DOC-AUDIENCE audience="developer"]
10
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/principal.ts, \."]
11
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
12
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
13
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
14
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
15
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
10
16
  import type { Command } from 'commander'
11
17
  import { buildCliContext, handleError } from '../context.ts'
12
18
  import { adminDb } from '../../functions/_shared/index.ts'
@@ -17,17 +23,21 @@ import { fileURLToPath } from 'url'
17
23
  const __filename = fileURLToPath(import.meta.url)
18
24
  const __dirname = dirname(__filename)
19
25
  const PROJECT_ROOT = resolve(__dirname, '../../../')
20
- // CIL[END chunk_id="generate_module_header_1783475972"]
21
-
22
-
23
-
24
- // CIL[BEGIN chunk_id="generate_generatetype_1783475972" type="function" identity="generateType" parent="none"]
25
- // CIL[DOC-MACRO purpose="Generate complete type with database record and code stubs"]
26
- // CIL[DOC-RESPONSIBILITY responsibility="Create type in DB and generate handler/UI files"]
27
- // CIL[DOC-CONTEXT module="cli/commands/generate" layer="cli" related_files="[]"]
28
- // CIL[DOC-CONTRACT inputs="ctx, slug, options" outputs="none" errors="database errors, file errors" side_effects="file creation, DB writes"]
29
- // CIL[DOC-MICRO logic_summary="Create DB type record, generate handler stub, generate UI page stub" notable_decisions="[]"]
30
- // CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
26
+ // CIL[END chunk_id="generate_moduleheader_1784069813"]
27
+ // CIL[BEGIN chunk_id="generate_generatetype_1784069813" type="function" identity="generateType" parent="none"]
28
+ // CIL[DOC-MACRO purpose="Generate type, handler, and UI page stubs"]
29
+ // CIL[DOC-RESPONSIBILITY responsibility="Create complete type scaffolding in database and filesystem"]
30
+ // CIL[DOC-CONTEXT module="cli.commands.generate" layer="cli" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
31
+ // CIL[DOC-CONTRACT inputs="none" outputs="database records and files" errors="database errors" side_effects="database writes, file writes"]
32
+ // CIL[DOC-MICRO logic_summary="Creates type record, generates handler stub, creates UI page with React component" notable_decisions="[]"]
33
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
34
+ // CIL[DOC-STABILITY stability="stable"]
35
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
36
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
37
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
38
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
39
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
40
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
31
41
  async function generateType(ctx: any, slug: string, options: any): Promise<void> {
32
42
  const name = options.name || slug.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ')
33
43
  const kind = options.kind || 'item'
@@ -35,8 +45,6 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
35
45
 
36
46
  console.log(`\n🔧 Generating type '${slug}'...`)
37
47
 
38
-
39
-
40
48
  const { data: existing, error: checkErr } = await adminDb
41
49
  .from('types')
42
50
  .select('id')
@@ -92,7 +100,6 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
92
100
  console.log(' ✓ Type record created')
93
101
  }
94
102
 
95
-
96
103
  const handlerPath = resolve(PROJECT_ROOT, `v2-custom/functions/${slug}.ts`)
97
104
 
98
105
  if (existsSync(handlerPath) && !options.force) {
@@ -103,7 +110,6 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
103
110
  console.log(` ✓ Handler stub created: v2-custom/functions/${slug}.ts`)
104
111
  }
105
112
 
106
-
107
113
  const pageDir = resolve(PROJECT_ROOT, `v2-custom/src/pages/${slug}`)
108
114
  const pagePath = resolve(pageDir, 'index.tsx')
109
115
 
@@ -122,15 +128,21 @@ async function generateType(ctx: any, slug: string, options: any): Promise<void>
122
128
  console.log(` 2. Edit v2-custom/src/pages/${slug}/index.tsx to customize the UI`)
123
129
  console.log(` 3. Run 'spine dev' to see your changes`)
124
130
  }
125
- // CIL[END chunk_id="generate_generatetype_1783475972"]
126
-
127
- // CIL[BEGIN chunk_id="generate_generatehandlerstub_1783475972" type="function" identity="generateHandlerStub" parent="none"]
128
- // CIL[DOC-MACRO purpose="Generate TypeScript handler stub with CRUD methods"]
129
- // CIL[DOC-RESPONSIBILITY responsibility="Create template handler code for new types"]
130
- // CIL[DOC-CONTEXT module="cli/commands/generate" layer="cli" related_files="[]"]
131
- // CIL[DOC-CONTRACT inputs="slug, kind, name" outputs="string handler code" errors="none" side_effects="none"]
132
- // CIL[DOC-MICRO logic_summary="Return template string with handler structure and HTTP methods" notable_decisions="[]"]
133
- // CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
131
+ // CIL[END chunk_id="generate_generatetype_1784069813"]
132
+ // CIL[BEGIN chunk_id="generate_generatehandlerstub_1784069813" type="function" identity="generateHandlerStub" parent="none"]
133
+ // CIL[DOC-MACRO purpose="Generate TypeScript handler stub code"]
134
+ // CIL[DOC-RESPONSIBILITY responsibility="Create API handler template with method routing"]
135
+ // CIL[DOC-CONTEXT module="cli.commands.generate" layer="cli" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
136
+ // CIL[DOC-CONTRACT inputs="none" outputs="handler code string" errors="none" side_effects="none"]
137
+ // CIL[DOC-MICRO logic_summary="Returns template code for API handler with GET, POST, PATCH, DELETE methods" notable_decisions="[]"]
138
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
139
+ // CIL[DOC-STABILITY stability="stable"]
140
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/schema-utils.ts, \."]
141
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
142
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
143
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
144
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
145
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
134
146
  function generateHandlerStub(slug: string, kind: string, name: string): string {
135
147
  return `/**
136
148
  * @module ${slug}
@@ -151,19 +163,15 @@ export const handler = createHandler(async (ctx) => {
151
163
 
152
164
  switch (method) {
153
165
  case 'GET':
154
- // TODO: Implement GET logic
155
166
  return { message: '${name} handler - GET not implemented' }
156
167
 
157
168
  case 'POST':
158
- // TODO: Implement POST logic
159
169
  return { message: '${name} handler - POST not implemented' }
160
170
 
161
171
  case 'PATCH':
162
- // TODO: Implement PATCH logic
163
172
  return { message: '${name} handler - PATCH not implemented' }
164
173
 
165
174
  case 'DELETE':
166
- // TODO: Implement DELETE logic
167
175
  return { message: '${name} handler - DELETE not implemented' }
168
176
 
169
177
  default:
@@ -172,15 +180,21 @@ export const handler = createHandler(async (ctx) => {
172
180
  })
173
181
  `
174
182
  }
175
- // CIL[END chunk_id="generate_generatehandlerstub_1783475972"]
176
-
177
- // CIL[BEGIN chunk_id="generate_generatepagestub_1783475972" type="function" identity="generatePageStub" parent="none"]
178
- // CIL[DOC-MACRO purpose="Generate React UI page stub for type management"]
179
- // CIL[DOC-RESPONSIBILITY responsibility="Create template React component with API integration"]
180
- // CIL[DOC-CONTEXT module="cli/commands/generate" layer="cli" related_files="[]"]
181
- // CIL[DOC-CONTRACT inputs="slug, name, kind" outputs="string React component code" errors="none" side_effects="none"]
182
- // CIL[DOC-MICRO logic_summary="Return template string with React component and API hooks" notable_decisions="[]"]
183
- // CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
183
+ // CIL[END chunk_id="generate_generatehandlerstub_1784069813"]
184
+ // CIL[BEGIN chunk_id="generate_generatepagestub_1784069813" type="function" identity="generatePageStub" parent="none"]
185
+ // CIL[DOC-MACRO purpose="Generate React page stub code"]
186
+ // CIL[DOC-RESPONSIBILITY responsibility="Create UI page template with API integration"]
187
+ // CIL[DOC-CONTEXT module="cli.commands.generate" layer="cli" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
188
+ // CIL[DOC-CONTRACT inputs="none" outputs="page code string" errors="none" side_effects="none"]
189
+ // CIL[DOC-MICRO logic_summary="Returns React component template with API hooks and data display" notable_decisions="[]"]
190
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
191
+ // CIL[DOC-STABILITY stability="stable"]
192
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
193
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
194
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
195
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
196
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
197
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
184
198
  function generatePageStub(slug: string, name: string, kind: string): string {
185
199
  return `/**
186
200
  * @page ${slug}/index
@@ -222,108 +236,29 @@ export default function ${name.replace(/\s+/g, '')}Page() {
222
236
  }
223
237
  `
224
238
  }
225
- // CIL[END chunk_id="generate_generatepagestub_1783475972"]
226
-
227
-
228
-
229
- // CIL[BEGIN chunk_id="generate_generatefunction_1783475972" type="function" identity="generateFunction" parent="none"]
230
- // CIL[DOC-MACRO purpose="Generate standalone Netlify function stub"]
231
- // CIL[DOC-RESPONSIBILITY responsibility="Create custom function file with basic structure"]
232
- // CIL[DOC-CONTEXT module="cli/commands/generate" layer="cli" related_files="[]"]
233
- // CIL[DOC-CONTRACT inputs="name, options" outputs="none" errors="file errors" side_effects="file creation"]
234
- // CIL[DOC-MICRO logic_summary="Check existing file, generate function stub, write to disk" notable_decisions="[]"]
235
- // CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
236
- async function generateFunction(name: string, options: any): Promise<void> {
237
- console.log(`\n🔧 Generating function '${name}'...`)
238
-
239
- const handlerPath = resolve(PROJECT_ROOT, `v2-custom/functions/${name}.ts`)
240
-
241
- if (existsSync(handlerPath) && !options.force) {
242
- console.log(` ⚠️ Function already exists: ${handlerPath}`)
243
- console.log(` Use --force to overwrite`)
244
- return
245
- }
246
-
247
- const handlerCode = generateFunctionStub(name, options.description)
248
- writeFileSync(handlerPath, handlerCode)
249
-
250
- console.log(`✅ Function '${name}' created!`)
251
- console.log(` Location: v2-custom/functions/${name}.ts`)
252
- console.log(` Next steps:`)
253
- console.log(` 1. Edit the handler to implement your logic`)
254
- console.log(` 2. Run 'spine dev' to see your changes`)
255
- }
256
- // CIL[END chunk_id="generate_generatefunction_1783555400"]
257
-
258
- // CIL[BEGIN chunk_id="generate_generatefunctionstub_1783555400" type="function" identity="generateFunctionStub" parent="none"]
259
- // CIL[DOC-MACRO purpose="Generate standalone Netlify function template"]
260
- // CIL[DOC-RESPONSIBILITY responsibility="Create template function with action routing"]
261
- // CIL[DOC-CONTEXT module="cli/commands/generate" layer="cli" related_files="[]"]
262
- // CIL[DOC-CONTRACT inputs="name, description" outputs="string function code" errors="none" side_effects="none"]
263
- // CIL[DOC-MICRO logic_summary="Return template string with handler structure and action switch" notable_decisions="[]"]
264
- // CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
265
- function generateFunctionStub(name: string, description?: string): string {
266
- return `/**
267
- * @module ${name}
268
- * @audience custom
269
- * @layer api-handler
270
- * @stability experimental
271
- *
272
- * ${description || `Custom Netlify function: ${name}`}
273
- * Generated by spine CLI on ${new Date().toISOString()}.
274
- */
275
-
276
- import { createHandler } from '../v2-core/functions/_shared/middleware'
277
-
278
- export const handler = createHandler(async (ctx) => {
279
- // Access principal: ctx.principal (human, machine, or system)
280
- // Access database: ctx.db (RLS-scoped) or import { adminDb } for admin access
281
- // Access query params: ctx.query
282
-
283
- const q = ctx.query || {}
284
- const action = q.action || 'default'
285
-
286
- switch (action) {
287
- case 'default':
288
- return {
289
- message: 'Hello from ${name}',
290
- principal: ctx.principal?.id,
291
- timestamp: new Date().toISOString()
292
- }
293
-
294
- // TODO: Add more actions here
295
- // case 'custom':
296
- // return { data: await yourCustomLogic(ctx) }
297
-
298
- default:
299
- return {
300
- error: 'Unknown action: ' + action,
301
- available_actions: ['default']
302
- }
303
- }
304
- })
305
- `
306
- }
307
- // CIL[END chunk_id="generate_generatefunctionstub_1783555400"]
308
-
309
- // CIL[BEGIN chunk_id="generate_registergeneratecommands_1783555400" type="function" identity="registerGenerateCommands" parent="none"]
310
- // CIL[DOC-MACRO purpose="Register generate CLI commands for type and function scaffolding"]
311
- // CIL[DOC-RESPONSIBILITY responsibility="Setup CLI interface for code generation tools"]
312
- // CIL[DOC-CONTEXT module="cli/commands/generate" layer="cli" related_files="[]"]
313
- // CIL[DOC-CONTRACT inputs="Command program" outputs="registered CLI commands" errors="CLI errors" side_effects="none"]
314
- // CIL[DOC-MICRO logic_summary="Register 'generate type' and 'generate function' subcommands with options" notable_decisions="[]"]
315
- // CIL[DOC-CONFIDENCE pass="first" score="0.90" flags="none"]
239
+ // CIL[END chunk_id="generate_generatepagestub_1784069813"]
240
+ // CIL[BEGIN chunk_id="generate_registergeneratecommands_1784069813" type="function" identity="registerGenerateCommands" parent="none"]
241
+ // CIL[DOC-MACRO purpose="Register generate command with CLI program"]
242
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide CLI interface for type generation"]
243
+ // CIL[DOC-CONTEXT module="cli.commands.generate" layer="cli" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/db.ts\"]"]
244
+ // CIL[DOC-CONTRACT inputs="none" outputs="CLI command registration" errors="command errors" side_effects="none"]
245
+ // CIL[DOC-MICRO logic_summary="Registers generate command with slug argument and various options" notable_decisions="[]"]
246
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
247
+ // CIL[DOC-STABILITY stability="stable"]
248
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/db.ts."]
249
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
250
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
251
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
252
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
253
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
316
254
  export function registerGenerateCommands(program: Command) {
317
- const generate = program
255
+ program
318
256
  .command('generate')
319
- .description('Generate code stubs for extending Spine')
320
-
321
- generate
322
- .command('type <slug>')
323
- .description('Generate a new type with handler and UI stubs')
324
- .option('--name <name>', 'Display name for the type')
325
- .option('--kind <kind>', 'Type kind (item, account, person)', 'item')
326
- .option('--description <desc>', 'Type description')
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')
327
262
  .option('--force', 'Overwrite existing files', false)
328
263
  .action(async (slug, opts) => {
329
264
  try {
@@ -333,18 +268,5 @@ export function registerGenerateCommands(program: Command) {
333
268
  handleError(err)
334
269
  }
335
270
  })
336
-
337
- generate
338
- .command('function <name>')
339
- .description('Generate a new Netlify function stub')
340
- .option('--description <desc>', 'Function description')
341
- .option('--force', 'Overwrite existing file', false)
342
- .action(async (name, opts) => {
343
- try {
344
- await generateFunction(name, opts)
345
- } catch (err: any) {
346
- handleError(err)
347
- }
348
- })
349
271
  }
350
- // CIL[END chunk_id="generate_registergeneratecommands_1783555400"]
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"]