import { VSCodeButton, VSCodeTextArea, VSCodeDropdown, VSCodeOption, VSCodeDivider } from "@vscode/webview-ui-toolkit/react" import { useExtensionState } from "../../context/ExtensionStateContext" import { defaultPrompts, askMode, codeMode, architectMode, Mode } from "../../../../src/shared/modes" import { vscode } from "../../utils/vscode" import React, { useState, useEffect } from "react" type PromptsViewProps = { onDone: () => void } const PromptsView = ({ onDone }: PromptsViewProps) => { const { customPrompts, listApiConfigMeta, enhancementApiConfigId, setEnhancementApiConfigId, mode } = useExtensionState() const [testPrompt, setTestPrompt] = useState('') const [isEnhancing, setIsEnhancing] = useState(false) const [activeTab, setActiveTab] = useState(mode) const [isDialogOpen, setIsDialogOpen] = useState(false) const [selectedPromptContent, setSelectedPromptContent] = useState('') const [selectedPromptTitle, setSelectedPromptTitle] = useState('') useEffect(() => { const handler = (event: MessageEvent) => { const message = event.data if (message.type === 'enhancedPrompt') { if (message.text) { setTestPrompt(message.text) } setIsEnhancing(false) } else if (message.type === 'systemPrompt') { if (message.text) { setSelectedPromptContent(message.text) setSelectedPromptTitle(`System Prompt (${message.mode} mode)`) setIsDialogOpen(true) } } } window.addEventListener('message', handler) return () => window.removeEventListener('message', handler) }, []) type PromptMode = keyof typeof defaultPrompts const updatePromptValue = (promptMode: PromptMode, value: string) => { vscode.postMessage({ type: "updatePrompt", promptMode, customPrompt: value }) } const handlePromptChange = (mode: PromptMode, e: Event | React.FormEvent) => { const value = (e as CustomEvent)?.detail?.target?.value || ((e as any).target as HTMLTextAreaElement).value updatePromptValue(mode, value) } const handleReset = (mode: PromptMode) => { const defaultValue = defaultPrompts[mode] updatePromptValue(mode, defaultValue) } const getPromptValue = (mode: PromptMode): string => { if (mode === 'enhance') { return customPrompts?.enhance ?? defaultPrompts.enhance } return customPrompts?.[mode] ?? defaultPrompts[mode] } const handleTestEnhancement = () => { if (!testPrompt.trim()) return setIsEnhancing(true) vscode.postMessage({ type: "enhancePrompt", text: testPrompt }) } return (

Prompts

Done

Agent Modes

Customize Cline's prompt in each mode. The rest of the system prompt will be automatically appended. Click the button to preview the full prompt. Leave empty or click the reset button to use the default.
{[ { id: codeMode, label: 'Code' }, { id: architectMode, label: 'Architect' }, { id: askMode, label: 'Ask' }, ].map((tab, index) => ( {index < 2 && ( | )} ))}
handleReset(activeTab as any)} data-testid="reset-prompt-button" title="Revert to default" >
{activeTab === codeMode && ( handlePromptChange(codeMode, e)} rows={4} resize="vertical" style={{ width: "100%" }} data-testid="code-prompt-textarea" /> )} {activeTab === architectMode && ( handlePromptChange(architectMode, e)} rows={4} resize="vertical" style={{ width: "100%" }} data-testid="architect-prompt-textarea" /> )} {activeTab === askMode && ( handlePromptChange(askMode, e)} rows={4} resize="vertical" style={{ width: "100%" }} data-testid="ask-prompt-textarea" /> )}
{ vscode.postMessage({ type: "getSystemPrompt", mode: activeTab }) }} data-testid="preview-prompt-button" > Preview System Prompt

Prompt Enhancement

API Configuration
You can select an API configuration to always use for enhancing prompts, or just use whatever is currently selected
{ const value = e.detail?.target?.value || e.target?.value setEnhancementApiConfigId(value) vscode.postMessage({ type: "enhancementApiConfigId", text: value }) }} style={{ width: "300px" }} > Use currently selected API configuration {(listApiConfigMeta || []).map((config) => ( {config.name} ))}
Enhancement Prompt
handleReset('enhance')} title="Revert to default">
handlePromptChange('enhance', e)} rows={4} resize="vertical" style={{ width: "100%" }} />
setTestPrompt((e.target as HTMLTextAreaElement).value)} placeholder="Enter a prompt to test the enhancement" rows={3} resize="vertical" style={{ width: "100%" }} data-testid="test-prompt-textarea" />
Preview Prompt Enhancement
{/* Bottom padding */}
{isDialogOpen && (

{selectedPromptTitle}

setIsDialogOpen(false)}>
							{selectedPromptContent}
						
)}
) } export default PromptsView