Conversation
|
Important Review skippedWe couldn't safely recover the incremental review. No full review was started, and the last reviewed checkpoint was preserved. Retry later, or explicitly request a full review by commenting You can disable this status message by setting the Use the checkbox below for a quick retry:
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThis pull request adds a cross-provider issue tracking system for GitHub, GitLab, Bitbucket, Azure DevOps, and Linear. It adds an issue service with caching, work item matching and task generation across text generation providers, pull request to issue linking, and the related web UI, state management, routing, and contract changes. It also includes small unrelated fixes. ChangesIssue Tracking Feature
Priority: ➖ Normal Estimated code review effort: 5 (Critical) | ~180 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant ChatView
participant IssuesPanel
participant IssueService
participant IssueProviderRegistry
participant IssueAdapter as "Provider Adapter (GitHub/GitLab/Bitbucket/AzureDevOps/Linear)"
User->>ChatView: Open issues surface
ChatView->>IssuesPanel: Render list request
IssuesPanel->>IssueService: list(projectId, filters)
IssueService->>IssueProviderRegistry: resolveProjects(projects)
IssueProviderRegistry-->>IssueService: supported project sources
IssueService->>IssueAdapter: listIssues(input)
IssueAdapter-->>IssueService: ProviderIssuePage
IssueService-->>IssuesPanel: IssueListResult
IssuesPanel-->>User: Render issue rows
sequenceDiagram
participant User
participant WorkItemSelectionBar
participant WS as "ws.ts RPC"
participant TextGeneration
participant WorkItemMatching
User->>WorkItemSelectionBar: Select work items and click Create task
WorkItemSelectionBar->>WS: workItemsGenerateTask(items, mode)
WS->>TextGeneration: generateWorkItemTask(prompt input)
TextGeneration-->>WS: WorkItemTaskGenerationResult
WS-->>WorkItemSelectionBar: prompt draft
WorkItemSelectionBar->>WS: workItemsFindMatches(source, relationship)
WS->>WorkItemMatching: shortlistWorkItemCandidates(candidates)
WS->>TextGeneration: findWorkItemMatches(source, shortlist)
TextGeneration-->>WS: WorkItemMatchGenerationResult
WS->>WorkItemMatching: resolveWorkItemMatches(generated)
WS-->>WorkItemSelectionBar: resolved matches
Merge Risk: 🟠 High · up to Valid requests can fail, provider content may induce repository reads during generation, and several issue and pull-request actions remain unreliable. These material problems should be fixed before merge. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 43.48% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 322 functions across 134 files. (21 skipped: 2 unsupported, 19 over the file limit.) ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Reviewed the new Effect service modules under apps/server/src/issue/ (CLI/API wrappers, providers, registry, IssueService), the touched pull-request services, and the contracts/client-runtime additions against the Effect service conventions.
Service shape, layer composition, dependency acquisition (yield* Foo.Foo), namespace imports, Foo["Service"] references, and the runtime boundaries in server.ts/ws.ts all follow the conventions. Two error-modelling findings in the new Azure DevOps issue modules are noted inline.
Posted via Macroscope — Effect Service Conventions
A host reports a link only where somebody used a closing keyword or cross-referenced the issue, so a pull request whose body says "part of #12" showed no linked issue at all — which is what our own pingdotgg#6315 does. The title and body are now read for references too, outside code spans and fences, and each one is resolved against the host before it is shown: a number in a body is not proof an issue exists. What resolves is listed as cited, never as closing — only the host can say what merging will close — and the host's own links always win. Bounded at ten, and a failed resolve leaves the host's own links standing rather than failing the read.
Reading and writing the last list for an environment was copied whole: the same key, the same guarded storage, the same page of rows kept and the same refusal to cache a failure or a cursor. What a row is arrives as the caller's schema and what the key is called as its prefix; the priority groups are sliced by whatever the surface files them under, so Assigned and Reviewing need no name here.
Closing the dialog put the chooser back but kept the title, body, labels, assignees and the project that had been picked, so the next "New issue" could open straight onto a discarded draft — on a repository with no chooser, one keypress from filing it.
The guard was `filing`, which is only true a render later: a double click or a held ⌘ Enter got through it twice and filed the same issue twice.
⌘ Enter on the starting points filed an issue from whatever was still in the boxes: the Create button is absent there, but the shortcut is not, and `canFile` never asked whether a starting point had been taken.
Two fixes that landed in one commit while several agents worked this branch at the same time. Azure DevOps: the provider's `detail` copied `cause.message`, and its own message is derived from that detail, so a failure said the same sentence twice. It reads the error's own `detail` now, like every other provider here. GitLab: a continuation offset into the listing by a row count, so an issue touched between two reads shifted every row past the boundary. It carries on from `updated_before` instead, inclusively, which is what the other two hosts already do; the service drops the rows it has already sent.
|
Addressed the audit blockers in this revision:
All 16 Macroscope threads were verified and addressed or explained. Current-main conflict resolution retains the PR-panel action fix. Focused tests, 195 server integration tests, and scoped server/web typechecks pass. Final head A fresh Macroscope correctness pass is currently blocked by the workspace cost limit (estimated $52.91 against $15 per review). Approvability also requires human review of the feature. No review budget or protection settings were changed. CodeRabbit was skipped as requested by the contributor. |
Re-audit of e1714fdVerdict: the architectural blockers from the first audit are resolved. What's left is a merge conflict, the three carve-out PRs, and one contract question worth deciding before the tracker shape freezes. CI is green on this head (Check, Test, all three server shards, Rust, Release Smoke). Macroscope skipped its correctness pass on cost grounds, so no bot has reviewed this head. The five "fix first" items
New since the last audit
Still open, non-blockingUnchanged from the first pass: the copy-pasted SWR/epoch cache and unknown-kind refinement between Verification limitsRead-only. I verified the migration removal, RPC/settings shape, capability additions, kind-branch count, docs text, and conflict state directly against e1714fd. I did not re-read the adapter bodies, the test delta, or the three carve-out branches. No browser run. |
|
Follow-up to the re-audit:
Validation: 480 focused tests pass, including shared writes, chat/PR-panel logic, and keyboard shortcuts. The scoped web typecheck passes. CI passes on |
Resolves the PullRequestTimelineTab import conflict by keeping the shared sourceControl timeline pieces and adopting PullRequestEditButton from main, and renames Config.string to Config.String for the Effect rc.115 bump. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
@Bil0000 Following up on your invitation to stack the Repository proposal on this PR: I refreshed against your current Each shows only its own layer. The first targets your Issues branch; the remaining three target the preceding branch in my fork. I tested every cumulative layer on a dev server, including paging, file diffs, tab state, and shared issue filters. The unrelated general fixes remain separate. Short interaction demo. Current screenshots and verification limits are in the descriptions. The old combined proposal is superseded, with its original images and discussion preserved. Does History and the combined Repository pane fit the direction you want as a follow-up to #6315? The server and History layers are still substantial; this split is intended to make their dependencies and review scope clear. |
|
@coderabbitai review |
|
|
Fixed the two follow-up UI issues in e3f160f and e7f9a9c:
Merged current main separately in d6cc1d1 to resolve the PR conflicts while preserving issue links and current PR actions. Verified: 276 focused tests, web typecheck, scoped lint, and real-app checks for hover, bulk selection, keyboard selection, form validation/cancel, and both link directions at desktop and phone sizes. CI is green on e7f9a9c. CodeRabbit skipped due to an incremental-review checkpoint error; Macroscope skipped due to the PR cost limit. |
Adds an Issues workspace for GitHub, GitLab, Bitbucket, Azure DevOps, and Linear. Provider adapters expose one issue model for browsing, search, filters, details, comments, supported writes, and agent handoffs. Issue and pull-request views link related work.
Tracker connections use provider-neutral
issueTrackers.*RPCs andissueTracking.connections, with credentials stored on the server. Linear account and project-team selection live in Settings → Integrations → Issue Tracking. Sort support, reference style, and closing-via-PR behavior come from provider capabilities. Migration code for unshipped branch states has been removed.Known limits and follow-ups:
Validation from the prior revision: focused contract, provider, settings, prompt, and client tests; 195 server integration tests in an isolated network; scoped server and web typechecks; 149 focused PR-panel tests after integrating current main; 51 shared-write tests. CI covers the full suite. No fresh browser or live-tracker write pass was run for these audit fixes.
Prior UI evidence was captured locally. Its upload was blocked because the required official GitHub attachment-preview artifact had expired.
September 19 review fixes
link_issue,unlink_issue, andlist_thread_issues. Threads show linked issues with open/unlink actions; issues show linked threads.Validation: 148 focused web tests, 220 focused issue-link/backend tests, all 15 MCP HTTP integration tests, and 391 merge-related tests passed. Scoped web/server typechecks, lint, formatting, and per-commit Ponytail reviews passed. Full CI is green on
6c92b1a370. GitHub reports CLEAN and MERGEABLE; all 144 review threads are resolved. CodeRabbit could not recover its incremental-review checkpoint, and Macroscope skipped correctness review because of the workspace cost cap. No fresh bot approval is claimed.Browser limitation: the isolated server responds, but the built-in Browser panel cannot reach its loopback/environment-port target (
ERR_CONNECTION_REFUSED). No fresh browser or live-tracker write verification is claimed, and no after-image/video was captured.Direct PR–issue links
link_issue_to_pull_request,unlink_issue_from_pull_request, andlist_issue_pull_request_links.Validation: 48 focused tests passed across the web controls, saved-link store, MCP handlers and HTTP server, WebSocket route, environment capability, and authorization. Scoped contracts/server/web typechecks, lint, formatting, and per-commit Ponytail reviews passed. Full CI is green on
475b025972. GitHub reports CLEAN and MERGEABLE; all 144 review threads are resolved. Fresh bot review remains limited: CodeRabbit is paused after its checkpoint failure, and Macroscope skipped correctness review under its workspace cost cap.Browser limitation remains: the built-in panel fails to reach the isolated frontend while local HTTP returns 200. No fresh visual or live-host write verification is claimed. Saved-link lists show at most 100 links and explicitly report truncation; cross-client changes use the refresh control.
Model: GPT-6 Astra, with Sol and Luna for bounded tasks. Harness: Codex.
Note
Add pluggable issue adapters and workspace issue browsing UI
IssueServicewith per-provider adapters for GitHub, GitLab, Bitbucket, Azure DevOps, and Linear, each implementingIssueAdapterwith provider-specific capabilities, viewer permissions, caching, and error normalization/issuesroute with list/filter/search/snapshot,IssueDetailPanelwith summary and timeline tabs,LinearConnectionDialog,IssueCreateDialog, label/assignee pickers, reactions, and work-item multi-selection with AI task generation viaWorkItemSelectionBar"n- Extracts shared source-control components (ListRow,ListEmptyState,ConversationGroup,TimelineComment,HostMarkdown,CommentComposer,EntityPicker,ListFilterMenu,SourceControlReactionBar) from pull-request-specific implementations and refactors PR panels to use themServerSettingsnow includes anissueTrackingsection andPullRequestDetailcarrieslinkedIssues; out-of-tree consumers expecting the prior shapes will need updating.RIGHT_PANEL_STORAGE_VERSIONbumps to 13 with migration that drops legacy:issues-panelstate.ServerSecretStore.makeremoves an extrachmod(0600)call.writeFileStringAtomicallyno longer requires aScope.📊 Macroscope summarized b075ac0. 135 files reviewed, 56 issues evaluated, 39 issues filtered, 15 comments posted
🗂️ Filtered Issues
apps/server/src/issue/BitbucketIssueApi.ts — 1 comment posted, 2 evaluated, 1 filtered
commentsPagediscards thesizereturned bydecodeIssueCommentsJsonand exposes only the retained comments. The provider consequently usespage.comments.lengthascommentCount; deleted or blank comments are filtered out and the walk stops after ten pages, so an issue's displayed comment count is silently too low (and cannot indicate its actual total). [ Out of scope (post-validation triage) ]apps/server/src/issue/BitbucketIssueProvider.ts — 0 comments posted, 3 evaluated, 3 filtered
listIssuesdropsinput.involvementwhen it callsapi.listIssues, so Bitbucket receives identical requests for theall,assigned, andcreatedfilters. Selecting an involvement filter therefore still returns every matching Bitbucket issue instead of only issues assigned to or created by the viewer. [ Out of scope (triage) ]listIssuesalso omitsinput.sortandinput.order, leavingBitbucketIssueApito always request-updated_on. The UI exposes created/updated ascending and other sort modes; for a repository larger than the page, it receives only the most recently updated slice, then the service cannot issue a continuation for a non-updated descsort. Thus, for example, "created: oldest" omits the actual oldest issues rather than merely displaying them in the wrong order. [ Out of scope (triage) ]getIssueActivityreportspage.comments.lengthascommentCounteven whenpage.truncatedis true.BitbucketIssueApistops after ten 50-comment pages, so an issue with more than 500 comments is displayed as having only the fetched subset (at most 500), despite the activity contract requiring the host's count when a bounded read falls short. [ Out of scope (post-validation triage) ]apps/server/src/issue/GitHubIssueCli.ts — 0 comments posted, 1 evaluated, 1 filtered
GitHubIssueCommentScopeErroris also returned bysetReactionwhen a supplied comment belongs to another issue, but itsmessagealways identifies the operation asupdateComment. That failed reaction is therefore reported to users as a comment-edit failure, giving the wrong operation and remediation context. [ Out of scope (post-validation triage) ]apps/server/src/issue/GitLabIssueCli.ts — 1 comment posted, 4 evaluated, 3 filtered
cursorParamscarries onlyupdatedBeforeand no offset for rows already returned at that inclusive timestamp. If more than one page of GitLab issues has the sameupdated_at, each continuation fetches the same firstlimit + 1rows;IssueServicefilters them asseenAtand produces the same cursor again, so older issues never become reachable and pagination can repeatedly return an empty page. [ Already posted ]linkedMergeRequestsstops afterLINKED_PAGESfull responses but returns only an array, with no truncation indicator. An issue with more than 500 links from either endpoint silently omits all later merge requests, so the linked-PR panel presents incomplete data as complete. [ Out of scope (post-validation triage) ]listIssueTemplatesslices the project’s template entries toTEMPLATE_LIMITbefore fetching them and the returnedIssueTemplateListcontains no truncation signal. Projects with more than 25 issue templates silently make every later template unavailable in the creation UI. [ Out of scope (post-validation triage) ]apps/server/src/issue/gitHubIssueJson.ts — 1 comment posted, 2 evaluated, 1 filtered
toStateReasondrops GitHub's validDUPLICATEstate reason intonull. GitHub documentsDUPLICATEas anIssueStateReason, so closed issues marked as duplicates are presented as having no close reason rather than being distinguished from completed or not-planned issues. [ Out of scope (post-validation triage) ]apps/server/src/pullRequest/GitHubPullRequestProvider.ts — 0 comments posted, 3 evaluated, 3 filtered
parseIssueReferencesbeforeunlinkedIssueReferencesremoves links GitHub already supplied. Thus, if the first ten references are host-reported closing/cross-reference links and a new valid citation appears later in the PR text, that later citation is never looked up or shown. The intended request budget should be applied after existing host links are removed. [ Cross-file consolidated ]listCitedIssuesperforms all parsed references in one GraphQL document, and its implementation fails the whole batch when any cited number does not exist. Because this call converts that failure to[], a PR that mentions both a valid issue and an invalid/stale#reference loses the valid related issue as well, rather than showing the independently resolved valid link. [ Out of scope (triage) ]listLinkedIssuesfails (for example, a GitHub GraphQL permission or transient error), this fallback markstruncatedasfalse. The returned detail then says the linked-issues list is complete and the UI suppresses its “More linked issues exist on the host”/incomplete indicator, even though no host links were read; the GitLab provider correctly usestruncated: truefor the equivalent failure path. [ Out of scope (post-validation triage) ]apps/server/src/pullRequest/issueReferences.ts — 0 comments posted, 6 evaluated, 6 filtered
withoutCoderecognizes fences only at the physical line start, so a fenced block inside a Markdown block quote (for example> ````,> Add native context menu to delete threads #12,> ````) is retained and#12is incorrectly added as a cited issue. Fenced code blocks are valid inside block quotes; strip container prefixes before detecting their fences. [ Out of scope (post-validation triage) ]withoutCodedoes not remove indented Markdown code blocks. A body containing a four-space-indented sample such as#12leaves the number in the prose and creates a cited issue, even though indented blocks render as literal code just like the fenced blocks this function excludes. [ Out of scope (post-validation triage) ]withoutCoderemoves an apparent inline span by allowing the opening(``+)capture to backtrack to a shorter delimiter. For valid Markdown such assee #12 ` examplethe two-backtick span contains a single backtick, but this regex removes only the opening pair and leaves#12to be treated as a citation. Inline code spans must close with an equal-length delimiter run, so parse the delimiter length without backtracking. [ Out of scope (post-validation triage) ]parseIssueReferencesscans and adds every URL before it scans any textual reference in the same title/body. Consequently, text such asSee #7 and https://github.com/acme/web/issues/9returns#9before#7, contradicting the documented written-order contract and changing the order in which cited issues are displayed. [ Out of scope (post-validation triage) ]parseIssueReferencesapplies the ten-reference limit beforeunlinkedIssueReferencesremoves issues already returned by the host. A body with ten host-linked closing references followed by a distinct cited issue returns only the first ten, which are then all filtered out, so the distinct issue is never looked up or shown despite requiring just one lookup. Limit the unlinked references instead. [ Already posted ]apps/web/src/components/issue/IssueAssigneePicker.tsx — 0 comments posted, 1 evaluated, 1 filtered
allstill contains the pre-writeisAssignedflags until the candidates refresh completes. If the user immediately toggles another person,nextis rebuilt from that stale list and the second replacement write omits the first person (for example, assign Ada, then immediately assign Grace sends only Grace), silently undoing the first assignment. [ Already posted ]apps/web/src/components/issue/IssueCreateDialog.tsx — 1 comment posted, 2 evaluated, 1 filtered
hasChoiceignoresoffer.blankIssuesEnabled, so a repository whose template config disables blank issues but has no templates or contact links is treated as having “nothing to choose” and is forced into the blank composer. The create service only checks the provider capability, not this repository setting, so this path files an issue even though the repository explicitly disallowed blank submissions. [ Already posted ]apps/web/src/components/issue/IssueLabelPicker.tsx — 0 comments posted, 1 evaluated, 1 filtered
written.baseremains the originalappliedKeyafter every successful toggle. If a user adds B, then adds C before the detail refresh from the B write returns, that first refresh supplies[A, B]; it no longer matches the original base[A], socurrentreverts to[A, B]even though C was just successfully written. A subsequent toggle then sends a replacement set built without C, silently removing C from the issue. [ Already posted ]apps/web/src/components/issue/IssuesPanel.tsx — 0 comments posted, 2 evaluated, 2 filtered
orderedstill contains the first page, but a failed query hasdata === null; this condition therefore replaces those retained entries withIssuesUnavailableState. The user loses access to successfully loaded issues and the only retry repeats the failed continuation, despite the component's pagination logic explicitly retaining the prior rows. [ Already posted ]IssueServicereturns a successfulIssueListResultwith an emptyentriesarray and a populatederrorsarray. This component ignoresanswered.errors, so line 444 renders “This repository has no issues to open” instead of an unavailable/error state, falsely presenting an unreadable tracker as an empty repository. [ Exceeded comment limit ]apps/web/src/components/issue/issueList.logic.ts — 0 comments posted, 1 evaluated, 1 filtered
filterIssueQueryResultsdecides that a row was searched fromentry.hostalone. The contracts explicitly allow two adapters on one host, but callers buildsearchingHostsfrom a provider'shost; if one adapter searches remotely and the other does not, every row for that host is retained as a presumed host match. A query can therefore show nonmatching issues from the non-searching provider instead of applying the required local filter. [ Exceeded comment limit ]apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx — 0 comments posted, 1 evaluated, 1 filtered
onLinkIssueshere makes the new “Link with agent” action hand off cross-repository GitHub issue matches tobuildLinkIssuesHandoff, which instructs the agent to use the issue's full URL when repositories differ. GitHub closing keywords requireOWNER/REPOSITORY#NUMBERfor a different repository, not a URL, so a selected cross-repository match is merely linked rather than closed when the pull request merges. [ Out of scope (triage) ]apps/web/src/components/sourceControl/ListFilterMenu.tsx — 0 comments posted, 1 evaluated, 1 filtered
ALL_PROJECTS_VALUEis a validProjectId: the shared contract only requires a non-empty trimmed string. If a persisted/imported project has ID"all", both its radio item and the "All projects" row use that value, andonValueChangealways converts it toundefined; that project can never be selected to filter the list. [ Out of scope (post-validation triage) ]apps/web/src/lib/openIssueLink.ts — 0 comments posted, 2 evaluated, 2 filtered
findProjectForIssuecompares the raw checkout host and repository path to a browser URL. Azure SSH checkouts use identities such asssh.dev.azure.com/v3/org/project/repository, while linked Azure items usehttps://dev.azure.com/org/project/_git/repository/...; both the host check at line 156 and the later path comparison fail. Consequently linked Azure issues/PRs from SSH-cloned projects always fall back to the browser instead of opening in the workspace panel. [ Exceeded comment limit ]findProjectForLinkextractsnew URL(link.url).hostname, which drops the port, butsourceControlHostOfdeliberately returnsremote.host(including the port) for Forgejo identities. Thus a project cloned fromhttps://forge.example:3000/...cannot match a linked item at that same URL:forge.exampleis compared withforge.example:3000, and the item is unnecessarily opened externally. [ Out of scope (post-validation triage) ]apps/web/src/rightPanelStore.ts — 0 comments posted, 1 evaluated, 1 filtered
environmentIdis never used when rendering the tab:ChatViewpassesactiveThread.environmentIdtoIssueDetailPaneleven for anissuesurface carrying a different server. Opening an issue from a multi-server Issues/PR list therefore fetches the same project/reference from the thread's server rather than the server that supplied the selected issue, producing the wrong issue or a not-found panel. [ Already posted ]apps/web/src/routes/_chat.issues.tsx — 0 comments posted, 6 evaluated, 5 filtered
updateSearchnever serializesnext.labelinto its returnedIssuesSearch. Selecting a label viaupdateListScope(or performing any later URL update while a label is active) therefore removeslabelfrom the route state, so the list immediately becomes unfiltered instead of retaining/applying the chosen label. [ Already posted ]hostsearch parameter,hostsstarts empty and this effect merges only the filtered response, which contains just that host.activeHostsconsequently has length one andshowProviderhides the provider control, leaving no UI action to clear the host filter and return to all providers. [ Exceeded comment limit ]creatingis initialized tofalseand no code in this route ever callssetCreating(true). ConsequentlyIssueCreateDialogis permanently closed, so users have no reachable UI path to create an issue from the new Issues workspace. [ Previously rejected ]filteredflag omitssearch.label. For a URL containing a label filter that has no matches, the UI reports the unfiltered “No issues” state instead of explaining that the active filter excluded all issues. [ Out of scope (post-validation triage) ]{ label }toupdateListScope, but that reachesupdateSearch, whose reconstructedIssuesSearchomitslabel. Selecting a label therefore immediately removes it from the URL/state, leaving the label filter unable to apply. [ Already posted ]apps/web/src/routes/_chat.pull-requests.tsx — 0 comments posted, 3 evaluated, 3 filtered
onOpenLinkedPullRequestpasseslink.repositorydirectly into the panel target.findProjectForLinkdeliberately accepts Azure DevOps links whoseorg/projectpath is only a prefix of the configuredorg/project/repository, but the target must use the project'srepositoryIdentity.displayName(asrepositoryForProjectLinkdoes in the Issues route). Consequently, opening such a linked PR creates a reference the server refuses to read instead of showing the linked PR. [ Exceeded comment limit ]host, thisupdateSearchcall leaves the prior tab'sselectedHostin the URL. ThelinkedSelectioneffect then reopens the same PR with that stale host; becausepullRequestSurfaceIdincludeshost, this produces a second tab (and can attach the wrong host for a cross-host link). Set the linked project's host or clearselectedHostwhen updating the selection. [ Exceeded comment limit ]onOpenLinkedIssuestores the URL link's repository path instead of the resolved project'srepositoryIdentity.displayName. In particular,findProjectForLinkaccepts Azure DevOps issue URLs with anorg/projectprefix while the configured project identity includes the repository; this target pairs that shortened path with the project id and the detail request is rejected rather than displaying the linked issue. [ Already posted ]docs/user/source-control.md — 0 comments posted, 2 evaluated, 2 filtered
Track Issues Beside the Workis introduced with a level-3 heading immediately after## Troubleshooting, so Markdown nests the primary issue-tracking feature under troubleshooting. It will appear as a troubleshooting subtopic in the document hierarchy/TOC rather than a top-level feature section. [ Exceeded comment limit ]LinearIssueProviderexposes issues withprovider: "linear". Users following this new issue-tracking documentation will be told only the four source-control hosts are supported and may not configure or look for Linear issue tracking. [ Exceeded comment limit ]Summary by CodeRabbit