From 08df673dc9f6a015f88c560edf4cceae904a618d Mon Sep 17 00:00:00 2001 From: Lucas Faria Date: Mon, 17 Nov 2025 11:39:17 -0300 Subject: [PATCH] feat: integrate task directory store into execution flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use taskDirectoryStore for directory resolution in initializeRepoPath() - Persist directory mappings when setRepoPath() is called - Save repo→directory mapping after clone completion - Support tasks without repository_config Enables per-task directory customization and repo sharing across tasks. --- .../task-detail/stores/taskExecutionStore.ts | 34 ++++++++++++++++++- src/renderer/stores/cloneStore.ts | 7 ++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/renderer/features/task-detail/stores/taskExecutionStore.ts b/src/renderer/features/task-detail/stores/taskExecutionStore.ts index 3d3bc45e8..d7a43c7df 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 66c52bde1..56cd39374 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(