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 scopedevelopment
Emulates not-matthias's technical blog writing style. Use when writing blog posts, technical articles, README content, or any long-form technical prose. Produces investigation-driven, first-person narratives with dry humor, practical code examples, and concrete takeaways.
development
Create and manage Git worktrees for parallel feature development. Use when user wants to work on multiple features simultaneously or needs isolated development environments.
development
Systematic technical research and brainstorming. Given a question, recursively explores attached specifications, source code, documentation, GitHub repositories, and authoritative online sources to build comprehensive, accurate answers. Surfaces edge cases, caveats, and implementation details that matter.
development
Converts a research paper (PDF path, uploaded PDF, or URL) into a reusable skill that stores distilled knowledge for future sessions. Use when a user asks to "turn this paper into a skill", "make this PDF reusable", "encode this research", or wants project-specific decisions backed by a specific paper without re-uploading it.