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
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: spine-new-function
3
+ description: "Decide when a custom Netlify function is allowed (admin-data can't cover the case) and write it correctly."
4
+ allowed-tools:
5
+ - read
6
+ - write
7
+ - edit
8
+ - exec
9
+ - grep
10
+ - find_file_by_name
11
+ ---
12
+
13
+ You decide whether a piece of server logic may become a custom function, and
14
+ write it when it may. **Default answer: no** — runtime record CRUD belongs to
15
+ `/api/admin-data`, full stop.
16
+
17
+ ## When a custom function IS allowed
18
+
19
+ A `custom/functions/` (or app `functions/`) handler is legitimate only when
20
+ `/api/admin-data` cannot express the work:
21
+
22
+ - **Non-record operations** — compute, aggregation, export, file transform.
23
+ - **External orchestration** — call an integration, fan out to several
24
+ services, run a multi-step protocol in one request.
25
+ - **Inbound webhooks** — verify a signature and normalize a payload before
26
+ handing it to a pipeline (see `spine-add-integration`).
27
+ - **Scheduled/system work** — timer-driven batch jobs that need server
28
+ context.
29
+ - **Auth-adjacent flows** — invite acceptance, api-key exchange, registration
30
+ handshakes (see `.framework/src/instructions/api-keys.md` and
31
+ `integrations.md`).
32
+
33
+ It is **never** allowed for: listing/creating/updating/deleting `items`,
34
+ `threads`, `messages`, `links`, `attachments`, `watchers`, or other runtime
35
+ records — those calls bypass permission checks, type resolution, audit, and
36
+ triggers inside admin-data. See
37
+ `.framework/src/instructions/reference/api/admin-data.md`.
38
+
39
+ ## Writing the function
40
+
41
+ 1. Read `.framework/src/instructions/reference/api/admin-data.md` and
42
+ `.framework/src/instructions/reference/functions/index.md` for the
43
+ endpoint inventory your function may use.
44
+ 2. Place it in `custom/functions/` (project-scoped) or the app's
45
+ `functions/` dir; assemble picks it up at build time.
46
+ 3. Inside the function, import shared helpers via `./_shared/*` (the
47
+ assembled flat layout) — never via relative paths into `.framework/`.
48
+ 4. Authenticate with the platform auth helpers (principal resolution,
49
+ role checks). Use `adminDb` only when bypassing RLS is truly intended.
50
+ 5. Keep secrets in env — `VITE_*` vars are public; service keys are not.
51
+ 6. Register a `custom_*` scheduled/function section in `netlify.toml` if it
52
+ needs a schedule — those sections are app-owned and survive upgrade.
53
+
54
+ ## Verify
55
+
56
+ - `npm run typecheck:functions` — functions are typechecked against the
57
+ assembled layout.
58
+ - Exercise it once via the assembled function endpoint, not by shortcutting
59
+ through app code.
60
+
61
+ ## Rules
62
+
63
+ - If a proposed function reads/writes runtime records, redirect the design to
64
+ `/api/admin-data` and say why.
65
+ - One function per edge case — no catch-all "custom-api.ts" grab bags.
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: spine-new-type
3
+ description: "Create a new Spine type — pick kind/slug, author design_schema, seed the types row, and verify generic rendering."
4
+ allowed-tools:
5
+ - read
6
+ - write
7
+ - edit
8
+ - exec
9
+ - grep
10
+ - find_file_by_name
11
+ ---
12
+
13
+ You create a new Spine type: a `public.types` row whose `design_schema`
14
+ governs how runtime records validate, render, and authorize.
15
+
16
+ ## When to invoke
17
+
18
+ - A new domain entity is needed (work item, ticket, course, ...).
19
+ - An existing type needs its schema extended (use `spine-schema` for the JSON).
20
+
21
+ ## Steps
22
+
23
+ 1. **Read the contract.** `.framework/src/instructions/types.md` describes the
24
+ fields (`slug`, `kind`, `ownership`, `is_active`, `icon`, `color`,
25
+ `design_schema`, `validation_schema`) and their downstream effects. The full
26
+ field reference is `.framework/src/instructions/reference/design-schema.md`;
27
+ `.framework/src/instructions/concepts/runtime-records.md` covers how types
28
+ stamp records.
29
+
30
+ 2. **Pick `kind` and `slug`.**
31
+ - `kind` = the runtime table the records live in: `item` (default for
32
+ domain records), `thread`, `message`, `link`, `attachment`, `watcher`,
33
+ `person`, `account`.
34
+ - `slug` is unique **globally per kind** — type seeds use
35
+ `conflict: "kind,slug"` with `inject_app_id: false`. Check existing slugs
36
+ before choosing; duplicates break `resolveTypeId` lookups.
37
+
38
+ 3. **Author `design_schema`.** Minimum required shape:
39
+ - `scope`: `account` (default) or `platform`.
40
+ - `fields`: every field gets `data_type`, `label`, `required`.
41
+ - `views`: `default_list` (table fields + `default_sort`) and
42
+ `default_detail` (sections → fields) — required for generic apps.
43
+ - `record_permissions`: base grant per role; at least `system-admin`.
44
+ - `functionality`: `null` until automation bindings are confirmed.
45
+ See the `spine-schema` skill for the full checklist and valid values.
46
+
47
+ 4. **Validate the JSON:** `npx spine-framework validate-schema <file>`.
48
+
49
+ 5. **Deliver the row.** Types ship as app seed data (`seed/types.json`,
50
+ `conflict: "kind,slug"`, `inject_app_id: false`) or are created through the
51
+ admin UI / `admin-data`. Never write migration `INSERT`s that bypass the
52
+ seed/type-creation path unless the task is explicitly a migration.
53
+
54
+ 6. **Verify rendering.** Records store `system: true` fields at
55
+ `record.<field>` and the rest at `record.data.<field>` — check the generic
56
+ list/detail views render from `views` and the permission grants behave.
57
+
58
+ ## Rules
59
+
60
+ - `validation_schema` is generated — never author it by hand.
61
+ - Changing `data_type` on a field with existing records does not migrate data.
62
+ - `system: true` fields restrict `write` to `system-admin` when the
63
+ record-level grant would otherwise allow it.
64
+ - Verification: `validate-schema` clean + a created record reads back with
65
+ the expected `data` shape.
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: spine-schema
3
+ description: "Author and validate a Spine type's design_schema — fields, views, record_permissions — before saving it to public.types."
4
+ allowed-tools:
5
+ - read
6
+ - write
7
+ - edit
8
+ - exec
9
+ - grep
10
+ - find_file_by_name
11
+ ---
12
+
13
+ You author and validate `design_schema` JSON for Spine types. The schema drives
14
+ permissions, validation, and generic UI rendering — mistakes surface as empty
15
+ or unwriteable records.
16
+
17
+ ## When to invoke
18
+
19
+ - A new type needs a `design_schema`.
20
+ - An existing type or runtime record is not behaving as expected.
21
+ - A schema needs validation before it is saved to `public.types`.
22
+
23
+ ## Inputs to gather
24
+
25
+ - `kind` — the runtime table the type governs (`item`, `thread`, `message`,
26
+ `link`, `attachment`, `watcher`, `person`, `account`).
27
+ - `slug` — unique per `kind`; duplicates break `resolveTypeId`/`.single()`.
28
+ - `scope` — `account` (default) or `platform`.
29
+ - Whether the app is generic (`apps.renderer = "generic"`) or custom —
30
+ generic apps require complete `views`.
31
+
32
+ ## Authoring procedure
33
+
34
+ 1. Read `.framework/src/instructions/types.md` for the entity contract,
35
+ `.framework/src/instructions/concepts/design-schema.md` for the model, and
36
+ `.framework/src/instructions/reference/design-schema.md` for the field
37
+ reference.
38
+ 2. Draft `design_schema` with the minimum shape:
39
+ - `fields` — each field needs `data_type`, `label`, `required`.
40
+ - `views.default_list` — `type: "list"`, `fields`, `default_sort`.
41
+ - `views.default_detail` — `type: "detail"`, `sections[].fields`.
42
+ - `record_permissions` — base grant per role; at least `system-admin`.
43
+ - `functionality` — `null` until automation bindings are confirmed.
44
+ 3. Apply the permission rule: `record_permissions` is the most restrictive
45
+ grant. Use `fields.<name>.permissions` **only** to loosen a field beyond the
46
+ base grant or to restrict a `system: true` field's `write`.
47
+ 4. Mark `system: true` only for fields stored as top-level record columns;
48
+ everything else lives in `record.data.<field>`.
49
+
50
+ ## Valid values
51
+
52
+ - `data_type`: `text`, `textarea`, `rich_text`, `email`, `phone`, `url`,
53
+ `number`, `currency`, `range`, `date`, `datetime`, `boolean`, `checkbox`,
54
+ `select`, `multiselect`, `radio`, `color`, `file`, `image`, `json`,
55
+ `reference`, `address`.
56
+ - `display_type`: `text`, `input`, `textarea`, `rich_text`, `select`,
57
+ `multiselect`, `radio`, `checkbox`, `switch`, `date_picker`,
58
+ `datetime_picker`, `color_picker`, `file_upload`, `image_upload`,
59
+ `range_slider`, `badge`, `timestamp`, `currency`, `number`.
60
+ - `select`/`multiselect`/`radio` fields require non-empty `options`.
61
+
62
+ ## Validate
63
+
64
+ ```bash
65
+ npx spine-framework validate-schema path/to/design_schema.json
66
+ ```
67
+
68
+ Exit code 0 = ok; errors are printed with their `fields.*`/`views.*` path.
69
+ Run `npx spine-framework validate-app <dir>` instead when checking a whole app
70
+ package (manifest, seeds, structure).
71
+
72
+ ## Rules
73
+
74
+ - Never guess `data_type`/`display_type` values — use only the lists above.
75
+ - Never widen `record_permissions` to fix a field-level problem; add a field
76
+ override instead.
77
+ - Report the schema diff and any records that need restamping before saving.
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: spine-test
3
+ description: "Run and write tests in a Spine project — vitest suites, typecheck, integrity verify, and where test files belong."
4
+ allowed-tools:
5
+ - read
6
+ - write
7
+ - edit
8
+ - exec
9
+ - grep
10
+ - find_file_by_name
11
+ ---
12
+
13
+ You run the project's verification suite and add tests in the right places.
14
+
15
+ ## When to invoke
16
+
17
+ - Before finishing any code change (the verify gate).
18
+ - When a change needs a new test.
19
+ - When a test fails and the suite layout is unfamiliar.
20
+
21
+ ## Commands
22
+
23
+ ```bash
24
+ npm run typecheck # tsc over assembled + framework + custom sources
25
+ npm run test # vitest run — unit + api suites
26
+ npm run verify # .spine-manifest.json integrity (fail-closed)
27
+ npx vitest run <file> # one test file during development
28
+ npm run test:unit # unit suite only, if present in scripts
29
+ ```
30
+
31
+ The test/CI reference pages live at
32
+ `.framework/src/instructions/reference/functions/tests.md` and
33
+ `.framework/src/instructions/reference/cli.md`.
34
+
35
+ ## Where tests live
36
+
37
+ - `.framework/tests/` — framework-owned suites. Do not add project tests
38
+ here; the tree is sealed and upgrade-overwritten.
39
+ - `custom/tests/` — project-level tests; matched by `vitest.config.ts`.
40
+ - `custom/apps/<slug>/tests/` or colocated `*.test.ts` — app-owned tests.
41
+
42
+ ## Writing a test
43
+
44
+ 1. Follow the existing unit-test style: `vitest` imports, `mkdtempSync` under
45
+ `os.tmpdir()` for filesystem fixtures, `vi.mock`/`vi.hoisted` for module
46
+ fakes, `vi.spyOn(console, 'log')` to silence CLI output.
47
+ 2. `.framework/tests/setup.ts` stubs `SUPABASE_URL`/`SUPABASE_ANON_KEY`/
48
+ `SUPABASE_SERVICE_ROLE_KEY` — unit tests must not need real credentials.
49
+ 3. Integration tests hitting a live database are excluded from the shipped
50
+ suite — keep new tests unit-level unless told otherwise.
51
+
52
+ ## Failure triage
53
+
54
+ - **typecheck** — fix compile errors first; runtime failures under them are
55
+ noise.
56
+ - **verify** — a `.framework/` file changed; find the local edit and revert
57
+ (or `upgrade --force`).
58
+ - **test** — read the assertion, then the fixture; check mocks before
59
+ suspecting logic.
60
+ - **doctor** — `npx spine-framework doctor --fix` surfaces env/db/wiring
61
+ problems that masquerade as test failures.
62
+
63
+ ## Rules
64
+
65
+ - Never weaken or skip a failing test to go green — fix the cause.
66
+ - New behavior gets a test in the same PR unless the task says otherwise.
67
+ - Keep fixtures hermetic: temp dirs, no network, no real credentials.
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: spine-troubleshoot
3
+ description: "Debug a Spine issue — use deliveries, executions, logs, doctor, and the integrity manifest to isolate framework vs app faults."
4
+ allowed-tools:
5
+ - read
6
+ - exec
7
+ - grep
8
+ - find_file_by_name
9
+ ---
10
+
11
+ You debug Spine projects: form a hypothesis, check the observability surfaces,
12
+ and isolate whether the fault is in framework, app, config, or data.
13
+
14
+ ## When to invoke
15
+
16
+ - A pipeline, trigger, timer, delivery, or agent is not behaving.
17
+ - Records render empty/unwriteable or permissions deny expected access.
18
+ - `npm run verify`, `npm run typecheck`, `npm run test`, or doctor report problems.
19
+
20
+ ## First move — doctor
21
+
22
+ ```bash
23
+ npx spine-framework doctor --fix
24
+ ```
25
+
26
+ Doctor checks environment, database, migrations, test runs, `runtime_wiring`
27
+ (dangling trigger/pipeline/action references), manifest integrity, and agent
28
+ assets. Warnings name the broken reference — start there.
29
+
30
+ ## Observability surfaces
31
+
32
+ - `.framework/src/instructions/deliveries.md` — outbound delivery attempts:
33
+ status, retries, response bodies. First stop for webhook/integration issues.
34
+ - `.framework/src/instructions/concepts/observability.md` — the logging and
35
+ execution model; `.framework/src/instructions/operations/` — admin-UI
36
+ runbooks for logs and executions.
37
+ - `.framework/src/instructions/reference/functions/logs.md`,
38
+ `.framework/src/instructions/reference/functions/pipeline-executions.md`,
39
+ `.framework/src/instructions/reference/cli.md` — endpoint/CLI spelling.
40
+ - `.framework/src/instructions/triggers.md` / `timers.md` / `pipelines.md` —
41
+ field-level config reference when a record's wiring looks wrong.
42
+
43
+ ## Common failure patterns
44
+
45
+ - **Active pipeline does nothing** — `stages` array empty or every
46
+ `stage_type` points at an inactive/missing action (doctor `runtime_wiring`
47
+ flags this).
48
+ - **Record renders empty** — `design_schema.views` missing `default_list`/
49
+ `default_detail`, unknown `display_type`, or fields stored under
50
+ `record.data` but read as top-level (`system: true` mismatch).
51
+ - **Permission denied unexpectedly** — `record_permissions` is the base
52
+ grant; check the role's record-level grant before field overrides. See
53
+ `.framework/src/instructions/concepts/permissions.md` and
54
+ `.framework/src/instructions/roles.md`.
55
+ - **Trigger never fires** — `is_active` false, `event_type` mismatch, or
56
+ `type_slug`/`pipeline_slug` not resolving (doctor flags all of these).
57
+ - **Upgrade verify fails** — `.framework/` was edited locally; the tree is
58
+ sealed. Revert or `npx spine-framework upgrade --force` to resync.
59
+ - **Env issues** — missing `SUPABASE_URL`/`SUPABASE_SERVICE_ROLE_KEY`; copy
60
+ `.env.example` → `.env` and fill in credentials.
61
+
62
+ ## Isolation procedure
63
+
64
+ 1. Reproduce with the smallest path (one record, one event, one call).
65
+ 2. Check deliveries/executions for the failing run's error text.
66
+ 3. Compare config against the entity doc's field reference.
67
+ 4. If the fault is inside `.framework/`, report it — do not patch core.
68
+ 5. Verify the fix: rerun the failing path + `npm run test` / doctor.
69
+
70
+ ## Rules
71
+
72
+ - Trust code over docs when they conflict; note the inconsistency.
73
+ - Never "fix" a symptom by widening permissions or disabling RLS — find the
74
+ wiring bug instead.
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: spine-upgrade
3
+ description: "Explain and run spine-framework upgrade — what it rewrites, what it preserves, and the dry-run/force flags."
4
+ allowed-tools:
5
+ - read
6
+ - exec
7
+ - grep
8
+ - find_file_by_name
9
+ ---
10
+
11
+ You run and explain `spine-framework upgrade` — the command that syncs a
12
+ project's framework-owned files to the spine-framework version installed in
13
+ `node_modules`.
14
+
15
+ ## When to invoke
16
+
17
+ - `package.json` `spine-framework` pin was bumped and the project must resync.
18
+ - The user asks what upgrade will change before running it.
19
+
20
+ CLI spelling and flags live in `.framework/src/instructions/reference/cli.md`.
21
+
22
+ ## What it does
23
+
24
+ 1. Verifies `.spine-manifest.json` exists and no framework file was modified
25
+ locally (abort with the list; `--force` overrides).
26
+ 2. Copies the new package's framework files over `.framework/`, `config/`,
27
+ `scripts/`, `bin/` — added/changed/removed report.
28
+ 3. Merges `package.json`: framework deps and scripts; exact `spine-framework`
29
+ pin; customer-added deps and scripts preserved.
30
+ 4. Re-renders `netlify.toml`: framework blocks replaced, app-owned
31
+ `[functions."custom_*"]` sections preserved verbatim (backup at
32
+ `netlify.toml.bak` when it changes).
33
+ 5. Refreshes agent assets: replaces the `<!-- spine-framework:begin/end -->`
34
+ block inside `AGENTS.md` (everything outside the markers — including the
35
+ user section — is preserved) and replaces `.devin/skills/spine-*/`
36
+ wholesale (non-`spine-*` skill dirs are customer-owned and untouched).
37
+ 6. Regenerates `.spine-manifest.json` at the new version.
38
+
39
+ ## Never overwritten
40
+
41
+ - `AGENTS.md` content outside the framework markers.
42
+ - `.devin/skills/` directories not named `spine-*`.
43
+ - `custom/`, `spine.config.json`, `.env`, netlify.toml `custom_*` sections,
44
+ customer `package.json` deps/scripts.
45
+
46
+ ## Procedure
47
+
48
+ ```bash
49
+ npx spine-framework upgrade --dry-run # change report, writes nothing
50
+ npx spine-framework upgrade # apply
51
+ npx spine-framework upgrade --force # allow overwriting modified files
52
+ ```
53
+
54
+ After a real upgrade:
55
+
56
+ ```bash
57
+ npm install # resolve the new dep set
58
+ npm run verify # confirm frozen integrity
59
+ npx spine-framework migrate # apply new migrations (if reported)
60
+ npm run typecheck && npm run test # confirm the tree still builds/tests
61
+ ```
62
+
63
+ ## Rules
64
+
65
+ - Always `--dry-run` first when the project may have local `.framework/` edits.
66
+ - New migrations are *reported*, never run — `migrate` applies them.
67
+ - Upgrade is file-sync, not git-aware; rollback means `git`.
68
+ - A modified `.framework/` file must be resolved (revert or `--force`) —
69
+ never silently accept a mixed-version core.
@@ -10,7 +10,6 @@
10
10
  ".framework/src",
11
11
  ".framework/tests",
12
12
  ".framework/docs",
13
- ".framework/mcp",
14
13
  ".framework/templates"
15
14
  ],
16
15
  "framework_files": [
@@ -50,6 +49,10 @@
50
49
  "bin/ws-shim.mts",
51
50
  "bin/ws-shim.ts"
52
51
  ],
52
+ "agent_files": [
53
+ { "source": ".framework/templates/agent/AGENTS.md", "dest": "AGENTS.md", "merge": "framework-block" },
54
+ { "source": ".framework/templates/agent/skills", "dest": ".devin/skills", "merge": "dir-replace" }
55
+ ],
53
56
  "exclude_globs": [
54
57
  "**/.env",
55
58
  "**/.env.local",