← Back to task

Commit fcdf427e

commit fcdf427e7990acc5a0eb2b93bb58aed6f3e8841c
Author: Coder Agent <coder@agents.omni>
Date:   Wed Feb 11 17:13:08 2026

    Omni/Ide: parameterize dev-review-release worktree naming
    
    - remove hardcoded t-565 defaults from dev-review-release.sh
    - add setup flag --name for role worktree branch prefix
    - derive default branch prefix from basename of --root
    - update branch_for_worktree to emit <name>-dev|test|live
    - update DEV_REVIEW_RELEASE.md and README.md examples/docs
    
    Task-Id: t-587.1

diff --git a/Omni/Ide/DEV_REVIEW_RELEASE.md b/Omni/Ide/DEV_REVIEW_RELEASE.md
index ceb065d7..4eb1e046 100644
--- a/Omni/Ide/DEV_REVIEW_RELEASE.md
+++ b/Omni/Ide/DEV_REVIEW_RELEASE.md
@@ -5,7 +5,7 @@ This workflow runs three independent agent loops in dedicated worktrees.
 ## Safety Guarantees
 
 - Existing worktrees are never deleted or modified by setup.
-- New worktrees are created under `_/worktrees/t-565` by default.
+- New worktrees are created under `_/worktrees/dev-review-release` by default.
 - Branch cleanup is dry-run by default.
 - Worktree directories are never removed automatically.
 - Loop auto-stashes dirty workspace state by default (can disable with `--no-auto-stash`).
@@ -17,14 +17,17 @@ Omni/Ide/dev-review-release.sh setup-worktrees
 ```
 
 Default worktrees:
-- `_/worktrees/t-565/dev`
-- `_/worktrees/t-565/test`
-- `_/worktrees/t-565/live`
+- `_/worktrees/dev-review-release/dev`
+- `_/worktrees/dev-review-release/test`
+- `_/worktrees/dev-review-release/live`
+
+By default, setup derives the role-worktree branch prefix from the basename of `--root`.
+Use `--name` to set it explicitly.
 
 Optional:
 
 ```bash
-Omni/Ide/dev-review-release.sh setup-worktrees --root _/worktrees/my-flow --base live
+Omni/Ide/dev-review-release.sh setup-worktrees --root _/worktrees/my-flow --name my-flow --base live
 ```
 
 ## 2) Run loops (tmux: one window per role)
@@ -38,9 +41,9 @@ Omni/Ide/dev-review-release.sh loop --role integrator
 Optional flags:
 - `--interval 20`
 - `--provider claude-code`
-- `--root _/worktrees/t-565`
-- `--parent t-565` (scope to one epic)
-- `--task-id t-565.2` (scope to one task)
+- `--root _/worktrees/my-flow`
+- `--parent t-587` (scope to one epic)
+- `--task-id t-587.1` (scope to one task)
 - `--no-auto-stash` (disable automatic dirty-workspace recovery)
 - `--once`
 - `--dry-run`
diff --git a/Omni/Ide/README.md b/Omni/Ide/README.md
index 2e5ef6f6..2fb49236 100644
--- a/Omni/Ide/README.md
+++ b/Omni/Ide/README.md
@@ -65,13 +65,14 @@ Runs a 3-role looped workflow in dedicated worktrees (`dev`, `test`, `live`).
 Examples:
 ```bash
 Omni/Ide/dev-review-release.sh setup-worktrees
+Omni/Ide/dev-review-release.sh setup-worktrees --root _/worktrees/t-587 --name t-587
 Omni/Ide/dev-review-release.sh loop --role dev
 Omni/Ide/dev-review-release.sh loop --role review
 Omni/Ide/dev-review-release.sh loop --role integrator
 
 # Optional: scope to one epic/task while dogfooding
-Omni/Ide/dev-review-release.sh loop --role dev --parent t-565
-Omni/Ide/dev-review-release.sh loop --role dev --task-id t-565.2
+Omni/Ide/dev-review-release.sh loop --role dev --parent t-587
+Omni/Ide/dev-review-release.sh loop --role dev --task-id t-587.1
 
 # Disable dirty-workspace auto-stash recovery
 Omni/Ide/dev-review-release.sh loop --role dev --no-auto-stash
diff --git a/Omni/Ide/dev-review-release.sh b/Omni/Ide/dev-review-release.sh
index 5b876a46..32057617 100755
--- a/Omni/Ide/dev-review-release.sh
+++ b/Omni/Ide/dev-review-release.sh
@@ -4,7 +4,7 @@ set -euo pipefail
 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
 
-DEFAULT_WORKTREE_ROOT="_/worktrees/t-565"
+DEFAULT_WORKTREE_ROOT="_/worktrees/dev-review-release"
 DEFAULT_BASE_BRANCH="live"
 DEFAULT_INTERVAL_SECONDS=20
 DEFAULT_TIMEOUT_SECONDS=1800
