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 4bd0b632..b08ba53d 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 @@ -126,16 +126,25 @@ export function AddFeatureDialog({ enhancementModel, defaultPlanningMode, defaultRequirePlanApproval, + defaultAIProfileId, useWorktrees, } = useAppStore(); // Sync defaults when dialog opens useEffect(() => { if (open) { + // Find the default profile if one is set + const defaultProfile = defaultAIProfileId + ? aiProfiles.find((p) => p.id === defaultAIProfileId) + : null; + setNewFeature((prev) => ({ ...prev, skipTests: defaultSkipTests, branchName: defaultBranch || "", + // Use default profile's model/thinkingLevel if set, else fallback to defaults + model: defaultProfile?.model ?? "opus", + thinkingLevel: defaultProfile?.thinkingLevel ?? "none", })); setUseCurrentBranch(true); setPlanningMode(defaultPlanningMode); @@ -147,6 +156,8 @@ export function AddFeatureDialog({ defaultBranch, defaultPlanningMode, defaultRequirePlanApproval, + defaultAIProfileId, + aiProfiles, ]); const handleAdd = () => { diff --git a/apps/ui/src/components/views/settings-view.tsx b/apps/ui/src/components/views/settings-view.tsx index 8729699b..3d64b79c 100644 --- a/apps/ui/src/components/views/settings-view.tsx +++ b/apps/ui/src/components/views/settings-view.tsx @@ -43,6 +43,9 @@ export function SettingsView() { setDefaultPlanningMode, defaultRequirePlanApproval, setDefaultRequirePlanApproval, + defaultAIProfileId, + setDefaultAIProfileId, + aiProfiles, } = useAppStore(); // Convert electron Project to settings-view Project type @@ -127,12 +130,15 @@ export function SettingsView() { useWorktrees={useWorktrees} defaultPlanningMode={defaultPlanningMode} defaultRequirePlanApproval={defaultRequirePlanApproval} + defaultAIProfileId={defaultAIProfileId} + aiProfiles={aiProfiles} onShowProfilesOnlyChange={setShowProfilesOnly} onDefaultSkipTestsChange={setDefaultSkipTests} onEnableDependencyBlockingChange={setEnableDependencyBlocking} onUseWorktreesChange={setUseWorktrees} onDefaultPlanningModeChange={setDefaultPlanningMode} onDefaultRequirePlanApprovalChange={setDefaultRequirePlanApproval} + onDefaultAIProfileIdChange={setDefaultAIProfileId} /> ); case "danger": diff --git a/apps/ui/src/components/views/settings-view/feature-defaults/feature-defaults-section.tsx b/apps/ui/src/components/views/settings-view/feature-defaults/feature-defaults-section.tsx index 947e3123..35842fc5 100644 --- a/apps/ui/src/components/views/settings-view/feature-defaults/feature-defaults-section.tsx +++ b/apps/ui/src/components/views/settings-view/feature-defaults/feature-defaults-section.tsx @@ -2,7 +2,7 @@ import { Label } from "@/components/ui/label"; import { Checkbox } from "@/components/ui/checkbox"; import { FlaskConical, Settings2, TestTube, GitBranch, AlertCircle, - Zap, ClipboardList, FileText, ScrollText, ShieldCheck + Zap, ClipboardList, FileText, ScrollText, ShieldCheck, User } from "lucide-react"; import { cn } from "@/lib/utils"; import { @@ -12,6 +12,7 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; +import type { AIProfile } from "@/store/app-store"; type PlanningMode = 'skip' | 'lite' | 'spec' | 'full'; @@ -22,12 +23,15 @@ interface FeatureDefaultsSectionProps { useWorktrees: boolean; defaultPlanningMode: PlanningMode; defaultRequirePlanApproval: boolean; + defaultAIProfileId: string | null; + aiProfiles: AIProfile[]; onShowProfilesOnlyChange: (value: boolean) => void; onDefaultSkipTestsChange: (value: boolean) => void; onEnableDependencyBlockingChange: (value: boolean) => void; onUseWorktreesChange: (value: boolean) => void; onDefaultPlanningModeChange: (value: PlanningMode) => void; onDefaultRequirePlanApprovalChange: (value: boolean) => void; + onDefaultAIProfileIdChange: (value: string | null) => void; } export function FeatureDefaultsSection({ @@ -37,13 +41,20 @@ export function FeatureDefaultsSection({ useWorktrees, defaultPlanningMode, defaultRequirePlanApproval, + defaultAIProfileId, + aiProfiles, onShowProfilesOnlyChange, onDefaultSkipTestsChange, onEnableDependencyBlockingChange, onUseWorktreesChange, onDefaultPlanningModeChange, onDefaultRequirePlanApprovalChange, + onDefaultAIProfileIdChange, }: FeatureDefaultsSectionProps) { + // Find the selected profile name for display + const selectedProfile = defaultAIProfileId + ? aiProfiles.find((p) => p.id === defaultAIProfileId) + : null; return (
} + {/* Default AI Profile */} ++ {selectedProfile + ? `New features will use the "${selectedProfile.name}" profile (${selectedProfile.model}, ${selectedProfile.thinkingLevel} thinking).` + : "Pre-select an AI profile when creating new features. Choose \"None\" to pick manually each time."} +
+