{"record":{"id":"9e55ce233bedfb15","repo":"github/spec-kit","slug":"extension-manifest-id-is-already-installed-us","errorCode":null,"errorMessage":"Extension '{manifest.id}' is already installed. Use 'specify extension remove {manifest.id}' first, or retry with --force to overwrite.","messagePattern":"Extension '(.+?)' is already installed\\. Use 'specify extension remove (.+?)' first, or retry with --force to overwrite\\.","errorType":"exception","errorClass":"ExtensionError","httpStatus":null,"severity":"error","filePath":"src/specify_cli/extensions/__init__.py","lineNumber":2089,"sourceCode":"        Raises:\n            ValidationError: If manifest is invalid or priority is invalid\n            CompatibilityError: If extension is incompatible\n        \"\"\"\n        # Validate priority\n        if priority < 1:\n            raise ValidationError(\"Priority must be a positive integer (1 or higher)\")\n\n        # Load and validate manifest\n        manifest_path = source_dir / \"extension.yml\"\n        manifest = ExtensionManifest(manifest_path)\n\n        # Check compatibility\n        self.check_compatibility(manifest, speckit_version)\n\n        # Check if already installed\n        if self.registry.is_installed(manifest.id):\n            if not force:\n                raise ExtensionError(\n                    f\"Extension '{manifest.id}' is already installed. \"\n                    f\"Use 'specify extension remove {manifest.id}' first, \"\n                    f\"or retry with --force to overwrite.\"\n                )\n\n        # Reject manifests that would shadow core commands or installed extensions.\n        self._validate_install_conflicts(manifest)\n\n        # Refuse to install an extension from its own install destination — with\n        # --force this would delete the source before copying it (issue #2990).\n        dest_dir = self.extensions_dir / manifest.id\n        try:\n            same_location = source_dir.resolve(strict=False) == dest_dir.resolve(\n                strict=False\n            )\n        except (OSError, RuntimeError):\n            same_location = source_dir.absolute() == dest_dir.absolute()\n        if same_location:","sourceCodeStart":2071,"sourceCodeEnd":2107,"githubUrl":"https://github.com/github/spec-kit/blob/bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c/src/specify_cli/extensions/__init__.py#L2071-L2107","documentation":"Error \"Extension '{manifest.id}' is already installed. Use 'specify extension remove {manifest.id}' first, or retry with --force to overwrite.\" thrown in github/spec-kit.","triggerScenarios":"Thrown at src/specify_cli/extensions/__init__.py:2089 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Run 'specify extension remove <id>' first, or retry the install with --force to overwrite."],"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-15T17:31:12.345Z"}