{"record":{"id":"7b43fc0b356fe26a","repo":"github/spec-kit","slug":"no-bundle-yml-found-at-target","errorCode":null,"errorMessage":"No bundle.yml found at '{target}'.","messagePattern":"No bundle\\.yml found at '(.+?)'\\.","errorType":"exception","errorClass":"BundlerError","httpStatus":null,"severity":"error","filePath":"src/specify_cli/commands/bundle/__init__.py","lineNumber":831,"sourceCode":"                f\"Invalid YAML in bundle.yml inside '{candidate}': {exc}\"\n            ) from exc\n        return BundleManifest.from_dict(data)\n\n    if candidate.name == \"bundle.yml\" or candidate.suffix in (\".yml\", \".yaml\"):\n        return BundleManifest.from_file(candidate)\n\n    raise BundlerError(\n        f\"'{candidate}' is not a recognised bundle source (.zip artifact, bundle \"\n        \"directory, or bundle.yml).\"\n    )\n\n\ndef _resolve_manifest_path(path: Path | None) -> Path:\n    target = (path or Path.cwd()).resolve()\n    if target.is_dir():\n        target = target / \"bundle.yml\"\n    if not target.exists():\n        raise BundlerError(f\"No bundle.yml found at '{target}'.\")\n    return target\n\n\ndef _download_manifest(resolved, *, offline: bool):\n    \"\"\"Resolve a bundle's manifest from its catalog ``download_url``.\n\n    Catalog ``download_url``s are HTTPS-only (``http`` allowed for localhost),\n    matching the extensions/presets/workflows catalog systems. Remote URLs are\n    fetched with the shared authenticated, redirect-validated HTTP client, and\n    only when not ``--offline``.\n\n    Local and ``file://`` sources are intentionally not resolved here: to\n    install a bundle from disk, pass the path positionally\n    (``specify bundle install ./path/to/bundle.yml`` — a bundle directory or a\n    ``.zip`` artifact also works), which :func:`_local_manifest_source` handles\n    before catalog resolution and which never touches ``download_url``.\n    \"\"\"\n    from urllib.parse import urlparse","sourceCodeStart":813,"sourceCodeEnd":849,"githubUrl":"https://github.com/github/spec-kit/blob/bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c/src/specify_cli/commands/bundle/__init__.py#L813-L849","documentation":"_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.","triggerScenarios":"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.","commonSituations":"Executing the command from the repo root instead of the bundle folder; a renamed bundle.yaml; the file not checked out.","solutions":["cd into the bundle directory (or pass the directory containing bundle.yml) so <dir>/bundle.yml resolves.","Pass the manifest file explicitly if it is named differently but has .yml/.yaml.","Ensure bundle.yml exists at the location the command expects."],"exampleFix":"# before\nspecify bundle validate   # cwd lacks bundle.yml\n\n# after\nspecify bundle validate --path ./my-bundle","handlingStrategy":"validation","validationCode":"from pathlib import Path\n\ntarget = (path or Path.cwd()).resolve()\nif target.is_dir():\n    target = target / \"bundle.yml\"\nif not target.exists():\n    raise SystemExit(f\"No manifest at {target}; run from the bundle directory or pass --path\")","typeGuard":"def manifest_path_exists(path: Path | None) -> bool:\n    target = (path or Path.cwd()).resolve()\n    if target.is_dir():\n        target = target / \"bundle.yml\"\n    return target.exists()","tryCatchPattern":"try:\n    target = _resolve_manifest_path(path)\nexcept BundlerError as exc:\n    if \"No bundle.yml found at\" in str(exc):\n        # cd to the bundle dir or pass the correct --path\n        ...","preventionTips":["Run path-based bundle commands from inside the bundle directory.","Keep bundle.yml at the root of the bundle folder."],"tags":["bundler","manifest","path","filesystem"],"backgroundTag":null,"analyzedSha":"bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c","analyzedAt":"2026-08-14T19:43:37.150Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}