Skip to content

Commit d0bfba0

Browse files
committed
feat: add task directory mapping store
- Create taskDirectoryStore with localStorage persistence - Support two-level mapping (taskId → dir, repoKey → dir) - Auto-map tasks to existing repo clones - Use existing expandTildePath utility Foundation for PR #3 (directory integration).
1 parent ba34212 commit d0bfba0

File tree

2 files changed

+83
-4
lines changed

2 files changed

+83
-4
lines changed

src/renderer/features/task-detail/stores/taskExecutionStore.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type {
1212
TaskRun,
1313
} from "@shared/types";
1414
import { cloneStore } from "@stores/cloneStore";
15+
import { repositoryWorkspaceStore } from "@stores/repositoryWorkspaceStore";
1516
import { expandTildePath } from "@utils/path";
1617
import { create } from "zustand";
1718
import { persist } from "zustand/middleware";
@@ -504,10 +505,6 @@ export const useTaskExecutionStore = create<TaskExecutionStore>()(
504505
.getState()
505506
.startClone(cloneId, task.repository_config, effectiveRepoPath);
506507

507-
const { repositoryWorkspaceStore } = await import(
508-
"@stores/repositoryWorkspaceStore"
509-
);
510-
511508
try {
512509
await repositoryWorkspaceStore
513510
.getState()
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { expandTildePath } from "@utils/path";
2+
import { create } from "zustand";
3+
import { persist } from "zustand/middleware";
4+
5+
interface TaskDirectoryState {
6+
taskDirectories: Record<string, string>;
7+
repoDirectories: Record<string, string>;
8+
getTaskDirectory: (taskId: string, repoKey?: string) => string | null;
9+
setTaskDirectory: (taskId: string, directory: string) => void;
10+
setRepoDirectory: (repoKey: string, directory: string) => void;
11+
clearTaskDirectory: (taskId: string) => void;
12+
clearRepoDirectory: (repoKey: string) => void;
13+
}
14+
15+
export const useTaskDirectoryStore = create<TaskDirectoryState>()(
16+
persist(
17+
(set, get) => ({
18+
taskDirectories: {},
19+
repoDirectories: {},
20+
21+
getTaskDirectory: (taskId: string, repoKey?: string) => {
22+
// 1. Check for direct task mapping
23+
const taskDir = get().taskDirectories[taskId];
24+
if (taskDir) {
25+
return expandTildePath(taskDir);
26+
}
27+
28+
// 2. Check for repo mapping (if repoKey provided)
29+
if (repoKey) {
30+
const repoDir = get().repoDirectories[repoKey];
31+
if (repoDir) {
32+
// Auto-map task to this directory for convenience
33+
get().setTaskDirectory(taskId, repoDir);
34+
return expandTildePath(repoDir);
35+
}
36+
}
37+
38+
// 3. No mapping found
39+
return null;
40+
},
41+
42+
setTaskDirectory: (taskId: string, directory: string) => {
43+
set((state) => ({
44+
taskDirectories: {
45+
...state.taskDirectories,
46+
[taskId]: directory,
47+
},
48+
}));
49+
},
50+
51+
setRepoDirectory: (repoKey: string, directory: string) => {
52+
set((state) => ({
53+
repoDirectories: {
54+
...state.repoDirectories,
55+
[repoKey]: directory,
56+
},
57+
}));
58+
},
59+
60+
clearTaskDirectory: (taskId: string) => {
61+
set((state) => {
62+
const { [taskId]: _, ...rest } = state.taskDirectories;
63+
return { taskDirectories: rest };
64+
});
65+
},
66+
67+
clearRepoDirectory: (repoKey: string) => {
68+
set((state) => {
69+
const { [repoKey]: _, ...rest } = state.repoDirectories;
70+
return { repoDirectories: rest };
71+
});
72+
},
73+
}),
74+
{
75+
name: "task-directory-mappings",
76+
partialize: (state) => ({
77+
taskDirectories: state.taskDirectories,
78+
repoDirectories: state.repoDirectories,
79+
}),
80+
},
81+
),
82+
);

0 commit comments

Comments
 (0)