github/spec-kit · error · BundlerError

No bundle.yml found at '{target}'.

Error message

No bundle.yml found at '{target}'.

What it means

_resolve_manifest_path resolves the given path (or the current working directory when omitted); if it is a directory it appends bundle.yml, and then requires the target to exist. This fired because neither the explicit path nor <dir>/bundle.yml (or ./bundle.yml when no path was given) exists on disk.

Source

Thrown at src/specify_cli/commands/bundle/__init__.py:831

                f"Invalid YAML in bundle.yml inside '{candidate}': {exc}"
            ) from exc
        return BundleManifest.from_dict(data)

    if candidate.name == "bundle.yml" or candidate.suffix in (".yml", ".yaml"):
        return BundleManifest.from_file(candidate)

    raise BundlerError(
        f"'{candidate}' is not a recognised bundle source (.zip artifact, bundle "
        "directory, or bundle.yml)."
    )


def _resolve_manifest_path(path: Path | None) -> Path:
    target = (path or Path.cwd()).resolve()
    if target.is_dir():
        target = target / "bundle.yml"
    if not target.exists():
        raise BundlerError(f"No bundle.yml found at '{target}'.")
    return target


def _download_manifest(resolved, *, offline: bool):
    """Resolve a bundle's manifest from its catalog ``download_url``.

    Catalog ``download_url``s are HTTPS-only (``http`` allowed for localhost),
    matching the extensions/presets/workflows catalog systems. Remote URLs are
    fetched with the shared authenticated, redirect-validated HTTP client, and
    only when not ``--offline``.

    Local and ``file://`` sources are intentionally not resolved here: to
    install a bundle from disk, pass the path positionally
    (``specify bundle install ./path/to/bundle.yml`` — a bundle directory or a
    ``.zip`` artifact also works), which :func:`_local_manifest_source` handles
    before catalog resolution and which never touches ``download_url``.
    """
    from urllib.parse import urlparse

View on GitHub (pinned to bf88c9f9a8)

Solutions

  1. cd into the bundle directory (or pass the directory containing bundle.yml) so <dir>/bundle.yml resolves.
  2. Pass the manifest file explicitly if it is named differently but has .yml/.yaml.
  3. Ensure bundle.yml exists at the location the command expects.

Example fix

# before
specify bundle validate   # cwd lacks bundle.yml

# after
specify bundle validate --path ./my-bundle
Defensive patterns

Strategy: validation

Validate before calling

from pathlib import Path

target = (path or Path.cwd()).resolve()
if target.is_dir():
    target = target / "bundle.yml"
if not target.exists():
    raise SystemExit(f"No manifest at {target}; run from the bundle directory or pass --path")

Type guard

def manifest_path_exists(path: Path | None) -> bool:
    target = (path or Path.cwd()).resolve()
    if target.is_dir():
        target = target / "bundle.yml"
    return target.exists()

Try / catch

try:
    target = _resolve_manifest_path(path)
except BundlerError as exc:
    if "No bundle.yml found at" in str(exc):
        # cd to the bundle dir or pass the correct --path
        ...

Prevention

When it happens

Trigger: Running a bundle command that loads a manifest by path (e.g. validate-style flows) with --path pointing at a directory lacking bundle.yml, or running it with no path from a cwd that has no bundle.yml.

Common situations: Executing the command from the repo root instead of the bundle folder; a renamed bundle.yaml; the file not checked out.

Related errors


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