diff --git a/apps/ui/src/components/views/settings-view/prompts/prompt-customization-section.tsx b/apps/ui/src/components/views/settings-view/prompts/prompt-customization-section.tsx index c0a7308e..40ecf569 100644 --- a/apps/ui/src/components/views/settings-view/prompts/prompt-customization-section.tsx +++ b/apps/ui/src/components/views/settings-view/prompts/prompt-customization-section.tsx @@ -1,4 +1,5 @@ import { useState } from 'react'; +import type { LucideIcon } from 'lucide-react'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Button } from '@/components/ui/button'; @@ -38,6 +39,10 @@ import { DEFAULT_TASK_EXECUTION_PROMPTS, } from '@automaker/prompts'; +// ============================================================================= +// Types +// ============================================================================= + interface PromptCustomizationSectionProps { promptCustomization?: PromptCustomization; onPromptCustomizationChange: (customization: PromptCustomization) => void; @@ -49,69 +54,506 @@ interface PromptFieldProps { defaultValue: string; customValue?: CustomPrompt; onCustomValueChange: (value: CustomPrompt | undefined) => void; - critical?: boolean; // Whether this prompt requires strict output format + critical?: boolean; } +/** Configuration for a single prompt field */ +interface PromptFieldConfig { + key: string; + label: string; + description: string; + defaultValue: string; + critical?: boolean; +} + +/** Banner type for tabs */ +type BannerType = 'info' | 'warning'; + +interface BannerConfig { + type: BannerType; + title: string; + description: string; +} + +/** Configuration for a tab with prompt fields */ +interface TabConfig { + id: string; + label: string; + icon: LucideIcon; + title: string; + category: keyof PromptCustomization; + banner?: BannerConfig; + fields: PromptFieldConfig[]; + /** For tabs with grouped sections (like Auto Mode) */ + sections?: { + title?: string; + banner?: BannerConfig; + fields: PromptFieldConfig[]; + }[]; +} + +// ============================================================================= +// Tab Configuration +// ============================================================================= + +const TAB_CONFIGS: TabConfig[] = [ + { + id: 'auto-mode', + label: 'Auto Mode', + icon: Bot, + title: 'Auto Mode Prompts', + category: 'autoMode', + banner: { + type: 'info', + title: 'Planning Mode Markers', + description: + 'Planning prompts use special markers like [PLAN_GENERATED] and [SPEC_GENERATED] to control the Auto Mode workflow. These markers must be preserved for proper functionality.', + }, + fields: [ + { + key: 'planningLite', + label: 'Planning: Lite Mode', + description: 'Quick planning outline without approval requirement', + defaultValue: DEFAULT_AUTO_MODE_PROMPTS.planningLite, + critical: true, + }, + { + key: 'planningLiteWithApproval', + label: 'Planning: Lite with Approval', + description: 'Planning outline that waits for user approval', + defaultValue: DEFAULT_AUTO_MODE_PROMPTS.planningLiteWithApproval, + critical: true, + }, + { + key: 'planningSpec', + label: 'Planning: Spec Mode', + description: 'Detailed specification with task breakdown', + defaultValue: DEFAULT_AUTO_MODE_PROMPTS.planningSpec, + critical: true, + }, + { + key: 'planningFull', + label: 'Planning: Full SDD Mode', + description: 'Comprehensive Software Design Document with phased implementation', + defaultValue: DEFAULT_AUTO_MODE_PROMPTS.planningFull, + critical: true, + }, + ], + sections: [ + { + title: 'Template Prompts', + banner: { + type: 'info', + title: 'Template Variables', + description: + 'Template prompts use Handlebars syntax for variable substitution. Available variables include {{featureId}}, {{title}}, {{description}}, etc.', + }, + fields: [ + { + key: 'featurePromptTemplate', + label: 'Feature Prompt Template', + description: + 'Template for building feature implementation prompts. Variables: featureId, title, description, spec, imagePaths, dependencies, verificationInstructions', + defaultValue: DEFAULT_AUTO_MODE_PROMPTS.featurePromptTemplate, + }, + { + key: 'followUpPromptTemplate', + label: 'Follow-up Prompt Template', + description: + 'Template for follow-up prompts when resuming work. Variables: featurePrompt, previousContext, followUpInstructions', + defaultValue: DEFAULT_AUTO_MODE_PROMPTS.followUpPromptTemplate, + }, + { + key: 'continuationPromptTemplate', + label: 'Continuation Prompt Template', + description: + 'Template for continuation prompts. Variables: featurePrompt, previousContext', + defaultValue: DEFAULT_AUTO_MODE_PROMPTS.continuationPromptTemplate, + }, + { + key: 'pipelineStepPromptTemplate', + label: 'Pipeline Step Prompt Template', + description: + 'Template for pipeline step execution prompts. Variables: stepName, featurePrompt, previousContext, stepInstructions', + defaultValue: DEFAULT_AUTO_MODE_PROMPTS.pipelineStepPromptTemplate, + }, + ], + }, + ], + }, + { + id: 'agent', + label: 'Agent', + icon: MessageSquareText, + title: 'Agent Runner Prompts', + category: 'agent', + fields: [ + { + key: 'systemPrompt', + label: 'System Prompt', + description: "Defines the AI's role and behavior in interactive chat sessions", + defaultValue: DEFAULT_AGENT_PROMPTS.systemPrompt, + }, + ], + }, + { + id: 'backlog-plan', + label: 'Backlog', + icon: KanbanSquare, + title: 'Backlog Planning Prompts', + category: 'backlogPlan', + banner: { + type: 'warning', + title: 'Warning: Critical Prompts', + description: + 'Backlog plan prompts require a strict JSON output format. Modifying these prompts incorrectly can break the backlog planning feature and potentially corrupt your feature data. Only customize if you fully understand the expected output structure.', + }, + fields: [ + { + key: 'systemPrompt', + label: 'System Prompt', + description: + 'Defines how the AI modifies the feature backlog (Plan button on Kanban board)', + defaultValue: DEFAULT_BACKLOG_PLAN_PROMPTS.systemPrompt, + critical: true, + }, + { + key: 'userPromptTemplate', + label: 'User Prompt Template', + description: + 'Template for the user prompt sent to the AI. Variables: currentFeatures, userRequest', + defaultValue: DEFAULT_BACKLOG_PLAN_PROMPTS.userPromptTemplate, + critical: true, + }, + ], + }, + { + id: 'enhancement', + label: 'Enhancement', + icon: Sparkles, + title: 'Enhancement Prompts', + category: 'enhancement', + fields: [ + { + key: 'improveSystemPrompt', + label: 'Improve Mode', + description: 'Transform vague requests into clear, actionable tasks', + defaultValue: DEFAULT_ENHANCEMENT_PROMPTS.improveSystemPrompt, + }, + { + key: 'technicalSystemPrompt', + label: 'Technical Mode', + description: 'Add implementation details and technical specifications', + defaultValue: DEFAULT_ENHANCEMENT_PROMPTS.technicalSystemPrompt, + }, + { + key: 'simplifySystemPrompt', + label: 'Simplify Mode', + description: 'Make verbose descriptions concise and focused', + defaultValue: DEFAULT_ENHANCEMENT_PROMPTS.simplifySystemPrompt, + }, + { + key: 'acceptanceSystemPrompt', + label: 'Acceptance Criteria Mode', + description: 'Add testable acceptance criteria to descriptions', + defaultValue: DEFAULT_ENHANCEMENT_PROMPTS.acceptanceSystemPrompt, + }, + { + key: 'uxReviewerSystemPrompt', + label: 'User Experience Mode', + description: 'Review and enhance from a user experience and design perspective', + defaultValue: DEFAULT_ENHANCEMENT_PROMPTS.uxReviewerSystemPrompt, + }, + ], + }, + { + id: 'commit-message', + label: 'Commit', + icon: GitCommitHorizontal, + title: 'Commit Message Prompts', + category: 'commitMessage', + fields: [ + { + key: 'systemPrompt', + label: 'System Prompt', + description: + 'Instructions for generating git commit messages from diffs. The AI will receive the git diff and generate a conventional commit message.', + defaultValue: DEFAULT_COMMIT_MESSAGE_PROMPTS.systemPrompt, + }, + ], + }, + { + id: 'title-generation', + label: 'Title', + icon: Type, + title: 'Title Generation Prompts', + category: 'titleGeneration', + fields: [ + { + key: 'systemPrompt', + label: 'System Prompt', + description: + 'Instructions for generating concise, descriptive feature titles from descriptions. Used when auto-generating titles for new features.', + defaultValue: DEFAULT_TITLE_GENERATION_PROMPTS.systemPrompt, + }, + ], + }, + { + id: 'issue-validation', + label: 'Issues', + icon: CheckCircle, + title: 'Issue Validation Prompts', + category: 'issueValidation', + banner: { + type: 'warning', + title: 'Warning: Critical Prompt', + description: + 'The issue validation prompt guides the AI through a structured validation process and expects specific output format. Modifying this prompt incorrectly may affect validation accuracy.', + }, + fields: [ + { + key: 'systemPrompt', + label: 'System Prompt', + description: + 'Instructions for validating GitHub issues against the codebase. Guides the AI to determine if issues are valid, invalid, or need clarification.', + defaultValue: DEFAULT_ISSUE_VALIDATION_PROMPTS.systemPrompt, + critical: true, + }, + ], + }, + { + id: 'ideation', + label: 'Ideation', + icon: Lightbulb, + title: 'Ideation Prompts', + category: 'ideation', + fields: [ + { + key: 'ideationSystemPrompt', + label: 'Ideation Chat System Prompt', + description: + 'System prompt for AI-powered ideation chat conversations. Guides the AI to brainstorm and suggest feature ideas.', + defaultValue: DEFAULT_IDEATION_PROMPTS.ideationSystemPrompt, + }, + { + key: 'suggestionsSystemPrompt', + label: 'Suggestions System Prompt', + description: + 'System prompt for generating structured feature suggestions. Used when generating batch suggestions from prompts.', + defaultValue: DEFAULT_IDEATION_PROMPTS.suggestionsSystemPrompt, + critical: true, + }, + ], + }, + { + id: 'app-spec', + label: 'App Spec', + icon: FileCode, + title: 'App Specification Prompts', + category: 'appSpec', + fields: [ + { + key: 'generateSpecSystemPrompt', + label: 'Generate Spec System Prompt', + description: 'System prompt for generating project specifications from overview', + defaultValue: DEFAULT_APP_SPEC_PROMPTS.generateSpecSystemPrompt, + }, + { + key: 'structuredSpecInstructions', + label: 'Structured Spec Instructions', + description: 'Instructions for structured specification output format', + defaultValue: DEFAULT_APP_SPEC_PROMPTS.structuredSpecInstructions, + critical: true, + }, + { + key: 'generateFeaturesFromSpecPrompt', + label: 'Generate Features from Spec', + description: 'Prompt for generating features from a project specification', + defaultValue: DEFAULT_APP_SPEC_PROMPTS.generateFeaturesFromSpecPrompt, + critical: true, + }, + ], + }, + { + id: 'context-description', + label: 'Context', + icon: FileText, + title: 'Context Description Prompts', + category: 'contextDescription', + fields: [ + { + key: 'describeFilePrompt', + label: 'Describe File Prompt', + description: 'Prompt for generating descriptions of text files added as context', + defaultValue: DEFAULT_CONTEXT_DESCRIPTION_PROMPTS.describeFilePrompt, + }, + { + key: 'describeImagePrompt', + label: 'Describe Image Prompt', + description: 'Prompt for generating descriptions of images added as context', + defaultValue: DEFAULT_CONTEXT_DESCRIPTION_PROMPTS.describeImagePrompt, + }, + ], + }, + { + id: 'suggestions', + label: 'Suggestions', + icon: Wand2, + title: 'Suggestions Prompts', + category: 'suggestions', + fields: [ + { + key: 'featuresPrompt', + label: 'Features Suggestion Prompt', + description: 'Prompt for analyzing the project and suggesting new features', + defaultValue: DEFAULT_SUGGESTIONS_PROMPTS.featuresPrompt, + }, + { + key: 'refactoringPrompt', + label: 'Refactoring Suggestion Prompt', + description: 'Prompt for identifying refactoring opportunities', + defaultValue: DEFAULT_SUGGESTIONS_PROMPTS.refactoringPrompt, + }, + { + key: 'securityPrompt', + label: 'Security Suggestion Prompt', + description: 'Prompt for analyzing security vulnerabilities', + defaultValue: DEFAULT_SUGGESTIONS_PROMPTS.securityPrompt, + }, + { + key: 'performancePrompt', + label: 'Performance Suggestion Prompt', + description: 'Prompt for identifying performance issues', + defaultValue: DEFAULT_SUGGESTIONS_PROMPTS.performancePrompt, + }, + { + key: 'baseTemplate', + label: 'Base Template', + description: 'Base template applied to all suggestion types', + defaultValue: DEFAULT_SUGGESTIONS_PROMPTS.baseTemplate, + }, + ], + }, + { + id: 'task-execution', + label: 'Tasks', + icon: Cog, + title: 'Task Execution Prompts', + category: 'taskExecution', + banner: { + type: 'info', + title: 'Template Variables', + description: + 'Task execution prompts use Handlebars syntax for variable substitution. Variables include {{taskId}}, {{taskDescription}}, {{completedTasks}}, etc.', + }, + fields: [ + { + key: 'taskPromptTemplate', + label: 'Task Prompt Template', + description: 'Template for building individual task execution prompts', + defaultValue: DEFAULT_TASK_EXECUTION_PROMPTS.taskPromptTemplate, + }, + { + key: 'implementationInstructions', + label: 'Implementation Instructions', + description: 'Instructions appended to feature implementation prompts', + defaultValue: DEFAULT_TASK_EXECUTION_PROMPTS.implementationInstructions, + }, + { + key: 'playwrightVerificationInstructions', + label: 'Playwright Verification Instructions', + description: 'Instructions for automated Playwright verification (when enabled)', + defaultValue: DEFAULT_TASK_EXECUTION_PROMPTS.playwrightVerificationInstructions, + }, + { + key: 'learningExtractionSystemPrompt', + label: 'Learning Extraction System Prompt', + description: 'System prompt for extracting learnings/ADRs from implementation output', + defaultValue: DEFAULT_TASK_EXECUTION_PROMPTS.learningExtractionSystemPrompt, + critical: true, + }, + { + key: 'learningExtractionUserPromptTemplate', + label: 'Learning Extraction User Template', + description: + 'User prompt template for learning extraction. Variables: featureTitle, implementationLog', + defaultValue: DEFAULT_TASK_EXECUTION_PROMPTS.learningExtractionUserPromptTemplate, + critical: true, + }, + { + key: 'planRevisionTemplate', + label: 'Plan Revision Template', + description: + 'Template for prompting plan revisions. Variables: planVersion, previousPlan, userFeedback', + defaultValue: DEFAULT_TASK_EXECUTION_PROMPTS.planRevisionTemplate, + }, + { + key: 'continuationAfterApprovalTemplate', + label: 'Continuation After Approval Template', + description: + 'Template for continuation after plan approval. Variables: userFeedback, approvedPlan', + defaultValue: DEFAULT_TASK_EXECUTION_PROMPTS.continuationAfterApprovalTemplate, + }, + { + key: 'resumeFeatureTemplate', + label: 'Resume Feature Template', + description: + 'Template for resuming interrupted features. Variables: featurePrompt, previousContext', + defaultValue: DEFAULT_TASK_EXECUTION_PROMPTS.resumeFeatureTemplate, + }, + { + key: 'projectAnalysisPrompt', + label: 'Project Analysis Prompt', + description: 'Prompt for AI-powered project analysis', + defaultValue: DEFAULT_TASK_EXECUTION_PROMPTS.projectAnalysisPrompt, + }, + ], + }, +]; + +// ============================================================================= +// Helper Components +// ============================================================================= + /** * Calculate dynamic minimum height based on content length - * Ensures long prompts have adequate space */ function calculateMinHeight(text: string): string { const lines = text.split('\n').length; const estimatedLines = Math.max(lines, Math.ceil(text.length / 80)); - - // Min 120px, scales up for longer content, max 600px const minHeight = Math.min(Math.max(120, estimatedLines * 20), 600); return `${minHeight}px`; } /** - * PromptTabContent Component - * - * Reusable container for prompt customization tabs. - * Provides consistent header with title and reset button. + * Renders an info or warning banner */ -interface PromptTabContentProps { - value: string; - title: string; - category: keyof PromptCustomization; - onReset: (category: keyof PromptCustomization) => void; - children: React.ReactNode; - infoBanner?: React.ReactNode; -} +function Banner({ config }: { config: BannerConfig }) { + const isWarning = config.type === 'warning'; + const Icon = isWarning ? AlertTriangle : Info; -function PromptTabContent({ - value, - title, - category, - onReset, - children, - infoBanner, -}: PromptTabContentProps) { return ( - -
-

