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
- Locate the installable source for the extension and add it to your catalog configuration, or install it directly before the bundle run.
- Vendor the extension into the bundle artifact so no catalog install is attempted.
- 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
- Check _install_allowed on catalog entries before adding extensions to bundles.
- Do not source extension ids from index/discovery listings.
- Vendor discovery-only extensions into the bundle artifact.
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
- Preset '{component.id}' is from a discovery-only catalog; in
- Extension '{component.id}' not found in any catalog.
- Bundle '{bundle_id}' resolves only from a discovery-only sou
- Bundle '{target}' resolves only from a discovery-only source
- Malformed catalog config at {path}: expected a mapping at th
AI-assisted analysis of github/spec-kit@bf88c9f9a8 (2026-08-14).
Data as JSON: /api/errors/c2ed2db7deb36a9c.
Report an issue: GitHub.