Skip to content

Commit 91ef8a0

Browse files
NagyViktNagyViktclaude
authored
feat(worktree): prefix worktree leaves with repo basename instead of literal 'agent' (#406)
Replaces the `agent__` prefix in resolve_worktree_leaf with the repo basename (e.g. `gitguardex__codex__...`, `recodee__codex__...`) so sandbox directories show where the agent started from. - scripts/agent-branch-start.sh + templates/ + frontend/ mirror - scripts/codex-agent.sh + templates/ + frontend/ mirror - test/sandbox.test.js expectations updated to use path.basename(repoDir) Co-authored-by: NagyVikt <nagy.viktordp@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent fbbaa1e commit 91ef8a0

7 files changed

Lines changed: 96 additions & 9 deletions

File tree

frontend/scripts/agent-branch-start.sh

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,16 +278,30 @@ resolve_openspec_capability_slug() {
278278
sanitize_slug "$task_slug" "general-behavior"
279279
}
280280

281+
resolve_repo_prefix() {
282+
local root
283+
root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
284+
basename "$root"
285+
}
286+
281287
resolve_worktree_leaf() {
282288
local branch_name="$1"
283289
local agent_slug="$2"
284290
local masterplan_label=""
285291
local branch_leaf=""
292+
local repo_prefix
293+
repo_prefix="$(resolve_repo_prefix)"
286294

287295
masterplan_label="$(resolve_openspec_masterplan_label)"
288296
if [[ -n "$masterplan_label" ]] && [[ "$branch_name" == "agent/${agent_slug}/"* ]]; then
289297
branch_leaf="${branch_name#agent/${agent_slug}/}"
290-
printf 'agent__%s__%s__%s' "$agent_slug" "$masterplan_label" "$branch_leaf"
298+
printf '%s__%s__%s__%s' "$repo_prefix" "$agent_slug" "$masterplan_label" "$branch_leaf"
299+
return 0
300+
fi
301+
302+
if [[ "$branch_name" == agent/*/* ]]; then
303+
local without_agent="${branch_name#agent/}"
304+
printf '%s__%s' "$repo_prefix" "${without_agent//\//__}"
291305
return 0
292306
fi
293307

frontend/scripts/codex-agent.sh

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,17 +214,32 @@ resolve_openspec_capability_slug() {
214214
sanitize_slug "$task_slug" "general-behavior"
215215
}
216216

217+
resolve_repo_prefix() {
218+
local root
219+
root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
220+
basename "$root"
221+
}
222+
217223
resolve_worktree_leaf() {
218224
local branch_name="$1"
219225
local masterplan_label=""
220226
local branch_role=""
221227
local branch_leaf=""
228+
local repo_prefix
229+
repo_prefix="$(resolve_repo_prefix)"
222230

223231
masterplan_label="$(resolve_openspec_masterplan_label)"
224232
if [[ -n "$masterplan_label" ]] && [[ "$branch_name" =~ ^agent/([^/]+)/(.+)$ ]]; then
225233
branch_role="${BASH_REMATCH[1]}"
226234
branch_leaf="${BASH_REMATCH[2]}"
227-
printf 'agent__%s__%s__%s' "$branch_role" "$masterplan_label" "$branch_leaf"
235+
printf '%s__%s__%s__%s' "$repo_prefix" "$branch_role" "$masterplan_label" "$branch_leaf"
236+
return 0
237+
fi
238+
239+
if [[ "$branch_name" =~ ^agent/([^/]+)/(.+)$ ]]; then
240+
branch_role="${BASH_REMATCH[1]}"
241+
branch_leaf="${BASH_REMATCH[2]}"
242+
printf '%s__%s__%s' "$repo_prefix" "$branch_role" "$branch_leaf"
228243
return 0
229244
fi
230245

scripts/agent-branch-start.sh

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,16 +340,30 @@ resolve_openspec_capability_slug() {
340340
sanitize_slug "$task_slug" "general-behavior"
341341
}
342342

343+
resolve_repo_prefix() {
344+
local root
345+
root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
346+
basename "$root"
347+
}
348+
343349
resolve_worktree_leaf() {
344350
local branch_name="$1"
345351
local agent_slug="$2"
346352
local masterplan_label=""
347353
local branch_leaf=""
354+
local repo_prefix
355+
repo_prefix="$(resolve_repo_prefix)"
348356

349357
masterplan_label="$(resolve_openspec_masterplan_label)"
350358
if [[ -n "$masterplan_label" ]] && [[ "$branch_name" == "agent/${agent_slug}/"* ]]; then
351359
branch_leaf="${branch_name#agent/${agent_slug}/}"
352-
printf 'agent__%s__%s__%s' "$agent_slug" "$masterplan_label" "$branch_leaf"
360+
printf '%s__%s__%s__%s' "$repo_prefix" "$agent_slug" "$masterplan_label" "$branch_leaf"
361+
return 0
362+
fi
363+
364+
if [[ "$branch_name" == agent/*/* ]]; then
365+
local without_agent="${branch_name#agent/}"
366+
printf '%s__%s' "$repo_prefix" "${without_agent//\//__}"
353367
return 0
354368
fi
355369

scripts/codex-agent.sh

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,17 +372,32 @@ resolve_openspec_capability_slug() {
372372
sanitize_slug "$task_slug" "general-behavior"
373373
}
374374

375+
resolve_repo_prefix() {
376+
local root
377+
root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
378+
basename "$root"
379+
}
380+
375381
resolve_worktree_leaf() {
376382
local branch_name="$1"
377383
local masterplan_label=""
378384
local branch_role=""
379385
local branch_leaf=""
386+
local repo_prefix
387+
repo_prefix="$(resolve_repo_prefix)"
380388

381389
masterplan_label="$(resolve_openspec_masterplan_label)"
382390
if [[ -n "$masterplan_label" ]] && [[ "$branch_name" =~ ^agent/([^/]+)/(.+)$ ]]; then
383391
branch_role="${BASH_REMATCH[1]}"
384392
branch_leaf="${BASH_REMATCH[2]}"
385-
printf 'agent__%s__%s__%s' "$branch_role" "$masterplan_label" "$branch_leaf"
393+
printf '%s__%s__%s__%s' "$repo_prefix" "$branch_role" "$masterplan_label" "$branch_leaf"
394+
return 0
395+
fi
396+
397+
if [[ "$branch_name" =~ ^agent/([^/]+)/(.+)$ ]]; then
398+
branch_role="${BASH_REMATCH[1]}"
399+
branch_leaf="${BASH_REMATCH[2]}"
400+
printf '%s__%s__%s' "$repo_prefix" "$branch_role" "$branch_leaf"
386401
return 0
387402
fi
388403

templates/scripts/agent-branch-start.sh

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,16 +340,30 @@ resolve_openspec_capability_slug() {
340340
sanitize_slug "$task_slug" "general-behavior"
341341
}
342342

343+
resolve_repo_prefix() {
344+
local root
345+
root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
346+
basename "$root"
347+
}
348+
343349
resolve_worktree_leaf() {
344350
local branch_name="$1"
345351
local agent_slug="$2"
346352
local masterplan_label=""
347353
local branch_leaf=""
354+
local repo_prefix
355+
repo_prefix="$(resolve_repo_prefix)"
348356

349357
masterplan_label="$(resolve_openspec_masterplan_label)"
350358
if [[ -n "$masterplan_label" ]] && [[ "$branch_name" == "agent/${agent_slug}/"* ]]; then
351359
branch_leaf="${branch_name#agent/${agent_slug}/}"
352-
printf 'agent__%s__%s__%s' "$agent_slug" "$masterplan_label" "$branch_leaf"
360+
printf '%s__%s__%s__%s' "$repo_prefix" "$agent_slug" "$masterplan_label" "$branch_leaf"
361+
return 0
362+
fi
363+
364+
if [[ "$branch_name" == agent/*/* ]]; then
365+
local without_agent="${branch_name#agent/}"
366+
printf '%s__%s' "$repo_prefix" "${without_agent//\//__}"
353367
return 0
354368
fi
355369

templates/scripts/codex-agent.sh

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,17 +372,32 @@ resolve_openspec_capability_slug() {
372372
sanitize_slug "$task_slug" "general-behavior"
373373
}
374374

375+
resolve_repo_prefix() {
376+
local root
377+
root="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
378+
basename "$root"
379+
}
380+
375381
resolve_worktree_leaf() {
376382
local branch_name="$1"
377383
local masterplan_label=""
378384
local branch_role=""
379385
local branch_leaf=""
386+
local repo_prefix
387+
repo_prefix="$(resolve_repo_prefix)"
380388

381389
masterplan_label="$(resolve_openspec_masterplan_label)"
382390
if [[ -n "$masterplan_label" ]] && [[ "$branch_name" =~ ^agent/([^/]+)/(.+)$ ]]; then
383391
branch_role="${BASH_REMATCH[1]}"
384392
branch_leaf="${BASH_REMATCH[2]}"
385-
printf 'agent__%s__%s__%s' "$branch_role" "$masterplan_label" "$branch_leaf"
393+
printf '%s__%s__%s__%s' "$repo_prefix" "$branch_role" "$masterplan_label" "$branch_leaf"
394+
return 0
395+
fi
396+
397+
if [[ "$branch_name" =~ ^agent/([^/]+)/(.+)$ ]]; then
398+
branch_role="${BASH_REMATCH[1]}"
399+
branch_leaf="${BASH_REMATCH[2]}"
400+
printf '%s__%s__%s' "$repo_prefix" "$branch_role" "$branch_leaf"
386401
return 0
387402
fi
388403

test/sandbox.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ test('codex-agent launches codex inside a fresh sandbox worktree and keeps branc
102102
const launchedCwd = fs.readFileSync(cwdMarker, 'utf8').trim();
103103
assert.match(
104104
launchedCwd,
105-
new RegExp(`${escapeRegexLiteral(repoDir)}/\\.omx/agent-worktrees/agent__planner__masterplan__`),
105+
new RegExp(`${escapeRegexLiteral(repoDir)}/\\.omx/agent-worktrees/${escapeRegexLiteral(path.basename(repoDir))}__planner__masterplan__`),
106106
);
107107

108108
const launchedArgs = fs.readFileSync(argsMarker, 'utf8').trim();
@@ -338,7 +338,7 @@ test('codex-agent ignores stale repo-local starter shims and keeps the visible c
338338
const launchedCwd = fs.readFileSync(cwdMarker, 'utf8').trim();
339339
assert.match(
340340
launchedCwd,
341-
new RegExp(`${escapeRegexLiteral(repoDir)}/\\.omx/agent-worktrees/agent__planner__masterplan__`),
341+
new RegExp(`${escapeRegexLiteral(repoDir)}/\\.omx/agent-worktrees/${escapeRegexLiteral(path.basename(repoDir))}__planner__masterplan__`),
342342
);
343343
assert.notEqual(launchedCwd, repoDir);
344344
assert.match(combinedOutput, /\[codex-agent\] OpenSpec change workspace:/);
@@ -411,7 +411,7 @@ test('codex-agent supports --codex-bin override before positional arguments', ()
411411
const launchedCwd = fs.readFileSync(cwdMarker, 'utf8').trim();
412412
assert.match(
413413
launchedCwd,
414-
new RegExp(`${escapeRegexLiteral(repoDir)}/\\.omx/agent-worktrees/agent__planner__`),
414+
new RegExp(`${escapeRegexLiteral(repoDir)}/\\.omx/agent-worktrees/${escapeRegexLiteral(path.basename(repoDir))}__planner__`),
415415
);
416416
const launchedArgs = fs.readFileSync(argsMarker, 'utf8').trim();
417417
assert.match(launchedArgs, /--model gpt-5\.4-mini/);

0 commit comments

Comments
 (0)