MemoryLake
Back to all articles
TutorialSeptember 18, 2026·12 min read

How to Sort Which Cursor Rules Should Become Skills and Which Should Stay (2026 Guide)

Cursor now ships two ways to give the agent standing instructions, and a built-in command for moving things from one to the other. The command's description is the most honest summary of the situation anyone has written: /migrate-to-skills "Converts eligible dynamic rules and slash commands into Agent Skills."

Eligible. Cursor is telling you, in a table of built-in skills, that some of your rules should become skills and some should not — without telling you which are which.

The distinction is real and it is documented, just in two separate places. Rules are prompt-level context: "When applied, rule contents are included at the start of the model context." Skills are loaded on demand: "Skills load resources on demand, keeping context usage efficient." One is something the agent reads before it starts. The other is something the agent goes and gets.

Get the split wrong in either direction and nothing breaks loudly. A skill that should have been an always-apply rule is simply not consulted on the turn you needed it. A style convention moved into a skill is a convention the agent now has to decide is relevant. This guide sets out what each mechanism actually is, the test for which one a given piece of your context belongs in, and the boundaries that bite once you move things.

Why the two mechanisms feel interchangeable

They overlap on the surface because both can be selected by the agent based on a description.

On the rules side, Cursor documents four application modes: Always Apply ("Apply to every chat session"), Apply Intelligently ("When Agent decides it's relevant based on description"), Apply to Specific Files ("When file matches a specified pattern"), and Apply Manually ("When @-mentioned in chat"). The underlying mechanic is stated even more simply: "If alwaysApply is true, the rule will be applied to every chat session. Otherwise, the description of the rule will be presented to the Cursor Agent to decide if it should be applied."

On the skills side, the selection story sounds almost identical: "When Cursor starts, it automatically discovers skills from skill directories and makes them available to Agent. The agent is presented with available skills and decides when they are relevant based on context." The frontmatter field that drives it is described the same way too — description is "Used by the agent to determine relevance."

So both can be description-selected and both can be file-scoped. Skills take a paths field where, "When set, the skill is only surfaced when the agent works with files that match," which is the same idea as a rule's globs. Skills can also be pinned shut: disable-model-invocation, "When true, the skill is only included when explicitly invoked via /skill-name. The agent will not automatically apply it based on context."

Where they genuinely differ is in what each can hold and when it gets read.

A rule is text that goes into the prompt. Cursor's framing of why rules exist at all is worth quoting because it names the underlying problem: "Large language models don't retain memory between completions. Rules provide persistent, reusable context at the prompt level."

A skill is a package. "A skill is a portable, version-controlled package that teaches agents how to perform domain-specific tasks. Skills can include scripts, templates, and references that agents may act on using their tools." And it is not Cursor-specific: "Skills work across any agent that supports the Agent Skills standard."

That last sentence is the part that changes the decision. One of these formats leaves with you, and one of them is a Cursor construct. Portability is also why the same question keeps reappearing whenever teams move between agents, as in migrating Cursor rules into Codex.

What people try instead

Running the converter on everything. The command exists, so it looks like a decision Cursor has already made for you. It converts eligible dynamic rules and slash commands — the word is doing real work, and an always-apply convention is not a multi-step procedure waiting to be packaged.

Keeping everything as rules because they already work. Defensible, and it has a cost the docs name: rules go into the model context at the start. Cursor's own best practices push back on bulk — "Keep rules under 500 lines", "Split large rules into multiple, composable rules", and "Reference files instead of copying their contents—this keeps rules short and prevents them from becoming stale as code changes."

Putting a plain Markdown file in the rules directory. This is the mistake with the cleanest documentation, and Cursor now spells it out: "Project rules must use the .mdc extension. A plain .md file in .cursor/rules is ignored by the rules system because it has no frontmatter to specify description, globs, and alwaysApply." The docs also give the alternative: "If you prefer plain markdown, use AGENTS.md instead." Whether to consolidate on that file at all is its own decision, and we walked through it in moving a CLAUDE.md into AGENTS.md.

Assuming skills in your home directory travel with your work. They mostly don't, and Cursor states the boundary: "Cursor does not copy ~/.agents/skills/ or unsynced local skills to Cloud Agents, Agents Window remote SSH sessions, or self-hosted workers." The docs give the remedy for one of those cases — "On self-hosted workers, use project skills from the repo or bake skills into the worker image."

