Skip to content

fix: WCAG-compliant theme token system with extended color tokens#592

Open
openasocket wants to merge 209 commits intoRunMaestro:rcfrom
openasocket:fix/theme-integration-rebase
Open

fix: WCAG-compliant theme token system with extended color tokens#592
openasocket wants to merge 209 commits intoRunMaestro:rcfrom
openasocket:fix/theme-integration-rebase

Conversation

@openasocket
Copy link
Copy Markdown
Contributor

Summary

Retarget of #370 and successor to #551 — now fully merged with RC (75 conflicts resolved, all 23,301 tests passing).

  • Extend theme system from 13 to 30 color tokens — adds semantic tokens for status foregrounds (successForeground, warningForeground, errorForeground), dimmed status backgrounds (successDim, warningDim, errorDim, infoDim), info color, overlays (overlay, overlayHeavy), hover/active states (hoverBg, activeBg), git diff colors (diffAddition, diffAdditionBg, diffDeletion, diffDeletionBg), and shadow
  • Replace hardcoded color values across 17+ component files with theme tokens, improving accessibility (WCAG 2.1 contrast compliance) and ensuring all colors respect the active theme
  • Update CustomThemeBuilder to display all 30 tokens organized in 8 semantic sections (backgrounds, typography, accent, status indicators, info, git diff, overlays, interactive states)
  • All 4 vibe themes updated (Dracula, Monokai, Nord, Tokyo Night) with the extended color properties
  • Full RC merge — resolved 75 merge conflicts across Cue system, process manager, settings, renderer core, CLI, tests, and docs

What Changed from #551

Test Plan

  • npm run lint — all 3 tsconfig targets pass
  • npm run test — 23,301 tests pass, 107 skipped, 0 failures
  • Theme-specific tests — 175 tests across 7 theme test files pass
  • Verify all 17 built-in themes render correctly
  • Verify custom theme builder shows all 30 token sections
  • Verify WCAG contrast on light themes (Dre Symphony Light, Dewy Meadow)

🤖 Generated with Claude Code

Introduce maestro:// URL scheme support for navigating to agents, tabs,
and groups from external apps and OS notification clicks.

- Add deep-links module with URL parsing, protocol registration,
  single-instance locking, and cross-platform event handling
- Wire notification click handlers to navigate to the originating
  agent/tab via deep link dispatch
- Thread sessionId/tabId context through notification preload bridge
- Add onDeepLink listener in renderer with routing to existing
  navigation handlers
- Register maestro:// protocol in electron-builder config
- Add 18 tests covering URL parsing and notification click wiring
- URI-encode sessionId/tabId when constructing deep link URLs in
  notification click handler to prevent malformed URLs with special chars
- Add process.exit(0) after app.quit() so secondary instances exit
  immediately without running further module-level setup
- Use useRef for sessions in deep link effect to avoid tearing down
  and re-registering the IPC listener on every sessions change
- Guard against navigating to non-existent session IDs in deep link
  handler to prevent invalid UI state
