One Project, Three AI Coding Assistants, and a Skill Discovery Problem
How I built a Claude Code plugin to auto-discover SKILL.md files so the same skills work across Claude Code, Codex, and Cursor.

The AI coding assistant space is converging on a good idea. Write your project knowledge once, in a tool-agnostic format, and let every tool read it automatically. Conventions like AGENTS.md and SKILL.md make this possible. Document your patterns once, and Claude Code, OpenAI Codex, Cursor, or whatever comes next picks them up natively.
Except the adoption isn't uniform. I use all three on the same project, and I ran into a blind spot that the standards alone don't solve yet.
Writing Skills That Work Across AI Coding Assistants
In the context of AI coding assistants, a skill is a reusable set of instructions that tells the tool how to perform a specific task in your project. Think "how to add a new component," "how to create a page," or "how to handle translations." Instead of re-explaining these patterns every session, I wrote each one as a SKILL.md file inside a .agents/skills/ directory.
.agents/skills/
├── adding-component/SKILL.md
├── adding-page/SKILL.md
├── adding-store/SKILL.md
├── doing-translations/SKILL.md
└── ... (6 more)
Write the knowledge once, in a tool-agnostic format, and every AI coding assistant in the workflow benefits. That was the goal.
These conventions build on an emerging standard. The AGENTS.md convention is already being adopted across AI coding assistants as a way to document project guidelines that tools can read automatically. SKILL.md files extend this by turning each skill into a self-contained definition with YAML frontmatter describing what it does and when it should be used. The standard exists, but whether every tool honors it the same way is a different question.
How Codex and Cursor Discover Project Skills
Codex reads AGENTS.md, which references the skills in .agents/skills/. When I asked it to add a new page to the dashboard, it followed the chain, found the adding-page skill, applied the routing conventions, and placed the file in the right directory.
Cursor takes a more direct approach. It discovers SKILL.md files in the project tree on its own. When I asked it to scaffold a new component, it found the adding-component skill, read the frontmatter, and followed the conventions for naming, file placement, and exports.
Two tools, same skill files, zero extra configuration. The "write once" promise was holding up.
Why Claude Code Couldn't See the Same Skills
This is where the standard falls short. Claude Code has a powerful system where skills registered through plugins appear in the Skill tool and get invoked automatically based on context. But it only recognizes skills inside its own ecosystem, whether installed via /plugin install, bundled with a plugin, or placed in the .claude/ directory. A SKILL.md file anywhere else in your project tree is pretty much invisible.
My 10 skills, the same ones Codex and Cursor picked up seamlessly, didn't exist as far as Claude Code was concerned. When I asked it to list all available skills, it only showed plugin-based ones. The project skills weren't mentioned at all, even though AGENTS.md referenced them. Sure, I could point Claude Code at a specific file and ask it to read it, but at that point I'm doing the discovery work myself. The whole point of writing skills was to not have to re-explain things every session.
Claude Code needed a bridge between its native plugin system and the project-level skill files that the other tools already understood.
Building a Claude Code Plugin for Skill Discovery
The obvious fix would be to read every SKILL.md and inject the content into the session's context window. But that burns through tokens fast. Ten skills, each averaging 200+ lines of instructions, all loaded into every session whether they're needed or not. That's a real cost when you're paying per token, and it scales poorly as a project grows.
The fix had to make Claude Code aware of the skills without front-loading their content into the context window. That constraint led to a plugin with a single session-start hook. Every time a session begins, the hook scans the project for SKILL.md files and symlinks their parent directories into the plugin's own skills/ folder.
Here's the core of it.
# Find all SKILL.md files in the project (max depth 5)
while IFS= read -r skill_file; do
skill_files+=("$skill_file")
done < <(
find "$PROJECT_ROOT" -maxdepth 5 -name "SKILL.md" -type f \
| grep -vE "/(node_modules|\.git|dist|build)/" || true
)
# Symlink each skill directory into the plugin
for skill_file in "${skill_files[@]}"; do
skill_dir="$(dirname "$skill_file")"
skill_name="$(basename "$skill_dir")"
ln -sf "$skill_dir" "${SKILLS_DIR}/${skill_name}"
done
Once symlinked, Claude Code's native skill discovery picks them up as if they were plugin skills. Only the skill name and description appear in the session, while the full content loads on demand when a skill is actually invoked. Whether you have ten skills or fifty, the token cost at session start stays the same.
I used symlinks instead of copies so edits take effect mid-session without a restart, and added collision handling for monorepos where two skills might share a directory name (they get namespaced as apps--dashboard--adding-component vs packages--ui--adding-component).
The full source is in the GitHub repo.
Unified Skill Discovery Across Claude Code, Codex, and Cursor
All three AI coding assistants now work with the same SKILL.md files.
| Tool | How it discovers skills | Extra setup |
| Codex | Reads AGENTS.md references | None |
| Cursor | Discovers SKILL.md directly | None |
| Claude Code | Plugin symlinks at session start | One-time install |
One project convention. One set of skill files. Three tools, all on the same page.
How to Install the Claude Code Skills Loader Plugin
If you're using Claude Code alongside other AI coding assistants and want your project skills to carry across, set it up with two commands.
/plugin marketplace add thedammyking/que-claude-marketplace
/plugin install claude-skills-loader@que-claude-marketplace
Next time you start a Claude Code session in a project with SKILL.md files, they'll appear as native skills.
Note: The plugin uses symlinks and a bash hook script, so it works out of the box on macOS and Linux. On Windows, it requires WSL or a similar bash-compatible environment.
GitHub: thedammyking/que-claude-marketplace
The AGENTS.md and SKILL.md conventions are moving us toward a world where AI coding assistants share a common understanding of your project. But standards only work when every tool adopts them fully. Until that happens, the mismatches need bridges. Sometimes bridging the distance between standards and reality is just 50 lines of bash and a symlink.

