From migration-tools
Migrate Cursor/VS Copilot configurations to Claude Code equivalents using symlinks and @imports to avoid content duplication
npx claudepluginhub cjuega/ai-plugins --plugin migration-toolsThis skill uses the workspace's default tool permissions.
Discover all Cursor and VS Copilot configuration files in this repository and create Claude Code equivalents that reference the originals — no content duplication.
Migrates configs from Cursor, Windsurf, Copilot, Continue, Aider, Cody, Codex to Claude Code. Discovers files, trims bloat, proposes and executes clean plans.
Migrates Agent projects to consistent Claude Code / Codex dual workspaces: audits rule files, identifies source-of-truth skills, unifies names, generates bridges. Use for messy or half-migrated setups.
Converts Claude Code skills to OpenAI Codex, Google Gemini CLI, Antigravity, and Cursor. Generates platform-specific files like openai.yaml, AGENTS.md and compatibility reports.
Share bugs, ideas, or general feedback.
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.