{title}

- +
+ +
+

{config.title}

+

{config.description}

- {infoBanner} -
{children}
- +
); } /** - * PromptField Component - * - * Shows a prompt with a toggle to switch between default and custom mode. - * - Toggle OFF: Shows default prompt in read-only mode, custom value is preserved but not used - * - Toggle ON: Allows editing, custom value is used instead of default - * - * IMPORTANT: Custom value is ALWAYS preserved, even when toggle is OFF. - * This prevents users from losing their work when temporarily switching to default. + * PromptField Component - Shows a prompt with toggle for custom/default mode */ function PromptField({ label, @@ -126,14 +568,11 @@ function PromptField({ const minHeight = calculateMinHeight(displayValue); const handleToggle = (enabled: boolean) => { - // When toggling, preserve the existing custom value if it exists, - // otherwise initialize with the default value. const value = customValue?.value ?? defaultValue; onCustomValueChange({ value, enabled }); }; const handleTextChange = (newValue: string) => { - // Only allow editing when enabled if (isEnabled) { onCustomValueChange({ value: newValue, enabled: true }); } @@ -143,7 +582,7 @@ function PromptField({
{critical && isEnabled && (
- +

Critical Prompt

@@ -183,23 +622,57 @@ function PromptField({ } /** - * PromptCustomizationSection Component - * - * Allows users to customize AI prompts for different parts of the application: - * - Auto Mode (feature implementation) - * - Agent Runner (interactive chat) - * - Backlog Plan (Kanban planning) - * - Enhancement (feature description improvement) + * Renders a list of prompt fields from configuration */ +function PromptFieldList({ + fields, + category, + promptCustomization, + updatePrompt, +}: { + fields: PromptFieldConfig[]; + category: keyof PromptCustomization; + promptCustomization?: PromptCustomization; + updatePrompt: ( + category: keyof PromptCustomization, + field: string, + value: CustomPrompt | undefined + ) => void; +}) { + return ( + <> + {fields.map((field) => ( + | undefined)?.[ + field.key + ] + } + onCustomValueChange={(value) => updatePrompt(category, field.key, value)} + critical={field.critical} + /> + ))} + + ); +} + +// ============================================================================= +// Main Component +// ============================================================================= + export function PromptCustomizationSection({ promptCustomization = {}, onPromptCustomizationChange, }: PromptCustomizationSectionProps) { const [activeTab, setActiveTab] = useState('auto-mode'); - const updatePrompt = ( - category: T, - field: keyof NonNullable, + const updatePrompt = ( + category: keyof PromptCustomization, + field: string, value: CustomPrompt | undefined ) => { const updated = { @@ -258,7 +731,7 @@ export function PromptCustomizationSection({ {/* Info Banner */}

- +

How to Customize Prompts

@@ -274,673 +747,70 @@ export function PromptCustomizationSection({

- - - Auto Mode - - - - Agent - - - - Backlog - - - - Enhancement - - - - Commit - - - - Title - - - - Issues - - - - Ideation - - - - App Spec - - - - Context - - - - Suggestions - - - - Tasks - + {TAB_CONFIGS.map((tab) => ( + + + {tab.label} + + ))} - {/* Auto Mode Tab */} - -
-

Auto Mode Prompts

- -
- - {/* Info Banner for Auto Mode */} -
- -
-

Planning Mode Markers

-

- Planning prompts use special markers like{' '} - [PLAN_GENERATED] and{' '} - [SPEC_GENERATED] to - control the Auto Mode workflow. These markers must be preserved for proper - functionality. -

+ {TAB_CONFIGS.map((tab) => ( + + {/* Tab Header */} +
+

{tab.title}

+
-
-
- updatePrompt('autoMode', 'planningLite', value)} - critical={true} - /> + {/* Tab Banner */} + {tab.banner && } - - updatePrompt('autoMode', 'planningLiteWithApproval', value) - } - critical={true} - /> - - updatePrompt('autoMode', 'planningSpec', value)} - critical={true} - /> - - updatePrompt('autoMode', 'planningFull', value)} - critical={true} - /> -
- - {/* Template Prompts Section */} -
-

Template Prompts

- - {/* Info Banner for Templates */} -
- -
-

Template Variables

-

- Template prompts use Handlebars syntax for variable substitution. Available - variables include{' '} - {'{{featureId}}'},{' '} - {'{{title}}'},{' '} - - {'{{description}}'} - - , etc. -

+ {/* Main Fields */} + {tab.fields.length > 0 && ( +
+
-
+ )} -
- - updatePrompt('autoMode', 'featurePromptTemplate', value) - } - /> - - - updatePrompt('autoMode', 'followUpPromptTemplate', value) - } - /> - - - updatePrompt('autoMode', 'continuationPromptTemplate', value) - } - /> - - - updatePrompt('autoMode', 'pipelineStepPromptTemplate', value) - } - /> -
-
- - - {/* Agent Tab */} - - updatePrompt('agent', 'systemPrompt', value)} - /> - - - {/* Backlog Plan Tab */} - -
-

Backlog Planning Prompts

- -
- - {/* Critical Warning for Backlog Plan */} -
- -
-

Warning: Critical Prompts

-

- Backlog plan prompts require a strict JSON output format. Modifying these prompts - incorrectly can break the backlog planning feature and potentially corrupt your - feature data. Only customize if you fully understand the expected output - structure. -

-
-
- -
- updatePrompt('backlogPlan', 'systemPrompt', value)} - critical={true} - /> - - - updatePrompt('backlogPlan', 'userPromptTemplate', value) - } - critical={true} - /> -
-
- - {/* Enhancement Tab */} - -
-

