Remote SSH to Windows host: all Agent Skills fail to load, including built-in create-skill (Cursor 3.1.15, macOS → Windows)

Where does the bug appear (feature/product)?

Cursor IDE

Describe the Bug

Summary
When using Cursor on macOS to connect to a native Windows machine over Remote SSH, Agent Skills do not load at all. This affects both custom project skills and Cursor’s built-in create-skill. According to Cursor docs, project skills should load from .cursor/skills/ or .agents/skills/, so this appears to be a Remote SSH / Windows-specific bug rather than a setup issue.

Environment
• Local OS: macOS
• Remote OS: Windows
• Connection: Remote SSH
• Cursor version: 3.1.15
• Remote SSH extension: Remote - SSH (Anysphere / cursor.com)

Expected behavior
Skills should be discovered and usable when placed in supported project directories such as:
• .cursor/skills//SKILL.md
• .agents/skills//SKILL.md

Actual behavior
• Custom skills are not discovered or loaded over Remote SSH.
• Built-in create-skill also does not load.
• Moving the same skill between .cursor/skills/ and .agents/skills/ does not help.
• Placing skills on the remote machine does not help.
• Restarting Cursor and reopening the remote workspace does not fix it.

Steps to Reproduce

  1. On macOS, open Cursor.
  2. Connect to a Windows host using Remote SSH.
  3. Open a remote project folder as the workspace root.
  4. Create a skill at:.cursor/skills/add-alarm-code/SKILL.md
  5. Use a minimal skill file.
  6. Restart Cursor completely.
  7. Reopen the same remote workspace.
  8. Check whether the skill appears in Settings / Rules / Skills and whether it can be invoked.
  9. Repeat the same test under .agents/skills/add-alarm-code/SKILL.md.
  10. Also try invoking Cursor’s built-in create-skill.

Expected Behavior

Observed result
None of the skills load. Even the built-in create-skill is unavailable.

Operating System

MacOS

Version Information

•	Local OS: macOS
•	Remote OS: Windows
•	Connection: Remote SSH
•	Cursor version: 3.1.15
•	Remote SSH extension: Remote - SSH (Anysphere / cursor.com)

Does this stop you from using Cursor

Yes - Skills unavailable

Hey, thanks for the detailed report and the repro steps. It really helps.

This is a known bug. Agent Skills discovery, both custom and the built-in create-skill, is unreliable over Remote SSH. We already have a couple threads with the same symptom:

On the second thread, a fix is already being worked on, you can follow updates there.

Workaround for now: put the skills at the project level instead of global. Structure:

<project-root>/
  .cursor/
    skills/
      my-skill/
        SKILL.md

In SSH mode, the global config ~/.cursor/skills/ is not read, but the project-level .cursor/skills/ in the remote workspace is picked up correctly. This is a confirmed workaround from the team.

A couple questions so we can add more signal for your specific case:

  1. If you open the same workspace locally on the Windows host, without SSH, do the skills get detected?
  2. Can you share logs from View → Output with the Anysphere Remote - SSH channel and the remote Extension Host after restarting Cursor with the remote workspace open? Lines with skill, getManagedSkills, skills-cursor are especially helpful.

Thanks — I have one more important data point that seems to narrow this down:

Repro matrix

  • Windows → macOS over Remote SSH: skills load normally

  • macOS → Windows over Remote SSH: skills do not load

  • In the failing case, even the documented project-level locations do not work:

    • .cursor/skills//SKILL.md

    • .agents/skills//SKILL.md

So this does not look like only the known “global ~/.cursor/skills is not read in SSH mode” issue. In my case, the project-level workaround also fails, but only for macOS → native Windows host.

What I verified

  • directory structure is correct

  • minimal valid SKILL.md

  • tested both .cursor/skills/… and .agents/skills/…

  • built-in create-skill also fails

  • opposite direction (Windows → macOS) works

