spine-framework 0.3.145 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5067 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,3 +1,13 @@
1
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/_shared/testing.ts"]
2
+ // CIL[DOC-AUDIENCE audience="internal, test-authors"]
3
+ // CIL[DOC-MACRO purpose="Provide shared test helpers and mock objects for Netlify function tests"]
4
+ // CIL[DOC-RESPONSIBILITY responsibility="Import adminDb and expose types and factory functions for test contexts, principals, loggers, events, and assertions"]
5
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts"]
6
+ // CIL[DOC-CONTRACT inputs="none" outputs="module-level imports and type definitions" errors="none" side_effects="none"]
7
+ // CIL[DOC-MICRO logic_summary="Imports the adminDb client and re-exports test utility types and factories" notable_decisions="Kept as a shared module for Netlify function unit tests"]
8
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
9
+ // CIL[DOC-STABILITY stable]
10
+
1
11
 
2
12
 
3
13
 
@@ -10,58 +20,47 @@
10
20
 
11
21
 
12
22
 
13
- // CIL[BEGIN chunk_id="testing_imports_1784020784" type="module_header" identity="imports" parent="none"]
14
- // CIL[DOC-MACRO purpose="Import database dependency for testing utilities"]
15
- // CIL[DOC-RESPONSIBILITY responsibility="Import adminDb from shared database module"]
16
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/db.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
17
- // CIL[DOC-CONTRACT inputs="none" outputs="adminDb" errors="none" side_effects="none"]
18
- // CIL[DOC-MICRO logic_summary="Import statement for database connection" notable_decisions="[]"]
19
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
20
- // CIL[DOC-STABILITY stability="stable"]
21
- // CIL[DOC-AUDIENCE audience="developer"]
22
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/db.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
23
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
24
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
25
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
26
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
27
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
28
23
  import { adminDb } from './db'
29
- // CIL[END chunk_id="testing_imports_1784020784"]
30
- // CIL[BEGIN chunk_id="testing_testcontext_1784020784" type="interface" identity="TestContext" parent="none"]
31
- // CIL[DOC-MACRO purpose="Define test context interface for unit tests"]
32
- // CIL[DOC-RESPONSIBILITY responsibility="Provide test environment with database, principal, logger"]
33
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
34
- // CIL[DOC-CONTRACT inputs="none" outputs="TestContext interface" errors="none" side_effects="none"]
35
- // CIL[DOC-MICRO logic_summary="Interface containing database, principal, logger, and account ID" notable_decisions="[]"]
36
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
37
- // CIL[DOC-STABILITY stability="stable"]
38
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
39
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
40
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
41
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
24
+ // CIL[DOC-VECTOR type="context" content="purpose='Provide shared test helpers and mock objects for Netlify function tests'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
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"]
42
28
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
43
29
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
30
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:module_header:module_header"]
31
+
32
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:TestContext:interface" type="interface" identity="TestContext" parent="~/.framework/functions/_shared/testing.ts"]
33
+ // CIL[DOC-AUDIENCE audience="internal"]
34
+ // CIL[DOC-MACRO purpose="Describe the shape of a test execution context"]
35
+ // CIL[DOC-RESPONSIBILITY responsibility="Type the dependencies available during a test"]
36
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
37
+ // CIL[DOC-CONTRACT inputs="none" outputs="TestContext interface" errors="none" side_effects="none"]
38
+ // CIL[DOC-MICRO logic_summary="Defines db, principal, logger, and accountId fields" notable_decisions="Uses typeof adminDb for the database property"]
39
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
40
+ // CIL[DOC-STABILITY stable]
44
41
  export interface TestContext {
45
42
  db: typeof adminDb
46
43
  principal: TestPrincipal
47
44
  logger: TestLogger
48
45
  accountId: string
49
46
  }
