spine-framework 0.3.144 → 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 +20 -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,38 +1,13 @@
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
- // CIL[BEGIN chunk_id="doctor_module_header_1784071456" type="module_header" identity="module_header" parent="none"]
22
- // CIL[DOC-MACRO purpose="Import dependencies for doctor CLI commands"]
23
- // CIL[DOC-RESPONSIBILITY responsibility="Provide imports and utilities for health checks"]
24
- // CIL[DOC-CONTEXT module="doctor-cli" layer="cli" 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\",\"\\\"]"]
25
- // CIL[DOC-CONTRACT inputs="none" outputs="imports" errors="none" side_effects="none"]
26
- // CIL[DOC-MICRO logic_summary="Imports Command type, context, database, and file system modules" notable_decisions="[]"]
27
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
1
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/cli/commands/doctor.ts"]
2
+ // CIL[DOC-MACRO purpose="Provides CLI commands for the doctor (system health) functionality, integrating with CLI context and shared database functions."]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose health-check CLI commands and report system installation status."]
4
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/context.ts,.framework/functions/_shared/index.ts"]
5
+ // CIL[DOC-CONTRACT inputs="[]" outputs="[]" errors="[]" side_effects="[]"]
6
+ // CIL[DOC-MICRO logic_summary="Defines the doctor module and its intent, invariant, and related utilities." notable_decisions="Commands must be executed within a valid CLI context."]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
28
8
  // CIL[DOC-STABILITY stability="stable"]
29
- // CIL[DOC-AUDIENCE audience="developer"]
30
- // CIL[DOC-VECTOR type="context" content="Layer: cli. 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, \."]
31
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
32
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
33
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
34
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
35
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
9
+ // CIL[DOC-AUDIENCE audience="internal"]
10
+
36
11
  import type { Command } from 'commander'
37
12
  import { buildCliContext, handleError } from '../context.ts'
38
13
  import { adminDb } from '../../functions/_shared/index.ts'
@@ -40,23 +15,57 @@ import { readFileSync, existsSync, readdirSync } from 'fs'
40
15
  import { resolve, dirname } from 'path'
41
16
  import { fileURLToPath } from 'url'
42
17
 
18
+ // CIL[DOC-VECTOR type="context" content="purpose='Provides CLI commands for the doctor (system health) functionality, integrating with CLI context and shared database functions.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
19
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
20
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
21
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
22
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
23
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
24
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:module_header:module_header"]
25
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:__filename:constant" type="constant" identity="__filename" parent="~/.framework/cli/commands/doctor.ts"]
26
+ // CIL[DOC-MACRO purpose="Resolves the current module's file URL to a filesystem path."]
27
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide a stable __filename reference for the module."]
28
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
29
+ // CIL[DOC-CONTRACT inputs="[]" outputs="string" errors="[]" side_effects="none"]
30
+ // CIL[DOC-MICRO logic_summary="Call fileURLToPath(import.meta.url) and assign to const __filename." notable_decisions=""]
31
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
32
+ // CIL[DOC-STABILITY stability="stable"]
33
+
43
34
  const __filename = fileURLToPath(import.meta.url)
44
- const __dirname = dirname(__filename)
45
- // CIL[END chunk_id="doctor_module_header_1784071456"]
46
- // CIL[BEGIN chunk_id="doctor_checkresult_1784071456" type="interface" identity="CheckResult" parent="none"]
47
- // CIL[DOC-MACRO purpose="Define structure for health check results"]
48
- // CIL[DOC-RESPONSIBILITY responsibility="Provide standardized check result format"]
49
- // CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
50
- // CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
51
- // CIL[DOC-MICRO logic_summary="Defines check result with status, message, and optional details" notable_decisions="[]"]
52
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
35
+ // CIL[DOC-VECTOR type="context" content="purpose='Resolves the current module's file URL to a filesystem path.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
36
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
37
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
38
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
39
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
40
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
41
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:__filename:constant"]
42
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:__dirname:constant" type="constant" identity="__dirname" parent="~/.framework/cli/commands/doctor.ts"]
43
+ // CIL[DOC-MACRO purpose="Provides the directory name of the current module for relative path resolution."]
44
+ // CIL[DOC-RESPONSIBILITY responsibility="Derive the current module's directory from __filename."]
45
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
46
+ // CIL[DOC-CONTRACT inputs="[]" outputs="string" errors="[]" side_effects="none"]
47
+ // CIL[DOC-MICRO logic_summary="Call dirname(__filename) and assign to const __dirname." notable_decisions=""]
48
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
53
49
  // CIL[DOC-STABILITY stability="stable"]
