deepseek-ai/deepseek-harness · error · Error
dsh: ${link} exists and is not a symlink; remove it so dsh c
Error message
dsh: ${link} exists and is not a symlink; remove it so dsh can manage the installation fallback What it means
Error "dsh: ${link} exists and is not a symlink; remove it so dsh can manage the installation fallback" thrown in deepseek-ai/deepseek-harness.
Source
Thrown at packages/boot/app-boot/src/profile.ts:182
const patchPath = join(dir, PROFILE_PATCH_FILENAME)
if (!existsSync(patchPath)) writeFileSync(patchPath, PROFILE_PATCH_TEMPLATE)
const workspacePath = join(dir, 'pnpm-workspace.yaml')
if (!existsSync(workspacePath)) writeFileSync(workspacePath, PROFILE_PNPM_WORKSPACE)
}
/** Ensure `link` is a symlink to `target`, replacing a wrong or dangling link; a real directory throws. */
function ensureSymlink(link: string, target: string): void {
let stat
try {
stat = lstatSync(link)
} catch {
// Missing link (first run) — created below. Any other lstat failure on a
// path we just created the parent of would resurface on symlinkSync.
stat = undefined
}
if (stat !== undefined) {
if (!stat.isSymbolicLink()) {
throw new Error(`dsh: ${link} exists and is not a symlink; remove it so dsh can manage the installation fallback`)
}
if (readlinkSync(link) === target) return
// unlink deletes the reparse point itself on Windows too; rmSync treats a
// junction as a directory and throws EISDIR unless recursive.
unlinkSync(link)
}
try {
symlinkSync(target, link, 'junction')
} catch (error) {
// Concurrent launches heal the same fallback; losing the race to a
// process writing the identical link is success, anything else is not.
// The window between the lstat miss above and this write cannot be
// staged deterministically from the public API.
/* v8 ignore next 4 */
if ((error as NodeJS.ErrnoException).code !== 'EEXIST'
|| !lstatSync(link).isSymbolicLink() || readlinkSync(link) !== target) {
throw error
}View on GitHub (pinned to b150a551b8)
Solutions
- Remove the non-symlink path so dsh can manage the installation fallback.
When it happens
Trigger: Thrown at packages/boot/app-boot/src/profile.ts:182 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of deepseek-ai/deepseek-harness@b150a551b8 (2026-08-24).
Data as JSON: /api/errors/8feda21a5904537e.
Report an issue: GitHub.