aaif-goose/goose · error

No recipe file found in

Error message

No recipe file found in {} (looked for extensions: {:?})

What it means

After goose clones the configured recipe repo, fetches origin, and extracts the requested folder via `git archive`, read_recipe_file scans the download directory for a file named recipe.<ext> where ext is one of goose::recipe::RECIPE_FILE_EXTENSIONS (crates/goose-cli/src/recipes/github_recipe.rs:76-97). If none exists, this error lists the searched directory and the accepted extensions.

Solutions

  1. Open the searched directory shown in the error and confirm what the recipe file is actually named; rename it to recipe.<supported ext> (check the listed RECIPE_FILE_EXTENSIONS)
  2. Verify the recipe_name exactly matches the folder path in the repo so the right tree gets extracted
  3. Upgrade goose if the repo uses a recipe file extension newer than your binary supports
Defensive patterns

Strategy: validation

Validate before calling

# Before running, confirm the repo folder ships a discoverable recipe file
gh api repos/$GOOSE_RECIPE_GITHUB_REPO/contents/$RECIPE_NAME --jq '.[].name' \
  | grep -Eq '^recipe\.(yaml|yml|json|toml)$' || echo "missing recipe.<ext>"

Prevention

When it happens

Trigger: Running a recipe resolved from GOOSE_RECIPE_GITHUB_REPO where the target folder has no recipe.yaml/yml/... file: the folder exists in the repo but the file is misnamed (e.g. recipes.yaml, recipe.yml vs supported list), sits in a nested subfolder, or the recipe_name points at the wrong directory.

Common situations: Recipe repo layout drifted (file renamed or moved), a typo in the recipe name making git archive extract a different/empty tree, or new extensions added upstream that an older goose binary does not know (version skew between goose and the recipe repo).

Related errors


AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16). Data as JSON: /api/errors/cd0bda1752f21b4d. Report an issue: GitHub.

Appendix: source

Thrown at crates/goose-cli/src/recipes/github_recipe.rs:92

    Ok(())
}
fn read_recipe_file(download_dir: &Path) -> Result<(String, PathBuf)> {
    for ext in RECIPE_FILE_EXTENSIONS {
        let candidate_file_path = download_dir.join(format!("recipe.{}", ext));
        if candidate_file_path.exists() {
            let content = fs::read_to_string(&candidate_file_path)?;
            println!(
                "⬇️  Retrieved recipe file: {}",
                candidate_file_path
                    .strip_prefix(download_dir)
                    .unwrap()
                    .display()
            );
            return Ok((content, candidate_file_path));
        }
    }

    Err(anyhow::anyhow!(
        "No recipe file found in {} (looked for extensions: {:?})",
        download_dir.display(),
        RECIPE_FILE_EXTENSIONS
    ))
}

fn clone_and_download_recipe(recipe_name: &str, recipe_repo_full_name: &str) -> Result<PathBuf> {
    let local_repo_path = ensure_repo_cloned(recipe_repo_full_name)?;
    fetch_origin(&local_repo_path)?;
    get_folder_from_github(&local_repo_path, recipe_name)
}

pub fn ensure_gh_authenticated() -> Result<()> {
    // Check authentication status
    let status = Command::new("gh")
        .args(["auth", "status"])
        .set_no_window()
        .status()

View on GitHub (pinned to 3810898a74)