spine-framework 0.3.125 → 0.3.127

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 -161
  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,36 +1,51 @@
1
1
  #!/usr/bin/env tsx
2
2
 
3
- /**
4
- * @module scripts/app-install-cli
5
- * @audience installer
6
- * @layer cli
7
- * @stability orphaned
8
- *
9
- * Spine App Installation CLI - Validates and executes app installation instruction files.
10
- * **ORPHANED**: References non-existent schema and template files at `../docs/app-installation/`.
11
- *
12
- * **Intended Purpose**: Validate YAML instruction files against JSON schema and execute
13
- * multi-step app installations (pack installation, app creation, migrations, verification).
14
- *
15
- * **Current State**: Cannot function - missing required schema.json and template files.
16
- *
17
- * **Dependencies**: commander, js-yaml, ajv for CLI operations and validation.
18
- *
19
- * @tags orphaned, cli, app-installation, validation
20
- */
21
3
 
4
+
5
+
6
+
7
+
8
+
9
+
10
+ // CIL[BEGIN chunk_id="app-install-cli_module_header_1783931090" type="module_header" identity="imports" parent="none"]
11
+ // CIL[DOC-MACRO purpose="Import Node.js modules for CLI app installation tool"]
12
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports for CLI operations"]
13
+ // CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
14
+ // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and utilities" errors="Import failures" side_effects="Module loading"]
15
+ // CIL[DOC-MICRO logic_summary="Imports file system, CLI, YAML validation, and ES modules utilities" notable_decisions="[]"]
16
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
17
+ // CIL[DOC-STABILITY stability="stable"]
18
+ // CIL[DOC-AUDIENCE audience="developer"]
19
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
20
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
21
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
22
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
23
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
24
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
22
25
  import { readFileSync, existsSync, writeFileSync } from 'fs'
23
26
  import { resolve, dirname } from 'path'
24
27
  import { program } from 'commander'
25
28
  import yaml from 'js-yaml'
26
29
  import Ajv from 'ajv'
27
30
  import { fileURLToPath } from 'url'
28
-
29
- // Fix __dirname for ES modules
31
+ // CIL[END chunk_id="app-install-cli_module_header_1783931090"]
32
+ // CIL[BEGIN chunk_id="app-install-cli_setup_1783931090" type="setup" identity="setup" parent="none"]
33
+ // CIL[DOC-MACRO purpose="Initialize CLI environment, schema validation, and type definitions"]
34
+ // CIL[DOC-RESPONSIBILITY responsibility="Set up file paths, schema validator, and installation context"]
35
+ // CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/db.ts\",\"\\\"]"]
36
+ // CIL[DOC-CONTRACT inputs="none" outputs="Schema validator, file paths, context interface" errors="Schema loading failures" side_effects="File system reads"]
37
+ // CIL[DOC-MICRO logic_summary="Resolves paths, loads schema, creates validator, defines context interface" notable_decisions="['schema_loading', 'ajv_validation']"]
38
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
39
+ // CIL[DOC-STABILITY stability="stable"]
40
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/db.ts, \."]
41
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
42
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
43
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
44
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
45
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
30
46
  const __filename = fileURLToPath(import.meta.url)
31
47
  const __dirname = dirname(__filename)
32
48
 
33
- // Load JSON schema
34
49
  const schemaPath = resolve(__dirname, '../docs/app-installation/schema.json')
35
50
  const schema = JSON.parse(readFileSync(schemaPath, 'utf8'))
36
51
 
@@ -42,22 +57,21 @@ interface InstallationContext {
42
57
  PACK_INSTALLATION_ID?: string
43
58
  [key: string]: string | undefined
44
59
  }