Log summary

  • Remote - SSH looks healthy: SSH connects, remote Cursor Server starts, port forwarding works, no obvious install/handshake failure

  • Extension Host (Remote) is where things look wrong:

    • no meaningful managed-skills discovery logs (getManagedSkills, skills-cursor, etc.)

    • repeated extension initialization / bundle resolution errors affecting core Cursor remote extensions, for example:

    [error] No bundle location found for extension anysphere.cursor-agent
    [error] No bundle location found for extension anysphere.cursor-agent-exec
    [error] No bundle location found for extension anysphere.cursor-checkout
    [error] No bundle location found for extension anysphere.cursor-polyfills-remote
    [error] No bundle location found for extension anysphere.cursor-mcp
    [error] No bundle location found for extension anysphere.cursor-commits
    [error] No bundle location found for extension anysphere.cursor-explorer
    [error] No bundle location found for extension anysphere.cursor-retrieval
    [error] No bundle location found for extension anysphere.cursor-shadow-workspace

  • these extensions later report activation success, but the repeated “No bundle location found” errors make it look like remote extension initialization is at least partially broken or inconsistent

  • also:

[error] Error: command ‘_chat.editSessions.accept’ not found

My conclusion

This seems to be a macOS → Remote SSH → native Windows host regression where the remote extension host / agent initialization is incomplete, so skill discovery never properly starts.

That would explain why:

  • custom skills fail

  • built-in create-skill fails

  • project-level .cursor/skills/… also fails

Would it make sense to track this as a separate Windows-remote-host-specific issue, rather than just the existing “global skills not read in SSH mode” bug?

One specific log pattern that seems important:

In Extension Host (Remote), several core Cursor remote extensions first report “No bundle location found”, but then later report activation success in the same startup sequence.

For example:

2026-04-19 00:01:45.439 [info] ExtensionService#_doActivateExtension anysphere.cursor-agent, startup: true, activationEvent: ‘
2026-04-19 00:01:45.439 [info] ExtensionService#_doActivateExtension anysphere.cursor-agent-exec, startup: true, activationEvent: '

2026-04-19 00:01:45.440 [info] ExtensionService#_doActivateExtension anysphere.cursor-checkout, startup: true, activationEvent: ‘
2026-04-19 00:01:45.440 [info] ExtensionService#_doActivateExtension anysphere.cursor-polyfills-remote, startup: true, activationEvent: '

2026-04-19 00:01:45.506 [error] No bundle location found for extension anysphere.cursor-agent
2026-04-19 00:01:45.507 [error] No bundle location found for extension anysphere.cursor-agent-exec
2026-04-19 00:01:45.507 [error] No bundle location found for extension anysphere.cursor-checkout
2026-04-19 00:01:45.507 [error] No bundle location found for extension anysphere.cursor-polyfills-remote

2026-04-19 00:01:46.171 [info] Extension activated success: anysphere.cursor-checkout — 707ms (code loading: 707ms, activate call: 0ms, activate resolved: 0ms)
2026-04-19 00:01:46.171 [info] Extension activated success: anysphere.cursor-polyfills-remote — 724ms (code loading: 724ms, activate call: 0ms, activate resolved: 0ms)
2026-04-19 00:01:46.172 [info] Extension activated success: anysphere.cursor-agent — 364ms (code loading: 356ms, activate call: 0ms, activate resolved: 8ms)

2026-04-19 00:01:46.170 [info] ExtensionService#_doActivateExtension anysphere.cursor-mcp, startup: false, activationEvent: ‘api’, root cause: anysphere.cursor-agent-exec
2026-04-19 00:01:46.215 [error] No bundle location found for extension anysphere.cursor-mcp
2026-04-19 00:01:46.459 [info] Extension activated success: anysphere.cursor-mcp — 289ms (code loading: 255ms, activate call: 0ms, activate resolved: 34ms)

2026-04-19 00:01:46.636 [info] Extension activated success: anysphere.cursor-agent-exec — 1175ms (code loading: 703ms, activate call: 7ms, activate resolved: 465ms)

So the pattern is not a simple hard failure. It looks more like:

  • activation is attempted

  • bundle resolution fails transiently or inconsistently

  • the same extensions later report activation success

