fix(coding-agent): synced bash cwd after cd

Updated interactive bash execution to query the persistent shell PWD after commands and move the session cwd when it changes, keeping the status line and session-scoped settings aligned with shell navigation.

Added regression coverage for syncing persistent shell directory changes back to the owning session.

Fixes #3958
This commit is contained in:
roboomp
2026-07-01 01:43:37 +00:00
parent b2a859a7c5
commit 66a9667cc1
4 changed files with 94 additions and 0 deletions
@@ -3,6 +3,7 @@ import * as fs from "node:fs";
import * as os from "node:os";
import * as path from "node:path";
import { resetSettingsForTest, Settings, type ShellMinimizerSettings } from "@oh-my-pi/pi-coding-agent/config/settings";
import { syncBashSessionCwd } from "@oh-my-pi/pi-coding-agent/exec/bash-cwd-sync";
import { buildMinimizerOptions, executeBash } from "@oh-my-pi/pi-coding-agent/exec/bash-executor";
import { DEFAULT_MAX_BYTES } from "@oh-my-pi/pi-coding-agent/session/streaming-output";
import * as shellSnapshot from "@oh-my-pi/pi-coding-agent/utils/shell-snapshot";
@@ -121,6 +122,26 @@ describe("executeBash", () => {
expect(result.output.trim()).toBe(fs.realpathSync(tempDir));
});
it("syncs persistent shell directory changes back to the session", async () => {
const childDir = path.join(tempDir, "child");
fs.mkdirSync(childDir);
const sessionKey = `cwd-sync-${Date.now()}`;
await executeBash(`cd ${shellQuote(childDir)}`, { sessionKey, timeout: 5000, useUserShell: true });
const applied: string[] = [];
const synced = await syncBashSessionCwd({
sessionKey,
currentCwd: tempDir,
useUserShell: true,
applyCwd: async cwd => {
applied.push(cwd);
},
});
expect(synced).toBe(childDir);
expect(applied).toEqual([childDir]);
});
it("canonicalizes symlinked cwd before execution", async () => {
if (process.platform === "win32") {
return;