Pass --directory flag to Claude Code agents to prevent worktree escape
Claude Code resolves its project root by walking up from cwd looking for .git. In worktrees, .git is a file pointing back to the main checkout, so Claude Code would resolve the main repo as its project and write files there instead of in the worktree. Adding --directory explicitly pins it to the worktree path. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -226,6 +226,11 @@ impl ProjectConfig {
|
|||||||
args.push(render(sp));
|
args.push(render(sp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Explicitly set the project directory so Claude Code doesn't
|
||||||
|
// resolve the main checkout via .git worktree indirection.
|
||||||
|
args.push("--directory".to_string());
|
||||||
|
args.push(worktree_path.to_string());
|
||||||
|
|
||||||
Ok((command, args, prompt))
|
Ok((command, args, prompt))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -390,7 +395,8 @@ max_turns = 0
|
|||||||
.render_agent_args("/tmp/wt", "42_foo", None, None)
|
.render_agent_args("/tmp/wt", "42_foo", None, None)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(cmd, "claude");
|
assert_eq!(cmd, "claude");
|
||||||
assert!(args.is_empty());
|
assert!(args.contains(&"--directory".to_string()));
|
||||||
|
assert!(args.contains(&"/tmp/wt".to_string()));
|
||||||
assert!(prompt.contains("42_foo"));
|
assert!(prompt.contains("42_foo"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user