Enhancement Prompts

- -
- -
- - updatePrompt('enhancement', 'improveSystemPrompt', value) - } - /> - - - updatePrompt('enhancement', 'technicalSystemPrompt', value) - } - /> - - - updatePrompt('enhancement', 'simplifySystemPrompt', value) - } - /> - - - updatePrompt('enhancement', 'acceptanceSystemPrompt', value) - } - /> - - - updatePrompt('enhancement', 'uxReviewerSystemPrompt', value) - } - /> -
-
- - {/* Commit Message Tab */} - - updatePrompt('commitMessage', 'systemPrompt', value)} - /> - - - {/* Title Generation Tab */} - - - updatePrompt('titleGeneration', 'systemPrompt', value) - } - /> - - - {/* Issue Validation Tab */} - -
-

Issue Validation Prompts

- -
- - {/* Critical Warning for Issue Validation */} -
- -
-

Warning: Critical Prompt

-

- The issue validation prompt guides the AI through a structured validation process - and expects specific output format. Modifying this prompt incorrectly may affect - validation accuracy. -

-
-
- -
- - updatePrompt('issueValidation', 'systemPrompt', value) - } - critical={true} - /> -
-
- - {/* Ideation Tab */} - - - updatePrompt('ideation', 'ideationSystemPrompt', value) - } - /> - - - updatePrompt('ideation', 'suggestionsSystemPrompt', value) - } - critical={true} - /> - - - {/* App Spec Tab */} - - - updatePrompt('appSpec', 'generateSpecSystemPrompt', value) - } - /> - - - updatePrompt('appSpec', 'structuredSpecInstructions', value) - } - critical={true} - /> - - - updatePrompt('appSpec', 'generateFeaturesFromSpecPrompt', value) - } - critical={true} - /> - - - {/* Context Description Tab */} - - - updatePrompt('contextDescription', 'describeFilePrompt', value) - } - /> - - - updatePrompt('contextDescription', 'describeImagePrompt', value) - } - /> - - - {/* Suggestions Tab */} - - updatePrompt('suggestions', 'featuresPrompt', value)} - /> - - - updatePrompt('suggestions', 'refactoringPrompt', value) - } - /> - - updatePrompt('suggestions', 'securityPrompt', value)} - /> - - - updatePrompt('suggestions', 'performancePrompt', value) - } - /> - - updatePrompt('suggestions', 'baseTemplate', value)} - /> - - - {/* Task Execution Tab */} - - -
-

