spine-framework 0.3.145 → 0.4.0

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 (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,48 +1,51 @@
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
- // CIL[BEGIN chunk_id="types_module_header_1783931956" type="module_header" identity="module_header" parent="none"]
9
- // CIL[DOC-MACRO purpose="Import dependencies for types CRUD API"]
10
- // CIL[DOC-RESPONSIBILITY responsibility="Provide middleware, database, permissions and schema utilities"]
11
- // CIL[DOC-CONTEXT module="types" layer="api-handler" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
12
- // CIL[DOC-CONTRACT inputs="none" outputs="imported modules and permissions instance" errors="none" side_effects="none"]
13
- // CIL[DOC-MICRO logic_summary="Imports all required modules for type management operations" notable_decisions="[]"]
14
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
1
+ // CIL[BEGIN stable_id="~/.framework/functions/types.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/types.ts"]
2
+ // CIL[DOC-MACRO purpose="Netlify function module that exposes CRUD and schema query handlers for runtime record type definitions"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Import shared utilities and export typed handlers for listing, reading, creating, updating, soft-deleting, and routing types"]
4
+ // CIL[DOC-CONTEXT module="types function" layer="framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/schema-utils.ts"]
5
+ // CIL[DOC-CONTRACT inputs="HTTP method, query parameters, request body" outputs="JSON response for type records or schema" errors="Validation, permission, and database errors" side_effects="Database reads/writes and audit log emissions"]
6
+ // CIL[DOC-MICRO logic_summary="Aggregates all type operation handlers into a single module export" notable_decisions="Uses createHandler for request context; delegates routing to handler"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
15
8
  // CIL[DOC-STABILITY stability="stable"]
16
- // CIL[DOC-AUDIENCE audience="developer"]
17
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
18
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
19
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
20
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
21
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
22
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
9
+ // CIL[DOC-AUDIENCE audience="framework_developers"]
10
+
23
11
  import { createHandler } from './_shared/middleware'
24
12
  import { adminDb, joins } from './_shared/db'
25
13
  import { emitLog } from './_shared/audit'
26
14
  import { isSystemAdmin } from './_shared/principal'
27
15
  import { PermissionEngine, sanitizeRecordData } from './_shared/permissions'
28
16
  import { generateValidationSchema } from './_shared/schema-utils'
29
-
30
- const permissions = PermissionEngine as any
31
- // CIL[END chunk_id="types_module_header_1783931956"]
32
- // CIL[BEGIN chunk_id="types_list_1783931956" type="function" identity="list" parent="none"]
33
- // CIL[DOC-MACRO purpose="List types with filtering and sanitization"]
34
- // CIL[DOC-RESPONSIBILITY responsibility="Handle type listing with authentication-based response"]
35
- // CIL[DOC-CONTEXT module="types" layer="api-handler" 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\",\"\\\"]"]
36
- // CIL[DOC-CONTRACT inputs="none" outputs="sanitized type array" errors="throws" side_effects="database queries"]
37
- // CIL[DOC-MICRO logic_summary="Filters types by kind/app/ownership, sanitizes based on auth, preserves schemas" notable_decisions="[]"]
38
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
17
+ // CIL[DOC-VECTOR type="context" content="purpose='Netlify function module that exposes CRUD and schema query handlers for runtime record type definitions'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
18
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
19
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
20
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
21
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
22
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
23
+ // CIL[END stable_id="~/.framework/functions/types.ts:module_header:module_header"]
24
+
25
+ // CIL[BEGIN stable_id="~/.framework/functions/types.ts:permissions:constant" type="constant" identity="permissions" parent="~/.framework/functions/types.ts"]
26
+ // CIL[DOC-MACRO purpose="Provide a typed alias to the permission engine for system admin checks"]
27
+ // CIL[DOC-RESPONSIBILITY responsibility="Cast PermissionEngine to any so handlers can call isSystemAdmin"]
28
+ // CIL[DOC-CONTEXT module="types function" layer="framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/schema-utils.ts,.framework/functions/types.ts"]
29
+ // CIL[DOC-CONTRACT inputs="none" outputs="permissions alias" errors="none" side_effects="none"]
30
+ // CIL[DOC-MICRO logic_summary="Casts PermissionEngine to any for convenience" notable_decisions="Avoids strict typing at this boundary"]
31
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
39
32
  // CIL[DOC-STABILITY stability="stable"]
40
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. 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, .framework/functions/_shared/principal.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."]
33
+ const permissions = PermissionEngine as any
34
+ // CIL[DOC-VECTOR type="context" content="purpose='Provide a typed alias to the permission engine for system admin checks'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
35
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
36
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
37
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
44
38
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
45
39
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
40
+ // CIL[END stable_id="~/.framework/functions/types.ts:permissions:constant"]
41
+ // CIL[BEGIN stable_id="~/.framework/functions/types.ts:list:constant" type="constant" identity="list" parent="~/.framework/functions/types.ts"]
42
+ // CIL[DOC-MACRO purpose="List active type definitions with optional filters and pagination"]
43
+ // CIL[DOC-RESPONSIBILITY responsibility="Query the public.types table and sanitize records based on the caller principal"]
44
+ // CIL[DOC-CONTEXT module="types function" layer="framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/schema-utils.ts,.framework/functions/types.ts"]
45
+ // CIL[DOC-CONTRACT inputs="kind, app_id, ownership, limit, offset, include_schema query parameters" outputs="array of sanitized type rows" errors="Database query errors" side_effects="none"]
46
+ // CIL[DOC-MICRO logic_summary="Builds a filtered, paginated Supabase query against the types table and returns sanitized results" notable_decisions="Returns minimal fields for unauthenticated callers; includes schema only when requested"]
47
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
48
+ // CIL[DOC-STABILITY stability="stable"]
46
49
  export const list = createHandler(async (ctx, body) => {
47
50
  const { kind, app_id, ownership, limit = '50', offset = '0', include_schema } = ctx.query || {}
48
51
 
@@ -101,21 +104,21 @@ export const list = createHandler(async (ctx, body) => {
101
104
 
102
105
  return sanitized
103
106
  })
104
- // CIL[END chunk_id="types_list_1783931956"]
105
- // CIL[BEGIN chunk_id="types_get_1783931956" type="function" identity="get" parent="none"]
106
- // CIL[DOC-MACRO purpose="Get single type by ID with sanitization"]
107
- // CIL[DOC-RESPONSIBILITY responsibility="Retrieve and sanitize individual type records"]
108
- // CIL[DOC-CONTEXT module="types" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
109
- // CIL[DOC-CONTRACT inputs="none" outputs="sanitized type object" errors="throws" side_effects="database query"]
110
- // CIL[DOC-MICRO logic_summary="Queries type by ID with app join, sanitizes based on permissions" notable_decisions="[]"]
111
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
112
- // CIL[DOC-STABILITY stability="stable"]
113
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
114
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
115
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
116
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
107
+ // CIL[DOC-VECTOR type="context" content="purpose='List active type definitions with optional filters and pagination'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
108
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
109
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
110
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
117
111
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
118
112
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
113
+ // CIL[END stable_id="~/.framework/functions/types.ts:list:constant"]
114
+ // CIL[BEGIN stable_id="~/.framework/functions/types.ts:get:constant" type="constant" identity="get" parent="~/.framework/functions/types.ts"]
115
+ // CIL[DOC-MACRO purpose="Fetch a single active type record by id"]
116
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve a single type row by id and sanitize it for the caller"]
117
+ // CIL[DOC-CONTEXT module="types function" layer="framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/schema-utils.ts,.framework/functions/types.ts"]
118
+ // CIL[DOC-CONTRACT inputs="id query parameter" outputs="sanitized type record" errors="Missing id, not found, database errors" side_effects="none"]
119
+ // CIL[DOC-MICRO logic_summary="Selects a single active type by id and returns a sanitized record" notable_decisions="Uses adminDb for system admins and ctx.db otherwise"]
120
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
121
+ // CIL[DOC-STABILITY stability="stable"]
119
122
  export const get = createHandler(async (ctx, body) => {
120
123
  const { id } = ctx.query || {}
121
124
 
@@ -136,21 +139,21 @@ export const get = createHandler(async (ctx, body) => {
136
139
 
137
140
  return await sanitizeRecordData(ctx, data, 'type')
138
141
  })
139
- // CIL[END chunk_id="types_get_1783931956"]
140
- // CIL[BEGIN chunk_id="types_getbyslug_1783931956" type="function" identity="getBySlug" parent="none"]
141
- // CIL[DOC-MACRO purpose="Get single type by slug with sanitization"]
142
- // CIL[DOC-RESPONSIBILITY responsibility="Retrieve type records using slug identifier"]
143
- // CIL[DOC-CONTEXT module="types" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
144
- // CIL[DOC-CONTRACT inputs="none" outputs="sanitized type object" errors="throws" side_effects="database query"]
145
- // CIL[DOC-MICRO logic_summary="Queries type by slug with app join, sanitizes based on permissions" notable_decisions="[]"]
146
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
147
- // CIL[DOC-STABILITY stability="stable"]
148
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, \."]
149
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
150
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
151
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
142
+ // CIL[DOC-VECTOR type="context" content="purpose='Fetch a single active type record by id'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
143
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
144
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
145
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
152
146
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
153
147
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
148
+ // CIL[END stable_id="~/.framework/functions/types.ts:get:constant"]
149
+ // CIL[BEGIN stable_id="~/.framework/functions/types.ts:getBySlug:constant" type="constant" identity="getBySlug" parent="~/.framework/functions/types.ts"]
150
+ // CIL[DOC-MACRO purpose="Fetch an active type record by slug"]
151
+ // CIL[DOC-RESPONSIBILITY responsibility="Retrieve a single active type row by slug, including related app, and sanitize it"]
152
+ // CIL[DOC-CONTEXT module="types function" layer="framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/schema-utils.ts,.framework/functions/types.ts"]
153
+ // CIL[DOC-CONTRACT inputs="slug query parameter" outputs="sanitized type record with app join" errors="Missing slug, not found, database errors" side_effects="none"]
154
+ // CIL[DOC-MICRO logic_summary="Selects a single active type by slug with the app join and returns sanitized data" notable_decisions="Uses ctx.db rather than adminDb"]
155
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
156
+ // CIL[DOC-STABILITY stability="stable"]
154
157
  export const getBySlug = createHandler(async (ctx, body) => {
155
158
  const { slug } = ctx.query || {}
156
159
 
@@ -169,21 +172,21 @@ export const getBySlug = createHandler(async (ctx, body) => {
169
172
 
170
173
  return await sanitizeRecordData(ctx, data, 'type')
171
174
  })
172
- // CIL[END chunk_id="types_getbyslug_1783931956"]
173
- // CIL[BEGIN chunk_id="types_getschema_1783931956" type="function" identity="getSchema" parent="none"]
174
- // CIL[DOC-MACRO purpose="Get type design schema via RPC"]
175
- // CIL[DOC-RESPONSIBILITY responsibility="Retrieve design schema for specific type"]
176
- // CIL[DOC-CONTEXT module="types" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\"]"]
177
- // CIL[DOC-CONTRACT inputs="none" outputs="design_schema object" errors="throws" side_effects="database RPC call"]
178
- // CIL[DOC-MICRO logic_summary="Calls get_type_schema RPC with kind, slug, and optional app_id" notable_decisions="[]"]
179
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
180
- // CIL[DOC-STABILITY stability="stable"]
181
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx."]
182
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
183
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
184
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
175
+ // CIL[DOC-VECTOR type="context" content="purpose='Fetch an active type record by slug'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
176
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
177
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
178
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
185
179
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
186
180
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
181
+ // CIL[END stable_id="~/.framework/functions/types.ts:getBySlug:constant"]
182
+ // CIL[BEGIN stable_id="~/.framework/functions/types.ts:getSchema:constant" type="constant" identity="getSchema" parent="~/.framework/functions/types.ts"]
183
+ // CIL[DOC-MACRO purpose="Return the design schema for a given kind and slug"]
184
+ // CIL[DOC-RESPONSIBILITY responsibility="Call the get_type_schema database function and return the design schema"]
185
+ // CIL[DOC-CONTEXT module="types function" layer="framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/schema-utils.ts,.framework/functions/types.ts"]
186
+ // CIL[DOC-CONTRACT inputs="kind, slug, app_id query parameters" outputs="object containing design_schema" errors="Missing kind or slug, database errors" side_effects="none"]
187
+ // CIL[DOC-MICRO logic_summary="Invokes the get_type_schema Postgres RPC with optional app_id" notable_decisions="Passes app_id as null when not provided"]
188
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
189
+ // CIL[DOC-STABILITY stability="stable"]
187
190
  export const getSchema = createHandler(async (ctx, body) => {
188
191
  const { kind, slug, app_id } = ctx.query || {}
189
192
 
@@ -202,23 +205,21 @@ export const getSchema = createHandler(async (ctx, body) => {
202
205
 
203
206
  return { design_schema: data }
204
207
  })
205
- // CIL[END chunk_id="types_getschema_1783931956"]
206
- // CIL[BEGIN chunk_id="types_create_1783931956" type="function" identity="create" parent="none"]
207
- // CIL[DOC-LEARNING topic="runtime-type:generic/validation" content="The types API stores design_schema and auto-generates validation_schema from it via generateValidationSchema. design_schema must define record_permissions, fields, and views to drive the rest of the framework."]
208
- // CIL[DOC-NOTE type="design_schema_caveat" content="Hand-editing validation_schema is unsafe; it is overwritten by the API. design_schema changes do not retroactively re-stamp existing runtime records."]
209
- // CIL[DOC-MACRO purpose="Create new type with validation and audit"]
210
- // CIL[DOC-RESPONSIBILITY responsibility="Handle type creation with permissions and validation"]
211
- // CIL[DOC-CONTEXT module="types" layer="api-handler" related_files="[]"]
212
- // CIL[DOC-CONTRACT inputs="none" outputs="created type record" errors="throws" side_effects="database insert, audit log"]
213
- // CIL[DOC-MICRO logic_summary="Validates permissions, checks uniqueness, generates validation schema, creates type" notable_decisions="[]"]
214
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
215
- // CIL[DOC-STABILITY stability="stable"]
216
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
217
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
218
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
219
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
208
+ // CIL[DOC-VECTOR type="context" content="purpose='Return the design schema for a given kind and slug'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
209
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
210
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
211
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
220
212
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
221
213
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
214
+ // CIL[END stable_id="~/.framework/functions/types.ts:getSchema:constant"]
215
+ // CIL[BEGIN stable_id="~/.framework/functions/types.ts:create:constant" type="constant" identity="create" parent="~/.framework/functions/types.ts"]
216
+ // CIL[DOC-MACRO purpose="Create a new type definition"]
217
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate admin privileges, enforce required fields, check uniqueness, generate validation schema, insert the row, and emit an audit log"]
218
+ // CIL[DOC-CONTEXT module="types function" layer="framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/schema-utils.ts,.framework/functions/types.ts"]
219
+ // CIL[DOC-CONTRACT inputs="request body with name, slug, kind, and optional fields" outputs="newly created type row" errors="Non-admin, missing fields, duplicate slug, database errors" side_effects="Inserts row into public.types and emits type.created audit log"]
220
+ // CIL[DOC-MICRO logic_summary="Enforces system admin, validates required fields, prevents duplicate active slug, generates validation schema if absent, inserts the row, and logs" notable_decisions="Uses adminDb for inserts and falls back to generated validation schema"]
221
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
222
+ // CIL[DOC-STABILITY stability="stable"]
222
223
  export const create = createHandler(async (ctx, body) => {
223
224
  if (!permissions.isSystemAdmin(ctx)) {
224
225
  throw new Error('System admin required')
@@ -290,21 +291,21 @@ export const create = createHandler(async (ctx, body) => {
290
291
 
291
292
  return data
292
293
  })
293
- // CIL[END chunk_id="types_create_1783931956"]
294
- // CIL[BEGIN chunk_id="types_update_1783931956" type="function" identity="update" parent="none"]
295
- // CIL[DOC-MACRO purpose="Update existing type with validation"]
296
- // CIL[DOC-RESPONSIBILITY responsibility="Handle type updates with permissions and schema sync"]
297
- // CIL[DOC-CONTEXT module="types" layer="api-handler" related_files="[]"]
298
- // CIL[DOC-CONTRACT inputs="none" outputs="updated type record" errors="throws" side_effects="database update, audit log"]
299
- // CIL[DOC-MICRO logic_summary="Validates permissions, protects system types, regenerates validation schema on design changes" notable_decisions="[]"]
300
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
301
- // CIL[DOC-STABILITY stability="stable"]
302
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
303
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
304
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
305
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
294
+ // CIL[DOC-VECTOR type="context" content="purpose='Create a new type definition'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
295
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
296
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
297
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
306
298
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
307
299
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
300
+ // CIL[END stable_id="~/.framework/functions/types.ts:create:constant"]
301
+ // CIL[BEGIN stable_id="~/.framework/functions/types.ts:update:constant" type="constant" identity="update" parent="~/.framework/functions/types.ts"]
302
+ // CIL[DOC-MACRO purpose="Update an existing type definition"]
303
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate admin, find the row, protect system ownership, build allowed updates, regenerate validation schema on design change, and log"]
304
+ // CIL[DOC-CONTEXT module="types function" layer="framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/schema-utils.ts,.framework/functions/types.ts"]
305
+ // CIL[DOC-CONTRACT inputs="id query parameter and request body fields" outputs="updated type row" errors="Non-admin, missing id, not found, ownership change forbidden, database errors" side_effects="Updates row and emits type.updated audit log"]
306
+ // CIL[DOC-MICRO logic_summary="Selects existing type, blocks ownership changes on system types, applies whitelisted updates, regenerates validation schema when design_schema changes, and logs" notable_decisions="Only updates explicitly provided fields; permission check is performed before lookup"]
307
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
308
+ // CIL[DOC-STABILITY stability="stable"]
308
309
  export const update = createHandler(async (ctx, body) => {
309
310
  if (!permissions.isSystemAdmin(ctx)) {
310
311
  throw new Error('System admin required')
@@ -384,21 +385,21 @@ export const update = createHandler(async (ctx, body) => {
384
385
 
385
386
  return data
386
387
  })
387
- // CIL[END chunk_id="types_update_1783931956"]
388
- // CIL[BEGIN chunk_id="types_remove_1783931956" type="function" identity="remove" parent="none"]
389
- // CIL[DOC-MACRO purpose="Soft delete type with validation"]
390
- // CIL[DOC-RESPONSIBILITY responsibility="Handle type deletion with permissions and protection"]
391
- // CIL[DOC-CONTEXT module="types" layer="api-handler" related_files="[]"]
392
- // CIL[DOC-CONTRACT inputs="none" outputs="success indicator" errors="throws" side_effects="database update, audit log"]
393
- // CIL[DOC-MICRO logic_summary="Validates permissions, protects system types, soft deletes by setting is_active=false" notable_decisions="[]"]
394
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
395
- // CIL[DOC-STABILITY stability="stable"]
396
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
397
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
398
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
399
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
388
+ // CIL[DOC-VECTOR type="context" content="purpose='Update an existing type definition'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
389
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
390
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
391
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
400
392
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
401
393
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
394
+ // CIL[END stable_id="~/.framework/functions/types.ts:update:constant"]
395
+ // CIL[BEGIN stable_id="~/.framework/functions/types.ts:remove:constant" type="constant" identity="remove" parent="~/.framework/functions/types.ts"]
396
+ // CIL[DOC-MACRO purpose="Soft-delete an existing type definition"]
397
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate admin, find the active row, protect system types, set is_active false, and emit an audit log"]
398
+ // CIL[DOC-CONTEXT module="types function" layer="framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/schema-utils.ts,.framework/functions/types.ts"]
399
+ // CIL[DOC-CONTRACT inputs="id query parameter" outputs="success flag" errors="Non-admin, missing id, not found, system type deletion" side_effects="Sets is_active false and emits type.deleted audit log"]
400
+ // CIL[DOC-MICRO logic_summary="Marks an active type as inactive and emits an audit log" notable_decisions="Uses soft delete via is_active update; blocks deletion of system-owned types"]
401
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
402
+ // CIL[DOC-STABILITY stability="stable"]
402
403
  export const remove = createHandler(async (ctx, body) => {
403
404
  if (!permissions.isSystemAdmin(ctx)) {
404
405
  throw new Error('System admin required')
@@ -442,16 +443,21 @@ export const remove = createHandler(async (ctx, body) => {
442
443
 
443
444
  return { success: true }
444
445
  })
445
- // CIL[END chunk_id="types_remove_1783931956"]
446
- // CIL[BEGIN chunk_id="types_handler_1783931956" type="function" identity="handler" parent="none"]
447
- // CIL[DOC-MACRO purpose="Netlify function entrypoint for types API"]
448
- // CIL[DOC-RESPONSIBILITY responsibility="Dispatch incoming requests to list, get, getBySlug, getSchema, create, update, or remove based on HTTP method and query parameters"]
449
- // CIL[DOC-CONTEXT module="types" layer="api-handler" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/hooks/useSchemaRecord.ts\",\".framework/src/hooks/useListSchema.ts\"]"]
450
- // CIL[DOC-CONTRACT inputs="http context and optional body" outputs="routed handler result" errors="throws on unsupported action or method" side_effects="none"]
451
- // CIL[DOC-MICRO logic_summary="Routes GET by action/id/slug to list, get, getBySlug, or getSchema; POST to create; PATCH to update; DELETE to remove" notable_decisions="[]"]
452
- // CIL[DOC-CONFIDENCE pass="first" score="0.95" flags="none"]
446
+ // CIL[DOC-VECTOR type="context" content="purpose='Soft-delete an existing type definition'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
447
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
448
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
449
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
450
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
451
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
452
+ // CIL[END stable_id="~/.framework/functions/types.ts:remove:constant"]
453
+ // CIL[BEGIN stable_id="~/.framework/functions/types.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/types.ts"]
454
+ // CIL[DOC-MACRO purpose="Route incoming requests to the appropriate type operation"]
455
+ // CIL[DOC-RESPONSIBILITY responsibility="Dispatch method and query parameters to list, get, getBySlug, getSchema, create, update, or remove"]
456
+ // CIL[DOC-CONTEXT module="types function" layer="framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/_shared/schema-utils.ts,.framework/functions/types.ts"]
457
+ // CIL[DOC-CONTRACT inputs="action, id, slug, kind, method query parameters" outputs="result from delegated handler" errors="Invalid action or method" side_effects="None beyond delegated handler"]
458
+ // CIL[DOC-MICRO logic_summary="Reads HTTP method and query flags to select the correct internal handler and returns its result" notable_decisions="Schema action takes precedence; GET defaults to list when no id/slug/kind provided"]
459
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
453
460
  // CIL[DOC-STABILITY stability="stable"]
454
- // CIL[DOC-AUDIENCE audience="developer"]
455
461
  export const handler = createHandler(async (ctx, body) => {
456
462
  const { action, id, slug, kind } = ctx.query || {}
457
463
  const method = ctx.query?.method || 'GET'
@@ -484,4 +490,10 @@ export const handler = createHandler(async (ctx, body) => {
484
490
 
485
491
  throw new Error('Invalid action or method')
486
492
  })
487
- // CIL[END chunk_id="types_handler_1783931956"]
493
+ // CIL[DOC-VECTOR type="context" content="purpose='Route incoming requests to the appropriate type operation'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
494
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
495
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
496
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
497
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
498
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
499
+ // CIL[END stable_id="~/.framework/functions/types.ts:handler:constant"]
@@ -0,0 +1,133 @@
1
+ // CIL[BEGIN stable_id="~/.framework/mcp/index.ts:module_header:module_header" type="module_header" identity="module_header" parent="none"]
2
+ // CIL[DOC-MACRO purpose="Initialize and wire up the Spine MCP server with all registered tool modules."]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Load environment configuration, create the McpServer instance, and import and register every tool module."]
4
+ // CIL[DOC-CONTEXT module="mcp" layer="entry-point" related_files=".framework/mcp/load-env.ts,.framework/mcp/tools/architect.ts,.framework/mcp/tools/cil/context.ts,.framework/mcp/tools/cil/graph.ts,.framework/mcp/tools/cil/ingest.ts,.framework/mcp/tools/cil/pipeline-orchestrator.ts,.framework/mcp/tools/cil/pipeline.ts,.framework/mcp/tools/cil/project.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search.ts,.framework/mcp/tools/cil/validate.ts,.framework/mcp/tools/kb/index.ts,.framework/mcp/tools/observability.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="[]" side_effects="[]"]
6
+ // CIL[DOC-MICRO logic_summary="Imports the environment loader, McpServer SDK, all tool modules, and registers each module with a shared server instance." notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ // CIL[DOC-AUDIENCE audience="framework"]
10
+ import './load-env.js'
11
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
12
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
13
+
14
+ import * as contextTools from './tools/cil/context.js'
15
+ import * as searchTools from './tools/cil/search.js'
16
+ import * as graphTools from './tools/cil/graph.js'
17
+ import * as validateTools from './tools/cil/validate.js'
18
+ import * as projectTools from './tools/cil/project.js'
19
+ import * as pipelineTools from './tools/cil/pipeline.js'
20
+ import * as pipelineOrchestratorTools from './tools/cil/pipeline-orchestrator.js'
21
+ import * as ingestTools from './tools/cil/ingest.js'
22
+ import * as retrievalTools from './tools/cil/retrieval.js'
23
+ import * as architectTools from './tools/architect.js'
24
+ import * as kbTools from './tools/kb/index.js'
25
+ import * as observabilityTools from './tools/observability.js'
26
+ // CIL[DOC-VECTOR type="context" content="purpose='Initialize and wire up the Spine MCP server with all registered tool modules.'; No verified external callers; imports: .framework/mcp/load-env.ts,.framework/mcp/tools/cil/context.ts,.framework/mcp/tools/cil/search.ts"]
27
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
28
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
29
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
30
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
31
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
32
+ // CIL[END stable_id="~/.framework/mcp/index.ts:module_header:module_header"]
33
+
34
+ // CIL[BEGIN stable_id="~/.framework/mcp/index.ts:server:constant" type="constant" identity="server" parent="none"]
35
+ // CIL[DOC-MACRO purpose="Define the configured McpServer instance used by the framework."]
36
+ // CIL[DOC-RESPONSIBILITY responsibility="Instantiate the shared McpServer with the framework name and version."]
37
+ // CIL[DOC-CONTEXT module="mcp" layer="server" related_files=".framework/mcp/index.ts,.framework/mcp/load-env.ts,.framework/mcp/tools/architect.ts,.framework/mcp/tools/cil/context.ts,.framework/mcp/tools/cil/graph.ts,.framework/mcp/tools/cil/ingest.ts,.framework/mcp/tools/cil/pipeline-orchestrator.ts,.framework/mcp/tools/cil/pipeline.ts,.framework/mcp/tools/cil/project.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search.ts,.framework/mcp/tools/cil/validate.ts,.framework/mcp/tools/kb/index.ts,.framework/mcp/tools/observability.ts"]
38
+ // CIL[DOC-CONTRACT inputs="none" outputs="server: McpServer" errors="[]" side_effects="[]"]
39
+ // CIL[DOC-MICRO logic_summary="Constructs a new McpServer named 'spine-framework' at version '1.0.0'." notable_decisions="[]"]
40
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
41
+ // CIL[DOC-STABILITY stability="stable"]
42
+ const server = new McpServer({
43
+ name: 'spine-framework',
44
+ version: '1.0.0',
45
+ })
46
+ // CIL[DOC-VECTOR type="context" content="purpose='Define the configured McpServer instance used by the framework.'; No verified external callers; imports: .framework/mcp/load-env.ts,.framework/mcp/tools/cil/context.ts,.framework/mcp/tools/cil/search.ts"]
47
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
48
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
49
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
50
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
51
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
52
+ // CIL[END stable_id="~/.framework/mcp/index.ts:server:constant"]
53
+
54
+ // CIL[BEGIN stable_id="~/.framework/mcp/index.ts:tool_registrations:block" type="block" identity="tool_registrations" parent="none"]
55
+ // CIL[DOC-MACRO purpose="Register all imported tool modules with the McpServer."]
56
+ // CIL[DOC-RESPONSIBILITY responsibility="Attach CIL, architect, KB, and observability tool handlers to the McpServer."]
57
+ // CIL[DOC-CONTEXT module="mcp" layer="registration" related_files=".framework/mcp/index.ts,.framework/mcp/load-env.ts,.framework/mcp/tools/architect.ts,.framework/mcp/tools/cil/context.ts,.framework/mcp/tools/cil/graph.ts,.framework/mcp/tools/cil/ingest.ts,.framework/mcp/tools/cil/pipeline-orchestrator.ts,.framework/mcp/tools/cil/pipeline.ts,.framework/mcp/tools/cil/project.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search.ts,.framework/mcp/tools/cil/validate.ts,.framework/mcp/tools/kb/index.ts,.framework/mcp/tools/observability.ts"]
58
+ // CIL[DOC-CONTRACT inputs="server: McpServer" outputs="server with tool handlers registered" errors="[]" side_effects="mutates the McpServer"]
59
+ // CIL[DOC-MICRO logic_summary="Calls register(server) for each imported tool module in turn." notable_decisions="Registration order follows import order."]
60
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
61
+ // CIL[DOC-STABILITY stability="stable"]
62
+ contextTools.register(server)
63
+ searchTools.register(server)
64
+ graphTools.register(server)
65
+ validateTools.register(server)
66
+ projectTools.register(server)
67
+ pipelineTools.register(server)
68
+ pipelineOrchestratorTools.register(server)
69
+ ingestTools.register(server)
70
+ retrievalTools.register(server)
71
+ architectTools.register(server)
72
+ kbTools.register(server)
73
+ observabilityTools.register(server)
74
+ // CIL[DOC-VECTOR type="context" content="purpose='Register all imported tool modules with the McpServer.'; No verified external callers; imports: .framework/mcp/load-env.ts,.framework/mcp/tools/cil/context.ts,.framework/mcp/tools/cil/search.ts"]
75
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
76
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
77
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
78
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
79
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
80
+ // CIL[END stable_id="~/.framework/mcp/index.ts:tool_registrations:block"]
81
+
82
+ // CIL[BEGIN stable_id="~/.framework/mcp/index.ts:main:function" type="function" identity="main" parent="none"]
83
+ // CIL[DOC-MACRO purpose="Start the MCP server after validating required environment variables."]
84
+ // CIL[DOC-RESPONSIBILITY responsibility="Verify SPINE_URL and SPINE_API_KEY, create a stdio transport, connect the server, and log startup."]
85
+ // CIL[DOC-CONTEXT module="mcp" layer="runtime" related_files=".framework/mcp/index.ts,.framework/mcp/load-env.ts,.framework/mcp/tools/architect.ts,.framework/mcp/tools/cil/context.ts,.framework/mcp/tools/cil/graph.ts,.framework/mcp/tools/cil/ingest.ts,.framework/mcp/tools/cil/pipeline-orchestrator.ts,.framework/mcp/tools/cil/pipeline.ts,.framework/mcp/tools/cil/project.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search.ts,.framework/mcp/tools/cil/validate.ts,.framework/mcp/tools/kb/index.ts,.framework/mcp/tools/observability.ts"]
86
+ // CIL[DOC-CONTRACT inputs="process.env" outputs="stdio transport connection" errors="Missing required environment variables" side_effects="process.exit(1) on validation failure; writes to stderr"]
87
+ // CIL[DOC-MICRO logic_summary="Collect missing environment variables; if any are missing, log an error and exit. Otherwise connect the server to stdio and log a startup message." notable_decisions="Fails fast when SPINE_URL or SPINE_API_KEY are unset."]
88
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
89
+ // CIL[DOC-STABILITY stability="stable"]
90
+ async function main() {
91
+ const missingEnv = []
92
+ if (!process.env.SPINE_URL) missingEnv.push('SPINE_URL')
93
+ if (!process.env.SPINE_API_KEY) missingEnv.push('SPINE_API_KEY')
94
+
95
+ if (missingEnv.length > 0) {
96
+ process.stderr.write(
97
+ `[spine-framework-mcp] ERROR: Missing required environment variables: ${missingEnv.join(', ')}\n` +
98
+ `Set SPINE_URL and SPINE_API_KEY in the MCP host config (env block).\n`
99
+ )
100
+ process.exit(1)
101
+ }
102
+
103
+ const transport = new StdioServerTransport()
104
+ await server.connect(transport)
105
+ process.stderr.write('[spine-framework-mcp] Server running on stdio\n')
106
+ }
107
+ // CIL[DOC-VECTOR type="context" content="purpose='Start the MCP server after validating required environment variables.'; No verified external callers; imports: .framework/mcp/load-env.ts,.framework/mcp/tools/cil/context.ts,.framework/mcp/tools/cil/search.ts"]
108
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
109
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
110
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
111
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
112
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
113
+ // CIL[END stable_id="~/.framework/mcp/index.ts:main:function"]
114
+
115
+ // CIL[BEGIN stable_id="~/.framework/mcp/index.ts:error_handling:block" type="block" identity="error_handling" parent="none"]
116
+ // CIL[DOC-MACRO purpose="Catch unhandled fatal errors from main() and terminate the process."]
117
+ // CIL[DOC-RESPONSIBILITY responsibility="Wrap main() execution, log any rejection, and exit with a fatal error code."]
118
+ // CIL[DOC-CONTEXT module="mcp" layer="error-handling" related_files=".framework/mcp/index.ts,.framework/mcp/load-env.ts,.framework/mcp/tools/architect.ts,.framework/mcp/tools/cil/context.ts,.framework/mcp/tools/cil/graph.ts,.framework/mcp/tools/cil/ingest.ts,.framework/mcp/tools/cil/pipeline-orchestrator.ts,.framework/mcp/tools/cil/pipeline.ts,.framework/mcp/tools/cil/project.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search.ts,.framework/mcp/tools/cil/validate.ts,.framework/mcp/tools/kb/index.ts,.framework/mcp/tools/observability.ts"]
119
+ // CIL[DOC-CONTRACT inputs="main(): Promise<void>" outputs="none" errors="[]" side_effects="process.stderr.write; process.exit(1)"]
120
+ // CIL[DOC-MICRO logic_summary="Attaches a catch handler to main() that writes the error to stderr and exits." notable_decisions="[]"]
121
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
122
+ // CIL[DOC-STABILITY stability="stable"]
123
+ main().catch(err => {
124
+ process.stderr.write(`[spine-framework-mcp] Fatal error: ${err}\n`)
125
+ process.exit(1)
126
+ })
127
+ // CIL[DOC-VECTOR type="context" content="purpose='Catch unhandled fatal errors from main() and terminate the process.'; No verified external callers; imports: .framework/mcp/load-env.ts,.framework/mcp/tools/cil/context.ts,.framework/mcp/tools/cil/search.ts"]
128
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
129
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
130
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
131
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
132
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
133
+ // CIL[END stable_id="~/.framework/mcp/index.ts:error_handling:block"]
@@ -0,0 +1,60 @@
1
+ // CIL[BEGIN stable_id="~/.framework/mcp/load-env.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/mcp/load-env.ts"]
2
+ // CIL[DOC-MACRO purpose="Imports Node.js utilities for resolving and loading an environment file."]
3
+ // CIL[DOC-CONTEXT module="mcp" layer="framework" related_files=".framework/mcp/load-env.ts"]
4
+ // CIL[DOC-CONTRACT inputs="none" outputs="runtime dependencies available to the module" errors="none" side_effects="none"]
5
+ // CIL[DOC-MICRO logic_summary="Imports fs, path, and fileURLToPath for use by loadEnv." notable_decisions="[]"]
6
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
7
+ // CIL[DOC-STABILITY stability="stable"]
8
+ // CIL[DOC-AUDIENCE audience="developers"]
9
+ import fs from 'node:fs'
10
+ import path from 'node:path'
11
+ import { fileURLToPath } from 'node:url'
12
+ // CIL[DOC-VECTOR type="context" content="purpose='Imports Node.js utilities for resolving and loading an environment file.'; No verified external callers; imports: none"]
13
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
14
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
15
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
16
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
17
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
18
+ // CIL[END stable_id="~/.framework/mcp/load-env.ts:module_header:module_header"]
19
+
20
+ // CIL[BEGIN stable_id="~/.framework/mcp/load-env.ts:loadEnv:function" type="function" identity="loadEnv" parent="~/.framework/mcp/load-env.ts"]
21
+ // CIL[DOC-MACRO purpose="Reads a .env file and populates process.env for any keys that are not already set."]
22
+ // CIL[DOC-RESPONSIBILITY responsibility="Bootstrap environment variables for the MCP server process."]
23
+ // CIL[DOC-CONTEXT module="mcp" layer="framework" related_files=".framework/mcp/load-env.ts"]
24
+ // CIL[DOC-CONTRACT inputs="none" outputs="process.env updated from .env file" errors="read/parse failures are silently ignored" side_effects="mutates process.env"]
25
+ // CIL[DOC-MICRO logic_summary="Resolves the .env path relative to this file, reads it line by line, skips empty and comment lines, parses KEY=VALUE pairs, trims and strips surrounding quotes from values, and writes to process.env only when the key is absent." notable_decisions="Returns early if .env is missing; ignores all exceptions so server startup is not blocked; preserves already-set environment variables."]
26
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
27
+ // CIL[DOC-STABILITY stability="stable"]
28
+ function loadEnv(): void {
29
+ try {
30
+ const __filename = fileURLToPath(import.meta.url)
31
+ const envPath = path.resolve(path.dirname(__filename), '../../.env')
32
+ if (!fs.existsSync(envPath)) return
33
+ const text = fs.readFileSync(envPath, 'utf-8')
34
+ for (const raw of text.split(/\r?\n/)) {
35
+ const line = raw.trim()
36
+ if (!line || line.startsWith('#')) continue
37
+ const eq = line.indexOf('=')
38
+ if (eq === -1) continue
39
+ const key = line.slice(0, eq).trim()
40
+ let value = line.slice(eq + 1).trim()
41
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
42
+ value = value.slice(1, -1)
43
+ }
44
+ if (key && process.env[key] === undefined) {
45
+ process.env[key] = value
46
+ }
47
+ }
48
+ } catch {
49
+ // Ignore read/parse errors so the server still starts if .env is missing.
50
+ }
51
+ }
52
+
53
+ loadEnv()
54
+ // CIL[DOC-VECTOR type="context" content="purpose='Reads a .env file and populates process.env for any keys that are not already set.'; No verified external callers; imports: none"]
55
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
56
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
57
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
58
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
59
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
60
+ // CIL[END stable_id="~/.framework/mcp/load-env.ts:loadEnv:function"]