Writing more rules whenever the agent gets something wrong. Cursor's guidance is deliberately slower: "Start simple. Add rules only when you notice Agent making the same mistake repeatedly." Its list of what to avoid is equally pointed — "Copying entire style guides: Use a linter instead", "Documenting every possible command", "Adding instructions for edge cases that rarely apply", and "Duplicating what's already in your codebase". Rules that pile up tend to produce the drift described in when Cursor forgets your project rules.

Treating skills as the agent's memory. They are packaged procedures, not a record of what your team decided. That distinction matters more than it sounds, and we set it out in why agent skills aren't memory.

The Fix: Split by what the item is, not by which format is newer

One question decides almost every case: is this thing always true, or is it something you do?

Step 1: Sort each item into always-true, file-scoped, or procedural

Always true belongs in a rule with alwaysApply on. Copyright headers, the instruction to read source files before proposing changes, directories that must never be edited — Cursor's own always-applied example is exactly this kind of list. These are cheap in tokens and expensive to miss, and you do not want the agent deciding whether they are relevant.

File-scoped can go either way, and the honest tiebreaker is portability. A rule with globs and a skill with paths do the same job. If the convention is likely to matter in another agent as well, the skill format is the one that travels.

Procedural belongs in a skill, and this is where the converter earns its keep. Anything with steps, a template to fill, a script to run, or reference material attached is what the skill format is built for — it can carry "scripts, templates, and references that agents may act on using their tools" and load them only when needed. Squeezing that into a rule means the whole procedure sits in your prompt whether or not today's task involves it.

Cursor's own repo scoping is a useful hint about intent: "Skills in nested project directories are automatically scoped to files inside that directory," so a skill placed beside the package it applies to is scoped without any configuration. That is the same file-locality principle we examined in scoping instructions to files.

Step 2: Decide who picks each item, and set the field that says so

For each item, write down who should choose it: always loaded, agent-selected, file-matched, or invoked by hand. Then set the field that matches, because the defaults are not the same on both sides.

A rule gets alwaysApply: true for always, a description for agent-selected, globs for file-matched, or neither for manual — Cursor notes that with no description and no globs a rule is "Included only when you @-mention the rule in chat."

A skill is agent-selected by default, since Cursor presents available skills and the agent decides relevance from the description. To make one manual-only, set disable-model-invocation. To make one file-scoped, set paths. And note the invocation behaviour: a skill invoked with a slash "attaches to one message," so a skill you want active for a whole session is a different setup from one you want for a single turn.

One naming rule to respect: a skill's name must be "Lowercase letters, numbers, and hyphens only" and "Must match the parent folder name."

Step 3: Write down why each convention exists, somewhere neither format governs

Rules and skills both hold instructions. Neither is a good place for the argument behind the instruction, and Cursor's own advice pushes content out of these files rather than in — reference files instead of copying them, point at canonical examples, keep rules short.

That leaves a gap. "Never alter a column type in-place" is a rule. Why — which migration broke, in which month, and what the team agreed afterwards — is the thing that stops someone deleting the rule next quarter. Put it somewhere that outlives both formats.

Setting this up in MemoryLake

Rules and skills answer how the agent should behave. They are a poor home for what your team decided and why, which is what people keep trying to store in them. MemoryLake is a store you write those decisions into on purpose, kept apart from any one editor's configuration and readable from every assistant you connect. You write the entries yourself, in your own words. Nothing is read out of, written to, or deleted from Cursor's systems or any other vendor's store — your rules, skills, and repositories stay entirely under their own controls.

Step 1: Create an API key

Generate a key from the dashboard. It is what lets Cursor, a terminal agent, and a chat assistant reach the same set of facts without each of them carrying its own copy of the reasoning.

The MemoryLake console showing the API keys screen, where a new key is created and copied for use in an agent
The MemoryLake console showing the API keys screen, where a new key is created and copied for use in an agent

Step 2: Upload your first memories

Start with the decisions behind the rules: the approach that was ruled out and on what grounds, the incident a convention exists to prevent, the person to ask before touching a specific service. A rules file carries the instruction; it almost never carries the reason.

The MemoryLake workspace with the first documents uploaded, listing each file as it becomes searchable memory
The MemoryLake workspace with the first documents uploaded, listing each file as it becomes searchable memory

Step 3: Connect your AI & agents

Point your tools at the layer so those facts load at the start of a session instead of being inferred from a configuration file. Then run the test that actually proves something: ask a different assistant for one of the decisions back. If it answers, your reasoning stopped being tied to one editor's file format.

