Skip to content

Migrating from Devin Desktop (formerly Windsurf)

Migrating from Devin Desktop, the editor Cognition renamed from Windsurf in June 2026, means translating each .windsurf/rules/ file by its trigger into instruction files, path-scoped rules or skills, turning .windsurf/workflows/ into skills, and re-adding MCP servers per tool. The migration is done when a behavioural check proves Claude Code, Codex or Cursor applies the same rules.

Your team adopted Windsurf last year. The editor has since updated itself into Devin Desktop, the repository holds 14 files in .windsurf/rules/ with four different trigger values and six slash-command workflows in .windsurf/workflows/, and half the team now wants Claude Code or Codex. Concatenating the rule files into one AGENTS.md looks like a five-minute job, until the agent starts applying your Go-only rules to TypeScript and ignores the ones that were only ever loaded on demand.

This page is for the developer who does the move and the tech lead who has to keep the team’s rules intact while people switch at different speeds. It covers the repository side of the move; the product comparison lives in Cursor, Claude Code, and Codex vs Devin Desktop (formerly Windsurf).

  • A decision table for whether to switch editor at all, or add a terminal agent beside Devin Desktop
  • A trigger-by-trigger map from Windsurf rules to AGENTS.md, CLAUDE.md, path-scoped rules and skills
  • Four copy-paste prompts: inventory and translate rules, convert workflows to skills, prove the rules apply, and run a first delegated task with evidence
  • MCP commands for Claude Code and Codex, and the verification gates that make the move provable
  • The failure modes of a half-migrated team and how to recover from each

Do you need to leave the editor to switch agents?

Section titled “Do you need to leave the editor to switch agents?”

Not necessarily. Decide what you are replacing before you move any file.

SituationWhat to do
You like the editor and want a stronger terminal agentKeep Devin Desktop and run Claude Code or Codex beside it in a terminal (or in the editor’s terminal, if your build still has one). OpenAI’s Codex README lists Windsurf among the editors its IDE extension supports (checked 2026-09-26). Translate the rules so both agents read them.
You want an IDE-first agent with inline completionMove to Cursor, the only one of the three that is an editor. Its models and prices could not be re-verified on 2026-09-26, so check cursor.com before you buy.
You want agents in CI, scheduled runs or headless scriptsAdd Claude Code (claude -p) or Codex (codex exec). Both run without an editor; if you stay with Cognition, compare them with Devin CLI in the coding-agent landscape.
You depend on a model only Cognition offers, such as SWE-2 (in Devin Desktop and Devin CLI; launched 2026-09-10 per aipricing.guru, secondary)Keep that work in Devin Desktop until your own evals show a replacement matches it. The models hub lists what each tool runs.
You are comparing more than the big threeStart with the coding-agent landscape, which covers Devin and Devin CLI as well.

Start on each tool’s default model: Claude Opus 5.5 in Claude Code (from v2.1.280 on the latest release channel) and GPT-6 Astra in Codex. Tune effort before you switch model, and switch only when your evals say so.

How do Windsurf rule triggers map to Claude Code, Codex and Cursor?

Section titled “How do Windsurf rule triggers map to Claude Code, Codex and Cursor?”

A Windsurf rule file carries a trigger in its frontmatter, and the trigger decides when the agent sees it. The target depends on the trigger, not on the file. Flattening every file into one instruction file is the most common migration mistake, because it turns on-demand rules into always-on noise.

Windsurf triggerClaude CodeCodexCursor
always_onCLAUDE.md (first line @AGENTS.md)Root AGENTS.mdA rule set to apply always
glob with globs:.claude/rules/NAME.md with a paths: list in its frontmatterAGENTS.md in the directory the glob coversA rule scoped to the same globs
model_decision with description:Skill in .claude/skills/NAME/SKILL.md; its description decides when it loadsSkill in .agents/skills/NAME/SKILL.mdSkill in .agents/skills/NAME/ (reuse the Codex copy), or a rule the agent requests by description
manualSkill with disable-model-invocation: true, invoked as /NAMESkill you invoke with $NAME or pick from /skillsSkill in .agents/skills/NAME/, or a rule you mention explicitly
.windsurf/workflows/NAME.md (a /NAME workflow)SkillSkillSkill
Auto-generated MemoriesReview, then promote durable ones to AGENTS.md; Claude Code’s auto memory takes over from therePromote to AGENTS.mdPromote to a rule

