KeiSeiKit-1.0/hooks/orchestrator-branch-check.sh
Parfii-bot a4e667de10 KeiSeiKit-public — clean state
Single-commit clean baseline after security scrub of niche-tells,
project codenames, internal jargon, and contributor-email leaks.

Contents:
- 100 Rust crates (_primitives/_rust/)
- 37 agent manifests (_manifests/) + generated specs (_generated/)
- 67 user-invocable skills (skills/)
- 33 hooks (hooks/)
- Composition blocks (_blocks/)
- Documentation (docs/, README.md)
- TS adapter packages (_ts_packages/)
- Assembler (_assembler/)
- Roles (_roles/)
- Templates (_templates/)
- Forgejo CI (.forgejo/)

Author: Denis Parfionovich <info@greendragon.info>

License: see LICENSE.
2026-05-01 12:09:03 +08:00

59 lines
2.1 KiB
Bash
Executable file

#!/bin/sh
# orchestrator-branch-check — remind orchestrator to own git ops, not agents
# Event: PreToolUse:Agent
# Severity: warn (exit 0 + stderr advisory only)
# Rule: ~/.claude/rules/orchestrator-branch-first.md
#
# RULE 0.13 enforcer. Two advisory checks on every code-writing Agent spawn:
# 1. Prompt contains explicit Bash/git ban phrase?
# 2. Current branch is NOT main (orchestrator forked BEFORE spawn)?
# Bypass for legitimate meta-orchestrator via env ORCHESTRATOR_META=1.
command -v jq >/dev/null 2>&1 || exit 0
set -eu
# Bypass — /new-project skill and similar meta-agents legitimately create branches
if [ "${ORCHESTRATOR_META:-0}" = "1" ]; then
exit 0
fi
INPUT=$(cat)
SUBAGENT=$(printf '%s' "$INPUT" | jq -r '.tool_input.subagent_type // empty')
PROMPT=$(printf '%s' "$INPUT" | jq -r '.tool_input.prompt // empty')
# Only fire on code-writing agent types. Read-only agents exempt.
case "$SUBAGENT" in
code-implementer|infra-implementer|ml-implementer|refactor) ;;
*) exit 0 ;;
esac
WARNINGS=""
# Check 1 — prompt must contain explicit Bash/git ban
case "$PROMPT" in
*"MUST NOT invoke git"*|*"write files only"*|*"no git, no bash"*|*"MUST NOT invoke bash"*)
: # ok, ban phrase present
;;
*)
WARNINGS="${WARNINGS} - prompt lacks explicit Bash/git ban. Add: \"You MUST NOT invoke git, bash, or shell commands. Only Read/Write/Edit/Glob/Grep. Return a file-list in your final report.\"
"
;;
esac
# Check 2 — current branch should be feat/* (not main)
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
if [ "$BRANCH" = "main" ] || [ "$BRANCH" = "master" ]; then
WARNINGS="${WARNINGS} - spawning $SUBAGENT from '$BRANCH'. Orchestrator should create a feat/* branch FIRST, then spawn the agent into it.
"
fi
if [ -n "$WARNINGS" ]; then
cat >&2 <<EOF
[orchestrator-branch-check] RULE 0.13 advisory for $SUBAGENT spawn:
${WARNINGS}Agents get sandbox-denied Bash inside .claude/worktrees/ — they cannot
commit their own work. Orchestrator must own the branch + commit + push.
Full rule: ~/.claude/rules/orchestrator-branch-first.md
EOF
fi
exit 0