diff --git a/auto-claude-ui/electron.vite.config.ts b/auto-claude-ui/electron.vite.config.ts index 152ed8b1..6fc4aa22 100644 --- a/auto-claude-ui/electron.vite.config.ts +++ b/auto-claude-ui/electron.vite.config.ts @@ -44,8 +44,18 @@ export default defineConfig({ }, server: { watch: { - // Ignore worktrees directory to prevent HMR conflicts during merge operations - ignored: ['**/.worktrees/**', '**/node_modules/**', '**/.git/**'] + // Ignore directories to prevent HMR conflicts during merge operations + // Using absolute paths and broader patterns + ignored: [ + '**/node_modules/**', + '**/.git/**', + '**/.worktrees/**', + '**/.auto-claude/**', + '**/out/**', + // Ignore the parent autonomous-coding directory's worktrees + resolve(__dirname, '../.worktrees/**'), + resolve(__dirname, '../.auto-claude/**'), + ] } } } diff --git a/auto-claude-ui/src/renderer/components/task-detail/hooks/useTaskDetail.ts b/auto-claude-ui/src/renderer/components/task-detail/hooks/useTaskDetail.ts index 2246edc1..68dd721e 100644 --- a/auto-claude-ui/src/renderer/components/task-detail/hooks/useTaskDetail.ts +++ b/auto-claude-ui/src/renderer/components/task-detail/hooks/useTaskDetail.ts @@ -182,6 +182,25 @@ export function useTaskDetail({ task }: UseTaskDetailOptions) { }); }, []); + // Restore merge preview from sessionStorage on mount (survives HMR reloads) + useEffect(() => { + const storageKey = `mergePreview-${task.id}`; + const stored = sessionStorage.getItem(storageKey); + if (stored) { + try { + const previewData = JSON.parse(stored); + console.log('%c[useTaskDetail] Restored merge preview from sessionStorage:', 'color: magenta;', previewData); + setMergePreview(previewData); + if (previewData.conflicts?.length > 0) { + setShowConflictDialog(true); + } + } catch (e) { + console.warn('[useTaskDetail] Failed to parse stored merge preview'); + sessionStorage.removeItem(storageKey); + } + } + }, [task.id]); + // Load merge preview (conflict detection) const loadMergePreview = useCallback(async () => { console.log('%c[useTaskDetail] loadMergePreview called for task:', 'color: cyan; font-weight: bold;', task.id); @@ -197,6 +216,8 @@ export function useTaskDetail({ task }: UseTaskDetailOptions) { console.log(' - conflicts:', previewData.conflicts); console.log(' - summary:', previewData.summary); setMergePreview(previewData); + // Persist to sessionStorage to survive HMR reloads + sessionStorage.setItem(`mergePreview-${task.id}`, JSON.stringify(previewData)); // Show conflict dialog if there are conflicts that need attention if (previewData.conflicts.length > 0) { setShowConflictDialog(true);