A glob that maps to one directory becomes a nested AGENTS.md there for Codex. An extension or cross-directory glob such as **/*.go or **/*.test.ts has no Codex equivalent, because Codex scopes AGENTS.md by directory, not by file pattern (codex-cli 0.157.1, checked 2026-09-26): write it as a conditional line in the root AGENTS.md (“When editing *.go files: …”) or as a skill, and test it with question 3 of the proof prompt below.

The Claude Code and Codex locations were checked against the installed CLIs (Claude Code 2.1.283, codex-cli 0.157.1) on 2026-09-26. Claude Code reads AGENTS.md on its own only when there is no CLAUDE.md, and only from v2.1.277 (first-party sessions) or v2.1.281 (Bedrock, Google Cloud, Foundry and LLM gateways), both on the latest channel only, which is why the table routes it through an @AGENTS.md import that works on both channels. Cursor’s rule file format could not be re-verified on 2026-09-26: create one rule through Cursor’s own rules settings, then have the agent copy that format. The same goes for Cursor’s skill locations: a Cursor docs snippet lists .agents/skills/ and also .claude/skills/, but we could not re-verify it on 2026-09-26, so confirm that Cursor lists the migrated skills before you rely on them.

  1. Inventory everything Windsurf-shaped. Run this in a terminal at the repository root. The first command lists rule, workflow and instruction files in every directory, not only the root:

    Terminal window
    find . -path ./node_modules -prune -o -type f \( -path '*/.windsurf/*' -o -path '*/.devin/*' -o -name '.windsurfrules' -o -name 'AGENTS.md' -o -name 'CLAUDE.md' \) -print
    find . -path ./node_modules -prune -o -type f \( -path '*/.windsurf/rules/*' -o -path '*/.devin/rules/*' \) -exec grep -h '^trigger:' {} + | sort | uniq -c

    The second command counts rules per trigger across every directory, including nested .windsurf/ folders in a monorepo, which tells you how many land in each column of the table above. Global rules, Memories and MCP servers live in the editor’s settings on each engineer’s machine, not in git. Export them from each machine before anyone uninstalls the editor.

  2. Translate rules by trigger. Run the first prompt below in the agent you are moving to. It writes the target files and a mapping table you check instead of reading every rule.

  3. Turn workflows into skills. Run the second prompt. A Windsurf workflow is a named, repeatable procedure, which is exactly what an Agent Skill is. If the team runs both Claude Code and Codex, keep one copy of each skill and confirm discovery in each tool: type / in Claude Code, and run /skills in Codex.

  4. Re-add MCP servers per tool. MCP configuration does not transfer between editors. Add each server again and read secrets from environment variables, never from the command line. The example below uses the Playwright MCP server (@playwright/mcp).

    Run in a terminal. --scope project writes .mcp.json at the repository root, so the whole team gets the server from git.

    Terminal window
    claude mcp add --scope project playwright -- npx @playwright/mcp@latest

    Which servers are worth adding at all is covered in essential MCP servers.

  5. Prove the rules apply, then commit. Run the third prompt in a fresh session. Commit the new files only when every rule it tests is answered from the right source. Keep .windsurf/rules/ in place until the last engineer has switched.

How do you prove the migrated rules actually apply?

Section titled “How do you prove the migrated rules actually apply?”

A mapping table shows where each rule went. It does not show that the agent reads it. Ask questions whose only correct answers come from specific rules, in a fresh session with no other context, and require the agent to cite the file.

Replace src/api/ and web/ with two directories your glob rules cover. Question 3 is the one that catches flattening: if the agent applies a Go-only or API-only rule to docs/, a path-scoped rule became global. Any RULE_NOT_LOADED answer for an always_on rule means the instruction file is not being read; see the failure modes below.

Then give the agent a real task with acceptance criteria, the kind you used to hand to Cascade, and judge it by evidence rather than by reading the diff.

