A reusable, sanitized copy of my real Claude Code configuration: one self-contained CLAUDE.md, a settings.json that wires seven enforcement and context hooks, a status-line wrapper, four skills, four slash commands, and the scripts behind them. It targets Claude Code first; a short section near the end explains how to reuse the same CLAUDE.md with Codex, OpenCode, and Gemini CLI.
Gists have no subdirectories, so install paths are flattened with a double underscore: hooks__enforce-worktree.sh installs as hooks/enforce-worktree.sh, skills__pr__SKILL.md as skills/pr/SKILL.md, and so on. The install commands below handle the mapping.
Versions are declared as # Version: X.Y.Z on line 2 of shell files and <!-- Version: X.Y.Z --> at the top of markdown files (after frontmatter when present). settings.json and allowed-paths carry no inline version; this table is their only tracker.
| Asset | Version | What it is |
|---|---|---|
CLAUDE.md |
4.2.0 | The single self-contained agent file: language rules, git policy, model routing, worktrees, filesystem policy, secret handling |
snippets__identity.md |
1.0.0 | Personal vs professional identity, @-imported by CLAUDE.md |
settings.json |
(table only) | Hook wiring, permissions, autoMode, plugins, status line |
allowed-paths |
(table only) | Global path grants for the file-op enforcement hook |
hooks__enforce-worktree.sh |
1.0.0 | PreToolUse Edit|Write: warns (non-blocking) when a project file is edited outside a .worktrees/ checkout |
hooks__enforce-allowed-paths.sh |
1.0.1 | PreToolUse Read|Write|Edit|NotebookEdit: allowlist on file ops, asks on violations |
hooks__lib__allowed-paths-common.sh |
1.1.0 | Shared allowlist logic and grant-file parsing for the hook above |
hooks__backup-claude-config.sh |
1.0.0 | PreToolUse Edit|Write|NotebookEdit: snapshots any ~/.claude file before it is overwritten, with retention pruning |
hooks__delegation-nudge.sh |
1.0.0 | PreToolUse Grep|Glob|Read|Bash: counts inline read/search calls in the main loop and periodically nudges it to delegate to a subagent |
hooks__delegation-router.py |
1.0.0 | UserPromptSubmit: classifies each prompt and injects a routing directive, or asks for the cheap-orchestration skill on heavy work |
hooks__karpathy-guidelines.sh |
1.0.0 | SessionStart: injects a behavioural guidelines document into every session, weekly refresh from upstream |
hooks__session-git-platform.sh |
1.0.0 | SessionStart: exports the detected git platform into session context so the model never runs git remote -v |
scripts__git-platform-detect.sh |
1.0.0 | Detects github/gitlab/forgejo/gitea/unknown from the origin remote; has a CUSTOM_HOSTS list for self-hosted instances |
scripts__notify.sh |
2.0.0 | notify shell function: desktop notifications with terminal detection, alerter backend on macOS for replies and buttons |
hud__statusline-wrapper.sh |
1.2.0 | Status line: OMC HUD on line 1 (post-processed), colored pwd and git info on line 2 |
hud__reposition.pl |
1.0.0 | Perl helper the wrapper uses to right-align HUD segments; the wrapper degrades gracefully without it |
statusline-command.sh |
1.0.0 | Standalone fallback status line, no OMC needed |
commands__worktree-start.md |
1.0.2 | /worktree-start: create an isolated worktree with per-repo init steps |
commands__worktree-finish.md |
1.0.1 | /worktree-finish: merge the worktree branch back and clean up |
commands__ntfy.md |
1.0.0 | /ntfy: publish one ntfy push notification |
commands__ntfy-sub.md |
1.0.0 | /ntfy-sub: start/stop/report a background ntfy topic listener |
skills__pr__SKILL.md |
2.1.0 | /pr: commit, push, open a PR on the detected platform, optional auto-merge |
skills__fj__SKILL.md |
1.0.0 | fj (Forgejo CLI) cheatsheet |
skills__cheap-orchestration__SKILL.md |
1.0.0 | Routing matrix, fan-out patterns, and return contracts for delegating work to cheap subagents |
skills__ntfy__SKILL.md |
1.0.1 | Desktop vs phone-push channel choice, priority floor, title convention, listener trust model |
docs__filesystem-policy.md |
1.0.0 | Reference behind the CLAUDE.md filesystem policy: grant-file format, search locations, enforcement blind spots |
docs__shared-checkout-lock.md |
1.0.0 | The .agent.lock protocol for editing a shared checkout instead of a worktree |
guidelines__karpathy.md |
1.0.0 | Seed cache for the karpathy hook (see notes: not a hard dependency) |
Everything here targets Claude Code. The optional pieces you can simply skip: the HUD wrapper and its perl helper (only useful with oh-my-claudecode), the ntfy stack (skill plus two commands, needs a ntfy server), and the karpathy guidelines hook. If all you want is CLAUDE.md plus the enforcement hooks, install CLAUDE.md, snippets/identity.md, settings.json, allowed-paths, the hooks/ files, and the two docs/ files, then remove the statusLine key and the karpathy hook entry from settings.json.
The template ships with placeholders on purpose. Until you edit these, several pieces are inert or wrong:
~/.claude/snippets/identity.md: every value is a placeholder (Your Name,yourhandle,you@personal.example,Acme). Replace both sections with your own identities and the triggers that tell them apart.~/.claude/allowed-paths: ships as comments only. Uncomment or add the directories you actually work in (~/projects,~/Documents/code, ...).~/.claude/hooks/enforce-allowed-paths.sh: the hostname guard[ "$(hostname -s)" = "my-workstation" ]disables enforcement on every other machine. Set your own hostname, or delete the line to enforce everywhere.CLAUDE.mdLanguage section: the chat language and tone areCUSTOMIZEplaceholders. The Platform Tools section also wants your own self-hosted git hosts listed.~/.claude/scripts/git-platform-detect.sh: edit theCUSTOM_HOSTSarray with your self-hosted GitLab/Forgejo/Gitea instances.- ntfy stack (if you keep it): replace
ntfy.example.comand the topic/envchainnamespace placeholders inskills/ntfy/SKILL.md, and create~/.claude/ntfy-trust.jsonbefore arming any listener. settings.json: search forCUSTOMIZE. TheautoModeblock references a generic Kubernetes context (admin@my-cluster) and a generic jumphost (jumphost.example.com); replace or remove them.
Required: Claude Code CLI, jq, curl, git, unzip, python3 (two hooks parse JSON with it).
Optional, per feature:
- Node.js 18+ for the plugins (oh-my-claudecode and friends)
- A Nerd Font in your terminal for the HUD glyphs
perlfor the HUD post-processing andhud/reposition.pl. Without it line 1 renders raw (OMC version tag and session segments left in, no right-alignment); line 2 is unaffectedgh,glab,fjdepending on which git hosts you usealerteron macOS for actionable desktop notifications (notify --reply,--actions)- For the phone-push stack: a ntfy server (self-hosted or ntfy.sh), the
ntfyCLI client on your PATH (the skill shells out tontfy publish), andenvchainto hold the token
You can point a coding agent at this gist and let it run the install. Two things it will get wrong unless you tell it otherwise.
The install commands overwrite. Every curl -o below clobbers its target. On a machine that already has a ~/.claude, that silently drops existing hooks, permissions and imports. Back up first:
cp -a ~/.claude "$HOME/.claude.bak.$(date +%Y%m%d-%H%M%S)"settings.json, CLAUDE.md and allowed-paths are the three files where a blind overwrite actually costs you something; merge those by hand if you have a config worth keeping. The hooks, scripts, commands and skills are additive and safe to drop in.
Seven values the agent cannot infer. Ask for them before installing, not after:
- Name and email for
snippets/identity.md, personal and professional - The hostname of the machine where path enforcement should be active
- The directories to grant in
allowed-paths - The chat language and tone for the
CLAUDE.mdLanguage section - Self-hosted git hosts and their platform, for
CUSTOM_HOSTSinscripts/git-platform-detect.sh - ntfy server and topic, if the notification stack is being kept
- Which optional plugins to install, if any
Until 1 and 2 are answered the template does nothing useful: the identity snippet still reads Your Name, and the allowed-paths hook is a no-op on every machine whose hostname is not my-workstation.
Settings are read at session start, so restart Claude Code once the install is done. Nothing written to settings.json takes effect in the session that wrote it.
CLAUDE_DIR="$HOME/.claude"
GIST_URL="https://gist.githubusercontent.com/obeone/40e576f2db145a3ec1c100ee46b1a6bb/raw"mkdir -p "$CLAUDE_DIR"/{commands,docs,guidelines,hooks/lib,hud,scripts,snippets,worktree-configs} \
"$CLAUDE_DIR"/skills/{pr,fj,ntfy,cheap-orchestration}
# Agent file + identity
curl -sL "$GIST_URL/CLAUDE.md" -o "$CLAUDE_DIR/CLAUDE.md"
curl -sL "$GIST_URL/snippets__identity.md" -o "$CLAUDE_DIR/snippets/identity.md"
# Settings + path grants
curl -sL "$GIST_URL/settings.json" -o "$CLAUDE_DIR/settings.json"
curl -sL "$GIST_URL/allowed-paths" -o "$CLAUDE_DIR/allowed-paths"
# Status line
curl -sL "$GIST_URL/statusline-command.sh" -o "$CLAUDE_DIR/statusline-command.sh"
curl -sL "$GIST_URL/hud__statusline-wrapper.sh" -o "$CLAUDE_DIR/hud/statusline-wrapper.sh"
curl -sL "$GIST_URL/hud__reposition.pl" -o "$CLAUDE_DIR/hud/reposition.pl"
# Slash commands
curl -sL "$GIST_URL/commands__worktree-start.md" -o "$CLAUDE_DIR/commands/worktree-start.md"
curl -sL "$GIST_URL/commands__worktree-finish.md" -o "$CLAUDE_DIR/commands/worktree-finish.md"
curl -sL "$GIST_URL/commands__ntfy.md" -o "$CLAUDE_DIR/commands/ntfy.md"
curl -sL "$GIST_URL/commands__ntfy-sub.md" -o "$CLAUDE_DIR/commands/ntfy-sub.md"
# Hooks
curl -sL "$GIST_URL/hooks__enforce-worktree.sh" -o "$CLAUDE_DIR/hooks/enforce-worktree.sh"
curl -sL "$GIST_URL/hooks__enforce-allowed-paths.sh" -o "$CLAUDE_DIR/hooks/enforce-allowed-paths.sh"
curl -sL "$GIST_URL/hooks__lib__allowed-paths-common.sh" -o "$CLAUDE_DIR/hooks/lib/allowed-paths-common.sh"
curl -sL "$GIST_URL/hooks__backup-claude-config.sh" -o "$CLAUDE_DIR/hooks/backup-claude-config.sh"
curl -sL "$GIST_URL/hooks__delegation-nudge.sh" -o "$CLAUDE_DIR/hooks/delegation-nudge.sh"
curl -sL "$GIST_URL/hooks__delegation-router.py" -o "$CLAUDE_DIR/hooks/delegation-router.py"
curl -sL "$GIST_URL/hooks__karpathy-guidelines.sh" -o "$CLAUDE_DIR/hooks/karpathy-guidelines.sh"
curl -sL "$GIST_URL/hooks__session-git-platform.sh" -o "$CLAUDE_DIR/hooks/session-git-platform.sh"
# Scripts
curl -sL "$GIST_URL/scripts__git-platform-detect.sh" -o "$CLAUDE_DIR/scripts/git-platform-detect.sh"
curl -sL "$GIST_URL/scripts__notify.sh" -o "$CLAUDE_DIR/scripts/notify.sh"
# Skills
curl -sL "$GIST_URL/skills__pr__SKILL.md" -o "$CLAUDE_DIR/skills/pr/SKILL.md"
curl -sL "$GIST_URL/skills__fj__SKILL.md" -o "$CLAUDE_DIR/skills/fj/SKILL.md"
curl -sL "$GIST_URL/skills__ntfy__SKILL.md" -o "$CLAUDE_DIR/skills/ntfy/SKILL.md"
curl -sL "$GIST_URL/skills__cheap-orchestration__SKILL.md" -o "$CLAUDE_DIR/skills/cheap-orchestration/SKILL.md"
# Reference docs + guidelines seed
curl -sL "$GIST_URL/docs__filesystem-policy.md" -o "$CLAUDE_DIR/docs/filesystem-policy.md"
curl -sL "$GIST_URL/docs__shared-checkout-lock.md" -o "$CLAUDE_DIR/docs/shared-checkout-lock.md"
curl -sL "$GIST_URL/guidelines__karpathy.md" -o "$CLAUDE_DIR/guidelines/karpathy.md"
chmod +x "$CLAUDE_DIR/statusline-command.sh" \
"$CLAUDE_DIR/hud/statusline-wrapper.sh" \
"$CLAUDE_DIR/hooks"/*.sh \
"$CLAUDE_DIR/hooks/lib"/*.sh \
"$CLAUDE_DIR/scripts"/*.shTo enable the notify shell function in your normal terminal:
echo 'source ~/.claude/scripts/notify.sh' >> ~/.zshrc # or ~/.bashrcGo through the customize section now, before starting a session. Identity and allowed-paths first.
Skill archives from my claude-skills releases (latest is v2026.08.2, four assets), plus a markdownlint-compliance skill:
SKILLS_DIR="$HOME/.claude/skills"
for url in \
"https://github.com/obeone/claude-skills/releases/latest/download/apple-shortcuts.skill" \
"https://github.com/obeone/claude-skills/releases/latest/download/automode-config.skill" \
"https://github.com/obeone/claude-skills/releases/latest/download/dockerfile-best-practices.skill" \
"https://github.com/obeone/claude-skills/releases/latest/download/helm-bjw-s-chart.skill" \
"https://github.com/RedondoK/claude-md-skill/releases/latest/download/markdown.zip"; do
tmp=$(mktemp /tmp/skill-XXXXXX.zip)
curl -sL "$url" -o "$tmp"
unzip -qo "$tmp" -d "$SKILLS_DIR"
rm -f "$tmp"
doneThese are what I run today. They are independent of the template and of each other; install only what interests you rather than pasting the whole block.
# Official marketplace
for plugin in security-guidance context7; do
claude plugin install "${plugin}@claude-plugins-official"
done
# oh-my-claudecode (orchestration; the marketplace is named "omc")
claude plugin marketplace add https://github.com/Yeachan-Heo/oh-my-claudecode.git
claude plugin install oh-my-claudecode@omc
# Others, one marketplace each
claude plugin marketplace add mksglu/context-mode
claude plugin install context-mode@context-mode
claude plugin marketplace add openai/codex-plugin-cc
claude plugin install codex@openai-codex
settings.json declares five plugins, all enabled. Anything you do not want, drop from enabledPlugins and skip its marketplace add line above.
If you installed oh-my-claudecode, start a Claude Code session and run setup omc to finalize: it injects its managed block into CLAUDE.md, wires its own hooks, and provides the HUD renderer the status-line wrapper calls.
glab auth login --hostname <your-gitlab> for GitLab (never put GITLAB_TOKEN in env: it overrides the stored glab token and breaks auth). fj auth login for Forgejo; the fj skill gives Claude the cheatsheet.
Seven hooks, all pointing at ${CLAUDE_CONFIG_DIR:-$HOME/.claude}:
| Event | Matcher | Hook |
|---|---|---|
| PreToolUse | Edit|Write|NotebookEdit |
hooks/backup-claude-config.sh |
| PreToolUse | Edit|Write |
hooks/enforce-worktree.sh |
| PreToolUse | Read|Write|Edit|NotebookEdit |
hooks/enforce-allowed-paths.sh |
| PreToolUse | Grep|Glob|Read|Bash |
hooks/delegation-nudge.sh |
| UserPromptSubmit | (all) | hooks/delegation-router.py |
| SessionStart | (all) | hooks/karpathy-guidelines.sh |
| SessionStart | (all) | hooks/session-git-platform.sh |
Plus statusLine (type command) pointing at hud/statusline-wrapper.sh. File-op path enforcement is the enforce-allowed-paths.sh hook; Bash-side enforcement of the same policy is done by the classifier via autoMode.hard_deny in settings.json. docs/filesystem-policy.md documents both layers and their blind spots.
permissions.allow ships empty on purpose: allowlists are personal. Generate your own with the /fewer-permission-prompts command, and use the automode-config skill (in the external-skills step) to author project-level autoMode blocks.
- Everything oh-my-claudecode manages itself: its
.mjshooks, the HUD core (hud/omc-hud.mjs,hud/find-node.sh, both called by the status-line wrapper), its skills, and the managed<!-- OMC:START -->block it injects intoCLAUDE.mdat setup time. Same for CodeGraph's managed block. Let each tool write its own; pasting one by hand gives you a duplicate that drifts. - Third-party hook integrations I run locally were stripped from
settings.jsonon purpose; what remains is exactly the seven hooks above. - The ntfy skill's satellite files:
references/(publishing.md, listening.md, quick-replies.md, trust.md) andscripts/(ntfy-listen.sh, ntfy-buffer.py) are not published. The shippedSKILL.mdsays so itself and summarizes the load-bearing rules; your install is not broken, the links inside it just have no target. - The cheap-orchestration skill's satellite files:
references/(routing-matrix.md, fanout-patterns.md, context-hygiene.md) andscripts/test-classifier.pyare not published. The shippedSKILL.mdcarries the load-bearing rules from all of them and says so; the reference links inside it just have no target. The hook that triggers the skill is shipped. guidelines/karpathy.mdis a seed, not a dependency: the karpathy hook fetches the current version from GitHub on first run and refreshes weekly. The shipped copy only matters if that first fetch fails. State files live next to it under~/.claude/guidelines/(.karpathy-checked,.karpathy-refresh.log,.karpathy-last.diff) if you ever need to debug a stale cache.
CLAUDE.md is deliberately written so most of it (language rules, git policy, delegation discipline, filesystem policy, secret handling) applies to any coding agent. To port it:
mkdir -p ~/.codex/snippets # or ~/.opencode, ~/.gemini
cp ~/.claude/CLAUDE.md ~/.codex/AGENTS.md # Codex
cp ~/.claude/CLAUDE.md ~/.opencode/AGENTS.md # OpenCode
cp ~/.claude/CLAUDE.md ~/.gemini/GEMINI.md # Gemini CLI
cp ~/.claude/snippets/identity.md <config-dir>/snippets/identity.mdKeep snippets/identity.md alongside (the @ import expects it), and fix the import path if the agent resolves it differently. Drop the Claude-only assets: settings.json, the hooks, the HUD, and the slash commands are Claude Code mechanisms. The pr and fj skills use the portable SKILL.md format and can move to the agent's skills directory if it supports them.
After install, start a Claude Code session and check:
CLAUDE.mdis loaded and the@snippets/identity.mdimport resolves (your name/email appear in context, not the template placeholders)./helplists/worktree-start,/worktree-finish,/ntfy,/ntfy-sub.- Session start mentions the git platform when you open a session inside a repo with a remote.
- Edit any file under
~/.claudeand check a snapshot appeared under~/.claude/.backups/. - On the machine whose hostname you set in
enforce-allowed-paths.sh: touching a file outside the project,~/.claude, and yourallowed-pathsgrants triggers a confirmation prompt. ~/.claude/guidelines/gained the refresh state files after the first session (the hook fetched or used the seed).notify "Test" "Hello"from a fresh shell pops a desktop notification.- Status line: line 2 (pwd + git info) renders immediately; line 1 stays empty until oh-my-claudecode is installed and
setup omchas run. Without OMC, pointstatusLineatstatusline-command.shinstead.
Same result as the steps above, in one script:
#!/usr/bin/env bash
set -euo pipefail
CLAUDE_DIR="$HOME/.claude"
SKILLS_DIR="$CLAUDE_DIR/skills"
GIST_URL="https://gist.githubusercontent.com/obeone/40e576f2db145a3ec1c100ee46b1a6bb/raw"
mkdir -p "$CLAUDE_DIR"/{commands,docs,guidelines,hooks/lib,hud,scripts,snippets,worktree-configs} \
"$SKILLS_DIR"/{pr,fj,ntfy,cheap-orchestration}
curl -sL "$GIST_URL/CLAUDE.md" -o "$CLAUDE_DIR/CLAUDE.md"
curl -sL "$GIST_URL/snippets__identity.md" -o "$CLAUDE_DIR/snippets/identity.md"
curl -sL "$GIST_URL/settings.json" -o "$CLAUDE_DIR/settings.json"
curl -sL "$GIST_URL/allowed-paths" -o "$CLAUDE_DIR/allowed-paths"
curl -sL "$GIST_URL/statusline-command.sh" -o "$CLAUDE_DIR/statusline-command.sh"
curl -sL "$GIST_URL/hud__statusline-wrapper.sh" -o "$CLAUDE_DIR/hud/statusline-wrapper.sh"
curl -sL "$GIST_URL/hud__reposition.pl" -o "$CLAUDE_DIR/hud/reposition.pl"
curl -sL "$GIST_URL/commands__worktree-start.md" -o "$CLAUDE_DIR/commands/worktree-start.md"
curl -sL "$GIST_URL/commands__worktree-finish.md" -o "$CLAUDE_DIR/commands/worktree-finish.md"
curl -sL "$GIST_URL/commands__ntfy.md" -o "$CLAUDE_DIR/commands/ntfy.md"
curl -sL "$GIST_URL/commands__ntfy-sub.md" -o "$CLAUDE_DIR/commands/ntfy-sub.md"
curl -sL "$GIST_URL/hooks__enforce-worktree.sh" -o "$CLAUDE_DIR/hooks/enforce-worktree.sh"
curl -sL "$GIST_URL/hooks__enforce-allowed-paths.sh" -o "$CLAUDE_DIR/hooks/enforce-allowed-paths.sh"
curl -sL "$GIST_URL/hooks__lib__allowed-paths-common.sh" -o "$CLAUDE_DIR/hooks/lib/allowed-paths-common.sh"
curl -sL "$GIST_URL/hooks__backup-claude-config.sh" -o "$CLAUDE_DIR/hooks/backup-claude-config.sh"
curl -sL "$GIST_URL/hooks__delegation-nudge.sh" -o "$CLAUDE_DIR/hooks/delegation-nudge.sh"
curl -sL "$GIST_URL/hooks__delegation-router.py" -o "$CLAUDE_DIR/hooks/delegation-router.py"
curl -sL "$GIST_URL/hooks__karpathy-guidelines.sh" -o "$CLAUDE_DIR/hooks/karpathy-guidelines.sh"
curl -sL "$GIST_URL/hooks__session-git-platform.sh" -o "$CLAUDE_DIR/hooks/session-git-platform.sh"
curl -sL "$GIST_URL/scripts__git-platform-detect.sh" -o "$CLAUDE_DIR/scripts/git-platform-detect.sh"
curl -sL "$GIST_URL/scripts__notify.sh" -o "$CLAUDE_DIR/scripts/notify.sh"
curl -sL "$GIST_URL/skills__pr__SKILL.md" -o "$SKILLS_DIR/pr/SKILL.md"
curl -sL "$GIST_URL/skills__fj__SKILL.md" -o "$SKILLS_DIR/fj/SKILL.md"
curl -sL "$GIST_URL/skills__ntfy__SKILL.md" -o "$SKILLS_DIR/ntfy/SKILL.md"
curl -sL "$GIST_URL/skills__cheap-orchestration__SKILL.md" -o "$SKILLS_DIR/cheap-orchestration/SKILL.md"
curl -sL "$GIST_URL/docs__filesystem-policy.md" -o "$CLAUDE_DIR/docs/filesystem-policy.md"
curl -sL "$GIST_URL/docs__shared-checkout-lock.md" -o "$CLAUDE_DIR/docs/shared-checkout-lock.md"
curl -sL "$GIST_URL/guidelines__karpathy.md" -o "$CLAUDE_DIR/guidelines/karpathy.md"
chmod +x "$CLAUDE_DIR/statusline-command.sh" \
"$CLAUDE_DIR/hud/statusline-wrapper.sh" \
"$CLAUDE_DIR/hooks"/*.sh \
"$CLAUDE_DIR/hooks/lib"/*.sh \
"$CLAUDE_DIR/scripts"/*.sh
# --- External skills (optional) ---
for url in \
"https://github.com/obeone/claude-skills/releases/latest/download/apple-shortcuts.skill" \
"https://github.com/obeone/claude-skills/releases/latest/download/automode-config.skill" \
"https://github.com/obeone/claude-skills/releases/latest/download/dockerfile-best-practices.skill" \
"https://github.com/obeone/claude-skills/releases/latest/download/helm-bjw-s-chart.skill" \
"https://github.com/RedondoK/claude-md-skill/releases/latest/download/markdown.zip"; do
tmp=$(mktemp /tmp/skill-XXXXXX.zip)
curl -sL "$url" -o "$tmp"
unzip -qo "$tmp" -d "$SKILLS_DIR"
rm -f "$tmp"
done
# --- Plugins (optional; trim to taste) ---
for plugin in security-guidance context7; do
claude plugin install "${plugin}@claude-plugins-official"
done
claude plugin marketplace add https://github.com/Yeachan-Heo/oh-my-claudecode.git
claude plugin install oh-my-claudecode@omc
claude plugin marketplace add mksglu/context-mode
claude plugin install context-mode@context-mode
claude plugin marketplace add openai/codex-plugin-cc
claude plugin install codex@openai-codex
cat <<'EOF'
Installation done. Next steps:
1. Edit ~/.claude/snippets/identity.md (replace template name/email with yours).
2. Edit ~/.claude/allowed-paths to add the directories you actually use.
3. Edit ~/.claude/hooks/enforce-allowed-paths.sh: replace "my-workstation"
with your hostname (or remove the guard).
4. Fill in the CUSTOMIZE placeholders in CLAUDE.md (Language section) and
settings.json, and the CUSTOM_HOSTS list in scripts/git-platform-detect.sh.
5. Append `source ~/.claude/scripts/notify.sh` to your ~/.zshrc or ~/.bashrc.
6. If you installed oh-my-claudecode: start a session and run `setup omc`.
EOF- New: the
cheap-orchestrationskill and itshooks/delegation-router.pyhook, which turn the Rule #0 delegation policy inCLAUDE.mdfrom a principle into something that actually fires. The hook classifies every prompt and injects a routing directive; the skill holds the task-to-agent-to-model matrix, the fan-out patterns, and the return contracts. It is the firstUserPromptSubmithook in this config, and the first Python one.CLAUDE.mdgoes to 4.2.0 for the matching skills entry. AGENTS.mdis gone: everything was folded into a single self-containedCLAUDE.md(4.1.0). The template now leads with Claude Code; other agents get the porting section above instead of parallel install paths.- New, first publication: the backup, delegation-nudge, karpathy-guidelines, and session-git-platform hooks;
scripts/git-platform-detect.sh; the twodocs/references; the ntfy skill and its/ntfyand/ntfy-subcommands;hud/reposition.pl; the karpathy guidelines seed. - Retired:
scripts/telegram-pending.sh(the Telegram idle-notification path was replaced by ntfy),commands/tts-duet-setup.md, andscripts/glab-ci-follow.sh(both too niche to publish). - The plugin list was refreshed to what I actually run, and the external-skills loop now matches the current claude-skills release assets.
This gist has a private counterpart: the same 25 assets at the same version numbers, with my own values filled in where this one carries placeholders. It is not linked from here and is not shared. It matters to you only in one way: the two are kept in sync, so if you open an issue or send me a fix, expect the version numbers here to move together with a change you cannot see. The only intended differences between the two are the filled-in values and the README.
Grégoire Compagnon (obeone) — obeone@obeone.org