{"record":{"id":"f101427c7e0148ce","repo":"github/spec-kit","slug":"preset-component-id-not-found-in-any-catalog","errorCode":null,"errorMessage":"Preset '{component.id}' not found in any catalog.","messagePattern":"Preset '(.+?)' not found in any catalog\\.","errorType":"exception","errorClass":"BundlerError","httpStatus":null,"severity":"error","filePath":"src/specify_cli/bundler/services/primitives.py","lineNumber":200,"sourceCode":"            )\n            self._manager.install_from_directory(\n                bundled, speckit_version, priority, **({\"force\": True} if force else {})\n            )\n            return\n\n        if not self._allow_network:\n            raise BundlerError(\n                f\"Preset '{component.id}' is not bundled and network access is \"\n                f\"disabled; re-run without --offline or install it first with \"\n                f\"'specify preset add {component.id}'.\"\n            )\n\n        from ...presets import PresetCatalog\n\n        catalog = PresetCatalog(self._root)\n        info = catalog.get_pack_info(component.id)\n        if not info:\n            raise BundlerError(f\"Preset '{component.id}' not found in any catalog.\")\n        if not info.get(\"_install_allowed\", True):\n            raise BundlerError(\n                f\"Preset '{component.id}' is from a discovery-only catalog; \"\n                \"installation is not allowed.\"\n            )\n        _assert_pinned_version(\n            \"Preset\", component.id, component.version, info.get(\"version\")\n        )\n        zip_path = catalog.download_pack(component.id)\n        try:\n            self._manager.install_from_zip(\n                zip_path, speckit_version, priority, **({\"force\": True} if force else {})\n            )\n        finally:\n            with contextlib.suppress(Exception):\n                if zip_path.exists():\n                    zip_path.unlink()\n","sourceCodeStart":182,"sourceCodeEnd":218,"githubUrl":"https://github.com/github/spec-kit/blob/bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c/src/specify_cli/bundler/services/primitives.py#L182-L218","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"from specify_cli.presets import PresetCatalog\n\ncatalog = PresetCatalog(project_root)\nmissing = [c.id for c in plan.components if c.kind == \"presets\" and not catalog.get_pack_info(c.id)]\nif missing:\n    print(f\"presets not in any catalog: {missing}\"); exit(1)","typeGuard":null,"tryCatchPattern":"from specify_cli.bundler.core import BundlerError\n\ntry:\n    install_bundle(project_root, plan, installer)\nexcept BundlerError as exc:\n    if \"not found in any catalog\" in str(exc):\n        log.error(\"configure the catalog that hosts this preset, or vendor it into the bundle\")","preventionTips":["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."],"tags":["bundler","preset","catalog","not-found"],"backgroundTag":null,"analyzedSha":"bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c","analyzedAt":"2026-08-14T19:43:37.150Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}