spine-framework 0.3.144 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +20 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -0,0 +1,87 @@
1
+ {
2
+ "framework_dirs": [
3
+ ".framework/cli",
4
+ ".framework/functions",
5
+ ".framework/migrations",
6
+ ".framework/public",
7
+ ".framework/scripts",
8
+ ".framework/seeds",
9
+ ".framework/src",
10
+ ".framework/tests",
11
+ ".framework/docs",
12
+ ".framework/mcp",
13
+ ".framework/templates"
14
+ ],
15
+ "framework_files": [
16
+ ".framework/index.html",
17
+ ".framework/README.md"
18
+ ],
19
+ "config_files": [
20
+ "config/vite.config.ts",
21
+ "config/tsconfig.json",
22
+ "config/tsconfig.node.json",
23
+ "config/tsconfig.cli.json",
24
+ "config/tsconfig.functions.json",
25
+ "config/tailwind.config.cjs",
26
+ "config/postcss.config.cjs",
27
+ "config/components.json",
28
+ "vitest.config.ts",
29
+ ".env.example",
30
+ "LICENSE.md"
31
+ ],
32
+ "root_scripts": [
33
+ "scripts/assemble.sh",
34
+ "scripts/assemble-frontend.sh",
35
+ "scripts/assemble-functions.sh",
36
+ "scripts/dev-netlify.sh",
37
+ "scripts/dev-clean.sh",
38
+ "scripts/netlify-dev-wrapper.sh",
39
+ "scripts/verify-integrity.sh",
40
+ "scripts/build-manifest.sh",
41
+ "scripts/checksum-manifest.mts",
42
+ "scripts/verify-manifest.mts",
43
+ "scripts/boundary-check.sh",
44
+ "scripts/verify-install.ts"
45
+ ],
46
+ "bin": [
47
+ "bin/spine-framework.cjs",
48
+ "bin/spine-framework.js",
49
+ "bin/ws-shim.mts",
50
+ "bin/ws-shim.ts"
51
+ ],
52
+ "exclude_globs": [
53
+ "**/.env",
54
+ "**/.env.local",
55
+ "**/.env.production",
56
+ "**/.env.development",
57
+ "**/.env.test",
58
+ "**/.xenv",
59
+ "**/.xenv.*",
60
+ "**/node_modules/**",
61
+ "**/.DS_Store",
62
+ "**/dist/**",
63
+ "**/.assembled/**",
64
+ "**/*.tsbuildinfo",
65
+ ".framework/migrations/archive/**",
66
+ ".framework/functions/_quarantine/**",
67
+ ".framework/tests/integration/**",
68
+ ".framework/public/spine.config.json"
69
+ ],
70
+ "package_scripts": {
71
+ "dev": "vite --config config/vite.config.ts",
72
+ "dev:netlify": "bash scripts/dev-netlify.sh",
73
+ "dev:stop": "bash scripts/dev-clean.sh",
74
+ "predev:netlify": "npm run assemble",
75
+ "assemble": "bash scripts/assemble.sh",
76
+ "prebuild": "npm run verify && npm run assemble",
77
+ "build": "vite build --config config/vite.config.ts",
78
+ "verify": "bash scripts/verify-integrity.sh",
79
+ "manifest": "bash scripts/build-manifest.sh",
80
+ "verify:install": "tsx scripts/verify-install.ts",
81
+ "typecheck": "tsc -b config/tsconfig.json",
82
+ "typecheck:functions": "tsc --noEmit -p config/tsconfig.functions.json",
83
+ "test": "vitest run",
84
+ "upgrade": "spine-framework upgrade",
85
+ "spine-framework": "tsx .framework/cli/index.ts"
86
+ }
87
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "registration": {
3
+ "apps": {},
4
+ "default_app_by_role": {},
5
+ "allow_url_override": false
6
+ }
7
+ }
@@ -0,0 +1,381 @@
1
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:file_header:constant" type="constant" identity="file_header" parent="~/.framework/tests/api/api-surface.test.ts"]
2
+ // CIL[DOC-MACRO purpose="Top-level file documentation and environment reference for the API surface test suite."]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Provide file-level metadata, module description, and JSDoc tags for the test file."]
4
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
5
+ // CIL[DOC-CONTRACT inputs="none" outputs="file-level JSDoc metadata" errors="none" side_effects="none"]
6
+ // CIL[DOC-MICRO logic_summary="Documents test scope, auth matrix, and skip conditions." notable_decisions="[]"]
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/api/api-surface
12
+ * @audience core-contributor
13
+ * @layer test-api
14
+ * @stability stable
15
+ *
16
+ * HTTP API surface tests. Runs fetch requests against the local dev server
17
+ * (SPINE_DEV_URL, default http://localhost:8888) and validates the auth matrix,
18
+ * CRUD lifecycle, and error handling — all against the **public schema**.
19
+ *
20
+ * **Auth matrix tested:**
21
+ * - No auth token → 401
22
+ * - Valid JWT (system admin) → 200 with full records
23
+ * - Invalid token → 401 / 403
24
+ * - Machine API key (if SPINE_TEST_API_KEY set) → 200
25
+ *
26
+ * Skips when SPINE_DEV_JWT is not set (server not running or not logged in).
27
+ *
28
+ * @seeAlso tests/integration/helpers.ts
29
+ * @seeAlso functions/admin-data.ts
30
+ */
31
+ // CIL[DOC-VECTOR type="context" content="purpose='Top-level file documentation and environment reference for the API surface test suite.'; No verified external callers; imports: none"]
32
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
33
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
34
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
35
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
36
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
37
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:file_header:constant"]
38
+
39
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/tests/api/api-surface.test.ts"]
40
+ // CIL[DOC-MACRO purpose="Import vitest testing utilities and mark the module header."]
41
+ // CIL[DOC-RESPONSIBILITY responsibility="Set up the test runner imports for this module."]
42
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
43
+ // CIL[DOC-CONTRACT inputs="none" outputs="imported describe, it, expect" errors="none" side_effects="none"]
44
+ // CIL[DOC-MICRO logic_summary="Imports vitest functions used throughout the test file." notable_decisions="[]"]
45
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
46
+ // CIL[DOC-STABILITY stability="stable"]
47
+ // CIL[DOC-AUDIENCE audience="core-contributor"]
48
+ import { describe, it, expect } from 'vitest'
49
+ // CIL[DOC-VECTOR type="context" content="purpose='Import vitest testing utilities and mark the module header.'; No verified external callers; imports: none"]
50
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
51
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
52
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
53
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
54
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
55
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:module_header:module_header"]
56
+
57
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:dev_url:constant" type="constant" identity="dev_url" parent="~/.framework/tests/api/api-surface.test.ts"]
58
+ // CIL[DOC-MACRO purpose="Define the dev server base URL from environment or default."]
59
+ // CIL[DOC-RESPONSIBILITY responsibility="Read SPINE_DEV_URL env var and provide a fallback localhost URL."]
60
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
61
+ // CIL[DOC-CONTRACT inputs="process.env.SPINE_DEV_URL" outputs="DEV_URL string" errors="none" side_effects="none"]
62
+ // CIL[DOC-MICRO logic_summary="Resolves the target server URL with a localhost default." notable_decisions="[]"]
63
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
64
+ // CIL[DOC-STABILITY stability="stable"]
65
+ const DEV_URL = process.env.SPINE_DEV_URL || 'http://localhost:8888'
66
+ // CIL[DOC-VECTOR type="context" content="purpose='Define the dev server base URL from environment or default.'; No verified external callers; imports: none"]
67
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
68
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
69
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
70
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
71
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
72
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:dev_url:constant"]
73
+
74
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:dev_jwt:constant" type="constant" identity="dev_jwt" parent="~/.framework/tests/api/api-surface.test.ts"]
75
+ // CIL[DOC-MACRO purpose="Provide the JWT token for authenticated requests from environment."]
76
+ // CIL[DOC-RESPONSIBILITY responsibility="Read SPINE_DEV_JWT environment variable or default to empty string."]
77
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
78
+ // CIL[DOC-CONTRACT inputs="process.env.SPINE_DEV_JWT" outputs="DEV_JWT string" errors="none" side_effects="none"]
79
+ // CIL[DOC-MICRO logic_summary="Loads bearer token used in auth headers." notable_decisions="[]"]
80
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
81
+ // CIL[DOC-STABILITY stability="stable"]
82
+ const DEV_JWT = process.env.SPINE_DEV_JWT || ''
83
+ // CIL[DOC-VECTOR type="context" content="purpose='Provide the JWT token for authenticated requests from environment.'; No verified external callers; imports: none"]
84
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
85
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
86
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
87
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
88
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
89
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:dev_jwt:constant"]
90
+
91
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:test_api_key:constant" type="constant" identity="test_api_key" parent="~/.framework/tests/api/api-surface.test.ts"]
92
+ // CIL[DOC-MACRO purpose="Provide the machine API key for machine principal tests."]
93
+ // CIL[DOC-RESPONSIBILITY responsibility="Read SPINE_TEST_API_KEY environment variable or default to empty string."]
94
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
95
+ // CIL[DOC-CONTRACT inputs="process.env.SPINE_TEST_API_KEY" outputs="TEST_API_KEY string" errors="none" side_effects="none"]
96
+ // CIL[DOC-MICRO logic_summary="Loads optional machine API key used in API-key auth tests." notable_decisions="[]"]
97
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
98
+ // CIL[DOC-STABILITY stability="stable"]
99
+ const TEST_API_KEY = process.env.SPINE_TEST_API_KEY || ''
100
+ // CIL[DOC-VECTOR type="context" content="purpose='Provide the machine API key for machine principal tests.'; No verified external callers; imports: none"]
101
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
102
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
103
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
104
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
105
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
106
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:test_api_key:constant"]
107
+
108
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:has_server:constant" type="constant" identity="has_server" parent="~/.framework/tests/api/api-surface.test.ts"]
109
+ // CIL[DOC-MACRO purpose="Determine whether the dev server is available based on the presence of a JWT."]
110
+ // CIL[DOC-RESPONSIBILITY responsibility="Evaluate whether authenticated integration tests should run."]
111
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
112
+ // CIL[DOC-CONTRACT inputs="DEV_JWT" outputs="hasServer boolean" errors="none" side_effects="none"]
113
+ // CIL[DOC-MICRO logic_summary="Converts the JWT presence into a boolean gate for skipping tests." notable_decisions="[]"]
114
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
115
+ // CIL[DOC-STABILITY stability="stable"]
116
+ const hasServer = !!DEV_JWT
117
+ // CIL[DOC-VECTOR type="context" content="purpose='Determine whether the dev server is available based on the presence of a JWT.'; No verified external callers; imports: none"]
118
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
119
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
120
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
121
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
122
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
123
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:has_server:constant"]
124
+
125
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:api:function" type="function" identity="api" parent="~/.framework/tests/api/api-surface.test.ts"]
126
+ // CIL[DOC-MACRO purpose="Perform an HTTP request against the dev server and return status/body."]
127
+ // CIL[DOC-RESPONSIBILITY responsibility="Abstract fetch calls with JSON body parsing and error swallowing."]
128
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
129
+ // CIL[DOC-CONTRACT inputs="path: string, opts: RequestInit" outputs="{ status: number, body: any }" errors="network or parse errors are caught and returned as {status:0,body:null}" side_effects="initiates an HTTP request"]
130
+ // CIL[DOC-MICRO logic_summary="Fetches JSON from DEV_URL+path, parses body, and suppresses exceptions." notable_decisions="[]"]
131
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
132
+ // CIL[DOC-STABILITY stability="stable"]
133
+ async function api(path: string, opts: RequestInit = {}) {
134
+ try {
135
+ const res = await fetch(`${DEV_URL}${path}`, opts)
136
+ let body: any = null
137
+ try { body = await res.json() } catch {}
138
+ return { status: res.status, body }
139
+ } catch {
140
+ return { status: 0, body: null }
141
+ }
142
+ }
143
+ // CIL[DOC-VECTOR type="context" content="purpose='Perform an HTTP request against the dev server and return status/body.'; No verified external callers; imports: none"]
144
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
145
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
146
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
147
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
148
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
149
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:api:function"]
150
+
151
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_unauthenticated_requests:block" type="block" identity="describe_unauthenticated_requests" parent="~/.framework/tests/api/api-surface.test.ts"]
152
+ // CIL[DOC-MACRO purpose="Verify unauthenticated requests to protected endpoints return 401."]
153
+ // CIL[DOC-RESPONSIBILITY responsibility="Test auth gate for public API endpoints without a token."]
154
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
155
+ // CIL[DOC-CONTRACT inputs="none" outputs="vitest describe/it blocks asserting 401 status" errors="assertion failures reported by vitest" side_effects="none"]
156
+ // CIL[DOC-MICRO logic_summary="Iterates a list of endpoints and checks status equals 401." notable_decisions="[]"]
157
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
158
+ // CIL[DOC-STABILITY stability="stable"]
159
+ // ─── 1. Unauthenticated → 401 ─────────────────────────────────────────────────
160
+ describe.skipIf(!hasServer)('auth — unauthenticated requests', () => {
161
+ const endpoints = [
162
+ '/.netlify/functions/admin-data?entity=accounts&method=GET',
163
+ '/.netlify/functions/admin-data?entity=people&method=GET',
164
+ '/.netlify/functions/admin-data?entity=types&method=GET',
165
+ '/.netlify/functions/types?action=list',
166
+ ]
167
+
168
+ for (const path of endpoints) {
169
+ it(`${path} → 401 without auth`, async () => {
170
+ const { status } = await api(path)
171
+ expect(status).toBe(401)
172
+ })
173
+ }
174
+ })
175
+ // CIL[DOC-VECTOR type="context" content="purpose='Verify unauthenticated requests to protected endpoints return 401.'; No verified external callers; imports: none"]
176
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
177
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
178
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
179
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
180
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
181
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_unauthenticated_requests:block"]
182
+
183
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_system_admin_gets_full_records:block" type="block" identity="describe_system_admin_gets_full_records" parent="~/.framework/tests/api/api-surface.test.ts"]
184
+ // CIL[DOC-MACRO purpose="Verify valid JWT system admin requests return 200 with data arrays."]
185
+ // CIL[DOC-RESPONSIBILITY responsibility="Test happy path for accounts, people, types list and response envelope."]
186
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
187
+ // CIL[DOC-CONTRACT inputs="none" outputs="passing/failing test results" errors="assertion or runtime errors raised by vitest" side_effects="console.log of statuses and counts"]
188
+ // CIL[DOC-MICRO logic_summary="Uses authHeader to call protected endpoints and validates response shape." notable_decisions="[]"]
189
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
190
+ // CIL[DOC-STABILITY stability="stable"]
191
+ // ─── 2. System admin gets full records ────────────────────────────────────────
192
+ describe.skipIf(!hasServer)('auth — system admin gets full records', () => {
193
+ const authHeader = { Authorization: `Bearer ${DEV_JWT}` }
194
+
195
+ it('GET accounts → 200 with data array', async () => {
196
+ const { status, body } = await api(
197
+ '/.netlify/functions/admin-data?entity=accounts&method=GET',
198
+ { headers: authHeader }
199
+ )
200
+ console.log('[api-gap] accounts status:', status, '| count:', body?.data?.length ?? '?')
201
+ expect(status).toBe(200)
202
+ expect(body?.error).toBeNull()
203
+ expect(Array.isArray(body?.data)).toBe(true)
204
+ })
205
+
206
+ it('GET people → 200 with data array', async () => {
207
+ const { status, body } = await api(
208
+ '/.netlify/functions/admin-data?entity=people&method=GET',
209
+ { headers: authHeader }
210
+ )
211
+ console.log('[api-gap] people status:', status, '| count:', body?.data?.length ?? '?')
212
+ expect(status).toBe(200)
213
+ expect(body?.error).toBeNull()
214
+ })
215
+
216
+ it('GET types → 200 with data array', async () => {
217
+ const { status, body } = await api(
218
+ '/.netlify/functions/types?action=list',
219
+ { headers: authHeader }
220
+ )
221
+ console.log('[api-gap] types status:', status, '| count:', body?.data?.length ?? '?')
222
+ if (body?.data?.length === 0) {
223
+ console.warn('[gap] public.types empty — day-zero seeds missing from public schema')
224
+ }
225
+ expect(status).toBe(200)
226
+ })
227
+
228
+ it('response envelope shape is { data, error: null, meta }', async () => {
229
+ const { body } = await api(
230
+ '/.netlify/functions/admin-data?entity=accounts&method=GET',
231
+ { headers: authHeader }
232
+ )
233
+ expect(body).toHaveProperty('data')
234
+ expect(body?.error).toBeNull()
235
+ expect(body?.meta?.requestId).toBeTruthy()
236
+ })
237
+ })
238
+ // CIL[DOC-VECTOR type="context" content="purpose='Verify valid JWT system admin requests return 200 with data arrays.'; No verified external callers; imports: none"]
239
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
240
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
241
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
242
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
243
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
244
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_system_admin_gets_full_records:block"]
245
+
246
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_invalid_token_rejected:block" type="block" identity="describe_invalid_token_rejected" parent="~/.framework/tests/api/api-surface.test.ts"]
247
+ // CIL[DOC-MACRO purpose="Verify malformed bearer token is rejected with 401."]
248
+ // CIL[DOC-RESPONSIBILITY responsibility="Negative auth test for an invalid JWT."]
249
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
250
+ // CIL[DOC-CONTRACT inputs="none" outputs="test assertions" errors="vitest failures" side_effects="none"]
251
+ // CIL[DOC-MICRO logic_summary="Calls admin-data with a fake bearer token and expects 401." notable_decisions="[]"]
252
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
253
+ // CIL[DOC-STABILITY stability="stable"]
254
+ // ─── 3. Invalid token → 401 ───────────────────────────────────────────────────
255
+ describe.skipIf(!hasServer)('auth — invalid token rejected', () => {
256
+ it('malformed bearer token → 401', async () => {
257
+ const { status } = await api(
258
+ '/.netlify/functions/admin-data?entity=accounts&method=GET',
259
+ { headers: { Authorization: 'Bearer not-a-real-jwt' } }
260
+ )
261
+ expect(status).toBe(401)
262
+ })
263
+ })
264
+ // CIL[DOC-VECTOR type="context" content="purpose='Verify malformed bearer token is rejected with 401.'; No verified external callers; imports: none"]
265
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
266
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
267
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
268
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
269
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
270
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_invalid_token_rejected:block"]
271
+
272
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_crud_lifecycle_items_via_admin_data:block" type="block" identity="describe_crud_lifecycle_items_via_admin_data" parent="~/.framework/tests/api/api-surface.test.ts"]
273
+ // CIL[DOC-MACRO purpose="Exercise CRUD and query operations on items via admin-data endpoint."]
274
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate GET items, unknown entity handling, and limit parameter."]
275
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
276
+ // CIL[DOC-CONTRACT inputs="none" outputs="test results" errors="assertion or runtime failures" side_effects="console.log and console.warn of data gaps"]
277
+ // CIL[DOC-MICRO logic_summary="Fetches items, checks unknown entity returns error, and verifies limit=1." notable_decisions="[]"]
278
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
279
+ // CIL[DOC-STABILITY stability="stable"]
280
+ // ─── 4. CRUD lifecycle on items ───────────────────────────────────────────────
281
+ describe.skipIf(!hasServer)('CRUD lifecycle — items via admin-data', () => {
282
+ const authHeader = { Authorization: `Bearer ${DEV_JWT}` }
283
+ let createdId: string | null = null
284
+
285
+ it('GET items returns 200', async () => {
286
+ const { status, body } = await api(
287
+ '/.netlify/functions/admin-data?entity=items&method=GET',
288
+ { headers: authHeader }
289
+ )
290
+ console.log('[api-gap] items status:', status, '| count:', body?.data?.length ?? '?')
291
+ expect(status).toBe(200)
292
+ if (!body?.data?.length) {
293
+ console.warn('[gap] public.items is empty')
294
+ }
295
+ })
296
+
297
+ it('unknown entity returns error not crash', async () => {
298
+ const { status, body } = await api(
299
+ '/.netlify/functions/admin-data?entity=passwords&method=GET',
300
+ { headers: authHeader }
301
+ )
302
+ expect([400, 422, 500]).toContain(status)
303
+ expect(body?.error).toBeTruthy()
304
+ })
305
+
306
+ it('?limit=1 is honoured', async () => {
307
+ const { body } = await api(
308
+ '/.netlify/functions/admin-data?entity=items&method=GET&limit=1',
309
+ { headers: authHeader }
310
+ )
311
+ const records: any[] = body?.data ?? []
312
+ expect(records.length).toBeLessThanOrEqual(1)
313
+ })
314
+ })
315
+ // CIL[DOC-VECTOR type="context" content="purpose='Exercise CRUD and query operations on items via admin-data endpoint.'; No verified external callers; imports: none"]
316
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
317
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
318
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
319
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
320
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
321
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_crud_lifecycle_items_via_admin_data:block"]
322
+
323
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_machine_principal_api_key:block" type="block" identity="describe_machine_principal_api_key" parent="~/.framework/tests/api/api-surface.test.ts"]
324
+ // CIL[DOC-MACRO purpose="Verify machine principal API key authentication succeeds on types list."]
325
+ // CIL[DOC-RESPONSIBILITY responsibility="Test x-api-key header acceptance."]
326
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
327
+ // CIL[DOC-CONTRACT inputs="none" outputs="test results" errors="vitest failures" side_effects="none"]
328
+ // CIL[DOC-MICRO logic_summary="Calls types list with x-api-key header and expects 200 with no error." notable_decisions="[]"]
329
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
330
+ // CIL[DOC-STABILITY stability="stable"]
331
+ // ─── 5. Machine principal (API key) ───────────────────────────────────────────
332
+ describe.skipIf(!hasServer || !TEST_API_KEY)('auth — machine principal (API key)', () => {
333
+ it('valid API key → 200 on types list', async () => {
334
+ const { status, body } = await api(
335
+ '/.netlify/functions/types?action=list',
336
+ { headers: { 'x-api-key': TEST_API_KEY } }
337
+ )
338
+ expect(status).toBe(200)
339
+ expect(body?.error).toBeNull()
340
+ })
341
+ })
342
+ // CIL[DOC-VECTOR type="context" content="purpose='Verify machine principal API key authentication succeeds on types list.'; No verified external callers; imports: none"]
343
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
344
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
345
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
346
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
347
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
348
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_machine_principal_api_key:block"]
349
+
350
+ // CIL[BEGIN stable_id="~/.framework/tests/api/api-surface.test.ts:describe_validation_required_field_checks:block" type="block" identity="describe_validation_required_field_checks" parent="~/.framework/tests/api/api-surface.test.ts"]
351
+ // CIL[DOC-MACRO purpose="Verify missing required fields return 400/422 rather than crashing."]
352
+ // CIL[DOC-RESPONSIBILITY responsibility="Negative validation test for POST with empty data."]
353
+ // CIL[DOC-CONTEXT module="tests/api/api-surface" layer="test-api" related_files=".framework/tests/api/api-surface.test.ts"]
354
+ // CIL[DOC-CONTRACT inputs="none" outputs="test results" errors="vitest failures" side_effects="none"]
355
+ // CIL[DOC-MICRO logic_summary="POSTs empty data to items and expects 400/422 with a truthy error." notable_decisions="[]"]
356
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
357
+ // CIL[DOC-STABILITY stability="stable"]
358
+ // ─── 6. Validation errors ─────────────────────────────────────────────────────
359
+ describe.skipIf(!hasServer)('validation — required field checks', () => {
360
+ const authHeader = { Authorization: `Bearer ${DEV_JWT}` }
361
+
362
+ it('missing required field returns 400 not 500', async () => {
363
+ const { status, body } = await api(
364
+ '/.netlify/functions/admin-data?entity=items&method=POST',
365
+ {
366
+ method: 'POST',
367
+ headers: { ...authHeader, 'Content-Type': 'application/json' },
368
+ body: JSON.stringify({ data: {} })
369
+ }
370
+ )
371
+ expect([400, 422]).toContain(status)
372
+ expect(body?.error).toBeTruthy()
373
+ })
374
+ })
375
+ // CIL[DOC-VECTOR type="context" content="purpose='Verify missing required fields return 400/422 rather than crashing.'; No verified external callers; imports: none"]
376
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
377
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
378
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
379
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
380
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
381
+ // CIL[END stable_id="~/.framework/tests/api/api-surface.test.ts:describe_validation_required_field_checks:block"]