fix non-node worktree agent startup
This commit is contained in:
5
.changeset/fix-non-node-worktree-agents.md
Normal file
5
.changeset/fix-non-node-worktree-agents.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@gsxdsm/fusion": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Allow coding agents to start in registered non-Node project worktrees without a root package.json.
|
||||||
@@ -346,10 +346,14 @@ describe("createKbAgent", () => {
|
|||||||
existsSyncMock.mockImplementation((path) => {
|
existsSyncMock.mockImplementation((path) => {
|
||||||
const value = String(path);
|
const value = String(path);
|
||||||
return value === "/project/.worktrees/fn-001" ||
|
return value === "/project/.worktrees/fn-001" ||
|
||||||
value === "/project/.worktrees/fn-001/.git" ||
|
value === "/project/.worktrees/fn-001/.git";
|
||||||
value === "/project/.worktrees/fn-001/package.json";
|
});
|
||||||
|
execSyncMock.mockImplementation((cmd) => {
|
||||||
|
if (cmd === "git rev-parse --show-toplevel") {
|
||||||
|
return "/project/.worktrees/fn-001\n";
|
||||||
|
}
|
||||||
|
return "worktree /project\nHEAD abc123\nbranch refs/heads/main\n";
|
||||||
});
|
});
|
||||||
execSyncMock.mockReturnValue("worktree /project\nHEAD abc123\nbranch refs/heads/main\n");
|
|
||||||
|
|
||||||
const { createKbAgent } = await import("./pi.js");
|
const { createKbAgent } = await import("./pi.js");
|
||||||
|
|
||||||
@@ -364,17 +368,19 @@ describe("createKbAgent", () => {
|
|||||||
expect(createAgentSessionMock).not.toHaveBeenCalled();
|
expect(createAgentSessionMock).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("allows a coding agent in a registered complete worktree", async () => {
|
it("allows a coding agent in a registered complete worktree without a root package.json", async () => {
|
||||||
existsSyncMock.mockImplementation((path) => {
|
existsSyncMock.mockImplementation((path) => {
|
||||||
const value = String(path);
|
const value = String(path);
|
||||||
return value === "/project/.worktrees/fn-001" ||
|
return value === "/project/.worktrees/fn-001" ||
|
||||||
value === "/project/.worktrees/fn-001/.git" ||
|
value === "/project/.worktrees/fn-001/.git";
|
||||||
value === "/project/.worktrees/fn-001/package.json";
|
});
|
||||||
|
execSyncMock.mockImplementation((cmd) => {
|
||||||
|
if (cmd === "git rev-parse --show-toplevel") {
|
||||||
|
return "/project/.worktrees/fn-001\n";
|
||||||
|
}
|
||||||
|
return "worktree /project\nHEAD abc123\nbranch refs/heads/main\n\n" +
|
||||||
|
"worktree /project/.worktrees/fn-001\nHEAD def456\nbranch refs/heads/fusion/fn-001\n";
|
||||||
});
|
});
|
||||||
execSyncMock.mockReturnValue(
|
|
||||||
"worktree /project\nHEAD abc123\nbranch refs/heads/main\n\n" +
|
|
||||||
"worktree /project/.worktrees/fn-001\nHEAD def456\nbranch refs/heads/fusion/fn-001\n",
|
|
||||||
);
|
|
||||||
|
|
||||||
const { createKbAgent } = await import("./pi.js");
|
const { createKbAgent } = await import("./pi.js");
|
||||||
|
|
||||||
|
|||||||
@@ -292,11 +292,23 @@ async function isRegisteredGitWorktree(projectRoot: string, worktreePath: string
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function isCompleteGitWorktree(worktreePath: string): Promise<boolean> {
|
||||||
|
try {
|
||||||
|
const { stdout } = await execAsync("git rev-parse --show-toplevel", {
|
||||||
|
cwd: worktreePath,
|
||||||
|
encoding: "utf-8",
|
||||||
|
});
|
||||||
|
return resolve(stdout.trim()) === resolve(worktreePath);
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function assertValidWorktreeSession(cwd: string, projectRoot: string): Promise<void> {
|
async function assertValidWorktreeSession(cwd: string, projectRoot: string): Promise<void> {
|
||||||
if (!existsSync(cwd)) {
|
if (!existsSync(cwd)) {
|
||||||
throw new Error(`Refusing to start coding agent in missing worktree: ${cwd}`);
|
throw new Error(`Refusing to start coding agent in missing worktree: ${cwd}`);
|
||||||
}
|
}
|
||||||
if (!existsSync(join(cwd, ".git")) || !existsSync(join(cwd, "package.json"))) {
|
if (!existsSync(join(cwd, ".git")) || !await isCompleteGitWorktree(cwd)) {
|
||||||
throw new Error(`Refusing to start coding agent in incomplete worktree: ${cwd}`);
|
throw new Error(`Refusing to start coding agent in incomplete worktree: ${cwd}`);
|
||||||
}
|
}
|
||||||
if (!await isRegisteredGitWorktree(projectRoot, cwd)) {
|
if (!await isRegisteredGitWorktree(projectRoot, cwd)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user