Personal configuration for Claude Code: skills and global preferences.
~/.claude/
├── CLAUDE.md # Global instructions; imports the three files below
├── writing-style.md # Prose voice and anti-AI-tell rules
├── response-shape.md # Response structure: action first, numbered steps, restated state, no estimates
├── dev-workflow.md # Commits, branches, worktrees, PRs, plan files
└── skills/
├── design-review/
│ └── SKILL.md # /design-review - visual design review
├── pr-feedback/
│ ├── SKILL.md # /pr-feedback - fetch and reply to PR comments
│ └── scripts/
│ ├── fetch-pr-comments.js
│ └── reply-pr-comments.js
└── whats-next/
└── SKILL.md # /whats-next - identify the next piece of work
Skills follow the Agent Skills open standard and the Claude Code skills spec. Each skill is a directory containing a SKILL.md with YAML frontmatter plus any supporting files. Claude reads the frontmatter at startup and may auto-invoke a skill when its description matches the request, or you can call it directly as /skill-name.
This repo previously stored workflows under commands/ and helper code under scripts/. Both have been folded into the skills layout: command bodies became SKILL.md files, and helpers live alongside the skill that uses them.
Reviews visible UI for visual design quality against universal principles. Auto-invoked when Claude detects a UI/visual review request.
Covers: spatial design (proximity, alignment, hierarchy, rhythm), color and contrast, typography, interaction and feedback, accessibility, forms, and layout responsiveness. Platform-agnostic.
Fetches and helps address GitHub PR review comments for the current branch. Marked disable-model-invocation: true since it posts replies to GitHub, so it only runs when you call it.
Checks CI first, fetches every comment with the bundled fetch-pr-comments.js script, triages by complexity, walks through fixes with worktree awareness, then bulk-replies via reply-pr-comments.js. Verifies the final comment count matches the fetched total.
Reply tone splits by author: polite and conversational with humans, clipped and factual with bots and automated reviewers (acknowledge, state the reasoning, skip the niceties). Finished conversations get marked resolved, since some repos block merge until they are; threads where the reply still needs the reviewer's response stay open.
Bundled scripts are referenced inside SKILL.md via ${CLAUDE_SKILL_DIR} so they work whether the skill is installed at the personal, project, or plugin level.
Identifies the next best piece of work to start. Auto-invoked on "what should I work on" style requests.
Checks worktree state, open PRs needing attention, incomplete plan files in project and global locations, and the project's status/tracking doc. Recommends priorities and prepares to begin work.
Fetches all PR comments and organizes them hierarchically.
# Current branch's PR (JSON output)
~/.claude/skills/pr-feedback/scripts/fetch-pr-comments.js
# Markdown output (optimized for Claude consumption)
~/.claude/skills/pr-feedback/scripts/fetch-pr-comments.js --format=markdown
# Specific PR or branch
~/.claude/skills/pr-feedback/scripts/fetch-pr-comments.js 123
~/.claude/skills/pr-feedback/scripts/fetch-pr-comments.js feature/my-branchOutput includes all reviews with their inline comments, reply threading, conversation comments, verification stats, pre-built reply API commands, and each review thread's node ID plus whether it's already resolved.
Bulk replies to PR comments, and optionally marks their threads resolved ("resolve": true, applied only after the reply posts). An entry with a threadId and no body resolves without replying.
echo '[
{"id": 12345, "body": "Fixed in abc123", "type": "inline", "resolve": true},
{"id": 67890, "body": "Good catch, updated", "type": "inline"}
]' | ~/.claude/skills/pr-feedback/scripts/reply-pr-comments.js
# Preview without posting
echo '[...]' | ~/.claude/skills/pr-feedback/scripts/reply-pr-comments.js --dry-run
# From file
~/.claude/skills/pr-feedback/scripts/reply-pr-comments.js --file replies.jsonGlobal instructions applied to every Claude Code session. CLAUDE.md itself is a thin entry point that @-imports three files: writing-style.md (prose voice, banned vocabulary, the anti-AI-tell rules), response-shape.md (structure rather than voice: lead with the action, number multi-step work, restate where we are each turn, no time estimates, when to break those rules), and dev-workflow.md (commit message preferences, branch naming, worktree isolation, PR defaults, and plan file location/naming with the requirement to verify completion before marking a plan complete).
- Git
- GitHub CLI (
gh) - Node.js (for the
pr-feedbackscripts)
This repo is not cloned into ~/.claude/. It lives at a stable path of your choosing, which differs per machine (I have several Macs and a couple of Windows boxes, each with the checkout in a different spot). ~/.claude/ then bridges into it. The bridge is the only thing that varies per machine; everything inside the repo is path-independent.
Why it travels: inside the repo, CLAUDE.md imports the other rule files with relative paths (@writing-style.md, @dev-workflow.md), which resolve next to CLAUDE.md no matter where the repo sits. So wherever you clone it, the internal chain just works. Only the single hop from ~/.claude into the repo is machine-specific.
That hop is two pieces:
- skills —
~/.claude/skillshas to point at<repo>/skillsso Claude Code discovers them. - instructions — your real
~/.claude/CLAUDE.mdstays an untracked local file (it holds your private, machine-specific stuff: git identity, test-account credentials, anything you don't want on GitHub) and adds one@importline pointing at this repo'sCLAUDE.md. That one import drags inwriting-style.mdanddev-workflow.mdtoo, via the relative chain above.
git clone git@github.com:YOUR_USERNAME/claude-config.git ~/code/claude-config
REPO=~/code/claude-config # wherever you actually cloned it
ln -s "$REPO/skills" ~/.claude/skills # skills bridge
echo "@$REPO/CLAUDE.md" >> ~/.claude/CLAUDE.md # instructions bridgeUse a directory junction for skills (no admin needed, unlike a symlink), and add the import with forward slashes so the path resolves the same way Claude Code expects:
git clone git@github.com:YOUR_USERNAME/claude-config.git C:\code\claude-config
$REPO = "C:\code\claude-config" # wherever you actually cloned it
cmd /c mklink /J "$HOME\.claude\skills" "$REPO\skills" # skills bridge (junction)
Add-Content "$HOME\.claude\CLAUDE.md" "@$($REPO -replace '\\','/')/CLAUDE.md" # instructions bridgeAdd a new top-level .md here, import it from CLAUDE.md with a relative @name.md, and it propagates to every machine on the next pull. No bridge changes, because the bridge only ever points at CLAUDE.md and skills/.
So nothing gets dropped when wiring up a new computer:
- Repo cloned to a stable path (survives reboots; not a temp dir)
-
~/.claude/skillsresolves to<repo>/skills(readlink ~/.claude/skillson Unix;dir "$HOME\.claude"shows the junction target on Windows) -
~/.claude/CLAUDE.mdexists as a real local file and contains the@<repo>/CLAUDE.mdline - Your private secrets live only in
~/.claude/CLAUDE.md, never in this repo - New
.mdrule files are imported fromCLAUDE.md, not just dropped in the directory
The .gitignore tracks skills/, CLAUDE.md, writing-style.md, response-shape.md, dev-workflow.md, specboard.md, LICENSE, and README.md only. All other Claude Code runtime files (history, settings, todos, plans, etc.) stay local.