diff --git a/src/tools/agent-teams/team-config-store.test.ts b/src/tools/agent-teams/team-config-store.test.ts index 466f96e71..d1f9c1f45 100644 --- a/src/tools/agent-teams/team-config-store.test.ts +++ b/src/tools/agent-teams/team-config-store.test.ts @@ -4,7 +4,7 @@ import { mkdtempSync, rmSync } from "node:fs" import { tmpdir } from "node:os" import { join } from "node:path" import { acquireLock } from "../../features/claude-tasks/storage" -import { getTeamDir } from "./paths" +import { getTeamDir, getTeamTaskDir } from "./paths" import { createTeamConfig, deleteTeamData, teamExists } from "./team-config-store" describe("agent-teams team config store", () => { @@ -45,4 +45,27 @@ describe("agent-teams team config store", () => { //#then expect(teamExists("core")).toBe(false) }) + + test("deleteTeamData waits for task lock before removing task files", () => { + //#given + const lock = acquireLock(getTeamTaskDir("core")) + expect(lock.acquired).toBe(true) + + try { + //#when + const deleteWhileLocked = () => deleteTeamData("core") + + //#then + expect(deleteWhileLocked).toThrow("team_task_lock_unavailable") + expect(teamExists("core")).toBe(true) + } finally { + lock.release() + } + + //#when + deleteTeamData("core") + + //#then + expect(teamExists("core")).toBe(false) + }) }) diff --git a/src/tools/agent-teams/team-config-store.ts b/src/tools/agent-teams/team-config-store.ts index a57d0b47b..b916f24f1 100644 --- a/src/tools/agent-teams/team-config-store.ts +++ b/src/tools/agent-teams/team-config-store.ts @@ -23,6 +23,7 @@ import { isTeammateMember, } from "./types" import { validateTeamName } from "./name-validation" +import { withTeamTaskLock } from "./team-task-store" function nowMs(): number { return Date.now() @@ -174,15 +175,17 @@ export function assignNextColor(config: TeamConfig): string { export function deleteTeamData(teamName: string): void { assertValidTeamName(teamName) withTeamLock(teamName, () => { - const teamDir = getTeamDir(teamName) - const taskDir = getTeamTaskDir(teamName) + withTeamTaskLock(teamName, () => { + const teamDir = getTeamDir(teamName) + const taskDir = getTeamTaskDir(teamName) - if (existsSync(teamDir)) { - rmSync(teamDir, { recursive: true, force: true }) - } + if (existsSync(teamDir)) { + rmSync(teamDir, { recursive: true, force: true }) + } - if (existsSync(taskDir)) { - rmSync(taskDir, { recursive: true, force: true }) - } + if (existsSync(taskDir)) { + rmSync(taskDir, { recursive: true, force: true }) + } + }) }) }