Skip to content

[Bug]: bundle update suggests unsupported --force after extension refresh failure #3424

Description

@grafvonb

Bug Description

specify bundle update --all can fail when a bundle owns an already-installed extension, then suggests retrying with --force.

However, specify bundle update does not support --force, so the suggested recovery path is invalid.

This looks like a mismatch between bundle refresh semantics and lower-level extension install semantics.

Steps to Reproduce

  1. Have a Spec Kit project with an installed bundle that owns the git extension.

  2. Run:

    specify bundle update --all
  3. Observe that the command fails because git is already installed.

  4. Follow the suggested recovery and run:

    specify bundle update --all --force
  5. Observe that --force is rejected because bundle update has no such option.

Expected Behavior

specify bundle update --all should refresh bundle-owned installed components successfully.

If refresh cannot proceed, the error should provide a valid bundle-level recovery path and should not suggest --force unless bundle update actually supports it.

Actual Behavior

The first command fails with an extension-level duplicate-install error:

Error: Failed to install bundle 'basic-speckit-c8volt-stack': Extension 'git' is already installed. Use 'specify extension remove git' first, or retry with --force to overwrite.. No changes were recorded.

Retrying with the suggested --force flag fails because bundle update does not expose that option:

Usage: specify bundle update [OPTIONS] [BUNDLE_ID]
Try 'specify bundle update --help' for help.
╭─ Error ─────────────────────────────────────────────────────────────────╮
│ No such option: --force                                                 │
╰─────────────────────────────────────────────────────────────────────────╯

Specify CLI Version

0.12.8

AI Agent

GitHub Copilot

Operating System

macOS Tahoe 26.5.1

Python Version

3.13.5

Error Logs

❯ specify bundle update --all
Error: Failed to install bundle 'basic-speckit-c8volt-stack': Extension 'git' is already installed. Use 'specify extension remove git' first, or retry
with --force to overwrite.. No changes were recorded.

❯ specify bundle update --all --force
Usage: specify bundle update [OPTIONS] [BUNDLE_ID]
Try 'specify bundle update --help' for help.
╭─ Error ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ No such option: --force                                                                                                                              │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Additional Context

From local inspection, bundle update calls install_bundle(..., refresh=True). For owned existing components, _refresh_component() prefers a primitive refresh() hook, but DefaultPrimitiveInstaller currently does not implement one, so it falls back to installer.install(...).

For extensions, plain install rejects already-installed extensions unless force=True, producing the leaked extension-level message.

This appears broader than wording: bundle update documents refresh semantics, but the real default primitive adapter can fall back to duplicate install semantics for extensions.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions