- {shortcuts.map(({ key, label, value }) => {
- const isModified = mergedShortcuts[key] !== DEFAULT_KEYBOARD_SHORTCUTS[key];
- const isEditing = editingShortcut === key;
+
+ {editable && (
+
+
+
+ )}
+ {Object.entries(groupedShortcuts).map(([category, shortcuts]) => {
+ const colors = CATEGORY_COLORS[category as keyof typeof CATEGORY_COLORS];
+ return (
+
+
{colors.label}
+
+ {shortcuts.map(({ key, label, value }) => {
+ const isModified = mergedShortcuts[key] !== DEFAULT_KEYBOARD_SHORTCUTS[key];
+ const isEditing = editingShortcut === key;
- return (
-
editable && !isEditing && handleStartEdit(key)}
- data-testid={`shortcut-row-${key}`}
- >
-
{label}
-
- {isEditing ? (
-
e.stopPropagation()}
- >
- {/* Modifier checkboxes */}
-
-
-
- handleModifierChange('cmdCtrl', !!checked, key)
- }
- className="h-3.5 w-3.5"
- />
-
-
-
-
- handleModifierChange('alt', !!checked, key)
- }
- className="h-3.5 w-3.5"
- />
-
-
-
-
- handleModifierChange('shift', !!checked, key)
- }
- className="h-3.5 w-3.5"
- />
-
-
+ return (
+
editable && !isEditing && handleStartEdit(key)}
+ data-testid={`shortcut-row-${key}`}
+ >
+
{label}
+
+ {isEditing ? (
+
e.stopPropagation()}
+ >
+ {/* Modifier checkboxes */}
+
+
+
+ handleModifierChange('cmdCtrl', !!checked, key)
+ }
+ className="h-3.5 w-3.5"
+ />
+
+
+
+
+ handleModifierChange('alt', !!checked, key)
+ }
+ className="h-3.5 w-3.5"
+ />
+
+
+
+
+ handleModifierChange('shift', !!checked, key)
+ }
+ className="h-3.5 w-3.5"
+ />
+
-
+
-
handleKeyChange(e.target.value, key)}
- onKeyDown={handleKeyDown}
- className={cn(
- 'w-12 h-7 text-center font-mono text-xs uppercase',
- shortcutError && 'border-red-500 focus-visible:ring-red-500'
- )}
- placeholder="Key"
- maxLength={1}
- autoFocus
- data-testid={`edit-shortcut-input-${key}`}
- />
-
-
- ) : (
- <>
-
- {formatShortcut(value, true)}
-
- {isModified && editable && (
-
-
-
-
-
- Reset to default ({DEFAULT_KEYBOARD_SHORTCUTS[key]})
-
-
+
+
+
handleKeyChange(e.target.value, key)}
+ onKeyDown={handleKeyDown}
+ className={cn(
+ 'w-12 h-7 text-center font-mono text-xs uppercase',
+ shortcutError && 'border-red-500 focus-visible:ring-red-500'
)}
- {isModified && !editable && (
-
+ placeholder="Key"
+ maxLength={1}
+ autoFocus
+ data-testid={`edit-shortcut-input-${key}`}
+ />
+
+
+
+ ) : (
+ <>
+
- )}
- >
- )}
-
+ >
+ {formatShortcut(value, true)}
+
+ {isModified && editable && (
+
+
+
+
+
+ Reset to default ({DEFAULT_KEYBOARD_SHORTCUTS[key]})
+
+
+ )}
+ {isModified && !editable && (
+
+ )}
+ {editable && !isModified && (
+
+ )}
+ >
+ )}
- );
- })}
-
- {editingShortcut &&
- shortcutError &&
- SHORTCUT_CATEGORIES[editingShortcut] === category && (
-
{shortcutError}
- )}
+
+ );
+ })}
- );
- })}
-
-
+ {editingShortcut &&
+ shortcutError &&
+ SHORTCUT_CATEGORIES[editingShortcut] === category && (
+
{shortcutError}
+ )}
+
+ );
+ })}
+
);
}
diff --git a/apps/ui/src/components/views/board-view/board-controls.tsx b/apps/ui/src/components/views/board-view/board-controls.tsx
index 8584bbdb..2baa7ceb 100644
--- a/apps/ui/src/components/views/board-view/board-controls.tsx
+++ b/apps/ui/src/components/views/board-view/board-controls.tsx
@@ -1,4 +1,4 @@
-import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
+import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
import { ImageIcon } from 'lucide-react';
import { cn } from '@/lib/utils';
@@ -18,24 +18,22 @@ export function BoardControls({ isMounted, onShowBoardBackground }: BoardControl
);
return (
-
-
- {/* Board Background Button */}
-
-
-
-
-
- Board Background Settings
-
-
-
-
+
+ {/* Board Background Button */}
+
+
+
+
+
+ Board Background Settings
+
+
+
);
}
diff --git a/apps/ui/src/components/views/board-view/components/kanban-card/card-badges.tsx b/apps/ui/src/components/views/board-view/components/kanban-card/card-badges.tsx
index 4563bc06..90b709c2 100644
--- a/apps/ui/src/components/views/board-view/components/kanban-card/card-badges.tsx
+++ b/apps/ui/src/components/views/board-view/components/kanban-card/card-badges.tsx
@@ -2,7 +2,7 @@
import { memo, useEffect, useMemo, useState } from 'react';
import { Feature, useAppStore } from '@/store/app-store';
import { cn } from '@/lib/utils';
-import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
+import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
import { AlertCircle, Lock, Hand, Sparkles, SkipForward } from 'lucide-react';
import { getBlockingDependencies } from '@automaker/dependency-resolver';
import { useShallow } from 'zustand/react/shallow';
@@ -28,24 +28,22 @@ export const CardBadges = memo(function CardBadges({ feature }: CardBadgesProps)
return (
{/* Error badge */}
-
-
-
-
-
-
- {feature.error}
-
-
-
+
+
+
+
+
+ {feature.error}
+
+
);
});
@@ -138,147 +136,137 @@ export const PriorityBadges = memo(function PriorityBadges({
{/* Priority badge */}
{feature.priority && (
-
-
-
-
-
- {feature.priority === 1 ? 'H' : feature.priority === 2 ? 'M' : 'L'}
-
-
-
-
-
- {feature.priority === 1
- ? 'High Priority'
- : feature.priority === 2
- ? 'Medium Priority'
- : 'Low Priority'}
-
-
-
-
+
+
+
+
+ {feature.priority === 1 ? 'H' : feature.priority === 2 ? 'M' : 'L'}
+
+
+
+
+
+ {feature.priority === 1
+ ? 'High Priority'
+ : feature.priority === 2
+ ? 'Medium Priority'
+ : 'Low Priority'}
+
+
+
)}
{/* Manual verification badge */}
{showManualVerification && (
-
-
-
-
-
-
-
-
- Manual verification required
-
-
-
+
+
+
+
+
+
+
+ Manual verification required
+
+
)}
{/* Blocked badge */}
{isBlocked && (
-
-
-
-
-
-
-
-
-
- Blocked by {blockingDependencies.length} incomplete{' '}
- {blockingDependencies.length === 1 ? 'dependency' : 'dependencies'}
-
-
- {blockingDependencies
- .map((depId) => {
- const dep = features.find((f) => f.id === depId);
- return dep?.description || depId;
- })
- .join(', ')}
-
-
-
-
+
+
+
+
+
+
+
+
+ Blocked by {blockingDependencies.length} incomplete{' '}
+ {blockingDependencies.length === 1 ? 'dependency' : 'dependencies'}
+
+
+ {blockingDependencies
+ .map((depId) => {
+ const dep = features.find((f) => f.id === depId);
+ return dep?.description || depId;
+ })
+ .join(', ')}
+
+
+
)}
{/* Just Finished badge */}
{isJustFinished && (
-
-
-
-
-
-
-
-
- Agent just finished working on this feature
-
-
-
+
+
+
+
+
+
+
+ Agent just finished working on this feature
+
+
)}
{/* Pipeline exclusion badge */}
{hasPipelineExclusions && (
-
-
-
-
-
-
-
-
-
- {allPipelinesExcluded
- ? 'All pipelines skipped'
- : `${excludedStepCount} of ${totalPipelineSteps} pipeline${totalPipelineSteps !== 1 ? 's' : ''} skipped`}
-
-
- {allPipelinesExcluded
- ? 'This feature will skip all custom pipeline steps'
- : 'Some custom pipeline steps will be skipped for this feature'}
-
-
-
-
+
+
+
+
+
+
+
+
+ {allPipelinesExcluded
+ ? 'All pipelines skipped'
+ : `${excludedStepCount} of ${totalPipelineSteps} pipeline${totalPipelineSteps !== 1 ? 's' : ''} skipped`}
+
+
+ {allPipelinesExcluded
+ ? 'This feature will skip all custom pipeline steps'
+ : 'Some custom pipeline steps will be skipped for this feature'}
+
+
+
)}
);
diff --git a/apps/ui/src/components/views/board-view/components/list-view/list-row.tsx b/apps/ui/src/components/views/board-view/components/list-view/list-row.tsx
index a3d10eb7..32b0f445 100644
--- a/apps/ui/src/components/views/board-view/components/list-view/list-row.tsx
+++ b/apps/ui/src/components/views/board-view/components/list-view/list-row.tsx
@@ -3,7 +3,7 @@
// @ts-nocheck
import { memo, useCallback, useState, useEffect } from 'react';
import { cn } from '@/lib/utils';
-import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
+import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
import { AlertCircle, Lock, Hand, Sparkles, FileText } from 'lucide-react';
import type { Feature } from '@/store/app-store';
import { RowActions, type RowActionHandlers } from './row-actions';
@@ -149,29 +149,27 @@ const IndicatorBadges = memo(function IndicatorBadges({
return (
-
- {badges.map((badge) => (
-
-
-
-
-
-
-
- {badge.tooltip}
-
-
- ))}
-
+ {badges.map((badge) => (
+
+
+
+
+
+
+
+ {badge.tooltip}
+
+
+ ))}
);
});
diff --git a/apps/ui/src/components/views/board-view/dialogs/add-feature-dialog.tsx b/apps/ui/src/components/views/board-view/dialogs/add-feature-dialog.tsx
index c8ff7825..b3dedc6a 100644
--- a/apps/ui/src/components/views/board-view/dialogs/add-feature-dialog.tsx
+++ b/apps/ui/src/components/views/board-view/dialogs/add-feature-dialog.tsx
@@ -50,7 +50,7 @@ import {
} from '../shared';
import type { WorkMode } from '../shared';
import { PhaseModelSelector } from '@/components/views/settings-view/model-defaults/phase-model-selector';
-import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
+import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
import {
getAncestors,
formatAncestorContextForPrompt,
@@ -528,26 +528,24 @@ export function AddFeatureDialog({
AI & Execution