mark-brannan/claude
The Claude Code layer of a personal setup (hooks, skills, settings), as a public reference implementation. Claude here means Claude Code, not the model.
ARCHETYPE
Skill Collector
Ten-plus skills loaded on demand. A procedural-knowledge library.
Copy this rig
# review before running: this installs third-party code $ npx degit mark-brannan/claude/skills ./rig-claude/skills $ npx degit mark-brannan/claude/hooks ./rig-claude/hooks
MCP servers are added to Claude Code at local scope; env vars are shown as YOUR_… placeholders — we never store values. Files are fetched with degit into a separate folder so you can review before merging.
$ npx degit mark-brannan/claude/skills/agora .claude/skills/agora $ npx degit mark-brannan/claude/skills/arete-check .claude/skills/arete-check $ npx degit mark-brannan/claude/skills/card-helper .claude/skills/card-helper $ npx degit mark-brannan/claude/skills/card-write .claude/skills/card-write $ npx degit mark-brannan/claude/skills/critical-review .claude/skills/critical-review $ npx degit mark-brannan/claude/skills/curia .claude/skills/curia $ npx degit mark-brannan/claude/skills/doc-settledness-check .claude/skills/doc-settledness-check $ npx degit mark-brannan/claude/skills/iada .claude/skills/iada $ npx degit mark-brannan/claude/skills/npm-first-publish .claude/skills/npm-first-publish $ npx degit mark-brannan/claude/skills/orchestrate .claude/skills/orchestrate $ npx degit mark-brannan/claude/skills/pickup .claude/skills/pickup $ npx degit mark-brannan/claude/skills/prt .claude/skills/prt $ npx degit mark-brannan/claude/skills/reconcile .claude/skills/reconcile $ npx degit mark-brannan/claude/skills/scoping .claude/skills/scoping $ npx degit mark-brannan/claude/skills/sweep .claude/skills/sweep $ npx degit mark-brannan/claude/skills/worklist .claude/skills/worklist $ npx degit mark-brannan/claude/skills/wrapup .claude/skills/wrapup
Merge into .claude/settings.json (project) or ~/.claude/settings.json (user). Hook commands reference scripts in the source repo — copy those too.
{
"permissions": {
"deny": [
"Bash(git reset --hard:*)",
"Skill(mergify:mergify-stack)"
]
},
"hooks": {
"PreToolUse": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "in=$(cat); [ -n \"${SPEND_GATE_USD:-}${SPEND_GATE_TOKENS:-}\" ] || exit 0; h=\"$HOME/.claude/hooks/spend-gate.py\"; { [ -f \"$h\" ] && printf '%s' \"$in\" | python3 \"$h\"; } && exit 0; o=\"${SPEND_GATE_HANDOFF:-HANDOFF.md}\"; f=$(printf '%s' \"$in\" | t"
}
]
},
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "h=\"$HOME/.claude/hooks/no-unsigned-push.sh\"; { [ -f \"$h\" ] && sh \"$h\"; } || printf '%s\\n' '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"no-unsigned-push.sh is missing from $HOME"
},
{
"type": "command",
"command": "h=\"$HOME/.claude/hooks/npm-publish-auth.sh\"; [ -f \"$h\" ] && bash \"$h\" || true"
}
]
},
{
"matcher": "mcp__claude-code-remote__add_repo",
"hooks": [
{
"type": "command",
"command": "h=\"$HOME/.claude/hooks/guard-add-repo.sh\"; [ -f \"$h\" ] && bash \"$h\"; true"
}
]
},
{
"matcher": "mcp__.*__(send_later|create_trigger)",
"hooks": [
{
"type": "command",
"command": "h=\"$HOME/.claude/hooks/no-persistent-polling.sh\"; [ -f \"$h\" ] && bash \"$h\" || true"
}
]
},
{
"matcher": "Bash|mcp__.*__update_pull_request_branch",
"hooks": [
{
"type": "command",
"command": "h=\"$HOME/.claude/hooks/no-update-branch.sh\"; [ -f \"$h\" ] && bash \"$h\" || true"
}
]
},
{
"matcher": "mcp__.*__subscribe_pr_activity",
"hooks": [
{
"type": "command",
"command": "h=\"$HOME/.claude/hooks/no-late-pr-subscribe.sh\"; [ -f \"$h\" ] && bash \"$h\" || true"
}
]
},
{
"matcher": "Bash|mcp__.*github.*__.*",
"hooks": [
{
"type": "command",
"command": "h=\"$HOME/.claude/hooks/pr-ownership-context.sh\"; [ -f \"$h\" ] && sh \"$h\" || true"
}
]
}
]
}
} Skills (17)
agoraarete-checkcard-helpercard-writecritical-reviewcuriadoc-settledness-checkiadanpm-first-publishorchestratepickupprtreconcilescopingsweepworklistwrapup
Hooks (25)
| event | matcher | runs |
|---|---|---|
| PreToolUse | * | in=$(cat); [ -n "${SPEND_GATE_USD:-}${SPEND_GATE_TOKENS:-}" ] || exit 0; h="$HOME/.claude/hooks/spend-gate.py"; { [ -f "$h" ] && printf '%s' "$in" | python3 "$h"; } && exit 0; o="${SPEND_GATE_HANDOFF:-HANDOFF.md}"; f=$(printf '%s' "$in" | t |
| PreToolUse | Bash | h="$HOME/.claude/hooks/no-unsigned-push.sh"; { [ -f "$h" ] && sh "$h"; } || printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"no-unsigned-push.sh is missing from $HOME |
| PreToolUse | mcp__claude-code-remote__add_repo | h="$HOME/.claude/hooks/guard-add-repo.sh"; [ -f "$h" ] && bash "$h"; true |
| PreToolUse | mcp__.*__(send_later|create_trigger) | h="$HOME/.claude/hooks/no-persistent-polling.sh"; [ -f "$h" ] && bash "$h" || true |
| PreToolUse | Bash | h="$HOME/.claude/hooks/npm-publish-auth.sh"; [ -f "$h" ] && bash "$h" || true |
| PreToolUse | Bash|mcp__.*__update_pull_request_branch | h="$HOME/.claude/hooks/no-update-branch.sh"; [ -f "$h" ] && bash "$h" || true |
| PreToolUse | mcp__.*__subscribe_pr_activity | h="$HOME/.claude/hooks/no-late-pr-subscribe.sh"; [ -f "$h" ] && bash "$h" || true |
| PreToolUse | Bash|mcp__.*github.*__.* | h="$HOME/.claude/hooks/pr-ownership-context.sh"; [ -f "$h" ] && sh "$h" || true |
| Stop | * | p=$(cat); [ "$(printf '%s' "$p" | jq -r '.stop_hook_active // false' 2>/dev/null)" = true ] && exit 0; h="$HOME/.claude/hooks/pr-threads-gate.sh"; { [ -f "$h" ] && printf '%s' "$p" | sh "$h"; } || printf '%s\n' '{"decision":"block","reason" |
| Stop | * | p=$(cat); h="$HOME/.claude/hooks/branch-home-gate.sh"; { [ -f "$h" ] && printf '%s' "$p" | sh "$h"; } || { if command -v jq >/dev/null 2>&1; then active=$(printf '%s' "$p" | jq -r '.stop_hook_active // false' 2>/dev/null); else active=false |
| Stop | * | h="$HOME/.claude/hooks/stop-sequence.py"; [ -f "$h" ] && python3 "$h" 2>/dev/null || true |
| Stop | * | h="$HOME/.claude/hooks/no-prose-gate.sh"; [ -f "$h" ] && sh "$h" 2>/dev/null || true |
| PostToolUse | * | h="$HOME/.claude/hooks/metrics-live.sh"; [ -f "$h" ] && bash "$h" posttooluse 0 show 2>/dev/null || true |
| PostToolUse | AskUserQuestion | h="$HOME/.claude/hooks/curia-roll.py"; [ -f "$h" ] && python3 "$h" 2>/dev/null; true |
| PostToolUse | Edit|Write|MultiEdit | h="$HOME/.claude/hooks/prose-budget-edit.sh"; [ -f "$h" ] && bash "$h" || true |
| PostToolUse | Bash|mcp__.*__(create_pull_request|merge_pull_request|update_pull_request|update_pull_request_branch|push_files|create_o | h="$HOME/.claude/hooks/measure-git-events.sh"; [ -f "$h" ] && bash "$h" 2>/dev/null || true |
| PostToolUse | Bash|mcp__.*__(create_pull_request|merge_pull_request|update_pull_request|update_pull_request_branch|push_files|create_o | h="$HOME/.claude/hooks/log-commit.sh"; [ -f "$h" ] && bash "$h" 2>/dev/null || true |
| SubagentStop | * | h="$HOME/.claude/hooks/metrics-live.sh"; [ -f "$h" ] && bash "$h" subagentstop 0 show 2>/dev/null || true |
| SubagentStop | * | h="$HOME/.claude/hooks/release-subagent-branch.sh"; [ -f "$h" ] && bash "$h" 2>/dev/null || true |
| SessionStart | * | h="$HOME/.claude/hooks/session-start-seed-refresh.sh"; [ -f "$h" ] && bash "$h" || true |
| SessionStart | * | h="$HOME/.claude/hooks/claim-stamp.sh"; [ -f "$h" ] && sh "$h" session-start || true |
| SessionStart | * | h="$HOME/.claude/hooks/session-start-continuity.sh"; [ -f "$h" ] && bash "$h" || true |
| SessionStart | * | h="$HOME/.claude/hooks/connector-budget.sh"; [ -f "$h" ] && bash "$h" || true |
| UserPromptSubmit | * | h="$HOME/.claude/hooks/metrics-live.sh"; [ -f "$h" ] && bash "$h" prompt 0 show 2>/dev/null || true |
| UserPromptSubmit | * | h="$HOME/.claude/hooks/curia-roll.py"; [ -f "$h" ] && python3 "$h" 2>/dev/null; true |
Plugins (4)
github@claude-plugins-officialsecurity-guidance@claude-plugins-officialmergify@claude-plugins-officiallanguette@languette
Permissions
deny (2)
Bash(git reset --hard:*)
Skill(mergify:mergify-stack)
ask (0)
—
allow (34)
Bash(systemctl --user list-timers *)
Bash(systemctl --user show *)
Bash(git rev-list *)
Bash(git config core.hooksPath)
Bash(git add :*)
Bash(git branch -D claude/*)
Bash(git branch -d claude/*)
Bash(git commit :*)
Bash(git fetch *)
Bash(git merge-base *)
Bash(gh-resolve-thread:*)
Bash(npm run generate:check)
Bash(npm run typecheck)
Bash(npm test)
Bash(worklist *)
Bash(gh search *)
Bash(shellcheck *)
Bash(yadm log *)
Bash(resign-branch.sh *)
Bash(~/.claude/bin/agent-decision *)
Bash(~/.claude/bin/card-id *)
Bash(~/.claude/bin/resign-branch.sh *)
Bash(~/.claude/bin/pickup-list find *)
Bash(~/.claude/bin/scoping-lock check *)
Bash(~/.claude/bin/pickup-list)
Bash(~/.claude/bin/pickup-list --all)
Bash(~/.claude/bin/pickup-list --oldest)
Bash(~/.claude/bin/pickup-list --closed)
Bash(~/.claude/bin/pickup-list show *)
Bash(~/.claude/bin/worklist)
Bash(~/.claude/bin/worklist *)
Bash(~/.claude/bin/prose-budget *)
Bash(~/.claude/bin/work-item *)
Bash(~/.claude/bin/work-item *)
Similar rigs
snaplyze/claude-orchestration
Claude Code plugin for orchestration: five specialist subagents with explicit model and effort, subscription profiles, user-scope install, and runtime verification
Pragmatist 3.2k tok ·
daGrevis/Dotfiles
Dotfiles for my UNIX workstations
Automator 129 tok ·
sparkler233/recensio
用 Git 记住项目的历史与现状:每个新会话都从同一份最新的项目状态出发。 / Project memory in Git: every new AI session starts from the same, up-to-date picture of the project.
Pragmatist 754 tok ·
ChristianBlevens/RaiGolmi
A computer you build by talking to an AI.
Pragmatist 2.7k tok ·