Skip to main content

agent_policy/render/
agents_md.rs

1//! Renderer for `AGENTS.md`.
2
3use camino::Utf8PathBuf;
4use minijinja::Environment;
5
6use crate::{
7    error::{Error, Result},
8    model::normalized::Policy,
9    render::RenderedOutput,
10};
11
12const TEMPLATE: &str = include_str!("../../templates/AGENTS.md.j2");
13
14/// Render the `AGENTS.md` output for the given policy.
15///
16/// # Errors
17///
18/// Returns [`Error::Render`] if the template fails to compile or render.
19pub fn render(policy: &Policy) -> Result<RenderedOutput> {
20    let mut env = Environment::new();
21    env.add_template("AGENTS.md", TEMPLATE)
22        .map_err(|e| Error::Render {
23            target: "AGENTS.md".to_owned(),
24            source: e,
25        })?;
26
27    let tmpl = env.get_template("AGENTS.md").map_err(|e| Error::Render {
28        target: "AGENTS.md".to_owned(),
29        source: e,
30    })?;
31
32    let commands_defined = !policy.commands.is_empty();
33    let content = tmpl
34        .render(minijinja::context! {
35            project => &policy.project,
36            commands => &policy.commands,
37            commands_defined => commands_defined,
38            paths => &policy.paths,
39            roles => &policy.roles,
40            constraints => &policy.constraints,
41        })
42        .map_err(|e| Error::Render {
43            target: "AGENTS.md".to_owned(),
44            source: e,
45        })?;
46
47    Ok(RenderedOutput {
48        path: Utf8PathBuf::from("AGENTS.md"),
49        content,
50    })
51}