45
-
46
- // ─── CHUNK_START: APP_INSTALL_CLI_SUBSTITUTE_VARIABLES ──────────────────────────────────────────────
47
- /**
48
- * @chunk-id APP_INSTALL_CLI_SUBSTITUTE_VARIABLES_1_0_0
49
- * @version 1.0.0
50
- * @hash 122ca9e63f2310e8a01f76dc9c962319d8e267d8737c39895425440489a747bd
51
- * @macro Variable Substitution Engine
52
- * @micro Recursively replaces ${VAR} placeholders with context values
53
- * @inputs obj: any — Object containing ${VAR} placeholders
54
- * @inputs context: InstallationContext — Variable name to value mapping
55
- * @outputs any — Object with all placeholders substituted
56
- * @depends-on [none]
57
- * @depended-by [validateInstructionFile, executeInstallation]
58
- * @side-effects [none]
59
- * @tags orphaned, variable-substitution, template-engine
60
- */
60
+ // CIL[END chunk_id="app-install-cli_setup_1783931090"]
61
+ // CIL[BEGIN chunk_id="app-install-cli_substitutevariables_1783931090" type="function" identity="substituteVariables" parent="none"]
62
+ // CIL[DOC-MACRO purpose="Recursively substitute ${VAR} placeholders with context values"]
63
+ // CIL[DOC-RESPONSIBILITY responsibility="Variable template substitution engine for installation configs"]
64
+ // CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/db.ts\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
65
+ // CIL[DOC-CONTRACT inputs="none" outputs="substituted object" errors="none" side_effects="none"]
66
+ // CIL[DOC-MICRO logic_summary="Handles strings, arrays, and objects recursively with regex replacement" notable_decisions="['recursive_substitution', 'fallback_to_match']"]
67
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
68
+ // CIL[DOC-STABILITY stability="stable"]
69
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 2. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/db.ts, .framework/src/components/ui/table-primitives.tsx, \."]
70
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 2. Total affected: 2."]
71
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
72
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
73
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
74
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
61
75
  function substituteVariables(obj: any, context: InstallationContext): any {
62
76
  if (typeof obj === 'string') {
63
77
  return obj.replace(/\$\{([^}]+)\}/g, (match, varName) => {
@@ -74,22 +88,21 @@ function substituteVariables(obj: any, context: InstallationContext): any {
74
88
  }
75
89
  return obj
76
90
  }
77
- // ─── CHUNK_END: APP_INSTALL_CLI_SUBSTITUTE_VARIABLES ────────────────────────────────────────────────
78
-
79
- // ─── CHUNK_START: APP_INSTALL_CLI_VALIDATE_INSTRUCTION_FILE ──────────────────────────────────────────────
80
- /**
81
- * @chunk-id APP_INSTALL_CLI_VALIDATE_INSTRUCTION_FILE_1_0_0
82
- * @version 1.0.0
83
- * @hash c673609fd3442632d832e0c4c3ef2dbda0a51e381bb469e55b7e2cc59005b5e2
84
- * @macro Installation File Validation
85
- * @micro Validates YAML instruction files against JSON schema
86
- * @inputs filePath: string — Path to YAML instruction file
87
- * @outputs boolean — true if valid, false otherwise
88
- * @depends-on [schema, validate, substituteVariables]
89
- * @depended-by [executeInstallation]
90
- * @side-effects [console output, file system reads]
91
- * @tags orphaned, validation, yaml, json-schema
92
- */
91
+ // CIL[END chunk_id="app-install-cli_substitutevariables_1783931090"]
92
+ // CIL[BEGIN chunk_id="app-install-cli_validateinstructionfile_1783931090" type="function" identity="validateInstructionFile" parent="none"]
93
+ // CIL[DOC-MACRO purpose="Validate YAML instruction files against JSON schema"]
94
+ // CIL[DOC-RESPONSIBILITY responsibility="Schema validation and file existence checking"]
95
+ // CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
96
+ // CIL[DOC-CONTRACT inputs="none" outputs="validation result" errors="File not found, validation failures" side_effects="Console output, process.exit"]
97
+ // CIL[DOC-MICRO logic_summary="Checks file existence, loads YAML, validates against schema, exits on failure" notable_decisions="['process_exit_on_failure', 'schema_validation']"]
98
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
99
+ // CIL[DOC-STABILITY stability="stable"]
100
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 1. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
101
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
102
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
103
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
104
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
105
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
93
106
  async function validateInstructionFile(filePath: string): Promise<void> {
94
107
  try {
95
108
  console.log(`🔍 Validating ${filePath}...`)
@@ -102,7 +115,6 @@ async function validateInstructionFile(filePath: string): Promise<void> {
102
115
  const content = readFileSync(filePath, 'utf8')
103
116
  const data = yaml.load(content) as any
104
117
 
105
- // Validate against schema
106
118
  if (!validate(data)) {
107
119
  console.error('❌ Validation failed:')
108
120
  console.error(JSON.stringify(validate.errors, null, 2))
@@ -115,34 +127,30 @@ async function validateInstructionFile(filePath: string): Promise<void> {
115
127
  process.exit(1)
116
128
  }
117
129
  }
118
- // ─── CHUNK_END: APP_INSTALL_CLI_VALIDATE_INSTRUCTION_FILE ────────────────────────────────────────────────
119
-
120
- // ─── CHUNK_START: APP_INSTALL_CLI_EXECUTE_INSTALLATION ──────────────────────────────────────────────
121
- /**
122
- * @chunk-id APP_INSTALL_CLI_EXECUTE_INSTALLATION_1_0_0
123
- * @version 1.0.0
124
- * @hash c84aa57769569e4b00ebde4d8b29b7059e6b0d6e8eb3d82cfa51c15e1451e04a
125
- * @macro Multi-Step App Installation Executor
126
- * @micro Orchestrates pack installation, app creation, migrations, and verification
127
- * @inputs filePath: string — Path to YAML instruction file
128
- * @inputs options: any — CLI options including accountId
129
- * @outputs void — Console output only
130
- * @depends-on [validateInstructionFile, substituteVariables, yaml, fs]
131
- * @depended-by [CLI program command handler]
132
- * @side-effects [console output, file system reads, process.exit on failure]
133
- * @tags orphaned, installation, orchestration, multi-step
134
- */
130
+ // CIL[END chunk_id="app-install-cli_validateinstructionfile_1783931090"]
131
+ // CIL[BEGIN chunk_id="app-install-cli_executeinstallation_1783931090" type="function" identity="executeInstallation" parent="none"]
132
+ // CIL[DOC-MACRO purpose="Execute multi-step app installation from instruction files"]
133
+ // CIL[DOC-RESPONSIBILITY responsibility="Orchestrate complete app installation workflow"]
134
+ // CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
135
+ // CIL[DOC-CONTRACT inputs="none" outputs="installation result" errors="Installation failures" side_effects="Console output, process.exit"]
136
+ // CIL[DOC-MICRO logic_summary="Validates, sets context, simulates pack install, creates apps, runs migrations, verifies" notable_decisions="['simulated_installation', 'step_by_step_execution']"]
137
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="complex_dependencies"]
138
+ // CIL[DOC-STABILITY stability="stable"]
139
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
140
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
141
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
142
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
143
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
144
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
135
145
  async function executeInstallation(filePath: string, options: any): Promise<void> {
136
146
  try {
137
147
  console.log(`🚀 Executing installation from ${filePath}...`)
138
148
 
139
- // First validate
140
149
  await validateInstructionFile(filePath)
141
150
 
142
151
  const content = readFileSync(filePath, 'utf8')
143
152
  const instructions = yaml.load(content) as any
144
153
 
145
- // Set up context
146
154
  const context: InstallationContext = {
147
155
  TARGET_ACCOUNT_ID: options.accountId,
148
156
  ...instructions.variables
@@ -153,17 +161,14 @@ async function executeInstallation(filePath: string, options: any): Promise<void
153
161
  console.log(` Target Account: ${context.TARGET_ACCOUNT_ID}`)
154
162
  console.log()
155
163
 
156
- // Step 1: Pack installation
157
164
  console.log('📦 Step 1: Installing pack...')
158
165
  const packInstall = substituteVariables(instructions.installation.pack_installation, context)
159
166
  console.log(' Pack installation config:', JSON.stringify(packInstall, null, 2))
160
167
 
161
- // Simulate pack installation - in real implementation, this would call the API
162
168
  const packInstallationId = 'simulated-pack-id-' + Date.now()
163
169
  context.PACK_INSTALLATION_ID = packInstallationId
164
170
  console.log(` ✅ Pack installed with ID: ${packInstallationId}`)
165
171
 
166
- // Step 2: App creation
167
172
  console.log('⚙️ Step 2: Creating app definitions...')
168
173
  if (instructions.installation.app_creation) {
169
174
  for (const appDef of instructions.installation.app_creation) {
@@ -174,7 +179,6 @@ async function executeInstallation(filePath: string, options: any): Promise<void
174
179
  }
175
180
  }
176
181
 
177
- // Step 3: Migrations
178
182
  console.log('🔄 Step 3: Running migrations...')
179
183
  if (instructions.installation.migrations) {
180
184
  for (const migration of instructions.installation.migrations) {
@@ -187,7 +191,6 @@ async function executeInstallation(filePath: string, options: any): Promise<void
187
191
  }
188
192
  }
189
193
 
190
- // Step 4: Verification
191
194
  console.log('✅ Step 4: Verifying installation...')
192
195
  if (instructions.installation.verification) {
193
196
  for (const verification of instructions.installation.verification) {
@@ -207,23 +210,21 @@ async function executeInstallation(filePath: string, options: any): Promise<void
207
210
  process.exit(1)
208
211
  }
209
212
  }
210
- // ─── CHUNK_END: APP_INSTALL_CLI_EXECUTE_INSTALLATION ────────────────────────────────────────────────
211
-
212
- // ─── CHUNK_START: APP_INSTALL_CLI_GENERATE_TEMPLATE ──────────────────────────────────────────────
213
- /**
214
- * @chunk-id APP_INSTALL_CLI_GENERATE_TEMPLATE_1_0_0
215
- * @version 1.0.0
216
- * @hash 4ea17e0556f329f835cec106f09cb570c9e4ea8a92bc82e5fe9ccf4b5dd52aa9
217
- * @macro Template Generator
218
- * @micro Outputs YAML templates for app installations or migrations
219
- * @inputs type: string — Template type ("app" or "migration")
220
- * @inputs options: any — CLI options including output file path
221
- * @outputs void — Console output or file write
222
- * @depends-on [fs, path]
223
- * @depended-by [CLI program command handler]
224
- * @side-effects [console output, file system reads/writes, process.exit on failure]
225
- * @tags orphaned, template-generation, yaml, cli
226
- */
213
+ // CIL[END chunk_id="app-install-cli_executeinstallation_1783931090"]
214
+ // CIL[BEGIN chunk_id="app-install-cli_generatetemplate_1783931090" type="function" identity="generateTemplate" parent="none"]
215
+ // CIL[DOC-MACRO purpose="Generate YAML templates for app installations or migrations"]
216
+ // CIL[DOC-RESPONSIBILITY responsibility="Template generation and file output management"]
217
+ // CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[]"]
218
+ // CIL[DOC-CONTRACT inputs="none" outputs="template content" errors="Template loading failures" side_effects="File writes, console output"]
219
+ // CIL[DOC-MICRO logic_summary="Resolves template paths, loads files, outputs to file or stdout" notable_decisions="['template_type_switching', 'output_option_handling']"]
220
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
221
+ // CIL[DOC-STABILITY stability="stable"]
222
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
223
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
224
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
225
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
226
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
227
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
227
228
  async function generateTemplate(type: string, options: any): Promise<void> {
228
229
  try {
229
230
  const templateDir = resolve(__dirname, '../docs/app-installation/templates')
@@ -254,9 +255,21 @@ async function generateTemplate(type: string, options: any): Promise<void> {
254
255
  process.exit(1)
255
256
  }
256
257
  }
257
- // ─── CHUNK_END: APP_INSTALL_CLI_GENERATE_TEMPLATE ────────────────────────────────────────────────
258
-
259
- // CLI setup
258
+ // CIL[END chunk_id="app-install-cli_generatetemplate_1783931090"]
259
+ // CIL[BEGIN chunk_id="app-install-cli_cli_setup_1783931090" type="cli_setup" identity="cli_setup" parent="none"]
260
+ // CIL[DOC-MACRO purpose="Define CLI commands and argument parsing"]
261
+ // CIL[DOC-RESPONSIBILITY responsibility="Set up commander.js CLI interface with commands and options"]
262
+ // CIL[DOC-CONTEXT module="app-install-cli" layer="cli" related_files="[]"]
263
+ // CIL[DOC-CONTRACT inputs="none" outputs="CLI interface" errors="Command parsing errors" side_effects="CLI execution"]
264
+ // CIL[DOC-MICRO logic_summary="Configures validate, install, and template commands with arguments and options" notable_decisions="['commander_setup', 'action_binding']"]
265
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
266
+ // CIL[DOC-STABILITY stability="stable"]
267
+ // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
268
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
269
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
270
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
271
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
272
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
260
273
  program
261
274
  .name('app-install-cli')
262
275
  .description('Spine App Installation CLI - Validate and execute app installation instructions')
@@ -284,3 +297,4 @@ program
284
297
  .action(generateTemplate)
285
298
 
286
299
  program.parse()
300
+ // CIL[END chunk_id="app-install-cli_cli_setup_1783931090"]
@@ -1,3 +1,22 @@
1
+
2
+
3
+
4
+
5
+ // CIL[BEGIN chunk_id="App_module_header_1783931090" type="module_header" identity="imports" parent="none"]
6
+ // CIL[DOC-MACRO purpose="Import React and routing dependencies for main app component"]
7
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage all external module imports and lazy loading"]
8
+ // CIL[DOC-CONTEXT module="App" layer="entry-point" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
9
+ // CIL[DOC-CONTRACT inputs="none" outputs="Imported modules and lazy components" errors="Import failures" side_effects="Module loading"]
10
+ // CIL[DOC-MICRO logic_summary="Imports React hooks, routing components, pages, and app shell components" notable_decisions="['lazy_load_admin_app']"]
11
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
12
+ // CIL[DOC-STABILITY stability="stable"]
13
+ // CIL[DOC-AUDIENCE audience="developer"]
14
+ // CIL[DOC-VECTOR type="context" content="Layer: entry-point. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/components/ui/dialog.tsx, \."]
15
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
16
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
17
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
18
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
19
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
1
20
  import { Suspense, lazy, useEffect } from 'react'
2
21
  import { Routes, Route, Navigate, useNavigate, useLocation } from 'react-router-dom'
3
22
  import { useAuth } from './contexts/AuthContext'
@@ -15,9 +34,22 @@ import { CustomAppLoader } from './components/CustomAppLoader'
15
34
  import { GenericAppShell } from './components/app-shell/GenericAppShell'
16
35
  import { APIPage } from './pages/spine-framework/APIPage'
17
36
  import { CLIPage } from './pages/spine-framework/CLIPage'
18
-
19
37
  const AdminApp = lazy(() => import('./apps/admin/index'))
20
-
38
+ // CIL[END chunk_id="App_module_header_1783931090"]
39
+ // CIL[BEGIN chunk_id="App_app_1783931090" type="function" identity="App" parent="none"]
40
+ // CIL[DOC-MACRO purpose="Root app component handling authentication state and routing"]
41
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage global app state, auth flows, and route selection"]
42
+ // CIL[DOC-CONTEXT module="App" layer="entry-point" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
43
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX routes based on auth state" errors="Auth context failures" side_effects="Navigation, route rendering"]
44
+ // CIL[DOC-MICRO logic_summary="Shows loading, handles auth states, routes to appropriate components" notable_decisions="['ternary_auth_routing', 'setup_mode_check']"]
45
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
46
+ // CIL[DOC-STABILITY stability="stable"]
47
+ // CIL[DOC-VECTOR type="context" content="Layer: entry-point. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/components/ui/dialog.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
48
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
49
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
50
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
51
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
52
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
21
53
  function App() {
22
54
  const { user, isLoading } = useAuth()
23
55
 
@@ -40,7 +72,6 @@ function App() {
40
72
  <Route path="/register" element={<RegisterPage />} />
41
73
  <Route path="/forgot-password" element={<ForgotPasswordPage />} />
42
74
  <Route path="/auth/confirm" element={<AuthConfirmPage />} />
43
- {/* / shows setup instructions only when VITE_SETUP_MODE=true */}
44
75
  <Route
45
76
  path="/"
46
77
  element={
@@ -52,7 +83,6 @@ function App() {
52
83
  <Route path="*" element={<Navigate to="/login" replace />} />
53
84
  </Routes>
54
85
  ) : user.status === 'pending' ? (
55
- // Access request submitted but not yet approved — block full app access
56
86
  <Routes>
57
87
  <Route path="*" element={<PendingApprovalPage />} />
58
88
  </Routes>
@@ -62,22 +92,32 @@ function App() {
62
92
  </AppsRegistryProvider>
63
93
  )
64
94
  }
65
-
95
+ // CIL[END chunk_id="App_app_1783931090"]
96
+ // CIL[BEGIN chunk_id="App_authenticatedrouter_1783931090" type="function" identity="AuthenticatedRouter" parent="none"]
97
+ // CIL[DOC-LEARNING topic="App:renderer_switch" content="The public.apps.renderer field switches routing: 'custom' uses CustomAppLoader and loads custom/apps/<slug>/index.tsx; 'generic' uses GenericAppShell and builds a schema-driven UI from nav_items."]
98
+ // CIL[DOC-MACRO purpose="Handle authenticated user routing and dynamic app loading"]
99
+ // CIL[DOC-RESPONSIBILITY responsibility="Manage app registry, route sorting, and dynamic component rendering"]
100
+ // CIL[DOC-CONTEXT module="App" layer="routing" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
101
+ // CIL[DOC-CONTRACT inputs="none" outputs="Dynamic routes for authenticated apps" errors="App loading failures" side_effects="Navigation, lazy loading"]
102
+ // CIL[DOC-MICRO logic_summary="Loads apps, sorts routes, handles redirects, renders dynamic app components" notable_decisions="['route_prefix_sorting', 'renderer_type_switching']"]
103
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
104
+ // CIL[DOC-STABILITY stability="stable"]
105
+ // CIL[DOC-VECTOR type="context" content="Layer: routing. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
106
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
107
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
108
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
109
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
110
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
66
111
  function AuthenticatedRouter() {
67
112
  const { user } = useAuth()
68
113
  const { routableApps: apps, loading } = useAppsRegistry()
69
114
  const navigate = useNavigate()
70
115
  const location = useLocation()
71
116
 
72
- // Where to send an already-authenticated user who lands on /login or /register.
73
- // System admins go to the framework admin namespace; everyone else goes to the
74
- // first app they are allowed to access (routableApps is already role-filtered).
75
117
  const defaultRedirect = user?.roles?.includes('system_admin')
76
118
  ? '/spine-framework/admin'
77
119
  : (apps[0]?.route_prefix || '/')
78
120
 
79
- // Redirect away from auth pages once apps have loaded.
80
- // This fires reliably after loading completes, regardless of render timing.
81
121
  useEffect(() => {
82
122
  if (!loading && ['/login', '/register'].includes(location.pathname)) {
83
123
  navigate(defaultRedirect, { replace: true })
@@ -95,35 +135,28 @@ function AuthenticatedRouter() {
95
135
  )
96
136
  }
97
137
 
98
- // Sort: longer explicit prefixes first (most specific), root (/) last.
99
- // The /spine-framework namespace is registered statically before dynamic routes
100
- // so it always wins — but also filter it from dynamic registration to be safe.
101
138
  const sorted = [...apps]
102
139
  .filter(app => app.slug !== 'spine-framework' && !app.route_prefix?.startsWith('/spine-framework'))
103
140
  .sort((a, b) => {
104
- if (a.route_prefix === '/') return 1 // root always last
141
+ if (a.route_prefix === '/') return 1
105
142
  if (b.route_prefix === '/') return -1
106
143
  return (b.route_prefix?.length || 0) - (a.route_prefix?.length || 0)
107
144
  })
108
145
 
109
- // Build a valid route path: prefix "/" must become "/*", not "//*"
110
146
  const toRoutePath = (prefix: string) => prefix === '/' ? '/*' : `${prefix}/*`
111
147
 
112
148
  return (
113
149
  <Suspense fallback={<div className="min-h-screen flex items-center justify-center"><LoadingSpinner /></div>}>
114
150
  <Routes>
115
- {/* ── Spine Framework namespace — registered first, always wins over /* ── */}
116
151
  <Route path="/spine-framework/admin/*" element={<AdminApp />} />
117
152
  <Route path="/spine-framework/api" element={<APIPage />} />
118
153
  <Route path="/spine-framework/cli" element={<CLIPage />} />
119
154
 
120
- {/* Auth routes: redirect handled by useEffect above, but keep as fallback */}
121
155
  <Route path="/login" element={<Navigate to={defaultRedirect} replace />} />
122
156
  <Route path="/register" element={<RegisterPage />} />
123
157
  <Route path="/forgot-password" element={<ForgotPasswordPage />} />
124
158
  <Route path="/auth/confirm" element={<AuthConfirmPage />} />
125
159
 
126
- {/* Dynamic app routes — no framework opinions about / or /dashboard */}
127
160
  {sorted.map(app => {
128
161
  const prefix = app.route_prefix!
129
162
 
@@ -158,11 +191,25 @@ function AuthenticatedRouter() {
158
191
  return null
159
192
  })}
160
193
 
161
- {/* No apps claim this path */}
162
194
  <Route path="*" element={<NotFoundPage />} />
163
195
  </Routes>
164
196
  </Suspense>
165
197
  )
166
198
  }
167
-
199
+ // CIL[END chunk_id="App_authenticatedrouter_1783931090"]
200
+ // CIL[BEGIN chunk_id="App_export_1783931090" type="export" identity="export_default" parent="none"]
201
+ // CIL[DOC-MACRO purpose="Export the main App component as default"]
202
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide the entry point for the React application"]
203
+ // CIL[DOC-CONTEXT module="App" layer="entry-point" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
204
+ // CIL[DOC-CONTRACT inputs="none" outputs="App component" errors="none" side_effects="Application bootstrap"]
205
+ // CIL[DOC-MICRO logic_summary="Default export of the root App component" notable_decisions="[]"]
206
+ // CIL[DOC-CONFIDENCE pass="second" score="1.00" flags="none"]
207
+ // CIL[DOC-STABILITY stability="stable"]
208
+ // CIL[DOC-VECTOR type="context" content="Layer: entry-point. 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/components/ui/table-primitives.tsx, \."]
209
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
210
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
211
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
212
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
213
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
168
214
  export default App
215
+ // CIL[END chunk_id="App_export_1783931090"]