Dashboard › cli › Distillation
70eac109-6a9a-43d5-9143-fee8007cf4a8["lore_tm_v1_Eyk2WZfIhPWvHgOlLe5AShXHym67zyqcIrWExNq3VUU","lore_tm_v1_iMeUkyHKGhbpnQq9vsarfHBd2MMSHq19Ul6354z1kcU","lore_tm_v1_5M3ZVouvluoqUYDU0mKO4xGF5PZwWTVjzxWXL3Sq2Xs","lore_tm_v1_R9LkKOnZN3lKc3hgAk2G_FuA9OVhBTH9g11KRLBwVM8","lore_tm_v1_rUjmeOGO2C-p_axwEUL0VgTjhNVtH79_pXOabRpEbQ8","lore_tm_v1_gNEV_tvWXIOa8dA5ZdmkPb3SLzwzaJvCJkw7tR-7HOg","lore_tm_v1_bVOMnnUvM1G3MzjsWkYujF9swL30XEKJZdDxAWmegSM","lore_tm_v1_hxTroPj2CRQYNJFO64yEWpc2eVOZXbkDBcidXVWdvjQ","lore_tm_v1_XTU0eNFAiBLm84dwyqn1xIb-mzGebLh0YCmBxdVjL3g","lore_tm_v1_16XGJRDHtatCzvkcAcgvi1KieA7eoIxVA2oBOausZW4","lore_tm_v1_LXWb440r4ywLp0Vj0a6yJG8DWJw__QVWwn4IFCKP3m8","lore_tm_v1_OQr70tmEEI6vN7qHFCXe1nZAhOQ4sxawYAqVOe1_DQo","lore_tm_v1_Na2R8x8iOZbp3PwUk-ip3jFQa4SlVd2wY27RoUbGlAI","lore_tm_v1_igq5qXqwuRoMTPFbJ_bitZEARRG619H6XwGabIz3Jyg"]
.github/workflows/ci.yml lines 225β247 define the check job setup with actions/checkout@v6, pnpm/action-setup@v4, actions/setup-node@v6 using ${{ env.NODE_VERSION_22 }}, actions/cache@v5, conditional pnpm install --frozen-lockfile, then pnpm run generate:schema, lint, typecheck, check:deps, check:errors, check:patches, and check:stale-refs; no upgrade-source parity check appears in this sequence.packages/cli/test/lib/binary.test.ts imports resolveUpgradeSource and UPGRADE_SOURCES from ../../src/lib/binary.js.packages/cli/test/lib/binary.test.ts expects UPGRADE_SOURCES in exact order: 1. { githubRepo: "getsentry/toolkit", ghcrRepo: "getsentry/toolkit", tagPrefix: "cli@" }; 2. { githubRepo: "getsentry/cli", ghcrRepo: "getsentry/cli", tagPrefix: "" }.resolveUpgradeSource() tests require: use only https://api.github.com/repos/getsentry/toolkit/releases/latest when the first source returns HTTP 200; fall back to https://api.github.com/repos/getsentry/cli/releases/latest only after Toolkit returns HTTP 404; never fall back on HTTP 401, 403, 429, or 500; never fall back after network TypeError("fetch failed"); and throw "No CLI upgrade source was found" after both sources return HTTP 404.getBinaryDownloadUrl() tests still expect release URLs to begin with https://github.com/getsentry/cli/releases/download/, include the requested version and sentry-, select arm64 only when process.arch === "arm64" and otherwise x64, and append .exe only on Windows.packages/cli/src/lib/errors.ts defines UpgradeErrorReason as "unknown_method" | "unsupported_operation" | "network_error" | "execution_failed" | "version_not_found" | "offline_cache_miss"; UpgradeError extends CliError, uses EXIT.UPGRADE, sets this.name = "UpgradeError" and preserves this.reason.UpgradeError default messages are: unknown_method β "Could not detect installation method. Use --method to specify."; unsupported_operation β "This operation is not supported for this installation method."; network_error β "Failed to fetch version information."; execution_failed β "Upgrade command failed."; version_not_found β "The specified version was not found."; offline_cache_miss β "Cannot upgrade offline β no pre-downloaded update is available.".packages/cli/install.~/.claude/ and ~/.agents/ only β OpenCode is never a target.β Skill source of truth is plugins/sentry-cli/skills/sentry-cli/SKILL.md (602 lines) plus references/ (28 per-command .md files).installAgentSkills() in src/lib/agent-skills.ts installs only to ~/.agents/skills/sentry-cli/ and ~/.claude/skills/sentry-cli/; it must not install to an OpenCode path.OPENCODE_CLIENT environment variable in src/lib/detect-agent.ts only for telemetry, not skill installation; .opencode/ and opencode.json* are gitignored at lines 72β74..cursor/skills/sentry-cli/ and point into plugins/; OpenCode scans ~/.claude/skills/**/SKILL.md and ~/.agents/**/SKILL.md, not .cursor/.installAgentSkills() must not create top-level agent roots because their preexistence is the detection signal that a compatible agent is installed; skills are updated on every version bump, so a write-if-changed optimization is unnecessary..<name>.<pid>.<rand>.tmp followed by rename(), guaranteeing readers βnever observe a partial file.βfeat/toolkit-bridge-upgrade was at commit 0e661a5f50e1fa2bb1f0a66f4607e6901ad53628, matching origin/main and origin/HEAD; the commit subject is fix(org): log region URL parse failures in org list (#1539)..github/workflows/ci.yml generate-patches job runs outside pull requests, needs [changes, build-binary], uses continue-on-error: true, and exports ${{ steps.gen-ghcr.outputs.from-version }} as from-version.BYK/binpatch/action@0.4.2 with mode: generate-ghcr, ${{ needs.changes.outputs.nightly-version }}, registry: ghcr.io, repo: getsentry/cli, binary-glob: 'sentry-*', new-binaries-dir: new-binaries, new-gz-dir: new-binaries, and patches-dir: patches.BYK/binpatch/action@0.4.2 with mode: generate-release, repo: ${{ github.repository }}, binary-glob: 'sentry-*', new-binaries-dir: new-binaries, new-gz-dir: new-binaries, and patches-dir: patches; patch artifacts upload as sentry-patches from patches/*.patch when either generation step reports has-patches == 'true'..github/workflows/ci.yml files or comments on an existing GitHub issue titled "Delta patch generation failed" when patch generation fails, including branch, commit, and workflow-run details.publish-nightly job currently publishes only on pushes to main, needs [changes, build-binary, generate-patches], and uses BYK/binpatch/action@0.4.2 with mode: publish-ghcr, registry: ghcr.io, repo: getsentry/cli, binary-glob: 'sentry-*', artifacts-dir: artifacts, binaries-dir: binaries, patches-dir: patches, and from-version: ${{ needs.generate-patches.outputs.from-version }}.from-version produced by patch generation rather than re-derive it from tags, because binpatch verifies only the final output SHA and a mismatched annotation can silently bypass the expected upgrade path..github/workflows/cleanup-nightlies.yml runs every Sunday at 06:00 UTC via cron "0 6 * * 0" and supports workflow_dispatch; it has packages: write permission..github/workflows/cleanup-nightlies.yml installs ORAS CLI 1.2.3, verifies SHA-256 b4efc97a91f471f323f193ea4b4d63d8ff443ca3aab514151a30751330852827, logs into ghcr.io, and currently prunes only ghcr.io/getsentry/cli.KEEP_COUNT: "30", sorts tags matching ^nightly-[0-9] with sort -V, retains the latest 30, and deletes each older nightly-<version> tag plus corresponding patch-<version> tag using oras manifest delete ... --force; deletion failures are ignored with || true.packages/cli/test/lib/ghcr.test.ts imports UPGRADE_SOURCES and verifies getAnonymousToken(UPGRADE_SOURCES[0]) requests a GHCR token with scope repository:getsentry/toolkit:pull; the default scope remains derived from GHCR_REPO.getAnonymousToken() GHCR tests require token extraction on HTTP 200, UpgradeError with "GHCR token exchange failed: HTTP 401" on HTTP 401, "Failed to connect to GHCR: fetch failed" on network failure, and "GHCR token exchange returned no token" when the JSON response lacks a token.fetchNightlyManifest("token", undefined, UPGRADE_SOURCES[0]) is tested against /v2/getsentry/toolkit/manifests/nightly; default manifest requests require Authorization: Bearer my-token and Accept: application/vnd.oci.image.manifest.v1+json.fetchNightlyManifest() tests require UpgradeError messages 'Failed to fetch manifest for tag "nightly": HTTP 404' on HTTP 404 and 'Failed to fetch manifest for tag "nightly": fetch failed' on network failure.2, media type application/vnd.oci.image.manifest.v1+json, layers sentry-linux-x64.gz (sha256:abc123, size 1000) and sentry-darwin-arm64.gz (sha256:def456, size 1200), version annotation 0.0.0-dev.1740000000, and source annotation https://github.com/getsentry/cli; getNightlyVersion() must return 0.0.0-dev.1740000000.