54
- // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
55
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
56
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
57
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
50
+
51
+ const __dirname = dirname(__filename)
52
+ // CIL[DOC-VECTOR type="context" content="purpose='Provides the directory name of the current module for relative path resolution.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
53
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
54
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
55
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
58
56
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
59
57
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
58
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:__dirname:constant"]
59
+
60
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:CheckResult:interface" type="interface" identity="CheckResult" parent="~/.framework/cli/commands/doctor.ts"]
61
+ // CIL[DOC-MACRO purpose="Defines the structure for health check results."]
62
+ // CIL[DOC-RESPONSIBILITY responsibility="Standardize status reporting across health checks."]
63
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
64
+ // CIL[DOC-CONTRACT inputs="[]" outputs="[]" errors="[]" side_effects="[]"]
65
+ // CIL[DOC-MICRO logic_summary="Declare an interface with name, status, message, optional details, and fixability." notable_decisions=""]
66
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
67
+ // CIL[DOC-STABILITY stability="stable"]
68
+
60
69
  interface CheckResult {
61
70
  name: string
62
71
  status: 'pass' | 'fail' | 'warn'
@@ -64,21 +73,23 @@ interface CheckResult {
64
73
  details?: Record<string, any>
65
74
  fixable?: boolean
66
75
  }
67
- // CIL[END chunk_id="doctor_checkresult_1784071456"]
68
- // CIL[BEGIN chunk_id="doctor_doctorreport_1784071456" type="interface" identity="DoctorReport" parent="none"]
69
- // CIL[DOC-MACRO purpose="Define structure for comprehensive doctor report"]
70
- // CIL[DOC-RESPONSIBILITY responsibility="Provide complete health check summary format"]
71
- // CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
72
- // CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
73
- // CIL[DOC-MICRO logic_summary="Defines report with overall status and check summaries" notable_decisions="[]"]
74
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
75
- // CIL[DOC-STABILITY stability="stable"]
76
- // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
77
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
78
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
79
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
76
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the structure for health check results.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
77
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
78
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
79
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
80
80
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
81
81
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
82
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:CheckResult:interface"]
83
+
84
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:DoctorReport:interface" type="interface" identity="DoctorReport" parent="~/.framework/cli/commands/doctor.ts"]
85
+ // CIL[DOC-MACRO purpose="Defines the structure for aggregated doctor health reports."]
86
+ // CIL[DOC-RESPONSIBILITY responsibility="Summarize overall health and counts from a collection of CheckResult objects."]
87
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
88
+ // CIL[DOC-CONTRACT inputs="[]" outputs="[]" errors="[]" side_effects="[]"]
89
+ // CIL[DOC-MICRO logic_summary="Declare an interface with overall status, checks array, and summary counts." notable_decisions=""]
90
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
91
+ // CIL[DOC-STABILITY stability="stable"]
92
+
82
93
  interface DoctorReport {
83
94
  overall: 'healthy' | 'degraded' | 'unhealthy'
84
95
  checks: CheckResult[]
@@ -89,21 +100,23 @@ interface DoctorReport {
89
100
  fixable: number
90
101
  }
91
102
  }
92
- // CIL[END chunk_id="doctor_doctorreport_1784071456"]
93
- // CIL[BEGIN chunk_id="doctor_checkenvironment_1784071456" type="function" identity="checkEnvironment" parent="none"]
94
- // CIL[DOC-MACRO purpose="Check required environment variables"]
95
- // CIL[DOC-RESPONSIBILITY responsibility="Validate Supabase environment configuration"]
96
- // CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
97
- // CIL[DOC-CONTRACT inputs="none" outputs="CheckResult" errors="none" side_effects="reads environment variables"]
98
- // CIL[DOC-MICRO logic_summary="Validates required env vars and checks for .xenv file" 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: cli. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.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."]
103
+ // CIL[DOC-VECTOR type="context" content="purpose='Defines the structure for aggregated doctor health reports.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
104
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
105
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
106
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
105
107
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
106
108
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
109
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:DoctorReport:interface"]
110
+
111
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkEnvironment:function" type="function" identity="checkEnvironment" parent="~/.framework/cli/commands/doctor.ts"]
112
+ // CIL[DOC-MACRO purpose="Validates required environment variables and optional .xenv file presence."]
113
+ // CIL[DOC-RESPONSIBILITY responsibility="Determine whether the runtime environment is configured for Spine."]
114
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
115
+ // CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="none"]
116
+ // CIL[DOC-MICRO logic_summary="Filter required env vars against process.env, then check for .xenv file at the project root, returning a CheckResult." notable_decisions="Returns fail when required variables are missing; reports .xenv presence on success."]
117
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
118
+ // CIL[DOC-STABILITY stability="stable"]
119
+
107
120
  async function checkEnvironment(): Promise<CheckResult> {
108
121
  const required = ['SUPABASE_URL', 'SUPABASE_SERVICE_ROLE_KEY']
109
122
  const missing = required.filter(v => !process.env[v])
@@ -129,21 +142,23 @@ async function checkEnvironment(): Promise<CheckResult> {
129
142
  details: { has_xenv: hasXenv, vars_present: required.length }
130
143
  }
131
144
  }
132
- // CIL[END chunk_id="doctor_checkenvironment_1784071456"]
133
- // CIL[BEGIN chunk_id="doctor_checkdatabase_1784071456" type="function" identity="checkDatabase" parent="none"]
134
- // CIL[DOC-MACRO purpose="Check database connectivity and performance"]
135
- // CIL[DOC-RESPONSIBILITY responsibility="Validate database connection and measure latency"]
136
- // CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
137
- // CIL[DOC-CONTRACT inputs="none" outputs="CheckResult" errors="database connection errors" side_effects="queries database"]
138
- // CIL[DOC-MICRO logic_summary="Tests database connection with simple query and measures latency" notable_decisions="[]"]
139
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
140
- // CIL[DOC-STABILITY stability="stable"]
141
- // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
142
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
143
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
144
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
145
+ // CIL[DOC-VECTOR type="context" content="purpose='Validates required environment variables and optional .xenv file presence.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
146
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
147
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
148
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
145
149
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
146
150
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
151
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkEnvironment:function"]
152
+
153
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkDatabase:function" type="function" identity="checkDatabase" parent="~/.framework/cli/commands/doctor.ts"]
154
+ // CIL[DOC-MACRO purpose="Tests database connectivity and measures query latency."]
155
+ // CIL[DOC-RESPONSIBILITY responsibility="Verify that the Supabase database is reachable."]
156
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
157
+ // CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="Queries the accounts table."]
158
+ // CIL[DOC-MICRO logic_summary="Select a single account row, compute elapsed latency, and return pass or fail based on the query result." notable_decisions="Catches and returns structured failure for exceptions; reports latency on success."]
159
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
160
+ // CIL[DOC-STABILITY stability="stable"]
161
+
147
162
  async function checkDatabase(): Promise<CheckResult> {
148
163
  const start = Date.now()
149
164
  try {
@@ -175,21 +190,23 @@ async function checkDatabase(): Promise<CheckResult> {
175
190
  }
176
191
  }
177
192
  }
178
- // CIL[END chunk_id="doctor_checkdatabase_1784071456"]
179
- // CIL[BEGIN chunk_id="doctor_checkmigrations_1784071456" type="function" identity="checkMigrations" parent="none"]
180
- // CIL[DOC-MACRO purpose="Check migration status and pending migrations"]
181
- // CIL[DOC-RESPONSIBILITY responsibility="Compare local migration files with applied migrations"]
182
- // CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[]"]
183
- // CIL[DOC-CONTRACT inputs="none" outputs="CheckResult" errors="database query errors" side_effects="queries database, reads filesystem"]
184
- // CIL[DOC-MICRO logic_summary="Compares local SQL files with database migration records" notable_decisions="[]"]
185
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
186
- // CIL[DOC-STABILITY stability="stable"]
187
- // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
188
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
189
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
190
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
193
+ // CIL[DOC-VECTOR type="context" content="purpose='Tests database connectivity and measures query latency.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
194
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
195
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
196
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
191
197
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
192
198
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
199
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkDatabase:function"]
200
+
201
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkMigrations:function" type="function" identity="checkMigrations" parent="~/.framework/cli/commands/doctor.ts"]
202
+ // CIL[DOC-MACRO purpose="Compares local migration files against applied database migrations."]
203
+ // CIL[DOC-RESPONSIBILITY responsibility="Identify pending or missing database migrations."]
204
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
205
+ // CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="Reads migration directory and queries schema_migrations."]
206
+ // CIL[DOC-MICRO logic_summary="List local SQL files, query applied migration versions, and report any local files not yet applied." notable_decisions="Returns warn for pending migrations and fail when the directory or query errors."]
207
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
208
+ // CIL[DOC-STABILITY stability="stable"]
209
+
193
210
  async function checkMigrations(): Promise<CheckResult> {
194
211
  const migrationsDir = resolve(__dirname, '../../migrations_dayzero')
195
212
 
@@ -251,21 +268,23 @@ async function checkMigrations(): Promise<CheckResult> {
251
268
  }
252
269
  }
253
270
  }
