{"record":{"id":"316b55d5a8b8cf7a","repo":"github/spec-kit","slug":"extension-commands-conflict-with-installed-extensi","errorCode":null,"errorMessage":"Extension commands conflict with installed extensions:\\n- {name} (already provided by extension '{installed_names[name]}')","messagePattern":"Extension commands conflict with installed extensions:\\\\n- (.+?) \\(already provided by extension '(.+?)'\\)","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"src/specify_cli/extensions/__init__.py","lineNumber":1200,"sourceCode":"                    if isinstance(alias, str):\n                        installed_names.setdefault(alias, ext_id)\n\n        return installed_names\n\n    def _validate_install_conflicts(self, manifest: ExtensionManifest) -> None:\n        \"\"\"Reject installs that would shadow core or installed extension commands.\"\"\"\n        declared_names = self._collect_manifest_command_names(manifest)\n        installed_names = self._get_installed_command_name_map(\n            exclude_extension_id=manifest.id\n        )\n\n        collisions = [\n            f\"{name} (already provided by extension '{installed_names[name]}')\"\n            for name in sorted(declared_names)\n            if name in installed_names\n        ]\n        if collisions:\n            raise ValidationError(\n                \"Extension commands conflict with installed extensions:\\n- \"\n                + \"\\n- \".join(collisions)\n            )\n\n    @staticmethod\n    def _load_extensionignore(\n        source_dir: Path,\n    ) -> Optional[Callable[[str, List[str]], Set[str]]]:\n        \"\"\"Load .extensionignore and return an ignore function for shutil.copytree.\n\n        The .extensionignore file uses .gitignore-compatible patterns (one per line).\n        Lines starting with '#' are comments. Blank lines are ignored.\n        The .extensionignore file itself is always excluded.\n\n        Pattern semantics mirror .gitignore:\n        - '*' matches anything except '/'\n        - '**' matches zero or more directories\n        - '?' matches any single character except '/'","sourceCodeStart":1182,"sourceCodeEnd":1218,"githubUrl":"https://github.com/github/spec-kit/blob/bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c/src/specify_cli/extensions/__init__.py#L1182-L1218","documentation":"Error \"Extension commands conflict with installed extensions:\\n- {name} (already provided by extension '{installed_names[name]}')\" thrown in github/spec-kit.","triggerScenarios":"Thrown at src/specify_cli/extensions/__init__.py:1200 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rename the conflicting commands in the extension manifest, or remove the already-installed extension that provides those names."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c","analyzedAt":"2026-08-14T19:43:37.150Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}