github/spec-kit · error · BundlerError

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

Error message

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

What it means

The preset is not bundled in the artifact, so the bundler fell back to resolving it via PresetCatalog, and catalog.get_pack_info(component.id) returned nothing — the id is unknown to every configured catalog. This fires after the offline check, so it only happens with network allowed.

Source

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

            )
            self._manager.install_from_directory(
                bundled, speckit_version, priority, **({"force": True} if force else {})
            )
            return

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

        from ...presets import PresetCatalog

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

View on GitHub (pinned to bf88c9f9a8)

Solutions

  1. Verify the id exists: `specify preset list` (or the catalog's own listing) and compare with bundle.yml.
  2. Fix typos in the preset id in bundle.yml, then validate, rebuild, reinstall.
  3. If the preset lives in a private/extra catalog, ensure that catalog is configured in the project (`specify preset catalogs` or equivalent config).
  4. If the preset was unpublished, vendor it into the bundle's bundled/ directory at build time instead of fetching from a catalog.
Defensive patterns

Strategy: validation

Validate before calling

from specify_cli.presets import PresetCatalog

catalog = PresetCatalog(project_root)
missing = [c.id for c in plan.components if c.kind == "presets" and not catalog.get_pack_info(c.id)]
if missing:
    print(f"presets 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("configure the catalog that hosts this preset, or vendor it into the bundle")

Prevention

When it happens

Trigger: Installing a bundle whose manifest references a preset id that no catalog in the project's catalog configuration contains — typo, unpublished preset, or a catalog source that is not configured/loaded.

Common situations: Preset renamed or removed upstream after the bundle was authored; bundle shared with a team whose catalog config lacks the private registry containing the preset; misspelled id in bundle.yml.

Related errors


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