You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
We run several repositories in Orca with Linear as the issue tracker, and most workspaces are created straight from a Linear issue (orca worktree create --linear-issue ABC-123, or "Use" from the Linear task list). So the workspace already knows which ticket it belongs to.
But once you are actually working in that workspace, the ticket is nowhere in the workbench. The right sidebar gives you Explorer, Source Control, Checks, Ports, AI Vault, Workspaces — everything about the code, nothing about the why. To re-read the acceptance criteria, check the current status, or leave a progress comment, you leave Orca for a browser tab, find the issue again, and come back.
That hurts most in the workflow Orca is built for: several agent workspaces in parallel. Each one is a different ticket, and the context for each lives in a different browser tab that you have to keep mentally paired with the right workspace. The ticket should travel with the worktree.
The linked issue is surfaced today in the left sidebar workspace card and in the status-bar workspace panel, but only as identifier + title + state. That is enough to identify the ticket, not enough to work from — no description, no comments, no way to act on it.
Proposed solution
Add a lineartab to the right sidebar that renders the current workspace's linked Linear issue.
Content: identifier + title, state, assignee, priority/estimate, labels, description, and the comment thread. Actions (the ones Orca already supports elsewhere): change state, change assignee, add a comment, open in Linear.
Concretely, in src/renderer/src/components/right-sidebar/:
add 'linear' to RightSidebarTab in src/shared/types.ts, and to the literal list in normalizeRightSidebarRoute (src/renderer/src/store/right-sidebar-route.ts) so the tab survives a restart
add an ActivityBarItem entry in right-sidebar/index.tsx using the existing icons/LinearIcon
add the render branch in right-sidebar-panel-content.tsx
a new LinearPanel.tsx that reads activeWorktree.linkedLinearIssue / linkedLinearIssueWorkspaceId, fetches through the store's existing fetchLinearIssue + linearIssueComments, and composes the already-exported LinearIssueEditSection (layout="properties") and LinearIssueCommentFooter (variant="compact") from LinearItemDrawer.tsx
gate fetching on rightSidebarOpen && tab === 'linear', the way ChecksPanel does, since panels stay mounted when the sidebar closes
Almost none of this is new data work. Orca already fetches everything this panel needs: getIssue, getIssueComments, updateIssue, addIssueComment, getTeamStates/Labels/Members all exist in src/main/linear/, they are exposed over both the local IPC surface and the runtime RPC surface (so SSH/remote workspaces are already covered by runtime-linear-client.ts), and the renderer already caches issues in the Linear store slice. LinearIssueWorkspace.tsx is already a second consumer of LinearItemDrawer's exported sections, which suggests a third, narrower variant is the intended shape. This is a UI surface over data Orca already has, not a new integration.
Two design questions I would rather you rule on than guess:
Tab visibility. Should the tab be hidden when the workspace has no linked Linear issue (a new predicate alongside gitOnly / folderOnly / sshOnly in right-sidebar-activity-visibility.ts, which would mean threading the linked issue into the visibility state), or always visible with an empty state that offers to link one? Hiding keeps the activity bar clean; always-showing makes the feature discoverable and gives you somewhere to link from.
Provider scope. A linear tab is provider-specific, and CONTRIBUTING.md asks that generic behavior stay provider-neutral. Would you prefer a generic "Issue"/"Task" tab that renders the workspace's linkedWorkItem for whichever provider it belongs to (Linear now, GitHub/GitLab/Jira later), with Linear as the first implementation? That seems more in keeping with the codebase, and WorkspaceLinkedItem already carries the provider discriminator, but it is a bigger surface and I did not want to assume.
Alternatives or additional context
Why not a plugin. I looked at whether this could be a third-party plugin against contributes.panels / pluginApi 1 first, so as not to ask you for core changes. It cannot, today, for four independent reasons:
workspace.readContext returns only branch, displayName, terminals[]. The projection in plugin-host-method-bindings.ts deliberately drops everything else, and nothing Linear-related exists anywhere under src/main/plugins or src/shared/plugins. A panel cannot learn which issue the workspace is linked to (short of regexing an identifier out of the branch name).
The panel shell's CSP is connect-src 'none', so the panel frame cannot call the Linear API itself. That looks deliberate and correct, and I am not suggesting it change.
A worker can reach the network, but the child→parent protocol has no panel-directed message and storage.* is panel: false, so a worker cannot get its results to a panel. The two halves of a plugin cannot exchange anything.
Making this possible as a plugin would mean changing the same core files as just building the panel, plus designing a panel↔worker channel, and it would sit on a surface that is explicitly marked experimental and unfrozen. Building it into core looks like the cheaper and more honest option. Happy to be told otherwise.
Related issues:#3835 (sync worktree board status to Linear state) is the write direction of the same idea and would pair naturally with a panel. #12531 asks for more plugin panel mount points and overlaps on the plugin analysis above. Neither asks for a per-workspace issue panel.
Offer: I am happy to build this and open a PR, and I am starting on it now against the design above. I would still rather have your call on the two questions (hidden-vs-empty-state, and Linear-specific vs generic issue panel) so the PR matches the direction you want, and confirmation that you want the surface at all. If you would rather own it yourselves, no problem, treat this as a plain feature request.
Problem or use case
We run several repositories in Orca with Linear as the issue tracker, and most workspaces are created straight from a Linear issue (
orca worktree create --linear-issue ABC-123, or "Use" from the Linear task list). So the workspace already knows which ticket it belongs to.But once you are actually working in that workspace, the ticket is nowhere in the workbench. The right sidebar gives you Explorer, Source Control, Checks, Ports, AI Vault, Workspaces — everything about the code, nothing about the why. To re-read the acceptance criteria, check the current status, or leave a progress comment, you leave Orca for a browser tab, find the issue again, and come back.
That hurts most in the workflow Orca is built for: several agent workspaces in parallel. Each one is a different ticket, and the context for each lives in a different browser tab that you have to keep mentally paired with the right workspace. The ticket should travel with the worktree.
The linked issue is surfaced today in the left sidebar workspace card and in the status-bar workspace panel, but only as identifier + title + state. That is enough to identify the ticket, not enough to work from — no description, no comments, no way to act on it.
Proposed solution
Add a
lineartab to the right sidebar that renders the current workspace's linked Linear issue.Content: identifier + title, state, assignee, priority/estimate, labels, description, and the comment thread.
Actions (the ones Orca already supports elsewhere): change state, change assignee, add a comment, open in Linear.
Concretely, in
src/renderer/src/components/right-sidebar/:'linear'toRightSidebarTabinsrc/shared/types.ts, and to the literal list innormalizeRightSidebarRoute(src/renderer/src/store/right-sidebar-route.ts) so the tab survives a restartActivityBarItementry inright-sidebar/index.tsxusing the existingicons/LinearIconright-sidebar-panel-content.tsxLinearPanel.tsxthat readsactiveWorktree.linkedLinearIssue/linkedLinearIssueWorkspaceId, fetches through the store's existingfetchLinearIssue+linearIssueComments, and composes the already-exportedLinearIssueEditSection(layout="properties") andLinearIssueCommentFooter(variant="compact") fromLinearItemDrawer.tsxrightSidebarOpen && tab === 'linear', the wayChecksPaneldoes, since panels stay mounted when the sidebar closesAlmost none of this is new data work. Orca already fetches everything this panel needs:
getIssue,getIssueComments,updateIssue,addIssueComment,getTeamStates/Labels/Membersall exist insrc/main/linear/, they are exposed over both the local IPC surface and the runtime RPC surface (so SSH/remote workspaces are already covered byruntime-linear-client.ts), and the renderer already caches issues in the Linear store slice.LinearIssueWorkspace.tsxis already a second consumer ofLinearItemDrawer's exported sections, which suggests a third, narrower variant is the intended shape. This is a UI surface over data Orca already has, not a new integration.Two design questions I would rather you rule on than guess:
Tab visibility. Should the tab be hidden when the workspace has no linked Linear issue (a new predicate alongside
gitOnly/folderOnly/sshOnlyinright-sidebar-activity-visibility.ts, which would mean threading the linked issue into the visibility state), or always visible with an empty state that offers to link one? Hiding keeps the activity bar clean; always-showing makes the feature discoverable and gives you somewhere to link from.Provider scope. A
lineartab is provider-specific, andCONTRIBUTING.mdasks that generic behavior stay provider-neutral. Would you prefer a generic "Issue"/"Task" tab that renders the workspace'slinkedWorkItemfor whichever provider it belongs to (Linear now, GitHub/GitLab/Jira later), with Linear as the first implementation? That seems more in keeping with the codebase, andWorkspaceLinkedItemalready carries the provider discriminator, but it is a bigger surface and I did not want to assume.Alternatives or additional context
Why not a plugin. I looked at whether this could be a third-party plugin against
contributes.panels/ pluginApi 1 first, so as not to ask you for core changes. It cannot, today, for four independent reasons:workspace.readContextreturns onlybranch,displayName,terminals[]. The projection inplugin-host-method-bindings.tsdeliberately drops everything else, and nothing Linear-related exists anywhere undersrc/main/pluginsorsrc/shared/plugins. A panel cannot learn which issue the workspace is linked to (short of regexing an identifier out of the branch name).connect-src 'none', so the panel frame cannot call the Linear API itself. That looks deliberate and correct, and I am not suggesting it change.storage.*ispanel: false, so a worker cannot get its results to a panel. The two halves of a plugin cannot exchange anything.commands.invokepanel action (as [Feature]: Additional mount points for plugin panels (left nav, main view) #12531 also notes), and no capability kind that could grant network access.Making this possible as a plugin would mean changing the same core files as just building the panel, plus designing a panel↔worker channel, and it would sit on a surface that is explicitly marked experimental and unfrozen. Building it into core looks like the cheaper and more honest option. Happy to be told otherwise.
Related issues: #3835 (sync worktree board status to Linear state) is the write direction of the same idea and would pair naturally with a panel. #12531 asks for more plugin panel mount points and overlaps on the plugin analysis above. Neither asks for a per-workspace issue panel.
Offer: I am happy to build this and open a PR, and I am starting on it now against the design above. I would still rather have your call on the two questions (hidden-vs-empty-state, and Linear-specific vs generic issue panel) so the PR matches the direction you want, and confirmation that you want the surface at all. If you would rather own it yourselves, no problem, treat this as a plain feature request.