Add `--to windsurf` target for the converter CLI with full spec compliance
per docs/specs/windsurf.md:
- Claude agents → Windsurf skills (skills/{name}/SKILL.md)
- Claude commands → Windsurf workflows (workflows/{name}.md, flat)
- Pass-through skills copy unchanged
- MCP servers → mcp_config.json (merged with existing, 0o600 permissions)
- Hooks skipped with warning, CLAUDE.md skipped
Global scope support via generic --scope flag (Windsurf as first adopter):
- --to windsurf defaults to global (~/.codeium/windsurf/)
- --scope workspace for project-level .windsurf/ output
- --output overrides scope-derived paths
Shared utilities extracted (resolveTargetOutputRoot, hasPotentialSecrets)
to eliminate duplication across CLI commands.
68 new tests (converter, writer, scope resolution).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import os from "os"
|
|
import path from "path"
|
|
import type { TargetScope } from "../targets"
|
|
|
|
export function resolveTargetOutputRoot(options: {
|
|
targetName: string
|
|
outputRoot: string
|
|
codexHome: string
|
|
piHome: string
|
|
hasExplicitOutput: boolean
|
|
scope?: TargetScope
|
|
}): string {
|
|
const { targetName, outputRoot, codexHome, piHome, hasExplicitOutput, scope } = options
|
|
if (targetName === "codex") return codexHome
|
|
if (targetName === "pi") return piHome
|
|
if (targetName === "droid") return path.join(os.homedir(), ".factory")
|
|
if (targetName === "cursor") {
|
|
const base = hasExplicitOutput ? outputRoot : process.cwd()
|
|
return path.join(base, ".cursor")
|
|
}
|
|
if (targetName === "gemini") {
|
|
const base = hasExplicitOutput ? outputRoot : process.cwd()
|
|
return path.join(base, ".gemini")
|
|
}
|
|
if (targetName === "copilot") {
|
|
const base = hasExplicitOutput ? outputRoot : process.cwd()
|
|
return path.join(base, ".github")
|
|
}
|
|
if (targetName === "kiro") {
|
|
const base = hasExplicitOutput ? outputRoot : process.cwd()
|
|
return path.join(base, ".kiro")
|
|
}
|
|
if (targetName === "windsurf") {
|
|
if (hasExplicitOutput) return outputRoot
|
|
if (scope === "global") return path.join(os.homedir(), ".codeium", "windsurf")
|
|
return path.join(process.cwd(), ".windsurf")
|
|
}
|
|
return outputRoot
|
|
}
|