github/spec-kit · error · BundlerError
Bundle '{target}' is not installed.
Error message
Bundle '{target}' is not installed. What it means
During bundle update, the requested target id does not match any record in the project's installed-bundle records (load_records(project_root)). The update loop checks membership before resolving, so an unknown id fails fast with a clear message instead of resolving an arbitrary catalog bundle you never installed.
Source
Thrown at src/specify_cli/commands/bundle/__init__.py:472
raise BundlerError("Specify a bundle id or use --all.")
targets = (
[r.bundle_id for r in records]
if all_bundles
else [bundle_id]
)
if not targets:
console.print("[yellow]No installed bundles to update.[/yellow]")
return
stack = _build_stack(project_root, offline=offline)
from ...bundler.services.adapters import DefaultPrimitiveInstaller
from ...bundler.services.installer import install_bundle
from ...bundler.services.resolver import resolve_install_plan
installer = DefaultPrimitiveInstaller(allow_network=not offline)
for target in targets:
if not any(r.bundle_id == target for r in records):
raise BundlerError(f"Bundle '{target}' is not installed.")
resolved = stack.resolve(target)
if not resolved.install_allowed:
raise BundlerError(
f"Bundle '{target}' resolves only from a discovery-only source "
f"('{resolved.source.id}'); it cannot be updated from there. "
"Update requires an install-allowed source (FR-025)."
)
manifest = _download_manifest(resolved, offline=offline)
detected = active_integration(project_root)
plan = resolve_install_plan(
manifest,
speckit_version=_speckit_version(),
active_integration=detected if detected is not None else integration,
integration_explicit=bool(integration) and detected is None,
)
install_bundle(project_root, plan, installer, manifest=manifest, refresh=True)
console.print(
f"[green]✓[/green] Updated '{_escape_markup(str(target))}' "View on GitHub (pinned to bf88c9f9a8)
Solutions
- List installed bundles (inspect load_records / the recorded bundle ids, e.g. via 'specify bundle list' if available) and use the exact recorded id.
- If the bundle is not installed, use 'specify bundle install <id>' instead of update.
- If records were lost, reinstall the bundle to re-establish the record.
Example fix
# before specify bundle update my-bundel # typo # after specify bundle update my-bundle
Defensive patterns
Strategy: validation
Validate before calling
records = load_records(project_root)
installed = {r.bundle_id for r in records}
if bundle_id not in installed:
raise SystemExit(f"Not installed: {bundle_id}. Installed: {sorted(installed)}") Type guard
def is_installed(bundle_id: str, records) -> bool:
return any(r.bundle_id == bundle_id for r in records) Try / catch
try:
bundle_update(bundle_id, ...)
except BundlerError as exc:
if "is not installed" in str(exc):
# list installed ids and correct the target
... Prevention
- Read bundle ids from load_records() instead of typing them from memory.
- Copy ids from the original install command output.
When it happens
Trigger: specify bundle update <id> where <id> is not in the install records under .specify (never installed, installed under a different id, or records were cleared).
Common situations: Typo in the bundle id; the bundle was uninstalled; records lost after a manual .specify cleanup; using the catalog name instead of the id the install recorded.
Related errors
- Each installed-bundle record must be a mapping.
- Corrupt record: 'contributed_components' must be a list.
- Corrupt records file: an installed-bundle record is missing
- Corrupt records file: record for bundle '{bundle_id}' is mis
- Corrupt records file: {path} — missing 'schema_version'. Exp
AI-assisted analysis of github/spec-kit@bf88c9f9a8 (2026-08-14).
Data as JSON: /api/errors/3a9a9e1ea343360f.
Report an issue: GitHub.