diff --git a/packages/examples/acp-demo/tests/built-bin.e2e.ts b/packages/examples/acp-demo/tests/built-bin.e2e.ts index 7b5749fee5..9e799b29db 100644 --- a/packages/examples/acp-demo/tests/built-bin.e2e.ts +++ b/packages/examples/acp-demo/tests/built-bin.e2e.ts @@ -95,8 +95,19 @@ let consumer: string | undefined let child: ReturnType | undefined afterEach(async () => { - if (child !== undefined) { child.kill('SIGKILL'); child = undefined } - if (consumer !== undefined) await rm(consumer, { recursive: true, force: true }) + if (child !== undefined) { + const proc = child + child = undefined + // Windows retains the child's cwd and session-log handles until process + // teardown completes, so await exit before removing the temp directory. + if (proc.exitCode === null && proc.signalCode === null) { + const exited = new Promise((resolve) => { proc.once('exit', () => { resolve() }) }) + proc.kill('SIGKILL') + await exited + } + } + // Windows can briefly retain released handles after exit; retry removal. + if (consumer !== undefined) await rm(consumer, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 }) consumer = undefined }) diff --git a/packages/examples/stdio-demo/tests/built-bin.e2e.ts b/packages/examples/stdio-demo/tests/built-bin.e2e.ts index fdbeb2b8e4..ec14440b18 100644 --- a/packages/examples/stdio-demo/tests/built-bin.e2e.ts +++ b/packages/examples/stdio-demo/tests/built-bin.e2e.ts @@ -116,7 +116,8 @@ function runBuiltBin(cwd: string, configArg: string, line: string): Promise<{ st let consumer: string | undefined afterEach(async () => { - if (consumer !== undefined) await rm(consumer, { recursive: true, force: true }) + // Windows can briefly retain released handles after exit; retry removal. + if (consumer !== undefined) await rm(consumer, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 }) consumer = undefined })