diff --git a/tests/bug-983-trae-windsurf-claude-path-leak.test.cjs b/tests/bug-983-trae-windsurf-claude-path-leak.test.cjs index 228679664..64bd4e2e0 100644 --- a/tests/bug-983-trae-windsurf-claude-path-leak.test.cjs +++ b/tests/bug-983-trae-windsurf-claude-path-leak.test.cjs @@ -29,24 +29,24 @@ const { // ─── Windsurf converter bare-form tests ───────────────────────────────────── describe('convertClaudeToWindsurfMarkdown — bare ~/.claude and CLAUDE_CONFIG_DIR (#983)', () => { - test('bare ~/.claude rewritten to ~/.devin (#1085: workspace dir is now .devin)', () => { + test('bare ~/.claude rewritten to ~/.windsurf (#1615: workspace dir is now .windsurf)', () => { const input = 'Config dir: (~/.claude), skills at ~/.claude/skills'; const result = convertClaudeToWindsurfMarkdown(input); assert.ok( !/~\/\.claude(?![\w-])/.test(result), `bare ~/.claude must be rewritten; got: ${result}`, ); - assert.ok(result.includes('~/.devin'), 'must rewrite to ~/.devin'); + assert.ok(result.includes('~/.windsurf'), 'must rewrite to ~/.windsurf'); }); - test('$HOME/.claude rewritten to $HOME/.devin (#1085: workspace dir is now .devin)', () => { + test('$HOME/.claude rewritten to $HOME/.windsurf (#1615: workspace dir is now .windsurf)', () => { const input = 'RUNTIME_CONFIG_DIR="${CLAUDE_CONFIG_DIR:-$HOME/.claude}"'; const result = convertClaudeToWindsurfMarkdown(input); assert.ok( !/\$HOME\/\.claude(?![\w-])/.test(result), `bare $HOME/.claude must be rewritten; got: ${result}`, ); - assert.ok(result.includes('$HOME/.devin'), 'must rewrite to $HOME/.devin'); + assert.ok(result.includes('$HOME/.windsurf'), 'must rewrite to $HOME/.windsurf'); }); test('CLAUDE_CONFIG_DIR rewritten to WINDSURF_CONFIG_DIR', () => { diff --git a/tests/capability-registry.test.cjs b/tests/capability-registry.test.cjs index b14080a96..b44fd07b2 100644 --- a/tests/capability-registry.test.cjs +++ b/tests/capability-registry.test.cjs @@ -3913,9 +3913,9 @@ describe('ADR-1016 phase 5a: closed-vocab set exports', () => { // ─── 25. ADR-857 phase 5e: closed ConverterName enum (Part B) ───────────────── describe('ADR-857 phase 5e: VALID_CONVERTER_NAMES closed enum', () => { - test('VALID_CONVERTER_NAMES has exactly 24 entries (15 command/skill + 9 agent converters added in #1173)', () => { + test('VALID_CONVERTER_NAMES has exactly 25 entries (16 command/skill/workflow + 9 agent converters)', () => { assert.ok(VALID_CONVERTER_NAMES instanceof Set, 'VALID_CONVERTER_NAMES must be a Set'); - assert.strictEqual(VALID_CONVERTER_NAMES.size, 24, 'VALID_CONVERTER_NAMES must have exactly 24 entries, got: ' + VALID_CONVERTER_NAMES.size); + assert.strictEqual(VALID_CONVERTER_NAMES.size, 25, 'VALID_CONVERTER_NAMES must have exactly 25 entries, got: ' + VALID_CONVERTER_NAMES.size); }); test('VALID_CONVERTER_NAMES contains all expected converter names', () => { @@ -3936,6 +3936,7 @@ describe('ADR-857 phase 5e: VALID_CONVERTER_NAMES closed enum', () => { 'convertClaudeCommandToOpencodeSkill', 'convertClaudeCommandToTraeSkill', 'convertClaudeCommandToWindsurfSkill', + 'convertClaudeCommandToWindsurfWorkflow', // agent converters (#1173 — descriptor-driven agent conversion wiring) 'convertClaudeAgentToCopilotAgent', 'convertClaudeAgentToAntigravityAgent', diff --git a/tests/cline-install.test.cjs b/tests/cline-install.test.cjs index 19365ff87..a0064cba9 100644 --- a/tests/cline-install.test.cjs +++ b/tests/cline-install.test.cjs @@ -194,6 +194,9 @@ describe('Cline install (local)', () => { } else if (entry.name.endsWith('.md') || entry.name.endsWith('.cjs') || entry.name.endsWith('.js')) { // CHANGELOG.md is a historical record and is not path-converted — skip it if (entry.name === 'CHANGELOG.md') continue; + // Converter source contains literal Claude source-path templates used before + // runtime-specific install rewrites; this test is only for deployed Cline payload leaks. + if (entry.name === 'runtime-artifact-conversion.cjs') continue; const content = fs.readFileSync(fullPath, 'utf8'); // Check for GSD install paths that should have been substituted. // profile-pipeline.cjs intentionally references ~/.claude/projects (Claude Code diff --git a/tests/enh-1510-rewrite-engine-helper-relocation.test.cjs b/tests/enh-1510-rewrite-engine-helper-relocation.test.cjs index cf3af77c2..911b10a1c 100644 --- a/tests/enh-1510-rewrite-engine-helper-relocation.test.cjs +++ b/tests/enh-1510-rewrite-engine-helper-relocation.test.cjs @@ -29,7 +29,7 @@ describe('getDirName (relocated to runtime-name-policy)', () => { codex: '.codex', antigravity: '.agents', cursor: '.cursor', - windsurf: '.devin', + windsurf: '.windsurf', augment: '.augment', trae: '.trae', qwen: '.qwen', diff --git a/tests/install-nested-layout.test.cjs b/tests/install-nested-layout.test.cjs index f9e23f70e..7e1136632 100644 --- a/tests/install-nested-layout.test.cjs +++ b/tests/install-nested-layout.test.cjs @@ -48,7 +48,6 @@ const FLAT = [ { runtime: 'cursor', scope: 'global', skillsSub: 'skills' }, { runtime: 'codex', scope: 'global', skillsSub: 'skills' }, { runtime: 'copilot', scope: 'global', skillsSub: 'skills' }, - { runtime: 'windsurf', scope: 'global', skillsSub: 'skills' }, { runtime: 'codebuddy', scope: 'global', skillsSub: 'skills' }, { runtime: 'opencode', scope: 'global', skillsSub: 'skills' }, { runtime: 'kilo', scope: 'global', skillsSub: 'skills' }, diff --git a/tests/installer-migration-install.integration.test.cjs b/tests/installer-migration-install.integration.test.cjs index d701beb25..f90defac8 100644 --- a/tests/installer-migration-install.integration.test.cjs +++ b/tests/installer-migration-install.integration.test.cjs @@ -39,7 +39,7 @@ const RUNTIME_INSTALL_CONTRACTS = { opencode: { surface: 'flat-command', settings: true, packageJson: true }, qwen: { surface: 'flat-skills', settings: true, packageJson: true }, trae: { surface: 'flat-skills', settings: false, packageJson: false }, - windsurf: { surface: 'flat-skills', settings: false, packageJson: false }, + windsurf: { surface: 'global-artifacts-noop', settings: false, packageJson: false }, }; function sha256(content) { @@ -261,9 +261,20 @@ function assertFreshInstallContract(runtime, targetDir) { /GSD workflows live in `gsd-core\/workflows\/`/, 'Cline should install .clinerules/gsd.md guidance' ); + } else if (contract.surface === 'global-artifacts-noop') { + assert.equal( + fs.existsSync(path.join(targetDir, 'skills')), + false, + `${runtime} should not install unsupported global skills artifacts` + ); + assert.equal( + fs.existsSync(path.join(targetDir, 'workflows')), + false, + `${runtime} should not install unsupported global workflow artifacts` + ); } - if (contract.surface !== 'kimi-skills-agents') { + if (contract.surface !== 'kimi-skills-agents' && contract.surface !== 'global-artifacts-noop') { assert.ok( listDirNames(targetDir, 'agents').some((name) => name.startsWith('gsd-')), `${runtime} full install should install agents`