From 1ecbc9741cbd8692302720f272cd9b7946942a82 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Tue, 23 Sep 2025 00:02:02 +0000 Subject: [PATCH] feat: add scope indicators (Global/Project) to mode selector and editor - Add visual badges showing 'Global' or 'Project' scope for custom modes - Display scope in mode selector dropdown items - Display scope in currently selected mode button - Display scope in modes editor view - Use existing translations from common.json Fixes #8238 --- .../src/components/chat/ModeSelector.tsx | 19 ++++++- webview-ui/src/components/modes/ModesView.tsx | 52 ++++++++++++++----- 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/webview-ui/src/components/chat/ModeSelector.tsx b/webview-ui/src/components/chat/ModeSelector.tsx index 3f843344a2..9ba427ca30 100644 --- a/webview-ui/src/components/chat/ModeSelector.tsx +++ b/webview-ui/src/components/chat/ModeSelector.tsx @@ -198,7 +198,7 @@ export const ModeSelector = ({ disabled={disabled} data-testid="mode-selector-trigger" className={cn( - "inline-flex items-center relative whitespace-nowrap px-1.5 py-1 text-xs", + "inline-flex items-center gap-1 relative whitespace-nowrap px-1.5 py-1 text-xs", "bg-transparent border border-[rgba(255,255,255,0.08)] rounded-md text-vscode-foreground", "transition-all duration-150 focus:outline-none focus-visible:ring-1 focus-visible:ring-vscode-focusBorder focus-visible:ring-inset", disabled @@ -210,6 +210,11 @@ export const ModeSelector = ({ : null, )}> {selectedMode?.name || ""} + {selectedMode?.source && ( + + {selectedMode.source === "project" ? t("common:scope.project") : t("common:scope.global")} + + )} {filteredModes.map((mode) => { const isSelected = mode.slug === value + const isCustomMode = mode.source !== undefined return (
-
{mode.name}
+
+ {mode.name} + {isCustomMode && ( + + {mode.source === "project" + ? t("common:scope.project") + : t("common:scope.global")} + + )} +
{mode.description && (
{mode.description} diff --git a/webview-ui/src/components/modes/ModesView.tsx b/webview-ui/src/components/modes/ModesView.tsx index 0283fbbec4..b8825f7f29 100644 --- a/webview-ui/src/components/modes/ModesView.tsx +++ b/webview-ui/src/components/modes/ModesView.tsx @@ -619,8 +619,17 @@ const ModesView = ({ onDone }: ModesViewProps) => { aria-expanded={open} className="justify-between w-full" data-testid="mode-select-trigger"> -
- {getCurrentMode()?.name || t("prompts:modes.selectMode")} +
+ + {getCurrentMode()?.name || t("prompts:modes.selectMode")} + + {getCurrentMode()?.source && ( + + {getCurrentMode()?.source === "project" + ? t("common:scope.project") + : t("common:scope.global")} + + )}
@@ -672,16 +681,24 @@ const ModesView = ({ onDone }: ModesViewProps) => { }} data-testid={`mode-option-${modeConfig.slug}`}>
- - {modeConfig.name} - +
+ + {modeConfig.name} + + {modeConfig.source && ( + + {modeConfig.source === "project" + ? t("common:scope.project") + : t("common:scope.global")} + + )} +
{ {visualMode && findModeBySlug(visualMode, customModes) && (
-
{t("prompts:createModeDialog.name.label")}
+
+ {t("prompts:createModeDialog.name.label")} + {findModeBySlug(visualMode, customModes)?.source && ( + + {findModeBySlug(visualMode, customModes)?.source === "project" + ? t("common:scope.project") + : t("common:scope.global")} + + )} +