Start in plan mode so nothing is edited before you approve the plan. Shift+Tab cycles modes in a running session, and /rewind (Esc Esc) restores a checkpoint if the agent goes wrong.

Terminal window
claude --permission-mode plan

How do you verify migrated agent work without reading every line?

Section titled “How do you verify migrated agent work without reading every line?”

The editor changes; the gates do not. Put these in place before the first migrated pull request merges.

  • Acceptance criteria before code. Every delegated task names its criteria and the command that proves each one, as in the prompt above. See acceptance criteria an agent can check.
  • Required CI checks. Type check, lint and tests block the merge whichever agent or editor wrote the code.
  • An evidence bundle in each pull request. Each criterion maps to a test and its output, so the reviewer checks the mapping. See the evidence bundle.
  • A rules check in CI. Save the proof prompt as .github/rules-check.md, rerun it headlessly after any change to the instruction files, and fail the job when an answer is the sentinel token: claude -p "$(cat .github/rules-check.md)" > rules-check.txt && ! grep -q 'RULE_NOT_LOADED' rules-check.txt. A unique token avoids false failures from a correct answer such as “those rules do not apply to docs/”. The headless run needs ANTHROPIC_API_KEY as a CI secret. On a Codex-only team, the equivalent step is codex exec "$(cat .github/rules-check.md)" > rules-check.txt && ! grep -q 'RULE_NOT_LOADED' rules-check.txt, with CODEX_API_KEY as the secret. The project must be trusted in the runner’s Codex configuration, because since codex-cli 0.150.0 an untrusted project does not supply AGENTS.md and every answer comes back RULE_NOT_LOADED. Run Codex non-interactively covers authentication and the rest of the CI setup.
  • Protected tests. Agents must not weaken a test to pass it; a rule in AGENTS.md plus CODEOWNERS on the test directories keeps changes visible. See protecting the test oracle.
  • Human sign-off where tests cannot reach. The engineer who delegated the task approves the evidence and reads the diff only for auth, migrations, billing and public API changes. Reviewing agent pull requests has the checklist.

What breaks when a team migrates off Devin Desktop?

Section titled “What breaks when a team migrates off Devin Desktop?”

Every rule became always-on. Someone concatenated .windsurf/rules/*.md into AGENTS.md, and the agent now applies framework rules to the wrong files while the context fills with rules it does not need. Recovery: rerun the translation prompt from the original files, and check question 3 of the proof prompt.

Claude Code does not see the rules. Engineers on the stable channel (v2.1.274 on 2026-09-26) do not get the AGENTS.md fallback, and a CLAUDE.md without the import hides AGENTS.md on every channel. Recovery: start every CLAUDE.md with @AGENTS.md, and add a CI step that fails otherwise (head -n 1 CLAUDE.md | grep -qx '@AGENTS.md').

Codex ignores AGENTS.md in a fresh clone. Since codex-cli 0.150.0, untrusted projects do not supply project-level AGENTS.md instructions. Recovery: trust the project when Codex asks, then rerun the proof prompt.

Rules drift between .windsurf/ and the new files. During the transition someone updates the test command in one place only. Recovery: pick the new files as the source of truth on day one, add a note at the top of each .windsurf/rules/ file pointing to its new location, and delete .windsurf/ when the last engineer has switched.

MCP servers are missing. The new agent cannot reach the database or browser the old setup had, because MCP configuration lived in the editor’s settings. Recovery: rebuild the list from each engineer’s export in step 1, and commit Claude Code’s .mcp.json so the next person gets it from git.

Memories vanish. Knowledge the editor had generated on its own never reached git. Recovery: before uninstalling, have each engineer review their Memories and promote the durable ones (commands, conventions, known traps) into AGENTS.md through a normal pull request.

A workflow’s shortcut does nothing. Typing /deploy-preview in Claude Code (or $deploy-preview in Codex) does nothing because the skill’s description or directory is wrong. Recovery: check discovery with / in Claude Code or /skills in Codex, and fix the name and description frontmatter.

To install the new agent, start with the Claude Code quick start, the Codex quick start or the Cursor quick start. For a team running two agents during the switch, adding Claude Code or Codex alongside GitHub Copilot shows the same pilot and metrics pattern.