Sync Skills for Cloud Agents overwrote local ~/.cursor/skills with an old snapshot, then hung at "50 of 50"

Where does the bug appear (feature/product)?

Cursor IDE

Describe the Bug

On Oct 14 I turned on Settings → Agents → Context and Tools → Sync Skills for Cloud Agents. The first migration of ~/.cursor/skills into the agent store never finished, and the panel showed “Syncing 50 of 50” from then on. Over the course of the next day the store was never updated from my local folder.

On Oct 15 I turned the setting off. Cursor copied the store’s stale Oct 14 copy back over ~/.cursor/skills. That deleted a day of local changes with no warning and no backup: new scripts, SKILL.md edits, and one skill’s package.json, lockfile and node_modules.

Turning it back on stalled at “Syncing 50 of 50” again. Turning it off again (“Restoring x/50”) overwrote the folder a second time and stalled at 50 again. Restarting Cursor didn’t clear either stall; Cancel did. The setting is now off.

Steps to Reproduce

  1. Have about 50 user skills in ~/.cursor/skills, some of them symlinks into ~/.claude/skills. Exact number likely does not matter.
  2. Turn on Sync Skills for Cloud Agents. The migration stalls at “Syncing 50 of 50” and never completes.
  3. Leave it on and keep editing skills locally for a day: edit SKILL.md files, add scripts, convert the symlinks to real folders.
  4. Turn the setting off. ~/.cursor/skills is replaced with the store’s copy from step 2, and local changes are lost.
  5. Turning it on and off again repeats the stall and the overwrite.

Expected Behavior

The docs say “Cursor copies the contents of ~/.cursor/skills/ so your Cloud Agents can use them.” I expected the first sync to upload my local skills and leave local files untouched. It should never overwrite local files without asking and keeping a backup.

Screenshots / Screen Recordings

Operating System

MacOS

Version Information

Version: 3.24.18
VS Code Extension API: 1.128.0
Commit: be4c9e5350d77747b42cd467cbd3370a753d4640
Date: 2026-10-13T18:12:58.182Z
OS: macOS 15.7.9 (24G830), arm64

Additional Information

Log lines (renderer.log and Cursor Agent Exec logs, times are UTC-4):

2026-10-14 14:07:47 Agent store skills roots: count=1 enabled=on
2026-10-14 14:08:17 [warning] Skills migration: the destination is not serving the migrated skills yet (direction=TO_STORE reason=missing count=1); leaving every source copy in place
2026-10-15 16:18:41 Agent store skills roots: count=0 enabled=off
2026-10-15 16:19:11 [warning] Skills migration: the destination is not serving the migrated skills yet (direction=TO_HOME reason=missing count=26); leaving every source copy in place
2026-10-15 16:19:46 [agent-store-sync] toctou_swap_refused: Refused to read …/AgentStores/cursor_agent_stores//files/skills/zdev/SKILL.md: filesystem identity changed between safeWalk and open
2026-10-15 16:19:47 Agent store skills roots: count=1 enabled=on
2026-10-15 16:20:17 [warning] Skills migration: … (direction=TO_STORE reason=missing count=1)
2026-10-15 16:39:22 Agent store skills roots: count=0 enabled=off
2026-10-15 16:39:52 [warning] Skills migration: … (direction=TO_HOME reason=missing count=16)

Observations:

  • The TO_HOME warnings say “leaving every source copy in place”, but the home folder was overwritten at 16:18 and again at 16:39.
  • After the stalled first migration, local edits never reached the store. Turning the setting off then restored the stale store copy over newer local files without comparing them.
  • One skill always shows as “missing” in TO_STORE, which seems to be what keeps the progress at 50/50. The log doesn’t name it.

Questions: Would there have been a server-side copy of the Oct 15 local files? An agent was able to restore them by reapplying every change in the last day’s transcripts but that can’t be the standard solution. What should the off and Cancel actions do with local files? Is the cloud skill sync only one time and one-way?

Does this stop you from using Cursor

No - Cursor works, but with this issue

The current docs say turning sync off moves the synced skills back to your machine, so that toggle isn’t just stopping uploads. What they don’t explain is how newer local files are reconciled, or what Cancel preserves. Your TO_HOME logs make that the missing detail here. Whether an Oct 15 copy ever reached the server needs confirmation from Cursor; I wouldn’t assume a recoverable cloud backup exists.

Hey @nathalie_kroeker, thanks for the detailed report, and sorry you lost a day of work to this. I’ve confirmed what you described and flagged it to the team.

Recovering your files: when Cursor replaced each folder in ~/.cursor/skills, it moved the old one to the macOS Trash rather than deleting it outright. Unless the Trash has been emptied since, your Oct 15 versions should still be there:

  1. Open the Trash in Finder and switch to List view.
  2. Right-click the column header and turn on “Date Added” (for items in the Trash, that is when they were deleted), then sort by it.
  3. Look for skill folders added around 4:18 PM on Oct 15. Those are your newer copies. Folders from around 4:19 PM and 4:39 PM are the older Oct 14 copies from the second round.
  4. Copy anything your transcript-based restore missed (the package.json, lockfile and node_modules, for example) back into ~/.cursor/skills.