@@ -14,7 +14,7 @@ DEFAULT_MAX_COST_CENTS=300
 usage() {
   cat <<'EOF'
 Usage:
-  Omni/Ide/dev-review-release.sh setup-worktrees [--root PATH] [--base BRANCH]
+  Omni/Ide/dev-review-release.sh setup-worktrees [--root PATH] [--base BRANCH] [--name NAME]
   Omni/Ide/dev-review-release.sh loop --role dev|review|integrator [options]
   Omni/Ide/dev-review-release.sh cleanup-branches [--apply]
 
@@ -28,9 +28,14 @@ Commands:
   cleanup-branches  Delete task branches (t-*) whose tasks are Done.
                     Dry-run by default.
 
+Setup options:
+  --root PATH       Worktree root (default: _/worktrees/dev-review-release)
+  --base BRANCH     Base branch for worktrees (default: live)
+  --name NAME       Branch prefix for role worktrees (default: basename of --root)
+
 Loop options:
   --role ROLE       Required. dev | review | integrator
-  --root PATH       Worktree root (default: _/worktrees/t-565)
+  --root PATH       Worktree root (default: _/worktrees/dev-review-release)
   --base BRANCH     Base branch for worktrees (default: live)
   --interval N      Poll interval in seconds (default: 20)
   --provider NAME   Optional agentd provider (claude-code|anthropic|openrouter|ollama)
@@ -45,17 +50,18 @@ Loop options:
 
 Cleanup options:
   --apply           Actually delete branches. Without this flag, cleanup is dry-run.
-  --root PATH       Worktree root (default: _/worktrees/t-565)
+  --root PATH       Worktree root (default: _/worktrees/dev-review-release)
 
 Examples:
   Omni/Ide/dev-review-release.sh setup-worktrees
+  Omni/Ide/dev-review-release.sh setup-worktrees --root _/worktrees/t-587 --name t-587
 
   Omni/Ide/dev-review-release.sh loop --role dev
   Omni/Ide/dev-review-release.sh loop --role review
   Omni/Ide/dev-review-release.sh loop --role integrator
 
   # Scope to one epic (dogfood safely)
-  Omni/Ide/dev-review-release.sh loop --role dev --parent t-565
+  Omni/Ide/dev-review-release.sh loop --role dev --parent t-587
 
   Omni/Ide/dev-review-release.sh cleanup-branches
   Omni/Ide/dev-review-release.sh cleanup-branches --apply
@@ -75,6 +81,26 @@ resolve_path() {
   fi
 }
 
+default_worktree_name() {
+  local root_rel="$1"
+  local resolved base
+  resolved="$(resolve_path "$root_rel")"
+  base="$(basename "$resolved")"
+  if [[ -z "$base" || "$base" == "/" || "$base" == "." ]]; then
+    echo "Could not derive worktree name from --root: $root_rel" >&2
+    exit 1
+  fi
+  printf '%s\n' "$base"
+}
+
+validate_worktree_name() {
+  local name="$1"
+  if [[ ! "$name" =~ ^[A-Za-z0-9._-]+$ ]]; then
+    echo "Invalid --name '$name' (allowed: letters, numbers, ., _, -)" >&2
+    exit 1
+  fi
+}
+
 workflow_path_for_role() {
   local role="$1"
   case "$role" in
@@ -103,11 +129,12 @@ workspace_for_role() {
 }
 
 branch_for_worktree() {
-  local role="$1"
+  local worktree_name="$1"
+  local role="$2"
   case "$role" in
-    dev) printf 't-565-dev\n' ;;
-    review) printf 't-565-test\n' ;;
-    integrator) printf 't-565-live\n' ;;
+    dev) printf '%s-dev\n' "$worktree_name" ;;
+    review) printf '%s-test\n' "$worktree_name" ;;
+    integrator) printf '%s-live\n' "$worktree_name" ;;
     *)
       echo "Unknown role: $role" >&2
       exit 1
@@ -439,6 +466,7 @@ run_single_task() {
 setup_worktrees_cmd() {
   local root_rel="$DEFAULT_WORKTREE_ROOT"
   local base_branch="$DEFAULT_BASE_BRANCH"
+  local worktree_name=""
 
   while [[ $# -gt 0 ]]; do
     case "$1" in
@@ -450,6 +478,10 @@ setup_worktrees_cmd() {
         base_branch="$2"
         shift 2
         ;;
+      --name)
+        worktree_name="$2"
+        shift 2
+        ;;
       -h|--help)
         usage
         exit 0
@@ -462,14 +494,21 @@ setup_worktrees_cmd() {
     esac
   done
 
+  if [[ -z "$worktree_name" ]]; then
+    worktree_name="$(default_worktree_name "$root_rel")"
+  fi
+  validate_worktree_name "$worktree_name"
+
   local root
   root="$(resolve_path "$root_rel")"
   mkdir -p "$root"
 
+  log "Setting up worktrees with name='$worktree_name' root=$root base=$base_branch"
+
   for role in dev review integrator; do
     local workspace branch
     workspace="$(workspace_for_role "$root" "$role")"
-    branch="$(branch_for_worktree "$role")"
+    branch="$(branch_for_worktree "$worktree_name" "$role")"
 
     if git -C "$workspace" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
       log "Worktree exists, leaving untouched: $workspace"
@@ -488,6 +527,7 @@ setup_worktrees_cmd() {
   cat <<EOF
 
 Worktrees ready under: $root
+Worktree branch prefix: $worktree_name
 
 Start loops in tmux (one window each):
   Omni/Ide/dev-review-release.sh loop --role dev --root "$root"