github/spec-kit · error · PresetError

Preset '{pack_id}' is bundled with spec-kit and has no downl

Error message

Preset '{pack_id}' is bundled with spec-kit and has no download URL. It should be installed from the local package. Use 'specify preset add {pack_id}' to install from the bundled package, or reinstall spec-kit if the bundled files are missing: {REINSTALL_COMMAND}

What it means

The pack exists but is flagged 'bundled' and carries no download_url. Bundled presets ship inside the spec-kit package itself, so remote download is refused; the error tells you to install locally via 'specify preset add <pack_id>' or reinstall spec-kit if the bundled files went missing.

Source

Thrown at src/specify_cli/presets/__init__.py:4830

        Returns:
            Path to the downloaded archive

        Raises:
            PresetError: If pack not found or download fails
        """
        import urllib.error

        pack_info = self.get_pack_info(pack_id)
        if not pack_info:
            raise PresetError(
                f"Preset '{pack_id}' not found in catalog"
            )

        # Bundled presets without a download URL must be installed locally
        if pack_info.get("bundled") and not pack_info.get("download_url"):
            from ..extensions import REINSTALL_COMMAND
            raise PresetError(
                f"Preset '{pack_id}' is bundled with spec-kit and has no download URL. "
                f"It should be installed from the local package. "
                f"Use 'specify preset add {pack_id}' to install from the bundled package, "
                f"or reinstall spec-kit if the bundled files are missing: {REINSTALL_COMMAND}"
            )

        if not pack_info.get("_install_allowed", True):
            catalog_name = pack_info.get("_catalog_name", "unknown")
            raise PresetError(
                f"Preset '{pack_id}' is from the '{catalog_name}' catalog which does not allow installation. "
                f"Use --from with the preset's repository URL instead."
            )

        download_url = pack_info.get("download_url")
        if not download_url:
            raise PresetError(
                f"Preset '{pack_id}' has no download URL"
            )

View on GitHub (pinned to bf88c9f9a8)

Solutions

  1. Install it locally instead: specify preset add <pack_id>
  2. If that fails with missing files, reinstall spec-kit (pip install --force-reinstall spec-kit or the documented REINSTALL_COMMAND) to restore bundled assets
  3. If writing generic tooling, skip entries where bundled is true and no download_url exists

Example fix

# before
archive = manager.download_preset_archive("bundled-pack")

# after
# use the local install path for bundled presets
# shell: specify preset add bundled-pack
Defensive patterns

Strategy: validation

Validate before calling

info = manager.get_pack_info(pack_id) or {}
if info.get("bundled") and not info.get("download_url"):
    use_local_install(pack_id)  # route to 'specify preset add' instead of download

Type guard

def is_local_only_pack(info: dict) -> bool:
    return bool(info.get("bundled")) and not info.get("download_url")

Try / catch

try:
    archive = manager.download_preset_archive(pack_id)
except PresetError as e:
    if "bundled with spec-kit" in str(e):
        run_cli("specify", "preset", "add", pack_id)
    else:
        raise

Prevention

When it happens

Trigger: Calling download_preset_archive() on a pack whose catalog entry has bundled: true and no download_url — typically the built-in presets that come with spec-kit.

Common situations: Programmatically downloading every catalog pack and hitting the bundled entries; a broken/partial spec-kit installation where the bundled files are absent even though the catalog entry exists.

Related errors


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