From c1f480fe497ab5e3ece745eca723ad108f708c9a Mon Sep 17 00:00:00 2001 From: DhanushSantosh Date: Wed, 28 Jan 2026 19:55:08 +0530 Subject: [PATCH 01/10] fix(ui): Make GitHub Copilot icon theme-aware for light mode visibility The Copilot icon had a hardcoded white fill that made it invisible on light theme backgrounds. Changed to use currentColor so it adapts to theme and respects CSS text color classes. Co-Authored-By: Claude Sonnet 4.5 --- apps/ui/src/components/ui/provider-icon.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/ui/src/components/ui/provider-icon.tsx b/apps/ui/src/components/ui/provider-icon.tsx index b2de8581..415872ce 100644 --- a/apps/ui/src/components/ui/provider-icon.tsx +++ b/apps/ui/src/components/ui/provider-icon.tsx @@ -116,9 +116,8 @@ const PROVIDER_ICON_DEFINITIONS: Record }, copilot: { viewBox: '0 0 98 96', - // Official GitHub Octocat logo mark + // Official GitHub Octocat logo mark (theme-aware via currentColor) path: 'M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z', - fill: '#ffffff', }, }; From 1a460c301af93add0d84a25306b76e0fb3517607 Mon Sep 17 00:00:00 2001 From: DhanushSantosh Date: Wed, 28 Jan 2026 19:55:23 +0530 Subject: [PATCH 02/10] fix(test): Set HOSTNAME in dev server tests for consistent behavior Dev server test was failing on non-localhost hostnames (e.g., 'fedora') because it expected 'localhost' in the URL. Now sets HOSTNAME env var in test setup and restores it in teardown for consistent test behavior across all environments. Co-Authored-By: Claude Sonnet 4.5 --- .../tests/unit/services/dev-server-service.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/server/tests/unit/services/dev-server-service.test.ts b/apps/server/tests/unit/services/dev-server-service.test.ts index 03d3d01c..d390926a 100644 --- a/apps/server/tests/unit/services/dev-server-service.test.ts +++ b/apps/server/tests/unit/services/dev-server-service.test.ts @@ -30,11 +30,16 @@ import net from 'net'; describe('dev-server-service.ts', () => { let testDir: string; + let originalHostname: string | undefined; beforeEach(async () => { vi.clearAllMocks(); vi.resetModules(); + // Store and set HOSTNAME for consistent test behavior + originalHostname = process.env.HOSTNAME; + process.env.HOSTNAME = 'localhost'; + testDir = path.join(os.tmpdir(), `dev-server-test-${Date.now()}`); await fs.mkdir(testDir, { recursive: true }); @@ -56,6 +61,13 @@ describe('dev-server-service.ts', () => { }); afterEach(async () => { + // Restore original HOSTNAME + if (originalHostname === undefined) { + delete process.env.HOSTNAME; + } else { + process.env.HOSTNAME = originalHostname; + } + try { await fs.rm(testDir, { recursive: true, force: true }); } catch { From b10501ea79fc7d9e4b3ebafff724eee51d9e749b Mon Sep 17 00:00:00 2001 From: Noam Loewenstern Date: Fri, 30 Jan 2026 02:44:51 +0200 Subject: [PATCH 03/10] fix(ui): handle null selectedWorktree in max concurrency handler --- apps/ui/src/components/views/board-view.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/ui/src/components/views/board-view.tsx b/apps/ui/src/components/views/board-view.tsx index 2624514a..64c4d287 100644 --- a/apps/ui/src/components/views/board-view.tsx +++ b/apps/ui/src/components/views/board-view.tsx @@ -1274,8 +1274,11 @@ export function BoardView() { maxConcurrency={maxConcurrency} runningAgentsCount={runningAutoTasks.length} onConcurrencyChange={(newMaxConcurrency) => { - if (currentProject && selectedWorktree) { - const branchName = selectedWorktree.isMain ? null : selectedWorktree.branch; + if (currentProject) { + // If selectedWorktree is undefined, fallback to null (main/primary worktree) + // Use null for the main worktree, otherwise use the branch name; also null if no worktree selected + const branchName = + selectedWorktree && !selectedWorktree.isMain ? selectedWorktree.branch : null; setMaxConcurrencyForWorktree(currentProject.id, branchName, newMaxConcurrency); // Also update backend if auto mode is running if (autoMode.isRunning) { From 07f777da2241bfc6bda932c5a60594e365c56d3f Mon Sep 17 00:00:00 2001 From: Noam Loewenstern Date: Fri, 30 Jan 2026 02:52:27 +0200 Subject: [PATCH 04/10] Update apps/ui/src/components/views/board-view.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- apps/ui/src/components/views/board-view.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/ui/src/components/views/board-view.tsx b/apps/ui/src/components/views/board-view.tsx index 64c4d287..48d068a1 100644 --- a/apps/ui/src/components/views/board-view.tsx +++ b/apps/ui/src/components/views/board-view.tsx @@ -1275,10 +1275,9 @@ export function BoardView() { runningAgentsCount={runningAutoTasks.length} onConcurrencyChange={(newMaxConcurrency) => { if (currentProject) { - // If selectedWorktree is undefined, fallback to null (main/primary worktree) - // Use null for the main worktree, otherwise use the branch name; also null if no worktree selected - const branchName = - selectedWorktree && !selectedWorktree.isMain ? selectedWorktree.branch : null; + // If selectedWorktree is undefined or it's the main worktree, branchName will be null. + // Otherwise, use the branch name. + const branchName = selectedWorktree?.isMain === false ? selectedWorktree.branch : null; setMaxConcurrencyForWorktree(currentProject.id, branchName, newMaxConcurrency); // Also update backend if auto mode is running if (autoMode.isRunning) { From 7d7d152d4e0ecccf7590b58ee6415bec2a690ac7 Mon Sep 17 00:00:00 2001 From: Kacper Date: Fri, 30 Jan 2026 20:36:33 +0100 Subject: [PATCH 05/10] fix(ui): Adjust sidebar padding for macOS Electron compatibility Updated the sidebar header and navigation components to increase top padding for macOS Electron users from 10px to 38px, ensuring better layout and avoiding overlap with the traffic light controls. This change enhances the user experience on macOS platforms. --- .../components/layout/sidebar/components/sidebar-header.tsx | 4 ++-- .../layout/sidebar/components/sidebar-navigation.tsx | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/ui/src/components/layout/sidebar/components/sidebar-header.tsx b/apps/ui/src/components/layout/sidebar/components/sidebar-header.tsx index 7a92aec9..10b656cf 100644 --- a/apps/ui/src/components/layout/sidebar/components/sidebar-header.tsx +++ b/apps/ui/src/components/layout/sidebar/components/sidebar-header.tsx @@ -89,7 +89,7 @@ export function SidebarHeader({
@@ -240,7 +240,7 @@ export function SidebarHeader({
{/* Header with logo and project dropdown */} diff --git a/apps/ui/src/components/layout/sidebar/components/sidebar-navigation.tsx b/apps/ui/src/components/layout/sidebar/components/sidebar-navigation.tsx index 905448cd..d3e7d5cc 100644 --- a/apps/ui/src/components/layout/sidebar/components/sidebar-navigation.tsx +++ b/apps/ui/src/components/layout/sidebar/components/sidebar-navigation.tsx @@ -3,7 +3,8 @@ import type { NavigateOptions } from '@tanstack/react-router'; import { ChevronDown, Wrench, Github, Folder } from 'lucide-react'; import * as LucideIcons from 'lucide-react'; import type { LucideIcon } from 'lucide-react'; -import { cn } from '@/lib/utils'; +import { cn, isMac } from '@/lib/utils'; +import { isElectron } from '@/lib/electron'; import { formatShortcut, useAppStore } from '@/store/app-store'; import { getAuthenticatedImageUrl } from '@/lib/api-fetch'; import type { NavSection } from '../types'; @@ -117,7 +118,8 @@ export function SidebarNavigation({ className={cn( 'flex-1 overflow-y-auto scrollbar-hide px-3 pb-2', // Add top padding in discord mode since there's no header - sidebarStyle === 'discord' ? 'pt-3' : 'mt-1' + // Extra padding for macOS Electron to avoid traffic light overlap + sidebarStyle === 'discord' ? (isMac && isElectron() ? 'pt-[38px]' : 'pt-3') : 'mt-1' )} > {/* Project name display for classic/discord mode */} From f15725f28a482a12881944ba08e105c5f663acc2 Mon Sep 17 00:00:00 2001 From: Kacper Date: Fri, 30 Jan 2026 20:43:28 +0100 Subject: [PATCH 06/10] refactor(ui): Extract macOS Electron padding into shared constant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extract the hardcoded 'pt-[38px]' magic number into a shared constant MACOS_ELECTRON_TOP_PADDING_CLASS for better maintainability. This addresses the PR #732 review feedback from Gemini Code Assist. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../layout/sidebar/components/sidebar-header.tsx | 5 +++-- .../layout/sidebar/components/sidebar-navigation.tsx | 7 ++++++- apps/ui/src/components/layout/sidebar/constants.ts | 6 ++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/apps/ui/src/components/layout/sidebar/components/sidebar-header.tsx b/apps/ui/src/components/layout/sidebar/components/sidebar-header.tsx index 10b656cf..e926b3da 100644 --- a/apps/ui/src/components/layout/sidebar/components/sidebar-header.tsx +++ b/apps/ui/src/components/layout/sidebar/components/sidebar-header.tsx @@ -6,6 +6,7 @@ import type { LucideIcon } from 'lucide-react'; import { cn, isMac } from '@/lib/utils'; import { formatShortcut } from '@/store/app-store'; import { isElectron, type Project } from '@/lib/electron'; +import { MACOS_ELECTRON_TOP_PADDING_CLASS } from '../constants'; import { getAuthenticatedImageUrl } from '@/lib/api-fetch'; import { useAppStore } from '@/store/app-store'; import { @@ -89,7 +90,7 @@ export function SidebarHeader({
@@ -240,7 +241,7 @@ export function SidebarHeader({
{/* Header with logo and project dropdown */} diff --git a/apps/ui/src/components/layout/sidebar/components/sidebar-navigation.tsx b/apps/ui/src/components/layout/sidebar/components/sidebar-navigation.tsx index d3e7d5cc..2380cc59 100644 --- a/apps/ui/src/components/layout/sidebar/components/sidebar-navigation.tsx +++ b/apps/ui/src/components/layout/sidebar/components/sidebar-navigation.tsx @@ -5,6 +5,7 @@ import * as LucideIcons from 'lucide-react'; import type { LucideIcon } from 'lucide-react'; import { cn, isMac } from '@/lib/utils'; import { isElectron } from '@/lib/electron'; +import { MACOS_ELECTRON_TOP_PADDING_CLASS } from '../constants'; import { formatShortcut, useAppStore } from '@/store/app-store'; import { getAuthenticatedImageUrl } from '@/lib/api-fetch'; import type { NavSection } from '../types'; @@ -119,7 +120,11 @@ export function SidebarNavigation({ 'flex-1 overflow-y-auto scrollbar-hide px-3 pb-2', // Add top padding in discord mode since there's no header // Extra padding for macOS Electron to avoid traffic light overlap - sidebarStyle === 'discord' ? (isMac && isElectron() ? 'pt-[38px]' : 'pt-3') : 'mt-1' + sidebarStyle === 'discord' + ? isMac && isElectron() + ? MACOS_ELECTRON_TOP_PADDING_CLASS + : 'pt-3' + : 'mt-1' )} > {/* Project name display for classic/discord mode */} diff --git a/apps/ui/src/components/layout/sidebar/constants.ts b/apps/ui/src/components/layout/sidebar/constants.ts index 58417fe3..9ab38cff 100644 --- a/apps/ui/src/components/layout/sidebar/constants.ts +++ b/apps/ui/src/components/layout/sidebar/constants.ts @@ -1,5 +1,11 @@ import { darkThemes, lightThemes } from '@/config/theme-options'; +/** + * Tailwind class for top padding on macOS Electron to avoid overlapping with traffic light window controls. + * This padding is applied conditionally when running on macOS in Electron. + */ +export const MACOS_ELECTRON_TOP_PADDING_CLASS = 'pt-[38px]'; + /** * Shared constants for theme submenu positioning and layout. * Used across project-context-menu and project-selector-with-options components From 7fb0d0f2ca51bba971644481abe9ad7c25aacd76 Mon Sep 17 00:00:00 2001 From: Shirone Date: Sat, 31 Jan 2026 12:54:36 +0100 Subject: [PATCH 07/10] refactor(ui): Integrate macOS Electron padding logic into ProjectSwitcher Updated the ProjectSwitcher component to conditionally apply top padding based on the operating system and Electron environment. This change utilizes the newly created MACOS_ELECTRON_TOP_PADDING_CLASS for improved maintainability and consistency across the UI. --- .../layout/project-switcher/project-switcher.tsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/ui/src/components/layout/project-switcher/project-switcher.tsx b/apps/ui/src/components/layout/project-switcher/project-switcher.tsx index 541fa83c..a8aa521f 100644 --- a/apps/ui/src/components/layout/project-switcher/project-switcher.tsx +++ b/apps/ui/src/components/layout/project-switcher/project-switcher.tsx @@ -1,7 +1,7 @@ import { useState, useCallback, useEffect } from 'react'; import { Plus, Bug, FolderOpen, BookOpen } from 'lucide-react'; import { useNavigate, useLocation } from '@tanstack/react-router'; -import { cn } from '@/lib/utils'; +import { cn, isMac } from '@/lib/utils'; import { useAppStore } from '@/store/app-store'; import { useOSDetection } from '@/hooks/use-os-detection'; import { ProjectSwitcherItem } from './components/project-switcher-item'; @@ -11,9 +11,12 @@ import { NotificationBell } from './components/notification-bell'; import { NewProjectModal } from '@/components/dialogs/new-project-modal'; import { OnboardingDialog } from '@/components/layout/sidebar/dialogs'; import { useProjectCreation } from '@/components/layout/sidebar/hooks'; -import { SIDEBAR_FEATURE_FLAGS } from '@/components/layout/sidebar/constants'; +import { + MACOS_ELECTRON_TOP_PADDING_CLASS, + SIDEBAR_FEATURE_FLAGS, +} from '@/components/layout/sidebar/constants'; import type { Project } from '@/lib/electron'; -import { getElectronAPI } from '@/lib/electron'; +import { getElectronAPI, isElectron } from '@/lib/electron'; import { initializeProject, hasAppSpec, hasAutomakerDir } from '@/lib/project-init'; import { toast } from 'sonner'; import { CreateSpecDialog } from '@/components/views/spec-view/dialogs'; @@ -279,7 +282,12 @@ export function ProjectSwitcher() { data-testid="project-switcher" > {/* Automaker Logo and Version */} -
+