spine-framework 0.3.145 → 0.4.1

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 +5067 -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,18 +1,13 @@
1
- // CIL[BEGIN chunk_id="cilprojectspage_module_header_1784193942" type="module_header" identity="module_header" parent="none"]
2
- // CIL[DOC-MACRO purpose="Import dependencies and icons for the CIL projects page"]
3
- // CIL[DOC-RESPONSIBILITY responsibility="Provides module imports and icon references used by CILProjectsPage"]
4
- // CIL[DOC-CONTEXT module="cortex:cil-projects" layer="presentation" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
5
- // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
6
- // CIL[DOC-MICRO logic_summary="Imports React hooks, router, apiFetch, useAppPath, shadcn UI components, and lucide icons" notable_decisions="[]"]
7
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
1
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
2
+ // CIL[DOC-MACRO purpose="React page for administering CIL projects — listing, creation, ingestion, and deletion."]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Render the CIL admin UI; load project list; manage create/edit/delete dialogs."]
4
+ // CIL[DOC-CONTEXT module="admin/cil" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/dialog.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX page" errors="none" side_effects="API calls for listing, creating, updating, and deleting CIL projects"]
6
+ // CIL[DOC-MICRO logic_summary="Imports dependencies, defines types and helpers, then exports a default component that renders a project grid, status badges, and a registration dialog." notable_decisions="[]"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
8
  // CIL[DOC-STABILITY stability="stable"]
9
- // CIL[DOC-AUDIENCE audience="developer"]
10
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
11
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
12
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
13
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
14
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
15
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
9
+ // CIL[DOC-AUDIENCE audience="framework"]
10
+
16
11
  import { useEffect, useState } from 'react'
17
12
  import { useNavigate } from 'react-router-dom'
18
13
  import { apiFetch } from '@core/lib/api'
@@ -34,21 +29,23 @@ import { NativeSelect, NativeSelectOption } from '@core/components/ui/native-sel
34
29
  import { FolderGit2, Plus, Play, CheckCircle2, Clock, AlertCircle, GitGraph, LayoutDashboard, Trash2, Layers, Pencil, X } from 'lucide-react'
35
30
 
36
31
  import { PageInstructions } from '../../../components/admin/PageInstructions'
