Wrap the live coordinator in project Cursor capabilities so agents default to leases, docs apply, and daemon enqueue. Track skills/hooks/mcp via .gitignore exceptions; guard destructive git with ask permission.
61 lines
2.4 KiB
Bash
Executable File
61 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Fail-closed red-line gate for destructive / unauthorized git. Does not replace agentctl leases.
|
|
set -euo pipefail
|
|
input=$(cat)
|
|
command=$(printf '%s' "$input" | python3 -c 'import json,sys; print(json.load(sys.stdin).get("command") or "")')
|
|
|
|
ask() {
|
|
local user_msg="$1"
|
|
local agent_msg="$2"
|
|
python3 -c 'import json,sys; print(json.dumps({"permission":"ask","user_message":sys.argv[1],"agent_message":sys.argv[2]}))' "$user_msg" "$agent_msg"
|
|
exit 0
|
|
}
|
|
|
|
allow() {
|
|
echo '{"permission":"allow"}'
|
|
exit 0
|
|
}
|
|
|
|
# Normalize whitespace for matching
|
|
cmd=$(printf '%s' "$command" | tr '\n' ' ')
|
|
|
|
# Unauthorized push (user must confirm)
|
|
if printf '%s' "$cmd" | grep -Eq '(^|[[:space:]])git([[:space:]]+-[^[:space:]]+)*[[:space:]]+push([[:space:]]|$)'; then
|
|
ask "git push 需要显式用户授权(AGENTS remote_sync)。请确认后再继续。" \
|
|
"Hook blocked git push pending user authorization."
|
|
fi
|
|
|
|
# Destructive / force operations
|
|
if printf '%s' "$cmd" | grep -Eq 'git[[:space:]]+.*(--force|-f)([[:space:]]|$)' \
|
|
|| printf '%s' "$cmd" | grep -Eq 'git[[:space:]]+push[[:space:]].*\+'; then
|
|
ask "检测到 git --force / 强推。破坏性操作须用户明确授权。" \
|
|
"Hook requires confirmation for force git operation."
|
|
fi
|
|
|
|
if printf '%s' "$cmd" | grep -Eq 'git[[:space:]]+reset[[:space:]]+.*--hard'; then
|
|
ask "git reset --hard 会丢弃工作区。须用户明确授权。" \
|
|
"Hook requires confirmation for git reset --hard."
|
|
fi
|
|
|
|
if printf '%s' "$cmd" | grep -Eq 'git[[:space:]]+clean[[:space:]]+.*-[a-zA-Z]*f'; then
|
|
ask "git clean -f 会删除未跟踪文件。须用户明确授权。" \
|
|
"Hook requires confirmation for git clean -f."
|
|
fi
|
|
|
|
if printf '%s' "$cmd" | grep -Eq 'git[[:space:]]+branch[[:space:]]+(-D|--delete[[:space:]]+--force)'; then
|
|
ask "强制删分支 (-D) 须用户明确授权;优先 git branch -d。" \
|
|
"Hook requires confirmation for git branch -D."
|
|
fi
|
|
|
|
if printf '%s' "$cmd" | grep -Eq 'git[[:space:]]+worktree[[:space:]]+remove[[:space:]]+.*--force'; then
|
|
ask "git worktree remove --force 被 AGENTS 禁止升级。须用户明确授权。" \
|
|
"Hook requires confirmation for forced worktree remove."
|
|
fi
|
|
|
|
if printf '%s' "$cmd" | grep -Eq 'git[[:space:]]+checkout[[:space:]]+--\.($|[[:space:]])'; then
|
|
ask "git checkout -- . 会丢弃全部本地修改。须用户明确授权。" \
|
|
"Hook requires confirmation for discarding all local changes."
|
|
fi
|
|
|
|
allow
|