diff --git a/auto-claude-ui/src/renderer/components/task-detail/TaskDetailModal.tsx b/auto-claude-ui/src/renderer/components/task-detail/TaskDetailModal.tsx
index cd8a743c..8e6510c5 100644
--- a/auto-claude-ui/src/renderer/components/task-detail/TaskDetailModal.tsx
+++ b/auto-claude-ui/src/renderer/components/task-detail/TaskDetailModal.tsx
@@ -407,6 +407,7 @@ function TaskDetailModalContent({ open, task, onOpenChange }: { open: boolean; t
onStageOnlyChange={state.setStageOnly}
onShowConflictDialog={state.setShowConflictDialog}
onLoadMergePreview={state.loadMergePreview}
+ onClose={handleClose}
/>
>
)}
diff --git a/auto-claude-ui/src/renderer/components/task-detail/TaskReview.tsx b/auto-claude-ui/src/renderer/components/task-detail/TaskReview.tsx
index 6f7bdb45..ebfd96d5 100644
--- a/auto-claude-ui/src/renderer/components/task-detail/TaskReview.tsx
+++ b/auto-claude-ui/src/renderer/components/task-detail/TaskReview.tsx
@@ -39,6 +39,7 @@ interface TaskReviewProps {
onStageOnlyChange: (value: boolean) => void;
onShowConflictDialog: (show: boolean) => void;
onLoadMergePreview: () => void;
+ onClose?: () => void;
}
/**
@@ -77,7 +78,8 @@ export function TaskReview({
onShowDiffDialog,
onStageOnlyChange,
onShowConflictDialog,
- onLoadMergePreview
+ onLoadMergePreview,
+ onClose
}: TaskReviewProps) {
return (
@@ -119,9 +121,10 @@ export function TaskReview({
task={task}
projectPath={stagedProjectPath}
hasWorktree={worktreeStatus?.exists || false}
+ onClose={onClose}
/>
) : (
-
+
)}
{/* QA Feedback Section */}
diff --git a/auto-claude-ui/src/renderer/components/task-detail/task-review/WorkspaceMessages.tsx b/auto-claude-ui/src/renderer/components/task-detail/task-review/WorkspaceMessages.tsx
index cc2ee3e6..81daa813 100644
--- a/auto-claude-ui/src/renderer/components/task-detail/task-review/WorkspaceMessages.tsx
+++ b/auto-claude-ui/src/renderer/components/task-detail/task-review/WorkspaceMessages.tsx
@@ -24,12 +24,13 @@ export function LoadingMessage({ message = 'Loading workspace info...' }: Loadin
interface NoWorkspaceMessageProps {
task?: Task;
+ onClose?: () => void;
}
/**
* Displays message when no workspace is found for the task
*/
-export function NoWorkspaceMessage({ task }: NoWorkspaceMessageProps) {
+export function NoWorkspaceMessage({ task, onClose }: NoWorkspaceMessageProps) {
const [isMarkingDone, setIsMarkingDone] = useState(false);
const handleMarkDone = async () => {
@@ -38,6 +39,8 @@ export function NoWorkspaceMessage({ task }: NoWorkspaceMessageProps) {
setIsMarkingDone(true);
try {
await persistTaskStatus(task.id, 'done');
+ // Auto-close modal after marking as done
+ onClose?.();
} catch (err) {
console.error('Error marking task as done:', err);
} finally {
@@ -85,12 +88,13 @@ interface StagedInProjectMessageProps {
task: Task;
projectPath?: string;
hasWorktree?: boolean;
+ onClose?: () => void;
}
/**
* Displays message when changes have already been staged in the main project
*/
-export function StagedInProjectMessage({ task, projectPath, hasWorktree = false }: StagedInProjectMessageProps) {
+export function StagedInProjectMessage({ task, projectPath, hasWorktree = false, onClose }: StagedInProjectMessageProps) {
const [isDeleting, setIsDeleting] = useState(false);
const [error, setError] = useState(null);
@@ -110,7 +114,8 @@ export function StagedInProjectMessage({ task, projectPath, hasWorktree = false
// Mark task as done
await persistTaskStatus(task.id, 'done');
- // Success - the UI will update automatically via the store
+ // Auto-close modal after marking as done
+ onClose?.();
} catch (err) {
console.error('Error deleting worktree:', err);
setError(err instanceof Error ? err.message : 'Failed to delete worktree');