spine-framework 0.3.124 → 0.3.126

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -1,36 +1,23 @@
1
- /// <reference types="node" />
2
- /**
3
- * @module cli/context
4
- * @audience installer
5
- * @layer cli
6
- * @stability stable
7
- *
8
- * CLI context builder and output utilities. This is the CLI equivalent of
9
- * `createHandler()` in `middleware.ts` — it resolves the principal, picks the
10
- * correct Supabase client, and returns a `CoreContext` that every CLI command
11
- * passes directly to core functions.
12
- *
13
- * **Environment variables read from `.xenv` or `process.env`:**
14
- * | Variable | Required | Purpose |
15
- * |---------------------------|----------|------------------------------------|
16
- * | `SUPABASE_URL` | yes | Project API URL |
17
- * | `SUPABASE_SERVICE_ROLE_KEY` | yes | Service-role client (admin ops) |
18
- * | `SUPABASE_ANON_KEY` | yes | User-scoped client (JWT mode) |
19
- * | `SPINE_CLI_ACCOUNT_ID` | no | Default account scope |
20
- * | `SPINE_CLI_JWT` | no | Human principal (Supabase JWT) |
21
- * | `SPINE_CLI_API_KEY` | no | Machine principal (hashed key) |
22
- * | `SPINE_CLI_DEBUG` | no | Print stack traces on error |
23
- *
24
- * **Principal resolution priority** (first match wins):
25
- * 1. `SPINE_CLI_JWT` → human principal (RLS-scoped `getUserDb`)
26
- * 2. `SPINE_CLI_API_KEY` → machine principal (`adminDb`)
27
- * 3. Fallback → `SYSTEM_PRINCIPAL` (`adminDb` — admin ops only)
28
- *
29
- * @seeAlso functions/_shared/middleware.ts (createHandler — server-side equivalent)
30
- * @seeAlso functions/_shared/principal.ts (Principal type and SYSTEM_PRINCIPAL)
31
- * @seeAlso cli/index.ts (entry point that imports all commands)
32
- */
33
1
 
2
+
3
+
4
+
5
+
6
+ // CIL[BEGIN chunk_id="context_moduleheader_1784068794" type="module_header" identity="imports" parent="none"]
7
+ // CIL[DOC-MACRO purpose="Import dependencies and set up directory paths"]
8
+ // CIL[DOC-RESPONSIBILITY responsibility="Load required modules and configure paths"]
9
+ // CIL[DOC-CONTEXT module="cli" layer="context" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
10
+ // CIL[DOC-CONTRACT inputs="none" outputs="loaded_modules" errors="none" side_effects="none"]
11
+ // CIL[DOC-MICRO logic_summary="Imports file system, path utilities, and shared functions" notable_decisions="[]"]
12
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
13
+ // CIL[DOC-STABILITY stability="stable"]
14
+ // CIL[DOC-AUDIENCE audience="developer"]
15
+ // CIL[DOC-VECTOR type="context" content="Layer: context. 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/components/ui/dialog.tsx, \."]
16
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
17
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
18
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
19
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
20
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
34
21
  import { readFileSync, existsSync } from 'fs'
35
22
  import { resolve, dirname } from 'path'
36
23
  import { fileURLToPath } from 'url'
@@ -38,23 +25,21 @@ import { CoreContext, adminDb, SYSTEM_PRINCIPAL, Principal, getUserDb } from '..
38
25
 
39
26
  const __filename = fileURLToPath(import.meta.url)
40
27
  const __dirname = dirname(__filename)
