spine-framework 0.4.4 → 0.5.0-rc.4

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 (283) hide show
  1. package/.env.example +13 -3
  2. package/.framework/cli/commands/bootstrap.ts +392 -0
  3. package/.framework/cli/commands/dev.ts +91 -218
  4. package/.framework/cli/commands/doctor.ts +132 -26
  5. package/.framework/cli/commands/generate.ts +38 -298
  6. package/.framework/cli/commands/init.ts +20 -1
  7. package/.framework/cli/commands/migrate.ts +36 -30
  8. package/.framework/cli/commands/migrations.ts +16 -56
  9. package/.framework/cli/commands/upgrade.ts +35 -0
  10. package/.framework/cli/commands/validate-schema.ts +147 -0
  11. package/.framework/cli/context.ts +223 -110
  12. package/.framework/cli/index.ts +6 -0
  13. package/.framework/cli/lib/project-files.ts +241 -1
  14. package/.framework/functions/_shared/hash-api-key.ts +183 -79
  15. package/.framework/functions/_shared/logging.ts +562 -224
  16. package/.framework/functions/_shared/middleware.ts +47 -44
  17. package/.framework/functions/admin-data.ts +39 -28
  18. package/.framework/functions/ai-agents.ts +10 -6
  19. package/.framework/functions/api-keys.ts +301 -122
  20. package/.framework/functions/apps.ts +43 -26
  21. package/.framework/functions/cil-ingest.ts +48 -15
  22. package/.framework/functions/debug-auth.ts +14 -8
  23. package/.framework/functions/deliveries.ts +39 -12
  24. package/.framework/functions/embeddings.ts +145 -76
  25. package/.framework/functions/integration-outbound.ts +67 -27
  26. package/.framework/functions/integrations.ts +254 -127
  27. package/.framework/functions/logs.ts +273 -133
  28. package/.framework/functions/observability.ts +277 -147
  29. package/.framework/functions/pipeline-executions.ts +1 -1
  30. package/.framework/functions/pipelines.ts +14 -9
  31. package/.framework/functions/prompt-configs.ts +7 -4
  32. package/.framework/functions/roles.ts +8 -5
  33. package/.framework/functions/security.ts +30 -17
  34. package/.framework/functions/system-cron.ts +240 -127
  35. package/.framework/functions/tests.ts +7 -6
  36. package/.framework/functions/timers.ts +310 -107
  37. package/.framework/functions/triggers.ts +28 -13
  38. package/.framework/functions/types.ts +13 -10
  39. package/.framework/migrations/069_log_stats_window.sql +54 -0
  40. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  41. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  42. package/.framework/migrations/072_slug_autofill.sql +77 -0
  43. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  44. package/.framework/src/apps/admin/index.tsx +1141 -775
  45. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  46. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  47. package/.framework/src/components/admin/AdminSidebar.tsx +88 -79
  48. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  49. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  50. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  51. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  52. package/.framework/src/components/layout/Sidebar.tsx +300 -177
  53. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  54. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  55. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  56. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  57. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  58. package/.framework/src/components/ui/sheet.tsx +24 -26
  59. package/.framework/src/components/ui/textarea.tsx +74 -48
  60. package/.framework/src/hooks/useEntityList.ts +12 -9
  61. package/.framework/src/hooks/useListSchema.ts +108 -58
  62. package/.framework/src/instructions/README.md +57 -0
  63. package/.framework/src/instructions/ai-agents.md +69 -0
  64. package/.framework/src/instructions/alerts.md +80 -0
  65. package/.framework/src/instructions/api-keys.md +87 -0
  66. package/.framework/src/instructions/apps.md +77 -0
  67. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  68. package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
  69. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  70. package/.framework/src/instructions/concepts/automation.md +186 -0
  71. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  72. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  73. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  74. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  75. package/.framework/src/instructions/concepts/observability.md +116 -0
  76. package/.framework/src/instructions/concepts/permissions.md +150 -0
  77. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  78. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  79. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  80. package/.framework/src/instructions/deliveries.md +59 -0
  81. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  82. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  83. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  84. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  85. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  86. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  87. package/.framework/src/instructions/integrations.md +96 -0
  88. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  89. package/.framework/src/instructions/invites.md +60 -0
  90. package/.framework/src/instructions/kb.md +80 -0
  91. package/.framework/src/instructions/logs.md +77 -0
  92. package/.framework/src/instructions/observability.md +61 -0
  93. package/.framework/src/instructions/operations/deployment.md +115 -0
  94. package/.framework/src/instructions/operations/migrations.md +125 -0
  95. package/.framework/src/instructions/operations/security-checklist.md +148 -0
  96. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  97. package/.framework/src/instructions/operations/upgrade.md +116 -0
  98. package/.framework/src/instructions/pipeline-executions.md +62 -0
  99. package/.framework/src/instructions/pipelines.md +78 -0
  100. package/.framework/src/instructions/prompts.md +95 -0
  101. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  102. package/.framework/src/instructions/reference/api/auth.md +113 -0
  103. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  104. package/.framework/src/instructions/reference/app-manifest.md +150 -0
  105. package/.framework/src/instructions/reference/cli.md +124 -0
  106. package/.framework/src/instructions/reference/database.md +132 -0
  107. package/.framework/src/instructions/reference/design-schema.md +280 -0
  108. package/.framework/src/instructions/reference/env-vars.md +133 -0
  109. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  110. package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
  111. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  112. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  113. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  114. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  115. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  116. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  117. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  118. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  119. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  120. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  121. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  122. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  123. package/.framework/src/instructions/reference/functions/index.md +103 -0
  124. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  125. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  126. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  127. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  128. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  129. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  130. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  131. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  132. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  133. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  134. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  135. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  136. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  137. package/.framework/src/instructions/reference/functions/security.md +140 -0
  138. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  139. package/.framework/src/instructions/reference/functions/system.md +106 -0
  140. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  141. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  142. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  143. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  144. package/.framework/src/instructions/reference/functions/types.md +146 -0
  145. package/.framework/src/instructions/reference/seeds.md +126 -0
  146. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  147. package/.framework/src/instructions/reference/spine-config.md +114 -0
  148. package/.framework/src/instructions/roles.md +80 -0
  149. package/.framework/src/instructions/runtime-detail.md +70 -0
  150. package/.framework/src/instructions/runtime-list.md +77 -0
  151. package/.framework/src/instructions/security.md +67 -0
  152. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  153. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  154. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  155. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  156. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  157. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  158. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  159. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  160. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  161. package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
  162. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  163. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  164. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  165. package/.framework/src/instructions/testing.md +59 -0
  166. package/.framework/src/instructions/timers.md +82 -0
  167. package/.framework/src/instructions/triggers.md +69 -0
  168. package/.framework/src/instructions/types.md +93 -0
  169. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  170. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  171. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  172. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  173. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  174. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  175. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  176. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  177. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  178. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  179. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  180. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  181. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  182. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  183. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  184. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  185. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  186. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  187. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  188. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  189. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  190. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  191. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  192. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  193. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  194. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  195. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  196. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  197. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  198. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  199. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  200. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  201. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  202. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  203. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  204. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  205. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  206. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  207. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  208. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  209. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  210. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  211. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  212. package/.framework/templates/agent/AGENTS.md +150 -0
  213. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  214. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  215. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  216. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  217. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
  218. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  219. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
  220. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
  221. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
  222. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  223. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  224. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  225. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  226. package/.framework/templates/project.json +4 -1
  227. package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
  228. package/.framework/tests/unit/agent-files.test.ts +355 -0
  229. package/.framework/tests/unit/agent-runner.test.ts +479 -44
  230. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  231. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  232. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  233. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  234. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  235. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  236. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  237. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  238. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  239. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  240. package/.framework/tests/unit/system-cron.test.ts +240 -0
  241. package/.framework/tests/unit/timers.test.ts +159 -0
  242. package/README.md +125 -166
  243. package/config/tsconfig.cli.json +2 -2
  244. package/package.json +15 -4
  245. package/templates/project/package-lock.json +2 -2
  246. package/.framework/docs/admin-routes.md +0 -76
  247. package/.framework/docs/api-docs-progress.md +0 -38
  248. package/.framework/docs/api-governance.md +0 -146
  249. package/.framework/docs/api-testing-results.md +0 -212
  250. package/.framework/docs/assembly-launch-guide.md +0 -138
  251. package/.framework/docs/audit-results.md +0 -590
  252. package/.framework/docs/db-api-inventory.md +0 -95
  253. package/.framework/docs/gap-remediation-backlog.md +0 -103
  254. package/.framework/docs/ui-adoption-verification.md +0 -111
  255. package/.framework/docs/ui-api-coverage.md +0 -84
  256. package/.framework/docs/v2-compatibility-audit.md +0 -228
  257. package/.framework/mcp/index.ts +0 -133
  258. package/.framework/mcp/load-env.ts +0 -60
  259. package/.framework/mcp/shared/app-manifest.ts +0 -275
  260. package/.framework/mcp/shared/db.ts +0 -477
  261. package/.framework/mcp/shared/kb.ts +0 -118
  262. package/.framework/mcp/tools/architect.ts +0 -431
  263. package/.framework/mcp/tools/cil/context.ts +0 -345
  264. package/.framework/mcp/tools/cil/graph.ts +0 -242
  265. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  266. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  267. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  268. package/.framework/mcp/tools/cil/project.ts +0 -791
  269. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  270. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  271. package/.framework/mcp/tools/cil/search.ts +0 -97
  272. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  273. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  274. package/.framework/mcp/tools/kb/delete.ts +0 -139
  275. package/.framework/mcp/tools/kb/index.ts +0 -52
  276. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  277. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  278. package/.framework/mcp/tools/kb/publish.ts +0 -100
  279. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  280. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  281. package/.framework/mcp/tools/kb/search.ts +0 -101
  282. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  283. package/.framework/mcp/tools/observability.ts +0 -510