254
- // CIL[END chunk_id="doctor_checkmigrations_1784071456"]
255
- // CIL[BEGIN chunk_id="doctor_checkintegrity_1784071456" type="function" identity="checkIntegrity" parent="none"]
256
- // CIL[DOC-MACRO purpose="Check core integrity manifest"]
257
- // CIL[DOC-RESPONSIBILITY responsibility="Validate spine manifest and integrity hash"]
258
- // CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[]"]
259
- // CIL[DOC-CONTRACT inputs="none" outputs="CheckResult" errors="file system errors" side_effects="reads manifest file"]
260
- // CIL[DOC-MICRO logic_summary="Checks for manifest file and validates integrity hash presence" notable_decisions="[]"]
261
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
262
- // CIL[DOC-STABILITY stability="stable"]
263
- // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
264
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
265
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
266
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
271
+ // CIL[DOC-VECTOR type="context" content="purpose='Compares local migration files against applied database migrations.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
272
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
273
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
274
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
267
275
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
268
276
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
277
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkMigrations:function"]
278
+
279
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkIntegrity:function" type="function" identity="checkIntegrity" parent="~/.framework/cli/commands/doctor.ts"]
280
+ // CIL[DOC-MACRO purpose="Validates the presence and integrity hash of the Spine manifest."]
281
+ // CIL[DOC-RESPONSIBILITY responsibility="Confirm that the installation manifest exists and contains an integrity reference."]
282
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
283
+ // CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="Reads the manifest file from disk."]
284
+ // CIL[DOC-MICRO logic_summary="Check for .spine-manifest.json, parse it, and verify that manifest.integrity.src is present." notable_decisions="Warns if manifest is missing or lacks integrity hash; returns pass when valid."]
285
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
286
+ // CIL[DOC-STABILITY stability="stable"]
287
+
269
288
  async function checkIntegrity(): Promise<CheckResult> {
270
289
  const manifestPath = resolve(__dirname, '../../.spine-manifest.json')
271
290
 
@@ -308,21 +327,23 @@ async function checkIntegrity(): Promise<CheckResult> {
308
327
  }
309
328
  }
