diff --git a/src/core/config/CustomModesManager.ts b/src/core/config/CustomModesManager.ts index a9a2e6a6b55a..185c26467de7 100644 --- a/src/core/config/CustomModesManager.ts +++ b/src/core/config/CustomModesManager.ts @@ -41,6 +41,7 @@ interface ExportResult { interface ImportResult { success: boolean error?: string + importedSlugs?: string[] } export class CustomModesManager { @@ -953,6 +954,8 @@ export class CustomModesManager { } } + const importedSlugs: string[] = [] + // Process each mode in the import for (const importMode of importData.customModes) { const { rulesFiles, ...modeConfig } = importMode @@ -984,12 +987,14 @@ export class CustomModesManager { // Import rules files (this also handles cleanup of existing rules folders) await this.importRulesFiles(importMode, rulesFiles || [], source) + + importedSlugs.push(importMode.slug) } // Refresh the modes after import await this.refreshMergedState() - return { success: true } + return { success: true, importedSlugs } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error) logger.error("Failed to import mode with rules", { error: errorMessage }) diff --git a/src/core/config/__tests__/CustomModesManager.spec.ts b/src/core/config/__tests__/CustomModesManager.spec.ts index b48ea7b65bdc..27710b0bfdfb 100644 --- a/src/core/config/__tests__/CustomModesManager.spec.ts +++ b/src/core/config/__tests__/CustomModesManager.spec.ts @@ -870,6 +870,7 @@ describe("CustomModesManager", () => { const result = await manager.importModeWithRules(importYaml) expect(result.success).toBe(true) + expect(result.importedSlugs).toEqual(["imported-mode"]) expect(fs.writeFile).toHaveBeenCalledWith( expect.stringContaining(".roomodes"), expect.stringContaining("imported-mode"), @@ -991,6 +992,7 @@ describe("CustomModesManager", () => { const result = await manager.importModeWithRules(importYaml) expect(result.success).toBe(true) + expect(result.importedSlugs).toEqual(["mode1", "mode2"]) expect(roomodesContent.customModes).toHaveLength(2) expect(roomodesContent.customModes[0].slug).toBe("mode1") expect(roomodesContent.customModes[1].slug).toBe("mode2") diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index af5f9925c353..d57924f82a3d 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2220,12 +2220,20 @@ export const webviewMessageHandler = async ( // Update state after importing const customModes = await provider.customModesManager.getCustomModes() await updateGlobalState("customModes", customModes) + + // Switch to the first imported mode if available + if (result.importedSlugs && result.importedSlugs.length > 0) { + const firstImportedSlug = result.importedSlugs[0] + await updateGlobalState("mode", firstImportedSlug) + } + await provider.postStateToWebview() - // Send success message to webview + // Send success message to webview with the imported slug provider.postMessageToWebview({ type: "importModeResult", success: true, + importedSlug: result.importedSlugs?.[0], }) // Show success message diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 66f389f81c10..a3e700772413 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -179,6 +179,7 @@ export interface ExtensionMessage { customMode?: ModeConfig slug?: string success?: boolean + importedSlug?: string values?: Record requestId?: string promptText?: string diff --git a/webview-ui/src/components/modes/ModesView.tsx b/webview-ui/src/components/modes/ModesView.tsx index c50996585fe7..b7b578277fe2 100644 --- a/webview-ui/src/components/modes/ModesView.tsx +++ b/webview-ui/src/components/modes/ModesView.tsx @@ -465,6 +465,9 @@ const ModesView = ({ onDone }: ModesViewProps) => { if (message.error !== "cancelled") { console.error("Failed to import mode:", message.error) } + } else if (message.importedSlug) { + // Switch to the imported mode + setVisualMode(message.importedSlug) } } else if (message.type === "checkRulesDirectoryResult") { setHasRulesToExport((prev) => ({