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

  1. 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.