From migration-tools
Migrate Cursor/VS Copilot configurations to Claude Code equivalents using symlinks and @imports to avoid content duplication
How this skill is triggered — by the user, by Claude, or both
Slash command
/migration-tools:migrate-to-ccThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Discover all Cursor and VS Copilot configuration files in this repository and create Claude Code equivalents that reference the originals — no content duplication.
Discover all Cursor and VS Copilot configuration files in this repository and create Claude Code equivalents that reference the originals — no content duplication.
| Source | Claude equivalent | Strategy |
|---|---|---|
AGENTS.md | CLAUDE.md | symlink (if sole source) or @import (if multiple sources) |
.cursorrules | CLAUDE.md | symlink (if sole source) or @import |
.github/copilot-instructions.md | CLAUDE.md | @import |
.cursor/rules/*.mdc | CLAUDE.md | @import with original glob as comment |
.cursor/agents/*.md | .claude/agents/<name>.md | wrapper with adapted frontmatter + @import body |
.cursor/skills/*.md | .claude/skills/<name>/SKILL.md | wrapper with adapted frontmatter + @import body |
Run all discovery commands:
! ls AGENTS.md .cursorrules .github/copilot-instructions.md 2>/dev/null ! ls .cursor/rules/.mdc 2>/dev/null || echo "(no .mdc rules)" ! ls .cursor/agents/.md 2>/dev/null || echo "(no cursor agents)" ! ls .cursor/skills/*.md 2>/dev/null || echo "(no cursor skills)"
Then check for conflicts with existing Claude Code configs:
! ls CLAUDE.md 2>/dev/null || echo "(no existing CLAUDE.md)" ! ls .claude/agents/.md 2>/dev/null || echo "(no existing claude agents)" ! ls .claude/skills//SKILL.md 2>/dev/null || echo "(no existing claude skills)"
For each discovered file:
CLAUDE.md strategy decision:
AGENTS.md, .cursorrules, .github/copilot-instructions.md, .cursor/rules/*.mdcAGENTS.md or .cursorrules: use a symlink@importsAgent model mapping (Cursor model: → Claude model:):
fast → sonnetslow or large → opusAgent background mapping:
is_background: true → background: trueShow a formatted table to the user:
## Migration Plan
| Source | Target | Strategy | Notes |
|--------|--------|----------|-------|
| AGENTS.md | CLAUDE.md | symlink | |
| .cursor/rules/domain-layer.mdc | CLAUDE.md | @import | glob: src/**/domain/**/*.ts (scope lost) |
| .cursor/agents/unit-tester.md | .claude/agents/unit-tester.md | wrapper + @import | model: fast → sonnet |
| .cursor/agents/refactorer.md | .claude/agents/refactorer.md | wrapper + @import | is_background → background: true |
Flag any:
.mdc files with empty body (frontmatter only)Ask the user to confirm before proceeding.
Symlink case (single source, AGENTS.md or .cursorrules):
! ln -s AGENTS.md CLAUDE.md
Hub file case (multiple sources):
Create CLAUDE.md with one @import per source. For .mdc rules, include a comment with the original description and globs / alwaysApply values so future readers understand the intended scope:
@AGENTS.md
<!-- Rule: {description} | Originally scoped to: {globs or "alwaysApply"} -->
@.cursor/rules/project-structure.mdc
<!-- Rule: {description} | Originally scoped to: {globs} -->
@.cursor/rules/domain-layer.mdc
Order imports: instruction files first (AGENTS.md, .cursorrules, copilot-instructions), then .mdc rules sorted by alwaysApply: true first, then alphabetically.
For each .cursor/agents/<name>.md:
name, description, model, is_backgroundname: same as Cursordescription: same as Cursormodel: apply mapping from Step 2 (omit if no mapping needed)background: true if Cursor had is_background: true (omit otherwise).claude/agents/<name>.md:---
name: <name>
description: <description>
[model: <mapped-value>]
[background: true]
---
@.cursor/agents/<name>.md
Create the .claude/agents/ directory if it does not exist.
For each .cursor/skills/<name>.md (if any exist):
name, description, and any argument-hint equivalent.claude/skills/<name>/SKILL.md with Claude-compatible frontmatter + @import:---
name: <name>
description: <description>
[argument-hint: <hint if present>]
---
@.cursor/skills/<name>.md
Create the .claude/skills/<name>/ directory if it does not exist.
List every file created or skipped, and include a short caveats section:
.mdc rules originally scoped to specific file patterns are now loaded into every Claude conversation. The original glob is preserved as a comment in CLAUDE.md for reference.tools, maxTurns, memory, effort, color, permissionMode) that may improve the agent experience — the wrappers intentionally omit them to keep defaults, but the user may want to customize them.model: values were not recognized, they were passed through as-is and may need manual correction..mdc file has no markdown body (frontmatter only), skip it and note it in the report.npx claudepluginhub cjuega/ai-plugins --plugin migration-toolsMigrates configs from Cursor, Windsurf, Copilot, Continue, Aider, Cody, Codex to Claude Code. Discovers files, trims bloat, proposes and executes clean plans.
Audits rule files, identifies source-of-truth skills, normalizes names, and generates bridges to unify Claude Code / Codex / Grok agent workspaces. Use when migrating between platforms or cleaning up a messy agent setup.
Adapts skills, agents, workflows, prompts between coding agents/IDEs like Claude Code, Cursor, Copilot preserving intent, hooks, strategy. Use `ADAPT <files>` for porting or migrating to project context.