pbakaus/impeccable · error

Install failed: {e}

Error message

Install failed: {e}

What it means

After downloading the bundle, `install` writes the skill variants, agents, and hooks into the target folders. If that install step returns an error, the message 'Install failed: {e}' is printed, the downloaded bundle temp dir is cleaned up with rm_rf, and the process exits 1.

Source

Thrown at crates/skills/src/commands.rs:705

    sys.migrate_unprefix_impeccable(&install_root, scope_opt);

    let outcome: Result<(Vec<String>, Vec<bundle::AgentResult>, Vec<&'static str>), String> = (|| {
        let written = bundle::copy_provider_skills(&sys, &bundle_dir, &install_root, &targets, scope_opt)?;
        let agents = bundle::copy_provider_agents(&sys, &bundle_dir, &install_root, &targets, scope_opt)?;
        bundle::copy_provider_commands(&sys, &bundle_dir, &install_root, &targets, scope_opt);
        let hooks = if want_hooks {
            copy_provider_hooks(&sys, &bundle_dir, &hook_root, &targets, force, Some(&install_root))?
        } else {
            Vec::new()
        };
        Ok((written, agents, hooks))
    })();
    let (written, agent_results, hook_targets) = match outcome {
        Ok(v) => v,
        Err(e) => {
            util::rm_rf(&bundle_dir);
            err(io, &format!("Install failed: {e}"));
            return Err(Flow::Exit(1));
        }
    };
    util::rm_rf(&bundle_dir);

    if written.is_empty() {
        err(io, &format!("Nothing was installed: the bundle had no variants for {}.", targets.join(", ")));
        return Err(Flow::Exit(1));
    }
    out(io, &format!(
        "Installed impeccable into: {} ({})",
        targets.join(", "),
        if scope == Scope::User { "global" } else { "project" }
    ));
    install_engine_binaries(&sys, io, &written);
    bundle::report_provider_agents(&sys, io, &agent_results);
    if !hook_targets.is_empty() {
        out(io, &format!("Installed hooks into: {}", hook_targets.join(", ")));

View on GitHub (pinned to 2bc2879276)

Solutions

  1. Check write permissions on the target folder (e.g. .claude/) and retry.
  2. Free disk space / resolve filesystem errors reported in the inner error `{e}`.
  3. Delete conflicting or partially installed files and rerun install.
  4. Retry the install; the bundle temp dir is cleaned automatically so state is not stale.

Example fix

// before
$ impeccable install
Install failed: Permission denied (os error 13) writing .claude/skills
// after
$ chmod -R u+w .claude && impeccable install --providers=.claude
Defensive patterns

Strategy: validation

Validate before calling

TARGET=.claude
[ -w "$TARGET" ] || { echo "$TARGET not writable"; exit 1; }

Try / catch

impeccable install --providers=.claude || { echo "install failed: $?"; exit 1; }

Prevention

When it happens

Trigger: `install` when the write/extract-to-target step fails: unwritable target harness folder, missing bundle files for the requested providers, hook-root creation failure, or any error bubbling out of the install closure.

Common situations: Read-only project directories; permission issues in the user home when scope=user; partially corrupted bundle contents; filesystem errors (disk full, path too long); existing conflicting files that cannot be overwritten.

Understand the failure class

Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.

Related errors


AI-assisted analysis of pbakaus/impeccable@2bc2879276 (2026-09-08). Data as JSON: /api/errors/57664e2111873883. Report an issue: GitHub.