{"record":{"id":"48237003d5bfa1b1","repo":"github/spec-kit","slug":"preset-pack-id-is-from-the-catalog-name-ca","errorCode":null,"errorMessage":"Preset '{pack_id}' is from the '{catalog_name}' catalog which does not allow installation. Use --from with the preset's repository URL instead.","messagePattern":"Preset '(.+?)' is from the '(.+?)' catalog which does not allow installation\\. Use --from with the preset's repository URL instead\\.","errorType":"exception","errorClass":"PresetError","httpStatus":null,"severity":"error","filePath":"src/specify_cli/presets/__init__.py","lineNumber":4839,"sourceCode":"        pack_info = self.get_pack_info(pack_id)\n        if not pack_info:\n            raise PresetError(\n                f\"Preset '{pack_id}' not found in catalog\"\n            )\n\n        # Bundled presets without a download URL must be installed locally\n        if pack_info.get(\"bundled\") and not pack_info.get(\"download_url\"):\n            from ..extensions import REINSTALL_COMMAND\n            raise PresetError(\n                f\"Preset '{pack_id}' is bundled with spec-kit and has no download URL. \"\n                f\"It should be installed from the local package. \"\n                f\"Use 'specify preset add {pack_id}' to install from the bundled package, \"\n                f\"or reinstall spec-kit if the bundled files are missing: {REINSTALL_COMMAND}\"\n            )\n\n        if not pack_info.get(\"_install_allowed\", True):\n            catalog_name = pack_info.get(\"_catalog_name\", \"unknown\")\n            raise PresetError(\n                f\"Preset '{pack_id}' is from the '{catalog_name}' catalog which does not allow installation. \"\n                f\"Use --from with the preset's repository URL instead.\"\n            )\n\n        download_url = pack_info.get(\"download_url\")\n        if not download_url:\n            raise PresetError(\n                f\"Preset '{pack_id}' has no download URL\"\n            )\n        if not isinstance(download_url, str):\n            raise PresetError(\n                f\"Preset download URL is malformed: {download_url}\"\n            )\n\n        from urllib.parse import urlparse\n\n        # A malformed authority (e.g. an unterminated IPv6 bracket\n        # \"https://[::1\") makes urlparse / hostname access raise ValueError.","sourceCodeStart":4821,"sourceCodeEnd":4857,"githubUrl":"https://github.com/github/spec-kit/blob/bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c/src/specify_cli/presets/__init__.py#L4821-L4857","documentation":"The pack's source catalog was configured with install_allowed: false (or it parsed as falsy), so installing from it is blocked. The entry's _install_allowed flag is stamped onto pack data during merge; download_preset_archive refuses with a pointer to use --from with the repository URL instead.","triggerScenarios":"Adding a third-party catalog with install_allowed: false in the catalog config, then attempting to download/install a pack that only that catalog provides.","commonSituations":"Curating a browse-only or enterprise-internal catalog where installs must come from vetted sources; admin disables installs from an untrusted mirror; flag accidentally left false after testing.","solutions":["Install directly from the repository instead: specify preset add <pack_id> --from <repo-url>","If installs from that catalog are intended, set 'install_allowed: true' on the entry in the catalog config","Note YAML strings 'true'/'yes'/'1' are accepted as true; anything else (including 'false'/'no'/0) disables installs"],"exampleFix":"# before (catalog config)\ncatalogs:\n  - url: https://mirror.example.com/catalog.json\n    install_allowed: false\n\n# after\ncatalogs:\n  - url: https://mirror.example.com/catalog.json\n    install_allowed: true","handlingStrategy":"validation","validationCode":"info = manager.get_pack_info(pack_id) or {}\nif not info.get(\"_install_allowed\", True):\n    install_from_repo(pack_id, repo_url)  # use --from instead of catalog download","typeGuard":"def is_install_allowed(info: dict) -> bool:\n    return bool(info.get(\"_install_allowed\", True))","tryCatchPattern":"except PresetError as e:\n    if \"does not allow installation\" in str(e):\n        run_cli(\"specify\", \"preset\", \"add\", pack_id, \"--from\", repo_url)\n    else:\n        raise","preventionTips":["When adding catalogs, set install_allowed: true only for sources you trust to install from","For browse-only catalogs, expect installs to require --from with an explicit repo URL"],"tags":["presets","catalog","permissions","install"],"backgroundTag":null,"analyzedSha":"bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c","analyzedAt":"2026-08-14T19:43:37.150Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}