The MemoryLake integrations screen listing the AI clients and agent frameworks that can be connected to the memory layer
The MemoryLake integrations screen listing the AI clients and agent frameworks that can be connected to the memory layer

What this changes in practice

The first change is that the converter becomes safe to use, because you know what to feed it. Procedures with steps, scripts or templates go in. Always-apply conventions stay where they are.

The second is that your prompt gets smaller. Everything with alwaysApply on is read every session; procedures moved into skills load on demand. That is the actual mechanical benefit, and it only arrives if you move the right things.

The third is that the .mdc requirement stops costing anyone an afternoon. A plain .md file in the rules directory is ignored by the rules system, and Cursor now says so in the same paragraph as the fix.

The fourth is that remote and cloud runs stop surprising you. Unsynced local skills and ~/.agents/skills/ do not reach Cloud Agents, remote SSH sessions, or self-hosted workers, so anything a cloud run depends on belongs in the repo.

The fifth is that portability becomes a thing you chose rather than a thing you discover. Skills are described as working across any agent supporting the standard; rules are a Cursor construct. Knowing which of your context is in which format is the difference between a migration and a rewrite — the same problem another vendor documents from the other side, as in which Copilot instructions file gets read.

Best practices for splitting Cursor rules and skills

Keep always-apply lists short and absolute. They are read in every session, so every line competes with the actual task.

*Give every description a when, not just a what.* On both sides, the description is what the agent uses to judge relevance.

Put skills a cloud run needs in the repo. Project-level skill directories travel; unsynced local ones are documented as staying on your machine.

One skill per procedure, in its own folder. The skill's identity comes from the folder containing SKILL.md, and category folders above it are organizational only.

Use nesting instead of glob lists where you can. A skill inside a package directory is scoped to that directory automatically.

Respect the extension rules. .mdc for project rules; plain Markdown belongs in AGENTS.md instead.

Keep the reasoning somewhere else. A rules file that also carries its own history stops being short, and short is what makes it work.

Conclusion

Cursor documents both mechanisms clearly; it just doesn't put them on the same page. Rules are prompt-level context, included at the start of the model context, with four application modes and a hard requirement that project rules use the .mdc extension. Skills are portable, version-controlled packages that can carry scripts, templates and references, load their resources on demand, and work across any agent supporting the Agent Skills standard.

The sorting question is simpler than the feature comparison suggests. Always-true conventions stay as always-apply rules, because you do not want relevance judged. Procedures with steps and attachments become skills, because that is what on-demand loading is for. File-scoped guidance can be either, and portability is the sensible tiebreaker.

Two boundaries are worth writing on a sticky note: a plain .md in .cursor/rules is ignored by the rules system, and unsynced local skills do not reach Cloud Agents, remote SSH sessions or self-hosted workers.

Then take the one step neither format supports. Record why each convention exists somewhere that isn't a rule file or a skill package, so the next person to read the rule also finds the reason it is there.

Frequently asked questions

What is the actual difference between Cursor rules and skills?

When rules apply, their contents are included at the start of the model context — they are prompt-level instructions. A skill is described as "a portable, version-controlled package" that can include scripts, templates and references, and skills "load resources on demand, keeping context usage efficient."

What does /migrate-to-skills convert?

Cursor's built-in skill list describes it as converting "eligible dynamic rules and slash commands into Agent Skills." Dynamic rules and commands that describe a procedure are the natural candidates; conventions you want applied to every session are better left as always-apply rules.

Why is my rule in .cursor/rules being ignored?

Almost certainly the file extension. Cursor states that project rules "must use the .mdc extension" and that "A plain .md file in .cursor/rules is ignored by the rules system because it has no frontmatter to specify description, globs, and alwaysApply."

Where do skills have to live for Cursor to find them?

Cursor loads skills from project-level directories .agents/skills/ and .cursor/skills/, and user-level ~/.agents/skills/ and ~/.cursor/skills/. For compatibility it also loads from .claude/skills/, .codex/skills/, ~/.claude/skills/, and ~/.codex/skills/.

Do my personal skills work in Cloud Agents?

Not unless they are synced or in the repo. The docs state that Cursor "does not copy ~/.agents/skills/ or unsynced local skills to Cloud Agents, Agents Window remote SSH sessions, or self-hosted workers," and suggest using project skills from the repo or baking skills into the worker image for self-hosted workers.

How do I stop a skill from being picked automatically?

Set the disable-model-invocation field. Cursor documents that when it is true, "the skill is only included when explicitly invoked via /skill-name" and that the agent "will not automatically apply it based on context."