That makes the remote extension host look partially inconsistent rather than fully broken, which may explain why the SSH connection itself is healthy but skills discovery / agent behavior is still not working correctly on macOS → Remote SSH → native Windows host.

Thanks, this is a really valuable data point. The repro matrix Windows to macOS works, macOS to Windows breaks and especially the log pattern with No bundle location found for anysphere.cursor-agent, cursor-agent-exec, cursor-polyfills-remote, and other core extensions is an important signal that I haven’t seen in the existing skills plus SSH threads.

I agree your interpretation sounds plausible. The symptom might be broader than global ~/.cursor/skills not being readable over SSH which is what we’re tracking right now, and it could affect remote extension host startup in the macOS client to native Windows remote setup. But this is still a hypothesis. Without reproducing it on our side, I can’t say for sure that No bundle location found and missing skill discovery are the same root cause rather than two issues happening at the same time.

I’ll pass these logs and the repro matrix to the team as a separate signal so they look at it beyond the skills bug. I can’t give an ETA for a fix.

A few quick questions to add to the report:

  1. Is the Windows remote a clean Windows setup cmd or PowerShell plus OpenSSH, or are you using WSL, Cygwin, or Git Bash as the SSH shell? Also what Windows version are you on 10 or 11, and which build?
  2. What Cursor Server version is installed on the remote under %USERPROFILE%\.cursor-server\bin\<commit>\?
  3. If you delete %USERPROFILE%\.cursor-server\ entirely on the Windows host and reconnect from the Mac, do you still see No bundle location found on a fresh install?
  4. If you use the same SSH connection to that Windows host from Microsoft VS Code with Remote-SSH, does the core remote extension host start without similar errors? This helps confirm if it’s specific to cursor-server or Anysphere Remote-SSH or a more general remote host issue.

Thanks — here are the answers to your questions, plus two more comparison results:

  1. Windows SSH setup
  • This is a native Windows machine.

  • I am not using WSL, Cygwin, or Git Bash.

  • The SSH server is Windows OpenSSH Server.

  • It was installed from Windows Optional Features and started as a service via services.msc.

  • Cursor launches the remote shell with PowerShell, so this repro is in:

    macOS client → Remote SSH → native Windows host + Windows OpenSSH Server + PowerShell

  1. Windows version
  • Windows 10 Pro

  • 22H2

  • OS build 19045.6466

  1. Remote Cursor Server version
  • Remote Cursor version: 3.1.15

  • Remote server commit: 3a67af7b780e0bfc8d32aefa96b8ff1cb8817f80

  • Real commit: 3a67af7b780e0bfc8d32aefa96b8ff1cb8817f88

  1. Fresh reinstall test
  • I did run this.

  • I completely deleted %USERPROFILE%\.cursor-server\ on the Windows host and reconnected from macOS so Cursor would do a fresh remote server install.

  • The result is the same: the issue still reproduces after a clean reinstall.

  1. VS Code Remote-SSH comparison
  • I also tested the same Windows host with Microsoft VS Code + Remote-SSH.

  • VS Code connects normally, and the remote extension host looks clean there.

  • I do not see the kind of remote extension initialization errors that appear in Cursor.

  • I realize VS Code does not have Cursor Skills, so this is not a feature-for-feature comparison, but it still seems useful as a control:

    • same native Windows host

    • same general Remote SSH workflow

    • VS Code remote extension host starts cleanly

    • Cursor remote extension host shows inconsistent extension initialization in the failing setup

So at this point, this still looks narrower than the currently tracked “global skills not read over SSH” issue, and more like something specific to Cursor’s remote server / remote extension host path in the macOS client → native Windows remote host setup.

Hey, this is really helpful info, especially VS Code as a control on the same host. I’ll pass this to the engineers as a separate signal, not tied to the skills bug. I can’t share an ETA yet.

