Migrate cursor
Config-driven SDLC skills for coding agents: task flow, releases, debugging, and security triage.
npx -y skills add vecten/sdlc-toolkit --skill migrate-cursorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Migrate workspace configuration, local skills, and rules from Cursor to Claude Code. Two-phase workflow: export in Cursor, import in Claude Code. Use when the user says "migrate cursor", "migrate from cursor", "import cursor config", "export cursor skills", or "switch to claude code".
SKILL.md
7.7 KB, as published. Nobody here has run it
Migrate Cursor
Migrate workspace skills, rules, and configuration from a Cursor setup to Claude Code. This skill runs in two phases:
- Export (run in Cursor) — scans
.cursor/for local skills, rules, and config, then writes a portable.cursor-export.mdfile. - Import (run in Claude Code) — reads the export file (or
.cursor/directly), creates.claude/, and recreates all artifacts in Claude Code format.
Config dependency
This skill works without skills-config.yaml — it is designed to run before config exists in the target environment.
If skills-config.yaml exists in .cursor/, it will be migrated to .claude/.
Guardrails
- Never delete or modify any files in
.cursor/— this is a non-destructive migration. - Never overwrite existing files in
.claude/orCLAUDE.mdwithout explicit user confirmation. - Always show the user what will be created before writing.
- If
.cursor-export.mdalready exists, ask before overwriting.
Required Inputs
- Phase: Detect automatically based on context, or accept an explicit "export" / "import" instruction from the user.
Workflow
Step 1 — Detect phase
Check the workspace for:
ls .cursor/skills/*.skill 2>/dev/null
ls .cursor-export.md 2>/dev/null
ls .claude/ 2>/dev/null
Determine which phase to run:
| Condition | Phase |
|---|---|
.cursor/skills/*.skill files exist | Export (Step 2) |
.cursor-export.md exists | Import (Step 5) |
.cursor/ exists but no .skill files | Direct import (Step 5, reading from .cursor/ directly) |
Neither .cursor/ nor .cursor-export.md exist | Nothing to migrate — tell the user |
If the user explicitly says "export" or "import", follow their instruction regardless of auto-detection.
Export Phase (Steps 2–4)
Run this phase in Cursor to extract all local artifacts into a portable file.
Step 2 — Extract local Cursor skills
For each .skill file in .cursor/skills/:
- The
.skillformat is a ZIP archive containing aSKILL.mdand optionalreferences/files. Extract the SKILL.md:
unzip -p "<name>.skill" "*/SKILL.md"
- List all files in the archive to find references:
unzip -l "<name>.skill"
-
For each reference file found, extract its content with
unzip -p. -
If extraction fails (corrupted or unsupported format), note the filename and skip it with a warning.
Step 3 — Read rules and config
- Read all
.cursor/rules/*.mdcfiles. For each, capture:- Frontmatter fields:
description,alwaysApply,globs(if present) - The markdown body (everything after the closing
---)
- Frontmatter fields:
- Read
.cursor/skills-config.yamlif it exists. - Read
.cursor/settings.jsonfor reference (note which plugins are enabled).
Step 4 — Write the export file
Combine everything into .cursor-export.md at the workspace root. Use the following structure so the import phase can parse it reliably:
# Cursor Export
Generated by sdlc-toolkit migrate-cursor on <YYYY-MM-DD>.
---
## Skills
### <skill-name>
<full SKILL.md content>
#### References
##### <reference-filename>
<reference file content>
---
[repeat for each skill]
## Rules
### <rule-filename>
| Field | Value |
|-------|-------|
| Description | <from frontmatter> |
| Always apply | <yes/no> |
| Globs | <glob pattern or "none"> |
<rule markdown body>
---
[repeat for each rule]
## Config
```yaml
<full skills-config.yaml content>
```
## Settings
```json
<full settings.json content>
```
After writing, tell the user:
Export complete. Open this workspace in Claude Code and run
migrate cursorto complete the migration.
Import Phase (Steps 5–10)
Run this phase in Claude Code to recreate all artifacts.
Step 5 — Read source
Determine what to read:
- If
.cursor-export.mdexists: parse it to extract skills, rules, and config sections. Use the## Skills,## Rules,## Configheadings as delimiters. - If no export file but
.cursor/exists (direct import): read directly:.cursor/skills-config.yaml.cursor/rules/*.mdc- Attempt to extract
.cursor/skills/*.skillfiles viaunzip -p. If the binary cannot be read (e.g., nounzipavailable), skip skills and warn the user.
Step 6 — Create .claude/ directory
- Check if
.claude/already exists. - If it does and contains files, list them and ask the user: merge into existing, or skip conflicting files?
- If it doesn't exist, create it:
mkdir -p .claude
Step 7 — Migrate skills-config.yaml
- Read the config content (from export file or
.cursor/skills-config.yaml). - Update the location comment if present:
- Replace any
Location: *.cursor/skills-config.yamlwithLocation: <workspace>/.claude/skills-config.yaml
- Replace any
- Write to
.claude/skills-config.yaml. - If
.claude/skills-config.yamlalready exists, show a diff and ask before overwriting.
Step 8 — Convert rules to CLAUDE.md
- If
CLAUDE.mdexists at the workspace root, read its current content. - For each exported rule:
- Drop the Cursor
.mdcfrontmatter format. - Convert the rule body into a plain markdown section with a descriptive heading.
- If the rule has
alwaysApply: true, include it as a top-level section. - If the rule has a
globspattern, add a note about which files it applies to.
- Drop the Cursor
- Append all converted rules to
CLAUDE.md(or create the file if it doesn't exist). - Show the user the resulting
CLAUDE.mdcontent before writing.
Step 9 — Recreate skill behaviors
For each exported skill:
- Read the SKILL.md content and understand the skill's purpose, triggers, and workflow.
- Summarize the skill's behavior into a concise instruction block suitable for
CLAUDE.md. - Add under a
# Local Skillsheading inCLAUDE.md.
Keep each skill summary focused on what the agent should do — not how the original Cursor skill was structured. Adapt terminology:
- "Cursor" references → "Claude Code"
.cursor/paths →.claude/- Cursor-specific features → Claude Code equivalents (or note if no equivalent exists)
- Present to the user for review before writing.
Important: Migrated skills become static instructions — they are not executable slash-command skills. For equivalent interactive behavior, recommend the user creates a proper sdlc-toolkit skill using generate-skill.
Step 10 — Report
Present a migration summary.
Safety Rules
- Never modify or delete
.cursor/contents. - Never overwrite existing
.claude/files orCLAUDE.mdwithout user confirmation. - Remind the user to add
.cursor-export.mdto.gitignoreif it contains sensitive data (Slack IDs, project IDs, tokens). - If
skills-config.yamlcontains secrets or tokens, warn the user before writing.
Output format
Export phase:
Export written to `.cursor-export.md`.
- Skills exported: <count> (<list of names>)
- Rules exported: <count> (<list of filenames>)
- Config: <included / not found>
Next: open this workspace in Claude Code and run `migrate cursor` to import.
Import phase:
Migration complete.
- `.claude/skills-config.yaml` — <created / updated / skipped>
- `CLAUDE.md` — <created / updated>
- Rules migrated: <count> (<list>)
- Skills migrated: <count> (<list>)
- Skipped: <list of items that could not be migrated, if any>
Tip: run `bootstrap-config` to verify and update the config for Claude Code.