mod inventory;
mod opening;
mod policy;
mod reference;
mod surfaces;
mod troubleshooting;
mod workflows;
#[cfg(test)]
mod tests;
use clap::{Args, ValueEnum};
use crate::exit;
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum AgentMode {
All,
Cli,
Mcp,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum AgentPlatform {
All,
Linux,
Windows,
}
#[derive(Debug, Clone, Copy, ValueEnum, PartialEq, Eq)]
pub enum AgentRulesSurface {
Full,
Core,
}
#[derive(Debug, Args)]
#[command(after_help = "\
EXAMPLES:
patchloom agent-rules >> AGENTS.md
patchloom agent-rules --mode mcp
patchloom agent-rules --platform linux
patchloom agent-rules --surface core")]
pub struct AgentRulesArgs {
#[arg(long, value_enum, default_value = "all")]
pub mode: AgentMode,
#[arg(long, value_enum, default_value = "all")]
pub platform: AgentPlatform,
#[arg(long, value_enum, default_value = "full")]
pub surface: AgentRulesSurface,
}
pub(crate) const AGENT_RULES_GENERATED_MARKER: &str = "<!-- Generated by patchloom v";
pub(crate) fn generate_agent_rules(args: &AgentRulesArgs) -> String {
let version = env!("CARGO_PKG_VERSION");
if args.surface == AgentRulesSurface::Core {
return crate::cmd::agent_packaging::agent_rules_core_body(version);
}
let show_cli = matches!(args.mode, AgentMode::All | AgentMode::Cli);
let show_mcp = matches!(args.mode, AgentMode::All | AgentMode::Mcp);
let show_linux = matches!(args.platform, AgentPlatform::All | AgentPlatform::Linux);
let show_windows = matches!(args.platform, AgentPlatform::All | AgentPlatform::Windows);
let mut out = String::new();
opening::append_opening(&mut out, version, show_cli, show_mcp);
policy::append_policy(&mut out, show_cli, show_mcp);
surfaces::append_surfaces(&mut out, show_cli, show_mcp, show_linux, show_windows);
workflows::append_workflows(&mut out, show_cli, show_linux, show_windows);
reference::append_reference(&mut out, show_cli);
inventory::append_operations_catalogue(&mut out);
troubleshooting::append_troubleshooting(&mut out);
out
}
pub fn run(args: AgentRulesArgs, global: &crate::cli::global::GlobalFlags) -> anyhow::Result<u8> {
let output = generate_agent_rules(&args);
if !global.emit_json(&serde_json::json!({
"ok": true,
"format": "markdown",
"content": output,
}))? {
print!("{output}");
}
Ok(exit::SUCCESS)
}