37
- // CIL[END chunk_id="cilprojectspage_module_header_1784193942"]
38
- // CIL[BEGIN chunk_id="cilprojectspage_sourceset_1784193942" type="interface" identity="SourceSet" parent="none"]
39
- // CIL[DOC-MACRO purpose="Declare the SourceSet data shape for ingestion configuration"]
40
- // CIL[DOC-RESPONSIBILITY responsibility="Provides the TypeScript contract for a named source set within a CIL project"]
41
- // CIL[DOC-CONTEXT module="cortex:cil-projects" layer="presentation" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
42
- // CIL[DOC-CONTRACT inputs="none" outputs="SourceSet type definition" errors="none" side_effects="none"]
43
- // CIL[DOC-MICRO logic_summary="Defines id, name, base_path, and optional globs, exclude_globs, and layer fields" notable_decisions="[]"]
44
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
45
- // CIL[DOC-STABILITY stability="stable"]
46
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/schema-utils.ts, \."]
47
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
48
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
49
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
32
+
33
+ // CIL[DOC-VECTOR type="context" content="purpose='React page for administering CIL projects — listing, creation, ingestion, and deletion.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
34
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
35
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
36
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
50
37
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
51
38
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
39
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:module_header:module_header"]
40
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:SourceSet:interface" type="interface" identity="SourceSet" parent="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
41
+ // CIL[DOC-MACRO purpose="Describe an optional source set within a CIL project."]
42
+ // CIL[DOC-RESPONSIBILITY responsibility="Type-check source set fields including base path, globs, and layer."]
43
+ // CIL[DOC-CONTEXT module="admin/cil" layer="domain" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/dialog.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
44
+ // CIL[DOC-CONTRACT inputs="none" outputs="TypeScript interface" errors="none" side_effects="none"]
45
+ // CIL[DOC-MICRO logic_summary="Optional source set structure with id, name, base_path, globs, exclude_globs, and layer." notable_decisions="[]"]
46
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
47
+ // CIL[DOC-STABILITY stability="stable"]
48
+
52
49
  interface SourceSet {
53
50
  id: string
54
51
  name: string
@@ -57,22 +54,24 @@ interface SourceSet {
57
54
  exclude_globs?: string
58
55
  layer?: string
59
56
  }
60
-
61
- // CIL[END chunk_id="cilprojectspage_sourceset_1784193942"]
62
- // CIL[BEGIN chunk_id="cilprojectspage_cilproject_1784193942" type="interface" identity="CILProject" parent="none"]
63
- // CIL[DOC-MACRO purpose="Declare the CILProject data shape for project listing and management"]
64
- // CIL[DOC-RESPONSIBILITY responsibility="Provides the TypeScript contract for CIL project records including ingestion metadata"]
65
- // CIL[DOC-CONTEXT module="cortex:cil-projects" layer="presentation" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
66
- // CIL[DOC-CONTRACT inputs="none" outputs="CILProject type definition" errors="none" side_effects="none"]
67
- // CIL[DOC-MICRO logic_summary="Defines id, title, description, status, and nested data with repo, language mix, status, counts, cost, timestamps, source sets, and dependencies" notable_decisions="[]"]
68
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
69
- // CIL[DOC-STABILITY stability="stable"]
70
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
71
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
72
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
73
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
57
+ // CIL[DOC-VECTOR type="context" content="purpose='Describe an optional source set within a CIL project.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
58
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
59
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
60
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
74
61
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
75
62
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
63
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:SourceSet:interface"]
64
+
65
+
66
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:CILProject:interface" type="interface" identity="CILProject" parent="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
67
+ // CIL[DOC-MACRO purpose="Data model for a CIL project record and its ingestion metadata."]
68
+ // CIL[DOC-RESPONSIBILITY responsibility="Define the shape of project data returned from the CIL API."]
69
+ // CIL[DOC-CONTEXT module="admin/cil" layer="domain" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/dialog.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
70
+ // CIL[DOC-CONTRACT inputs="none" outputs="TypeScript interface" errors="none" side_effects="none"]
71
+ // CIL[DOC-MICRO logic_summary="Includes id, title, description, status, and a nested data object with repo path, globs, source sets, and ingestion statistics." notable_decisions="[]"]
72
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
73
+ // CIL[DOC-STABILITY stability="stable"]
74
+
76
75
  interface CILProject {
77
76
  id: string
78
77
  title: string
@@ -81,6 +80,9 @@ interface CILProject {
81
80
  data: {
82
81
  repo_path: string
83
82
  language_mix: string
83
+ kind?: 'core' | 'custom'
84
+ globs?: string[]
85
+ exclude_globs?: string[]
84
86
  ingestion_status: 'not_started' | 'in_progress' | 'complete'
85
87
  file_count: number
86
88
  chunk_count: number
@@ -91,64 +93,88 @@ interface CILProject {
91
93
  }
92
94
  created_at: string
93
95
  }
94
-
95
- // CIL[END chunk_id="cilprojectspage_cilproject_1784193942"]
96
- // CIL[BEGIN chunk_id="cilprojectspage_status_badge_1784193942" type="constant" identity="STATUS_BADGE" parent="none"]
97
- // CIL[DOC-MACRO purpose="Map ingestion status strings to badge labels and variants"]
98
- // CIL[DOC-RESPONSIBILITY responsibility="Supplies visual badge configuration for project ingestion status"]
99
- // CIL[DOC-CONTEXT module="cortex:cil-projects" layer="presentation" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
100
- // CIL[DOC-CONTRACT inputs="none" outputs="STATUS_BADGE mapping" errors="none" side_effects="none"]
101
- // CIL[DOC-MICRO logic_summary="Maps not_started, in_progress, and complete to label text and shadcn Badge variant values" notable_decisions="[]"]
102
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
103
- // CIL[DOC-STABILITY stability="stable"]
104
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
105
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
106
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
107
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
96
+ // CIL[DOC-VECTOR type="context" content="purpose='Data model for a CIL project record and its ingestion metadata.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
97
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
98
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
99
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
108
100
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
109
101
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
102
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:CILProject:interface"]
103
+
104
+
105
+
106
+
107
+
108
+
109
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:status_badge:constant" type="constant" identity="STATUS_BADGE" parent="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
110
+ // CIL[DOC-MACRO purpose="Mapping of ingestion statuses to badge label and variant."]
111
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide consistent badge styling for not_started, in_progress, and complete statuses."]
112
+ // CIL[DOC-CONTEXT module="admin/cil" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/dialog.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
113
+ // CIL[DOC-CONTRACT inputs="ingestion status string" outputs="badge label and variant" errors="none" side_effects="none"]
114
+ // CIL[DOC-MICRO logic_summary="Record keyed by status that returns a label and a shadcn Badge variant." notable_decisions="[]"]
115
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
116
+ // CIL[DOC-STABILITY stability="stable"]
117
+
110
118
  const STATUS_BADGE: Record<string, { label: string; variant: 'default' | 'secondary' | 'outline' }> = {
111
119
  not_started: { label: 'Not Started', variant: 'outline' },
112
120
  in_progress: { label: 'In Progress', variant: 'secondary' },
113
121
  complete: { label: 'Complete', variant: 'default' },
114
122
  }
115
-
116
- // CIL[END chunk_id="cilprojectspage_status_badge_1784193942"]
117
- // CIL[BEGIN chunk_id="cilprojectspage_status_icon_1784193942" type="constant" identity="STATUS_ICON" parent="none"]
118
- // CIL[DOC-MACRO purpose="Map ingestion status strings to icon components"]
119
- // CIL[DOC-RESPONSIBILITY responsibility="Supplies the icon component used for each project ingestion status"]
120
- // CIL[DOC-CONTEXT module="cortex:cil-projects" layer="presentation" related_files="[]"]
121
- // CIL[DOC-CONTRACT inputs="none" outputs="STATUS_ICON mapping of React.ElementType" errors="none" side_effects="none"]
122
- // CIL[DOC-MICRO logic_summary="Maps not_started to Clock, in_progress to AlertCircle, and complete to CheckCircle2" notable_decisions="[]"]
123
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
124
- // CIL[DOC-STABILITY stability="stable"]
125
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
126
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
127
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
128
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
123
+ // CIL[DOC-VECTOR type="context" content="purpose='Mapping of ingestion statuses to badge label and variant.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
124
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
125
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
126
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
129
127
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
130
128
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
129
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:status_badge:constant"]
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:status_icon:constant" type="constant" identity="STATUS_ICON" parent="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
142
+ // CIL[DOC-MACRO purpose="Mapping of ingestion statuses to icon components."]
143
+ // CIL[DOC-RESPONSIBILITY responsibility="Render an appropriate Lucide icon for each ingestion status."]
144
+ // CIL[DOC-CONTEXT module="admin/cil" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/dialog.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
145
+ // CIL[DOC-CONTRACT inputs="ingestion status string" outputs="React icon component" errors="none" side_effects="none"]
146
+ // CIL[DOC-MICRO logic_summary="Record keyed by status that returns Clock, AlertCircle, or CheckCircle2 components." notable_decisions="[]"]
147
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
148
+ // CIL[DOC-STABILITY stability="stable"]
149
+
131
150
  const STATUS_ICON: Record<string, React.ElementType> = {
132
151
  not_started: Clock,
133
152
  in_progress: AlertCircle,
134
153
  complete: CheckCircle2,
135
154
  }
136
-
137
- // CIL[END chunk_id="cilprojectspage_status_icon_1784193942"]
138
- // CIL[BEGIN chunk_id="cilprojectspage_cilprojectspage_1784193942" type="component" identity="CILProjectsPage" parent="none"]
139
- // CIL[DOC-MACRO purpose="Render the CIL projects list with creation, editing, and deletion workflows"]
140
- // CIL[DOC-RESPONSIBILITY responsibility="Manage CIL project list state and render project cards, dialogs, and navigation"]
141
- // CIL[DOC-CONTEXT module="cortex:cil-projects" layer="presentation" related_files="[]"]
142
- // CIL[DOC-CONTRACT inputs="none" outputs="JSX.Element" errors="API errors are silently caught; required fields block save" side_effects="Calls /api/cil-project actions and navigates to /cil/:id routes"]
143
- // CIL[DOC-MICRO logic_summary="Fetches projects on mount, displays loading/empty/card states, manages create/edit form with source sets, and navigates to ingest, dashboard, files, and graph pages" notable_decisions="[]"]
144
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
145
- // CIL[DOC-STABILITY stability="stable"]
146
- // CIL[DOC-VECTOR type="context" content="Layer: presentation. Direct callers: 0. Direct calls: 0. Related files: none."]
147
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
148
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
149
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
155
+ // CIL[DOC-VECTOR type="context" content="purpose='Mapping of ingestion statuses to icon components.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
156
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
157
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
158
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
150
159
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
151
160
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
161
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:status_icon:constant"]
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+ // CIL[BEGIN stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:CILProjectsPage:component" type="component" identity="CILProjectsPage" parent="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
170
+ // CIL[DOC-MACRO purpose="Default React component for the CIL projects admin page."]
171
+ // CIL[DOC-RESPONSIBILITY responsibility="Display and manage CIL projects, including listing, creating, editing, deleting, and navigation."]
172
+ // CIL[DOC-CONTEXT module="admin/cil" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/badge.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/dialog.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/native-select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/lib/api.ts,.framework/src/pages/admin/cil/CILProjectsPage.tsx"]
173
+ // CIL[DOC-CONTRACT inputs="none" outputs="JSX page" errors="none" side_effects="API calls, React state and navigation"]
174
+ // CIL[DOC-MICRO logic_summary="Fetches project list, renders status cards with badge and icon, and provides a dialog to register or edit projects and source sets." notable_decisions="[]"]
175
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
176
+ // CIL[DOC-STABILITY stability="stable"]
177
+
152
178
  export default function CILProjectsPage() {
153
179
  const navigate = useNavigate()
154
180
  const appPath = (path: string) => '/spine-framework/admin' + (path.startsWith('/') ? path : '/' + path)
@@ -158,7 +184,16 @@ export default function CILProjectsPage() {
158
184
  const [creating, setCreating] = useState(false)
159
185
  const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null)
160
186
  const [deleting, setDeleting] = useState(false)
161
- const [form, setForm] = useState({ name: '', description: '', repo_path: '', language_mix: '', source_sets: [] as SourceSet[] })
187
+ const [form, setForm] = useState({
188
+ name: '',
189
+ description: '',
190
+ repo_path: '',
191
+ language_mix: '',
192
+ kind: 'custom' as 'core' | 'custom',
193
+ globs: '**/*.ts, **/*.tsx, **/*.sql',
194
+ exclude_globs: 'node_modules/**, .git/**, .assembled/**, dist/**, build/**, .netlify/**, **/*.min.js, **/*.d.ts',
195
+ source_sets: [] as SourceSet[],
196
+ })
162
197
  const [editingProjectId, setEditingProjectId] = useState<string | null>(null)
163
198
 
164
199
  const fetchProjects = () => {
@@ -181,6 +216,9 @@ export default function CILProjectsPage() {
181
216
  description: form.description,
182
217
  repo_path: form.repo_path,
183
218
  language_mix: form.language_mix,
219
+ kind: form.kind,
220
+ globs: form.globs.split(',').map((s: string) => s.trim()).filter(Boolean),
221
+ exclude_globs: form.exclude_globs.split(',').map((s: string) => s.trim()).filter(Boolean),
184
222
  }
185
223
  if (form.source_sets && form.source_sets.length > 0) {
186
224
  payload.source_sets = form.source_sets.map(ss => ({
@@ -192,10 +230,12 @@ export default function CILProjectsPage() {
192
230
 
193
231
  let res: Response
194
232
  if (editingProjectId) {
233
+ const updatePayload = { ...payload }
234
+ delete updatePayload.name
195
235
  res = await apiFetch(`/api/cil-project?action=update&id=${editingProjectId}`, {
196
236
  method: 'PATCH',
197
237
  headers: { 'Content-Type': 'application/json' },
198
- body: JSON.stringify({ data: payload }),
238
+ body: JSON.stringify({ title: form.name, description: form.description, data: updatePayload }),
199
239
  })
200
240
  } else {
201
241
  res = await apiFetch('/api/cil-project?action=create', {
@@ -209,7 +249,7 @@ export default function CILProjectsPage() {
209
249
  const newId = data?.project?.id || data?.data?.project?.id
210
250
  setShowCreate(false)
211
251
  setEditingProjectId(null)
212
- setForm({ name: '', description: '', repo_path: '', language_mix: '', source_sets: [] })
252
+ setForm({ name: '', description: '', repo_path: '', language_mix: '', kind: 'custom', source_sets: [] })
213
253
  if (newId && !editingProjectId) {
214
254
  navigate(appPath(`/cil/${newId}/ingest`))
215
255
  } else {
@@ -223,7 +263,16 @@ export default function CILProjectsPage() {
223
263
 
224
264
  const openCreate = () => {
225
265
  setEditingProjectId(null)
226
- setForm({ name: '', description: '', repo_path: '', language_mix: '', source_sets: [] })
266
+ setForm({
267
+ name: '',
268
+ description: '',
269
+ repo_path: '',
270
+ language_mix: '',
271
+ kind: 'custom',
272
+ globs: '**/*.ts, **/*.tsx, **/*.sql',
273
+ exclude_globs: 'node_modules/**, .git/**, .assembled/**, dist/**, build/**, .netlify/**, **/*.min.js, **/*.d.ts',
274
+ source_sets: [],
275
+ })
227
276
  setShowCreate(true)
228
277
  }
229
278
 
@@ -234,13 +283,16 @@ export default function CILProjectsPage() {
234
283
  description: project.description,
235
284
  repo_path: project.data?.repo_path || '',
236
285
  language_mix: project.data?.language_mix || '',
286
+ kind: project.data?.kind || 'custom',
287
+ globs: (project.data?.globs || []).join(', '),
288
+ exclude_globs: (project.data?.exclude_globs || []).join(', '),
237
289
  source_sets: (project.data?.source_sets || []).map(ss => ({
238
290
  ...ss,
239
291
  globs: Array.isArray(ss.globs) ? ss.globs.join(', ') : ss.globs || '',
240
292
  exclude_globs: Array.isArray(ss.exclude_globs) ? ss.exclude_globs.join(', ') : ss.exclude_globs || '',
241
293
  })),
242
294
  })
243
- openCreate()
295
+ setShowCreate(true)
244
296
  }
245
297
 
246
298
  const handleDeleteProject = async () => {
@@ -302,10 +354,30 @@ export default function CILProjectsPage() {
302
354
  ) : (
303
355
  <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4">
304
356
  {projects.map(project => {
357
+
358
+
359
+
360
+
361
+
305
362
  const ingestionStatus = project.data?.ingestion_status || 'not_started'
363
+
364
+
365
+
366
+
367
+
306
368
  const { label, variant } = STATUS_BADGE[ingestionStatus] || STATUS_BADGE.not_started
369
+
370
+
371
+
372
+
373
+
307
374
  const StatusIcon = STATUS_ICON[ingestionStatus] || Clock
308
375
 
376
+
377
+
378
+
379
+
380
+
309
381
  return (
310
382
  <Card
311
383
  key={project.id}
@@ -429,7 +501,16 @@ export default function CILProjectsPage() {
429
501
  )}
430
502
 
431
503
  {}
432
- <Dialog open={showCreate} onOpenChange={open => { if (!open) { setEditingProjectId(null); setForm({ name: '', description: '', repo_path: '', language_mix: '', source_sets: [] }) } setShowCreate(open) }}>
504
+ <Dialog open={showCreate} onOpenChange={open => { if (!open) { setEditingProjectId(null); setForm({
505
+ name: '',
506
+ description: '',
507
+ repo_path: '',
508
+ language_mix: '',
509
+ kind: 'custom',
510
+ globs: '**/*.ts, **/*.tsx, **/*.sql',
511
+ exclude_globs: 'node_modules/**, .git/**, .assembled/**, dist/**, build/**, .netlify/**, **/*.min.js, **/*.d.ts',
512
+ source_sets: [],
513
+ }) } setShowCreate(open) }}>
433
514
  <DialogContent className="max-w-2xl max-h-[85vh] overflow-y-auto">
434
515
  <DialogHeader>
435
516
  <DialogTitle>{editingProjectId ? 'Edit CIL Project' : 'Register New CIL Project'}</DialogTitle>
@@ -454,6 +535,40 @@ export default function CILProjectsPage() {
454
535
  />
455
536
  <p className="text-xs text-muted-foreground">Absolute path to the repository root on the agent's filesystem</p>
456
537
  </div>
538
+ <div className="space-y-1.5">
539
+ <Label htmlFor="kind">Project Kind *</Label>
540
+ <NativeSelect
541
+ id="kind"
542
+ value={form.kind}
543
+ onChange={e => setForm(f => ({ ...f, kind: e.target.value as 'core' | 'custom' }))}
544
+ >
545
+ <NativeSelectOption value="core">Core (framework)</NativeSelectOption>
546
+ <NativeSelectOption value="custom">Custom app</NativeSelectOption>
547
+ </NativeSelect>
548
+ <p className="text-xs text-muted-foreground">Core projects track the framework; custom projects track app code under custom/apps</p>
549
+ </div>
550
+ <div className="space-y-1.5">
551
+ <Label htmlFor="globs">Include globs</Label>
552
+ <Textarea
553
+ id="globs"
554
+ value={form.globs}
555
+ onChange={e => setForm(f => ({ ...f, globs: e.target.value }))}
556
+ rows={2}
557
+ placeholder="**/*.ts, **/*.tsx, **/*.sql"
558
+ />
559
+ <p className="text-xs text-muted-foreground">Comma-separated globs of files to discover</p>
560
+ </div>
561
+ <div className="space-y-1.5">
562
+ <Label htmlFor="exclude_globs">Exclude globs</Label>
563
+ <Textarea
564
+ id="exclude_globs"
565
+ value={form.exclude_globs}
566
+ onChange={e => setForm(f => ({ ...f, exclude_globs: e.target.value }))}
567
+ rows={2}
568
+ placeholder="node_modules/**, dist/**, build/**, .git/**, .assembled/**"
569
+ />
570
+ <p className="text-xs text-muted-foreground">Comma-separated globs of files and directories to skip during discovery</p>
571
+ </div>
457
572
  {editingProjectId && (
458
573
  <>
459
574
  <div className="space-y-1.5">
@@ -611,4 +726,10 @@ export default function CILProjectsPage() {
611
726
  )
612
727
  }
613
728
 
614
- // CIL[END chunk_id="cilprojectspage_cilprojectspage_1784193942"]
729
+ // CIL[DOC-VECTOR type="context" content="purpose='Default React component for the CIL projects admin page.'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/components/ui/card.tsx,.framework/src/components/ui/button.tsx"]
730
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
731
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
732
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
733
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
734
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
735
+ // CIL[END stable_id="~/.framework/src/pages/admin/cil/CILProjectsPage.tsx:CILProjectsPage:component"]