- Add cross-reference comment in global.d.ts linking to canonical
  ParsedDeepLink type (can't import in ambient declaration file)
- Add test for URI-encoding round-trip in notification click handler
- Add shared deep-link-urls.ts with buildSessionDeepLink(),
  buildGroupDeepLink(), and buildFocusDeepLink() utilities
- Add {{AGENT_DEEP_LINK}}, {{TAB_DEEP_LINK}}, {{GROUP_DEEP_LINK}}
  template variables available in system prompts, custom AI commands,
  and Auto Run documents
- Wire activeTabId and groupId into TemplateContext at all call sites
  (agentStore, useInputProcessing, useRemoteHandlers,
  useDocumentProcessor, useMergeTransferHandlers, batch-processor)
- Refactor notifications.ts to use shared buildSessionDeepLink()
- Add sessionId/tabId to notifyToast callers where context is available
  (merge, transfer, summarize, PR creation)
- Add docs/deep-links.md documentation page with URL format, usage
  examples, template variables, and platform behavior
- Add 8 tests for URL builders, 6 tests for template variable
  substitution including URI encoding
…e activity indicators

Broadcast new history entries via IPC when they are added, subscribe in
the UnifiedHistoryTab with RAF batching and deduplication, and extend
the HistoryStatsBar with spinning Active agent count and Queued message
count indicators derived from the Zustand session store.
…orrect types

- Replace unstable sessionNameMap Zustand selector (new Map per render) with
  a stable ref + subscribe pattern to avoid streaming effect re-subscription
- Dedupe within batch before merging; compute setTotalEntries and
  setHistoryStats from deduplicated entries only (not raw batch)
- Clear pendingEntriesRef on cleanup to prevent stale replay after resubscribe
- Use HistoryEntry (not UnifiedHistoryEntry) in preload callback type since
  the wire payload lacks sourceSessionId
- Use canonical UsageStats interface in global.d.ts (fixes pre-existing
  cacheReadTokens/cacheWriteTokens field name mismatch)
…URL registry support

- Add `symphony: boolean` (default true) to EncoreFeatureFlags
- Gate Symphony modal, menu item, keyboard shortcut (⇧⌘Y), and command palette entry
- Add `symphonyRegistryUrls` setting for user-configured additional registry URLs
- Replace single `fetchRegistry()` with `fetchRegistries()` that fetches default + custom URLs in parallel
- Merge repositories by slug (default registry wins on conflicts), isolated per-URL error handling
- Add Symphony toggle + Registry Sources UI in Settings > Encore tab
- Update tests for new symphony flag across all encore feature assertions
- Redact registry URLs before logging to prevent credential leakage
- Skip registry cache when custom source URLs are configured (stale cache fix)
- Runtime-validate symphonyRegistryUrls from settings store
- Reset modal-open flags when Encore Feature toggles are disabled
- Normalize registry URLs before duplicate/default checks
- Add aria-label to icon-only registry URL remove button
- Expose setSymphonyRegistryUrls in getSettingsActions()
- Validate persisted symphonyRegistryUrls with Array.isArray guard
…r, and Encore feature flag

- Register maestroCue as an Encore Feature flag (EncoreFeatureFlags, DEFAULT_ENCORE_FEATURES)
- Create src/main/cue/cue-types.ts with CueEventType, CueSubscription, CueSettings, CueConfig,
  CueEvent, CueRunStatus, CueRunResult, CueSessionStatus, and related constants
- Add 'CUE' to HistoryEntryType across shared types, global.d.ts, preload, IPC handlers, and hooks
- Add cueTriggerName, cueEventType, cueSourceSession optional fields to HistoryEntry
- Add 'cue' log level to MainLogLevel, LOG_LEVEL_PRIORITY, logger switch/case, and LogViewer
  with teal color (#06b6d4), always-enabled filter, and agent name pill
- Add 10 Cue-specific template variables (CUE_EVENT_TYPE, CUE_TRIGGER_NAME, etc.) with cueOnly flag
- Extend TemplateContext with cue? field and substituteTemplateVariables with Cue replacements
- Update TEMPLATE_VARIABLES_GENERAL filter to exclude cueOnly variables
…ovider

Implements the three core modules for the Cue event-driven automation engine:

- cue-yaml-loader.ts: Discovers and parses maestro-cue.yaml files with
  js-yaml, validates config structure, watches for file changes via chokidar
  with 1-second debounce

- cue-file-watcher.ts: Wraps chokidar for file.changed subscriptions with
  per-file debouncing (5s default), constructs CueEvent instances with full
  file metadata payloads

- cue-engine.ts: Main coordinator class with dependency injection, manages
  time.interval timers (fires immediately then on interval), file watchers,
  agent.completed listeners with fan-in tracking, activity log ring buffer
  (max 500), and run lifecycle management

Added js-yaml and @types/js-yaml dependencies. 57 tests across 3 test files.
…story recording

Implements the Cue executor module that spawns background agent processes
when Cue triggers fire, following the same spawn pattern as Auto Run's
process:spawn IPC handler.

Key exports:
- executeCuePrompt(): Full 10-step pipeline (prompt resolution, template
  substitution, agent arg building, SSH wrapping, process spawn with
  stdout/stderr capture, timeout enforcement with SIGTERM→SIGKILL)
- stopCueRun(): Graceful process termination by runId
- recordCueHistoryEntry(): Constructs HistoryEntry with type 'CUE' and
  all Cue-specific fields (trigger name, event type, source session)
- getActiveProcesses(): Monitor running Cue processes

Test coverage: 31 tests in cue-executor.test.ts covering execution paths,
SSH remote, timeout escalation, history entry construction, and edge cases.
Full suite: 21,635 tests passing across 512 files, zero regressions.
Add CUE entry support across all History components:
- HistoryFilterToggle: CUE filter button with teal (#06b6d4) color and Zap icon
- HistoryEntryItem: CUE pill, success/failure badges, and trigger metadata subtitle
- HistoryPanel & UnifiedHistoryTab: CUE included in default activeFilters
- HistoryDetailModal: CUE pill color, icon, success/failure indicator, trigger metadata display
- Comprehensive test coverage for all CUE rendering paths (205 new/updated tests pass)
…nd activity log

Add the Maestro Cue dashboard modal with full Encore Feature gating:
- CueModal component with sessions table, active runs list, and activity log
- useCue hook for state management, event subscriptions, and 10s polling
- Settings toggle in Encore tab, command palette entry, keyboard shortcut (Cmd+Shift+U)
- SessionList hamburger menu entry, modal store integration, lazy loading
- 30 tests covering hook behavior and modal rendering
Add CueYamlEditor component for creating and editing maestro-cue.yaml files.
Features split-view layout with AI assist (left panel for description + clipboard copy)
and YAML editor (right panel with line numbers, debounced validation, Tab indentation).
Integrates into CueModal via Edit YAML button on each session row.
…yaml

Task 1: CueHelpModal component with 7 content sections (What is Maestro Cue,
Getting Started, Event Types, Template Variables, Multi-Agent Orchestration,
Timeouts & Failure Handling, AI YAML Editor). Wired to CueModal ? button.
Registered with layer stack at MODAL_PRIORITIES.CUE_HELP (465).

Task 2: useCueAutoDiscovery hook that calls cue:refreshSession when sessions
are created/restored/removed, gated by encoreFeatures.maestroCue. Full scan
on feature enable, engine disable on feature off.

Tests: 38 CueHelpModal tests + 10 useCueAutoDiscovery tests, all passing.
Lint clean. No existing test regressions (21,778 tests pass).
… session bridging

Implement agent completion event chaining in the Cue engine:
- Fan-out: subscriptions dispatch prompts to multiple target sessions simultaneously
- Fan-in: subscriptions wait for all source sessions to complete before firing, with
  timeout handling (break clears tracker, continue fires with partial data)
- Session bridging: user session completions trigger Cue subscriptions via exit listener
- Add AgentCompletionData type for rich completion event payloads
- Add hasCompletionSubscribers() optimization to skip unneeded notifications
- Wire getCueEngine/isCueEnabled into ProcessListenerDependencies
…ure gated)

Add teal Zap icon next to session names in the Left Bar for sessions
with active Maestro Cue subscriptions. The indicator is gated behind
the maestroCue Encore Feature flag and shows a tooltip with the
subscription count on hover.

- Add cueSubscriptionCount prop to SessionItem with Zap icon rendering
- Add lightweight Cue status fetching in SessionListInner via
  cue:getStatus IPC, refreshed on cue:activityUpdate events
- Add cue namespace to global test setup mock
- 6 unit tests + 3 integration tests; all 21,815 tests pass; lint clean
Add Maestro Cue entries across all developer documentation:
- CLAUDE.md: Key Files table (4 entries), Architecture tree (cue/ dir),
  Standardized Vernacular (Cue + Cue Modal terms)
- CLAUDE-PATTERNS.md: Encore Feature section lists maestroCue as second
  reference implementation alongside directorNotes
- CLAUDE-IPC.md: cue namespace in Automation section, full Cue API
  reference with all endpoints and event documentation
…t journal

- Add cue-db.ts: SQLite-backed event journal (cue_events table) and single-row
  heartbeat table (cue_heartbeat) using better-sqlite3 with WAL mode
- Add cue-reconciler.ts: time event catch-up logic that fires exactly one
  reconciliation event per missed subscription (no flooding), with
  payload.reconciled and payload.missedCount metadata
- Update cue-engine.ts: heartbeat writer (30s interval), sleep detection
  (2-minute gap threshold), database pruning (7 days), and clean shutdown
- Update CueHelpModal: new "Sleep & Recovery" section with Moon icon
- Update CueModal: amber "catch-up" badge on reconciled activity log entries
- Tests: 41 new tests across cue-db (17), cue-reconciler (11), cue-sleep-wake (13)
Add filter field to CueSubscription for narrowing when subscriptions fire.
Supports exact match, negation (!), numeric comparison (>/</>=/<=),
glob patterns (picomatch), and boolean matching with AND logic.
Filter checks integrated at all three dispatch points (file.changed,
time.interval, agent.completed). Includes help modal docs, AI prompt
updates, and 80 new tests (43 filter engine + 37 YAML loader).
… awareness

Add pattern presets (Scheduled Task, File Enrichment, Reactive, Research
Swarm, Sequential Chain, Debate) to the YAML editor as clickable cards.
Enhance the AI system prompt with pattern recognition guidance. Add a
Coordination Patterns section with ASCII flow diagrams to the help modal.
Add github.pull_request and github.issue event types to CueEventType union.
Add repo and poll_minutes fields to CueSubscription interface.
Add cue_github_seen SQLite table with 5 CRUD functions for tracking
seen GitHub items (isGitHubItemSeen, markGitHubItemSeen, hasAnyGitHubSeen,
pruneGitHubSeen, clearGitHubSeenForSubscription).
Create cue-github-poller.ts module that polls GitHub CLI for new PRs/issues,
seeds existing items on first run, and fires CueEvents for new items.
Comprehensive test suite with 17 test cases covering all polling behaviors.
All 264 Cue tests pass, lint clean.
Add GitHub Pull Request and GitHub Issue event type blocks with descriptions,
YAML configuration examples, and seven new GitHub template variables (CUE_GH_*)
to the Cue Help Modal documentation.
pedramamini and others added 28 commits March 10, 2026 12:28
Worktree and wizard sessions now start with only an AI tab. Users can
launch terminal tabs on demand. Removes unnecessary createTerminalTab
calls and imports from worktreeSession.ts and useWizardHandlers.ts.

Claude ID: c57f388f-2e03-48f6-b055-bfb0510fd774
Maestro ID: 373c50f0-14a3-45b7-833f-ccc086211379
The worktree children filter in SessionList was hiding the active
session when it had no unread tabs and wasn't busy. Added activeSessionId
exemption so the user's current worktree always appears in the left bar.
…pdate tests

- Fix DEFAULT_SHORTCUTS.maestroCue → openCue in CueHelpModal (runtime crash)
- Remove orphaned auto-scroll toggle JSX and state refs in TerminalOutput
- Remove orphaned CueYamlEditor import/state in CueModal (replaced by pipeline editor)
- Remove orphaned stats/WakaTime settings and effects in EncoreTab
- Remove duplicate filterUnreadAgents branch in useMainKeyboardHandler
- Add missing imports in DocumentGenerationView (MermaidRenderer, useClickOutside, etc.)
- Prefix unused readOnlyMode param in agent-spawner
- Remove unnecessary eslint-disable comment in MainPanel
- Update CueModal test: YAML editor assertion → stub no-throw check
- Update keyboard handler test: Cmd+T in terminal mode correctly blocked (AI mode only)
SSH Group Chat participants crashed immediately (exit code 1) because
large prompts were embedded in bash -c CLI args via buildSshCommand(),
where ProcessManager couldn't detect --input-format stream-json flags
to enable stdin delivery. Switched to buildSshCommandWithStdin() for
large prompts, matching the proven pattern in process:spawn IPC handler.

Also added missing SSH wrapping to spawnModeratorSynthesis().
Added a useEffect in App.tsx that tracks inputMode transitions via a ref.
When switching from terminal back to AI mode (via tab click, Cmd+J, or any
other path), the input textarea is automatically focused so the user can
immediately start typing.

Claude ID: 3ce1f013-9673-40ec-ac0c-5cf1eaca0198
Maestro ID: 373c50f0-14a3-45b7-833f-ccc086211379
- Session cleanup now kills AI, legacy terminal, and tab PTYs reliably 🔥
- Terminal tabs get proper per-tab process IDs via `getTerminalSessionId` 🧩
- Closing sessions now iterates all `terminalTabs` to terminate each PTY ✅
- Deleting sessions also shuts down every terminal tab process cleanly 🧹
- Improved test coverage for multi-tab PTY termination on close 🧪
- More resilient error handling around terminal-tab process kills 🛡️
- Sentry captures tab-kill failures with session and tab context 🕵️
- Clearer lifecycle comments and intent: “kill all processes” upfront 📝
Cmd+0 was previously consumed by font size reset, blocking the goToLastTab
shortcut. Now Cmd+0 goes to the last tab (consistent with Cmd+1-9 tab
navigation) and Cmd+Shift+0 resets font size. Font size reset is now
customizable in Settings → Shortcuts (moved from FIXED_SHORTCUTS to
DEFAULT_SHORTCUTS).
- Splash screen now waits for initial file tree readiness before dismissing 🎬
- Added `initialFileTreeReady` gate to session store initialization flow 🧱
- New splash progress stage highlights file indexing at 80% 🗂️
- UI rendering stage bumped to 90% once file tree finishes loading 📈
- File tree manager signals readiness exactly once on success or error 🔔
- Session restoration unblocks splash immediately when no sessions exist 🧹
- Session-load failures now mark file tree ready to prevent startup hangs 🧯
- App initialization reacts to settings, sessions, and file tree readiness 🔄
- Improved startup messaging: “Indexing the score...” during file discovery 🎻
- Updated tests to cover new three-gate splash behavior and progress ✅
The scroll-into-view logic used full container bounds but didn't
subtract the widths of the sticky left (search/filter) and right (+)
elements, causing the active tab's close button to be hidden behind
them when jumping to a tab or after auto-rename.
Session rows and process rows now show a hover-visible ExternalLink
button that navigates to the agent (session) or specific tab and
closes the modal. Group chat processes get a similar button that
navigates to the group chat.
Show a confirmation modal when closing AI tabs that have draft text or
staged images. Applies to single tab close (Cmd+W, click X), and bulk
operations (close all, close other, close left, close right).
… retarget

Resolved 13 merge conflicts from squash-merging the theme integration
branch onto 0.16.0-RC. Core WCAG-compliant theme token system preserved
(ThemeColors expanded to 30 required fields with sectioned CustomThemeBuilder).
Fixed 4 test expectations where tests expected theme tokens but components
retained RC's hardcoded color values (LogViewer info/warn/error levels,
PromptComposerModal backdrop). All 563 test files pass (23018 tests).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
spawnAgent was dropping the readOnly flag when calling spawnJsonLineAgent,
and spawnJsonLineAgent ignored it entirely. Now readOnlyArgs and
readOnlyEnvOverrides from agent definitions are applied for all JSON line
agents (Codex, OpenCode, Factory Droid) in read-only/plan mode.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… in CLI

Three fixes for CLI batch/send agent spawning:

1. Pass readOnly flag to spawnJsonLineAgent (was silently dropped)
2. Skip YOLO/bypass args in read-only mode for all agents — they were
   overriding read-only flags (--dangerously-skip-permissions for Claude,
   --dangerously-bypass-approvals-and-sandbox for Codex, -y for Gemini)
3. Read customModel from agent session config and pass it via modelArgs
   so CLI-spawned agents use the model configured in the desktop UI

Also fixes OpenCode read-only env overrides to keep blanket permission
grants (prevents stdin hangs in batch mode) since --agent plan handles
read-only enforcement at the CLI level.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Invert stale test asserting --dangerously-skip-permissions is present in
  read-only mode; add coverage for its presence in normal mode
- Skip yolo-arg filtering for agents without CLI-level read-only enforcement
  (Gemini CLI needs -y to avoid interactive prompt hang with closed stdin)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…utoRun (RunMaestro#579)

* MAESTRO: fix subdirectory document path resolution in CLI auto-run handler

The configureAutoRun event handler was stripping absolute paths to basenames,
losing subdirectory components. Documents in subfolders of the Auto Run folder
(e.g., "2026-03-16-Feature/PHASE-01.md") would resolve to just "PHASE-01",
causing the batch processor to fail silently with "No unchecked tasks found".

Now computes the path relative to autoRunFolderPath, preserving subdirectory
structure (e.g., "2026-03-16-Feature/PHASE-01"). Falls back to basename-only
for paths not under the folder.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* MAESTRO: add --agent flag to auto-run CLI command

Add -a/--agent option that resolves agent by UUID (with partial ID
matching via resolveAgentId). Takes precedence over --session when
both are provided.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* MAESTRO: add {{AGENT_ID}} template variable and update system prompt with --agent flag

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* MAESTRO: deprecate --session flag in auto-run CLI, prefer --agent

--session now prints a deprecation warning and routes through
resolveAgentId (same as --agent). Tests updated to use --agent
as the primary targeting method.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* MAESTRO: fix CLI auto-run review feedback

- Wrap resolveAgentId in try-catch to handle invalid agent IDs gracefully
- Remove false-positive path prefix match branch in document path resolution
- Use console.warn instead of console.error for deprecation warning

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: export unused DocumentSelector/DocumentEditor to resolve TS6133

Pre-existing lint failures — these components are reserved for upcoming
multi-document UI but were flagged by noUnusedLocals.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: update deprecation test for console.warn and format system prompt

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: format auto-run test with prettier

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address second round of review feedback

- Fix system prompt: "picks an arbitrary agent" → "selects the first available agent"
- Add case-insensitive path prefix check for Windows drive-letter compatibility
- Add regression test for resolveAgentId throwing with clean error handling

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: break long line in App.tsx for prettier compliance

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…ng test assertion

- Add `return` before process.exit(1) in the resolveAgentId catch block to
  prevent continued execution with uninitialized sessionId in test environments
- Assert deprecation warning fires in "prefer --agent over --session" test
- Clean up unused `msg` parameter (TS6133)
…adonly-mode

fix: enforce read-only mode for JSON line agents and pass customModel in CLI
The task-execution call forwards customModel but the synopsis call did not,
causing synopsis generation to use the default model instead of the user's
configured custom model.
…custom-model

Fix: Forward customModel to batch synopsis call
RunMaestro#518)

* feat: add auto-follow toggle to batch progress banner (RunMaestro#347)

Add "Follow active task" checkbox to the Auto Run batch progress banner
that auto-selects the currently running document when the batch document
index changes. Includes state tracking refs for detecting batch start
and document transitions.

* feat: add scroll-to-active-task and focus-safe auto-follow in AutoRun (RunMaestro#347)

- Add autoFollowEnabled prop to AutoRunProps interface
- Guard both focus-stealing useEffects (mode change + document selection)
  to skip .focus() when autoFollowEnabled && batchRunState.isRunning
- Add useEffect that scrolls to first unchecked checkbox in preview mode
  using scrollIntoView (focus-safe) with 150ms render delay
- Pass autoFollowEnabled through RightPanel autoRunSharedProps
- Add autoFollowEnabled to React.memo comparison function

* feat: auto-switch Right Bar to autorun tab and preview mode on batch start (RunMaestro#347)

When auto-follow is enabled and a batch run starts, automatically:
- Switch the Right Bar to the Auto Run tab
- Open the right panel if it was closed
- Switch to preview mode if currently in edit mode

This only triggers on batch START (not on subsequent document transitions),
so users can freely switch tabs mid-run without being overridden.

* refactor: extract auto-follow logic into useAutoRunAutoFollow hook (RunMaestro#347)

Move auto-follow state, refs, and useEffect from RightPanel.tsx into a
dedicated hook for testability. Add 8 test cases covering document
auto-selection, tab switching, panel opening, and ref reset behavior.

* feat: add Follow active task toggle to Auto Run config modal (RunMaestro#347)

- Lift autoFollowEnabled state from local useState to zustand uiStore
- Add checkbox in BatchRunnerModal footer, applied on Go
- Immediately jump to active task when toggling on during a running batch

* fix: add isRunning guard to auto-follow and remove unused toggleRightPanel (RunMaestro#347)

- Gate auto-select on isRunning to prevent spurious document navigation
  when toggling auto-follow after a batch ends
- Remove unused toggleRightPanel from UseAutoRunAutoFollowDeps interface
- Early-return in scroll-to-task effect when preview has no checkboxes

* fix: address PR review comments for auto-follow (RunMaestro#347)

- Remove local autoFollowEnabled state in BatchRunnerModal to prevent
  stale overwrite of store value on Go action
- Wrap scroll-to-task setTimeout with requestAnimationFrame for more
  reliable DOM targeting after React render
- Add test for enabling auto-follow during an already-running batch

* fix: prevent focus-stealing on batch run stop by reading isRunning from ref (RunMaestro#347)
…after merge

ProcessMonitor: Re-add SSH remote badges (Local/SSH indicators on session
and process rows) that were present in the RC but missing from the theme
branch's non-conflicting version.

QuickActionsModal: Re-add agent switcher mode ('agents' initialMode) with
dedicated agentActions list, sorting, placeholder, and aria-label that were
present in the RC.

Both source files needed these RC additions to match their RC test files
(Category 7 merge conflict resolution).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Auto-formatted 8 files that had style inconsistencies after merging
runmaestro/0.16.0-RC into the theme branch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ility

- UIStore: Add autoFollowEnabled state and setAutoFollowEnabled action
  (used by useAutoRunAutoFollow hook from RC)
- SessionInfo: Add customModel field (used by CLI send command)
- AgentCapabilities: Add supportsWizard, supportsGroupChatModeration,
  usesJsonLineOutput, usesCombinedContextWindow fields + accept full RC
  capabilities.ts (used by agent-spawner)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Accept RC versions for files that kept the theme branch's version during
the non-conflicting merge resolution but caused test failures:

Source files updated to RC:
- cue-engine.ts, cue-types.ts, cue-file-watcher.ts, cue-github-poller.ts
- agentConstants.ts, cue-pipeline-types.ts, pipelineToYaml.ts

Test files updated to RC:
- capabilities.test.ts, session-storage.test.ts
- cue-completion-chains.test.ts, cue-concurrency.test.ts
- cue-engine.test.ts, cue-github-poller.test.ts
- pipelineToYaml.test.ts, useInputProcessing.test.ts
- useRemoteHandlers.test.ts

All 581 test files now pass (23,301 tests, 0 failures).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 19, 2026

Important

Review skipped

Too many files!

This PR contains 186 files, which is 36 over the limit of 150.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 89c8fe26-65c9-46d5-acde-ead86b569aa7

📥 Commits

Reviewing files that changed from the base of the PR and between df6a800 and c8ea5da.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (186)
  • .ai-audit/.gitignore
  • .ai-audit/annotations.jsonl
  • .ai-audit/attestation.json
  • .ai-audit/config.json
  • .ai-audit/manifest.json
  • .github/workflows/ci.yml
  • .gitignore
  • AGENT_SUPPORT.md
  • CLAUDE-AGENTS.md
  • CLAUDE-SESSION.md
  • src/__tests__/cli/commands/auto-run.test.ts
  • src/__tests__/cli/commands/list-sessions.test.ts
  • src/__tests__/cli/services/agent-spawner.test.ts
  • src/__tests__/main/cue/cue-executor.test.ts
  • src/__tests__/main/cue/cue-file-watcher.test.ts
  • src/__tests__/main/cue/cue-filter.test.ts
  • src/__tests__/main/cue/cue-ipc-handlers.test.ts
  • src/__tests__/main/cue/cue-reconciler.test.ts
  • src/__tests__/main/cue/cue-yaml-loader.test.ts
  • src/__tests__/main/process-manager/handlers/StdoutHandler.test.ts
  • src/__tests__/main/utils/logger.test.ts
  • src/__tests__/main/utils/ssh-command-builder.test.ts
  • src/__tests__/main/utils/stripAnsi.test.ts
  • src/__tests__/main/utils/terminalFilter.test.ts
  • src/__tests__/main/web-server/handlers/messageHandlers.test.ts
  • src/__tests__/main/web-server/managers/CallbackRegistry.test.ts
  • src/__tests__/main/web-server/web-server-factory.test.ts
  • src/__tests__/renderer/components/AgentSessionsModal.test.tsx
  • src/__tests__/renderer/components/AutoRunExpandedModal.test.tsx
  • src/__tests__/renderer/components/CueModal.test.tsx
  • src/__tests__/renderer/components/CuePipelineEditor/utils/yamlToPipeline.test.ts
  • src/__tests__/renderer/components/CustomThemeBuilder.test.tsx
  • src/__tests__/renderer/components/DocumentGraph/DocumentNode.test.tsx
  • src/__tests__/renderer/components/GitDiffViewer.test.tsx
  • src/__tests__/renderer/components/GroupChatModals.test.tsx
  • src/__tests__/renderer/components/HistoryHelpModal.test.tsx
  • src/__tests__/renderer/components/LogViewer.test.tsx
  • src/__tests__/renderer/components/PromptComposerModal.test.tsx
  • src/__tests__/renderer/components/TabBar.test.tsx
  • src/__tests__/renderer/components/UsageDashboard/responsive-layout.test.tsx
  • src/__tests__/renderer/components/UsageDashboard/state-transition-animations.test.tsx
  • src/__tests__/renderer/components/auto-scroll.test.tsx
  • src/__tests__/renderer/constants/themes.test.ts
  • src/__tests__/renderer/hooks/symphony/useSymphony.test.ts
  • src/__tests__/renderer/hooks/useAgentCapabilities.test.ts
  • src/__tests__/renderer/hooks/useAutoRunAutoFollow.test.ts
  • src/__tests__/renderer/hooks/useCueAutoDiscovery.test.ts
  • src/__tests__/renderer/hooks/useInlineWizard.test.ts
  • src/__tests__/renderer/hooks/useInlineWizard_overrides.test.ts
  • src/__tests__/renderer/hooks/useRemoteIntegration.test.ts
  • src/__tests__/renderer/services/contextGroomer.test.ts
  • src/__tests__/renderer/utils/markdownConfig.test.ts
  • src/__tests__/shared/stringUtils.test.ts
  • src/__tests__/web/mobile/AllSessionsView.test.tsx
  • src/__tests__/web/mobile/OfflineQueueBanner.test.tsx
  • src/__tests__/web/mobile/SessionPillBar.test.tsx
  • src/__tests__/web/utils/cssCustomProperties.test.ts
  • src/cli/commands/auto-run.ts
  • src/cli/commands/list-sessions.ts
  • src/cli/commands/send.ts
  • src/cli/index.ts
  • src/cli/services/agent-spawner.ts
  • src/main/agents/definitions.ts
  • src/main/app-lifecycle/quit-handler.ts
  • src/main/cue/cue-executor.ts
  • src/main/cue/cue-filter.ts
  • src/main/cue/cue-yaml-loader.ts
  • src/main/group-chat/group-chat-storage.ts
  • src/main/index.ts
  • src/main/ipc/handlers/cue.ts
  • src/main/ipc/handlers/web.ts
  • src/main/parsers/claude-output-parser.ts
  • src/main/parsers/usage-aggregator.ts
  • src/main/preload/cue.ts
  • src/main/preload/process.ts
  • src/main/process-listeners/usage-listener.ts
  • src/main/process-manager/handlers/StdoutHandler.ts
  • src/main/utils/logger.ts
  • src/main/utils/ssh-command-builder.ts
  • src/main/utils/stripAnsi.ts
  • src/main/utils/terminalFilter.ts
  • src/main/web-server/WebServer.ts
  • src/main/web-server/handlers/messageHandlers.ts
  • src/main/web-server/managers/CallbackRegistry.ts
  • src/main/web-server/types.ts
  • src/main/web-server/web-server-factory.ts
  • src/prompts/maestro-system-prompt.md
  • src/renderer/App.tsx
  • src/renderer/components/AICommandsPanel.tsx
  • src/renderer/components/AchievementCard.tsx
  • src/renderer/components/AgentCreationDialog.tsx
  • src/renderer/components/AgentPromptComposerModal.tsx
  • src/renderer/components/AgentSessionsBrowser.tsx
  • src/renderer/components/AgentSessionsModal.tsx
  • src/renderer/components/AutoRun.tsx
  • src/renderer/components/AutoRunDocumentSelector.tsx
  • src/renderer/components/AutoRunExpandedModal.tsx
  • src/renderer/components/AutoRunnerHelpModal.tsx
  • src/renderer/components/ContextWarningSash.tsx
  • src/renderer/components/CreatePRModal.tsx
  • src/renderer/components/CreateWorktreeModal.tsx
  • src/renderer/components/CsvTableRenderer.tsx
  • src/renderer/components/CueModal.tsx
  • src/renderer/components/CuePipelineEditor/CuePipelineEditor.tsx
  • src/renderer/components/CuePipelineEditor/panels/EdgeConfigPanel.tsx
  • src/renderer/components/CuePipelineEditor/panels/NodeConfigPanel.tsx
  • src/renderer/components/CuePipelineEditor/utils/yamlToPipeline.ts
  • src/renderer/components/CustomThemeBuilder.tsx
  • src/renderer/components/DeleteAgentConfirmModal.tsx
  • src/renderer/components/DeleteWorktreeModal.tsx
  • src/renderer/components/DocumentGraph/DocumentNode.tsx
  • src/renderer/components/DocumentsPanel.tsx
  • src/renderer/components/ExecutionQueueBrowser.tsx
  • src/renderer/components/FilePreview.tsx
  • src/renderer/components/GitDiffViewer.tsx
  • src/renderer/components/GitLogViewer.tsx
  • src/renderer/components/GroupChatInput.tsx
  • src/renderer/components/GroupChatModal.tsx
  • src/renderer/components/GroupChatPanel.tsx
  • src/renderer/components/HistoryDetailModal.tsx
  • src/renderer/components/HistoryHelpModal.tsx
  • src/renderer/components/ImageDiffViewer.tsx
  • src/renderer/components/InlineWizard/DocumentGenerationView.tsx
  • src/renderer/components/KeyboardMasteryCelebration.tsx
  • src/renderer/components/LeaderboardRegistrationModal.tsx
  • src/renderer/components/LightboxModal.tsx
  • src/renderer/components/LogViewer.tsx
  • src/renderer/components/MainPanel.tsx
  • src/renderer/components/MarketplaceModal.tsx
  • src/renderer/components/MergeProgressModal.tsx
  • src/renderer/components/MergeProgressOverlay.tsx
  • src/renderer/components/NotificationsPanel.tsx
  • src/renderer/components/OpenSpecCommandsPanel.tsx
  • src/renderer/components/PlaygroundPanel.tsx
  • src/renderer/components/ProcessMonitor.tsx
  • src/renderer/components/QueuedItemsList.tsx
  • src/renderer/components/QuitConfirmModal.tsx
  • src/renderer/components/SessionList/SessionList.tsx
  • src/renderer/components/SpecKitCommandsPanel.tsx
  • src/renderer/components/StandingOvationOverlay.tsx
  • src/renderer/components/SummarizeProgressModal.tsx
  • src/renderer/components/SummarizeProgressOverlay.tsx
  • src/renderer/components/SymphonyModal.tsx
  • src/renderer/components/TabBar.tsx
  • src/renderer/components/TabSwitcherModal.tsx
  • src/renderer/components/TerminalOutput.tsx
  • src/renderer/components/TransferProgressModal.tsx
  • src/renderer/components/UsageDashboard/ActivityHeatmap.tsx
  • src/renderer/components/UsageDashboard/AgentComparisonChart.tsx
  • src/renderer/components/UsageDashboard/AgentEfficiencyChart.tsx
  • src/renderer/components/UsageDashboard/ChartErrorBoundary.tsx
  • src/renderer/components/UsageDashboard/PeakHoursChart.tsx
  • src/renderer/components/UsageDashboard/SessionStats.tsx
  • src/renderer/components/Wizard/MaestroWizard.tsx
  • src/renderer/components/Wizard/screens/AgentSelectionScreen.tsx
  • src/renderer/components/Wizard/screens/ConversationScreen.tsx
  • src/renderer/components/Wizard/shared/DocumentEditor.tsx
  • src/renderer/components/WorktreeConfigModal.tsx
  • src/renderer/components/XTerminal.tsx
  • src/renderer/components/shared/AgentSelector.tsx
  • src/renderer/constants/shortcuts.ts
  • src/renderer/hooks/agent/useAgentCapabilities.ts
  • src/renderer/hooks/agent/useAgentSessionManagement.ts
  • src/renderer/hooks/agent/useAvailableAgents.ts
  • src/renderer/hooks/batch/useAutoRunAutoFollow.ts
  • src/renderer/hooks/batch/useInlineWizard.ts
  • src/renderer/hooks/git/useFileExplorerEffects.ts
  • src/renderer/hooks/remote/useRemoteIntegration.ts
  • src/renderer/hooks/tabs/useTabHandlers.ts
  • src/renderer/hooks/useCueAutoDiscovery.ts
  • src/renderer/services/contextGroomer.ts
  • src/renderer/stores/modalStore.ts
  • src/renderer/stores/settingsStore.ts
  • src/renderer/stores/uiStore.ts
  • src/renderer/utils/markdownConfig.ts
  • src/renderer/utils/sessionValidation.ts
  • src/shared/stringUtils.ts
  • src/shared/templateVariables.ts
  • src/shared/theme-types.ts
  • src/shared/themes.ts
  • src/shared/types.ts
  • src/web/components/ThemeProvider.tsx
  • src/web/mobile/AllSessionsView.tsx
  • src/web/mobile/SessionPillBar.tsx
  • src/web/utils/cssCustomProperties.ts
  • vitest.config.mts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

You can enable review details to help with troubleshooting, context usage and more.

Enable the reviews.review_details setting to include review details such as the model used, the time taken for each step and more in the review comments.

@openasocket openasocket requested a review from pedramamini March 19, 2026 07:27
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.

6 participants