~ / rigs / mark-brannan / claude

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.

↗ GitHub ★ 0 AGPL-3.0 updated today project Claude Code
share on X
ARCHETYPE
Skill Collector
Ten-plus skills loaded on demand. A procedural-knowledge library.
CONTEXT TAX · EVERY TURN
~5.8k tokens
Moderate · median rig: 2.3k · breakdown
GUARDRAILS
3/5
Blocks destructive commands · Pre-tool screening hook · No YOLO mode · details

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)

Hooks (25)

eventmatcherruns
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
PreToolUseBashh="$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
PreToolUsemcp__claude-code-remote__add_repoh="$HOME/.claude/hooks/guard-add-repo.sh"; [ -f "$h" ] && bash "$h"; true
PreToolUsemcp__.*__(send_later|create_trigger)h="$HOME/.claude/hooks/no-persistent-polling.sh"; [ -f "$h" ] && bash "$h" || true
PreToolUseBashh="$HOME/.claude/hooks/npm-publish-auth.sh"; [ -f "$h" ] && bash "$h" || true
PreToolUseBash|mcp__.*__update_pull_request_branchh="$HOME/.claude/hooks/no-update-branch.sh"; [ -f "$h" ] && bash "$h" || true
PreToolUsemcp__.*__subscribe_pr_activityh="$HOME/.claude/hooks/no-late-pr-subscribe.sh"; [ -f "$h" ] && bash "$h" || true
PreToolUseBash|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
PostToolUseAskUserQuestionh="$HOME/.claude/hooks/curia-roll.py"; [ -f "$h" ] && python3 "$h" 2>/dev/null; true
PostToolUseEdit|Write|MultiEdith="$HOME/.claude/hooks/prose-budget-edit.sh"; [ -f "$h" ] && bash "$h" || true
PostToolUseBash|mcp__.*__(create_pull_request|merge_pull_request|update_pull_request|update_pull_request_branch|push_files|create_oh="$HOME/.claude/hooks/measure-git-events.sh"; [ -f "$h" ] && bash "$h" 2>/dev/null || true
PostToolUseBash|mcp__.*__(create_pull_request|merge_pull_request|update_pull_request|update_pull_request_branch|push_files|create_oh="$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

copied ✓