github/spec-kit · error · BundlerError

Bundle '{target}' is not installed.

Error message

Bundle '{target}' is not installed.

What it means

During bundle update, the requested target id does not match any record in the project's installed-bundle records (load_records(project_root)). The update loop checks membership before resolving, so an unknown id fails fast with a clear message instead of resolving an arbitrary catalog bundle you never installed.

Source

Thrown at src/specify_cli/commands/bundle/__init__.py:472

            raise BundlerError("Specify a bundle id or use --all.")
        targets = (
            [r.bundle_id for r in records]
            if all_bundles
            else [bundle_id]
        )
        if not targets:
            console.print("[yellow]No installed bundles to update.[/yellow]")
            return

        stack = _build_stack(project_root, offline=offline)
        from ...bundler.services.adapters import DefaultPrimitiveInstaller
        from ...bundler.services.installer import install_bundle
        from ...bundler.services.resolver import resolve_install_plan

        installer = DefaultPrimitiveInstaller(allow_network=not offline)
        for target in targets:
            if not any(r.bundle_id == target for r in records):
                raise BundlerError(f"Bundle '{target}' is not installed.")
            resolved = stack.resolve(target)
            if not resolved.install_allowed:
                raise BundlerError(
                    f"Bundle '{target}' resolves only from a discovery-only source "
                    f"('{resolved.source.id}'); it cannot be updated from there. "
                    "Update requires an install-allowed source (FR-025)."
                )
            manifest = _download_manifest(resolved, offline=offline)
            detected = active_integration(project_root)
            plan = resolve_install_plan(
                manifest,
                speckit_version=_speckit_version(),
                active_integration=detected if detected is not None else integration,
                integration_explicit=bool(integration) and detected is None,
            )
            install_bundle(project_root, plan, installer, manifest=manifest, refresh=True)
            console.print(
                f"[green]✓[/green] Updated '{_escape_markup(str(target))}' "

View on GitHub (pinned to bf88c9f9a8)

Solutions

  1. List installed bundles (inspect load_records / the recorded bundle ids, e.g. via 'specify bundle list' if available) and use the exact recorded id.
  2. If the bundle is not installed, use 'specify bundle install <id>' instead of update.
  3. If records were lost, reinstall the bundle to re-establish the record.

Example fix

# before
specify bundle update my-bundel   # typo

# after
specify bundle update my-bundle
Defensive patterns

Strategy: validation

Validate before calling

records = load_records(project_root)
installed = {r.bundle_id for r in records}
if bundle_id not in installed:
    raise SystemExit(f"Not installed: {bundle_id}. Installed: {sorted(installed)}")

Type guard

def is_installed(bundle_id: str, records) -> bool:
    return any(r.bundle_id == bundle_id for r in records)

Try / catch

try:
    bundle_update(bundle_id, ...)
except BundlerError as exc:
    if "is not installed" in str(exc):
        # list installed ids and correct the target
        ...

Prevention

When it happens

Trigger: specify bundle update <id> where <id> is not in the install records under .specify (never installed, installed under a different id, or records were cleared).

Common situations: Typo in the bundle id; the bundle was uninstalled; records lost after a manual .specify cleanup; using the catalog name instead of the id the install recorded.

Related errors


AI-assisted analysis of github/spec-kit@bf88c9f9a8 (2026-08-14). Data as JSON: /api/errors/3a9a9e1ea343360f. Report an issue: GitHub.