Parse an agent definition from Markdown with YAML frontmatter The frontmatter contains agent metadata, and the body becomes the prompt.
(content: &str)
| 855 | /// |
| 856 | /// The frontmatter contains agent metadata, and the body becomes the prompt. |
| 857 | pub fn parse_agent_md(content: &str) -> anyhow::Result<AgentDefinition> { |
| 858 | // Parse frontmatter (YAML between --- markers) |
| 859 | let parts: Vec<&str> = content.splitn(3, "---").collect(); |
| 860 | |
| 861 | if parts.len() < 3 { |
| 862 | return Err(anyhow::anyhow!( |
| 863 | "Invalid markdown format: missing YAML frontmatter" |
| 864 | )); |
| 865 | } |
| 866 | |
| 867 | let frontmatter = parts[1].trim(); |
| 868 | let body = parts[2].trim(); |
| 869 | |
| 870 | // Parse the frontmatter as YAML. A `kind` field selects WorkerAgentSpec. |
| 871 | let value: serde_yaml::Value = serde_yaml::from_str(frontmatter) |
| 872 | .map_err(|e| anyhow::anyhow!("Failed to parse agent frontmatter: {}", e))?; |
| 873 | |
| 874 | if yaml_value_has_key(&value, "kind") { |
| 875 | let tools = yaml_get_any(&value, &["tools", "allowedTools", "allowed_tools"]) |
| 876 | .map(parse_tools_field) |
| 877 | .unwrap_or_default(); |
| 878 | let disallowed_tools = yaml_get_any( |
| 879 | &value, |
| 880 | &["disallowedTools", "disallowed-tools", "disallowed_tools"], |
| 881 | ) |
| 882 | .map(parse_tools_field) |
| 883 | .unwrap_or_default(); |
| 884 | let mut spec = parse_worker_yaml_value(value, "frontmatter")?; |
| 885 | if spec.prompt.is_none() && !body.is_empty() { |
| 886 | spec.prompt = Some(body.to_string()); |
| 887 | } |
| 888 | apply_claude_style_tools_to_spec(&mut spec, &tools, &disallowed_tools); |
| 889 | return Ok(spec.into_agent_definition()); |
| 890 | } |
| 891 | |
| 892 | let mut agent = parse_agent_yaml_value(value, "agent frontmatter")?; |
| 893 | |
| 894 | // Use body as prompt if not already set in frontmatter. |
| 895 | if agent.prompt.is_none() && !body.is_empty() { |
| 896 | agent.prompt = Some(body.to_string()); |
| 897 | } |
| 898 | |
| 899 | Ok(agent) |
| 900 | } |
| 901 | |
| 902 | /// Load all agent definitions from a directory |
| 903 | /// |