41
-
42
- // ─── ENV LOADING ────────────────────────────────────────────────────────────
43
-
44
- // ─── CHUNK_START: CLI_CONTEXT_LOAD_ENV ──────────────────────────────────────────────
45
- /**
46
- * @chunk-id CLI_CONTEXT_LOAD_ENV_1_0_0
47
- * @version 1.0.0
48
- * @hash 0adefa52a0c93821ee538ffe32a4069061bd75e7cada7175b11be3e11027e369
49
- * @macro Environment Variable Loader
50
- * @micro Reads .xenv file and populates process.env with missing vars
51
- * @inputs none — reads from .xenv file path
52
- * @outputs void — mutates process.env
53
- * @depends-on [fs, path]
54
- * @depended-by [buildCliContext]
55
- * @side-effects [mutates process.env, file system reads]
56
- * @tags environment, configuration, cli, dotenv
57
- */
28
+ // CIL[END chunk_id="context_moduleheader_1784068794"]
29
+ // CIL[BEGIN chunk_id="context_loadenv_1784068794" type="function" identity="loadEnv" parent="none"]
30
+ // CIL[DOC-MACRO purpose="Load environment variables from .xenv file"]
31
+ // CIL[DOC-RESPONSIBILITY responsibility="Parse and set environment variables"]
32
+ // CIL[DOC-CONTEXT module="cli" layer="context" related_files="[\"\\\"]"]
33
+ // CIL[DOC-CONTRACT inputs="none" outputs="process_env" errors="file_read_errors" side_effects="process_env_modification"]
34
+ // CIL[DOC-MICRO logic_summary="Reads .xenv file and sets non-existent environment variables" notable_decisions="[]"]
35
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
36
+ // CIL[DOC-STABILITY stability="stable"]
37
+ // CIL[DOC-VECTOR type="context" content="Layer: context. Direct callers: 0. Direct calls: 0. Related files: \."]
38
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
39
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
40
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
41
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
42
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
58
43
  function loadEnv() {
59
44
  const envPath = resolve(__dirname, '../.xenv')
60
45
  if (existsSync(envPath)) {
@@ -72,37 +57,39 @@ function loadEnv() {
72
57
  }
73
58
  }
74
59
  }
75
- // ─── CHUNK_END: CLI_CONTEXT_LOAD_ENV ────────────────────────────────────────────────
76
-
77
- // ─── TYPES ──────────────────────────────────────────────────────────────────
78
-
79
- /**
80
- * Options passed from CLI command `.action()` callbacks to `buildCliContext`.
81
- *
82
- * @inputSpec account: string | undefined — UUID of the target account; overrides
83
- * `SPINE_CLI_ACCOUNT_ID` if both are present.
84
- * @calledBy All `registerXxxCommands` functions before calling core functions
85
- */
60
+ // CIL[END chunk_id="context_loadenv_1784068794"]
61
+ // CIL[BEGIN chunk_id="interface_clioptions_1784068794" type="interface" identity="CliOptions" parent="none"]
62
+ // CIL[DOC-MACRO purpose="Define CLI options interface"]
63
+ // CIL[DOC-RESPONSIBILITY responsibility="Type definition for CLI configuration"]
64
+ // CIL[DOC-CONTEXT module="cli" layer="context" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
65
+ // CIL[DOC-CONTRACT inputs="none" outputs="type_definition" errors="none" side_effects="none"]
66
+ // CIL[DOC-MICRO logic_summary="Interface for optional account override parameter" notable_decisions="[]"]
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: context. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
70
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
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"]
86
75
  export interface CliOptions {
87
76
  account?: string
88
77
  }
