diff --git a/packages/core/src/__tests__/session-manager.test.ts b/packages/core/src/__tests__/session-manager.test.ts index b887dfd82..b32f2c00a 100644 --- a/packages/core/src/__tests__/session-manager.test.ts +++ b/packages/core/src/__tests__/session-manager.test.ts @@ -1358,6 +1358,24 @@ describe("kill", () => { expect(mockWorkspace.destroy).not.toHaveBeenCalled(); }); + it("does not destroy workspace when worktree resolves to project path", async () => { + const projectPath = config.projects["my-app"]?.path; + if (!projectPath) throw new Error("missing project path"); + + writeMetadata(sessionsDir, "app-1", { + worktree: `${projectPath}/`, + branch: "main", + status: "working", + project: "my-app", + runtimeHandle: JSON.stringify(makeHandle("rt-1")), + }); + + const sm = createSessionManager({ config, registry: mockRegistry }); + await sm.kill("app-1"); + + expect(mockWorkspace.destroy).not.toHaveBeenCalled(); + }); + it("throws for nonexistent session", async () => { const sm = createSessionManager({ config, registry: mockRegistry }); await expect(sm.kill("nonexistent")).rejects.toThrow("not found"); diff --git a/packages/core/src/session-manager.ts b/packages/core/src/session-manager.ts index dd10e7929..42d31eb87 100644 --- a/packages/core/src/session-manager.ts +++ b/packages/core/src/session-manager.ts @@ -11,7 +11,7 @@ * Reference: scripts/claude-ao-session, scripts/send-to-session */ -import { statSync, existsSync, readdirSync, writeFileSync, mkdirSync } from "node:fs"; +import { statSync, existsSync, readdirSync, writeFileSync, mkdirSync, realpathSync } from "node:fs"; import { execFile } from "node:child_process"; import { basename, join, resolve } from "node:path"; import { homedir } from "node:os";