spine-framework 0.3.145 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -0,0 +1,427 @@
1
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:file_header:constant" type="constant" identity="file_header" parent="~/.framework/tests/fixtures/seed.ts"]
2
+ // CIL[DOC-MACRO purpose="Idempotent fixture seed for integration tests"]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide file-level documentation and metadata for the seed fixture"]
4
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
5
+ // CIL[DOC-CONTRACT inputs="File metadata and JSDoc conventions" outputs="JSDoc metadata" errors="" side_effects="None; documentation only"]
6
+ // CIL[DOC-MICRO logic_summary="Declares the seed file scope, audience, layer, stability, and teardown contract" notable_decisions="test- prefix for safe teardown"]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stability="stable"]
9
+ /// <reference types="node" />
10
+ /**
11
+ * @module tests/fixtures/seed
12
+ * @audience core-contributor
13
+ * @layer test-infrastructure
14
+ * @stability stable
15
+ *
16
+ * Idempotent fixture seed for integration tests. Upserts canonical test data
17
+ * into the public schema under SPINE_TEST_ACCOUNT_ID. All rows use slugs
18
+ * prefixed with `test-` so teardown.ts can clean them up safely.
19
+ *
20
+ * Run before integration tests: `tsx v2-core/tests/fixtures/seed.ts`
21
+ *
22
+ * @seeAlso tests/fixtures/teardown.ts
23
+ */
24
+ // CIL[DOC-VECTOR type="context" content="purpose='Idempotent fixture seed for integration tests'; No verified external callers; imports: none"]
25
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
26
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
27
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
28
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
29
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
30
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:file_header:constant"]
31
+
32
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/tests/fixtures/seed.ts"]
33
+ // CIL[DOC-MACRO purpose="Load environment and initialize the Supabase client"]
34
+ // CIL[DOC-RESPONSIBILITY responsibility="Resolve env files and create the Supabase client instance"]
35
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
36
+ // CIL[DOC-CONTRACT inputs=".xenv.test or .xenv; process.env" outputs="populated process.env; imported createClient" errors="" side_effects="Reads env files; mutates process.env"]
37
+ // CIL[DOC-MICRO logic_summary="Reads .xenv files and imports the createClient dependency" notable_decisions="Uses fileURLToPath for ESM __dirname"]
38
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
39
+ // CIL[DOC-STABILITY stability="stable"]
40
+ // CIL[DOC-AUDIENCE audience="core-contributor"]
41
+ import { readFileSync, existsSync } from 'fs'
42
+ import { resolve, dirname } from 'path'
43
+ import { fileURLToPath } from 'url'
44
+
45
+ const __filename = fileURLToPath(import.meta.url)
46
+ const __dirname = dirname(__filename)
47
+
48
+ function loadEnv() {
49
+ for (const name of ['.xenv.test', '.xenv']) {
50
+ const p = resolve(__dirname, '../../', name)
51
+ if (existsSync(p)) {
52
+ const lines = readFileSync(p, 'utf8').split('\n')
53
+ for (const line of lines) {
54
+ const t = line.trim()
55
+ if (!t || t.startsWith('#')) continue
56
+ const eq = t.indexOf('=')
57
+ if (eq === -1) continue
58
+ const k = t.slice(0, eq).trim()
59
+ const v = t.slice(eq + 1).trim().replace(/^["']|["']$/g, '')
60
+ if (!process.env[k]) process.env[k] = v
61
+ }
62
+ break
63
+ }
64
+ }
65
+ }
66
+
67
+ loadEnv()
68
+
69
+ import { createClient } from '@supabase/supabase-js'
70
+ // CIL[DOC-VECTOR type="context" content="purpose='Load environment and initialize the Supabase client'; No verified external callers; imports: none"]
71
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
72
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
73
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
74
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
75
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
76
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:module_header:module_header"]
77
+
78
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:SUPABASE_URL:constant" type="constant" identity="SUPABASE_URL" parent="~/.framework/tests/fixtures/seed.ts"]
79
+ // CIL[DOC-STABILITY stability="internal"]
80
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
81
+ // CIL[DOC-CONTEXT module="seed" layer="tests" related_files=".framework/tests/fixtures/seed.ts"]
82
+ // CIL[DOC-MACRO purpose="Provide the SUPABASE_URL environment value"]
83
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the SUPABASE_URL constant"]
84
+ // CIL[DOC-CONTRACT inputs="process.env.SUPABASE_URL" outputs="SUPABASE_URL constant" errors="" side_effects="None; scope-level constant"]
85
+ // CIL[DOC-MICRO logic_summary="Reads process.env.SUPABASE_URL with non-null assertion" notable_decisions="Runtime validation happens in env_check"]
86
+ const SUPABASE_URL = process.env.SUPABASE_URL!
87
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:SUPABASE_URL:constant"]
88
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:SERVICE_KEY:constant" type="constant" identity="SERVICE_KEY" parent="~/.framework/tests/fixtures/seed.ts"]
89
+ // CIL[DOC-MACRO purpose="Provide the SERVICE_KEY environment value"]
90
+ // CIL[DOC-VECTOR type="context" content="purpose='Provide the SUPABASE_URL environment value'; No verified external callers; imports: none"]
91
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
92
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
93
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
94
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
95
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
96
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the SERVICE_KEY constant"]
97
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
98
+ // CIL[DOC-CONTRACT inputs="process.env.SERVICE_KEY" outputs="SERVICE_KEY constant" errors="" side_effects="None; scope-level constant"]
99
+ // CIL[DOC-MICRO logic_summary="Reads process.env.SERVICE_KEY with non-null assertion" notable_decisions="Runtime validation happens in env_check"]
100
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
101
+ // CIL[DOC-STABILITY stability="stable"]
102
+ const SERVICE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY!
103
+ // CIL[DOC-VECTOR type="context" content="purpose='Provide the SERVICE_KEY environment value'; No verified external callers; imports: none"]
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"]
107
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
108
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
109
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:SERVICE_KEY:constant"]
110
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:ACCOUNT_ID:constant" type="constant" identity="ACCOUNT_ID" parent="~/.framework/tests/fixtures/seed.ts"]
111
+ // CIL[DOC-MACRO purpose="Provide the ACCOUNT_ID environment value"]
112
+ // CIL[DOC-RESPONSIBILITY responsibility="Hold the ACCOUNT_ID constant"]
113
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
114
+ // CIL[DOC-CONTRACT inputs="process.env.ACCOUNT_ID" outputs="ACCOUNT_ID constant" errors="" side_effects="None; scope-level constant"]
115
+ // CIL[DOC-MICRO logic_summary="Reads process.env.ACCOUNT_ID with non-null assertion" notable_decisions="Runtime validation happens in env_check"]
116
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
117
+ // CIL[DOC-STABILITY stability="stable"]
118
+ const ACCOUNT_ID = process.env.SPINE_TEST_ACCOUNT_ID!
119
+ // CIL[DOC-VECTOR type="context" content="purpose='Provide the ACCOUNT_ID environment value'; No verified external callers; imports: none"]
120
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
121
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
122
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
123
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
124
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
125
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:ACCOUNT_ID:constant"]
126
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:env_check:variable" type="variable" identity="env_check" parent="~/.framework/tests/fixtures/seed.ts"]
127
+ // CIL[DOC-MACRO purpose="Validate required environment variables"]
128
+ // CIL[DOC-RESPONSIBILITY responsibility="Fail fast if any required variable is missing"]
129
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
130
+ // CIL[DOC-CONTRACT inputs="SUPABASE_URL, SERVICE_KEY, ACCOUNT_ID" outputs="Validated environment or process exit" errors="" side_effects="May terminate process"]
131
+ // CIL[DOC-MICRO logic_summary="Checks SUPABASE_URL, SERVICE_KEY, and ACCOUNT_ID are truthy" notable_decisions="Exits before creating the Supabase client"]
132
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
133
+ // CIL[DOC-STABILITY stability="stable"]
134
+ if (!SUPABASE_URL || !SERVICE_KEY || !ACCOUNT_ID) {
135
+ console.error('Missing SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, or SPINE_TEST_ACCOUNT_ID')
136
+ process.exit(1)
137
+ }
138
+ // CIL[DOC-VECTOR type="context" content="purpose='Validate required environment variables'; No verified external callers; imports: none"]
139
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
140
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
141
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
142
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
143
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
144
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:env_check:variable"]
145
+
146
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:db:constant" type="constant" identity="db" parent="~/.framework/tests/fixtures/seed.ts"]
147
+ // CIL[DOC-MACRO purpose="Initialize the Supabase client for the public schema"]
148
+ // CIL[DOC-RESPONSIBILITY responsibility="Create the database client used by all upsert helpers"]
149
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
150
+ // CIL[DOC-CONTRACT inputs="SUPABASE_URL, SERVICE_KEY" outputs="db client" errors="" side_effects="Creates and holds a Supabase client connection"]
151
+ // CIL[DOC-MICRO logic_summary="Constructs a Supabase client pointing at the public schema" notable_decisions="Uses service role key for admin-level seed operations"]
152
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
153
+ // CIL[DOC-STABILITY stability="stable"]
154
+ const db = createClient(SUPABASE_URL, SERVICE_KEY, { db: { schema: 'public' } })
155
+ // CIL[DOC-VECTOR type="context" content="purpose='Initialize the Supabase client for the public schema'; No verified external callers; imports: none"]
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"]
159
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
160
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
161
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:db:constant"]
162
+
163
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:upsertRole:function" type="function" identity="upsertRole" parent="~/.framework/tests/fixtures/seed.ts"]
164
+ // CIL[DOC-MACRO purpose="Upsert a role row"]
165
+ // CIL[DOC-RESPONSIBILITY responsibility="Insert or update a test role"]
166
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
167
+ // CIL[DOC-CONTRACT inputs="slug, name, permissions" outputs="role in public.roles" errors="" side_effects="Writes to public.roles"]
168
+ // CIL[DOC-MICRO logic_summary="Upserts a role with permissions and active flag by slug" notable_decisions="Uses onConflict slug for idempotency"]
169
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
170
+ // CIL[DOC-STABILITY stability="stable"]
171
+ async function upsertRole(slug: string, name: string, permissions: string[]) {
172
+ const { error } = await db.from('roles').upsert(
173
+ { slug, name, permissions, is_active: true, account_id: ACCOUNT_ID },
174
+ { onConflict: 'slug' }
175
+ )
176
+ if (error) console.warn(` [warn] role ${slug}:`, error.message)
177
+ }
178
+ // CIL[DOC-VECTOR type="context" content="purpose='Upsert a role row'; No verified external callers; imports: none"]
179
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
180
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
181
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
182
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
183
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
184
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:upsertRole:function"]
185
+
186
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:upsertType:function" type="function" identity="upsertType" parent="~/.framework/tests/fixtures/seed.ts"]
187
+ // CIL[DOC-MACRO purpose="Upsert a type row with design schema"]
188
+ // CIL[DOC-RESPONSIBILITY responsibility="Insert or update a test type"]
189
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
190
+ // CIL[DOC-CONTRACT inputs="kind, slug, name, designSchema" outputs="type in public.types" errors="" side_effects="Reads public.apps; writes to public.types"]
191
+ // CIL[DOC-MICRO logic_summary="Looks up spine-core app id and upserts a type row" notable_decisions="Defaults validation_schema to empty object; ownership pack"]
192
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
193
+ // CIL[DOC-STABILITY stability="stable"]
194
+ async function upsertType(kind: string, slug: string, name: string, designSchema: object) {
195
+ const { data: app } = await db.from('apps').select('id').eq('slug', 'spine-core').single()
196
+ const { error } = await db.from('types').upsert(
197
+ {
198
+ slug,
199
+ kind,
200
+ name,
201
+ app_id: app?.id ?? null,
202
+ design_schema: designSchema,
203
+ validation_schema: {},
204
+ is_active: true,
205
+ ownership: 'pack'
206
+ },
207
+ { onConflict: 'slug' }
208
+ )
209
+ if (error) console.warn(` [warn] type ${slug}:`, error.message)
210
+ }
211
+ // CIL[DOC-VECTOR type="context" content="purpose='Upsert a type row with design schema'; No verified external callers; imports: none"]
212
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
213
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
214
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
215
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
216
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
217
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:upsertType:function"]
218
+
219
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:upsertPerson:function" type="function" identity="upsertPerson" parent="~/.framework/tests/fixtures/seed.ts"]
220
+ // CIL[DOC-MACRO purpose="Upsert a person row"]
221
+ // CIL[DOC-RESPONSIBILITY responsibility="Insert or update a test person"]
222
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
223
+ // CIL[DOC-CONTRACT inputs="slug, fullName, email" outputs="person in public.people" errors="" side_effects="Reads public.types; writes to public.people"]
224
+ // CIL[DOC-MICRO logic_summary="Finds active person type and upserts person by email" notable_decisions="Uses onConflict email to avoid duplicates"]
225
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
226
+ // CIL[DOC-STABILITY stability="stable"]
227
+ async function upsertPerson(slug: string, fullName: string, email: string) {
228
+ const { data: type } = await db.from('types').select('id').eq('kind', 'person').eq('is_active', true).limit(1).single()
229
+ const { error } = await db.from('people').upsert(
230
+ {
231
+ slug,
232
+ full_name: fullName,
233
+ email,
234
+ status: 'active',
235
+ is_active: true,
236
+ account_id: ACCOUNT_ID,
237
+ type_id: type?.id ?? null,
238
+ data: {}
239
+ },
240
+ { onConflict: 'email' }
241
+ )
242
+ if (error) console.warn(` [warn] person ${slug}:`, error.message)
243
+ }
244
+ // CIL[DOC-VECTOR type="context" content="purpose='Upsert a person row'; No verified external callers; imports: none"]
245
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
246
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
247
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
248
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
249
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
250
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:upsertPerson:function"]
251
+
252
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:upsertItem:function" type="function" identity="upsertItem" parent="~/.framework/tests/fixtures/seed.ts"]
253
+ // CIL[DOC-MACRO purpose="Upsert an item row"]
254
+ // CIL[DOC-RESPONSIBILITY responsibility="Insert or update a test item"]
255
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
256
+ // CIL[DOC-CONTRACT inputs="slug, title, isActive" outputs="item in public.items" errors="" side_effects="Reads public.types; writes to public.items"]
257
+ // CIL[DOC-MICRO logic_summary="Finds active item type and upserts item by slug" notable_decisions="Sets status to open and item_type to item"]
258
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
259
+ // CIL[DOC-STABILITY stability="stable"]
260
+ async function upsertItem(slug: string, title: string, isActive: boolean) {
261
+ const { data: type } = await db.from('types').select('id').eq('kind', 'item').eq('is_active', true).limit(1).single()
262
+ const { error } = await db.from('items').upsert(
263
+ {
264
+ slug,
265
+ title,
266
+ status: 'open',
267
+ is_active: isActive,
268
+ account_id: ACCOUNT_ID,
269
+ type_id: type?.id ?? null,
270
+ item_type: 'item',
271
+ data: {}
272
+ },
273
+ { onConflict: 'slug' }
274
+ )
275
+ if (error) console.warn(` [warn] item ${slug}:`, error.message)
276
+ }
277
+ // CIL[DOC-VECTOR type="context" content="purpose='Upsert an item row'; No verified external callers; imports: none"]
278
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
279
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
280
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
281
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
282
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
283
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:upsertItem:function"]
284
+
285
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:seed:function" type="function" identity="seed" parent="~/.framework/tests/fixtures/seed.ts"]
286
+ // CIL[DOC-MACRO purpose="Run the full fixture seeding routine"]
287
+ // CIL[DOC-RESPONSIBILITY responsibility="Orchestrate creation of roles, types, people, items, and pipeline"]
288
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
289
+ // CIL[DOC-CONTRACT inputs="Environment variables and upsert helpers" outputs="Canonical test fixtures" errors="" side_effects="Writes multiple rows to public schema"]
290
+ // CIL[DOC-MICRO logic_summary="Seeds roles, account/person/item types, people, items, and a pipeline" notable_decisions="Uses test- prefixed slugs; defines inline design schemas"]
291
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
292
+ // CIL[DOC-STABILITY stability="stable"]
293
+ async function seed() {
294
+ console.log('🌱 Seeding test fixtures into public schema...')
295
+ console.log(' ACCOUNT_ID:', ACCOUNT_ID)
296
+
297
+ console.log(' → roles')
298
+ await upsertRole('test-admin-role', 'Test Admin', ['*'])
299
+ await upsertRole('test-member-role', 'Test Member', ['items:read', 'people:read'])
300
+ await upsertRole('test-viewer-role', 'Test Viewer', ['items:read'])
301
+
302
+ console.log(' → types')
303
+ const accountTypeSchema = {
304
+ fields: {
305
+ slug: { data_type: 'text', label: 'Slug', required: true, system: true, validation: null },
306
+ display_name: { data_type: 'text', label: 'Display Name', required: true, system: true, validation: null },
307
+ is_active: { data_type: 'boolean', label: 'Active', required: true, system: true, validation: null },
308
+ created_at: { data_type: 'datetime', label: 'Created', required: false, system: true, readonly: true, validation: null }
309
+ },
310
+ views: {
311
+ default_list: { type: 'list', display: 'table', label: 'Accounts',
312
+ fields: { display_name: { sortable: true, display_type: 'text' }, is_active: { sortable: true, display_type: 'badge' } },
313
+ default_sort: { field: 'created_at', direction: 'desc' }
314
+ },
315
+ default_detail: { type: 'detail', label: 'Account Detail',
316
+ sections: [
317
+ { title: 'Identity', fields: { slug: { display_type: 'input' }, display_name: { display_type: 'input' }, is_active: { display_type: 'checkbox' } } },
318
+ { title: 'System', fields: { created_at: { display_type: 'timestamp' } } }
319
+ ]
320
+ }
321
+ },
322
+ record_permissions: { 'system-admin': ['create', 'read', 'update', 'delete'] },
323
+ functionality: null
324
+ }
325
+
326
+ const personTypeSchema = {
327
+ fields: {
328
+ full_name: { data_type: 'text', label: 'Full Name', required: true, system: true, validation: null },
329
+ email: { data_type: 'email', label: 'Email', required: true, system: true, validation: null },
330
+ status: { data_type: 'text', label: 'Status', required: true, system: true, validation: null },
331
+ is_active: { data_type: 'boolean', label: 'Active', required: true, system: true, validation: null },
332
+ created_at: { data_type: 'datetime', label: 'Created', required: false, system: true, readonly: true, validation: null }
333
+ },
334
+ views: {
335
+ default_list: { type: 'list', display: 'table', label: 'People',
336
+ fields: { full_name: { sortable: true, display_type: 'text' }, email: { sortable: true, display_type: 'text' }, status: { sortable: true, display_type: 'badge' } },
337
+ default_sort: { field: 'created_at', direction: 'desc' }
338
+ },
339
+ default_detail: { type: 'detail', label: 'Person Detail',
340
+ sections: [
341
+ { title: 'Identity', fields: { full_name: { display_type: 'input' }, email: { display_type: 'input' }, status: { display_type: 'input' }, is_active: { display_type: 'checkbox' } } },
342
+ { title: 'System', fields: { created_at: { display_type: 'timestamp' } } }
343
+ ]
344
+ }
345
+ },
346
+ record_permissions: { 'system-admin': ['create', 'read', 'update', 'delete'] },
347
+ functionality: null
348
+ }
349
+
350
+ const itemTypeSchema = {
351
+ fields: {
352
+ title: { data_type: 'text', label: 'Title', required: true, system: true, validation: null },
353
+ description: { data_type: 'textarea', label: 'Description', required: false, system: true, validation: null },
354
+ status: { data_type: 'text', label: 'Status', required: true, system: true, validation: null },
355
+ is_active: { data_type: 'boolean', label: 'Active', required: true, system: true, validation: null },
356
+ created_at: { data_type: 'datetime', label: 'Created', required: false, system: true, readonly: true, validation: null }
357
+ },
358
+ views: {
359
+ default_list: { type: 'list', display: 'table', label: 'Items',
360
+ fields: { title: { sortable: true, display_type: 'text' }, status: { sortable: true, display_type: 'badge' }, is_active: { sortable: true, display_type: 'badge' } },
361
+ default_sort: { field: 'created_at', direction: 'desc' }
362
+ },
363
+ default_detail: { type: 'detail', label: 'Item Detail',
364
+ sections: [
365
+ { title: 'Core', fields: { title: { display_type: 'input' }, description: { display_type: 'textarea' }, status: { display_type: 'input' }, is_active: { display_type: 'checkbox' } } },
366
+ { title: 'System', fields: { created_at: { display_type: 'timestamp' } } }
367
+ ]
368
+ }
369
+ },
370
+ record_permissions: { 'system-admin': ['create', 'read', 'update', 'delete'] },
371
+ functionality: null
372
+ }
373
+
374
+ await upsertType('account', 'test-account-type', 'Test Account Type', accountTypeSchema)
375
+ await upsertType('person', 'test-person-type', 'Test Person Type', personTypeSchema)
376
+ await upsertType('item', 'test-item-type', 'Test Item Type', itemTypeSchema)
377
+
378
+ console.log(' → people')
379
+ await upsertPerson('test-admin', 'Test Admin User', 'test-admin@spine.test')
380
+ await upsertPerson('test-member', 'Test Member User', 'test-member@spine.test')
381
+ await upsertPerson('test-viewer', 'Test Viewer User', 'test-viewer@spine.test')
382
+
383
+ console.log(' → items')
384
+ await upsertItem('test-item-active', 'Test Active Item', true)
385
+ await upsertItem('test-item-inactive', 'Test Inactive Item', false)
386
+
387
+ console.log(' → pipeline')
388
+ const { error: pipelineErr } = await db.from('pipelines').upsert(
389
+ {
390
+ slug: 'test-pipeline-canary',
391
+ name: 'Test Pipeline Canary',
392
+ stages: [],
393
+ account_id: ACCOUNT_ID,
394
+ is_active: true
395
+ },
396
+ { onConflict: 'slug' }
397
+ )
398
+ if (pipelineErr) console.warn(' [warn] pipeline:', pipelineErr.message)
399
+
400
+ console.log('✅ Seed complete.')
401
+ }
402
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:seed:function"]
403
+ // CIL[BEGIN stable_id="~/.framework/tests/fixtures/seed.ts:seed_invocation:variable" type="variable" identity="seed_invocation" parent="~/.framework/tests/fixtures/seed.ts"]
404
+ // CIL[DOC-MACRO purpose="Execute the seed routine on import"]
405
+ // CIL[DOC-VECTOR type="context" content="purpose='Run the full fixture seeding routine'; No verified external callers; imports: none"]
406
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
407
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
408
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
409
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
410
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
411
+ // CIL[DOC-RESPONSIBILITY responsibility="Invoke seed and handle failures"]
412
+ // CIL[DOC-CONTEXT module="tests/fixtures/seed" layer="test-infrastructure" related_files=".framework/tests/fixtures/seed.ts"]
413
+ // CIL[DOC-CONTRACT inputs="seed()" outputs="Promise resolution or process exit" errors="" side_effects="Runs seed side effects; may terminate process"]
414
+ // CIL[DOC-MICRO logic_summary="Calls seed() and exits on unhandled rejection" notable_decisions="Top-level invocation for CLI and tsx usage"]
415
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
416
+ // CIL[DOC-STABILITY stability="stable"]
417
+ seed().catch(err => {
418
+ console.error('Seed failed:', err)
419
+ process.exit(1)
420
+ })
421
+ // CIL[DOC-VECTOR type="context" content="purpose='Execute the seed routine on import'; No verified external callers; imports: none"]
422
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
423
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
424
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
425
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
426
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
427
+ // CIL[END stable_id="~/.framework/tests/fixtures/seed.ts:seed_invocation:variable"]