feat: improve agent workspace flows and directory suggestions

This commit is contained in:
Mohamed Boudra
2026-02-16 23:19:01 +07:00
parent 22da0951d5
commit 170ee27813
49 changed files with 3053 additions and 293 deletions
@@ -5,6 +5,7 @@ import {
getWorktreeTerminalSpecs,
isPaseoOwnedWorktreeCwd,
listPaseoWorktrees,
resolveWorktreeRuntimeEnv,
type WorktreeSetupCommandProgressEvent,
runWorktreeSetupCommands,
slugify,
@@ -14,6 +15,7 @@ import { execSync } from "child_process";
import { mkdtempSync, rmSync, existsSync, realpathSync, writeFileSync, readFileSync } from "fs";
import { join } from "path";
import { tmpdir } from "os";
import net from "node:net";
describe("createWorktree", () => {
let tempDir: string;
@@ -265,6 +267,68 @@ describe("createWorktree", () => {
expect(progressEvents.some((event) => event.type === "command_completed")).toBe(true);
});
it("reuses persisted worktree runtime port across resolutions", async () => {
const result = await createWorktree({
branchName: "main",
cwd: repoDir,
baseBranch: "main",
worktreeSlug: "runtime-env-port-reuse",
runSetup: false,
paseoHome,
});
const first = await resolveWorktreeRuntimeEnv({
worktreePath: result.worktreePath,
branchName: result.branchName,
});
const second = await resolveWorktreeRuntimeEnv({
worktreePath: result.worktreePath,
branchName: result.branchName,
});
expect(second.PASEO_WORKTREE_PORT).toBe(first.PASEO_WORKTREE_PORT);
});
it("fails runtime env resolution when persisted port is in use", async () => {
const result = await createWorktree({
branchName: "main",
cwd: repoDir,
baseBranch: "main",
worktreeSlug: "runtime-env-port-conflict",
runSetup: false,
paseoHome,
});
const env = await resolveWorktreeRuntimeEnv({
worktreePath: result.worktreePath,
branchName: result.branchName,
});
const port = Number(env.PASEO_WORKTREE_PORT);
const server = net.createServer();
await new Promise<void>((resolve, reject) => {
server.once("error", reject);
server.listen(port, () => resolve());
});
await expect(
resolveWorktreeRuntimeEnv({
worktreePath: result.worktreePath,
branchName: result.branchName,
})
).rejects.toThrow(`Persisted worktree port ${port} is already in use`);
await new Promise<void>((resolve, reject) => {
server.close((error) => {
if (error) {
reject(error);
return;
}
resolve();
});
});
});
it("cleans up worktree if setup command fails", async () => {
// Create paseo.json with failing setup command
const paseoConfig = {