50
- // CIL[END chunk_id="testing_testcontext_1784020784"]
51
- // CIL[BEGIN chunk_id="testing_testprincipal_1784020784" type="interface" identity="TestPrincipal" parent="none"]
52
- // CIL[DOC-MACRO purpose="Define test principal interface for authentication testing"]
53
- // CIL[DOC-RESPONSIBILITY responsibility="Provide mock user identity and permissions structure"]
54
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
55
- // CIL[DOC-CONTRACT inputs="none" outputs="TestPrincipal interface" errors="none" side_effects="none"]
56
- // CIL[DOC-MICRO logic_summary="Interface with user ID, account, roles, permissions, email" notable_decisions="[]"]
57
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
58
- // CIL[DOC-STABILITY stability="stable"]
59
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
60
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
61
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
62
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
47
+ // CIL[DOC-VECTOR type="context" content="purpose='Describe the shape of a test execution context'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
48
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
49
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
50
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
63
51
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
64
52
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
53
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:TestContext:interface"]
54
+
55
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:TestPrincipal:interface" type="interface" identity="TestPrincipal" parent="~/.framework/functions/_shared/testing.ts"]
56
+ // CIL[DOC-AUDIENCE audience="internal"]
57
+ // CIL[DOC-MACRO purpose="Describe a mocked principal for tests"]
58
+ // CIL[DOC-RESPONSIBILITY responsibility="Type a fake user with roles and permissions"]
59
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
60
+ // CIL[DOC-CONTRACT inputs="none" outputs="TestPrincipal interface" errors="none" side_effects="none"]
61
+ // CIL[DOC-MICRO logic_summary="Defines id, account_id, roles, permissions, and optional email" notable_decisions="Defaults to member role and test email"]
62
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
63
+ // CIL[DOC-STABILITY stable]
65
64
  export interface TestPrincipal {
66
65
  id: string
67
66
  account_id: string
@@ -69,42 +68,46 @@ export interface TestPrincipal {
69
68
  permissions: Record<string, any>
70
69
  email?: string
71
70
  }
72
- // CIL[END chunk_id="testing_testprincipal_1784020784"]
73
- // CIL[BEGIN chunk_id="testing_testlogger_1784020784" type="interface" identity="TestLogger" parent="none"]
74
- // CIL[DOC-MACRO purpose="Define test logger interface for capturing log output"]
75
- // CIL[DOC-RESPONSIBILITY responsibility="Provide logging methods for test verification"]
76
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
77
- // CIL[DOC-CONTRACT inputs="none" outputs="TestLogger interface" errors="none" side_effects="none"]
78
- // CIL[DOC-MICRO logic_summary="Interface with info, warn, error, debug logging methods" notable_decisions="[]"]
79
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
80
- // CIL[DOC-STABILITY stability="stable"]
81
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
82
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
83
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
84
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
71
+ // CIL[DOC-VECTOR type="context" content="purpose='Describe a mocked principal for tests'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
72
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
73
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
74
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
85
75
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
86
76
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
77
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:TestPrincipal:interface"]
78
+
79
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:TestLogger:interface" type="interface" identity="TestLogger" parent="~/.framework/functions/_shared/testing.ts"]
80
+ // CIL[DOC-AUDIENCE audience="internal"]
81
+ // CIL[DOC-MACRO purpose="Describe a test logger interface"]
82
+ // CIL[DOC-RESPONSIBILITY responsibility="Define the logging methods used by test doubles"]
83
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
84
+ // CIL[DOC-CONTRACT inputs="none" outputs="TestLogger interface" errors="none" side_effects="none"]
85
+ // CIL[DOC-MICRO logic_summary="Declares info, warn, error, and debug methods with optional metadata" notable_decisions=""]
86
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
87
+ // CIL[DOC-STABILITY stable]
87
88
  export interface TestLogger {
88
89
  info: (msg: string, meta?: any) => void
89
90
  warn: (msg: string, meta?: any) => void
90
91
  error: (msg: string, meta?: any) => void
91
92
  debug: (msg: string, meta?: any) => void
92
93
  }
93
- // CIL[END chunk_id="testing_testlogger_1784020784"]
94
- // CIL[BEGIN chunk_id="testing_mockprincipal_1784020784" type="function" identity="mockPrincipal" parent="none"]
95
- // CIL[DOC-MACRO purpose="Create mock principal for testing authentication"]
96
- // CIL[DOC-RESPONSIBILITY responsibility="Generate default test user with optional overrides"]
97
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[]"]
98
- // CIL[DOC-CONTRACT inputs="none" outputs="TestPrincipal" errors="none" side_effects="none"]
99
- // CIL[DOC-MICRO logic_summary="Returns default test principal with spread overrides" notable_decisions="[]"]
100
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
101
- // CIL[DOC-STABILITY stability="stable"]
102
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
103
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
104
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
105
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
94
+ // CIL[DOC-VECTOR type="context" content="purpose='Describe a test logger interface'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
95
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
96
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
97
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
106
98
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
107
99
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
100
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:TestLogger:interface"]
101
+
102
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:mockPrincipal:function" type="function" identity="mockPrincipal" parent="~/.framework/functions/_shared/testing.ts"]
103
+ // CIL[DOC-AUDIENCE audience="internal"]
104
+ // CIL[DOC-MACRO purpose="Build a mock principal object"]
105
+ // CIL[DOC-RESPONSIBILITY responsibility="Return a TestPrincipal with safe defaults and optional overrides"]
106
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
107
+ // CIL[DOC-CONTRACT inputs="overrides: Partial<TestPrincipal>" outputs="TestPrincipal" errors="none" side_effects="none"]
108
+ // CIL[DOC-MICRO logic_summary="Merges default values with any provided overrides" notable_decisions="Defaults to member role and test IDs"]
109
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
110
+ // CIL[DOC-STABILITY stable]
108
111
  export function mockPrincipal(overrides: Partial<TestPrincipal> = {}): TestPrincipal {
109
112
  return {
110
113
  id: 'test-user-id',
@@ -115,21 +118,23 @@ export function mockPrincipal(overrides: Partial<TestPrincipal> = {}): TestPrinc
115
118
  ...overrides
116
119
  }
117
120
  }
118
- // CIL[END chunk_id="testing_mockprincipal_1784020784"]
119
- // CIL[BEGIN chunk_id="testing_mocklogger_1784020784" type="function" identity="mockLogger" parent="none"]
120
- // CIL[DOC-MACRO purpose="Create mock logger that captures logs for test verification"]
121
- // CIL[DOC-RESPONSIBILITY responsibility="Provide in-memory logging with retrieval capability"]
122
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[]"]
123
- // CIL[DOC-CONTRACT inputs="none" outputs="TestLogger & { getLogs: () => string[] }" errors="none" side_effects="console output"]
124
- // CIL[DOC-MICRO logic_summary="Returns logger that stores messages and provides getLogs method" notable_decisions="[]"]
125
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
126
- // CIL[DOC-STABILITY stability="stable"]
127
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
128
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
129
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
130
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
121
+ // CIL[DOC-VECTOR type="context" content="purpose='Build a mock principal object'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
122
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
123
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
124
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
131
125
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
132
126
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
127
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:mockPrincipal:function"]
128
+
129
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:mockLogger:function" type="function" identity="mockLogger" parent="~/.framework/functions/_shared/testing.ts"]
130
+ // CIL[DOC-AUDIENCE audience="internal"]
131
+ // CIL[DOC-MACRO purpose="Create a test logger that captures log messages"]
132
+ // CIL[DOC-RESPONSIBILITY responsibility="Return a TestLogger implementation with in-memory log capture"]
133
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
134
+ // CIL[DOC-CONTRACT inputs="none" outputs="TestLogger & { getLogs: () => string[] }" errors="none" side_effects="none"]
135
+ // CIL[DOC-MICRO logic_summary="Implements info/warn/error/debug methods that record strings" notable_decisions="Mirrors messages to console when meta is provided"]
136
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
137
+ // CIL[DOC-STABILITY stable]
133
138
  export function mockLogger(): TestLogger & { getLogs: () => string[] } {
134
139
  const logs: string[] = []
135
140
 
@@ -153,21 +158,23 @@ export function mockLogger(): TestLogger & { getLogs: () => string[] } {
153
158
  getLogs: () => [...logs]
154
159
  }
155
160
  }
156
- // CIL[END chunk_id="testing_mocklogger_1784020784"]
157
- // CIL[BEGIN chunk_id="testing_maketestcontext_1784020784" type="function" identity="makeTestContext" parent="none"]
158
- // CIL[DOC-MACRO purpose="Create complete test context with defaults and overrides"]
159
- // CIL[DOC-RESPONSIBILITY responsibility="Assemble test environment with database, principal, logger, account"]
160
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[]"]
161
- // CIL[DOC-CONTRACT inputs="none" outputs="TestContext" errors="none" side_effects="none"]
162
- // CIL[DOC-MICRO logic_summary="Builds context with defaults or provided options" notable_decisions="[]"]
163
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
164
- // CIL[DOC-STABILITY stability="stable"]
165
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
166
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
167
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
168
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
161
+ // CIL[DOC-VECTOR type="context" content="purpose='Create a test logger that captures log messages'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
162
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
163
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
164
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
169
165
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
170
166
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
167
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:mockLogger:function"]
168
+
169
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:makeTestContext:function" type="function" identity="makeTestContext" parent="~/.framework/functions/_shared/testing.ts"]
170
+ // CIL[DOC-AUDIENCE audience="internal"]
171
+ // CIL[DOC-MACRO purpose="Assemble a TestContext from optional components"]
172
+ // CIL[DOC-RESPONSIBILITY responsibility="Return a test context with db, principal, logger, and accountId"]
173
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
174
+ // CIL[DOC-CONTRACT inputs="options" outputs="TestContext" errors="none" side_effects="none"]
175
+ // CIL[DOC-MICRO logic_summary="Falls back to mock principal, logger, and account values" notable_decisions="Resolves accountId from options or principal.account_id with test default"]
176
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
177
+ // CIL[DOC-STABILITY stable]
171
178
  export function makeTestContext(options: {
172
179
  principal?: TestPrincipal
173
180
  accountId?: string
@@ -180,21 +187,23 @@ export function makeTestContext(options: {
180
187
  accountId: options.accountId || options.principal?.account_id || 'test-account'
181
188
  }
182
189
  }
183
- // CIL[END chunk_id="testing_maketestcontext_1784020784"]
184
- // CIL[BEGIN chunk_id="testing_mockevent_1784020784" type="function" identity="mockEvent" parent="none"]
185
- // CIL[DOC-MACRO purpose="Create mock HTTP event for API testing"]
186
- // CIL[DOC-RESPONSIBILITY responsibility="Generate default API gateway event structure"]
187
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[]"]
188
- // CIL[DOC-CONTRACT inputs="none" outputs="mock event object" errors="none" side_effects="none"]
189
- // CIL[DOC-MICRO logic_summary="Returns default HTTP event with spread overrides" notable_decisions="[]"]
190
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
191
- // CIL[DOC-STABILITY stability="stable"]
192
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
193
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
194
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
195
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
190
+ // CIL[DOC-VECTOR type="context" content="purpose='Assemble a TestContext from optional components'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
191
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
192
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
193
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
196
194
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
197
195
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
196
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:makeTestContext:function"]
197
+
198
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:mockEvent:function" type="function" identity="mockEvent" parent="~/.framework/functions/_shared/testing.ts"]
199
+ // CIL[DOC-AUDIENCE audience="internal"]
200
+ // CIL[DOC-MACRO purpose="Build a fake Netlify function event"]
201
+ // CIL[DOC-RESPONSIBILITY responsibility="Return a base Netlify event object for testing"]
202
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
203
+ // CIL[DOC-CONTRACT inputs="overrides" outputs="any" errors="none" side_effects="none"]
204
+ // CIL[DOC-MICRO logic_summary="Starts with common HTTP event fields and applies overrides" notable_decisions="Defaults to GET /api/test"]
205
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
206
+ // CIL[DOC-STABILITY stable]
198
207
  export function mockEvent(overrides: any = {}): any {
199
208
  return {
200
209
  httpMethod: 'GET',
@@ -205,21 +214,23 @@ export function mockEvent(overrides: any = {}): any {
205
214
  ...overrides
206
215
  }
207
216
  }
208
- // CIL[END chunk_id="testing_mockevent_1784020784"]
209
- // CIL[BEGIN chunk_id="testing_mocknetlifycontext_1784020784" type="function" identity="mockNetlifyContext" parent="none"]
210
- // CIL[DOC-MACRO purpose="Create mock Netlify function context for testing"]
211
- // CIL[DOC-RESPONSIBILITY responsibility="Generate Netlify runtime context mock object"]
212
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[]"]
213
- // CIL[DOC-CONTRACT inputs="none" outputs="mock Netlify context" errors="none" side_effects="none"]
214
- // CIL[DOC-MICRO logic_summary="Returns mock context with AWS Lambda properties" notable_decisions="[]"]
215
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
216
- // CIL[DOC-STABILITY stability="stable"]
217
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
218
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
219
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
220
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
217
+ // CIL[DOC-VECTOR type="context" content="purpose='Build a fake Netlify function event'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
218
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
219
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
220
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
221
221
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
222
222
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
223
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:mockEvent:function"]
224
+
225
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:mockNetlifyContext:function" type="function" identity="mockNetlifyContext" parent="~/.framework/functions/_shared/testing.ts"]
226
+ // CIL[DOC-AUDIENCE audience="internal"]
227
+ // CIL[DOC-MACRO purpose="Create a fake Netlify function context"]
228
+ // CIL[DOC-RESPONSIBILITY responsibility="Return a mock AWS Lambda context"]
229
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
230
+ // CIL[DOC-CONTRACT inputs="none" outputs="any" errors="none" side_effects="none"]
231
+ // CIL[DOC-MICRO logic_summary="Provides request ID, function name, memory limit, and timeout getter" notable_decisions="Uses fixed test identifiers"]
232
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
233
+ // CIL[DOC-STABILITY stable]
223
234
  export function mockNetlifyContext(): any {
224
235
  return {
225
236
  awsRequestId: 'test-request-id',
@@ -230,39 +241,43 @@ export function mockNetlifyContext(): any {
230
241
  getRemainingTimeInMillis: () => 30000
231
242
  }
232
243
  }
233
- // CIL[END chunk_id="testing_mocknetlifycontext_1784020784"]
234
- // CIL[BEGIN chunk_id="testing_cleanup_1784020784" type="function" identity="cleanup" parent="none"]
235
- // CIL[DOC-MACRO purpose="Clean up test environment after test execution"]
236
- // CIL[DOC-RESPONSIBILITY responsibility="Perform post-test cleanup operations"]
237
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[]"]
238
- // CIL[DOC-CONTRACT inputs="none" outputs="void" errors="none" side_effects="console output"]
239
- // CIL[DOC-MICRO logic_summary="Logs cleanup completion message" notable_decisions="[]"]
240
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
241
- // CIL[DOC-STABILITY stability="stable"]
242
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
243
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
244
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
245
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
244
+ // CIL[DOC-VECTOR type="context" content="purpose='Create a fake Netlify function context'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
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"]
246
248
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
247
249
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
250
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:mockNetlifyContext:function"]
251
+
252
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:cleanup:function" type="function" identity="cleanup" parent="~/.framework/functions/_shared/testing.ts"]
253
+ // CIL[DOC-AUDIENCE audience="internal"]
254
+ // CIL[DOC-MACRO purpose="Log completion of test cleanup"]
255
+ // CIL[DOC-RESPONSIBILITY responsibility="Output a cleanup confirmation message"]
256
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
257
+ // CIL[DOC-CONTRACT inputs="none" outputs="void" errors="none" side_effects="none"]
258
+ // CIL[DOC-MICRO logic_summary="Logs a static message to the console" notable_decisions="Minimal shared cleanup hook"]
259
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
260
+ // CIL[DOC-STABILITY stable]
248
261
  export function cleanup(): void {
249
262
  console.log('Test cleanup completed')
250
263
  }
251
- // CIL[END chunk_id="testing_cleanup_1784020784"]
252
- // CIL[BEGIN chunk_id="testing_setuptests_1784020784" type="function" identity="setupTests" parent="none"]
253
- // CIL[DOC-MACRO purpose="Export all testing utilities in single object"]
254
- // CIL[DOC-RESPONSIBILITY responsibility="Provide comprehensive testing toolkit"]
255
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[]"]
256
- // CIL[DOC-CONTRACT inputs="none" outputs="testing utilities object" errors="none" side_effects="none"]
257
- // CIL[DOC-MICRO logic_summary="Returns object containing all testing helper functions" notable_decisions="[]"]
258
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
259
- // CIL[DOC-STABILITY stability="stable"]
260
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
261
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
262
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
263
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
264
+ // CIL[DOC-VECTOR type="context" content="purpose='Log completion of test cleanup'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
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"]
264
268
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
265
269
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
270
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:cleanup:function"]
271
+
272
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:setupTests:function" type="function" identity="setupTests" parent="~/.framework/functions/_shared/testing.ts"]
273
+ // CIL[DOC-AUDIENCE audience="internal"]
274
+ // CIL[DOC-MACRO purpose="Bundle all test helpers for convenience"]
275
+ // CIL[DOC-RESPONSIBILITY responsibility="Return an object with all factory functions"]
276
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
277
+ // CIL[DOC-CONTRACT inputs="none" outputs="object containing test factories" errors="none" side_effects="none"]
278
+ // CIL[DOC-MICRO logic_summary="Exposes makeTestContext, mockPrincipal, mockLogger, mockEvent, mockNetlifyContext, and cleanup" notable_decisions="Simplifies importing helpers in tests"]
279
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
280
+ // CIL[DOC-STABILITY stable]
266
281
  export function setupTests() {
267
282
  return {
268
283
  makeTestContext,
@@ -273,21 +288,23 @@ export function setupTests() {
273
288
  cleanup
274
289
  }
275
290
  }
276
- // CIL[END chunk_id="testing_setuptests_1784020784"]
277
- // CIL[BEGIN chunk_id="testing_expectsuccessresponse_1784020784" type="function" identity="expectSuccessResponse" parent="none"]
278
- // CIL[DOC-MACRO purpose="Assert HTTP response indicates success"]
279
- // CIL[DOC-RESPONSIBILITY responsibility="Validate successful API response format"]
280
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[]"]
281
- // CIL[DOC-CONTRACT inputs="none" outputs="void" errors="assertion failures" side_effects="none"]
282
- // CIL[DOC-MICRO logic_summary="Checks status code and ensures no error in body" notable_decisions="[]"]
283
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
284
- // CIL[DOC-STABILITY stability="stable"]
285
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
286
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
287
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
288
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
291
+ // CIL[DOC-VECTOR type="context" content="purpose='Bundle all test helpers for convenience'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
292
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
293
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
294
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
289
295
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
290
296
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
297
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:setupTests:function"]
298
+
299
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:expectSuccessResponse:function" type="function" identity="expectSuccessResponse" parent="~/.framework/functions/_shared/testing.ts"]
300
+ // CIL[DOC-AUDIENCE audience="internal"]
301
+ // CIL[DOC-MACRO purpose="Assert a response indicates success"]
302
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate status code and that the body has no error field"]
303
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
304
+ // CIL[DOC-CONTRACT inputs="response, expectedStatus" outputs="void" errors="Throws on assertion failure" side_effects="none"]
305
+ // CIL[DOC-MICRO logic_summary="Checks status and parses JSON body for the absence of error" notable_decisions="Skips body checks when body is absent"]
306
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
307
+ // CIL[DOC-STABILITY stable]
291
308
  export function expectSuccessResponse(
292
309
  response: { statusCode?: number; body?: string },
293
310
  expectedStatus: number = 200
@@ -299,21 +316,23 @@ export function expectSuccessResponse(
299
316
  expect(body.error).toBeUndefined()
300
317
  }
301
318
  }
302
- // CIL[END chunk_id="testing_expectsuccessresponse_1784020784"]
303
- // CIL[BEGIN chunk_id="testing_expecterrorresponse_1784020784" type="function" identity="expectErrorResponse" parent="none"]
304
- // CIL[DOC-MACRO purpose="Assert HTTP response indicates error"]
305
- // CIL[DOC-RESPONSIBILITY responsibility="Validate error API response format"]
306
- // CIL[DOC-CONTEXT module="testing" layer="shared" related_files="[]"]
307
- // CIL[DOC-CONTRACT inputs="none" outputs="void" errors="assertion failures" side_effects="none"]
308
- // CIL[DOC-MICRO logic_summary="Checks status code and ensures error in body" notable_decisions="[]"]
309
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
310
- // CIL[DOC-STABILITY stability="stable"]
311
- // CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: none."]
312
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
313
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
314
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
319
+ // CIL[DOC-VECTOR type="context" content="purpose='Assert a response indicates success'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
320
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
321
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
322
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
315
323
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
316
324
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
325
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:expectSuccessResponse:function"]
326
+
327
+ // CIL[BEGIN stable_id="~/.framework/functions/_shared/testing.ts:expectErrorResponse:function" type="function" identity="expectErrorResponse" parent="~/.framework/functions/_shared/testing.ts"]
328
+ // CIL[DOC-AUDIENCE audience="internal"]
329
+ // CIL[DOC-MACRO purpose="Assert a response indicates an error"]
330
+ // CIL[DOC-RESPONSIBILITY responsibility="Validate status code and that the body has an error or message"]
331
+ // CIL[DOC-CONTEXT module=".framework/functions/_shared/testing" layer="shared" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/testing.ts"]
332
+ // CIL[DOC-CONTRACT inputs="response, expectedStatus" outputs="void" errors="Throws on assertion failure" side_effects="none"]
333
+ // CIL[DOC-MICRO logic_summary="Checks status and parses JSON body for the presence of error or message" notable_decisions="Accepts either error or message field as the error indicator"]
334
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
335
+ // CIL[DOC-STABILITY stable]
317
336
  export function expectErrorResponse(
318
337
  response: { statusCode?: number; body?: string },
319
338
  expectedStatus: number = 400
@@ -325,4 +344,10 @@ export function expectErrorResponse(
325
344
  expect(body.error || body.message).toBeDefined()
326
345
  }
327
346
  }
328
- // CIL[END chunk_id="testing_expecterrorresponse_1784020784"]
347
+ // CIL[DOC-VECTOR type="context" content="purpose='Assert a response indicates an error'; No verified external callers; imports: .framework/functions/_shared/db.ts"]
348
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
349
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
350
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
351
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
352
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
353
+ // CIL[END stable_id="~/.framework/functions/_shared/testing.ts:expectErrorResponse:function"]