Hmbown/CodeWhale · error

DSH plugin path not available: {reason}

Error message

DSH plugin path not available: {reason}

What it means

`install-bundle` composes bundles through dsh's documented plugin path, which shells out to pnpm (`dsh plugin --profile codewhale add <path>`). Before touching anything it checks `report.bundle_availability`; `NotAvailable { reason }` means the pnpm probe failed — either `pnpm --version` exited non-zero or pnpm could not be executed at all (crates/tui/src/integrations/dsh/bundle.rs:137-142 produces the two reason strings).

Source

Thrown at crates/tui/src/integrations/cli.rs:390

            );
            Ok(())
        }
        DshIntegrationCommand::Enable => {
            let paths = DshPaths::from_process()?;
            let record = dsh::set_disabled(&paths, false)?;
            println!("enabled: {}", record.overlay_path.display());
            Ok(())
        }
        DshIntegrationCommand::InstallBundle { app, yes } => {
            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)");

View on GitHub (pinned to 8880682c63)

Solutions

  1. Install pnpm (`npm i -g pnpm` or `corepack enable && corepack prepare pnpm@latest --activate`) and confirm `pnpm --version` succeeds in the same shell you run Codewhale from
  2. If the reason says exited non-zero, run `pnpm --version` manually to see pnpm's own error output
  3. Check availability without side effects: `codewhale integrations dsh status` prints a `dsh plugin path (bundle):` line
  4. Remember only bundle install/remove needs pnpm — `connect`, `update`, and `launch` never invoke it
Defensive patterns

Strategy: validation

Validate before calling

if !matches!(
    dsh::bundle_availability_now(),
    dsh::BundleAvailability::Available { .. }
) {
    eprintln!("install pnpm first: npm i -g pnpm");
    return Ok(());
}

Type guard

fn pnpm_ready(availability: &dsh::BundleAvailability) -> bool {
    matches!(availability, dsh::BundleAvailability::Available { .. })
}

Prevention

When it happens

Trigger: `install-bundle` when pnpm is absent from PATH, present but broken (bad node shim, wrong architecture, corrupted install), or when `pnpm --version` itself exits non-zero. The `{reason}` says which case it was: 'pnpm could not be run: …' versus 'pnpm --version exited non-zero'.

Common situations: npm-only Node installs; pnpm provided via corepack but corepack not enabled; minimal CI images without pnpm; Windows where pnpm.cmd is not visible to the spawning process's PATH; nvm shim paths missing in non-login shells.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16). Data as JSON: /api/errors/85ce1a8fecc49515. Report an issue: GitHub.