From 7e828e710c531b7716dff4b17fc5bc843b24d234 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Tue, 18 Aug 2026 13:37:33 +0000 Subject: [PATCH 1/2] docs: rebrand windsurf references to devin desktop Windsurf rebranded to Devin Desktop in June 2026. Updates user-facing prose and code comments to reflect the current name while preserving functional identifiers that did not change: - codeium.windsurf-remote-openssh stays the Remote-SSH extension ID; Devin Desktop still ships it. - remote.devinSSH.configFile / remote.windsurfSSH.configFile handling is unchanged, since both settings namespaces exist across editor versions. - CHANGELOG.md history is untouched. Test fixtures that stood in for a generic foreign editor (WINDSURF_AUTHORITY, WINDSURF_REMOTE_AUTHORITY) are renamed to Devin equivalents; they don't test Windsurf-specific behavior. --- CONTRIBUTING.md | 2 +- README.md | 8 ++++---- src/extension.ts | 2 +- src/remote/sshProcess.ts | 4 ++-- src/supportBundle/remoteServerDataPath.ts | 2 +- src/util.ts | 2 +- test/unit/remote/remote.test.ts | 6 +++--- test/unit/util.test.ts | 2 +- test/unit/util/authority.test.ts | 7 +++---- 9 files changed, 17 insertions(+), 18 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7c923aec47..382eefcfb2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,7 +15,7 @@ indicates that it should connect to the provided host name using SSH. The host name takes the format `coder-.----`, where `` comes from -that product's URI scheme, such as `vscode`, `cursor`, or `windsurf`. The CLI is +that product's URI scheme, such as `vscode`, `cursor`, or `devin`. The CLI is invoked through SSH's `ProxyCommand` with this prefix so it can route SSH to the right workspace. A legacy `coder-vscode` authority opened in another editor is reopened once with that editor's prefix; legacy recent-folder entries remain diff --git a/README.md b/README.md index 4c981606de..7588f51956 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ The Coder Remote extension connects your editor to - **One-click workspace access** - open workspaces from the Coder dashboard or the editor sidebar. Workspaces start automatically when opened. -- **Multi-editor support** - works with VS Code, Cursor, Windsurf, and other - VS Code forks. +- **Multi-editor support** - works with VS Code, Cursor, Devin Desktop + (formerly Windsurf), and other VS Code forks. - **Workspace sidebar** - browse, search, and create workspaces. View agent metadata and app statuses at a glance. - **Coder Tasks** - create, monitor, and manage AI agent tasks directly from @@ -34,7 +34,7 @@ The Coder Remote extension connects your editor to > The extension builds on VS Code-provided implementations of SSH. Make sure you > have the correct SSH extension installed for your editor > (`ms-vscode-remote.remote-ssh`, `anysphere.remote-ssh` for Cursor, or -> `codeium.windsurf-remote-openssh` for Windsurf). +> `codeium.windsurf-remote-openssh` for Devin Desktop). ## Getting Started @@ -71,7 +71,7 @@ values can depend on the specific machine or network where they were set. The extension registers a URI handler that can open workspaces from outside the editor, such as links on the Coder dashboard. The scheme matches the -editor (`vscode://`, `cursor://`, `windsurf://`, etc.), followed by the +editor (`vscode://`, `cursor://`, `devin://`, etc.), followed by the extension ID and a path: ```text diff --git a/src/extension.ts b/src/extension.ts index 54810882b7..40d03ca6b1 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -60,7 +60,7 @@ async function doActivate( // This is janky, but that's alright since it provides such minimal // functionality to the extension. // - // Cursor and VSCode are covered by ms remote, and the only other is windsurf for now + // Cursor and VSCode are covered by ms remote, and the only other is Devin Desktop for now // Means that vscodium is not supported by this for now const remoteSshExtension = getRemoteSshExtension(); diff --git a/src/remote/sshProcess.ts b/src/remote/sshProcess.ts index 3b48189961..12dfd61497 100644 --- a/src/remote/sshProcess.ts +++ b/src/remote/sshProcess.ts @@ -488,7 +488,7 @@ export class SshProcessMonitor implements vscode.Disposable { /** * Finds the Remote SSH extension's log file path. - * Tries extension-specific folder first (Cursor, Windsurf, Antigravity), + * Tries extension-specific folder first (Cursor, Devin Desktop, Antigravity), * then output_logging_ fallback (MS VS Code). */ async function findRemoteSshLogPath( @@ -498,7 +498,7 @@ async function findRemoteSshLogPath( ): Promise { const logsParentDir = path.dirname(codeLogDir); - // Try extension-specific folder (for VS Code clones like Cursor, Windsurf) + // Try extension-specific folder (for VS Code clones like Cursor, Devin Desktop) try { const extensionLogDir = path.join(logsParentDir, extensionId); const remoteSshLog = await findSshLogInDir(extensionLogDir); diff --git a/src/supportBundle/remoteServerDataPath.ts b/src/supportBundle/remoteServerDataPath.ts index 8cb6b6a029..4a9f79a982 100644 --- a/src/supportBundle/remoteServerDataPath.ts +++ b/src/supportBundle/remoteServerDataPath.ts @@ -106,7 +106,7 @@ function getConfiguredServerDataPath( "serverInstallPath", {}, ); - // Windsurf and Antigravity have no install path setting; their + // Devin Desktop and Antigravity have no install path setting; their // servers always live in the home default. let installPath: string | undefined; if (extensionId === "jeanp413.open-remote-ssh") { diff --git a/src/util.ts b/src/util.ts index 979700c614..800369b508 100644 --- a/src/util.ts +++ b/src/util.ts @@ -24,7 +24,7 @@ export function findPort(text: string): number | null { const lastMatch = allMatches[allMatches.length - 1]; // Each capture group corresponds to a different Remote SSH extension log format: // [0] full match, [1] and [2] ms-vscode-remote.remote-ssh, - // [3] windsurf/open-remote-ssh/antigravity, [4] anysphere.remote-ssh + // [3] devin/open-remote-ssh/antigravity, [4] anysphere.remote-ssh const portStr = lastMatch[1] || lastMatch[2] || lastMatch[3] || lastMatch[4]; if (!portStr) { return null; diff --git a/test/unit/remote/remote.test.ts b/test/unit/remote/remote.test.ts index 5bdba8bdd4..04d58288c5 100644 --- a/test/unit/remote/remote.test.ts +++ b/test/unit/remote/remote.test.ts @@ -35,8 +35,8 @@ const REMOTE_AUTHORITY = "ssh-remote+coder-vscode.coder.example.com--testuser--test-workspace.main"; const CURSOR_REMOTE_AUTHORITY = "ssh-remote+coder-cursor.coder.example.com--testuser--test-workspace.main"; -const WINDSURF_REMOTE_AUTHORITY = - "ssh-remote+coder-windsurf.coder.example.com--testuser--test-workspace.main"; +const DEVIN_REMOTE_AUTHORITY = + "ssh-remote+coder-devin.coder.example.com--testuser--test-workspace.main"; const REMOTE_SSH_EXTENSION_ID = "anysphere.remote-ssh"; const MISMATCHED_URL = "https://cursor.example.com/private?token=sensitive-url-token"; @@ -277,7 +277,7 @@ describe("Remote", () => { const { remote, ensureLoggedInWithDialog, mementoManager } = createRemote(); await expect( - remote.setup(WINDSURF_REMOTE_AUTHORITY, "none", REMOTE_SSH_EXTENSION_ID), + remote.setup(DEVIN_REMOTE_AUTHORITY, "none", REMOTE_SSH_EXTENSION_ID), ).resolves.toBeUndefined(); expect(ensureLoggedInWithDialog).not.toHaveBeenCalled(); diff --git a/test/unit/util.test.ts b/test/unit/util.test.ts index d9e9128165..91667ab5bd 100644 --- a/test/unit/util.test.ts +++ b/test/unit/util.test.ts @@ -229,7 +229,7 @@ describe("findPort", () => { 54321, ], [ - "windsurf/open-remote-ssh/antigravity", + "devin/open-remote-ssh/antigravity", "[INFO] Connection => 9999(socks) => target", 9999, ], diff --git a/test/unit/util/authority.test.ts b/test/unit/util/authority.test.ts index 7bd694638d..e54ec248e8 100644 --- a/test/unit/util/authority.test.ts +++ b/test/unit/util/authority.test.ts @@ -14,8 +14,7 @@ import { const env = vscode.env as typeof vscode.env & { uriScheme: string }; const CURSOR_AUTHORITY = "ssh-remote+coder-cursor.dev.coder.com--foo--bar.main"; const LEGACY_AUTHORITY = "ssh-remote+coder-vscode.dev.coder.com--foo--bar.main"; -const WINDSURF_AUTHORITY = - "ssh-remote+coder-windsurf.dev.coder.com--foo--bar.main"; +const DEVIN_AUTHORITY = "ssh-remote+coder-devin.dev.coder.com--foo--bar.main"; const parts = (prefix: string): AuthorityParts => ({ agent: "main", @@ -82,7 +81,7 @@ describe("parseRemoteAuthority", () => { expect(parseRemoteAuthority("ssh-remote+coder-vscode")).toBeNull(); env.uriScheme = "cursor"; expect( - parseRemoteAuthority("ssh-remote+coder-windsurf.dev.coder.com--foo"), + parseRemoteAuthority("ssh-remote+coder-devin.dev.coder.com--foo"), ).toBeNull(); }); @@ -223,7 +222,7 @@ describe("authority migration", () => { authority: "ssh-remote+coder-vscode", expected: false, }, - { label: "foreign", authority: WINDSURF_AUTHORITY, expected: false }, + { label: "foreign", authority: DEVIN_AUTHORITY, expected: false }, { label: "different wrapper", authority: `dev-container+abc@${LEGACY_AUTHORITY}`, From 9a0313536171d2907515190dcf3d3d01a587853a Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Wed, 19 Aug 2026 19:29:40 +0500 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Ehab Younes --- CONTRIBUTING.md | 2 +- src/extension.ts | 2 +- src/remote/sshProcess.ts | 2 +- src/supportBundle/remoteServerDataPath.ts | 2 +- src/util.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 382eefcfb2..5f5d53fa9a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,7 +15,7 @@ indicates that it should connect to the provided host name using SSH. The host name takes the format `coder-.----`, where `` comes from -that product's URI scheme, such as `vscode`, `cursor`, or `devin`. The CLI is +that product's URI scheme, such as `vscode`, `cursor`, or `devin`/`windsurf`. The CLI is invoked through SSH's `ProxyCommand` with this prefix so it can route SSH to the right workspace. A legacy `coder-vscode` authority opened in another editor is reopened once with that editor's prefix; legacy recent-folder entries remain diff --git a/src/extension.ts b/src/extension.ts index 40d03ca6b1..e5733b0bb2 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -60,7 +60,7 @@ async function doActivate( // This is janky, but that's alright since it provides such minimal // functionality to the extension. // - // Cursor and VSCode are covered by ms remote, and the only other is Devin Desktop for now + // Cursor and VSCode are covered by ms remote, and the only other are Devin Desktop / Windsurf for now // Means that vscodium is not supported by this for now const remoteSshExtension = getRemoteSshExtension(); diff --git a/src/remote/sshProcess.ts b/src/remote/sshProcess.ts index 12dfd61497..f6b20ec0c7 100644 --- a/src/remote/sshProcess.ts +++ b/src/remote/sshProcess.ts @@ -488,7 +488,7 @@ export class SshProcessMonitor implements vscode.Disposable { /** * Finds the Remote SSH extension's log file path. - * Tries extension-specific folder first (Cursor, Devin Desktop, Antigravity), + * Tries extension-specific folder first (Cursor, Devin Desktop / Windsurf, Antigravity), * then output_logging_ fallback (MS VS Code). */ async function findRemoteSshLogPath( diff --git a/src/supportBundle/remoteServerDataPath.ts b/src/supportBundle/remoteServerDataPath.ts index 4a9f79a982..0688439cbb 100644 --- a/src/supportBundle/remoteServerDataPath.ts +++ b/src/supportBundle/remoteServerDataPath.ts @@ -106,7 +106,7 @@ function getConfiguredServerDataPath( "serverInstallPath", {}, ); - // Devin Desktop and Antigravity have no install path setting; their + // Devin Desktop / Windsurf and Antigravity have no install path setting; their // servers always live in the home default. let installPath: string | undefined; if (extensionId === "jeanp413.open-remote-ssh") { diff --git a/src/util.ts b/src/util.ts index 800369b508..87199e041c 100644 --- a/src/util.ts +++ b/src/util.ts @@ -24,7 +24,7 @@ export function findPort(text: string): number | null { const lastMatch = allMatches[allMatches.length - 1]; // Each capture group corresponds to a different Remote SSH extension log format: // [0] full match, [1] and [2] ms-vscode-remote.remote-ssh, - // [3] devin/open-remote-ssh/antigravity, [4] anysphere.remote-ssh + // [3] devin/windsurf/open-remote-ssh/antigravity, [4] anysphere.remote-ssh const portStr = lastMatch[1] || lastMatch[2] || lastMatch[3] || lastMatch[4]; if (!portStr) { return null;