github/spec-kit · error · BundlerError

Extension '{component.id}' is from a discovery-only catalog;

Error message

Extension '{component.id}' is from a discovery-only catalog; installation is not allowed.

What it means

The extension was found in a catalog, but that catalog is discovery-only: its entry has _install_allowed=False, so the bundler refuses to download and install it as part of a bundle. The check fires before the pinned-version comparison and before download_extension().

Source

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

            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():
                    zip_path.unlink()

    def remove(self, component: ComponentRef) -> None:
        try:

View on GitHub (pinned to bf88c9f9a8)

Solutions

  1. Locate the installable source for the extension and add it to your catalog configuration, or install it directly before the bundle run.
  2. Vendor the extension into the bundle artifact so no catalog install is attempted.
  3. Drop the extension from bundle.yml if it is not needed.
Defensive patterns

Strategy: validation

Validate before calling

from specify_cli.extensions import ExtensionCatalog

info = ExtensionCatalog(project_root).get_extension_info(component_id)
if info and not info.get("_install_allowed", True):
    print(f"{component_id} is discovery-only; choose an installable source")

Try / catch

from specify_cli.bundler.core import BundlerError

try:
    install_bundle(project_root, plan, installer)
except BundlerError as exc:
    if "discovery-only catalog" in str(exc):
        switch_component_to_installable_source(plan)

Prevention

When it happens

Trigger: A bundle referencing an extension listed in a read-only index catalog — the id resolves (info is truthy) but the catalog forbids installs from it.

Common situations: Curated indexes of third-party extensions; enterprise catalogs that list approved extensions but host them elsewhere; bundle authors picking ids from a listing without an install source.

Related errors


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