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"