Home

boring / v2

publicBoring-Software-Inc/v2
Overview Code History Branches Pull requestsIssuesInsights Campfire Docs
main
HomeOverview Code PRsIssues

feat(orgs): checkpoint 1 — org model on Better Auth's plugin, invite links, installation re-key, migration

3 months ago

91a4b63
Authored
grim7/16/2026, 9:07:50 AM
Better Auth organization plugin adopted (two-role AC, creatorRole admin, no
owner tier, deletion disabled plugin-wide). Personal orgs auto-created at
signup via ensurePersonalOrg (direct inserts, hooks refuse all personal-org
mutations). Token invite links on top of the plugin — hashed, maxUses,
revocable, no email; redemption transactional with a guarded increment
(concurrent-redeem tested), existing member = full no-op, beta approval iff
the creating admin is approved at redemption time through the new single
promoteUserAccess path. organization_installations re-keys installs to orgs
((forge, installationId) unique = one install ↔ one org); worker resolves
installation→org→repos with no user assumptions and never auto-claims.
Idempotent backfill (scripts/migrate-orgs.ts) + moveInstallation op.
Server-fn classification list wired into the boundary test.

Routes are still flat — checkpoint 2 is the /:org/:repo URL rewrite.

Parentc2b4125

31 files changed
  • DECISIONS.md+68−0
  • apps/api/src/stream.integration.test.ts+11−0
  • apps/web/src/lib/server-fn-boundary.test.ts+36−0
  • apps/web/src/lib/server-fn-classification.ts+55−0
  • apps/worker/src/jobs/process-event.ts+21−17
  • packages/auth/package.json+3−1
  • packages/auth/src/client.ts+12−0
  • packages/auth/src/org-access.ts+32
−0
  • packages/auth/src/org-gate.ts+60−0
  • packages/auth/src/org-invariants.integration.test.ts+249−0
  • packages/auth/src/server.ts+128−1
  • packages/contracts/src/events.ts+6−0
  • packages/contracts/src/index.ts+1−0
  • packages/contracts/src/org.test.ts+92−0
  • packages/contracts/src/org.ts+117−0
  • packages/db/drizzle/0006_dusty_black_bird.sql+70−0
  • packages/db/drizzle/meta/0006_snapshot.json+2154−0
  • packages/db/drizzle/meta/_journal.json+7−0
  • packages/db/package.json+2−1
  • packages/db/src/backfill-orgs.ts+111−0
  • packages/db/src/index.ts+10−0
  • packages/db/src/schema/auth.ts+7−0
  • packages/db/src/schema/index.ts+1−0
  • packages/db/src/schema/organizations.ts+163−0
  • packages/db/src/schema/repos.ts+10−0
  • packages/db/src/services/access.ts+47−0
  • packages/db/src/services/organizations.integration.test.ts+545−0
  • packages/db/src/services/organizations.ts+689−0
  • packages/db/src/services/repos.ts+9−0
  • packages/forge-github/src/webhook/normalize.ts+11−2
  • scripts/migrate-orgs.ts+26−0