89
-
90
- // ─── CONTEXT BUILDER ─────────────────────────────────────────────────────────
91
-
92
- // ─── CHUNK_START: CLI_CONTEXT_BUILD ──────────────────────────────────────────────
93
- /**
94
- * @chunk-id CLI_CONTEXT_BUILD_1_0_0
95
- * @version 1.0.0
96
- * @hash 501162983b1b24e9a15267ca7b8398b3733f540b2a65a96d8277ec3d780f2003
97
- * @macro CLI Context Builder
98
- * @micro Constructs CoreContext with principal resolution and Supabase client
99
- * @inputs opts: CliOptions — Optional overrides including account ID
100
- * @outputs CoreContext — Fully resolved context with principal, DB client, and request ID
101
- * @depends-on [loadEnv, adminDb, getUserDb, SYSTEM_PRINCIPAL]
102
- * @depended-by [All CLI command handlers]
103
- * @side-effects [DB queries, environment reads, crypto.randomUUID]
104
- * @tags cli, authentication, principal-resolution, context
105
- */
78
+ // CIL[END chunk_id="interface_clioptions_1784068794"]
79
+ // CIL[BEGIN chunk_id="context_buildclicontext_1784068794" type="function" identity="buildCliContext" parent="none"]
80
+ // CIL[DOC-MACRO purpose="Build CLI context with authentication and database"]
81
+ // CIL[DOC-RESPONSIBILITY responsibility="Create authenticated context for CLI operations"]
82
+ // CIL[DOC-CONTEXT module="cli" layer="context" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
83
+ // CIL[DOC-CONTRACT inputs="none" outputs="core_context" errors="auth_errors" side_effects="database_queries"]
84
+ // CIL[DOC-MICRO logic_summary="Handles API key, JWT, or system authentication with proper principal setup" notable_decisions="[]"]
85
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="complex_dependencies"]
86
+ // CIL[DOC-STABILITY stability="stable"]
87
+ // CIL[DOC-VECTOR type="context" content="Layer: context. Direct callers: 2. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, \."]
88
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 2. Total affected: 2."]
89
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
90
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
91
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
92
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
106
93
  export async function buildCliContext(opts: CliOptions = {}): Promise<CoreContext> {
107
94
  loadEnv()
108
95
 
@@ -116,7 +103,6 @@ export async function buildCliContext(opts: CliOptions = {}): Promise<CoreContex
116
103
  const accountId = opts.account || process.env.SPINE_CLI_ACCOUNT_ID || null
117
104
  const requestId = crypto.randomUUID()
118
105
 
119
- // Machine API key auth
120
106
  const apiKey = process.env.SPINE_CLI_API_KEY
121
107
  if (apiKey) {
122
108
  const { data: keyRecord } = await adminDb
@@ -151,7 +137,6 @@ export async function buildCliContext(opts: CliOptions = {}): Promise<CoreContex
151
137
  }
152
138
  }
153
139
 
154
- // JWT auth (human principal)
155
140
  const jwt = process.env.SPINE_CLI_JWT
156
141
  if (jwt) {
157
142
  const userDb = getUserDb(jwt)
@@ -192,7 +177,6 @@ export async function buildCliContext(opts: CliOptions = {}): Promise<CoreContex
192
177
  }
193
178
  }
194
179
 
195
- // Fallback: system principal (admin ops)
196
180
  return {
197
181
  principal: SYSTEM_PRINCIPAL,
198
182
  accountId,
@@ -200,25 +184,21 @@ export async function buildCliContext(opts: CliOptions = {}): Promise<CoreContex
200
184
  requestId
201
185
  }
202
186
  }
