Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
1 Skipped Deployment
|
This was referenced Sep 29, 2026
Keep sentry-client.ts identical to #1649 so merging it leaves no diff here. A final-attempt 401 now returns the response, which makes retry: false a plain single-attempt loop without its own code path. Co-authored-by: Cursor <cursoragent@cursor.com>
betegon
added a commit
that referenced
this pull request
Sep 29, 2026
## Summary Bumps `@sentry/api` from 0.256.0 to 0.337.0. #1559 needs the issue-linking operations and the `expectedExternalIssueUrl` guard that ship in the newer schema; landing the bump on its own keeps that PR focused on the feature. No source changes were needed. The only regenerated file is the `event` skill reference, which now lists the `formatted` field the schema documents for `event view`. ## Validation - `tsc --noEmit` and lint pass. - Unit suite: 473 files, 10,092 passed / 17 skipped (`TZ=UTC`). Split out of #1559. Co-authored-by: Cursor <cursoragent@cursor.com>
Remove assertions on code the commands never call, a flag that never shipped, OAuth scope and transport retry behavior covered elsewhere, and duplicated JSON/error wrapper checks. Formatter states move to one table test instead of being asserted from three layers. Co-authored-by: Cursor <cursoragent@cursor.com>
The four listings that authorize a link mutation each hand-rolled an all-or-nothing page loop with different errors, and only one detected repeated cursors. fetchAllPages validates every page and fails on an invalid page, a repeated cursor or the page limit. Error messages now name the listing, and running out of pages is an ApiError rather than a ValidationError. Co-authored-by: Cursor <cursoragent@cursor.com>
Three modules each checked for an HTTP(S) URL without credentials, with different messages; parseHttpUrl now does that check. Link and unlink had near-identical native and App branches that built their results separately. Each action now has one path: planLink and findStoredLink isolate the backend differences, and results are built in one place. A dry run of an existing App link now reports its identifier, like native links already did. Co-authored-by: Cursor <cursoragent@cursor.com>
issue link repeated resolveOrgAndIssueId's organization check only to read the project ID. The helper now returns it, so link and unlink share the resolver and its error hint. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit a8ed74a. Configure here.
Installation selection and URL alias matching are pure, but most cases went through mocked fetches for a resolve and a PUT that were identical in every case. selectNativeIntegration is now exported, so both run as table tests. The HTTP contract keeps one test per behavior, and one end-to-end test covers link and unlink through the orchestration layer. Co-authored-by: Cursor <cursoragent@cursor.com>
GitLab resolves group and project paths case-insensitively, so a link stored as /MyOrg/proj/-/issues/7 must match /myorg/proj/-/issues/7 when unlinking. GitHub and Bitbucket paths were already compared in lowercase. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
This branch was successfully deployed
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.

Adds
sentry issue link/unlink <issue> <url>for existing tracker issues and GitHub pull requests, with dry-run and JSON output. Unlink removes the stored Sentry association without fetching or deleting the remote ticket. Neither command changes the Sentry issue's status.All requests use the generated
@sentry/apioperations. Native integrations receive the full URL; the backend resolves provider identifiers and repositories. The CLI selects the installed integration and matches stored aliases for dry-run/unlink. Supports GitHub/GHE, GitLab, Jira/Jira Server, Bitbucket, and Azure DevOps; ambiguous installations require--integration.Link always submits the mutation, including when preflight finds an existing association: a concurrent unlink can remove it before the write. HTTP 201/200 determines
changed, and an already-absent unlink succeeds without a mutation.Linear and other installed Sentry Apps use their issue-link forms, including choices, defaults, dependencies, and explicit
--fieldvalues. This resolution remains in the CLI because the backend does not provide a URL-to-form resolver. Actions sendexpectedExternalIssueUrlto prevent replacements and mismatched callback URLs. Existing links use their stored canonical URL; new links require the exact tracker URL, including its title suffix. Callback POSTs are not retried automatically because external effects can precede persistence.Discovery bypasses cached responses and requires complete pagination. Both commands use
event:writeand project access; App discovery also needsorg:read. These scopes are already in the default OAuth login. Older self-hosted versions need the corresponding backend URL/guard support.Validation:
--fieldvalues.TZ=UTC.changed: false; the rebuilt bundle's dry-run passed. No production unlink/delete was run.Backend follow-up: App DELETE addresses an association ID without an expected-URL precondition. A concurrent replacement of that record by a legacy unguarded client still needs a conditional-delete API change; another CLI preflight cannot make it atomic.