fix(agent-teams): lock team deletion behind config mutex

This commit is contained in:
Nguyen Khac Trung Kien
2026-02-08 12:46:31 +07:00
committed by YeonGyu-Kim
parent cf42082c5f
commit 805df45722
2 changed files with 58 additions and 8 deletions

View File

@@ -0,0 +1,48 @@
/// <reference types="bun-types" />
import { afterEach, beforeEach, describe, expect, test } from "bun:test"
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 { createTeamConfig, deleteTeamData, teamExists } from "./team-config-store"
describe("agent-teams team config store", () => {
let originalCwd: string
let tempProjectDir: string
beforeEach(() => {
originalCwd = process.cwd()
tempProjectDir = mkdtempSync(join(tmpdir(), "agent-teams-config-store-"))
process.chdir(tempProjectDir)
createTeamConfig("core", "Core team", "ses-main", tempProjectDir, "sisyphus")
})
afterEach(() => {
if (teamExists("core")) {
deleteTeamData("core")
}
process.chdir(originalCwd)
rmSync(tempProjectDir, { recursive: true, force: true })
})
test("deleteTeamData waits for team lock before removing team files", () => {
//#given
const lock = acquireLock(getTeamDir("core"))
expect(lock.acquired).toBe(true)
//#when
const deleteWhileLocked = () => deleteTeamData("core")
//#then
expect(deleteWhileLocked).toThrow("team_lock_unavailable")
expect(teamExists("core")).toBe(true)
//#when
lock.release()
deleteTeamData("core")
//#then
expect(teamExists("core")).toBe(false)
})
})

View File

@@ -173,14 +173,16 @@ export function assignNextColor(config: TeamConfig): string {
export function deleteTeamData(teamName: string): void {
assertValidTeamName(teamName)
const teamDir = getTeamDir(teamName)
const taskDir = getTeamTaskDir(teamName)
withTeamLock(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 })
}
})
}