diff --git a/.changeset/agent-manager-state-exclude.md b/.changeset/agent-manager-state-exclude.md new file mode 100644 index 00000000000..43f9c067e14 --- /dev/null +++ b/.changeset/agent-manager-state-exclude.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Keep Agent Manager state hidden from Git before creating local sessions. diff --git a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts index 4890788eaeb..77237b86975 100644 --- a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts +++ b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts @@ -251,6 +251,7 @@ export class AgentManagerProvider implements Disposable { return } + await this.ensureGitExclude(manager) const loaded = await state.load() manager.cleanupOrphanedTempDirs() @@ -291,6 +292,12 @@ export class AgentManagerProvider implements Disposable { this.panel?.sessions.recoverPendingPrompts() } + private async ensureGitExclude(manager: WorktreeManager): Promise { + await manager.ensureGitExclude().catch((err) => { + this.log("Failed to update git exclude:", err) + }) + } + private async recoverWorktrees(manager: WorktreeManager, state: WorktreeStateManager): Promise { const infos = await manager.discoverWorktrees().catch((err) => { this.log("Failed to discover worktrees during state recovery:", err) diff --git a/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts b/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts index 35690752dd4..c3bf14b286c 100644 --- a/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts +++ b/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts @@ -183,6 +183,16 @@ describe("Agent Manager Provider Messages", () => { expect(getMethodBody("onMessage")).toContain("if (this.shouldWaitForState(m)) await this.waitForStateReady(m.type)") }) + it("initializeState updates local git exclude before loading persisted state", () => { + const body = getMethodBody("initializeState") + const exclude = body.indexOf("await this.ensureGitExclude(manager)") + const load = body.indexOf("const loaded = await state.load()") + + expect(exclude).toBeGreaterThanOrEqual(0) + expect(load).toBeGreaterThanOrEqual(0) + expect(exclude).toBeLessThan(load) + }) + it("async shutdown waits for terminal router cleanup", () => { const body = getMethodBody("disposeAsync") expect(body).toContain("await this.terminalRouter.dispose()") diff --git a/packages/kilo-vscode/tests/unit/worktree-manager.test.ts b/packages/kilo-vscode/tests/unit/worktree-manager.test.ts index 76f831fa87e..e9787fc6186 100644 --- a/packages/kilo-vscode/tests/unit/worktree-manager.test.ts +++ b/packages/kilo-vscode/tests/unit/worktree-manager.test.ts @@ -680,7 +680,7 @@ describe("WorktreeManager.discoverWorktrees", () => { // --------------------------------------------------------------------------- describe("WorktreeManager.ensureGitExclude", () => { - it("adds .kilo/worktrees/ to .git/info/exclude", async () => { + it("adds Agent Manager state and worktrees to .git/info/exclude", async () => { const root = await createTempRepo() const mgr = createManager(root) @@ -688,6 +688,7 @@ describe("WorktreeManager.ensureGitExclude", () => { const content = await fs.readFile(path.join(root, ".git", "info", "exclude"), "utf-8") expect(content).toContain(".kilo/worktrees/") + expect(content).toContain(".kilo/agent-manager.json") }) it("adds only specific legacy Agent Manager paths", async () => {