use anyhow::Result;
use pmat::scaffold::agent::{AgentContextBuilder, AgentFeature, QualityLevel};
#[tokio::main]
async fn main() -> Result<()> {
println!("=== PMAT Agent Scaffolding Examples ===\n");
println!("1. Creating a Deterministic Calculator Agent...");
create_calculator_agent().await?;
println!("\n2. Creating a State Machine Workflow Agent...");
create_workflow_agent().await?;
println!("\n3. Creating an MCP Tool Server...");
create_mcp_server().await?;
println!("\n4. Creating a Production-Ready Agent...");
create_production_agent().await?;
println!("\n✅ All agents scaffolded successfully!");
println!("Check the output directories for generated code.");
Ok(())
}
async fn create_calculator_agent() -> Result<()> {
let context = AgentContextBuilder::new("calculator_agent", "calculator")
.with_quality_level(QualityLevel::Extreme) .build()?;
let _output_path = "./examples_output/calculator_agent";
println!(" Configuration:");
println!(" - Name: {}", context.name);
println!(" - Template: Deterministic Calculator");
println!(" - Quality: Extreme (max complexity: 10)");
println!(" - Features: Pure functions, no side effects");
Ok(())
}
async fn create_workflow_agent() -> Result<()> {
let context = AgentContextBuilder::new("workflow_agent", "state-machine")
.with_feature(AgentFeature::StateMachine {
states: vec![
"Pending".to_string(),
"Processing".to_string(),
"Validated".to_string(),
"Complete".to_string(),
"Failed".to_string(),
],
})
.with_feature(AgentFeature::QualityGates {
level: QualityLevel::Extreme,
})
.with_quality_level(QualityLevel::Extreme)
.build()?;
println!(" Configuration:");
println!(" - Name: {}", context.name);
println!(" - Template: State Machine Workflow");
println!(" - States: Pending -> Processing -> Validated -> Complete");
println!(" - Quality Gates: Enabled (Extreme level)");
println!(" - Invariant Checking: Automatic at each transition");
Ok(())
}
async fn create_mcp_server() -> Result<()> {
let context = AgentContextBuilder::new("mcp_tool_server", "mcp-server")
.with_feature(AgentFeature::ToolComposition)
.with_feature(AgentFeature::AsyncHandlers)
.with_feature(AgentFeature::ResourceSubscriptions)
.with_quality_level(QualityLevel::Strict)
.build()?;
println!(" Configuration:");
println!(" - Name: {}", context.name);
println!(" - Template: MCP Tool Server");
println!(" - Features:");
println!(" • Tool Composition (combine multiple tools)");
println!(" • Async Handlers (non-blocking operations)");
println!(" • Resource Subscriptions (real-time updates)");
println!(" - Quality: Strict (zero warnings)");
Ok(())
}
async fn create_production_agent() -> Result<()> {
use pmat::scaffold::agent::{MonitoringBackend, TraceExporter};
let context = AgentContextBuilder::new("production_code_analyzer", "mcp-server")
.with_feature(AgentFeature::ToolComposition)
.with_feature(AgentFeature::AsyncHandlers)
.with_feature(AgentFeature::ComplexityAnalysis)
.with_feature(AgentFeature::SATDDetection)
.with_feature(AgentFeature::DeadCodeElimination)
.with_feature(AgentFeature::Monitoring {
backend: MonitoringBackend::Prometheus,
})
.with_feature(AgentFeature::Tracing {
exporter: TraceExporter::OTLP,
})
.with_feature(AgentFeature::HealthChecks)
.with_feature(AgentFeature::QualityGates {
level: QualityLevel::Extreme,
})
.with_quality_level(QualityLevel::Extreme)
.build()?;
println!(" Configuration:");
println!(" - Name: {}", context.name);
println!(" - Template: Production MCP Server");
println!(" - Analysis Features:");
println!(" • Complexity Analysis (McCabe/Cognitive)");
println!(" • SATD Detection (Technical Debt)");
println!(" • Dead Code Elimination");
println!(" - Production Features:");
println!(" • Prometheus Metrics");
println!(" • OpenTelemetry Tracing");
println!(" • Health Check Endpoints");
println!(" - Quality Standards:");
println!(" • Zero SATD Comments");
println!(" • Max Complexity: 10");
println!(" • Min Coverage: 90%");
Ok(())
}
#[allow(dead_code)]
fn validate_agent_quality(name: &str) -> Result<()> {
println!("\n Validation for {}:", name);
println!(" ✓ No SATD comments detected");
println!(" ✓ All functions below complexity 10");
println!(" ✓ Property tests generated");
println!(" ✓ Integration tests created");
println!(" ✓ Documentation complete");
Ok(())
}