Dashboard › cli › Distillation
7ddc336c-65c6-40c6-9385-265a0d96a4ff["lore_tm_v1_l1sQCmtX9JQrl9_e1v0DTP7XdKguOz0Yf43_Bv_B6CI","lore_tm_v1_Fm0mC_9jLgSzIII3Nr2ThCx7EXlTuWoV1O2_wapc-go","lore_tm_v1_qyvHMhk-gcRX_4ceQLgdmsoHcSFRSecjlBz1jdilYWo","lore_tm_v1_eWvQnQ0xnjuYZbIsfM1TWfIE3MhIjyK8eHx2CWH7iz0","lore_tm_v1_33QgNRU0K0Cw-1WDiZlRRsyex9J1iF4H0p5ClY0ow04","lore_tm_v1_lbQAFZ-EnAZI5IXaVecqidYuKHWxDN2Evue-8F3OSoA","lore_tm_v1_qrJxU0CP7A_gx5g4YlLF02sF9HO4deG7F8rTvng4gh0","lore_tm_v1_9P0pbmtkuiHj2OWAoBecgw5YgPwVldpkCDcPpAC8PJI"]
gh) lookup returned Not Found (HTTP 404).packages/cli/src/lib/binary.ts: tagPrefix is declared at line 112, the CLI source uses tagPrefix: "cli@" at line 120, the unprefixed source uses tagPrefix: "" at line 125, and line 238 constructs const tag = \${source.tagPrefix}${version}`;`.packages/cli/test/lib/binary.test.ts contains coverage for tagPrefix: "cli@" at line 72 and tagPrefix: "" at line 77.packages/cli/src/lib/delta-upgrade.ts uses githubReleaseSource({ at line 123.packages/cli/package.json declares "binpatch": "^0.4.2" at line 111.packages/cli/src/lib/version-check.ts, maybePrefetchPatches(channel, latestVersion, signal) prefetches only when latestVersion is newer than CLI_VERSION; it calls prefetchNightlyPatches for nightly and prefetchStablePatches otherwise, catches prefetch failures as best-effort debug logs, then opportunistically calls cleanupPatchCache() and also catches cleanup failures as best-effort debug logs.checkForUpdateInBackgroundImpl() in packages/cli/src/lib/version-check.ts is non-blocking and never throws—errors are caught and reported to Sentry. A failure in shouldCheckForUpdate() is sent through Sentry.captureException(error) and returns without crashing the CLI."version-check" with operation "version.check" and forceTransaction: true; nightly checks use fetchLatestNightlyVersion(signal), while stable checks use fetchLatestFromGitHub(signal).setVersionCheckInfo(latestVersion) and prefetches delta patches through maybePrefetchPatches(channel, latestVersion, signal) so sentry cli upgrade can apply them offline.AbortError are recorded as span attributes version_check.error and version_check.error_type rather than via captureException, because network failures, JSON parse errors, GitHub rate limits, and CDN errors are treated as transient infrastructure issues; abort errors are expected during process exit and are not reported.abortPendingVersionCheck() aborts pendingAbortController and resets it to null; the background check also clears the controller and ends its Sentry span in finally.getUpdateNotificationWithCopy() in packages/cli/src/lib/version-check.ts never throws—errors are caught and reported to Sentry—and returns null when stderr is non-TTY, the process has already notified once, no cached latest version exists, the cached version is not newer than CLI_VERSION, the daily cross-invocation rate limit applies, or an error occurs.process.stderr.isTTY, an in-process notifiedThisProcess latch, DB-backed last_notified, NOTIFICATION_INTERVAL_MS, and semverCompare(latestVersion, CLI_VERSION) === 1; lastNotified === null permits a first-ever notification.getUpdateNotificationWithCopy() calls markUpdateNotified() before returning it. A persistence failure is non-fatal: it is reported with Sentry.captureException(error), the banner still prints, and notifiedThisProcess becomes true."New nightly available:", stable uses "Update available:", and both show ${CLI_VERSION} -> ${latestVersion} followed by Run "sentry cli upgrade" to update. Contextual copy says a new sentry-cli version is available and that upgrading may resolve the current issue because many bugs are fixed in every release.resetUpdateNotificationState() sets notifiedThisProcess = false; it is an internal test helper intended to re-exercise first-notification behavior without starting a new process and should not be called from production code.