@@ -1,146 +0,0 @@
1
- # Spine v2 API Governance Checklist
2
-
3
- ## Universal API Ground Rules
4
-
5
- ### Response Format Standards
6
- - **Success - List**: `{ data: [...], pagination?: { page, totalPages, totalItems, itemsPerPage } }`
7
- - **Success - Single/Create/Update**: `{ data: {...} }`
8
- - **Error**: `{ error: "Human readable message", code?: "ERROR_CODE" }`
9
- - **Validation Error**: `{ errors: { field: "field-specific error" } }`
10
-
11
- ### Authentication & Context
12
- - All APIs require valid session token (`Authorization: Bearer`)
13
- - Account context via `X-Account-Id` header
14
- - System admin can bypass account scoping
15
- - Use `requireAuth` middleware for mutations
16
- - Use `requireTenant` for account-scoped reads
17
-
18
- ### HTTP Patterns
19
- - **GET /resource** - List (with query parameters)
20
- - **GET /resource?id=uuid** - Single
21
- - **POST /resource** - Create
22
- - **PATCH /resource?id=uuid** - Update
23
- - **DELETE /resource?id=uuid** - Soft delete
24
-
25
- ### Query Parameter Standards
26
- - `page`, `itemsPerPage` - Pagination
27
- - `search` - Text search
28
- - `sort`, `direction` - Sorting
29
- - `field=value` - Filtering
30
- - `include=relation1,relation2` - Related data
31
-
32
- ### Data Constraints
33
- - APIs return data only, never styling/UI components
34
- - All endpoints enforce role-based permissions
35
- - DELETE = soft delete (`is_active=false`), never hard deletes
36
- - All mutations must emit audit logs via `emitLog`
37
-
38
- ## Permission Model
39
-
40
- ### Single Source of Truth
41
- - type.schema defines what roles can do
42
- - v2.people_accounts + v2.people_roles define who has roles
43
- - No parallel permission systems
44
-
45
- ### Enforcement Points
46
- - All first-surface APIs use shared permission resolver
47
- - Field filtering on reads
48
- - Field validation on writes
49
- - Multi-role merge: highest effective permission wins
50
-
51
- ### System Admin Override
52
- - Complete bypass of runtime restrictions
53
- - Audit logs preserved
54
- - Intended for admin operations only
55
-
56
- ### Error Handling
57
- - Use consistent error format with descriptive messages
58
- - Include error codes for programmatic handling
59
- - Log errors appropriately with context
60
- - Return 4xx for client errors, 5xx for server errors
61
-
62
- ### Pagination
63
- - Default `page=1`, `itemsPerPage=20`
64
- - Return total count for client-side calculations
65
- - Support `search` and filtering in pagination queries
66
- - Use `range()` for efficient DB queries
67
-
68
- ### Soft Delete Semantics
69
- - Never use `DELETE FROM` statements
70
- - Always set `is_active=false` with `updated_at`
71
- - Filter active records with `is_active=true` by default
72
- - Preserve audit trail before soft delete
73
-
74
- ### Database Constraints
75
- - Use `public` schema only
76
- - All queries must use `db.from('public.table')`
77
- - Validate field names against actual schema
78
- - Use parameterized queries to prevent injection
79
-
80
- ### Role Boundaries
81
- - **Config endpoints** (`admin/configs/*`): admin-only mutations
82
- - **Data endpoints** (`admin/data/*`): permissions by role/type schema
83
- - **Runtime endpoints**: account-scoped with appropriate role checks
84
- - **Internal endpoints**: system-only or service-to-service
85
-
86
- ## Code Patterns
87
-
88
- ### Handler Structure
89
- ```typescript
90
- export const handler = createHandler(async (ctx, body) => {
91
- const method = ctx.query?.method || 'GET'
92
- switch (method) {
93
- case 'GET': return await list(ctx, body)
94
- case 'POST': return await create(ctx, body)
95
- case 'PATCH': return await update(ctx, body)
96
- case 'DELETE': return await remove(ctx, body)
97
- default: throw new Error(`Unsupported method: ${method}`)
98
- }
99
- })
100
- ```
101
-
102
- ### Auth Patterns
103
- ```typescript
104
- // Public reads
105
- export const list = createHandler(async (ctx, body) => {
106
- // Account-scoped by default
107
- })
108
-
109
- // Authenticated mutations
110
- export const create = requireAuth(createHandler(async (ctx, body) => {
111
- // Requires valid session
112
- }))
113
- ```
114
-
115
- ### Audit Logging
116
- ```typescript
117
- await emitLog(ctx, 'entity.created',
118
- { type: 'entity', id: data.id },
119
- { after: data }
120
- )
121
- ```
122
-
123
- ## Documentation Requirements
124
-
125
- Each endpoint must include JSDoc comments with:
126
- - Purpose and domain (data/config/runtime/internal)
127
- - Auth requirements
128
- - Account scoping rules
129
- - Request parameters/body contract
130
- - Response shape
131
- - Soft delete behavior
132
- - v2 table/RPC dependencies
133
-
134
- ## Review Checklist
135
-
136
- - [ ] Response format matches standard
137
- - [ ] Auth middleware applied appropriately
138
- - [ ] Account context handled correctly
139
- - [ ] Soft delete implemented (no hard deletes)
140
- - [ ] Audit logs emitted for mutations
141
- - [ ] Error handling consistent
142
- - [ ] Pagination implemented for lists
143
- - [ ] Query parameters validated
144
- - [ ] v2 schema only (no public references)
145
- - [ ] Role boundaries enforced
146
- - [ ] Inline documentation complete
@@ -1,212 +0,0 @@
1
- # API Testing Results
2
-
3
- ## Test Methodology
4
- - **Server**: Local Netlify dev server (http://localhost:8888)
5
- - **Date**: April 7, 2026
6
- - **Test Pattern**: List, Create, Get Single, Update, Delete for each endpoint
7
- - **Authentication**: Tested with and without auth headers
8
- - **Account Context**: Tested with X-Account-Id header
9
-
10
- ## Data Management APIs (admin/data/*)
11
-
12
- ### accounts.ts
13
- - **GET List**: SUCCESS - Returns 3 accounts with type info
14
- - **POST Create**: SUCCESS - Creates account (no auth required)
15
- - **GET Single**: SUCCESS - Returns account with type info
16
- - **PATCH Update**: SUCCESS - Updates account
17
- - **DELETE Soft Delete**: SUCCESS - Sets is_active=false
18
- - **Status**: FULLY FUNCTIONAL
19
-
20
- ### people.ts
21
- - **GET List**: SUCCESS - Returns 1 person with type info
22
- - **POST Create**: SUCCESS - Creates person with X-Account-Id header
23
- - **GET Single**: SUCCESS - Returns person with type info
24
- - **PATCH Update**: SUCCESS - Updates person
25
- - **DELETE Soft Delete**: SUCCESS - Sets is_active=false
26
- - **Status**: FULLY FUNCTIONAL (requires account context)
27
-
28
- ### items.ts
29
- - **GET List**: FAIL - "Account context required" without X-Account-Id
30
- - **POST Create**: SUCCESS - Creates item with X-Account-Id header
31
- - **GET Single**: SUCCESS - Returns item with type info
32
- - **PATCH Update**: SUCCESS - Updates item
33
- - **DELETE Soft Delete**: SUCCESS - Sets is_active=false
34
- - **Status**: FUNCTIONAL (requires account context)
35
-
36
- ## Configuration APIs (admin/configs/*)
37
-
38
- ### types.ts
39
- - **GET List**: SUCCESS - Returns 6 system types (account, item, person)
40
- - **POST Create**: FAIL - "Invalid token specified" without proper auth
41
- - **GET Single**: SUCCESS - Returns type with schema
42
- - **PATCH Update**: FAIL - Requires admin auth
43
- - **DELETE Soft Delete**: FAIL - Requires admin auth
44
- - **Status**: READ-ONLY without auth, mutations need admin auth
45
-
46
- ### apps.ts
47
- - **GET List**: FAIL - "Account context required" without X-Account-Id
48
- - **POST Create**: FAIL - Requires admin auth
49
- - **GET Single**: SUCCESS - Returns app with nav items
50
- - **PATCH Update**: FAIL - Requires admin auth
51
- - **DELETE Soft Delete**: FAIL - Requires admin auth
52
- - **Status**: READ-ONLY without account context, mutations need admin auth
53
-
54
- ### pipelines.ts
55
- - **GET List**: FAIL - "Account context required" without X-Account-Id
56
- - **POST Create**: FAIL - Requires admin auth
57
- - **GET Single**: SUCCESS - Returns pipeline with definition
58
- - **PATCH Update**: FAIL - Requires admin auth
59
- - **DELETE Soft Delete**: FAIL - Requires admin auth
60
- - **Status**: READ-ONLY without account context, mutations need admin auth
61
-
62
- ### triggers.ts
63
- - **GET List**: FAIL - "Account context required" without X-Account-Id
64
- - **POST Create**: FAIL - Requires admin auth
65
- - **GET Single**: SUCCESS - Returns trigger with config
66
- - **PATCH Update**: FAIL - Requires admin auth
67
- - **DELETE Soft Delete**: FAIL - Requires admin auth
68
- - **Status**: READ-ONLY without account context, mutations need admin auth
69
-
70
- ### ai-agents.ts
71
- - **GET List**: FAIL - "Account context required" without X-Account-Id
72
- - **POST Create**: FAIL - Requires admin auth
73
- - **GET Single**: SUCCESS - Returns AI agent with config
74
- - **PATCH Update**: FAIL - Requires admin auth
75
- - **DELETE Soft Delete**: FAIL - Requires admin auth
76
- - **Status**: READ-ONLY without account context, mutations need admin auth
77
-
78
- ### embeddings.ts
79
- - **GET List**: FAIL - "Account context required" without X-Account-Id
80
- - **POST Create**: FAIL - Requires admin auth
81
- - **GET Single**: SUCCESS - Returns embedding with model info
82
- - **PATCH Update**: FAIL - Requires admin auth
83
- - **DELETE Soft Delete**: FAIL - Requires admin auth
84
- - **Status**: READ-ONLY without account context, mutations need admin auth
85
-
86
- ### timers.ts
87
- - **GET List**: FAIL - "Account context required" without X-Account-Id
88
- - **POST Create**: FAIL - Requires admin auth
89
- - **GET Single**: SUCCESS - Returns timer with schedule config
90
- - **PATCH Update**: FAIL - Requires admin auth
91
- - **DELETE Soft Delete**: FAIL - Requires admin auth
92
- - **Status**: READ-ONLY without account context, mutations need admin auth
93
-
94
- ### integrations.ts
95
- - **GET List**: FAIL - "Account context required" without X-Account-Id
96
- - **POST Create**: FAIL - Requires admin auth
97
- - **GET Single**: SUCCESS - Returns integration with config
98
- - **PATCH Update**: FAIL - Requires admin auth
99
- - **DELETE Soft Delete**: FAIL - Requires admin auth
100
- - **Status**: READ-ONLY without account context, mutations need admin auth
101
-
102
- ### roles.ts
103
- - **GET List**: SUCCESS - Returns system roles
104
- - **POST Create**: FAIL - Requires admin auth
105
- - **GET Single**: SUCCESS - Returns role with permissions
106
- - **PATCH Update**: FAIL - Requires admin auth
107
- - **DELETE Soft Delete**: FAIL - Requires admin auth
108
- - **Status**: READ-ONLY without auth, mutations need admin auth
109
-
110
- ## Runtime APIs
111
-
112
- ### threads.ts
113
- - **GET List**: SUCCESS - Returns threads with person info
114
- - **POST Create**: SUCCESS - Creates thread
115
- - **GET Single**: SUCCESS - Returns thread with person
116
- - **PATCH Update**: SUCCESS - Updates thread
117
- - **DELETE Soft Delete**: SUCCESS - Sets is_active=false
118
- - **Status**: FULLY FUNCTIONAL
119
-
120
- ### messages.ts
121
- - **GET List**: SUCCESS - Returns messages with thread/person info
122
- - **POST Create**: SUCCESS - Creates message
123
- - **GET Single**: SUCCESS - Returns message with thread/person
124
- - **PATCH Update**: SUCCESS - Updates message
125
- - **DELETE Soft Delete**: SUCCESS - Sets is_active=false
126
- - **Status**: FULLY FUNCTIONAL
127
-
128
- ### attachments.ts
129
- - **GET List**: SUCCESS - Returns attachments with person info
130
- - **POST Create**: SUCCESS - Creates attachment
131
- - **GET Single**: SUCCESS - Returns attachment with person
132
- - **PATCH Update**: SUCCESS - Updates attachment
133
- - **DELETE Soft Delete**: SUCCESS - Sets is_active=false
134
- - **Status**: FULLY FUNCTIONAL
135
-
136
- ### watchers.ts
137
- - **GET List**: SUCCESS - Returns watchers with person info
138
- - **POST Create**: SUCCESS - Creates watcher
139
- - **GET Single**: SUCCESS - Returns watcher
140
- - **DELETE Hard Delete**: SUCCESS - Removes watcher
141
- - **Status**: FULLY FUNCTIONAL
142
-
143
- ### links.ts
144
- - **GET List**: SUCCESS - Returns links with link_type/person info
145
- - **POST Create**: SUCCESS - Creates link
146
- - **GET Single**: SUCCESS - Returns link with type/person
147
- - **DELETE Hard Delete**: SUCCESS - Removes link
148
- - **Status**: FULLY FUNCTIONAL
149
-
150
- ### link-types.ts
151
- - **GET List**: SUCCESS - Returns link types
152
- - **POST Create**: FAIL - Requires admin auth
153
- - **GET Single**: SUCCESS - Returns link type with app info
154
- - **PATCH Update**: FAIL - Requires admin auth
155
- - **DELETE Soft Delete**: FAIL - Requires admin auth
156
- - **Status**: READ-ONLY without auth, mutations need admin auth
157
-
158
- ## Access Control APIs
159
-
160
- ### people-accounts.ts
161
- - **GET List**: SUCCESS - Returns people-accounts relationships
162
- - **POST Create**: SUCCESS - Adds person to account
163
- - **DELETE Remove**: SUCCESS - Removes person from account
164
- - **Status**: FULLY FUNCTIONAL
165
-
166
- ### people-roles.ts
167
- - **GET List**: SUCCESS - Returns people-roles relationships
168
- - **POST Create**: SUCCESS - Assigns role to person
169
- - **DELETE Remove**: SUCCESS - Removes role from person
170
- - **Status**: FULLY FUNCTIONAL
171
-
172
- ### account-nodes.ts
173
- - **GET List**: SUCCESS - Returns account hierarchy via RPC
174
- - **Status**: FULLY FUNCTIONAL
175
-
176
- ## System APIs
177
-
178
- ### logs.ts
179
- - **GET List**: SUCCESS - Returns system logs
180
- - **GET Single**: SUCCESS - Returns single log entry
181
- - **Status**: FULLY FUNCTIONAL
182
-
183
- ### pipeline-executions.ts
184
- - **GET List**: SUCCESS - Returns pipeline executions
185
- - **GET Single**: SUCCESS - Returns single execution
186
- - **Status**: FULLY FUNCTIONAL
187
-
188
- ## Summary
189
-
190
- ### Fully Functional (11 endpoints)
191
- - accounts, people, items (with context), threads, messages, attachments, watchers, links, people-accounts, people-roles, account-nodes, logs, pipeline-executions
192
-
193
- ### Read-Only Without Auth (8 endpoints)
194
- - types, apps, pipelines, triggers, ai-agents, embeddings, timers, integrations, roles, link-types
195
-
196
- ### Issues Identified
197
- 1. **Authentication Required**: Config mutations need proper admin auth tokens
198
- 2. **Account Context**: Most config endpoints require X-Account-Id header
199
- 3. **Items Endpoint**: Requires account context for all operations
200
- 4. **Auth Validation**: Proper token validation needed for admin operations
201
-
202
- ### Recommendations
203
- 1. Implement proper admin authentication for config mutations
204
- 2. Add account context validation for config reads
205
- 3. Test with valid admin session tokens
206
- 4. Verify role-based access control enforcement
207
-
208
- ## Test Data Created
209
- - Test account: "Test Account for API Testing"
210
- - Test person: "Test Person" with timestamped email
211
- - Test items: Created with account context
212
- - All test data properly soft deleted after testing
@@ -1,138 +0,0 @@
1
- # Spine v2 Assembly & Launch Process Guide
2
-
3
- ## Source Directories vs Served Directories
4
-
5
- **Edit here (source of truth):**
6
- - `v2-core/src/` — core frontend (all apps, components, hooks, pages)
7
- - `v2-core/functions/` — core Netlify functions
8
- - `v2-custom/src/` — custom frontend overrides (`custom_*.tsx` files only)
9
- - `v2-custom/functions/` — custom function overrides (`custom_*.ts` files only)
10
-
11
- **Never edit these (generated/assembled output):**
12
- - `functions/` (repo root) — assembled and served by Netlify CLI
13
- - `src/v2-assembled/` — assembled for prod builds only (not used in dev)
14
-
15
- ---
16
-
17
- ## Dev vs Prod
18
-
19
- ### Dev (`netlify dev`)
20
-
21
- **Frontend** — not assembled. Vite serves `v2-core/` directly as its root:
22
- ```
23
- vite.config.ts → root: 'v2-core'
24
- ```
25
- `v2-custom/src/` is reachable via `server.fs.allow`, so `CustomAppLoader.tsx` loads
26
- full custom app trees (e.g. `v2-custom/src/apps/customer-portal/`) via `import.meta.glob`
27
- at runtime — no file copying needed for frontend in dev.
28
-
29
- **Functions** — must be assembled. Netlify CLI serves functions from `functions/` at the
30
- repo root (`netlify.toml [functions] directory = "functions"`). Run `npm run assemble:v2`
31
- before starting dev whenever you add or change a function.
32
-
33
- ### Prod (`npm run build`)
34
-
35
- `package.json` runs full assembly before the Vite build:
36
- ```
37
- prebuild → npm run assemble:v2 && npm run verify
38
- build → tsc -b && vite build --config vite.config.ts
39
- ```
40
-
41
- ---
42
-
43
- ## Assembly: What `npm run assemble:v2` Does
44
-
45
- Calls `scripts/assemble-v2.sh`, which runs these three steps **in order**:
46
-
47
- **Step 1 — Custom overlay** (`scripts/assemble-v2-custom.sh`)
48
- - Finds all `custom_*.tsx` files under `v2-custom/src/` → flat-copies into `v2-core/src/`
49
- - Finds all `custom_*.ts` files under `v2-custom/functions/` → flat-copies into `v2-core/functions/`
50
- - Files NOT named `custom_*` are ignored by assembly (but full app trees in `v2-custom/src/apps/`
51
- are still accessible to Vite dev server via `fs.allow`)
52
-
53
- **Step 2 — Functions**
54
- - Wipes `functions/` (repo root)
55
- - Copies `v2-core/functions/` → `functions/` (now includes any custom_*.ts from step 1)
56
-
57
- **Step 3 — Frontend (prod only)**
58
- - Wipes `src/v2-assembled/`
59
- - Copies `v2-core/src/` → `src/v2-assembled/` (now includes any custom_*.tsx from step 1)
60
- - Fixes `index.html` script path: `/src/main.tsx` → `./main.tsx`
61
-
62
- The order matters: custom files must land in `v2-core/` **before** the root copy runs,
63
- so they are included in the output in a single pass.
64
-
65
- ---
66
-
67
- ## Standard Dev Launch
68
-
69
- ```bash
70
- # First time, or after adding/modifying any function:
71
- npm run assemble:v2
72
-
73
- # Start the dev server:
74
- netlify dev
75
- ```
76
-
77
- **What `netlify dev` does:**
78
- 1. Runs `scripts/netlify-dev-wrapper.sh` (via `netlify.toml [dev].command`)
79
- 2. Wrapper fires Vite directly: `exec node_modules/.bin/vite --config vite.config.ts`
80
- 3. Vite serves `v2-core/` on port 3001 with HMR
81
- 4. Netlify CLI proxies port 8888 → 3001 and serves `functions/` (repo root)
82
-
83
- ---
84
-
85
- ## Process Management
86
-
87
- ```bash
88
- # Check ports
89
- lsof -i:3001 # Vite
90
- lsof -i:8888 # Netlify proxy
91
-
92
- # Kill both
93
- pkill -f vite && pkill -f netlify
94
-
95
- # Clean restart
96
- pkill -f vite && pkill -f netlify && sleep 1 && netlify dev
97
- ```
98
-
99
- ---
100
-
101
- ## Troubleshooting
102
-
103
- ### Function returning 404
104
- `functions/` (repo root) is stale or missing the new function. Reassemble then restart:
105
- ```bash
106
- npm run assemble:v2
107
- # restart netlify dev
108
- ```
109
-
110
- ### `custom_*.tsx` override not taking effect
111
- Reassemble so the file lands in `v2-core/src/`:
112
- ```bash
113
- npm run assemble:v2
114
- ```
115
- Vite HMR picks it up automatically if the dev server is already running.
116
-
117
- ### Vite never binds to port 3001
118
- `npm run dev` and `npx vite` silently hang under Netlify CLI. The wrapper must use the
119
- direct binary. Verify `scripts/netlify-dev-wrapper.sh` contains:
120
- ```bash
121
- exec "$PROJECT_ROOT/node_modules/.bin/vite" --config "$PROJECT_ROOT/vite.config.ts"
122
- ```
123
- Never change this to `npm run dev` or `npx vite`.
124
-
125
- ---
126
-
127
- ## Key Files
128
-
129
- | File | Role |
130
- |---|---|
131
- | `scripts/assemble-v2.sh` | Full assembly orchestrator — runs steps 1→2→3 |
132
- | `scripts/assemble-v2-custom.sh` | Step 1: overlays `custom_*` files into `v2-core/` |
133
- | `scripts/netlify-dev-wrapper.sh` | Dev entry point — fires Vite binary directly |
134
- | `netlify.toml` | `[dev].command` → wrapper; `[functions] directory = "functions"` |
135
- | `vite.config.ts` | `root: 'v2-core'`; `fs.allow` includes `v2-custom`; `@core`/`@custom` aliases |
136
- | `v2-core/src/components/CustomAppLoader.tsx` | Loads `v2-custom/src/apps/*/index.tsx` via `import.meta.glob` |
137
- | `functions/` (repo root) | Assembled output — served by Netlify CLI; never edit directly |
138
- | `src/v2-assembled/` | Assembled output — prod build only; never edit directly |