310
329
  }
311
- // CIL[END chunk_id="doctor_checkintegrity_1784071456"]
312
- // CIL[BEGIN chunk_id="doctor_checktestruns_1784071456" type="function" identity="checkTestRuns" parent="none"]
313
- // CIL[DOC-MACRO purpose="Check recent test run status"]
314
- // CIL[DOC-RESPONSIBILITY responsibility="Query latest test run and report status"]
315
- // CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[]"]
316
- // CIL[DOC-CONTRACT inputs="none" outputs="CheckResult" errors="database query errors" side_effects="queries test_runs table"]
317
- // CIL[DOC-MICRO logic_summary="Retrieves most recent test run and reports its status" notable_decisions="[]"]
318
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
319
- // CIL[DOC-STABILITY stability="stable"]
320
- // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
321
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
322
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
323
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
330
+ // CIL[DOC-VECTOR type="context" content="purpose='Validates the presence and integrity hash of the Spine manifest.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
331
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
332
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
333
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
324
334
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
325
335
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
336
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkIntegrity:function"]
337
+
338
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkTestRuns:function" type="function" identity="checkTestRuns" parent="~/.framework/cli/commands/doctor.ts"]
339
+ // CIL[DOC-MACRO purpose="Fetches the latest test run from the database."]
340
+ // CIL[DOC-RESPONSIBILITY responsibility="Report the status of the most recent test suite execution."]
341
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
342
+ // CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="Queries the test_runs table."]
343
+ // CIL[DOC-MICRO logic_summary="Select the newest test run, translate its status to pass or warn, and return details." notable_decisions="Warns on query errors or when no test runs exist; maps status 'passed' to pass."]
344
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
345
+ // CIL[DOC-STABILITY stability="stable"]
346
+
326
347
  async function checkTestRuns(): Promise<CheckResult> {
327
348
  try {
328
349
  const { data, error } = await adminDb
@@ -367,21 +388,114 @@ async function checkTestRuns(): Promise<CheckResult> {
367
388
  }
368
389
  }
369
390
  }
