feat(dsn): add automatic DSN detection with caching#11
Merged
Conversation
Adds a new DSN detection module that automatically finds Sentry DSN from environment variables, .env files, and JavaScript/TypeScript code. Features: - Fast path (~5ms): verifies cached DSN source file - Slow path (~2-5s): full scan when cache miss - Conflict detection: warns when multiple different DSNs exist - Project resolution caching: stores org/project info to skip API calls Detection priority: 1. SENTRY_DSN env var (instant) 2. .env files (.env.local, .env, .env.development, etc.) 3. Source code (Sentry.init patterns) The module is structured for extensibility to support other languages (Python, PHP, etc.) in the future.
Updates issue and project commands to use DSN auto-detection: - issue list: shows available projects when none specified - issue get: uses DSN to resolve org for short ID lookups - project list: scopes to detected org, shows hint about --org flag When no org/project is specified and DSN is detected, commands now show 'Detected from .env.local' to indicate the source.
Adds comprehensive tests for: - Cache read/write operations - DSN detection with caching behavior - Cache updates when DSN changes - Conflict detection with multiple DSNs - Env var priority over cached values
BYK
added a commit
that referenced
this pull request
Mar 4, 2026
…parallelize cleanup Review Round 3 — 15 human review comments addressed: #1: login.ts — Replace await .catch() with proper try/await/catch blocks #2: whoami.ts + all commands — Export FRESH_ALIASES constant from list-command.ts to reduce boilerplate; update 15 command files to use it #3: response-cache.ts — Bump immutable TTL from 1hr to 24hr (events/traces never change once created) #4–6: response-cache.ts — Restructure URL_TIER_PATTERNS as Record<TtlTier, RegExp[]>, combine duplicate regex patterns into single alternations #7: response-cache.ts — Replace localeCompare with simple < comparison for ASCII URL query param sorting #8: response-cache.ts — Remove try-catch in normalizeUrl (URLs reaching the cache already came from a fetch, always valid) #9: response-cache.ts — Link immutableMinTimeToLive to FALLBACK_TTL_MS.immutable instead of hardcoded magic number #10: response-cache.ts — Use Object.fromEntries(headers.entries()) instead of manual forEach loop #11: response-cache.ts — Remove unnecessary await on fire-and-forget unlink in catch block #12: response-cache.ts — Add expiresAt field to CacheEntry for O(1) expiry checks during cleanup (no CachePolicy deserialization needed) #13–15: response-cache.ts — Parallelize cache I/O (collectEntryMetadata, deleteExpiredEntries, evictExcessEntries) using p-limit-style concurrency limiter (max 8 concurrent)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds GitHub CLI-inspired DSN auto-detection to the Sentry CLI. When users run commands like
sentry issue listfrom a project directory, the CLI now automatically finds the Sentry DSN and resolves org/project without requiring--organd--projectflags.Problem
Users had to manually specify
--organd--projectflags for every command, or configure defaults. This is tedious, especially when the DSN is already in their project's.envfile or source code.Solution
New DSN detection module that:
Detects DSN from multiple sources (in priority order):
SENTRY_DSNenvironment variable.envfiles (.env.local,.env,.env.development, etc.)Sentry.init({ dsn: "..." }))Caches for speed:
Handles conflicts: warns when multiple different DSNs are found
Changes
src/lib/dsn/src/commands/issue/list.tssrc/commands/project/list.tssrc/types/config.tsdsnCacheschema for storing cached entriesExample Output
Testing