feat(coordinator): UI components, control banners, and coordinator entry points (PR 4/4)#125
Conversation
|
Thanks for the coordinator UI work. I did another pass with multiple reviewers focused on autofire/control flow, backend lifecycle sync, and UI entry points. A few blockers stood out:
Smaller follow-ups: I would add regression coverage around the |
|
Addressed the review feedback in the squashed PR commit
Verification:
|
|
Thank you very much! Looks good to merge after conflicts are resolved! Optional feedback: Verified all six blockers from prior review landed in
Two follow-ups I would not block on:
Nit: Strengths worth noting: pure decision helpers ( LGTM once PR 3 (#124) lands. The two follow-ups above can ship as a separate fix. |
|
Pushed
No changes needed. The existing structure called out in the review remains intact: pure decision helpers stay isolated and tested, IPC handlers continue using validation helpers, REST auth remains coordinator-scoped, renderer notification sends guard destroyed windows, worktree status/commit helpers tolerate missing worktrees, and Verification:
|
|
Thank you very much! <3 |
Overview
This is PR 4 of 4 in the coordinator series splitting #100 as requested in the round-4 review. It is stacked on PR 3 (#124) (
coordinator-3-store-ipc) and must be merged after that one. The diff shown here includes PRs 1–3's content; the meaningful delta for this PR is the UI components and entry points described below.PR sequence:
coordinator-1-securitycoordinator-2-mcp-backendcoordinator-3-store-ipccoordinator-4-uiThis PR makes coordinator mode user-visible for the first time. After it merges, users can enable coordinator mode in Settings and create coordinator tasks from
NewTaskDialog.What's in this PR (delta over PR 3)
New component:
SubTaskStripNested status strip rendered inside a coordinator task's panel. Shows each sub-task's name, status dot, branch, and action buttons (send prompt, merge, close). Collapses to a compact summary when the coordinator panel is not focused.
Sidebar— coordinator groupingCoordinator tasks render with their children nested beneath them in the sidebar. Children are hidden from the flat task list (already excluded by PR 3's
isCoordinatedChildguard). A control banner appears below the coordinator's terminal whencontrolledBy === 'coordinator'to show the user they can take control.TaskPanel— coordinator detail viewFull coordinator task panel with sub-task list, per-sub-task diff summary, merge/close actions, and MCP startup status display (
pending/ready/errorwith retry button).PromptInput— staged notification and autofireautofire-tick.ts: fires the staged notification after the configured delay; 2-minute grace period for coordinator mode when no❯prompt marker is visible, so notifications fire even during long tool-call loopsprompt-control.ts: shared coordinator handoff helper;PromptInput.handleSendowns the coordinator send gateSettingsDialog— coordinator settingsNew "Coordinator Mode" section with:
coordinatorModeEnabled)NewTaskDialog— coordinator entry pointNew "Coordinator mode" checkbox in the advanced section. When checked, exposes a "Propagate skip permissions" option. Creates the task with
coordinatorMode: true.Other component updates
TaskTitleBar: shows coordinator badge; sub-tasks show "controlled by coordinator" indicatorTaskAITerminal: rendersSubTaskStripfor coordinator tasksTerminalView: disables stdin whencontrolledBy === 'coordinator'; re-enables on hand-offSidebarFooter: shows MCP server status indicatorStatusDot: renders'review'state (orange dot) for tasks withneedsReviewCloseTaskDialog: shows warning when closing a coordinator with active childrenPlanViewerDialog: minor coordinator-aware rendering fixBug fixes (live e2e testing)
show_notificationIPC:ipcMain.on→ipcMain.handleto satisfyipcRenderer.invokemerge_taskgit lock: retry once after 2 s whenindex.lockis held by a crashed processgetBranchCommits: guard against missing worktree (existsSyncbefore git spawn)getWorktreeStatus: wrapexecin try/catch to handle ENOENT race after worktree deletionwait_for_signal_donetimeout: resolve with{ timedOut: true }instead of reject, so coordinator Claude receives a structured result rather thanisError: trueCI / tooling
pre-push: runs full test suite before pushcommit-msg: enforces conventional commit formatpre-commit: lockfile integrity check (fails ifpackage.jsonchanges withoutpackage-lock.json)Tests
src/components/PromptInput.test.tssrc/components/prompt-control.test.tssrc/lib/terminalDisableStdin.test.tselectron/ipc/register-mcp.test.tsfindFreePort()calls replaced withport: 0electron/mcp/coordinator.test.tsrejects.toThrowtotimedOut === trueAssumptions and important notes
coordinatorModeEnabledcan be set totruevia the Settings toggle. First coordinator task can be created fromNewTaskDialog.❯visible) need a time-based fallback to fire staged notifications; without it, the notification would never send until the agent returned to prompt.🤖 Generated with Claude Code