github/spec-kit · error · ValidationError

Manifest not found: {path}

Error message

Manifest not found: {path}

What it means

Raised when the extension manifest file does not exist at the expected path (FileNotFoundError caught during load). The expected path is included in the message. This is a missing-file error, not a content error.

Source

Thrown at src/specify_cli/extensions/__init__.py:249

            manifest_path: Path to extension.yml file

        Raises:
            ValidationError: If manifest is invalid
        """
        self.path = manifest_path
        self.warnings: List[str] = []
        self.data = self._load_yaml(manifest_path)
        self._validate()

    def _load_yaml(self, path: Path) -> dict:
        """Load YAML file safely."""
        try:
            with open(path, "r", encoding="utf-8") as f:
                data = yaml.safe_load(f)
        except yaml.YAMLError as e:
            raise ValidationError(f"Invalid YAML in {path}: {e}")
        except FileNotFoundError:
            raise ValidationError(f"Manifest not found: {path}")
        except UnicodeDecodeError as e:
            raise ValidationError(
                f"Manifest is not valid UTF-8: {path} ({e.reason} at byte {e.start})"
            )
        except OSError as e:
            raise ValidationError(f"Could not read manifest {path}: {e}")
        if not isinstance(data, dict):
            raise ValidationError(
                f"Manifest must be a YAML mapping, got {type(data).__name__}: {path}"
            )
        return data

    def _validate(self):
        """Validate manifest structure and required fields."""
        # Check required top-level fields
        for field in self.REQUIRED_FIELDS:
            if field not in self.data:
                raise ValidationError(f"Missing required field: {field}")

View on GitHub (pinned to bf88c9f9a8)

Solutions

  1. Verify the path in the error message exists (`ls` its parent).
  2. If the extension was deleted manually, clean the registration: `specify extension uninstall <key>` (or --force) then reinstall.
  3. If the install was incomplete, re-run `specify extension install <key>`.
  4. Ensure you are running from the correct project root.
Defensive patterns

Strategy: validation

Validate before calling

if not manifest_path.is_file():
    raise SystemExit(f"missing manifest {manifest_path}; reinstall the extension")

Try / catch

except ValidationError as e:
    if "Manifest not found" in str(e):
        specify_ext_uninstall(key, force=True); specify_ext_install(key)

Prevention

When it happens

Trigger: ExtensionManifest is constructed for `<extension-dir>/extension.yaml` (or the manifest path recorded in the installed registry) and open() raises FileNotFoundError — e.g. the extension directory was deleted or renamed after installation, or an install was incomplete.

Common situations: Manually deleting an installed extension's folder under .specify/extensions without unregistering it; git clean/checkout removing untracked extension files; a partially failed install; wrong project root (running specify in a directory that never had the extension).

Related errors


AI-assisted analysis of github/spec-kit@bf88c9f9a8 (2026-08-14). Data as JSON: /api/errors/78b0959131267837. Report an issue: GitHub.