Skip to content

Orchestrator UX improvements: add-worktree modal, feedback system, and bug fixes#56

Merged
amandal0903 merged 50 commits intomainfrom
feat-enhancement
Apr 3, 2026
Merged

Orchestrator UX improvements: add-worktree modal, feedback system, and bug fixes#56
amandal0903 merged 50 commits intomainfrom
feat-enhancement

Conversation

@amandal0903
Copy link
Copy Markdown
Collaborator

Summary

  • Add-worktree modal overlay — replaced the quick-input flow with a full modal dialog
    (feature name + editable branch, agent/base-branch dropdowns, auto-switch to new
    worktree on creation, persist display names across restarts)
  • Feedback system — added a feedback button/modal in the workbench toolbar with Slack
    webhook integration and Google Sheets logging (rate-limited)
  • Worktree deletion UX — confirmation dialog with force-delete option when removal
    fails, error parsing
  • Sidebar & refresh fixes — refresh branch names on git state changes, trigger
    orchestrator refresh on terminal command completion, fix file drag-and-drop onto
    terminal
  • UI polish — proper VS Code theme variable usage, fixed-width dropdowns,
    required-field indicators, branch-name validation allowing /

Stats

  • 64 commits across 14 files
  • +1,421 / −50 lines
Screenshot 2026-04-03 at 8 13 36 AM Screenshot 2026-04-03 at 8 13 54 AM Screenshot 2026-04-03 at 8 14 15 AM

Avijit Mandal 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.
- 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.
Avijit Mandal 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.
@amandal0903 amandal0903 merged commit 719cc66 into main Apr 3, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant