Orchestrator UX improvements: add-worktree modal, feedback system, and bug fixes#56
Merged
amandal0903 merged 50 commits intomainfrom Apr 3, 2026
Merged
Orchestrator UX improvements: add-worktree modal, feedback system, and bug fixes#56amandal0903 merged 50 commits intomainfrom
amandal0903 merged 50 commits intomainfrom
Conversation
added 30 commits
April 3, 2026 08:20
Register an IResourceDropHandler that intercepts file drops when the active editor is a terminal, sending the file path to the terminal instead of opening it as a new editor tab.
Adds a comment icon button to the workbench layout controls (left of terminal) that opens a single modal dialog with a feedback type dropdown (Bug, Feature Request, Other) and a multi-line text area. Styled with VS Code CSS variables to match the active theme.
The contribution was only loading in the sessions window. Moved to workbench/contrib so it loads in the main VS Code workbench where the LayoutControlMenu toolbar is rendered.
Narrower width, reduced padding/margins, smaller font sizes, transparent cancel button, and disabled textarea resize for a cleaner, more compact dialog.
Extract rate limiter and Slack service into feedbackService.ts. Submissions are rate-limited to 5 per 5-minute sliding window. Feedback posts to Slack with Block Kit formatting.
Electron renderer cannot directly call Slack webhooks due to CORS. Route requests through IRequestService which uses the main process, bypassing browser CORS restrictions.
Electron renderer cannot call Slack webhooks with application/json due to CORS preflight. Switch to application/x-www-form-urlencoded with payload= format (natively supported by Slack) and no-cors fetch mode to bypass browser CORS restrictions entirely.
Each feedback submission now also POSTs to a Google Apps Script web app that appends rows (Timestamp, Type, Description) to a Google Sheet for durable, searchable record-keeping.
…al fails Instead of silently showing an error notification, display a modal dialog explaining the failure and offering to retry with --force.
Show exact error message and widen the dialog via custom CSS class so it renders landscape instead of portrait.
Parse the fatal message from git output, show reason on top as detail text with the force-delete prompt below as markdown. Remove the wide-dialog CSS override.
The orchestrator's periodic refresh only updated diff stats, so running `git checkout` in a worktree terminal left the sidebar showing the stale branch name. Now `_doRefreshGitState` fetches both diff stats and current branches in parallel, updating the UI when either changes. Also renamed the refresh plumbing to generic names (`scheduleRefresh`, `_refreshScheduler`, etc.) so future refresh types slot in cleanly.
Hook into shell integration's onCommandFinished so that git checkout (or any command) in the integrated terminal refreshes the sidebar. Exposes scheduleRefresh() on IOrchestratorService for contributions.
The [+] button on repos now opens a centered modal with workspace name input, prompt textarea, agent dropdown (auto-detected via which), and base branch selector. Agents are only shown if installed on the system; when none are found the prompt textarea is disabled and the agent pill shows "No agents found" with the agent codicon.
Switch from quickInput-background to editorWidget-background/border/ foreground for the card and all child elements. Stronger backdrop, visible separator, footer border, pill buttons with subtle fill. Adapts correctly to light and dark themes.
- Backdrop: hardcoded rgba(0,0,0,0.6) instead of widget-shadow var (was resolving to ~0.16 in light / ~0.36 in dark — way too transparent) - Card: editorWidget-background + editorWidget-border (theme-adaptive) - Pill buttons: input-background/border/foreground — designed to contrast with surrounding widget bg in both light and dark themes - Removed all hardcoded rgba(255,255,255,...) that broke light themes - All text uses editorWidget-foreground with opacity for hierarchy
Backdrop: frosted glass using color-mix + backdrop-filter blur instead of solid rgba overlay. Card: input-background (always contrasts with surroundings). Buttons: editor-background for 3-layer depth hierarchy. All theme-adaptive with no hardcoded color values.
Labels were floating disconnected above the card. Now they sit inside the card as proper field labels directly above the name input.
Remove floating header labels. Name input uses "Workspace name" as placeholder. Branch name preview appears on the right of the same row (muted, monospace) only when the user has typed something.
- Set font-family to --vscode-font-family on the overlay so it inherits VS Code's UI font instead of document.body's default serif - Branch preview always visible: shows muted "branch name" placeholder when empty, switches to actual typed value with 0.5 opacity
…sible - Dropdowns now open below the buttons (top: 100%) instead of above - Added Terminal as always-available agent option with codicon.terminal - Branch preview always shown with placeholder state when empty
…odal - Workspace name (left) and branch name (right) are now two separate input fields side by side. Workspace name auto-slugifies into branch name, but branch is independently editable. - Footer moved outside the card so dropdowns render below the modal boundary, not overlapping card content. - Both inputs use muted placeholder text.
… below modal" This reverts commit f2350af.
- Use editorWidget-background (opaque) instead of input-background - Disable backdrop-filter inheritance so dropdown isn't see-through - Stronger box-shadow for depth - z-index above overlay - Selected item gets hover background for visibility
The overlay's backdrop-filter: blur() was making child dropdowns semi-transparent. Now dropdowns render on document.body with fixed positioning calculated from the trigger button's bounding rect. Fully opaque, outside the blur context.
backdrop-filter: blur() was the root cause of all dropdown transparency issues - it made every child element see-through regardless of their own background. Replaced with solid rgba(0,0,0,0.5) overlay. Dropdowns back inside the modal with proper absolute positioning and full access to VS Code theme variables.
CSS variables on absolutely-positioned overflow children can fail to resolve in certain compositing contexts. Now the dropdown copies the card's actual computed backgroundColor via getComputedStyle, ensuring it's always the same fully-opaque color.
The native VS Code dialog (Image 23) uses no backdrop dimming at all — just a solid opaque card with a shadow floating over content. Adopted the same approach: transparent overlay (click-capture only), card and dropdown use editorWidget-background with widget-shadow box-shadow. Buttons use dropdown-background/border/foreground. Removed all rgba overlay hacks and computed-color workarounds.
added 20 commits
April 3, 2026 08:20
document.body doesn't have --vscode-* custom properties — they're set on .monaco-workbench. Appending the overlay there makes editorWidget- background, widget-shadow, etc. all resolve to their correct opaque theme colors in both dark and light modes.
- Suppress sharp focus borders on all card inputs (outline/box-shadow/ border-color overrides) - Workspace name input takes flex:6 (60%), branch preview takes flex:4 (40%), both muted placeholder style - Branch name is a read-only span that auto-slugifies from workspace name (lowercase, hyphens, no special chars) — not editable - Submit uses the slugified branch name
- Branch name is now a separate editable input (right-aligned, monospace) instead of a read-only auto-slugified span - Workspace name and branch name are independent fields - New validateBranchName allows / for paths like feat/my-feature but rejects .., /., //, and other invalid git ref patterns - Removed auto-slugify and old validateWorktreeName import
Updated the single source-of-truth validateWorktreeName to allow / for branch paths (feat/my-feature) while rejecting /., //, and leading /. Removed the duplicate validateBranchName from the modal and restored the import of validateWorktreeName.
Dropdown width is set to 1.25x the trigger button's offsetWidth. Items use text-overflow: ellipsis for names exceeding the width.
- Removed unused trigger parameter from showDropdown (leftover from dynamic width calculation) - Unexported KNOWN_AGENTS (only used internally by agentsFromIds) - Removed redundant gap: 0 on name row - Reordered prompt::placeholder rule to sit with its parent selector
- Feature name and branch name are both required for submission - ⌘↩ hint starts dim (opacity 0.2), transitions to visible (0.6) when both fields are filled and branch name passes validation - Submit validates feature name first, then branch name - Prompt remains always optional
Added featureName to AddWorktreeResult and displayName param to addWorktree. The sidebar now shows the user's original feature name (e.g. "Add Unit Tests") instead of the lowercased branch slug. Falls back to friendlyName(branch) for worktrees created without it.
Shows a settings icon next to the agent dropdown for claude/codex agents, hidden when terminal is selected. No click handler yet — placeholder for upcoming agent presets UI.
Settings icon appears inline on the right of each agent dropdown item (claude/codex), hidden for terminal. Reveals on hover with placeholder click handler for future presets panel.
Replace native select with styled pill buttons, use borderless textarea, add fade-in animation, footer with submit hint, and consistent spacing.
Previously only repo path and collapse state were persisted. On restart, worktree names were regenerated from branch names via friendlyName(), losing the original feature name set during creation. Now saveState() includes worktree metadata (name, description, baseBranch) and restoreState() restores them by matching on branch name.
Remove unreachable branches.length fallbacks since listBranches always returns at least one branch for a valid git directory.
Replace direct Slack webhook + Google Sheets calls with an Azure Function proxy (workstreams-feedback.azurewebsites.net). Secrets now live in Azure App Settings, not in source code.
424b326 to
f83d541
Compare
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.
Summary
(feature name + editable branch, agent/base-branch dropdowns, auto-switch to new
worktree on creation, persist display names across restarts)
webhook integration and Google Sheets logging (rate-limited)
fails, error parsing
orchestrator refresh on terminal command completion, fix file drag-and-drop onto
terminal
required-field indicators, branch-name validation allowing /
Stats