diff --git a/.agents/skills/git-pr/SKILL.md b/.agents/skills/git-pr/SKILL.md
index d56be0f..b6df183 100644
--- a/.agents/skills/git-pr/SKILL.md
+++ b/.agents/skills/git-pr/SKILL.md
@@ -24,8 +24,12 @@ Review current branch changes and autonomously create a PR as draft.
If a `--path
` argument is provided (e.g. invoked as `git-pr --path /tmp/feat-foo`), all git and gh commands must be run inside that directory by prepending `cd &&` to every Bash command. This overrides the current working directory.
1. Run `git log --oneline main..HEAD` and `git diff main...HEAD` to understand the changes
-2. If a PR template exists in the project, follow it
-3. Autonomously decide the PR title and body, then create it with `gh pr create --draft`
+2. **Granularity check**: Before writing the PR, assess whether the changes belong to a single concern:
+ - Group changed files by what they do (feature, test, config, infra, docs, etc.)
+ - If changes span 2+ unrelated concerns (e.g. a feature AND an infra fix), stop and tell the user which concerns were identified and suggest splitting into separate PRs. Do not create the PR until the user confirms to proceed as-is or asks you to split.
+ - A PR is appropriately sized if a reviewer can understand it in one sitting. More than ~400 changed lines or 3+ unrelated concerns is a signal to split.
+3. If a PR template exists in the project, follow it
+4. Autonomously decide the PR title and body, then create it with `gh pr create --draft`
## PR Format (if no template exists)
diff --git a/.cursor/skills b/.cursor/skills
new file mode 120000
index 0000000..2b7a412
--- /dev/null
+++ b/.cursor/skills
@@ -0,0 +1 @@
+../.agents/skills
\ No newline at end of file
diff --git a/install.sh b/install.sh
index cf5c6c4..dad1282 100755
--- a/install.sh
+++ b/install.sh
@@ -47,6 +47,7 @@ mkdir -p ~/.local/share/sheldon
mkdir -p ~/.cursor
mkdir -p ~/.claude
mkdir -p ~/.codex
+mkdir -p ~/.agents
# Symlink home directory files
ln -sfn "$DOTFILES_DIR/.gitconfig" ~/.gitconfig
@@ -60,14 +61,13 @@ ln -sfn "$DOTFILES_DIR/.cursor/commands" ~/.cursor/commands
ln -sfn "$DOTFILES_DIR/.cursor/rules" ~/.cursor/rules
ln -sfn "$DOTFILES_DIR/.cursor/skills" ~/.cursor/skills
-# Symlink .claude files
+# Symlink skills for each agent
+# Claude Code: ~/.claude/skills
ln -sfn "$DOTFILES_DIR/.claude/skills" ~/.claude/skills
-
-# Symlink .codex skills individually (cannot symlink the whole dir as ~/.codex is managed by Codex)
-for skill_dir in "$DOTFILES_DIR/.agents/skills"/*/; do
- skill_name=$(basename "$skill_dir")
- ln -sfn "$skill_dir" ~/.codex/skills/"$skill_name"
-done
+# Codex: ~/.agents/skills (user-level global path per https://developers.openai.com/codex/skills)
+ln -sfn "$DOTFILES_DIR/.agents/skills" ~/.agents/skills
+# Cursor: ~/.cursor/skills (user-level global path per https://cursor.com/docs/skills)
+ln -sfn "$DOTFILES_DIR/.cursor/skills" ~/.cursor/skills
# Symlink .config subdirectories
ln -sfn "$DOTFILES_DIR/mise/config.toml" ~/.config/mise/config.toml