github/spec-kit · error · ValidationError
Source path is the install destination for '{manifest.id}' (
Error message
Source path is the install destination for '{manifest.id}' ({dest_dir}). Refusing to proceed to avoid deleting the extension. Install from a copy in a different location instead. What it means
Error "Source path is the install destination for '{manifest.id}' ({dest_dir}). Refusing to proceed to avoid deleting the extension. Install from a copy in a different location instead." thrown in github/spec-kit.
Source
Thrown at src/specify_cli/extensions/__init__.py:2108
f"Extension '{manifest.id}' is already installed. "
f"Use 'specify extension remove {manifest.id}' first, "
f"or retry with --force to overwrite."
)
# Reject manifests that would shadow core commands or installed extensions.
self._validate_install_conflicts(manifest)
# Refuse to install an extension from its own install destination — with
# --force this would delete the source before copying it (issue #2990).
dest_dir = self.extensions_dir / manifest.id
try:
same_location = source_dir.resolve(strict=False) == dest_dir.resolve(
strict=False
)
except (OSError, RuntimeError):
same_location = source_dir.absolute() == dest_dir.absolute()
if same_location:
raise ValidationError(
f"Source path is the install destination for '{manifest.id}' "
f"({dest_dir}). Refusing to proceed to avoid deleting the "
f"extension. Install from a copy in a different location instead."
)
# Remove existing installation AFTER all validations pass so that a
# validation failure doesn't leave the user with a half-uninstalled
# extension (configs stranded in .backup/).
did_remove = False
if force and self.registry.is_installed(manifest.id):
# Clear any stale backup from a previous remove so that only the
# backup produced by the current remove() call is restored later.
backup_config_dir = self.extensions_dir / ".backup" / manifest.id
# Check is_symlink first: is_dir() follows symlinks so a
# symlink-to-directory would pass, but rmtree() raises on them.
if backup_config_dir.is_symlink():
backup_config_dir.unlink()
elif backup_config_dir.is_dir():View on GitHub (pinned to bf88c9f9a8)
Solutions
- Copy the extension source to a different directory and install from there so the destination is not the source.
When it happens
Trigger: Thrown at src/specify_cli/extensions/__init__.py:2108 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of github/spec-kit@bf88c9f9a8 (2026-08-14).
Data as JSON: /api/errors/55dd11f760e89105.
Report an issue: GitHub.