diff --git a/.gitignore b/.gitignore index c0ef42d..f3a0be4 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ scripts/install-agent-git-hooks.sh scripts/openspec/init-plan-workspace.sh .githooks/pre-commit oh-my-codex/ -.codex/skills/musafety/SKILL.md -.claude/commands/musafety.md +.codex/skills/guardex/SKILL.md +.claude/commands/guardex.md .omx/state/agent-file-locks.json # multiagent-safety:END diff --git a/package.json b/package.json index 2986476..d397644 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "agent:codex": "bash ./scripts/codex-agent.sh", "agent:branch:start": "bash ./scripts/agent-branch-start.sh", "agent:branch:finish": "bash ./scripts/agent-branch-finish.sh", - "agent:cleanup": "bash ./scripts/agent-worktree-prune.sh --base dev", + "agent:cleanup": "gx cleanup", "agent:hooks:install": "bash ./scripts/install-agent-git-hooks.sh", "agent:locks:claim": "python3 ./scripts/agent-file-locks.py claim", "agent:locks:allow-delete": "python3 ./scripts/agent-file-locks.py allow-delete", diff --git a/scripts/agent-branch-start.sh b/scripts/agent-branch-start.sh index 0d333ca..6510157 100755 --- a/scripts/agent-branch-start.sh +++ b/scripts/agent-branch-start.sh @@ -1,16 +1,14 @@ #!/usr/bin/env bash set -euo pipefail -TASK_NAME="${1:-task}" -AGENT_NAME="${2:-agent}" -BASE_BRANCH="${3:-}" +TASK_NAME="task" +AGENT_NAME="agent" +BASE_BRANCH="" BASE_BRANCH_EXPLICIT=0 WORKTREE_MODE=1 +ALLOW_IN_PLACE=0 WORKTREE_ROOT_REL=".omx/agent-worktrees" - -if [[ -n "${3:-}" ]]; then - BASE_BRANCH_EXPLICIT=1 -fi +POSITIONAL_ARGS=() while [[ $# -gt 0 ]]; do case "$1" in @@ -31,25 +29,53 @@ while [[ $# -gt 0 ]]; do WORKTREE_MODE=0 shift ;; + --allow-in-place) + ALLOW_IN_PLACE=1 + shift + ;; --worktree-root) WORKTREE_ROOT_REL="${2:-.omx/agent-worktrees}" shift 2 ;; --) shift + while [[ $# -gt 0 ]]; do + POSITIONAL_ARGS+=("$1") + shift + done break ;; -*) echo "[agent-branch-start] Unknown option: $1" >&2 - echo "Usage: $0 [task] [agent] [base] [--in-place] [--worktree-root ]" >&2 + echo "Usage: $0 [task] [agent] [base] [--in-place --allow-in-place] [--worktree-root ]" >&2 exit 1 ;; *) - break + POSITIONAL_ARGS+=("$1") + shift ;; esac done +if [[ "${#POSITIONAL_ARGS[@]}" -gt 3 ]]; then + echo "[agent-branch-start] Too many positional arguments." >&2 + echo "Usage: $0 [task] [agent] [base] [--in-place --allow-in-place] [--worktree-root ]" >&2 + exit 1 +fi + +if [[ "${#POSITIONAL_ARGS[@]}" -ge 1 ]]; then + TASK_NAME="${POSITIONAL_ARGS[0]}" +fi + +if [[ "${#POSITIONAL_ARGS[@]}" -ge 2 ]]; then + AGENT_NAME="${POSITIONAL_ARGS[1]}" +fi + +if [[ "${#POSITIONAL_ARGS[@]}" -ge 3 ]]; then + BASE_BRANCH="${POSITIONAL_ARGS[2]}" + BASE_BRANCH_EXPLICIT=1 +fi + sanitize_slug() { local raw="$1" local fallback="${2:-task}" @@ -180,6 +206,12 @@ if git show-ref --verify --quiet "refs/heads/${branch_name}"; then fi if [[ "$WORKTREE_MODE" -eq 0 ]]; then + if [[ "$ALLOW_IN_PLACE" -ne 1 ]]; then + echo "[agent-branch-start] --in-place is blocked by default to prevent accidental edits on protected branches." >&2 + echo "[agent-branch-start] If you really need it, pass both: --in-place --allow-in-place" >&2 + exit 1 + fi + if ! git diff --quiet || ! git diff --cached --quiet; then echo "[agent-branch-start] Working tree is not clean. Commit/stash changes before starting an in-place branch." >&2 exit 1