plugins/dev-utils/skills/symlink-manager/SKILL.md
Create, audit, repair, and document cross-platform symlinks that work correctly on both Windows and macOS/Linux. Use this skill whenever the user mentions symlinks, symbolic links, junction points, .gitconfig symlinks, broken links after git pull, cross-platform path issues, or needs help with ln -s equivalents on Windows. Also trigger when the user reports that files are missing or wrong after switching between Mac and Windows machines using Git. This skill solves the common problem where symlinks committed on macOS show up as plain text files on Windows (and vice versa) because of Git's core.symlinks setting or missing Developer Mode / elevated permissions. **IMPORTANT FOR WINDOWS USERS:** Developer Mode must be enabled before creating symlinks. Without it, Git will check out symlinks as plain-text files or hardlinks, breaking cross-platform workflows.
npx skillsauth add richfrem/agent-plugins-skills symlink-managerInstall 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.
Git symlinks break across platforms because:
| Issue | macOS/Linux | Windows |
|---|---|---|
| Git setting | core.symlinks=true (default) | core.symlinks=false (default, unless Dev Mode enabled) |
| Link type | ln -s symlink | NTFS symlink or Junction Point or Hardlink |
| Permissions | Any user | Requires Developer Mode or admin elevation |
| Git behaviour | Stores as symlink object | Stores as plain text file containing the target path |
When core.symlinks=false, Git checks out a symlink as a plain text file whose contents are the target path. When you then git pull on the other machine, that text file arrives instead of a real link — silent, no error.
When core.symlinks=false and Developer Mode is disabled, symlinks can be accidentally replaced with hardlinks. Hardlinks cannot be committed as symlinks to Git, so they break the cross-platform workflow:
Solution: Always use real symlinks, never hardlinks. Enable Developer Mode on Windows first, then use /create-sym-link command to create proper symlinks that Git recognizes.
Run the diagnosis script first. It checks:
git config core.symlinks (local + global)python ./scripts/symlink_manager.py diagnose
On Windows (needs Developer Mode enabled first, or run as admin):
git config core.symlinks true
git rm --cached -r . # unstage everything
git reset --hard # re-checkout with symlinks honoured
On macOS / Linux (usually already correct):
git config --get core.symlinks # should say "true"
Add a .gitattributes line to lock symlinks in the repo:
* text=auto
*.symlink -text
For cross-platform teams: Use the Python script — it automatically handles OS differences without requiring bash, PowerShell, or .sh scripts.
Use the /create-sym-link command in Claude Code for an interactive workflow:
/create-sym-link
This prompts for source and destination paths and uses the Python symlink manager.
Or use the Python script directly (works on Windows, macOS, and Linux):
# Create a single symlink (automatically detects OS)
python ./scripts/symlink_manager.py create --src plugins/plugin-manager/scripts/plugin_installer.py --dst plugins/plugin-manager/skills/plugin-installer/scripts/plugin_installer.py
# Re-create ALL links from the manifest
python ./scripts/symlink_manager.py restore
# Audit: list broken or missing links
python ./scripts/symlink_manager.py audit
# Full diagnosis of the environment
python ./scripts/symlink_manager.py diagnose
The Python script automatically:
Critical: If symlinks were created as hardlinks or plain-text files:
rm plugins/plugin-manager/skills/*/scripts/plugin_installer.pygit config core.symlinks true/create-sym-link command or python ./scripts/symlink_manager.py create ...git add -A && git commit -m "fix: replace hardlinks with proper symlinks"If you have multiple text-file stand-ins in a folder hierarchy, use the bulk fixer:
# Scan folder, generate inventory, and fix all broken symlinks
python ./scripts/bulk_symlink_fixer.py plugins/plugin-manager/skills/maintain-plugins/scripts
The bulk fixer:
symlink_manager.py create in a loop to fix each oneCommit symlinks.json to the repo. On a fresh checkout (or after a git pull breaks links on Windows), any developer runs:
python ./scripts/symlink_manager.py restore
…and all links are recreated correctly for their platform.
git config --global core.symlinks true after enabling Developer Mode.core.symlinks=false inherited from a shared config.git config --list --show-origin | grep symlinks to see where the setting comes from.references/troubleshooting.md — Common error messages and fixesscripts/symlink_manager.py — The cross-platform Python script.agent/rules/symlink-cross-platform.md — Repository-wide symlink best practices and requirementsreferences/ADRs/. Always consult them for standards on shared scripts, cross-plugin dependencies, symlinking patterns and loose coupling to avoid repeating yourself.Read references/troubleshooting.md when the user reports specific error messages.
testing
Skill for creating and managing isolated git worktrees (`.worktrees/issue-NNN`) for issue execution branches. USE ONLY when setting up or cleaning up isolated git worktrees for specific issue execution. DO NOT USE for managing local task files (use `task-agent`) or escalating tasks to issues (use `github-issue-backlog-agent`).
data-ai
Skill for orchestrating the end-to-end GitHub issue lifecycle flow: Issue -> Worktree -> Implementation -> PR Creation -> Resolution Closure. USE ONLY when running or dry-running full lifecycle orchestration for resolving an issue with a PR. DO NOT USE for isolated worktree management only (use `issue-worktree-agent`) or logging issues (use `github-issue-agent`).
tools
Automatically ranks GitHub issues (P0-P3) based on friction tier, frequency, and blockages, synchronizing priority labels and GitHub Projects v2 custom fields.
testing
Bridge skill for escalating ephemeral local task scratchpad items (`tasks/*.md`) into durable, taxonomy-validated, evidence-rich GitHub Issues. USE ONLY when promoting a single-session local task into durable repository backlog. DO NOT USE for managing local kanban boards (use `task-agent` instead) or directly querying/commenting on issues (use `github-issue-agent` instead).