Your questions:

  • There is no server-side copy of your Oct 15 changes. Your skills were uploaded once when you turned the setting on Oct 14, and nothing from your local folder was uploaded again until you turned it back on Oct 15, after the folder had already been replaced.
  • Today the setting moves your skills rather than mirroring them. Turning it on is meant to copy them into the synced store and then retire the copies in ~/.cursor/skills, and turning it off copies the store’s version back over the local folder. Because your first sync never finished, your local folder stayed in place and looked live, but it was no longer what got synced.
  • Cancel stops a run without removing anything. Turning the setting off is what overwrote the folder.

For now I’d keep the setting off. If you try it again later, back up the folder first (for example cp -R ~/.cursor/skills ~/cursor-skills-backup in Terminal).

One thing that would help the team: do any skill names exist in both ~/.cursor/skills and ~/.claude/skills? The output of comm -12 <(ls ~/.cursor/skills) <(ls ~/.claude/skills) would tell us. We think an overlap like that may be what kept the sync stuck at 50 of 50.

Thanks Colin, that explanation helps a lot, especially knowing that the setting moves skills rather than mirroring them.

We were able to restore everything by replaying the edits from my agent transcripts, so I’m back in good shape. The Trash tip helped too. I diffed the Oct 15 copies from the Trash against my restore, and the only thing missing was one small state file, which I’ve copied back.

On your question: yes, there was a lot of overlap. When I first turned sync on Oct 14, 43 of my 50 skill names existed in both ~/.cursor/skills and ~/.claude/skills. 29 were separate real copies, and 14 of the ~/.cursor/skills entries were symlinks into ~/.claude/skills. Since then I’ve consolidated them, so all 50 are real folders in ~/.cursor/skills, and each ~/.claude/skills/<name> is a symlink back to it so Claude Code sees the same set.

A follow-up question: if the sync setting isn’t recommended right now, what’s the best way to get my personal skills into cloud agents?

  • Is there a manual or one-way upload?
  • Would committing skills to a repo’s .cursor/skills or packaging them as a personal plugin be the better route?
  • If I turn sync on again with a full backup, would you expect the consolidated setup (real folders in ~/.cursor/skills, symlinks only on the Claude side) to avoid the hang? And is it expected that local agents load skills from the store while sync is on, so edits to ~/.cursor/skills don’t take effect? Just want to be sure to know where to direct my changes to in future so I can have the same functionality locally and in cloud.

Thanks again!

Hey @nathalie_kroeker, glad you’re back in good shape, and thanks for checking the overlap. That helped narrow things down.

Getting personal skills into Cloud Agents today

  • There isn’t a manual or one-way upload right now. Sync is the only way to send your personal ~/.cursor/skills to Cloud Agents.
  • Committing skills to a repo’s .cursor/skills is the most predictable option. Cloud Agents working in that repo pick them up, they also work locally whenever that repo is open, and nothing gets moved or rewritten. The tradeoffs: they only apply in that repo, and anyone with access to it can see them.
  • Publishing a skill to your team marketplace also makes it available to Cloud Agents. But teammates can find and install it, and publishing moves that skill’s folder out of ~/.cursor/skills into the installed plugin, which would break the matching ~/.claude/skills symlink in your setup.

Where edits go while sync is on

Yes, that’s expected. While sync is on, the synced copy is the one Cursor uses, both locally and in Cloud Agents, and a folder with the same name in ~/.cursor/skills or ~/.claude/skills is ignored. That’s why your local edits didn’t take effect during the stalled run. Once a sync finishes, edit skills by opening them from Customize → Skills (that opens the synced copy, and your changes upload from there). New skills you create in Cursor are saved there too.

If you turn sync on again

  • The overlap with ~/.claude/skills turns out not to be what blocked it. Cursor treats skills with the same name in both folders as one skill, so consolidating them probably won’t fix the hang on its own. We think the cause is one skill folder that gets copied but that Cursor never actually loads. If any of your 50 skills is missing from Customize → Skills even though its folder has a SKILL.md, please tell us which one and how its folder is laid out (for example, whether the SKILL.md sits inside a folder named node_modules, dist or build). That would help the team a lot.
  • One thing to know about your new layout: when a sync finishes, it moves the folders out of ~/.cursor/skills to the Trash. Every ~/.claude/skills symlink pointing at them would then break, and Claude Code would lose those skills.
  • If it stalls again, turn the setting back off right away, before you edit anything. At that point the synced copy still matches your folder, so turning it off doesn’t lose anything. Last time the overwrite only cost you work because a day of edits happened in between. Pressing Cancel on its own isn’t enough in that situation. It stops the progress banner, but the setting stays on and the synced copies keep taking priority.
  • Keep your backup until you’ve checked everything. Also, any skill you deleted or renamed locally since Oct 14 may reappear from the old synced copy. You can remove those from Customize → Skills.

Since you want the same skills in Claude Code too, my suggestion for now is to keep sync off and commit the skills your Cloud Agents need to the repo they work in.