spine-framework 0.3.124 → 0.3.126

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 (319) hide show
  1. package/.framework/cli/commands/agents.ts +35 -37
  2. package/.framework/cli/commands/auth.ts +35 -34
  3. package/.framework/cli/commands/create-app.ts +104 -40
  4. package/.framework/cli/commands/dev.ts +104 -69
  5. package/.framework/cli/commands/doctor.ts +179 -69
  6. package/.framework/cli/commands/generate.ts +83 -143
  7. package/.framework/cli/commands/init.ts +72 -34
  8. package/.framework/cli/commands/install-app.ts +260 -125
  9. package/.framework/cli/commands/items.ts +33 -44
  10. package/.framework/cli/commands/migrate.ts +122 -40
  11. package/.framework/cli/commands/migrations.ts +33 -40
  12. package/.framework/cli/commands/pipelines.ts +31 -39
  13. package/.framework/cli/commands/status.ts +47 -23
  14. package/.framework/cli/commands/system.ts +47 -37
  15. package/.framework/cli/commands/test.ts +112 -68
  16. package/.framework/cli/commands/validate-app.ts +215 -121
  17. package/.framework/cli/context.ts +112 -130
  18. package/.framework/cli/env-loader.ts +47 -18
  19. package/.framework/cli/index.ts +81 -42
  20. package/.framework/docs/runtime-types.md +1024 -0
  21. package/.framework/functions/_shared/agent-runner.ts +1296 -961
  22. package/.framework/functions/_shared/app-manifest.ts +82 -68
  23. package/.framework/functions/_shared/audit.ts +135 -83
  24. package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
  25. package/.framework/functions/_shared/db.ts +80 -126
  26. package/.framework/functions/_shared/hash-api-key.ts +63 -0
  27. package/.framework/functions/_shared/index.ts +224 -335
  28. package/.framework/functions/_shared/kb.ts +319 -0
  29. package/.framework/functions/_shared/llm.ts +92 -0
  30. package/.framework/functions/_shared/logging.ts +288 -0
  31. package/.framework/functions/_shared/middleware.ts +329 -365
  32. package/.framework/functions/_shared/outcomes.ts +36 -0
  33. package/.framework/functions/_shared/permissions.ts +359 -643
  34. package/.framework/functions/_shared/pipeline-runner.ts +243 -316
  35. package/.framework/functions/_shared/principal.ts +376 -468
  36. package/.framework/functions/_shared/resolve-credentials.ts +102 -0
  37. package/.framework/functions/_shared/resolve-ids.ts +188 -16
  38. package/.framework/functions/_shared/retry-deliveries.ts +104 -0
  39. package/.framework/functions/_shared/schema-utils.ts +611 -373
  40. package/.framework/functions/_shared/testing.ts +207 -137
  41. package/.framework/functions/_shared/tracing.ts +276 -0
  42. package/.framework/functions/_shared/trigger-engine.ts +159 -211
  43. package/.framework/functions/_shared/webhook-registration.ts +95 -81
  44. package/.framework/functions/_shared/webhook-registry.ts +153 -75
  45. package/.framework/functions/account-nodes.ts +31 -53
  46. package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
  47. package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
  48. package/.framework/functions/adapters/openai-outbound.ts +40 -0
  49. package/.framework/functions/admin-data.ts +685 -537
  50. package/.framework/functions/admin-funnel.ts +31 -20
  51. package/.framework/functions/admin-install-funnel.ts +47 -28
  52. package/.framework/functions/admin-signals.ts +47 -29
  53. package/.framework/functions/ai-agents.ts +122 -147
  54. package/.framework/functions/ai-interactions.ts +180 -90
  55. package/.framework/functions/api-keys.ts +250 -192
  56. package/.framework/functions/apps.ts +203 -197
  57. package/.framework/functions/auth.ts +98 -91
  58. package/.framework/functions/cil-agent-ingest.ts +773 -0
  59. package/.framework/functions/cil-agent.ts +592 -0
  60. package/.framework/functions/cil-callmap.ts +1227 -0
  61. package/.framework/functions/cil-config.ts +583 -0
  62. package/.framework/functions/cil-context.ts +445 -0
  63. package/.framework/functions/cil-doc.ts +1752 -0
  64. package/.framework/functions/cil-embeddings.ts +1202 -0
  65. package/.framework/functions/cil-graph.ts +585 -0
  66. package/.framework/functions/cil-ingest.ts +2416 -0
  67. package/.framework/functions/cil-pipeline.ts +318 -0
  68. package/.framework/functions/cil-project.ts +499 -0
  69. package/.framework/functions/cil-validate.ts +469 -0
  70. package/.framework/functions/debug-auth.ts +73 -53
  71. package/.framework/functions/deliveries.ts +117 -0
  72. package/.framework/functions/embeddings.ts +528 -516
  73. package/.framework/functions/eval-harness.ts +158 -106
  74. package/.framework/functions/integration-outbound.ts +311 -0
  75. package/.framework/functions/integration-routes.ts +240 -466
  76. package/.framework/functions/integrations.ts +132 -140
  77. package/.framework/functions/invites.ts +401 -201
  78. package/.framework/functions/item-progress.ts +113 -53
  79. package/.framework/functions/kb.ts +28 -0
  80. package/.framework/functions/logs.ts +239 -222
  81. package/.framework/functions/observability.ts +308 -259
  82. package/.framework/functions/pipeline-executions.ts +179 -235
  83. package/.framework/functions/pipelines.ts +163 -205
  84. package/.framework/functions/prompt-configs.ts +109 -156
  85. package/.framework/functions/roles.ts +97 -147
  86. package/.framework/functions/system-cron.ts +132 -218
  87. package/.framework/functions/system.ts +112 -52
  88. package/.framework/functions/tests.ts +32 -28
  89. package/.framework/functions/timers.ts +162 -210
  90. package/.framework/functions/triggers.ts +282 -346
  91. package/.framework/functions/types.ts +283 -400
  92. package/.framework/migrations/001_core_schema.sql +630 -0
  93. package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
  94. package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
  95. package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
  96. package/.framework/migrations/005_core_observability.sql +598 -0
  97. package/.framework/migrations/006_security_hardening_rls.sql +97 -0
  98. package/.framework/migrations/007_kb_article_list.sql +237 -0
  99. package/.framework/migrations/008_items_target.sql +8 -0
  100. package/.framework/migrations/009_roles_slug_unique.sql +11 -0
  101. package/.framework/public/spine.config.json +91 -0
  102. package/.framework/scripts/app-install-cli.ts +112 -98
  103. package/.framework/src/App.tsx +67 -20
  104. package/.framework/src/apps/admin/index.tsx +97 -27
  105. package/.framework/src/components/AppWrapper.tsx +50 -11
  106. package/.framework/src/components/CustomAppLoader.tsx +131 -22
  107. package/.framework/src/components/admin/AdminListPage.tsx +75 -8
  108. package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
  109. package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
  110. package/.framework/src/components/admin/PageInstructions.tsx +49 -0
  111. package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
  112. package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
  113. package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
  114. package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
  115. package/.framework/src/components/app-sidebar.tsx +50 -3
  116. package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
  117. package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
  118. package/.framework/src/components/kb/KBArticleList.tsx +557 -0
  119. package/.framework/src/components/layout/AppShell.tsx +54 -16
  120. package/.framework/src/components/layout/Header.tsx +50 -38
  121. package/.framework/src/components/layout/Layout.tsx +48 -32
  122. package/.framework/src/components/layout/Sidebar.tsx +167 -16
  123. package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
  124. package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
  125. package/.framework/src/components/runtime/DataFilters.tsx +78 -1
  126. package/.framework/src/components/runtime/DataHeader.tsx +32 -29
  127. package/.framework/src/components/runtime/DataListPage.tsx +161 -2
  128. package/.framework/src/components/runtime/DataStats.tsx +48 -1
  129. package/.framework/src/components/runtime/DataTable.tsx +153 -1
  130. package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
  131. package/.framework/src/components/runtime/index.ts +16 -9
  132. package/.framework/src/components/search-form.tsx +33 -1
  133. package/.framework/src/components/shared/AgentView.tsx +48 -51
  134. package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
  135. package/.framework/src/components/shared/InviteManager.tsx +113 -52
  136. package/.framework/src/components/shared/MemberList.tsx +182 -0
  137. package/.framework/src/components/shared/SchemaFields.tsx +96 -78
  138. package/.framework/src/components/ui/DataTable.tsx +86 -56
  139. package/.framework/src/components/ui/Form.tsx +188 -109
  140. package/.framework/src/components/ui/ItemCard.tsx +86 -58
  141. package/.framework/src/components/ui/ItemListView.tsx +88 -61
  142. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
  143. package/.framework/src/components/ui/Modal.tsx +81 -4
  144. package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
  145. package/.framework/src/components/ui/accordion.tsx +97 -5
  146. package/.framework/src/components/ui/alert-dialog.tsx +225 -13
  147. package/.framework/src/components/ui/alert.tsx +113 -6
  148. package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
  149. package/.framework/src/components/ui/avatar.tsx +129 -7
  150. package/.framework/src/components/ui/badge.tsx +65 -3
  151. package/.framework/src/components/ui/breadcrumb.tsx +145 -8
  152. package/.framework/src/components/ui/button-group.tsx +81 -4
  153. package/.framework/src/components/ui/button.tsx +49 -2
  154. package/.framework/src/components/ui/calendar.tsx +65 -3
  155. package/.framework/src/components/ui/card.tsx +145 -8
  156. package/.framework/src/components/ui/carousel.tsx +129 -7
  157. package/.framework/src/components/ui/chart.tsx +161 -10
  158. package/.framework/src/components/ui/checkbox.tsx +49 -2
  159. package/.framework/src/components/ui/collapsible.tsx +81 -5
  160. package/.framework/src/components/ui/combobox.tsx +305 -20
  161. package/.framework/src/components/ui/command.tsx +177 -11
  162. package/.framework/src/components/ui/context-menu.tsx +273 -17
  163. package/.framework/src/components/ui/dialog.tsx +209 -27
  164. package/.framework/src/components/ui/direction.tsx +64 -4
  165. package/.framework/src/components/ui/drawer.tsx +193 -12
  166. package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
  167. package/.framework/src/components/ui/empty.tsx +145 -9
  168. package/.framework/src/components/ui/field.tsx +209 -14
  169. package/.framework/src/components/ui/hover-card.tsx +81 -4
  170. package/.framework/src/components/ui/input-group.tsx +162 -10
  171. package/.framework/src/components/ui/input-otp.tsx +98 -5
  172. package/.framework/src/components/ui/input.tsx +49 -2
  173. package/.framework/src/components/ui/item.tsx +225 -13
  174. package/.framework/src/components/ui/kbd.tsx +65 -3
  175. package/.framework/src/components/ui/label.tsx +49 -2
  176. package/.framework/src/components/ui/menubar.tsx +289 -17
  177. package/.framework/src/components/ui/native-select.tsx +97 -5
  178. package/.framework/src/components/ui/navigation-menu.tsx +177 -10
  179. package/.framework/src/components/ui/pagination.tsx +161 -9
  180. package/.framework/src/components/ui/popover.tsx +145 -8
  181. package/.framework/src/components/ui/progress.tsx +49 -2
  182. package/.framework/src/components/ui/radio-group.tsx +65 -3
  183. package/.framework/src/components/ui/resizable.tsx +82 -4
  184. package/.framework/src/components/ui/scroll-area.tsx +65 -3
  185. package/.framework/src/components/ui/select.tsx +193 -11
  186. package/.framework/src/components/ui/separator.tsx +49 -2
  187. package/.framework/src/components/ui/sheet.tsx +193 -11
  188. package/.framework/src/components/ui/sidebar.tsx +481 -38
  189. package/.framework/src/components/ui/skeleton.tsx +49 -2
  190. package/.framework/src/components/ui/slider.tsx +49 -2
  191. package/.framework/src/components/ui/sonner.tsx +49 -2
  192. package/.framework/src/components/ui/spinner.tsx +49 -2
  193. package/.framework/src/components/ui/switch.tsx +49 -2
  194. package/.framework/src/components/ui/table-primitives.tsx +160 -33
  195. package/.framework/src/components/ui/table.tsx +161 -9
  196. package/.framework/src/components/ui/tabs.tsx +113 -6
  197. package/.framework/src/components/ui/textarea.tsx +49 -2
  198. package/.framework/src/components/ui/toggle-group.tsx +81 -4
  199. package/.framework/src/components/ui/toggle.tsx +65 -3
  200. package/.framework/src/components/ui/tooltip.tsx +97 -5
  201. package/.framework/src/contexts/AppContext.tsx +129 -45
  202. package/.framework/src/contexts/AuthContext.tsx +187 -144
  203. package/.framework/src/hooks/use-mobile.ts +48 -2
  204. package/.framework/src/hooks/useApi.ts +208 -159
  205. package/.framework/src/hooks/useAppPath.ts +32 -23
  206. package/.framework/src/hooks/useApps.ts +51 -20
  207. package/.framework/src/hooks/useEntityList.ts +32 -78
  208. package/.framework/src/hooks/useEntityRecord.ts +35 -96
  209. package/.framework/src/hooks/useForm.ts +32 -92
  210. package/.framework/src/hooks/useListSchema.ts +49 -78
  211. package/.framework/src/hooks/useSchemaRecord.ts +114 -105
  212. package/.framework/src/lib/api.ts +195 -116
  213. package/.framework/src/lib/supabase.ts +98 -64
  214. package/.framework/src/lib/utils.ts +287 -151
  215. package/.framework/src/main.tsx +49 -3
  216. package/.framework/src/pages/DashboardPage.tsx +52 -29
  217. package/.framework/src/pages/NotFoundPage.tsx +32 -10
  218. package/.framework/src/pages/SetupPage.tsx +32 -12
  219. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
  220. package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
  221. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
  222. package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
  223. package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
  224. package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
  225. package/.framework/src/pages/admin/AppsPage.tsx +49 -2
  226. package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
  227. package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
  228. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
  229. package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
  230. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
  231. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
  232. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
  233. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
  234. package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
  235. package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
  236. package/.framework/src/pages/admin/LogsPage.tsx +422 -75
  237. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
  238. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
  239. package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
  240. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
  241. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
  242. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
  243. package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
  244. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
  245. package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
  246. package/.framework/src/pages/admin/RolesPage.tsx +171 -18
  247. package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
  248. package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
  249. package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
  250. package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
  251. package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
  252. package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
  253. package/.framework/src/pages/admin/TimersPage.tsx +48 -20
  254. package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
  255. package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
  256. package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
  257. package/.framework/src/pages/admin/TypesPage.tsx +48 -20
  258. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
  259. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
  260. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
  261. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
  262. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
  263. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
  264. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
  265. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
  266. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
  267. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  268. package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
  269. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
  270. package/.framework/src/pages/auth/LoginPage.tsx +50 -23
  271. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
  272. package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
  273. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
  274. package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
  275. package/.framework/src/types/auth.ts +128 -71
  276. package/.framework/src/types/types.ts +373 -157
  277. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
  278. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
  279. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
  280. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
  281. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
  282. package/docs/README.md +9 -130
  283. package/netlify.toml +5 -2
  284. package/package.json +13 -25
  285. package/scripts/kb-ingest-docs.ts +203 -0
  286. package/spine.config.json +65 -4
  287. package/.framework/migrations/001_schema.sql +0 -425
  288. package/.framework/migrations/002_rls_and_functions.sql +0 -763
  289. package/.framework/migrations/004_enhancements.sql +0 -43
  290. package/.framework/migrations/005_auth_user_trigger.sql +0 -105
  291. package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
  292. package/.framework/migrations/016_invites.sql +0 -27
  293. package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
  294. package/.framework/migrations/018_apps_required_roles.sql +0 -17
  295. package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
  296. package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
  297. package/.framework/migrations/021_app_domains.sql +0 -112
  298. package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
  299. package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
  300. package/.framework/migrations/024_messages_account_id.sql +0 -9
  301. package/.framework/migrations/025_retype_threads_messages.sql +0 -240
  302. package/.framework/migrations/026_fix_rls_policies.sql +0 -47
  303. package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
  304. package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
  305. package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
  306. package/.framework/migrations/030_messages_updated_by.sql +0 -6
  307. package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
  308. package/docs/APPS.md +0 -232
  309. package/docs/ARCHITECTURE.md +0 -246
  310. package/docs/INSTALL.md +0 -155
  311. package/docs/design-schema-spec.md +0 -1837
  312. package/docs/dev-guides/01-create-an-app.md +0 -183
  313. package/docs/dev-guides/02-create-a-function.md +0 -178
  314. package/docs/dev-guides/03-create-a-component.md +0 -178
  315. package/docs/dev-guides/04-webhook-handlers.md +0 -129
  316. package/docs/dev-guides/05-testing.md +0 -168
  317. package/docs/dev-guides/README.md +0 -40
  318. package/docs/npm-packages-plan.md +0 -288
  319. package/docs/spine-core--api-reference.md +0 -822