Template Variables

-

- Task execution prompts use Handlebars syntax for variable substitution. - Variables include{' '} - {'{{taskId}}'},{' '} - - {'{{taskDescription}}'} - - ,{' '} - - {'{{completedTasks}}'} - - , etc. -

+ {/* Sections (for tabs like Auto Mode with grouped fields) */} + {tab.sections?.map((section, idx) => ( +
+ {section.title && ( +

+ {section.title} +

+ )} + {section.banner && ( +
+ +
+ )} +
+ +
-
- } - > - - updatePrompt('taskExecution', 'taskPromptTemplate', value) - } - /> - - - updatePrompt('taskExecution', 'implementationInstructions', value) - } - /> - - - updatePrompt('taskExecution', 'playwrightVerificationInstructions', value) - } - /> - - - updatePrompt('taskExecution', 'learningExtractionSystemPrompt', value) - } - critical={true} - /> - - - updatePrompt('taskExecution', 'learningExtractionUserPromptTemplate', value) - } - critical={true} - /> - - - updatePrompt('taskExecution', 'planRevisionTemplate', value) - } - /> - - - updatePrompt('taskExecution', 'continuationAfterApprovalTemplate', value) - } - /> - - - updatePrompt('taskExecution', 'resumeFeatureTemplate', value) - } - /> - - - updatePrompt('taskExecution', 'projectAnalysisPrompt', value) - } - /> -
+ ))} + + ))}