use crate::agent::ClaudeCodeAgent;
use crate::identity::AgentRole;
pub trait AgentAttributeAccess {
fn agent_id(&self) -> &str;
fn role(&self) -> &AgentRole;
fn specialization(&self) -> &str;
fn capabilities(&self) -> Vec<String>;
fn has_capability(&self, capability: &str) -> bool;
}
impl AgentAttributeAccess for ClaudeCodeAgent {
fn agent_id(&self) -> &str {
&self.identity.agent_id
}
fn role(&self) -> &AgentRole {
&self.identity.specialization
}
fn specialization(&self) -> &str {
self.identity.specialization.name()
}
fn capabilities(&self) -> Vec<String> {
vec![
self.identity.specialization.name().to_string(),
self.identity.specialization.name().to_lowercase(),
]
}
fn has_capability(&self, capability: &str) -> bool {
self.identity
.specialization
.name()
.eq_ignore_ascii_case(capability)
}
}
pub fn role_from_specialization(specialization: &str) -> AgentRole {
match specialization {
"react_typescript" | "frontend" | "Frontend" => crate::identity::default_frontend_role(),
"node_microservices" | "backend" | "Backend" => crate::identity::default_backend_role(),
"aws_kubernetes" | "devops" | "DevOps" => crate::identity::default_devops_role(),
"qa" | "testing" | "QA" => crate::identity::default_qa_role(),
_ => {
tracing::warn!(
"Unknown specialization: {}, defaulting to frontend role",
specialization
);
crate::identity::default_frontend_role()
}
}
}
pub fn specialization_from_role(role: &AgentRole) -> String {
match role.name() {
"Frontend" => "frontend".to_string(),
"Backend" => "backend".to_string(),
"DevOps" => "devops".to_string(),
"QA" => "qa".to_string(),
_ => role.name().to_lowercase(),
}
}