agcodex_core/subagents/built_in/
mod.rs

1//! Built-in subagents for AGCodex
2//!
3//! This module contains the core set of specialized agents that come
4//! pre-configured with AGCodex. Each agent focuses on a specific aspect
5//! of software development and can be invoked using @agent-name syntax.
6
7pub mod code_reviewer;
8pub mod debugger;
9pub mod performance;
10pub mod refactorer;
11pub mod test_writer;
12
13// Re-export all agents for convenience
14pub use code_reviewer::CodeReviewerAgent;
15pub use code_reviewer::IntelligenceLevel;
16pub use debugger::DebugDepth;
17pub use debugger::DebuggerAgent;
18pub use performance::OptimizationLevel;
19pub use performance::PerformanceAgent;
20pub use refactorer::RefactorerAgent;
21pub use refactorer::RiskLevel;
22pub use test_writer::TestStrategy;
23pub use test_writer::TestWriterAgent;
24
25use crate::subagents::Subagent;
26use crate::subagents::SubagentRegistry;
27use std::sync::Arc;
28
29/// Register all built-in agents with the registry
30pub fn register_built_in_agents(registry: &SubagentRegistry) {
31    // Register code reviewer
32    registry.register(
33        "code-reviewer",
34        Arc::new(CodeReviewerAgent::new()) as Arc<dyn Subagent>,
35    );
36
37    // Register refactorer
38    registry.register(
39        "refactorer",
40        Arc::new(RefactorerAgent::new()) as Arc<dyn Subagent>,
41    );
42
43    // Register debugger
44    registry.register(
45        "debugger",
46        Arc::new(DebuggerAgent::new()) as Arc<dyn Subagent>,
47    );
48
49    // Register test writer
50    registry.register(
51        "test-writer",
52        Arc::new(TestWriterAgent::new()) as Arc<dyn Subagent>,
53    );
54
55    // Register performance optimizer
56    registry.register(
57        "performance",
58        Arc::new(PerformanceAgent::new()) as Arc<dyn Subagent>,
59    );
60
61    // Register aliases for common variations
62    registry.register(
63        "reviewer",
64        Arc::new(CodeReviewerAgent::new()) as Arc<dyn Subagent>,
65    );
66
67    registry.register(
68        "refactor",
69        Arc::new(RefactorerAgent::new()) as Arc<dyn Subagent>,
70    );
71
72    registry.register("debug", Arc::new(DebuggerAgent::new()) as Arc<dyn Subagent>);
73
74    registry.register(
75        "test",
76        Arc::new(TestWriterAgent::new()) as Arc<dyn Subagent>,
77    );
78
79    registry.register(
80        "perf",
81        Arc::new(PerformanceAgent::new()) as Arc<dyn Subagent>,
82    );
83}
84
85/// Create a registry with all built-in agents pre-registered
86pub fn create_default_registry() -> SubagentRegistry {
87    let registry = SubagentRegistry::new().expect("Failed to create registry");
88    register_built_in_agents(&registry);
89    registry
90}
91
92/// Built-in agent descriptions for help text
93pub fn get_agent_descriptions() -> Vec<(&'static str, &'static str)> {
94    vec![
95        (
96            "@agent-code-reviewer",
97            "Reviews code for quality, security, and maintainability issues",
98        ),
99        (
100            "@agent-refactorer",
101            "Performs systematic code refactoring with risk assessment",
102        ),
103        (
104            "@agent-debugger",
105            "Deep debugging analysis and root cause identification",
106        ),
107        (
108            "@agent-test-writer",
109            "Generates comprehensive test suites with high coverage",
110        ),
111        (
112            "@agent-performance",
113            "Identifies and optimizes performance bottlenecks",
114        ),
115    ]
116}
117
118/// Get example agent invocations
119pub fn get_agent_examples() -> Vec<(&'static str, &'static str)> {
120    vec![
121        (
122            "@agent-code-reviewer",
123            "Review this file for security issues",
124        ),
125        (
126            "@agent-refactorer → @agent-test-writer",
127            "Refactor and then add tests",
128        ),
129        (
130            "@agent-performance + @agent-security",
131            "Run performance and security analysis in parallel",
132        ),
133        (
134            "@agent-debugger if errors",
135            "Debug only if errors are detected",
136        ),
137        (
138            "@agent-test-writer --strategy=comprehensive",
139            "Generate comprehensive test suite",
140        ),
141    ]
142}
143
144#[cfg(test)]
145mod tests {
146    use super::*;
147
148    #[test]
149    fn test_built_in_agents_registration() {
150        let registry = create_default_registry();
151
152        // Check that all main agents are registered
153        assert!(registry.get_agent("code-reviewer").is_some());
154        assert!(registry.get_agent("refactorer").is_some());
155        assert!(registry.get_agent("debugger").is_some());
156        assert!(registry.get_agent("test-writer").is_some());
157        assert!(registry.get_agent("performance").is_some());
158
159        // Check aliases
160        assert!(registry.get_agent("reviewer").is_some());
161        assert!(registry.get_agent("refactor").is_some());
162        assert!(registry.get_agent("debug").is_some());
163        assert!(registry.get_agent("test").is_some());
164        assert!(registry.get_agent("perf").is_some());
165    }
166
167    #[test]
168    fn test_agent_descriptions() {
169        let descriptions = get_agent_descriptions();
170        assert_eq!(descriptions.len(), 5);
171
172        // Verify each agent has a description
173        for (name, desc) in descriptions {
174            assert!(name.starts_with("@agent-"));
175            assert!(!desc.is_empty());
176        }
177    }
178
179    #[test]
180    fn test_agent_examples() {
181        let examples = get_agent_examples();
182        assert!(!examples.is_empty());
183
184        // Verify examples contain agent invocations
185        for (invocation, _description) in examples {
186            assert!(invocation.contains("@agent-"));
187        }
188    }
189}