diff --git a/src/renderer/features/task-detail/stores/taskExecutionStore.ts b/src/renderer/features/task-detail/stores/taskExecutionStore.ts index 3d3bc45e..d7a43c7d 100644 --- a/src/renderer/features/task-detail/stores/taskExecutionStore.ts +++ b/src/renderer/features/task-detail/stores/taskExecutionStore.ts @@ -13,6 +13,7 @@ import type { } from "@shared/types"; import { cloneStore } from "@stores/cloneStore"; import { repositoryWorkspaceStore } from "@stores/repositoryWorkspaceStore"; +import { useTaskDirectoryStore } from "@stores/taskDirectoryStore"; import { expandTildePath } from "@utils/path"; import { create } from "zustand"; import { persist } from "zustand/middleware"; @@ -248,6 +249,11 @@ export const useTaskExecutionStore = create()( setRepoPath: (taskId: string, repoPath: string | null) => { get().updateTaskState(taskId, { repoPath }); + + // Persist to taskDirectoryStore + if (repoPath) { + useTaskDirectoryStore.getState().setTaskDirectory(taskId, repoPath); + } }, setCurrentTaskId: (taskId: string, currentTaskId: string | null) => { @@ -729,7 +735,33 @@ export const useTaskExecutionStore = create()( const store = get(); const taskState = store.getTaskState(taskId); - if (taskState.repoPath || !task.repository_config) return; + if (taskState.repoPath) return; + + // 1. Check taskDirectoryStore first + const repoKey = task.repository_config + ? `${task.repository_config.organization}/${task.repository_config.repository}` + : undefined; + + const storedDirectory = useTaskDirectoryStore + .getState() + .getTaskDirectory(taskId, repoKey); + if (storedDirectory) { + store.setRepoPath(taskId, storedDirectory); + + // Validate repo exists + window.electronAPI + ?.validateRepo(storedDirectory) + .then((exists) => { + store.updateTaskState(taskId, { repoExists: exists }); + }) + .catch(() => { + store.updateTaskState(taskId, { repoExists: false }); + }); + return; + } + + // 2. Fallback to deriving from workspace (existing logic) + if (!task.repository_config) return; const { defaultWorkspace } = useAuthStore.getState(); if (!defaultWorkspace) return; diff --git a/src/renderer/stores/cloneStore.ts b/src/renderer/stores/cloneStore.ts index 66c52bde..56cd3937 100644 --- a/src/renderer/stores/cloneStore.ts +++ b/src/renderer/stores/cloneStore.ts @@ -1,5 +1,6 @@ import { useTaskExecutionStore } from "@features/task-detail/stores/taskExecutionStore"; import type { RepositoryConfig } from "@shared/types"; +import { useTaskDirectoryStore } from "@stores/taskDirectoryStore"; import { create } from "zustand"; type CloneStatus = "cloning" | "complete" | "error"; @@ -50,6 +51,12 @@ export const cloneStore = create((set, get) => { const operation = get().operations[cloneId]; if (operation) { updateTaskRepoExists(operation.targetPath, true); + + // Save repo → directory mapping for future tasks + const repoKey = `${operation.repository.organization}/${operation.repository.repository}`; + useTaskDirectoryStore + .getState() + .setRepoDirectory(repoKey, operation.targetPath); } window.setTimeout(