@@ -1,168 +0,0 @@
1
- # Guide 05: Testing Custom Code
2
-
3
- ## What this guide covers
4
-
5
- How to test custom functions, components, and apps using the Spine test harness.
6
-
7
- ---
8
-
9
- ## Test commands
10
-
11
- ```bash
12
- npm run test # All tests
13
- npm run test:unit # Unit tests only (.framework/tests/unit/)
14
- npm run test:core # Core isolation test (no custom code required)
15
- npm run test:integration # Integration tests (requires running Supabase)
16
- npm run test:boundary # Architectural boundary check
17
- ```
18
-
19
- ---
20
-
21
- ## Testing a custom function
22
-
23
- Use `makeTestContext` from the core testing utilities to create a mock `CoreContext`:
24
-
25
- ```typescript
26
- // custom/tests/my-feature.test.ts
27
- import { describe, it, expect } from 'vitest'
28
- import { makeTestContext, mockPrincipal } from '@core/_shared/testing'
29
-
30
- // Import your handler's logic (not the Netlify wrapper)
31
- import { handler } from '../functions/custom_my-feature'
32
-
33
- describe('custom_my-feature', () => {
34
- it('returns items for list action', async () => {
35
- const ctx = makeTestContext({
36
- principal: mockPrincipal({ roles: ['member'] }),
37
- query: { action: 'list' },
38
- })
39
-
40
- const result = await handler({} as any, ctx)
41
- expect(result.data).toBeDefined()
42
- expect(Array.isArray(result.data)).toBe(true)
43
- })
44
-
45
- it('rejects unauthenticated requests', async () => {
46
- const ctx = makeTestContext({ principal: null })
47
-
48
- await expect(handler({} as any, ctx)).rejects.toThrow()
49
- })
50
- })
51
- ```
52
-
53
- ---
54
-
55
- ## makeTestContext options
56
-
57
- ```typescript
58
- makeTestContext({
59
- principal?: Principal | null, // defaults to a mock member principal
60
- query?: Record<string, string>, // URL query params
61
- body?: any, // parsed request body
62
- db?: SupabaseClient, // override with a real or mock DB client
63
- })
64
- ```
65
-
66
- ---
67
-
68
- ## mockPrincipal options
69
-
70
- ```typescript
71
- mockPrincipal({
72
- id?: string // UUID, defaults to a stable test UUID
73
- account_id?: string // UUID, defaults to a stable test UUID
74
- roles?: string[] // defaults to ['member']
75
- permissions?: string[]
76
- })
77
- ```
78
-
79
- ---
80
-
81
- ## Testing role-based access
82
-
83
- ```typescript
84
- it('allows support role to access restricted data', async () => {
85
- const ctx = makeTestContext({
86
- principal: mockPrincipal({ roles: ['support'] }),
87
- query: { action: 'list' },
88
- })
89
- const result = await handler({} as any, ctx)
90
- expect(result.data).toBeDefined()
91
- })
92
-
93
- it('denies member role from restricted endpoint', async () => {
94
- const ctx = makeTestContext({
95
- principal: mockPrincipal({ roles: ['member'] }),
96
- query: { action: 'admin_list' },
97
- })
98
- await expect(handler({} as any, ctx)).rejects.toThrow('required')
99
- })
100
- ```
101
-
102
- ---
103
-
104
- ## Boundary check
105
-
106
- The boundary check verifies that core never imports from custom, and that custom apps use `@core` aliases (not relative paths to `.framework/`):
107
-
108
- ```bash
109
- npm run test:boundary
110
- # or
111
- bash scripts/boundary-check.sh
112
- ```
113
-
114
- Run this before any PR. The GitHub Actions CI also runs it automatically.
115
-
116
- **What it checks:**
117
- 1. No `from 'custom/'` or `import @custom` in `.framework/`
118
- 2. No `from 'custom_'` module imports in `.framework/`
119
- 3. No relative paths to `.framework/` from `custom/` (must use `@core`)
120
- 4. No app-specific slugs hardcoded in `.framework/src/`
121
-
122
- ---
123
-
124
- ## Running core tests in isolation
125
-
126
- Core tests must pass without any custom code present:
127
-
128
- ```bash
129
- npm run test:core
130
- ```
131
-
132
- This verifies the architectural boundary holds — if core tests fail, it means core has leaked a dependency on custom code.
133
-
134
- ---
135
-
136
- ## Integration tests
137
-
138
- Integration tests require a running Supabase instance. Set your `.env` before running:
139
-
140
- ```bash
141
- # .env
142
- SUPABASE_URL=http://localhost:54321
143
- SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
144
-
145
- npm run test:integration
146
- ```
147
-
148
- ---
149
-
150
- ## File locations
151
-
152
- ```
153
- .framework/tests/
154
- unit/
155
- core-isolation.test.ts ← core tests with no custom deps
156
- permissions.test.ts
157
- pipeline-runner.test.ts
158
- integration/
159
- admin-data-accounts.test.ts
160
- isolation.test.ts
161
- ...
162
- fixtures/
163
- seed.ts ← test data seeding
164
- teardown.ts
165
-
166
- custom/tests/ ← your custom tests go here (create this dir)
167
- my-feature.test.ts
168
- ```
@@ -1,40 +0,0 @@
1
- # Spine Developer Guides
2
-
3
- Guides for building custom apps, functions, and components on Spine Core.
4
-
5
- ## Guides
6
-
7
- | Guide | What it covers |
8
- |-------|---------------|
9
- | [01-create-an-app.md](./01-create-an-app.md) | Scaffold, configure, and register a new custom app |
10
- | [02-create-a-function.md](./02-create-a-function.md) | Write a custom Netlify function using core utilities |
11
- | [03-create-a-component.md](./03-create-a-component.md) | Build a React component inside a custom app |
12
- | [04-webhook-handlers.md](./04-webhook-handlers.md) | Register a webhook handler without touching core |
13
- | [05-testing.md](./05-testing.md) | Test custom code using the core test harness |
14
-
15
- ## Architecture in One Sentence
16
-
17
- > **Core provides mechanism. Custom provides data.**
18
-
19
- Core never imports from `custom/`. Custom code imports from core using the `@core` alias.
20
-
21
- ## Key Paths
22
-
23
- | Path | Purpose |
24
- |------|---------|
25
- | `custom/apps/{slug}/` | Your app lives here |
26
- | `custom/apps/{slug}/manifest.json` | App metadata, routes, roles |
27
- | `custom/apps/{slug}/index.tsx` | React entry point |
28
- | `custom/apps/{slug}/components/` | App-specific components |
29
- | `custom/functions/` | Custom Netlify functions |
30
- | `.framework/functions/_shared/` | Core utilities (import via `@core/_shared`) |
31
-
32
- ## Quick Start
33
-
34
- ```bash
35
- # 1. Scaffold a new app (creates files + registers in DB)
36
- npm run spine-framework create-app my-app -- --name "My App" --role member
37
-
38
- # 2. Assemble and run
39
- npm run assemble && netlify dev
40
- ```
@@ -1,288 +0,0 @@
1
- # Spine npm Packages Plan
2
-
3
- **Created:** May 28, 2026
4
- **Version target:** 0.x (breaking change freedom until stable)
5
- **CLI standard:** All commands via `spine-framework` — no shorthand aliases
6
- **Status:** Planning
7
-
8
- ---
9
-
10
- ## Goal
11
-
12
- Publish Spine Core and its apps as independent npm packages that any developer or agentic IDE can install and run from scratch.
13
-
14
- ```bash
15
- npm install spine-framework
16
- spine-framework init # stand up DB schema + seed
17
- spine-framework install-app spine-framework-cortex
18
- spine-framework install-app spine-framework-portal
19
- npm run assemble && netlify dev
20
- ```
21
-
22
- ---
23
-
24
- ## Package Model
25
-
26
- ### Three packages, one dependency direction
27
-
28
- ```
29
- spine-framework ← core platform, no spine dependencies
30
- spine-framework-cortex → peerDep: spine-framework
31
- spine-framework-portal → peerDep: spine-framework
32
- ```
33
-
34
- No cross-dependency between `spine-framework-cortex` and `spine-framework-portal`. Each is wholly self-sufficient.
35
-
36
- ### What each package contains
37
-
38
- **spine-framework**
39
- - Core DB schema (`000_foundation.sql`) and seed data (`001_seed.sql`)
40
- - Core Netlify functions (auth, items, pipelines, accounts, people, webhooks, etc.)
41
- - Core frontend shell (routing, auth context, AppShell, UI primitives, hooks)
42
- - CLI (`spine-framework init`, `spine-framework create-app`, `spine-framework migrate`, etc.)
43
- - Assembly scripts
44
- - Public API surface (`_shared/index.ts`)
45
-
46
- **spine-framework-cortex**
47
- - Frontend: all Cortex pages, components, sidebar
48
- - `manifest.json` — routes, roles, nav
49
- - `seed/types.json` — type definitions Cortex needs upserted on install
50
- - No DB migrations, no owned tables
51
-
52
- **spine-framework-portal**
53
- - Frontend: all Portal pages, components, sidebar
54
- - `manifest.json` — routes, roles, nav
55
- - `seed/types.json` — type definitions Portal needs upserted on install
56
- - No DB migrations, no owned tables
57
-
58
- ### App data model principle
59
-
60
- > Apps never touch DB structure. Apps upsert type records into core's `types` table using `design_schema` to define their data shape.
61
-
62
- Cortex and Portal share the same core tables (`items`, `types`, `accounts`, `people`). They are independent — no imports between them.
63
-
64
- ---
65
-
66
- ## Phases
67
-
68
- ### Phase 1: Merge + Production Validation
69
- **Goal:** Ship current state to prod, verify nothing is broken before forking.
70
-
71
- **Checklist:**
72
- - [ ] Migrations 014 (webhook registry) and 015 (apps table simplify) applied in prod
73
- - [ ] All apps load correctly (manifest-driven routing works)
74
- - [ ] Webhook registry doesn't break existing integrations
75
- - [ ] Boundary check passes (`npm run test:boundary`)
76
- - [ ] Demo site functional
77
-
78
- **Branch:** `main`
79
- **Timeline:** Before demo (2 weeks)
80
-
81
- ---
82
-
83
- ### Phase 2: Fork for npm Work
84
- **Goal:** Protect the stable demo branch while doing structural npm work.
85
-
86
- **Actions:**
87
- - Create branch `v0-npm-packages` from `main` after Phase 1 merges
88
- - All Phases 3–6 happen on `v0-npm-packages`
89
- - `main` remains the demo-stable branch
90
- - Merge back only when end-to-end install story is verified
91
-
92
- **Branch:** `v0-npm-packages`
93
-
94
- ---
95
-
96
- ### Phase 3: Migrations Audit + Foundation SQL
97
- **Goal:** Single authoritative schema for a fresh install. The critical path item — nothing else in this plan works without it.
98
-
99
- **Decisions to make before writing SQL:**
100
- - [x] ~~Include `links` table in core?~~ **Resolved: yes.** `links` and `link_types` already exist in production with 21 rows. Goes in `000_foundation.sql`.
101
- - [ ] Which types are core seed data vs app seed data? System roles yes. Default item types — draw the line.
102
- - [ ] RLS policy audit — capture all policies explicitly (easily missed in schema dumps)
103
- - [ ] ⚠️ `account_paths`, `test_runs`, `test_results` have RLS disabled — decide on policies before including in foundation SQL
104
-
105
- **Deliverables:**
106
- - [ ] Audit document: current live DB schema vs migration files — flag all drift
107
- - [ ] `000_foundation.sql` — creates all core tables, indexes, constraints, RLS policies, functions, triggers in correct dependency order. **Confirmed tables (34 total):** `accounts`, `people`, `types`, `apps`, `roles`, `items`, `threads`, `messages`, `links`, `link_types`, `attachments`, `watchers`, `pipelines`, `pipeline_executions`, `triggers`, `trigger_executions`, `timers`, `ai_agents`, `embeddings`, `integrations`, `prompt_configs`, `api_keys`, `api_key_usage_logs`, `logs`, `actions`, `schedules`, `schedule_executions`, `account_paths`, `test_runs`, `test_results`, `item_progress`, `webhook_handlers`, `app_installations`, `embeddings`
108
- - [ ] `001_seed.sql` — inserts: system roles, core link types (`account_signals`, `account_opportunities`), bootstrap data core needs to boot. **App-owned link types (`tagged_with`, `analyzed_by`) go in app seed, not here.**
109
- - [ ] Old migrations moved to `archive/migrations/` with a `README` marking them historical
110
-
111
- **Verification:**
112
- ```bash
113
- # Must pass: blank Supabase project + run 000 + 001 = working app
114
- spine-framework init # runs 000_foundation.sql then 001_seed.sql
115
- ```
116
-
117
- ---
118
-
119
- ### Phase 4: Separate Core, Cortex, Portal
120
- **Goal:** Each is an independently packageable unit with no cross-contamination.
121
-
122
- **Core separation:**
123
- - [ ] Verify `.framework/` has zero imports from `custom/`
124
- - [ ] Verify `.framework/` has zero Cortex/Portal-specific references
125
- - [ ] Boundary check extended to catch Cortex↔Portal cross-imports
126
-
127
- **Cortex separation:**
128
- - [ ] All Cortex frontend confirmed in `custom/apps/cortex/`
129
- - [ ] Extract Cortex type definitions from live DB → `custom/apps/cortex/seed/types.json`
130
- - [ ] Extract Cortex link types (`tagged_with`, `analyzed_by`) → `custom/apps/cortex/seed/link-types.json`
131
- - [x] ~~Verify no Portal imports in Cortex~~ **Confirmed clean** (validated May 28, 2026)
132
- - [x] ~~Verify Cortex imports only from `@core` and its own files~~ **Confirmed clean**
133
-
134
- **Portal separation:**
135
- - [ ] All Portal frontend confirmed in `custom/apps/customer-portal/`
136
- - [ ] Extract Portal type definitions from live DB → `custom/apps/customer-portal/seed/types.json`
137
- - [ ] Extract any Portal-owned link types → `custom/apps/customer-portal/seed/link-types.json`
138
- - [x] ~~Verify no Cortex imports in Portal~~ **Confirmed clean** (validated May 28, 2026)
139
- - [x] ~~Verify Portal imports only from `@core` and its own files~~ **Confirmed clean**
140
-
141
- **End state directory map:**
142
- ```
143
- spine-framework/ ← becomes the spine-framework npm package
144
- .framework/
145
- functions/
146
- src/
147
- migrations/
148
- 000_foundation.sql
149
- 001_seed.sql
150
- cli/
151
-
152
- spine-framework-cortex/ ← becomes the spine-framework-cortex npm package
153
- manifest.json
154
- index.tsx
155
- components/
156
- pages/
157
- seed/
158
- types.json
159
-
160
- spine-framework-portal/ ← becomes the spine-framework-portal npm package
161
- manifest.json
162
- index.tsx
163
- components/
164
- pages/
165
- seed/
166
- types.json
167
- ```
168
-
169
- ---
170
-
171
- ### Phase 5: npm Packages
172
- **Goal:** Three publishable packages with working install flows.
173
-
174
- **spine-framework package.json additions:**
175
- ```json
176
- {
177
- "name": "spine-framework",
178
- "version": "0.1.0",
179
- "private": false,
180
- "bin": {
181
- "spine-framework": "./dist/cli/index.js"
182
- },
183
- "exports": {
184
- "./_shared": "./dist/functions/_shared/index.js",
185
- "./src/*": "./dist/src/*"
186
- }
187
- }
188
- ```
189
-
190
- **spine-framework-cortex / spine-framework-portal package.json:**
191
- ```json
192
- {
193
- "name": "spine-framework-cortex",
194
- "version": "0.1.0",
195
- "private": false,
196
- "peerDependencies": {
197
- "spine-framework": ">=0.1.0"
198
- }
199
- }
200
- ```
201
-
202
- **CLI commands to build/verify:**
203
-
204
- | Command | Description |
205
- |---------|-------------|
206
- | `spine-framework init` | Run 000 + 001 migrations against configured Supabase project |
207
- | `spine-framework migrate` | Run pending migrations |
208
- | `spine-framework install-app spine-framework-cortex` | Copy app files + upsert type seed records |
209
- | `spine-framework uninstall-app spine-framework-cortex` | Remove app record + type seed records |
210
- | `spine-framework create-app <slug>` | Scaffold a new custom app |
211
- | `spine-framework status` | Show installed apps and migration state |
212
-
213
- **Build pipeline:**
214
- - [ ] Add `tsc` build step for functions and CLI → `dist/`
215
- - [ ] Add Vite library mode build for frontend components → `dist/src/`
216
- - [ ] Generate `.d.ts` type declarations
217
- - [ ] `prepublishOnly` script runs build + boundary check + tests
218
-
219
- **Registry:** GitHub Packages (private) first. Public npm only after end-to-end install verified.
220
-
221
- ---
222
-
223
- ### Phase 6: End-to-End Install Verification
224
- **Goal:** Prove the install story works from a completely blank starting point. Must pass before any publish.
225
-
226
- **Fresh install checklist:**
227
- - [ ] Blank Supabase project (no existing schema)
228
- - [ ] `npm install spine-framework`
229
- - [ ] `spine-framework init` → DB schema created, seed data present, app boots
230
- - [ ] Admin panel functional
231
- - [ ] `spine-framework install-app spine-framework-cortex` → Cortex loads, type records seeded
232
- - [ ] `spine-framework install-app spine-framework-portal` → Portal loads, type records seeded
233
- - [ ] Both apps functional and independent
234
- - [ ] `spine-framework create-app my-test` → scaffolds correctly
235
- - [ ] `npm run assemble && netlify dev` → dev server runs cleanly
236
-
237
- **This checklist is the publish gate. All items must pass.**
238
-
239
- ---
240
-
241
- ### Phase 7: Documentation
242
- **Goal:** A developer or agentic IDE can go from zero to running in one session.
243
-
244
- **Docs needed:**
245
-
246
- | Document | Audience |
247
- |----------|---------|
248
- | Getting Started (from zero) | New developer / agentic IDE |
249
- | `spine-framework init` walkthrough | Developer |
250
- | Installing apps | Developer |
251
- | Building a custom app | Developer (dev-guides already exist) |
252
- | Core API reference | Developer (API.md exists, extend) |
253
- | Upgrade guide | Existing Spine developer |
254
- | Contributing to core | Core contributor |
255
-
256
- ---
257
-
258
- ## Decisions Log
259
-
260
- | Decision | Choice | Rationale |
261
- |----------|--------|-----------|
262
- | Version target | `0.x` | Breaking change freedom until stable |
263
- | CLI namespace | `spine-framework` only | No shorthand aliases |
264
- | App DB model | Type records only, no app-owned tables | Clean install, clean uninstall, no schema drift |
265
- | Cortex ↔ Portal | Fully independent, no cross-imports | Each is self-sufficient |
266
- | Shared type records | Both apps use same core tables | Core owns schema, apps own their type definitions |
267
- | Registry | GitHub Packages (private) → npm (public) | Validate before exposing |
268
- | Links table | **In core** — `links` + `link_types` in `000_foundation.sql` | Already live in production with 21 rows. `app_id` column on `link_types` distinguishes core vs app-owned relationship types. |
269
- | App-owned link types | Seeded by app (`seed/link-types.json`), not by core | `tagged_with`, `analyzed_by` are Cortex-owned; `account_signals`, `account_opportunities` are core-owned |
270
-
271
- ---
272
-
273
- ## Open Questions
274
-
275
- 1. **Supabase project config** — How does `spine-framework init` know which Supabase project to target? `.env` file, interactive prompt, or CLI flag?
276
- 2. **Assembly in package model** — Does `assemble.sh` read from `node_modules/spine-framework-cortex/` after install, or does `install-app` copy files into `custom/apps/`? Copy is simpler and matches current model.
277
- 3. **Frontend build** — Does `spine-framework` ship pre-built frontend components (library mode) or source that gets assembled into the host project? Source + assemble matches current model and avoids Vite/React version conflicts.
278
- 4. **RLS on `account_paths`, `test_runs`, `test_results`** — These 3 tables have RLS disabled in production. Decide on policies before writing `000_foundation.sql`. Without policies, enabling RLS will block all access.
279
-
280
- ---
281
-
282
- ## Related Documents
283
-
284
- - `docs/enterprise-framework-implementation-summary.md` — current state of enterprise framework work
285
- - `docs/dev-guides/` — developer guides for building on Spine (Phases 3–7 prerequisite)
286
- - `.framework/API.md` — public API surface
287
- - `.framework/migrations/` — current migration files (to be audited in Phase 3)
288
- - `scripts/boundary-check.sh` — architectural boundary enforcement