{"record":{"id":"691fb6a9e6630fe0","repo":"github/spec-kit","slug":"no-bundle-yml-found-in-bundle-dir-691fb6","errorCode":null,"errorMessage":"No bundle.yml found in '{bundle_dir}'.","messagePattern":"No bundle\\.yml found in '(.+?)'\\.","errorType":"exception","errorClass":"BundlerError","httpStatus":null,"severity":"error","filePath":"src/specify_cli/bundler/services/resolver.py","lineNumber":131,"sourceCode":"        )\n    if manifest.requires.mcp:\n        warnings.append(\"Requires MCP servers: \" + \", \".join(manifest.requires.mcp))\n\n    return InstallPlan(\n        bundle_id=manifest.bundle.id,\n        version=manifest.bundle.version,\n        role=manifest.bundle.role,\n        effective_integration=effective_integration,\n        components=list(manifest.components),\n        warnings=warnings,\n    )\n\n\ndef load_manifest_from_dir(bundle_dir: Path) -> BundleManifest:\n    \"\"\"Load ``bundle.yml`` from a bundle directory.\"\"\"\n    manifest_path = Path(bundle_dir) / \"bundle.yml\"\n    if not manifest_path.exists():\n        raise BundlerError(f\"No bundle.yml found in '{bundle_dir}'.\")\n    return BundleManifest.from_file(manifest_path)\n","sourceCodeStart":113,"sourceCodeEnd":133,"githubUrl":"https://github.com/github/spec-kit/blob/bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c/src/specify_cli/bundler/services/resolver.py#L113-L133","documentation":"load_manifest_from_dir(bundle_dir) expects a bundle directory containing bundle.yml; it raises when <bundle_dir>/bundle.yml does not exist. This is a cheap existence check before BundleManifest.from_file is attempted, so the user gets a clear 'missing file' message instead of a lower-level parse error.","triggerScenarios":"Calling load_manifest_from_dir(Path('./my-bundle')) where the directory exists but the manifest is named bundle.yaml, manifest.yml, or sits in a subdirectory; or the path points at a bundle's parent folder.","commonSituations":"Renaming bundle.yml to bundle.yaml for consistency with other config; a git checkout that skipped the file via .gitignore; pointing at the repo root instead of the bundle folder.","solutions":["Ensure the exact file <bundle_dir>/bundle.yml exists (the filename is fixed, not .yaml).","If the manifest is named differently, rename it to bundle.yml.","If the file was not committed (gitignore/checkout), restore or re-add it.","Pass the manifest file path directly instead of the directory if your layout differs."],"exampleFix":"# before\nmy-bundle/\n  bundle.yaml\n\n# after\nmy-bundle/\n  bundle.yml","handlingStrategy":"validation","validationCode":"from pathlib import Path\n\nbundle_dir = Path(\"./my-bundle\")\nif not (bundle_dir / \"bundle.yml\").exists():\n    raise SystemExit(f\"{bundle_dir} has no bundle.yml; refusing to load\")","typeGuard":"from pathlib import Path\n\ndef is_bundle_dir(path: Path) -> bool:\n    return path.is_dir() and (path / \"bundle.yml\").is_file()","tryCatchPattern":"try:\n    manifest = load_manifest_from_dir(bundle_dir)\nexcept BundlerError as exc:\n    if \"No bundle.yml\" in str(exc):\n        # point user to the manifest file or fix naming\n        ...","preventionTips":["Name the manifest exactly bundle.yml (not .yaml).","Use is_bundle_dir() checks when scanning directories for bundles.","Commit bundle.yml and verify it survives clones."],"tags":["bundler","manifest","filesystem","path"],"backgroundTag":null,"analyzedSha":"bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c","analyzedAt":"2026-08-14T19:43:37.150Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}