A couple things for the report:

  1. In the version you sent, there’s a mismatch between the remote commit and the real commit:

    • Remote server commit: 3a67af7b780e0bfc8d32aefa96b8ff1cb8817f80
    • Real commit: ...f88

    The last two characters differ. This could be related to No bundle location found if the remote server is looking for bundles in the commit folder, but a different version is actually deployed. Can you check %USERPROFILE%\.cursor-server\bin\ on the Windows host and send the list of subfolders? Also show what’s actually inside bin\<commit>\ for the active commit.

  2. If you can, please attach the full Extension Host Remote log file as a file, not a pasted snippet. The path on the Windows host is usually:
    %USERPROFILE%\.cursor-server\data\logs\<date>\exthost\exthost.log

    Also %USERPROFILE%\.cursor-server\data\logs\<date>\remoteagent.log if it exists.

Once you have those, I’ll attach them to the report. If I get an update on the fix, I’ll reply in the thread.

remoteexthost.zip (3.7 KB)

Thanks — I checked %USERPROFILE%\.cursor-server\bin on the Windows host.

What is actually present on disk is:

  • C:\Users\APIE\.cursor-server\bin\win32-x64\3a67af7b780e0bfc8d32aefa96b8ff1cb8817f80

Under that commit folder I see the normal top-level directories:

  • bin

  • extensions

  • node_modules

  • out

Inside extensions, the core Cursor remote extension directories are also present on disk, including:

  • cursor-agent

  • cursor-agent-exec

  • cursor-checkout

  • cursor-commits

  • cursor-explorer

  • cursor-mcp

  • cursor-polyfills-remote

  • cursor-retrieval

  • cursor-shadow-workspace

At least from the folder structure, I do not see a separate ...f88 commit directory on disk. So the remote server that is actually installed appears to be under ...f80, while the metadata I sent earlier reports:

  • commit: 3a67af7b780e0bfc8d32aefa96b8ff1cb8817f80

  • realCommit: 3a67af7b780e0bfc8d32aefa96b8ff1cb8817f88

That seems consistent with your hypothesis that some part of remote extension bundle resolution may be looking for a different commit/version than the one actually present on disk.

I’ve attached the logs in remoteexthost.zip.

Thanks, this really helps narrow things down.

A couple takeaways from the data you shared:

  1. commit vs realCommit in product.json
    Based on the bin\ listing, there is no ...f88 folder on disk. All extensions are physically under ...f80, and the structure looks correct. So the mismatch is metadata inside product.json, not a case where the binary points at a different folder. Most likely this is not the root cause of No bundle location found, even though it still looks odd and I’m noting it.

  2. The real signal in the attached logs
    It’s not No bundle location found since those extensions activate successfully later. The important part is this:

[warning] [ExtHostCursor] Failed to get credentials for OTLP exporter
          Cannot read properties of undefined (reading 'length')
[error] TypeError: Cannot read properties of undefined (reading 'length')
    at i5d.getAccessToken (.../Cursor.app/Contents/Resources/app/...)
    at Qlb.$getCursorAuthToken / $getAuthId
[error] Extension activation failure: anysphere.cursor-agent-exec

cursor-agent-exec is actually failing during activation because getAccessToken on the macOS client throws a TypeError. Without cursor-agent-exec activated, the whole agent and skills chain won’t start properly. That matches the symptom that skills aren’t discovered, even project-level ones. The stack points to the client side (macOS), not the remote host, which also explains why VS Code Remote-SSH to the same Windows host works fine. There is no cursor-agent-exec there, and that code path doesn’t exist.

I’ll track this as a separate signal that’s not tied to the skills bug. I can’t share an ETA for a fix.

A few follow-ups to add to the report:

  1. On the macOS client, is Privacy Mode enabled in Cursor Settings → Privacy? Also, how did you log in, email and password, GitHub, Google, or SSO for Business or Enterprise?
  2. If you fully sign out and sign back in on macOS, then reconnect over SSH to the same Windows host, does the TypeError in getAccessToken still show up in the extension host logs?
  3. On the macOS client, please collect the client logs, not the remote ones. After reconnecting via SSH, grab:
    • Help → Toggle Developer Tools → Console
    • View → Output → Window
    • Log (Main)

These should include client-level messages showing at what step getAccessToken becomes undefined.

If I get an update on the fix, I’ll reply in the thread.