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
- Verify the id exists: `specify preset list` (or the catalog's own listing) and compare with bundle.yml.
- Fix typos in the preset id in bundle.yml, then validate, rebuild, reinstall.
- If the preset lives in a private/extra catalog, ensure that catalog is configured in the project (`specify preset catalogs` or equivalent config).
- 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
- Run `specify preset list` in the target environment and diff against bundle.yml ids before distributing a bundle.
- Configure private catalogs in every environment that installs the bundle.
- Vendor presets into the artifact when catalog availability cannot be guaranteed.
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
- No project-scoped catalog source matching '{target}' was fou
- Preset '{component.id}' is from a discovery-only catalog; in
- Extension '{component.id}' not found in any catalog.
- Malformed catalog config at {path}: expected a mapping at th
- Unsupported catalog config schema version '{str(schema_versi
AI-assisted analysis of github/spec-kit@bf88c9f9a8 (2026-08-14).
Data as JSON: /api/errors/f101427c7e0148ce.
Report an issue: GitHub.