diff --git a/scripts/agent-worktree.sh b/scripts/agent-worktree.sh new file mode 100755 index 00000000..b3fc3f6f --- /dev/null +++ b/scripts/agent-worktree.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# scripts/agent-worktree.sh +# Multi-agent worktree workflow helper. +# See docs/superpowers/specs/2026-05-12-multi-agent-worktree-workflow-design.md +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +# shellcheck source=lib/agent-worktree-lib.sh +source "$SCRIPT_DIR/lib/agent-worktree-lib.sh" + +WORKTREE_ROOT="${WORKTREE_ROOT:-$HOME/CyberMindStudio/secubox-deb-worktrees}" +GH_BIN="${GH_BIN:-gh}" +GIT_BIN="${GIT_BIN:-git}" + +usage() { + cat <<'USAGE' +agent-worktree.sh — multi-agent worktree workflow helper + +Usage: + agent-worktree.sh start --issue [--dry-run] [--verbose] + agent-worktree.sh list [--verbose] + agent-worktree.sh sync [] + agent-worktree.sh finish [--dry-run] + agent-worktree.sh clean [--force] + agent-worktree.sh --help + +Environment: + WORKTREE_ROOT override worktree root (default: ~/CyberMindStudio/secubox-deb-worktrees) + GH_BIN, GIT_BIN override CLI binaries (used by tests) + +Exit codes: + 0 success + 1 generic / usage + 2 precondition (issue missing, gh not authed, etc.) + 3 bad state (dirty tree, conflict, non-merged PR) + 4 network / remote error +USAGE +} + +cmd_start() { echo "start: not implemented" >&2 ; return 1; } +cmd_list() { echo "list: not implemented" >&2 ; return 1; } +cmd_sync() { echo "sync: not implemented" >&2 ; return 1; } +cmd_finish() { echo "finish: not implemented" >&2; return 1; } +cmd_clean() { echo "clean: not implemented" >&2 ; return 1; } + +main() { + local sub="${1:-}" + shift || true + case "$sub" in + -h|--help|help|"") usage ; return 0 ;; + start) cmd_start "$@" ;; + list) cmd_list "$@" ;; + sync) cmd_sync "$@" ;; + finish) cmd_finish "$@" ;; + clean) cmd_clean "$@" ;; + *) echo "unknown sub-command: $sub" >&2 ; usage >&2 ; return 1 ;; + esac +} + +main "$@" diff --git a/scripts/tests/test-agent-worktree.sh b/scripts/tests/test-agent-worktree.sh index 5eeeac26..a9a89a23 100755 --- a/scripts/tests/test-agent-worktree.sh +++ b/scripts/tests/test-agent-worktree.sh @@ -101,6 +101,25 @@ test_prefix_first_match_wins() { assert_eq "fix/" "$(prefix_from_labels 'bug,documentation')" "first match" } +test_script_help_exits_zero() { + local out + out=$(bash "$SCRIPT" --help 2>&1) + assert_eq "0" "$?" "help exit" + assert_contains "$out" "agent-worktree.sh" + assert_contains "$out" "start" + assert_contains "$out" "list" + assert_contains "$out" "sync" + assert_contains "$out" "finish" + assert_contains "$out" "clean" +} + +test_script_unknown_subcommand_exits_1() { + local out rc + out=$(bash "$SCRIPT" wibble 2>&1) ; rc=$? + if [[ $rc -ne 1 ]]; then echo "expected rc=1, got $rc; out=$out" >&2; return 1; fi + assert_contains "$out" "unknown" +} + # Auto-discover and run mapfile -t tests < <(declare -F | awk '{print $3}' | grep '^test_') for t in "${tests[@]}"; do run_test "$t"; done