Dashboard › cli › Distillation
34731df7-56d5-4a6f-bb19-c979177871cb["lore_tm_v1_e5fIjXhjcQ77tnrO7Mg8vvh7LXXzT9H0jYWc6VTknAI","lore_tm_v1_Ey1q9GSA5cGdELwwI7IKKDCBYlqNRt2ZW6x-pngaiZo","lore_tm_v1_LB7SEtRyTbR5MTZEQn_ZmqGBWxMrlxoDzwYV3k1_nho","lore_tm_v1_uLbguz3_uftaUwmLrc95NlNrBE4y2-W_OGJSWAl_43s","lore_tm_v1_0WkUhFS_oNscGsdfF-25etqyaIqkYju6sab0if8izCY","lore_tm_v1_JTmZXnX6TDstz2IdKF6w8YnTq3z5SjK9-4iFQ0cSy1M","lore_tm_v1_KoxwTrZvgGpOueLfOHeehJpw-3mikPJ94jWL3z8vGuE","lore_tm_v1_mw_1N6-qEToCvwaXHuiI9Py2JvBF9D0By13hJLVJx8U","lore_tm_v1_ntmd3pKq5jQkVNW5rLCl9LTVpErmCSxSxdFPery-WX4"]
Date: Sep 9, 2026
"internal", "docs", or "documentation" categories.packages/cli/test/lib/release-notes.property.test.ts, which uses fast-check, Vitest, and DEFAULT_NUM_RUNS to enforce 9 properties: 1. extractSections() output categories are always "features", "fixes", or "performance"; 2. Internal Changes and Documentation categories never appear; 3. empty or whitespace-only bodies return []; 4. bodies containing only filtered sections return []; 5. parseCommitMessages() passes only feat/fix/perf; 6. commits containing #skip-changelog are always filtered; 7. non-conventional commits produce no output; 8. valid nightly versions round-trip through extractNightlyTimestamp(); 9. stable versions return null.packages/cli/test/lib/release-notes.property.test.ts: kept headers are ### New Features β¨, ### Bug Fixes π, and ### Performance; filtered headers are ### Internal Changes π§, ### Documentation π, ### Refactoring, ### Tests, and ### Chores; generated section bodies contain 1β5 list items; generated release bodies contain 0β3 kept sections and 0β2 filtered sections.feat, fix, perf, docs, refactor, chore, test, ci, and meta, with scopes "", "(dashboard)", "(issue)", or "(api)"; generated commit arrays contain 1β20 entries.${major}.${minor}.${patch}-dev.${ts}, with major from nat(30), minor and patch from nat(100), and ts no greater than 2_000_000_000.packages/cli/src/lib/binary.ts: 1. { githubRepo: "getsentry/toolkit", ghcrRepo: "getsentry/toolkit", tagPrefix: "cli@" }; 2. fallback { githubRepo: "getsentry/cli", ghcrRepo: "getsentry/cli", tagPrefix: "" }. PRIMARY_UPGRADE_SOURCE is UPGRADE_SOURCES[0].resolveUpgradeSource() behavior in packages/cli/src/lib/binary.ts: probe UPGRADE_SOURCES in order, fall through only on HTTP 404, abort immediately on every other HTTP or network failure, preserve AbortError, map TLS certificate failures through buildTlsErrorDetail(), and return both the selected source and successful response so the caller never repeats the probe request.packages/cli/src/lib/binary.ts: getBinaryDownloadUrl() uses ${source.tagPrefix}${version}; getGitHubReleasesUrl() returns https://api.github.com/repos/${source.githubRepo}/releases; getGitHubReleaseByTagUrl() URL-encodes the source-specific tag; getGitHubLatestReleaseUrl() uses ?per_page=100 for prefixed sources and /latest otherwise; getGitHubRepositoryUrl() returns https://api.github.com/repos/${source.githubRepo}.detectInstallationMethod() in packages/cli/src/lib/upgrade.ts must always check Homebrew first because stored installation information may be stale; the cheap, authoritative isHomebrewInstall() realpath check overrides stale stored data, such as when a user switches from a recorded curl installation to Homebrew.packages/cli/src/lib/upgrade.ts: 1. Homebrew realpath check, 2. stored DB install info, 3. legacy detection via curl paths, subprocess calls, then node_modules path, 4. best-effort persistence with setInstallInfo({ method: legacyMethod, path: process.execPath, version: CLI_VERSION }); a read-only or broken DB must not block detection.fetchLatestFromGitHub() implementation in packages/cli/src/lib/upgrade.ts: it requests ${GITHUB_RELEASES_URL}/latest, requires response.ok, requires data.tag_name, and strips VERSION_PREFIX_REGEX before returning the version.fetchLatestVersion() in packages/cli/src/lib/upgrade.ts: nightly uses fetchLatestNightlyVersion(); stable "curl" or "brew" uses fetchLatestFromGitHub(); other package-manager methods use fetchLatestFromNpm().packages/cli/src/lib/upgrade.ts: fetchLatestNightlyVersion() performs 2 HTTP requestsβanonymous GHCR token exchange and OCI manifest fetchβand extracts the version annotation; nightlyVersionExists() checks nightly-${version} and returns false only for HTTP 404 or 403, while other errors propagate.packages/cli/src/lib/delta-upgrade.ts: fetchRecentReleases() requests ${GITHUB_RELEASES_URL}?per_page=12 with GitHub v3 JSON and User-Agent: sentry-cli/${CLI_VERSION}, returns [] for non-OK responses, non-array JSON, or caught failures, and otherwise returns GitHubRelease[].packages/cli/src/lib/delta-upgrade.ts: stableSource() uses githubReleaseSource() with GITHUB_RELEASES_URL, getPlatformBinaryName(), customFetch, and tracing instrumentation; nightlySource() uses ghcrSource() with registry https://ghcr.io, imported GHCR_REPO, target tag nightly-${version}, compareVersions, customFetch, and tracing instrumentation.GHCR_REPO into packages/cli/src/lib/delta-upgrade.ts maintains a single source of truth and avoids the silent HTTP 404 previously caused by a string literal.packages/cli/src/lib/delta-upgrade.ts: prefetch() exits when canAttemptDelta(targetVersion) is false or the signal is aborted, resolves a chain from CLI_VERSION to targetVersion, requires chain.steps, and saves it through getPatchCache(); prefetchNightlyPatches() and prefetchStablePatches() delegate with nightlySource() and stableSource() respectively.feat/toolkit-bridge-upgrade, which was behind origin/main by 2 commits and had 5 modified files: packages/cli/src/lib/binary.ts, packages/cli/src/lib/ghcr.ts, packages/cli/test/lib/binary.test.ts, packages/cli/test/lib/ghcr.test.ts, and packages/cli/test/lib/install-script.test.ts.