pbakaus/impeccable · warning

Update failed: Aborted.

Error message

Update failed: Aborted.

What it means

If the user aborts the hook-installation prompt during `update` (e.g. answering 'no'/cancelling at decide_hook_install), the abort is surfaced as 'Update failed: Aborted.' with exit code 1. A comment notes the JS version's try/catch swallowed the prompt abort and printed its own message instead.

Source

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

        util::rm_rf(&tmp_dir);
        return match outcome {
            Ok(hook_targets) => {
                let v = sys.get_skills_version(&root, scope);
                out(io, &format!("Skills are up to date{}.", version_suffix(&v)));
                if !hook_targets.is_empty() {
                    out(io, &format!("Installed hooks into: {}", hook_targets.join(", ")));
                }
                out(io, "Nothing else to do.");
                Err(Flow::Exit(0))
            }
            Err(Flow::Throw(e)) => {
                err(io, &format!("Update failed: {e}"));
                Err(Flow::Exit(1))
            }
            // JS: the try/catch around decideHookInstall swallows the prompt
            // abort too, printing its message.
            Err(Flow::Abort) => {
                err(io, "Update failed: Aborted.");
                Err(Flow::Exit(1))
            }
            Err(other) => Err(other),
        };
    }

    out(io, &format!("Found skills in: {}", copy_providers.join(", ")));

    if !yes {
        let ans = prompt.ask(io, &format!("Update skills in {} provider folder(s)? (Y/n) ", copy_providers.len()))?;
        if ans == "n" || ans == "no" {
            util::rm_rf(&tmp_dir);
            out(io, "Aborted.");
            return Err(Flow::Exit(0));
        }
    }

    let outcome: R<()> = (|| {

View on GitHub (pinned to 2bc2879276)

Solutions

  1. Pass --no-hooks to skip hook installation and its prompt entirely.
  2. Pass --yes to auto-accept prompts in scripts/CI.
  3. Provide a TTY/stdin when running update non-interactively.

Example fix

// before (CI, no TTY)
impeccable update  # Update failed: Aborted.
// after
impeccable update --no-hooks --yes
Defensive patterns

Strategy: fallback

Validate before calling

[ -t 0 ] || { echo "non-interactive shell: use --yes/--no-hooks"; }

Try / catch

impeccable update --no-hooks || impeccable update --no-hooks --yes

Prevention

When it happens

Trigger: `update` when the interactive hook-install prompt is declined or cancelled by the user, producing Flow::Abort; happens only when hooks are being considered (no --no-hooks) and the prompt runs without --yes.

Common situations: Users cancelling the prompt in CI (no TTY) or accidentally; scripted runs where stdin is closed so the prompt aborts; users who do not want hooks but ran update without --no-hooks.

Related errors


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