Stats
Actions
Tags
From brains-in-a-hat
Runs Node.js hooks across 7 lifecycle events (Pre/PostToolUse, SessionStart/End, SubagentStart/Stop, UserPromptSubmit) for skill injection on Read/Edit/Write/Bash, subagent bootstrap/sync, shadcn font fixes, bash chaining, file validation, telemetry, and cleanup. Touches bash and files.
7 events · 16 hooks
Safety signals detected in this hook configuration
Where this hook configuration is defined
Defined in hooks/hooks.json
Event handlers and matchers — expand Raw Configuration for the full JSON
WriteINPUT=$(cat); FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty'); PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-__unset__}"; if [ "$PLUGIN_ROOT" != "__unset__" ] && echo "$FILE" | grep -qF "$PLUGIN_ROOT"; then echo '{"decision":"block","reason":"Cannot modify plugin files from within an agent."}'; fi"${CLAUDE_PLUGIN_ROOT}/hooks/block-team-lead-edits"Agent"${CLAUDE_PLUGIN_ROOT}/hooks/pretool-agent-check"Edit"${CLAUDE_PLUGIN_ROOT}/hooks/block-team-lead-edits"NotebookEdit"${CLAUDE_PLUGIN_ROOT}/hooks/block-team-lead-edits"Bash"${CLAUDE_PLUGIN_ROOT}/hooks/block-team-lead-edits"ls .brains_in_a_hat/state/active.* &>/dev/null && printf '{"hookSpecificOutput":{"hookEventName":"SessionEnd","additionalContext":"Session ending. Spawn session-manager (background, model=sonnet) to persist state: decisions made, WIP items, and vault updates. Use subagent_type=brains-in-a-hat:session-manager."}}'Agentif ls .brains_in_a_hat/state/active.* &>/dev/null; then mkdir -p .brains_in_a_hat/state; INPUT=$(cat); AGENT=$(echo "$INPUT" | jq -r '.tool_input.name // .tool_input.subagent_type // "agent"'); DESC=$(echo "$INPUT" | jq -r '.tool_input.description // ""'); SESSION=$(ls -t .brains_in_a_hat/state/active.* 2>/dev/null | head -1); SESSION="${SESSION##*/active.}"; jq -nc --arg ts "$(date -Iseconds)" --arg agent "$AGENT" --arg detail "$DESC" --arg session "$SESSION" '{ts:$ts,agent:$agent,session:$session,event:"spawn",detail:$detail}' >> .brains_in_a_hat/state/activity.jsonl; fi"${CLAUDE_PLUGIN_ROOT}/hooks/update-session-state""${CLAUDE_PLUGIN_ROOT}/hooks/run-hook.cmd" session-startif ls .brains_in_a_hat/state/active.* &>/dev/null; then INPUT=$(cat); AGENT=$(echo "$INPUT" | jq -r '.agent_type // "agent"'); SESSION=$(ls -t .brains_in_a_hat/state/active.* 2>/dev/null | head -1); SESSION="${SESSION##*/active.}"; jq -nc --arg ts "$(date -Iseconds)" --arg agent "$AGENT" --arg session "$SESSION" '{ts:$ts,agent:$agent,session:$session,event:"done",detail:"completed"}' >> .brains_in_a_hat/state/activity.jsonl 2>/dev/null; fiif [ -n "${ZELLIJ:-}" ] && ls .brains_in_a_hat/state/active.* &>/dev/null; then INPUT=$(cat); AGENT_NAME=$(echo "$INPUT" | jq -r '.name // .agent_type // "agent"' 2>/dev/null); SESSION=$(ls -t .brains_in_a_hat/state/active.* 2>/dev/null | head -1); SESSION="${SESSION##*/active.}"; PANE_FILE=".brains_in_a_hat/state/zellij-pane-${SESSION}-${AGENT_NAME}.id"; PANE_ID=$(cat "$PANE_FILE" 2>/dev/null); if [ -n "$PANE_ID" ]; then zellij action rename-pane --pane-id "$PANE_ID" "${AGENT_NAME} [done]" 2>/dev/null; rm -f "$PANE_FILE"; fi; fiif ls .brains_in_a_hat/state/active.* &>/dev/null; then INPUT=$(cat); AGENT=$(echo "$INPUT" | jq -r '.agent_type // "agent"'); SESSION=$(ls -t .brains_in_a_hat/state/active.* 2>/dev/null | head -1); SESSION="${SESSION##*/active.}"; jq -nc --arg ts "$(date -Iseconds)" --arg agent "$AGENT" --arg session "$SESSION" '{ts:$ts,agent:$agent,session:$session,event:"start",detail:"spawned"}' >> .brains_in_a_hat/state/activity.jsonl 2>/dev/null; fiif [ -n "${ZELLIJ:-}" ] && ls .brains_in_a_hat/state/active.* &>/dev/null; then INPUT=$(cat); AGENT_NAME=$(echo "$INPUT" | jq -r '.name // .agent_type // "agent"' 2>/dev/null); SESSION=$(ls -t .brains_in_a_hat/state/active.* 2>/dev/null | head -1); SESSION="${SESSION##*/active.}"; ACTIVITY='.brains_in_a_hat/state/activity.jsonl'; PANE_ID=$(zellij action new-pane --floating --name "$AGENT_NAME" --close-on-exit -- bash -c "tail -f '$ACTIVITY' | jq --unbuffered -r 'select(.agent==\"$AGENT_NAME\") | \"\(.ts) \(.event): \(.detail)\"'" 2>/dev/null); [ -n "$PANE_ID" ] && echo "$PANE_ID" > ".brains_in_a_hat/state/zellij-pane-${SESSION}-${AGENT_NAME}.id"; fi"${CLAUDE_PLUGIN_ROOT}/hooks/inject-subagent-context""${CLAUDE_PLUGIN_ROOT}/hooks/first-prompt-greeting"npx claudepluginhub braininahat/brains-in-a-hat --plugin brains-in-a-hat