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
This commit is contained in:
sam hoang
2025-01-27 14:24:26 +07:00
parent 3deeb0c28b
commit 85c49d8eff
4 changed files with 57 additions and 6 deletions

View File

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

View File

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

View File

@@ -188,10 +188,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
return findLast(Array.from(this.activeInstances), (instance) => instance.view?.visible === true) return findLast(Array.from(this.activeInstances), (instance) => instance.view?.visible === true)
} }
public static async handleCodeAction( public static async getInstance(): Promise<ClineProvider | undefined> {
promptType: keyof typeof ACTION_NAMES,
params: Record<string, string | any[]>,
): Promise<void> {
let visibleProvider = ClineProvider.getVisibleInstance() let visibleProvider = ClineProvider.getVisibleInstance()
// If no visible provider, try to show the sidebar view // If no visible provider, try to show the sidebar view
@@ -207,10 +204,46 @@ export class ClineProvider implements vscode.WebviewViewProvider {
return 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 { customSupportPrompts } = await visibleProvider.getState()
const prompt = supportPrompt.create(promptType, params, customSupportPrompts) 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) await visibleProvider.initClineWithTask(prompt)
} }

View File

@@ -194,7 +194,7 @@ export function activate(context: vscode.ExtensionContext) {
...(userInput ? { userInput } : {}), ...(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", "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( registerCodeAction(
context, context,
"roo-cline.improveCode", "roo-cline.improveCode",