diff --git a/README.md b/README.md index 7a10115e..4c15aa0d 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ npx get-shit-done-cc --cursor --global # Install to ~/.cursor/ npx get-shit-done-cc --cursor --local # Install to ./.cursor/ # Windsurf -npx get-shit-done-cc --windsurf --global # Install to ~/.windsurf/ +npx get-shit-done-cc --windsurf --global # Install to ~/.codeium/windsurf/ npx get-shit-done-cc --windsurf --local # Install to ./.windsurf/ # Antigravity diff --git a/bin/install.js b/bin/install.js index e58210da..a3e0e168 100755 --- a/bin/install.js +++ b/bin/install.js @@ -303,14 +303,14 @@ function getGlobalDir(runtime, explicitDir = null) { } if (runtime === 'windsurf') { - // Windsurf: --config-dir > WINDSURF_CONFIG_DIR > ~/.windsurf + // Windsurf: --config-dir > WINDSURF_CONFIG_DIR > ~/.codeium/windsurf if (explicitDir) { return expandTilde(explicitDir); } if (process.env.WINDSURF_CONFIG_DIR) { return expandTilde(process.env.WINDSURF_CONFIG_DIR); } - return path.join(os.homedir(), '.windsurf'); + return path.join(os.homedir(), '.codeium', 'windsurf'); } if (runtime === 'augment') { @@ -1122,7 +1122,7 @@ function convertClaudeAgentToCursorAgent(content) { // --- Windsurf converters --- // Windsurf uses a tool set similar to Cursor. -// Config lives in .windsurf/ (local) and ~/.windsurf/ (global). +// Config lives in .windsurf/ (local) and ~/.codeium/windsurf/ (global). // Tool name mapping from Claude Code to Windsurf Cascade const claudeToWindsurfTools = { @@ -3572,7 +3572,7 @@ function copyCommandsAsWindsurfSkills(srcDir, skillsDir, prefix, pathPrefix, run const globalClaudeRegex = /~\/\.claude\//g; const globalClaudeHomeRegex = /\$HOME\/\.claude\//g; const localClaudeRegex = /\.\/\.claude\//g; - const windsurfDirRegex = /~\/\.windsurf\//g; + const windsurfDirRegex = /~\/\.codeium\/windsurf\//g; content = content.replace(globalClaudeRegex, pathPrefix); content = content.replace(globalClaudeHomeRegex, pathPrefix); content = content.replace(localClaudeRegex, `./${getDirName(runtime)}/`); @@ -5965,7 +5965,7 @@ function promptRuntime(callback) { ${cyan}8${reset}) Kilo ${dim}(~/.config/kilo)${reset} ${cyan}9${reset}) OpenCode ${dim}(~/.config/opencode)${reset} ${cyan}10${reset}) Trae ${dim}(~/.trae)${reset} - ${cyan}11${reset}) Windsurf ${dim}(~/.windsurf)${reset} + ${cyan}11${reset}) Windsurf ${dim}(~/.codeium/windsurf)${reset} ${cyan}12${reset}) All ${dim}Select multiple: 1,2,6 or 1 2 6${reset} diff --git a/tests/windsurf-install.test.cjs b/tests/windsurf-install.test.cjs new file mode 100644 index 00000000..35ef1ab0 --- /dev/null +++ b/tests/windsurf-install.test.cjs @@ -0,0 +1,52 @@ +process.env.GSD_TEST_MODE = '1'; + +const { describe, test, beforeEach, afterEach } = require('node:test'); +const assert = require('node:assert/strict'); +const os = require('os'); +const path = require('path'); + +const { getGlobalDir } = require('../bin/install.js'); + +describe('getGlobalDir (Windsurf)', () => { + let originalWindsurfConfigDir; + + beforeEach(() => { + originalWindsurfConfigDir = process.env.WINDSURF_CONFIG_DIR; + delete process.env.WINDSURF_CONFIG_DIR; + }); + + afterEach(() => { + if (originalWindsurfConfigDir !== undefined) { + process.env.WINDSURF_CONFIG_DIR = originalWindsurfConfigDir; + } else { + delete process.env.WINDSURF_CONFIG_DIR; + } + }); + + test('returns ~/.codeium/windsurf with no env var or explicit dir', () => { + const result = getGlobalDir('windsurf'); + assert.strictEqual(result, path.join(os.homedir(), '.codeium', 'windsurf')); + }); + + test('returns explicit dir when provided', () => { + const result = getGlobalDir('windsurf', '/custom/windsurf-path'); + assert.strictEqual(result, '/custom/windsurf-path'); + }); + + test('respects WINDSURF_CONFIG_DIR env var', () => { + process.env.WINDSURF_CONFIG_DIR = '~/custom-windsurf'; + const result = getGlobalDir('windsurf'); + assert.strictEqual(result, path.join(os.homedir(), 'custom-windsurf')); + }); + + test('explicit dir takes priority over WINDSURF_CONFIG_DIR', () => { + process.env.WINDSURF_CONFIG_DIR = '~/from-env'; + const result = getGlobalDir('windsurf', '/explicit/path'); + assert.strictEqual(result, '/explicit/path'); + }); + + test('does not break other runtimes', () => { + assert.strictEqual(getGlobalDir('claude'), path.join(os.homedir(), '.claude')); + assert.strictEqual(getGlobalDir('codex'), path.join(os.homedir(), '.codex')); + }); +});