Browse Source

feat(code-actions): add "Fix Code in Current Task" action

Adds ability to fix code within the context of an active task instead of starting a new one. This allows for more efficient workflow when already working with Roo.

Add new FIX_IN_CURRENT_TASK code action and command
Enhance ClineProvider to support context-aware code fixing
Update tests to verify new action functionality
sam hoang 1 year ago
parent
commit
85c49d8eff

+ 10 - 0
src/core/CodeActionProvider.ts

@@ -1,15 +1,18 @@
 import * as vscode from "vscode"
 import * as path from "path"
+import { ClineProvider } from "./webview/ClineProvider"
 
 export const ACTION_NAMES = {
 	EXPLAIN: "Roo Code: Explain Code",
 	FIX: "Roo Code: Fix Code",
+	FIX_IN_CURRENT_TASK: "Roo Code: Fix Code in Current Task",
 	IMPROVE: "Roo Code: Improve Code",
 } as const
 
 const COMMAND_IDS = {
 	EXPLAIN: "roo-cline.explainCode",
 	FIX: "roo-cline.fixCode",
+	FIX_IN_CURRENT_TASK: "roo-cline.fixCodeInCurrentTask",
 	IMPROVE: "roo-cline.improveCode",
 } as const
 
@@ -159,6 +162,13 @@ export class CodeActionProvider implements vscode.CodeActionProvider {
 							effectiveRange.text,
 							diagnosticMessages,
 						]),
+
+						this.createAction(
+							ACTION_NAMES.FIX_IN_CURRENT_TASK,
+							vscode.CodeActionKind.QuickFix,
+							COMMAND_IDS.FIX_IN_CURRENT_TASK,
+							[filePath, effectiveRange.text, diagnosticMessages],
+						),
 					)
 				}
 			}

+ 1 - 1
src/core/__tests__/CodeActionProvider.test.ts

@@ -125,7 +125,7 @@ describe("CodeActionProvider", () => {
 
 			const actions = provider.provideCodeActions(mockDocument, mockRange, mockContext)
 
-			expect(actions).toHaveLength(3)
+			expect(actions).toHaveLength(4)
 			expect((actions as any).some((a: any) => a.title === "Roo Code: Fix Code")).toBe(true)
 		})
 

+ 37 - 4
src/core/webview/ClineProvider.ts

@@ -188,10 +188,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 		return findLast(Array.from(this.activeInstances), (instance) => instance.view?.visible === true)
 	}
 
-	public static async handleCodeAction(
-		promptType: keyof typeof ACTION_NAMES,
-		params: Record<string, string | any[]>,
-	): Promise<void> {
+	public static async getInstance(): Promise<ClineProvider | undefined> {
 		let visibleProvider = ClineProvider.getVisibleInstance()
 
 		// If no visible provider, try to show the sidebar view
@@ -207,10 +204,46 @@ export class ClineProvider implements vscode.WebviewViewProvider {
 			return
 		}
 
+		return visibleProvider
+	}
+
+	public static async isActiveTask(): Promise<boolean> {
+		const visibleProvider = await ClineProvider.getInstance()
+		if (!visibleProvider) {
+			return false
+		}
+
+		if (visibleProvider.cline) {
+			return true
+		}
+
+		return false
+	}
+
+	public static async handleCodeAction(
+		command: string,
+		promptType: keyof typeof ACTION_NAMES,
+		params: Record<string, string | any[]>,
+	): Promise<void> {
+		const visibleProvider = await ClineProvider.getInstance()
+		if (!visibleProvider) {
+			return
+		}
+
 		const { customSupportPrompts } = await visibleProvider.getState()
 
 		const prompt = supportPrompt.create(promptType, params, customSupportPrompts)
 
+		if (visibleProvider.cline && ["roo-cline.fixCodeInCurrentTask"].indexOf(command) !== -1) {
+			await visibleProvider.postMessageToWebview({
+				type: "invoke",
+				invoke: "sendMessage",
+				text: prompt,
+			})
+
+			return
+		}
+
 		await visibleProvider.initClineWithTask(prompt)
 	}
 

+ 9 - 1
src/extension.ts

@@ -194,7 +194,7 @@ export function activate(context: vscode.ExtensionContext) {
 						...(userInput ? { userInput } : {}),
 					}
 
-					await ClineProvider.handleCodeAction(promptType, params)
+					await ClineProvider.handleCodeAction(command, promptType, params)
 				},
 			),
 		)
@@ -217,6 +217,14 @@ export function activate(context: vscode.ExtensionContext) {
 		"E.g. Maintain backward compatibility",
 	)
 
+	registerCodeAction(
+		context,
+		"roo-cline.fixCodeInCurrentTask",
+		"FIX", // keep this for use the same prompt with FIX command
+		"What would you like Roo to fix?",
+		"E.g. Maintain backward compatibility",
+	)
+
 	registerCodeAction(
 		context,
 		"roo-cline.improveCode",