203
- // ─── CHUNK_END: CLI_CONTEXT_BUILD ────────────────────────────────────────────────
204
-
205
- // ─── OUTPUT UTILITIES ─────────────────────────────────────────────────────────
206
-
207
- // ─── CHUNK_START: CLI_CONTEXT_PRINT_RESULT ──────────────────────────────────────────────
208
- /**
209
- * @chunk-id CLI_CONTEXT_PRINT_RESULT_1_0_0
210
- * @version 1.0.0
211
- * @hash 06e492defa9012290a5c8b2d4fca27f01df11bdc194ffbdf4f4b4518aa683c2b
212
- * @macro CLI Output Formatter
213
- * @micro Pretty-prints query results as JSON or ASCII tables
214
- * @inputs data: any — Result data to display (array or single value)
215
- * @inputs opts: { json?: boolean } — Output format options
216
- * @outputs void — Console output only
217
- * @depends-on [console, JSON]
218
- * @depended-by [All CLI command list/get handlers]
219
- * @side-effects [console.log output]
220
- * @tags cli, output, formatting, tables, json
221
- */
187
+ // CIL[END chunk_id="context_buildclicontext_1784068794"]
188
+ // CIL[BEGIN chunk_id="context_printresult_1784068794" type="function" identity="printResult" parent="none"]
189
+ // CIL[DOC-MACRO purpose="Format and display CLI output data"]
190
+ // CIL[DOC-RESPONSIBILITY responsibility="Handle result formatting for CLI output"]
191
+ // CIL[DOC-CONTEXT module="cli" layer="context" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
192
+ // CIL[DOC-CONTRACT inputs="none" outputs="console_output" errors="none" side_effects="console_io"]
193
+ // CIL[DOC-MICRO logic_summary="Formats data as JSON, table, or raw text based on type and options" notable_decisions="[]"]
194
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
195
+ // CIL[DOC-STABILITY stability="stable"]
196
+ // CIL[DOC-VECTOR type="context" content="Layer: context. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/functions/_shared/schema-utils.ts, \."]
197
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
198
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
199
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
200
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
201
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
222
202
  export function printResult(data: any, opts: { json?: boolean } = {}) {
223
203
  if (opts.json) {
224
204
  console.log(JSON.stringify(data, null, 2))
@@ -227,42 +207,44 @@ export function printResult(data: any, opts: { json?: boolean } = {}) {
227
207
 
228
208
  if (Array.isArray(data)) {
229
209
  if (data.length === 0) {
230
- console.log('(no results)')
210
+ console.log('No results found.')
231
211
  return
232
212
  }
233
- const keys = Object.keys(data[0])
234
- const rows = data.map(row => keys.map(k => String(row[k] ?? '')))
235
- const widths = keys.map((k, i) => Math.max(k.length, ...rows.map(r => r[i].length)))
236
- const hr = widths.map(w => '-'.repeat(w)).join(' ')
237
- console.log(keys.map((k, i) => k.padEnd(widths[i])).join(' '))
238
- console.log(hr)
239
- rows.forEach(row => console.log(row.map((v, i) => v.padEnd(widths[i])).join(' ')))
240
- console.log(`\n(${data.length} row${data.length !== 1 ? 's' : ''})`)
241
- } else {
213
+
214
+ console.table(data)
215
+ } else if (data && typeof data === 'object') {
242
216
  console.log(JSON.stringify(data, null, 2))
217
+ } else {
218
+ console.log(data)
243
219
  }
244
220
  }
245
- // ─── CHUNK_END: CLI_CONTEXT_PRINT_RESULT ────────────────────────────────────────────────
246
-
247
- // ─── CHUNK_START: CLI_CONTEXT_HANDLE_ERROR ──────────────────────────────────────────────
248
- /**
249
- * @chunk-id CLI_CONTEXT_HANDLE_ERROR_1_0_0
250
- * @version 1.0.0
251
- * @hash 61aca7e4bce61b5b790e8f27ef3f505a6a6fe9a8cd6643e577f610d9dd15b1cd
252
- * @macro CLI Error Handler
253
- * @micro Prints formatted error and exits with proper debug information
254
- * @inputs err: any — Error object or string message
255
- * @outputs void — Process termination (exit code 1)
256
- * @depends-on [console, process]
257
- * @depended-by [All CLI command action handlers]
258
- * @side-effects [console.error output, process.exit]
259
- * @tags cli, error-handling, debug, process-exit
260
- */
261
- export function handleError(err: any) {
262
- console.error(`\nError: ${err.message || err}`)
263
- if (process.env.SPINE_CLI_DEBUG) {
264
- console.error(err.stack)
221
+ // CIL[END chunk_id="context_printresult_1784068794"]
222
+ // CIL[BEGIN chunk_id="context_handleerror_1784068794" type="function" identity="handleError" parent="none"]
223
+ // CIL[DOC-MACRO purpose="Handle and format CLI errors with context"]
224
+ // CIL[DOC-RESPONSIBILITY responsibility="Process and display error messages appropriately"]
225
+ // CIL[DOC-CONTEXT module="cli" layer="context" related_files="[]"]
226
+ // CIL[DOC-CONTRACT inputs="none" outputs="error_output" errors="none" side_effects="process_exit"]
227
+ // CIL[DOC-MICRO logic_summary="Formats PostgREST errors and exits process with error code" notable_decisions="[]"]
228
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
229
+ // CIL[DOC-STABILITY stability="stable"]
230
+ // CIL[DOC-VECTOR type="context" content="Layer: context. Direct callers: 0. Direct calls: 0. Related files: none."]
231
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
232
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
233
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
234
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
235
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
236
+ export function handleError(error: any, context?: string) {
237
+ const message = error?.message || String(error)
238
+ const contextStr = context ? `[${context}] ` : ''
239
+
240
+ if (error?.code === 'PGRST116') {
241
+ console.error(`${contextStr}Not found: The requested resource does not exist.`)
242
+ } else if (error?.code === 'PGRST301') {
243
+ console.error(`${contextStr}Permission denied: You don't have access to this resource.`)
244
+ } else {
245
+ console.error(`${contextStr}${message}`)
265
246
  }
247
+
266
248
  process.exit(1)
267
249
  }
268
- // ─── CHUNK_END: CLI_CONTEXT_HANDLE_ERROR ────────────────────────────────────────────────
250
+ // CIL[END chunk_id="context_handleerror_1784068794"]
@@ -1,24 +1,41 @@
1
- /// <reference types="node" />
2
- /**
3
- * @module cli/env-loader
4
- * @audience installer
5
- * @layer cli
6
- * @stability stable
7
- *
8
- * Side-effect module: loads `v2-core/.xenv` into `process.env` before any
9
- * other CLI module is imported. Must be the first import in `cli/index.ts`
10
- * so that `db.ts` (which reads env vars at module-load time) sees the values.
11
- *
12
- * @sideEffects Mutates process.env — only sets keys not already present
13
- */
14
1
 
2
+
3
+ // CIL[BEGIN chunk_id="env-loader_moduleheader_1784068794" type="module_header" identity="imports" parent="none"]
4
+ // CIL[DOC-MACRO purpose="Import file system and path utilities"]
5
+ // CIL[DOC-RESPONSIBILITY responsibility="Load required modules for file operations"]
6
+ // CIL[DOC-CONTEXT module="cli" layer="environment" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
7
+ // CIL[DOC-CONTRACT inputs="none" outputs="loaded_modules" errors="none" side_effects="none"]
8
+ // CIL[DOC-MICRO logic_summary="Imports file system, path utilities, and URL handling" notable_decisions="[]"]
9
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
10
+ // CIL[DOC-STABILITY stability="stable"]
11
+ // CIL[DOC-AUDIENCE audience="developer"]
12
+ // CIL[DOC-VECTOR type="context" content="Layer: environment. 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/components/ui/dialog.tsx, \."]
13
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
14
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
15
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
16
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
17
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
15
18
  import { readFileSync, existsSync } from 'fs'
16
19
  import { resolve, dirname } from 'path'
17
20
  import { fileURLToPath } from 'url'
18
21
 
19
22
  const __filename = fileURLToPath(import.meta.url)
20
23
  const __dirname = dirname(__filename)
21
-
24
+ // CIL[END chunk_id="env-loader_moduleheader_1784068794"]
25
+ // CIL[BEGIN chunk_id="env-loader_loadenvfile_1784068794" type="function" identity="loadEnvFile" parent="none"]
26
+ // CIL[DOC-MACRO purpose="Load environment variables from a file"]
27
+ // CIL[DOC-RESPONSIBILITY responsibility="Parse and set environment variables from file"]
28
+ // CIL[DOC-CONTEXT module="cli" layer="environment" related_files="[\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
29
+ // CIL[DOC-CONTRACT inputs="none" outputs="process_env" errors="file_read_errors" side_effects="process_env_modification"]
30
+ // CIL[DOC-MICRO logic_summary="Reads env file, parses key=value pairs, sets non-existent variables" notable_decisions="[]"]
31
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
32
+ // CIL[DOC-STABILITY stability="stable"]
33
+ // CIL[DOC-VECTOR type="context" content="Layer: environment. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, .framework/migrations/015_simplify_apps_table.sql, \."]
34
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
35
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
36
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
37
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
38
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
22
39
  function loadEnvFile(envPath: string) {
23
40
  if (!existsSync(envPath)) return
24
41
  const lines = readFileSync(envPath, 'utf8').split('\n')
@@ -34,10 +51,22 @@ function loadEnvFile(envPath: string) {
34
51
  }
35
52
  }
36
53
  }
37
-
38
- // 1. Load project .env first (process.cwd() = the developer's project root)
39
- // This must happen before any module that reads env vars at import time (e.g. _shared/db.ts)
54
+ // CIL[END chunk_id="env-loader_loadenvfile_1784068794"]
55
+ // CIL[BEGIN chunk_id="env-loader_execution_1784068794" type="block" identity="env_loading" parent="none"]
56
+ // CIL[DOC-MACRO purpose="Load environment files on module import"]
57
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute environment loading for CLI"]
58
+ // CIL[DOC-CONTEXT module="cli" layer="environment" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
59
+ // CIL[DOC-CONTRACT inputs="none" outputs="env_variables_loaded" errors="none" side_effects="process_env_modification"]
60
+ // CIL[DOC-MICRO logic_summary="Loads local .env and framework .xenv files in order" notable_decisions="[]"]
61
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
62
+ // CIL[DOC-STABILITY stability="stable"]
63
+ // CIL[DOC-VECTOR type="context" content="Layer: environment. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, \."]
64
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
65
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
66
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
67
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
68
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
40
69
  loadEnvFile(resolve(process.cwd(), '.env'))
41
70
 
42
- // 2. Load framework's own .xenv (lower priority — project .env wins)
43
71
  loadEnvFile(resolve(__dirname, '../.xenv'))
72
+ // CIL[END chunk_id="env-loader_execution_1784068794"]
@@ -1,43 +1,39 @@
1
- #!/usr/bin/env node
2
- /// <reference types="node" />
3
- /**
4
- * @module cli/index
5
- * @audience installer
6
- * @layer cli
7
- * @stability stable
8
- *
9
- * Spine CLI entry point (`npx spine-framework`). Registers all command groups via
10
- * Commander and delegates each subcommand to the same core logic used by
11
- * API handlers and direct imports. No business logic lives here — only
12
- * command registration and top-level error handling.
13
- *
14
- * **Command groups registered:**
15
- * | Group | File |
16
- * |-------------|----------------------------|
17
- * | auth | commands/auth.ts |
18
- * | pipelines | commands/pipelines.ts |
19
- * | items | commands/items.ts |
20
- * | agents | commands/agents.ts |
21
- * | migrations | commands/migrations.ts |
22
- *
23
- * **Usage:**
24
- * ```bash
25
- * npx spine-framework --help
26
- * npx spine-framework auth whoami
27
- * npx spine-framework pipelines run <id> --data '{"key":"value"}'
28
- * npx spine-framework items list --type support_ticket
29
- * npx spine-framework items get <id>
30
- * npx spine-framework agents run <thread-id> --message "Hello"
31
- * npx spine-framework migrations list
32
- * ```
33
- *
34
- * @seeAlso cli/context.ts (buildCliContext — constructs CoreContext for every command)
35
- * @seeAlso functions/_shared/index.ts (core functions exposed to CLI)
36
- */
37
1
 
2
+
3
+
4
+
5
+ // CIL[BEGIN chunk_id="index_moduleheader_1784068794" type="module_header" identity="imports" parent="none"]
6
+ // CIL[DOC-MACRO purpose="Import CLI dependencies and environment loader"]
7
+ // CIL[DOC-RESPONSIBILITY responsibility="Load required modules for CLI setup"]
8
+ // CIL[DOC-CONTEXT module="cli" layer="entry" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
9
+ // CIL[DOC-CONTRACT inputs="none" outputs="loaded_modules" errors="none" side_effects="none"]
10
+ // CIL[DOC-MICRO logic_summary="Imports environment loader and Commander.js" notable_decisions="[]"]
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. 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/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"]
38
20
  import './env-loader.ts'
39
21
  import { Command } from 'commander'
40
-
22
+ // CIL[END chunk_id="index_moduleheader_1784068794"]
23
+ // CIL[BEGIN chunk_id="index_program_1784068794" type="variable" identity="program" parent="none"]
24
+ // CIL[DOC-MACRO purpose="Initialize CLI program with basic configuration"]
25
+ // CIL[DOC-RESPONSIBILITY responsibility="Configure main CLI program instance"]
26
+ // CIL[DOC-CONTEXT module="cli" layer="entry" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/components/ui/table-primitives.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
27
+ // CIL[DOC-CONTRACT inputs="none" outputs="configured_program" errors="none" side_effects="none"]
28
+ // CIL[DOC-MICRO logic_summary="Creates Commander program with name, description, version, and account option" notable_decisions="[]"]
29
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
30
+ // CIL[DOC-STABILITY stability="stable"]
31
+ // CIL[DOC-VECTOR type="context" content="Layer: entry. 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/src/components/ui/table-primitives.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
32
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
33
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
34
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
35
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
36
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
41
37
  const program = new Command()
42
38
 
43
39
  program
@@ -45,7 +41,21 @@ program
45
41
  .description('Spine Framework CLI — install, migrate, and manage your Spine instance')
46
42
  .version('2.0.0')
47
43
  .option('--account <id>', 'Override the account ID for this command')
48
-
44
+ // CIL[END chunk_id="index_program_1784068794"]
45
+ // CIL[BEGIN chunk_id="index_imports_1784068794" type="block" identity="command_imports" parent="none"]
46
+ // CIL[DOC-MACRO purpose="Dynamically import all CLI command modules"]
47
+ // CIL[DOC-RESPONSIBILITY responsibility="Load command registration functions"]
48
+ // CIL[DOC-CONTEXT module="cli" layer="entry" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
49
+ // CIL[DOC-CONTRACT inputs="none" outputs="command_modules" errors="import_failures" side_effects="none"]
50
+ // CIL[DOC-MICRO logic_summary="Uses Promise.all to parallel import all command modules" notable_decisions="[]"]
51
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
52
+ // CIL[DOC-STABILITY stability="stable"]
53
+ // CIL[DOC-VECTOR type="context" content="Layer: entry. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/table-primitives.tsx, \."]
54
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
55
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
56
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
57
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
58
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
49
59
  const [
50
60
  { registerInitCommands },
51
61
  { registerMigrateCommands },
@@ -79,7 +89,21 @@ const [
79
89
  import('./commands/generate.ts'),
80
90
  import('./commands/create-app.ts'),
81
91
  ])
82
-
92
+ // CIL[END chunk_id="index_imports_1784068794"]
93
+ // CIL[BEGIN chunk_id="index_registrations_1784068794" type="block" identity="command_registrations" parent="none"]
94
+ // CIL[DOC-MACRO purpose="Register all CLI commands with the program"]
95
+ // CIL[DOC-RESPONSIBILITY responsibility="Configure CLI with all available commands"]
96
+ // CIL[DOC-CONTEXT module="cli" layer="entry" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/table-primitives.tsx\",\"\\\"]"]
97
+ // CIL[DOC-CONTRACT inputs="none" outputs="registered_commands" errors="none" side_effects="none"]
98
+ // CIL[DOC-MICRO logic_summary="Calls each command registration function with the program instance" notable_decisions="[]"]
99
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
100
+ // CIL[DOC-STABILITY stability="stable"]
101
+ // CIL[DOC-VECTOR type="context" content="Layer: entry. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/table-primitives.tsx, \."]
102
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
103
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
104
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
105
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
106
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
83
107
  registerInitCommands(program)
84
108
  registerMigrateCommands(program)
85
109
  registerInstallAppCommands(program)
@@ -95,8 +119,23 @@ registerTestCommands(program)
95
119
  registerSystemCommands(program)
96
120
  registerGenerateCommands(program)
97
121
  registerCreateAppCommands(program)
98
-
99
- program.parseAsync(process.argv).catch((err) => {
100
- console.error('Error:', err.message)
122
+ // CIL[END chunk_id="index_registrations_1784068794"]
123
+ // CIL[BEGIN chunk_id="index_parseasync_1784068794" type="block" identity="error_handling" parent="none"]
124
+ // CIL[DOC-MACRO purpose="Parse CLI arguments and handle errors"]
125
+ // CIL[DOC-RESPONSIBILITY responsibility="Execute CLI and handle uncaught errors"]
126
+ // CIL[DOC-CONTEXT module="cli" layer="entry" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
127
+ // CIL[DOC-CONTRACT inputs="none" outputs="command_execution" errors="cli_errors" side_effects="process_exit"]
128
+ // CIL[DOC-MICRO logic_summary="Parses async command line arguments and exits on error" notable_decisions="[]"]
129
+ // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
130
+ // CIL[DOC-STABILITY stability="stable"]
131
+ // CIL[DOC-VECTOR type="context" content="Layer: entry. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, \."]
132
+ // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
133
+ // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
134
+ // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
135
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
136
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
137
+ program.parseAsync(process.argv).catch((error) => {
138
+ console.error('CLI Error:', error.message)
101
139
  process.exit(1)
102
140
  })
141
+ // CIL[END chunk_id="index_parseasync_1784068794"]