github/spec-kit · error · BundlerError

Extension '{component.id}' not found in any catalog.

Error message

Extension '{component.id}' not found in any catalog.

What it means

The extension could not be resolved locally (not bundled), so the bundler consulted ExtensionCatalog and get_extension_info(component.id) returned nothing — the id is unknown to every configured catalog. Only reachable with network allowed, since the offline guard runs first.

Source

Thrown at src/specify_cli/bundler/services/primitives.py:283

            )
            self._manager.install_from_directory(
                bundled, speckit_version, priority=priority, force=force
            )
            return

        if not self._allow_network:
            raise BundlerError(
                f"Extension '{component.id}' is not bundled and network access is "
                f"disabled; re-run without --offline or install it first with "
                f"'specify extension add {component.id}'."
            )

        from ...extensions import ExtensionCatalog

        catalog = ExtensionCatalog(self._root)
        info = catalog.get_extension_info(component.id)
        if not info:
            raise BundlerError(
                f"Extension '{component.id}' not found in any catalog."
            )
        if not info.get("_install_allowed", True):
            raise BundlerError(
                f"Extension '{component.id}' is from a discovery-only catalog; "
                "installation is not allowed."
            )
        _assert_pinned_version(
            "Extension", component.id, component.version, info.get("version")
        )
        zip_path = catalog.download_extension(component.id)
        try:
            self._manager.install_from_zip(
                zip_path, speckit_version, priority=priority, force=force
            )
        finally:
            with contextlib.suppress(Exception):
                if zip_path.exists():

View on GitHub (pinned to bf88c9f9a8)

Solutions

  1. List what is actually available: `specify extension list` and compare against the id in bundle.yml.
  2. Correct the id in bundle.yml, then validate, rebuild, and reinstall.
  3. Add the missing catalog/registry to the project's extension catalog configuration.
  4. If the extension cannot come from a catalog, vendor it into the bundle artifact at build time.
Defensive patterns

Strategy: validation

Validate before calling

from specify_cli.extensions import ExtensionCatalog

catalog = ExtensionCatalog(project_root)
missing = [c.id for c in plan.components if c.kind == "extensions" and not catalog.get_extension_info(c.id)]
if missing:
    print(f"extensions not in any catalog: {missing}"); exit(1)

Try / catch

from specify_cli.bundler.core import BundlerError

try:
    install_bundle(project_root, plan, installer)
except BundlerError as exc:
    if "not found in any catalog" in str(exc):
        log.error("add the hosting catalog to project config, or vendor the extension")

Prevention

When it happens

Trigger: A bundle manifest referencing an extension id that no configured catalog contains: unpublished extension, typo, or a catalog source missing from the project's configuration.

Common situations: Private extension in a registry the target project has not configured; extension renamed upstream after the bundle was authored; id copied incorrectly into bundle.yml.

Related errors


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