5.0 KiB
@suaveplan/api-plugin-example — reference plugin exercising every capability under every isolation tier
Package: @suaveplan/api-plugin-example
Status: PROPOSED
Type: new-package
Stage: 8 — see umbrella openspec/changes/api-plugin-foundation/
Why
Per design doc §13.5, the reference plugin is a load-bearing integration test, not a tutorial. It exercises every contract surface in the foundation — every capability, every lifecycle hook, every route variant, every distributed-transaction surface, every error code mapping, every migration class. The host's CI runs the example's full integration suite on every host change so any host-side change that breaks the plugin contract fails loudly, in one place, against real Postgres + real Hono router.
The example also doubles as the canonical onboarding doc: when a plugin author asks "how do I use capability X?", the answer is "look at how api-plugin-example uses it."
What changes
- ADDED: A complete
plugin.jsonexercising every top-level key (requiredCapabilities,optionalCapabilities,isolation,trustLevel,permissions,dependsOn,routes,graphql,websockets,sse,sagas,twoPhaseCommit,database,jobs,events,secrets,config,scopes,telemetry,openapi,errors,uninstall). - ADDED:
src/index.tsexportingdefinePlugin({ ... })with:- REST routes covering every Section 6 step: public, private, validated, streaming, idempotent, rate-limited, RBAC-gated.
- GraphQL types + resolvers + subscriptions (federated alongside a second tiny plugin in the integration test).
- WebSocket endpoint with subscription fan-out (single-host bus AND multi-host bus exercised).
- SSE endpoint with
Last-Event-Idresume. - Owned saga (3-step) with compensations + 2PC participation flag.
- Scheduled cron jobs (
reconcile-invoices,send-monthly-statementsper-tenant) + queued jobs (send-receipt). - Event publish + subscribe (
example.invoice.created, subscribes tousers.user.deleted). - Custom error codes (
PLUGIN.EXAMPLE.*) with manifest-mapped statuses + redaction rules. - Custom metrics declared in manifest (
example.invoices_finalised_total,example.stripe.call_duration_ms,example.outstanding_invoice_count). - Multiple secrets declared.
- ADDED: Migrations across two
schemaVersionbumps inmigrations/postgres/(and surrealdb / sqlite mirrors) to exercise upgrade-on-reload AND auto-rollback when the second migration is forced to fail (tests/integration/migration-rollback.integration.test.ts). - ADDED: Integration test (
tests/integration/full-flow.integration.test.ts) that boots the example against:isolation: "trusted"isolation: "isolated"(worker thread + worker-rpc)isolation: "sandboxed"with vm (api-sandbox-vm)isolation: "sandboxed"with WASM (api-sandbox-wasm) and exercises the full surface in each tier. Real Postgres viatesting-integration-postgres, real Hono router.
- ADDED: Intentional schema-violation route (
/_/test/fail-response?failResponse=1) to integration-test response validation inenforceandwarnmodes.
Out of scope
- Production-grade business logic — the example's routes do the minimum to exercise the surfaces. They are NOT a billing engine.
- Cross-plugin federation specifics beyond the second-plugin pair used for federation tests.
- A web UI for the example — covered by separate frontend work.
Source mapping
Genesis-original. Source of design intent: docs/superpowers/specs/2026-05-13-api-plugin-foundation-design.md.
| Requirement | Design doc section |
|---|---|
| Reference plugin exercises every capability | §13.5 |
| Routes covering every Section 6 step | §13.5 |
| Migrations across two schema versions | §13.5 |
| Integration test against real Postgres + real Hono | §13.5 |
| Deploys against all three isolation tiers | §15 "What done looks like" |
Verification approach
The example IS the integration test target. The spec is structured so every documented capability is a separate Requirement whose Verified by: cites a concrete integration-test it(...). The integration tests live in this package's tests/integration/ directory and run as part of host CI.
tests/integration/full-flow.integration.test.ts— runs the full surface against all four isolation modes (parameterised over["trusted", "isolated", "sandboxed-vm", "sandboxed-wasm"]).tests/integration/migration-rollback.integration.test.ts— schema-bump upgrade + forced-failure rollback.tests/integration/response-validation.integration.test.ts—?failResponse=1inenforcevswarnmodes.tests/integration/graphql-federation.integration.test.ts— federated query across this plugin and a sibling test plugin.tests/integration/ws-broadcast.integration.test.ts— single-host and multi-host fan-out.tests/integration/saga-2pc.integration.test.ts— owned saga full happy + compensated paths; 2PC vote/commit/abort cycle.
Migration impact
None — additive only. The example serves as the canonical integration target for host CI.