diff --git a/apps/ui/src/components/views/settings-view/developer/developer-section.tsx b/apps/ui/src/components/views/settings-view/developer/developer-section.tsx index 7a0882f0..4a36bab3 100644 --- a/apps/ui/src/components/views/settings-view/developer/developer-section.tsx +++ b/apps/ui/src/components/views/settings-view/developer/developer-section.tsx @@ -12,9 +12,18 @@ const LOG_LEVEL_OPTIONS: { value: ServerLogLevel; label: string; description: st { value: 'debug', label: 'Debug', description: 'Show all messages including debug' }, ]; +// Check if we're in development mode +const IS_DEV = import.meta.env.DEV; + export function DeveloperSection() { - const { serverLogLevel, setServerLogLevel, enableRequestLogging, setEnableRequestLogging } = - useAppStore(); + const { + serverLogLevel, + setServerLogLevel, + enableRequestLogging, + setEnableRequestLogging, + showQueryDevtools, + setShowQueryDevtools, + } = useAppStore(); return (
+ + {/* React Query DevTools - only shown in development mode */} + {IS_DEV && ( +
+
+ +

+ Show React Query DevTools panel in the bottom-right corner for debugging queries and + cache. +

+
+ { + setShowQueryDevtools(checked); + toast.success(checked ? 'Query DevTools enabled' : 'Query DevTools disabled', { + description: 'React Query DevTools visibility updated', + }); + }} + /> +
+ )} ); diff --git a/apps/ui/src/hooks/use-settings-migration.ts b/apps/ui/src/hooks/use-settings-migration.ts index b77fba5b..7398aece 100644 --- a/apps/ui/src/hooks/use-settings-migration.ts +++ b/apps/ui/src/hooks/use-settings-migration.ts @@ -713,6 +713,7 @@ export function hydrateStoreFromSettings(settings: GlobalSettings): void { muteDoneSound: settings.muteDoneSound ?? false, serverLogLevel: settings.serverLogLevel ?? 'info', enableRequestLogging: settings.enableRequestLogging ?? true, + showQueryDevtools: settings.showQueryDevtools ?? true, enhancementModel: settings.enhancementModel ?? 'claude-sonnet', validationModel: settings.validationModel ?? 'claude-opus', phaseModels: settings.phaseModels ?? current.phaseModels, diff --git a/apps/ui/src/hooks/use-settings-sync.ts b/apps/ui/src/hooks/use-settings-sync.ts index 8ede5600..d4679b81 100644 --- a/apps/ui/src/hooks/use-settings-sync.ts +++ b/apps/ui/src/hooks/use-settings-sync.ts @@ -58,6 +58,7 @@ const SETTINGS_FIELDS_TO_SYNC = [ 'muteDoneSound', 'serverLogLevel', 'enableRequestLogging', + 'showQueryDevtools', 'enhancementModel', 'validationModel', 'phaseModels', diff --git a/apps/ui/src/routes/__root.tsx b/apps/ui/src/routes/__root.tsx index 4a56ca2b..907d2b19 100644 --- a/apps/ui/src/routes/__root.tsx +++ b/apps/ui/src/routes/__root.tsx @@ -40,7 +40,7 @@ import { useIsCompact } from '@/hooks/use-media-query'; import type { Project } from '@/lib/electron'; const logger = createLogger('RootLayout'); -const SHOW_QUERY_DEVTOOLS = import.meta.env.DEV; +const IS_DEV = import.meta.env.DEV; const SERVER_READY_MAX_ATTEMPTS = 8; const SERVER_READY_BACKOFF_BASE_MS = 250; const SERVER_READY_MAX_DELAY_MS = 1500; @@ -895,17 +895,22 @@ function RootLayoutContent() { } function RootLayout() { - // Hide devtools on compact screens (mobile/tablet) to avoid overlap with sidebar settings + // Hide devtools on compact screens (mobile/tablet) to avoid overlap with UI controls const isCompact = useIsCompact(); + // Get the user's preference for showing devtools from the app store + const showQueryDevtools = useAppStore((state) => state.showQueryDevtools); + + // Show devtools only if: in dev mode, user setting enabled, and not compact screen + const shouldShowDevtools = IS_DEV && showQueryDevtools && !isCompact; return ( - {SHOW_QUERY_DEVTOOLS && !isCompact ? ( - - ) : null} + {shouldShowDevtools && ( + + )} ); } diff --git a/apps/ui/src/store/app-store.ts b/apps/ui/src/store/app-store.ts index e78cd80f..ecb78220 100644 --- a/apps/ui/src/store/app-store.ts +++ b/apps/ui/src/store/app-store.ts @@ -682,6 +682,9 @@ export interface AppState { serverLogLevel: ServerLogLevel; // Log level for the API server (error, warn, info, debug) enableRequestLogging: boolean; // Enable HTTP request logging (Morgan) + // Developer Tools Settings + showQueryDevtools: boolean; // Show React Query DevTools panel (only in development mode) + // Enhancement Model Settings enhancementModel: ModelAlias; // Model used for feature enhancement (default: sonnet) @@ -1168,6 +1171,9 @@ export interface AppActions { setServerLogLevel: (level: ServerLogLevel) => void; setEnableRequestLogging: (enabled: boolean) => void; + // Developer Tools actions + setShowQueryDevtools: (show: boolean) => void; + // Enhancement Model actions setEnhancementModel: (model: ModelAlias) => void; @@ -1472,6 +1478,7 @@ const initialState: AppState = { muteDoneSound: false, // Default to sound enabled (not muted) serverLogLevel: 'info', // Default to info level for server logs enableRequestLogging: true, // Default to enabled for HTTP request logging + showQueryDevtools: true, // Default to enabled (only shown in dev mode anyway) enhancementModel: 'claude-sonnet', // Default to sonnet for feature enhancement validationModel: 'claude-opus', // Default to opus for GitHub issue validation phaseModels: DEFAULT_PHASE_MODELS, // Phase-specific model configuration @@ -2593,6 +2600,9 @@ export const useAppStore = create()((set, get) => ({ setServerLogLevel: (level) => set({ serverLogLevel: level }), setEnableRequestLogging: (enabled) => set({ enableRequestLogging: enabled }), + // Developer Tools actions + setShowQueryDevtools: (show) => set({ showQueryDevtools: show }), + // Enhancement Model actions setEnhancementModel: (model) => set({ enhancementModel: model }), diff --git a/libs/types/src/settings.ts b/libs/types/src/settings.ts index f6401314..35de27e5 100644 --- a/libs/types/src/settings.ts +++ b/libs/types/src/settings.ts @@ -863,6 +863,10 @@ export interface GlobalSettings { /** Enable HTTP request logging (Morgan). Default: true */ enableRequestLogging?: boolean; + // Developer Tools + /** Show React Query DevTools panel (only in development mode). Default: true */ + showQueryDevtools?: boolean; + // AI Commit Message Generation /** Enable AI-generated commit messages when opening commit dialog (default: true) */ enableAiCommitMessages: boolean; @@ -1286,6 +1290,7 @@ export const DEFAULT_GLOBAL_SETTINGS: GlobalSettings = { muteDoneSound: false, serverLogLevel: 'info', enableRequestLogging: true, + showQueryDevtools: true, enableAiCommitMessages: true, phaseModels: DEFAULT_PHASE_MODELS, enhancementModel: 'sonnet', // Legacy alias still supported