Hmbown/CodeWhale · error
dsh binary path is unknown
Error message
dsh binary path is unknown
What it means
`install-bundle` needs the resolved dsh binary path to locate the shipped app bundle inside the installed launcher (`dsh::bundle::app_bundle_source(binary, app)`). This guard fires when `report.detection.binary` is None — detection found no `dsh` executable on PATH. It is mostly defensive: `ensure_launchable_dsh` normally bails earlier with `NotInstalled`, so reaching this line means PATH or the dsh install changed between the two probes (e.g. dsh was uninstalled concurrently, or PATH differs under sudo).
Source
Thrown at crates/tui/src/integrations/cli.rs:400
let app = dsh::DshAppBundle::parse(&app)
.ok_or_else(|| anyhow::anyhow!("--app must be `web` or `headless`, got `{app}`"))?;
let (paths, report) = status_report(config, workspace, false)?;
ensure_launchable_dsh(&report)?;
let record = report.record.as_ref().ok_or_else(|| {
anyhow::anyhow!("DSH is not connected; run `{CLI_COMMAND} connect` first")
})?;
if let dsh::BundleAvailability::NotAvailable { reason } = &report.bundle_availability {
anyhow::bail!("DSH plugin path not available: {reason}");
}
if matches!(report.state, DshIntegrationState::StaleConfig { .. }) {
anyhow::bail!("overlay is stale; run `{CLI_COMMAND} update` before install-bundle");
}
let app_source = dsh::bundle::app_bundle_source(
report
.detection
.binary
.as_ref()
.ok_or_else(|| anyhow::anyhow!("dsh binary path is unknown"))?,
app,
)?;
let profile_dir = report
.detection
.dsh_home
.join("profiles")
.join(dsh::bundle::BUNDLE_PROFILE);
println!("{RELATIONSHIP_LABEL} — install-bundle plan (nothing written yet)");
println!(
" will write (Codewhale-owned): {}/{{package.json,cordis.patch.yml,README.md,NOTICE.md}}",
paths.bundle_dir.display()
);
println!(
" cordis.patch.yml = the current overlay rows (sha256 {})",
record.overlay_sha256
);
println!(
" will run: dsh plugin --profile {} add {}",View on GitHub (pinned to 8880682c63)
Solutions
- Confirm `which dsh` resolves in the exact shell/environment you invoke Codewhale from
- Reinstall dsh (`npm i -g @deepseek-ai/dsh`) if it was removed mid-flight
- Avoid sudo for this command; dsh detection relies on the user's PATH
- Re-run `codewhale integrations dsh status` — the `dsh binary:` line states plainly whether a binary was found
Defensive patterns
Strategy: validation
Validate before calling
let (_paths, report) = status_report(config, workspace, false)?;
if report.detection.binary.is_none() {
eprintln!("dsh binary not found on PATH; reinstall with npm i -g @deepseek-ai/dsh");
return Ok(());
} Type guard
fn dsh_binary_known(report: &DshStatusReport) -> bool {
report.detection.binary.is_some()
} Prevention
- Invoke dsh subcommands from a login shell where npm global bins are on PATH
- Avoid sudo/service contexts that strip PATH before running integration commands
- Refresh detection (status) immediately before acting on it
When it happens
Trigger: `install-bundle` when dsh vanished from PATH mid-command, when the command runs under a different environment (sudo, service context) where dsh is not on PATH, or when a partially-broken dsh install makes detection record a state without a binary.
Common situations: Running the CLI through sudo or a launchd/systemd context with a stripped PATH; uninstalling or reinstalling dsh while the command runs; nvm/asdf shims not loaded in the invoking shell.
Related errors
- DSH plugin path not available: {reason}
- dsh is not on PATH; install the official DeepSeek Harness fi
- dsh is offline: {reason}
- dsh binary is unknown
- No local {} API key was found in config, the secret store, o
AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16).
Data as JSON: /api/errors/4f2a548eb3b41625.
Report an issue: GitHub.