Release v0.2.0
Fixed
- Seat limits now enforced at invite acceptance —
acceptInvitepreviously documented seat enforcement ("join time") but never called the billing adapter. It now counts the org's memberships and runsbilling.assertSeatAvailable(orgId, count)before the single-use claim, so a full org never burns an invite it cannot honor. createBillingAdapterguards invalidMOCK_PLAN_SEATS— a non-numeric value previously produced aNaNseat limit that silently allowed unlimited joins; it now falls back to the default (3).
Added
- Service-level test suite — 51 new tests across
tests/orgs-members.test.ts,tests/invites-seats.test.ts,tests/billing.test.ts,tests/audit.test.ts, backed by an in-memory fake Supabase client (tests/helpers/fake-supabase.ts). No database or network needed; suite 24 → 75 tests. - Documentation:
docs/architecture.md,docs/rbac.md,docs/billing.md,docs/testing.md
Changed
- README/AGENTS/CLAUDE testing sections updated to the real suite layout and count
Full change history: CHANGELOG.md