370
- // CIL[END chunk_id="doctor_checktestruns_1784071456"]
371
- // CIL[BEGIN chunk_id="doctor_tryfix_1784071456" type="function" identity="tryFix" parent="none"]
372
- // CIL[DOC-MACRO purpose="Provide fix suggestions for failed checks"]
373
- // CIL[DOC-RESPONSIBILITY responsibility="Generate remediation instructions for common issues"]
374
- // CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[]"]
375
- // CIL[DOC-CONTRACT inputs="none" outputs="string" errors="none" side_effects="none"]
376
- // CIL[DOC-MICRO logic_summary="Maps check names to specific fix commands and instructions" notable_decisions="[]"]
377
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
378
- // CIL[DOC-STABILITY stability="stable"]
379
- // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
380
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
381
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
382
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
391
+ // CIL[DOC-VECTOR type="context" content="purpose='Fetches the latest test run from the database.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
392
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
393
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
394
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
383
395
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
384
396
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
397
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkTestRuns:function"]
398
+
399
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:checkRuntimeWiring:function" type="function" identity="checkRuntimeWiring" parent="~/.framework/cli/commands/doctor.ts"]
400
+ // CIL[DOC-MACRO purpose="Verify declared runtime wiring resolves — generic referential integrity over triggers, pipelines, and actions"]
401
+ // CIL[DOC-RESPONSIBILITY responsibility="Confirm every active trigger's declared type slugs and pipeline references resolve to existing, active rows, and every active pipeline's stages reference existing actions"]
402
+ // CIL[DOC-CONTRACT inputs="[]" outputs="Promise<CheckResult>" errors="[]" side_effects="Queries triggers, types, pipelines, actions"]
403
+ // CIL[DOC-MICRO logic_summary="Load all active triggers, all types, all pipelines, and all active actions; report each dangling config.type_slug / config.filters.type_slug / config.pipeline_slug / pipeline_id / stage_type reference as a problem line, and flag active pipelines whose stages array is missing or empty (they complete without doing anything)" notable_decisions="App-agnostic — checks only that declared references resolve, never that a particular app's workflow exists; entity/kind on trigger config scopes the type check when declared"]
404
+ // CIL[DOC-STABILITY stability="stable"]
405
+ export async function checkRuntimeWiring(): Promise<CheckResult> {
406
+ const problems: string[] = []
407
+ try {
408
+ const [{ data: triggers }, { data: types }, { data: pipelines }, { data: actions }] =
409
+ await Promise.all([
410
+ adminDb.from('triggers').select('id, slug, event_type, pipeline_id, config').eq('is_active', true),
411
+ adminDb.from('types').select('slug, kind'),
412
+ adminDb.from('pipelines').select('id, slug, is_active, stages'),
413
+ adminDb.from('actions').select('slug').eq('is_active', true),
414
+ ])
415
+
416
+ // Trigger configs name entities as table names ('items'); the types
417
+ // registry uses singular kinds ('item').
418
+ const ENTITY_KIND: Record<string, string> = {
419
+ items: 'item', threads: 'thread', messages: 'message', links: 'link',
420
+ attachments: 'attachment', watchers: 'watcher', people: 'person', accounts: 'account',
421
+ }
422
+ const declaredKindOf = (config: any): string | null => {
423
+ const raw = config?.kind || config?.entity || config?.entity_type || null
424
+ return typeof raw === 'string' && raw ? (ENTITY_KIND[raw] || raw) : null
425
+ }
426
+
427
+ const typeSlugs = new Set<string>((types || []).map((t: any) => t.slug))
428
+ const typeKindSlugs = new Set<string>((types || []).map((t: any) => `${t.kind}:${t.slug}`))
429
+ const pipelinesById = new Map<string, any>((pipelines || []).map((p: any) => [p.id, p]))
430
+ const pipelinesBySlug = new Map<string, any>((pipelines || []).map((p: any) => [p.slug, p]))
431
+ const actionSlugs = new Set<string>((actions || []).map((a: any) => a.slug))
432
+
433
+ for (const t of triggers || []) {
434
+ const label = `trigger '${t.slug || t.id}'`
435
+ const cfg = t.config || {}
436
+ const declaredKind = declaredKindOf(cfg)
437
+ for (const slug of new Set([cfg.type_slug, cfg.filters?.type_slug].filter(Boolean) as string[])) {
438
+ const found = declaredKind ? typeKindSlugs.has(`${declaredKind}:${slug}`) : typeSlugs.has(slug)
439
+ if (!found) problems.push(`${label}: type '${slug}' not found`)
440
+ }
441
+ if (cfg.pipeline_slug) {
442
+ const p = pipelinesBySlug.get(cfg.pipeline_slug)
443
+ if (!p) problems.push(`${label}: pipeline '${cfg.pipeline_slug}' not found`)
444
+ else if (!p.is_active) problems.push(`${label}: pipeline '${cfg.pipeline_slug}' is inactive`)
445
+ }
446
+ if (t.pipeline_id) {
447
+ const p = pipelinesById.get(t.pipeline_id)
448
+ if (!p) problems.push(`${label}: pipeline_id '${t.pipeline_id}' not found`)
449
+ else if (!p.is_active) problems.push(`${label}: pipeline '${p.slug || t.pipeline_id}' is inactive`)
450
+ }
451
+ }
452
+
453
+ for (const p of (pipelines || []).filter((row: any) => row.is_active)) {
454
+ const stages = Array.isArray(p.stages) ? p.stages : []
455
+ // An active pipeline with no stages completes successfully while doing
456
+ // nothing — a silent no-op worth flagging as a wiring problem.
457
+ if (!stages.length) {
458
+ problems.push(`pipeline '${p.slug}' is active but has no stages (completes without doing anything)`)
459
+ continue
460
+ }
461
+ for (let i = 0; i < stages.length; i++) {
462
+ const stageType = stages[i]?.stage_type
463
+ if (stageType && !actionSlugs.has(stageType)) {
464
+ problems.push(`pipeline '${p.slug}': stage ${i} references missing action '${stageType}'`)
465
+ }
466
+ }
467
+ }
468
+
469
+ const activePipelines = (pipelines || []).filter((p: any) => p.is_active).length
470
+ if (problems.length) {
471
+ return {
472
+ name: 'runtime_wiring',
473
+ status: 'fail',
474
+ message: `Runtime wiring broken: ${problems.join('; ')}`,
475
+ details: { problems },
476
+ fixable: true,
477
+ }
478
+ }
479
+ return {
480
+ name: 'runtime_wiring',
481
+ status: 'pass',
482
+ message: `Runtime wiring intact (${(triggers || []).length} active triggers, ${activePipelines} active pipelines)`,
483
+ }
484
+ } catch (err: any) {
485
+ return { name: 'runtime_wiring', status: 'fail', message: `Wiring check error: ${err.message}`, fixable: false }
486
+ }
487
+ }
488
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:checkRuntimeWiring:function"]
489
+
490
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:tryFix:function" type="function" identity="tryFix" parent="~/.framework/cli/commands/doctor.ts"]
491
+ // CIL[DOC-MACRO purpose="Provides automated fix instructions for failed or warned checks."]
492
+ // CIL[DOC-RESPONSIBILITY responsibility="Map a CheckResult name to a human-readable remediation hint."]
493
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
494
+ // CIL[DOC-CONTRACT inputs="check: CheckResult" outputs="Promise<string>" errors="[]" side_effects="none"]
495
+ // CIL[DOC-MICRO logic_summary="Use a switch on check.name to return a context-specific remediation message." notable_decisions="Returns 'No automatic fix available' for unrecognized check names."]
496
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
497
+ // CIL[DOC-STABILITY stability="stable"]
498
+
385
499
  async function tryFix(check: CheckResult): Promise<string> {
386
500
  switch (check.name) {
387
501
  case 'environment':
@@ -396,31 +510,37 @@ async function tryFix(check: CheckResult): Promise<string> {
396
510
  case 'test_runs':
397
511
  return 'Run `npm run test` to execute test suites'
398
512
 
513
+ case 'runtime_wiring':
514
+ return 'Fix the dangling trigger/pipeline references listed in details (re-install the owning app or correct the type_slug / pipeline reference)'
515
+
399
516
  default:
400
517
  return 'No automatic fix available'
401
518
  }
402
519
  }
403
- // CIL[END chunk_id="doctor_tryfix_1784071456"]
404
- // CIL[BEGIN chunk_id="doctor_registerdoctorcommands_1784071456" type="function" identity="registerDoctorCommands" parent="none"]
405
- // CIL[DOC-MACRO purpose="Register doctor command with CLI framework"]
406
- // CIL[DOC-RESPONSIBILITY responsibility="Orchestrate all health checks and generate report"]
407
- // CIL[DOC-CONTEXT module="doctor-cli" layer="cli" related_files="[]"]
408
- // CIL[DOC-CONTRACT inputs="none" outputs="doctor command registration" errors="CLI context errors" side_effects="outputs health report"]
409
- // CIL[DOC-MICRO logic_summary="Runs all checks in dependency order and formats results" notable_decisions="[]"]
410
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
411
- // CIL[DOC-STABILITY stability="stable"]
412
- // CIL[DOC-VECTOR type="context" content="Layer: cli. Direct callers: 0. Direct calls: 0. Related files: none."]
413
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
414
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
415
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
520
+ // CIL[DOC-VECTOR type="context" content="purpose='Provides automated fix instructions for failed or warned checks.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
521
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
522
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
523
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
416
524
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
417
525
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
526
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:tryFix:function"]
527
+
528
+ // CIL[BEGIN stable_id="~/.framework/cli/commands/doctor.ts:registerDoctorCommands:function" type="function" identity="registerDoctorCommands" parent="~/.framework/cli/commands/doctor.ts"]
529
+ // CIL[DOC-MACRO purpose="Registers the 'doctor' CLI command and runs the health check sequence."]
530
+ // CIL[DOC-RESPONSIBILITY responsibility="Expose a CLI entrypoint that executes health checks and renders the report."]
531
+ // CIL[DOC-CONTEXT module="doctor" layer="app-specific" related_files=".framework/cli/commands/doctor.ts,.framework/cli/context.ts,.framework/functions/_shared/index.ts"]
532
+ // CIL[DOC-CONTRACT inputs="program: Command" outputs="Promise<void>" errors="[]" side_effects="Writes health report to stdout and exits the process."]
533
+ // CIL[DOC-MICRO logic_summary="Chain conditional checks (environment, database, migrations, test runs, runtime wiring, integrity), build a DoctorReport, and render it as JSON or formatted console output." notable_decisions="Skips database-dependent checks when prior checks fail; exits with code 1 for unhealthy, 2 for degraded, 0 for healthy."]
534
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
535
+ // CIL[DOC-STABILITY stability="stable"]
536
+
418
537
  export function registerDoctorCommands(program: Command) {
419
538
  program
420
539
  .command('doctor')
421
540
  .description('Validate Spine installation health')
422
541
  .option('--json', 'Output as JSON')
423
542
  .option('--fix', 'Show fix instructions for failed checks')
543
+ .option('--ticket <id>', 'Attach the sanitized diagnostic report to a support ticket')
424
544
  .action(async (opts) => {
425
545
  try {
426
546
 
@@ -444,6 +564,7 @@ export function registerDoctorCommands(program: Command) {
444
564
  if (checks[1].status === 'pass') {
445
565
  checks.push(await checkMigrations())
446
566
  checks.push(await checkTestRuns())
567
+ checks.push(await checkRuntimeWiring())
447
568
  } else {
448
569
  checks.push({
449
570
  name: 'migrations',
@@ -457,6 +578,12 @@ export function registerDoctorCommands(program: Command) {
457
578
  message: 'Skipped - database not connected',
458
579
  fixable: false
459
580
  })
581
+ checks.push({
582
+ name: 'runtime_wiring',
583
+ status: 'fail',
584
+ message: 'Skipped - database not connected',
585
+ fixable: false
586
+ })
460
587
  }
461
588
  } else {
462
589
  checks.push({
@@ -477,6 +604,12 @@ export function registerDoctorCommands(program: Command) {
477
604
  message: 'Skipped - environment variables missing',
478
605
  fixable: false
479
606
  })
607
+ checks.push({
608
+ name: 'runtime_wiring',
609
+ status: 'fail',
610
+ message: 'Skipped - environment variables missing',
611
+ fixable: false
612
+ })
480
613
  }
481
614
 
482
615
  checks.push(await checkIntegrity())
@@ -506,6 +639,39 @@ export function registerDoctorCommands(program: Command) {
506
639
  }
507
640
  }
508
641
 
642
+ // Attach the diagnostic bundle to a support ticket when requested.
643
+ // The report contains check names and messages only — never env
644
+ // values, credentials, or customer data — so it is safe to store.
645
+ if (opts.ticket) {
646
+ try {
647
+ const { data: ticket } = await adminDb
648
+ .from('items').select('id, data').eq('id', opts.ticket).maybeSingle()
649
+ if (!ticket) {
650
+ console.warn(`ticket ${opts.ticket} not found — diagnostics not attached`)
651
+ } else {
652
+ const diagnostics = {
653
+ attached_at: new Date().toISOString(),
654
+ overall: report.overall,
655
+ checks: report.checks.map(c => ({
656
+ name: c.name, status: c.status, message: c.message, details: c.details,
657
+ })),
658
+ summary: report.summary,
659
+ runtime: { node: process.version, platform: process.platform },
660
+ }
661
+ await adminDb
662
+ .from('items')
663
+ .update({
664
+ data: { ...(ticket.data || {}), diagnostics },
665
+ updated_at: new Date().toISOString(),
666
+ })
667
+ .eq('id', ticket.id)
668
+ console.log(`Diagnostics attached to ticket ${opts.ticket}`)
669
+ }
670
+ } catch (err: any) {
671
+ console.warn(`diagnostic attach failed: ${err.message}`)
672
+ }
673
+ }
674
+
509
675
 
510
676
  if (opts.json) {
511
677
  console.log(JSON.stringify(report, null, 2))
@@ -549,4 +715,10 @@ export function registerDoctorCommands(program: Command) {
549
715
  }
550
716
  })
551
717
  }
552
- // CIL[END chunk_id="doctor_registerdoctorcommands_1784071456"]
718
+ // CIL[DOC-VECTOR type="context" content="purpose='Registers the 'doctor' CLI command and runs the health check sequence.'; No verified external callers; imports: .framework/cli/context.ts,.framework/functions/_shared/index.ts"]
719
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
720
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
721
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
722
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
723
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
724
+ // CIL[END stable_id="~/.framework/cli/commands/doctor.ts:registerDoctorCommands:function"]