modules/home/programs/cli-agents/shared/skills/claude-to-agents/SKILL.md
Normalize Claude-specific project config to the generic Agent Skills convention. Merge CLAUDE.md into AGENTS.md and merge .claude/ into .agents/ as the canonical location, then create Claude compatibility symlinks back to the generic files. Use when asked to "normalize agent config", "sync agent files", "set up AGENTS.md", "make this repo work with other agents", "create generic agent config", or "claude to agents".
npx skillsauth add not-matthias/dotfiles-nix claude-to-agentsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Normalize Claude-specific project config to the generic .agents/ / AGENTS.md
convention defined by the Agent Skills spec.
The generic side is canonical:
AGENTS.md is the real project instructions file.agents/ is the real project agent-config directoryCLAUDE.md is a compatibility symlink to AGENTS.md.claude is a compatibility symlink to .agentsNever make .agents point at .claude. Always merge toward .agents, then
replace .claude with a symlink.
The .agents/skills/ path is the official cross-client interop directory
scanned by Claude Code, Cursor, Gemini CLI, Amp, VS Code Copilot, OpenCode,
Roo Code, Goose, Junie, Codex, Kiro, and many others. See
agentskills.io/clients for the full list.
.claude/ content that should become shared .agents/ content| Claude-specific | Generic canonical path | Action |
|-----------------|------------------------|--------|
| CLAUDE.md | AGENTS.md | Merge content into AGENTS.md, then symlink CLAUDE.md → AGENTS.md |
| .claude/ | .agents/ | Merge directory contents into .agents/, then symlink .claude → .agents |
| .claude/skills/ | .agents/skills/ | Merged as part of the full .claude/ directory |
| .claude/docs/ | .agents/docs/ | Merged as part of the full .claude/ directory |
| .claude/scripts/ | .agents/scripts/ | Merged as part of the full .claude/ directory |
| .claude/commands/ | .agents/commands/ | Merged as part of the full .claude/ directory |
| .claude/SCRATCHPAD.md | .agents/SCRATCHPAD.md | Merged as part of the full .claude/ directory |
| .claude/settings.json | .agents/settings.json | Merged so Claude still sees it through the .claude symlink |
| .claude/settings.local.json | .agents/settings.local.json | Preserve if present, but keep ignored |
| .claude/tmp/ | .agents/tmp/ | Usually skip unless the user explicitly asks to preserve it |
User-level paths can follow the same direction only when explicitly requested:
~/.agents/ is canonical and ~/.claude becomes a symlink to ~/.agents.
Do not normalize user-level config unless the user asks for it.
From the project root:
ls -la CLAUDE.md AGENTS.md .claude .agents 2>/dev/null
find .claude .agents -maxdepth 2 -mindepth 1 -print 2>/dev/null | sort
Classify each path:
AGENTS.mdAGENTS.md is canonical.
CLAUDE.md exists, move or copy it to AGENTS.md, then replace CLAUDE.md with ln -s AGENTS.md CLAUDE.mdAGENTS.md exists, create ln -s AGENTS.md CLAUDE.mdAGENTS.md and replace CLAUDE.md with the symlinkNever overwrite a real AGENTS.md or CLAUDE.md without checking for content
differences first.
Before copying .claude/ into .agents/, find same-path files with different
content:
mkdir -p .agents
while IFS= read -r -d '' file; do
rel="${file#./.claude/}"
rel="${rel#.claude/}"
target=".agents/$rel"
if [ ! -e "$target" ]; then
continue
fi
if cmp -s "$file" "$target"; then
continue
fi
printf 'CONFLICT %s\n' "$rel"
done < <(find .claude -type f ! -path '.claude/tmp/*' -print0 2>/dev/null)
If any conflicts appear, stop and ask the user how to merge those files. Do not
silently choose .claude or .agents content for conflicting files.
.agents/Merge all intentional .claude/ content into .agents/. Prefer rsync when
available because it handles nested directories and hidden files cleanly:
mkdir -p .agents
rsync -a --exclude 'tmp/' .claude/ .agents/
If rsync is unavailable, use Bash and cp -a after conflicts are resolved:
mkdir -p .agents
shopt -s dotglob nullglob
for item in .claude/* .claude/.[!.]* .claude/..?*; do
if [ "$(basename "$item")" = "tmp" ]; then
continue
fi
cp -a "$item" .agents/
done
Skip ephemeral cache/temp folders unless the user explicitly asks to keep them.
Preserve Claude-specific config files like settings.json because Claude will
still access them through the .claude symlink.
.claude with a symlinkAfter verifying the merge, remove or move the real .claude/ directory and
create a relative symlink to .agents:
# If .claude is tracked, remove it from the old location after copying.
git rm -r .claude 2>/dev/null || true
# If anything remains, preserve it before replacing the directory.
if [ -e .claude ] && [ ! -L .claude ]; then
backup=".claude.before-agents-$(date +%Y%m%d%H%M%S)"
mv .claude "$backup"
fi
ln -s .agents .claude
Use trash-put instead of deleting any backup when available. Keep the backup
until git diff confirms all intended files now exist under .agents/.
.gitignore if neededEnsure symlinks are tracked but local/ephemeral files are not:
# Agent config — track symlinks, ignore ephemeral/local files
.claude/tmp/
.agents/tmp/
.claude/settings.local.json
.agents/settings.local.json
Print a summary:
Normalized agent config:
AGENTS.md ← canonical file
CLAUDE.md → AGENTS.md (symlink created)
.agents/ ← canonical directory, merged from .claude/
.claude → .agents (symlink created)
.agents/tmp/ — skipped as ephemeral
CLAUDE.md -> AGENTS.md, .claude -> .agents.agents/; never merge .agents/ into .claude/.claude directory after merging, not individual subdirectories.claude/settings.json by moving it to .agents/settings.json.agents/settings.local.json ignored if local Claude settings are migrated.cursorrules and .gemini/ are out of scopedocumentation
Save notes, journal entries, and research to the personal-notes Obsidian vault (personal-vault-v2). Use when the user asks to 'save note', 'save to notes', 'write to personal notes', 'save to daily notes', 'note this down', or wants to persist findings/analysis to their personal vault.
documentation
Use whenever the user asks to address, fix, resolve, review, or respond to pull-request comments or review feedback.
development
Apply Not Matthias's Rust-first personal coding style. Use whenever the user explicitly asks to apply or review their code style, make Rust match their preferences, perform a style pass, or simplify/refactor according to their conventions. Inspect only task-touched code, honor local project conventions first, and make only safe opt-out style edits.
development
Guide for writing ast-grep rules to perform structural code search and analysis. Use when users need to search codebases using Abstract Syntax Tree (AST) patterns, find specific code structures, or perform complex code queries that go beyond simple text search. This skill should be used when users ask to search for code patterns, find specific language constructs, or locate code with particular structural characteristics.