feat: self-hosted OAuth metadata + granular scopes, drop OAUTH_CLIENT_ID
- metadata.ts: shared buildClientMetadata(appUrl) + OAUTH_SCOPE constant.
Single source of truth for both the metadata route and NodeOAuthClient.
- OAUTH_SCOPE: replace transition:generic with granular read-only scopes
(atproto + rpc:getFollows + rpc:searchPosts). Understory never writes.
- /oauth/client-metadata.json route: serves metadata to PDS servers.
- client.ts: derives client_id from APP_URL (no OAUTH_CLIENT_ID env var).
- login/route.ts: uses OAUTH_SCOPE constant instead of hardcoded scope.
- Eliminates the cimd-service.fly.dev dependency for auth.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>