Summary
Two closely-related improvements to the "view an issue / PR by number" flows in the VS Code extension. Shipping them together because they share code paths, a design rhythm, and a coherent keybinding story.
Part 1 — one-step "view issue N" / "view pr N" from the QuickPick
Today: the QuickPick that offers "View Issue" as an item requires four actions from the user: click "View Issue" → Enter → type number → Enter. Two-tier navigation for what should be one gesture.
Fix: enhance the QuickPick with a onDidChangeValue handler that dynamically inserts numeric-typed items at the top when the user types:
- User types
1350 (bare number, ≥1 digit) → prepend two dynamic items: View Issue #1350 and View PR #1350
- User types
issue 1350 or view issue 1350 → prepend View Issue #1350
- User types
pr 1350 or view pr 1350 → prepend View PR #1350
- User types
#1350 → same as 1350 (leading # tolerated per existing parseIssueId convention)
Accepting a dynamic item bypasses the "click item → InputBox" chain entirely — one gesture, straight to codev.openBacklogIssue (browser) or the new codev.openPRById (Part 2).
Filter matching for existing static items (View Issue, other picker actions) stays as-is; dynamic items only surface when the input matches the numeric-typed grammar above.
Part 2 — new codev.openPRById command + Cmd+K P keybinding
Today: no direct-open-PR-by-number command exists. The only PR-related commands are codev.referencePRInArchitect (sidebar-driven, injects a #N "title" reference into an architect terminal) and PR-list rendering in the Pull Requests sidebar view. Users who know a PR number by heart have to navigate the sidebar list or use the browser directly.
Fix: mirror codev.openIssueById:
- New command
codev.openPRById, title Codev: Open PR by ID...
- Keybinding
Cmd+K P / Ctrl+K P (verified unused in the current keybindings map)
- Handler pattern identical to
packages/vscode/src/commands/open-issue-by-id.ts:
showInputBox with parseIssueId-equivalent validation
client.getPR(prId, workspacePath) — reuses forge-agnostic PR fetch (same shape as getIssue)
- On success,
vscode.env.openExternal(pr.url)
- Fallback to in-editor preview if a
codev.viewBacklogPR equivalent exists; otherwise showWarningMessage("Could not open PR #N")
- New file
packages/vscode/src/commands/open-pr-by-id.ts (parallel to open-issue-by-id.ts)
- Registered in
extension.ts alongside openIssueById
If a PR-fetch method doesn't exist on the client yet, add one following the getIssue pattern (thin passthrough to the forge adapter).
Acceptance
- Q1a: In the QuickPick that hosts "View Issue," typing
1350 shows View Issue #1350 and View PR #1350 at the top. Enter on the first opens issue 1350 in the browser.
- Q1b: Typing
view pr 1350 shows View PR #1350 at the top. Enter opens PR 1350 in the browser.
- Q1c: Typing anything non-numeric filters the existing items normally; no dynamic items appear.
- Q2a:
Cmd+K P opens an InputBox asking for a PR number. Typing a number and Enter opens that PR in the browser.
- Q2b: Invalid input rejected with a validation message (matching
openIssueById).
- Q2c: PR not found →
showWarningMessage telling the user, no crash.
Scope
packages/vscode/src/commands/open-pr-by-id.ts — new file
packages/vscode/src/commands/search-backlog.ts (or wherever the "View Issue" QuickPick lives — verify at implement time) — QuickPick type-ahead enhancement
packages/vscode/src/extension.ts — command registration for codev.openPRById
packages/vscode/package.json — command declaration + keybinding
packages/vscode/src/connection-manager.ts — getPR(id, workspacePath) method if missing (parallel to getIssue)
- Tests: unit-test
parseIssueId reuse for PR flow, integration-test the QuickPick's dynamic-item insertion for both 1350 and view pr 1350 cases
Out of scope:
- Removing or renaming the existing
codev.openIssueById — this issue is additive
- Changes to
codev.referencePRInArchitect — different flow (injects into terminal, not browser)
- Other QuickPicks (approve gate, send message, etc.) — they don't need type-ahead
Related
packages/vscode/src/commands/open-issue-by-id.ts — the exact template for openPRById
parseIssueId (already forge-neutral per its docstring; reusable for PR IDs as-is)
- Existing keybindings (verified P slot is free): current family is
a (architect terminal), d (send message), g (approve gate), b (forward selection to builder), i (open issue by ID)
Summary
Two closely-related improvements to the "view an issue / PR by number" flows in the VS Code extension. Shipping them together because they share code paths, a design rhythm, and a coherent keybinding story.
Part 1 — one-step "view issue N" / "view pr N" from the QuickPick
Today: the QuickPick that offers "View Issue" as an item requires four actions from the user: click "View Issue" → Enter → type number → Enter. Two-tier navigation for what should be one gesture.
Fix: enhance the QuickPick with a
onDidChangeValuehandler that dynamically inserts numeric-typed items at the top when the user types:1350(bare number, ≥1 digit) → prepend two dynamic items:View Issue #1350andView PR #1350issue 1350orview issue 1350→ prependView Issue #1350pr 1350orview pr 1350→ prependView PR #1350#1350→ same as1350(leading#tolerated per existingparseIssueIdconvention)Accepting a dynamic item bypasses the "click item → InputBox" chain entirely — one gesture, straight to
codev.openBacklogIssue(browser) or the newcodev.openPRById(Part 2).Filter matching for existing static items (
View Issue, other picker actions) stays as-is; dynamic items only surface when the input matches the numeric-typed grammar above.Part 2 — new
codev.openPRByIdcommand + Cmd+K P keybindingToday: no direct-open-PR-by-number command exists. The only PR-related commands are
codev.referencePRInArchitect(sidebar-driven, injects a#N "title"reference into an architect terminal) and PR-list rendering in the Pull Requests sidebar view. Users who know a PR number by heart have to navigate the sidebar list or use the browser directly.Fix: mirror
codev.openIssueById:codev.openPRById, titleCodev: Open PR by ID...Cmd+K P/Ctrl+K P(verified unused in the current keybindings map)packages/vscode/src/commands/open-issue-by-id.ts:showInputBoxwithparseIssueId-equivalent validationclient.getPR(prId, workspacePath)— reuses forge-agnostic PR fetch (same shape asgetIssue)vscode.env.openExternal(pr.url)codev.viewBacklogPRequivalent exists; otherwiseshowWarningMessage("Could not open PR #N")packages/vscode/src/commands/open-pr-by-id.ts(parallel toopen-issue-by-id.ts)extension.tsalongsideopenIssueByIdIf a PR-fetch method doesn't exist on the client yet, add one following the
getIssuepattern (thin passthrough to the forge adapter).Acceptance
1350showsView Issue #1350andView PR #1350at the top. Enter on the first opens issue 1350 in the browser.view pr 1350showsView PR #1350at the top. Enter opens PR 1350 in the browser.Cmd+K Popens an InputBox asking for a PR number. Typing a number and Enter opens that PR in the browser.openIssueById).showWarningMessagetelling the user, no crash.Scope
packages/vscode/src/commands/open-pr-by-id.ts— new filepackages/vscode/src/commands/search-backlog.ts(or wherever the "View Issue" QuickPick lives — verify at implement time) — QuickPick type-ahead enhancementpackages/vscode/src/extension.ts— command registration forcodev.openPRByIdpackages/vscode/package.json— command declaration + keybindingpackages/vscode/src/connection-manager.ts—getPR(id, workspacePath)method if missing (parallel togetIssue)parseIssueIdreuse for PR flow, integration-test the QuickPick's dynamic-item insertion for both1350andview pr 1350casesOut of scope:
codev.openIssueById— this issue is additivecodev.referencePRInArchitect— different flow (injects into terminal, not browser)Related
packages/vscode/src/commands/open-issue-by-id.ts— the exact template foropenPRByIdparseIssueId(already forge-neutral per its docstring; reusable for PR IDs as-is)a(architect terminal),d(send message),g(approve gate),b(forward selection to builder),i(open issue by ID)