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.
- package/.env.example +13 -3
- package/.framework/cli/commands/bootstrap.ts +392 -0
- package/.framework/cli/commands/dev.ts +91 -218
- package/.framework/cli/commands/doctor.ts +132 -26
- package/.framework/cli/commands/generate.ts +38 -298
- package/.framework/cli/commands/init.ts +20 -1
- package/.framework/cli/commands/migrate.ts +36 -30
- package/.framework/cli/commands/migrations.ts +16 -56
- package/.framework/cli/commands/upgrade.ts +35 -0
- package/.framework/cli/commands/validate-schema.ts +147 -0
- package/.framework/cli/context.ts +223 -110
- package/.framework/cli/index.ts +6 -0
- package/.framework/cli/lib/project-files.ts +241 -1
- package/.framework/functions/_shared/hash-api-key.ts +183 -79
- package/.framework/functions/_shared/logging.ts +562 -224
- package/.framework/functions/_shared/middleware.ts +47 -44
- package/.framework/functions/admin-data.ts +39 -28
- package/.framework/functions/ai-agents.ts +10 -6
- package/.framework/functions/api-keys.ts +301 -122
- package/.framework/functions/apps.ts +43 -26
- package/.framework/functions/cil-ingest.ts +48 -15
- package/.framework/functions/debug-auth.ts +14 -8
- package/.framework/functions/deliveries.ts +39 -12
- package/.framework/functions/embeddings.ts +145 -76
- package/.framework/functions/integration-outbound.ts +67 -27
- package/.framework/functions/integrations.ts +254 -127
- package/.framework/functions/logs.ts +273 -133
- package/.framework/functions/observability.ts +277 -147
- package/.framework/functions/pipeline-executions.ts +1 -1
- package/.framework/functions/pipelines.ts +14 -9
- package/.framework/functions/prompt-configs.ts +7 -4
- package/.framework/functions/roles.ts +8 -5
- package/.framework/functions/security.ts +30 -17
- package/.framework/functions/system-cron.ts +240 -127
- package/.framework/functions/tests.ts +7 -6
- package/.framework/functions/timers.ts +310 -107
- package/.framework/functions/triggers.ts +28 -13
- package/.framework/functions/types.ts +13 -10
- package/.framework/migrations/069_log_stats_window.sql +54 -0
- package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
- package/.framework/migrations/071_timer_interval_keys.sql +96 -0
- package/.framework/migrations/072_slug_autofill.sql +77 -0
- package/.framework/migrations/073_seed_member_roles.sql +26 -0
- package/.framework/src/apps/admin/index.tsx +1141 -775
- package/.framework/src/components/ErrorBoundary.tsx +136 -0
- package/.framework/src/components/admin/AdminListPage.tsx +81 -73
- package/.framework/src/components/admin/AdminSidebar.tsx +88 -79
- package/.framework/src/components/admin/EntitySelect.tsx +181 -0
- package/.framework/src/components/admin/PageInstructions.tsx +86 -127
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
- package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
- package/.framework/src/components/layout/Sidebar.tsx +300 -177
- package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
- package/.framework/src/components/runtime/DataHeader.tsx +96 -48
- package/.framework/src/components/runtime/DataListPage.tsx +3 -26
- package/.framework/src/components/runtime/DataStats.tsx +10 -10
- package/.framework/src/components/runtime/DataTable.tsx +12 -10
- package/.framework/src/components/ui/sheet.tsx +24 -26
- package/.framework/src/components/ui/textarea.tsx +74 -48
- package/.framework/src/hooks/useEntityList.ts +12 -9
- package/.framework/src/hooks/useListSchema.ts +108 -58
- package/.framework/src/instructions/README.md +57 -0
- package/.framework/src/instructions/ai-agents.md +69 -0
- package/.framework/src/instructions/alerts.md +80 -0
- package/.framework/src/instructions/api-keys.md +87 -0
- package/.framework/src/instructions/apps.md +77 -0
- package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
- package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
- package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
- package/.framework/src/instructions/concepts/automation.md +186 -0
- package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
- package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
- package/.framework/src/instructions/concepts/design-schema.md +152 -0
- package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
- package/.framework/src/instructions/concepts/observability.md +116 -0
- package/.framework/src/instructions/concepts/permissions.md +150 -0
- package/.framework/src/instructions/concepts/runtime-records.md +111 -0
- package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
- package/.framework/src/instructions/concepts/spine-way.md +172 -0
- package/.framework/src/instructions/deliveries.md +59 -0
- package/.framework/src/instructions/guide/00-orientation.md +106 -0
- package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
- package/.framework/src/instructions/guide/02-project-map.md +147 -0
- package/.framework/src/instructions/guide/03-domain-model.md +223 -0
- package/.framework/src/instructions/guide/04-first-app.md +227 -0
- package/.framework/src/instructions/guide/05-glossary.md +183 -0
- package/.framework/src/instructions/integrations.md +96 -0
- package/.framework/src/instructions/internal/cil-markers.md +83 -0
- package/.framework/src/instructions/invites.md +60 -0
- package/.framework/src/instructions/kb.md +80 -0
- package/.framework/src/instructions/logs.md +77 -0
- package/.framework/src/instructions/observability.md +61 -0
- package/.framework/src/instructions/operations/deployment.md +115 -0
- package/.framework/src/instructions/operations/migrations.md +125 -0
- package/.framework/src/instructions/operations/security-checklist.md +148 -0
- package/.framework/src/instructions/operations/troubleshooting.md +170 -0
- package/.framework/src/instructions/operations/upgrade.md +116 -0
- package/.framework/src/instructions/pipeline-executions.md +62 -0
- package/.framework/src/instructions/pipelines.md +78 -0
- package/.framework/src/instructions/prompts.md +95 -0
- package/.framework/src/instructions/reference/api/admin-data.md +162 -0
- package/.framework/src/instructions/reference/api/auth.md +113 -0
- package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
- package/.framework/src/instructions/reference/app-manifest.md +150 -0
- package/.framework/src/instructions/reference/cli.md +124 -0
- package/.framework/src/instructions/reference/database.md +132 -0
- package/.framework/src/instructions/reference/design-schema.md +280 -0
- package/.framework/src/instructions/reference/env-vars.md +133 -0
- package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
- package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
- package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
- package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
- package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
- package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
- package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
- package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
- package/.framework/src/instructions/reference/functions/apps.md +140 -0
- package/.framework/src/instructions/reference/functions/auth.md +99 -0
- package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
- package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
- package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
- package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
- package/.framework/src/instructions/reference/functions/index.md +103 -0
- package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
- package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
- package/.framework/src/instructions/reference/functions/integrations.md +130 -0
- package/.framework/src/instructions/reference/functions/invites.md +182 -0
- package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
- package/.framework/src/instructions/reference/functions/kb.md +166 -0
- package/.framework/src/instructions/reference/functions/logs.md +141 -0
- package/.framework/src/instructions/reference/functions/observability.md +105 -0
- package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
- package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
- package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
- package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
- package/.framework/src/instructions/reference/functions/roles.md +121 -0
- package/.framework/src/instructions/reference/functions/security.md +140 -0
- package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
- package/.framework/src/instructions/reference/functions/system.md +106 -0
- package/.framework/src/instructions/reference/functions/tests.md +97 -0
- package/.framework/src/instructions/reference/functions/timers.md +117 -0
- package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
- package/.framework/src/instructions/reference/functions/triggers.md +140 -0
- package/.framework/src/instructions/reference/functions/types.md +146 -0
- package/.framework/src/instructions/reference/seeds.md +126 -0
- package/.framework/src/instructions/reference/shared-modules.md +127 -0
- package/.framework/src/instructions/reference/spine-config.md +114 -0
- package/.framework/src/instructions/roles.md +80 -0
- package/.framework/src/instructions/runtime-detail.md +70 -0
- package/.framework/src/instructions/runtime-list.md +77 -0
- package/.framework/src/instructions/security.md +67 -0
- package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
- package/.framework/src/instructions/tasks/add-a-role.md +96 -0
- package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
- package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
- package/.framework/src/instructions/tasks/add-a-type.md +151 -0
- package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
- package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
- package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
- package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
- package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
- package/.framework/src/instructions/tasks/test-your-code.md +108 -0
- package/.framework/src/instructions/tasks/write-a-function.md +132 -0
- package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
- package/.framework/src/instructions/testing.md +59 -0
- package/.framework/src/instructions/timers.md +82 -0
- package/.framework/src/instructions/triggers.md +69 -0
- package/.framework/src/instructions/types.md +93 -0
- package/.framework/src/pages/NotFoundPage.tsx +62 -31
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
- package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
- package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
- package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
- package/.framework/src/pages/admin/AppsPage.tsx +104 -66
- package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
- package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
- package/.framework/src/pages/admin/LogsPage.tsx +144 -76
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
- package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
- package/.framework/src/pages/admin/RolesPage.tsx +86 -43
- package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
- package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
- package/.framework/src/pages/admin/TimersPage.tsx +90 -62
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
- package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
- package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
- package/.framework/src/pages/admin/TypesPage.tsx +90 -48
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
- package/.framework/templates/agent/AGENTS.md +150 -0
- package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
- package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
- package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
- package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
- package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
- package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
- package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
- package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
- package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
- package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
- package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
- package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
- package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
- package/.framework/templates/project.json +4 -1
- package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
- package/.framework/tests/unit/agent-files.test.ts +355 -0
- package/.framework/tests/unit/agent-runner.test.ts +479 -44
- package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
- package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
- package/.framework/tests/unit/bootstrap.test.ts +242 -0
- package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
- package/.framework/tests/unit/debug-auth.test.ts +38 -0
- package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
- package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
- package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
- package/.framework/tests/unit/logging-app-id.test.ts +75 -0
- package/.framework/tests/unit/system-context-denial.test.ts +145 -0
- package/.framework/tests/unit/system-cron.test.ts +240 -0
- package/.framework/tests/unit/timers.test.ts +159 -0
- package/README.md +125 -166
- package/config/tsconfig.cli.json +2 -2
- package/package.json +15 -4
- package/templates/project/package-lock.json +2 -2
- package/.framework/docs/admin-routes.md +0 -76
- package/.framework/docs/api-docs-progress.md +0 -38
- package/.framework/docs/api-governance.md +0 -146
- package/.framework/docs/api-testing-results.md +0 -212
- package/.framework/docs/assembly-launch-guide.md +0 -138
- package/.framework/docs/audit-results.md +0 -590
- package/.framework/docs/db-api-inventory.md +0 -95
- package/.framework/docs/gap-remediation-backlog.md +0 -103
- package/.framework/docs/ui-adoption-verification.md +0 -111
- package/.framework/docs/ui-api-coverage.md +0 -84
- package/.framework/docs/v2-compatibility-audit.md +0 -228
- package/.framework/mcp/index.ts +0 -133
- package/.framework/mcp/load-env.ts +0 -60
- package/.framework/mcp/shared/app-manifest.ts +0 -275
- package/.framework/mcp/shared/db.ts +0 -477
- package/.framework/mcp/shared/kb.ts +0 -118
- package/.framework/mcp/tools/architect.ts +0 -431
- package/.framework/mcp/tools/cil/context.ts +0 -345
- package/.framework/mcp/tools/cil/graph.ts +0 -242
- package/.framework/mcp/tools/cil/ingest.ts +0 -1217
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
- package/.framework/mcp/tools/cil/pipeline.ts +0 -767
- package/.framework/mcp/tools/cil/project.ts +0 -791
- package/.framework/mcp/tools/cil/retrieval.ts +0 -336
- package/.framework/mcp/tools/cil/search-core.ts +0 -454
- package/.framework/mcp/tools/cil/search.ts +0 -97
- package/.framework/mcp/tools/cil/suggest.ts +0 -186
- package/.framework/mcp/tools/cil/validate.ts +0 -1369
- package/.framework/mcp/tools/kb/delete.ts +0 -139
- package/.framework/mcp/tools/kb/index.ts +0 -52
- package/.framework/mcp/tools/kb/ingest.ts +0 -84
- package/.framework/mcp/tools/kb/list-types.ts +0 -102
- package/.framework/mcp/tools/kb/publish.ts +0 -100
- package/.framework/mcp/tools/kb/reindex.ts +0 -86
- package/.framework/mcp/tools/kb/revoke.ts +0 -85
- package/.framework/mcp/tools/kb/search.ts +0 -101
- package/.framework/mcp/tools/kb/upsert.ts +0 -125
- 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",
|