pub(crate) const GENERIC_ENGINEER_HINT: &str = "the appropriate engineer agent";
const DOCUMENTATION_HINT: &str = "the documentation agent";
const STACK_AGENTS: &[(&str, &str)] = &[
("rs", "rust-engineer"),
("py", "python-engineer"),
("pyi", "python-engineer"),
("pyx", "python-engineer"),
("ipynb", "python-engineer"),
("ts", "typescript-engineer"),
("tsx", "typescript-engineer"),
("js", "javascript-engineer"),
("jsx", "javascript-engineer"),
("mjs", "javascript-engineer"),
("cjs", "javascript-engineer"),
("go", "golang-engineer"),
("java", "java-engineer"),
("kt", "java-engineer"),
("kts", "java-engineer"),
("rb", "ruby-engineer"),
("php", "php-engineer"),
("cs", "dotnet-engineer"),
("dart", "dart-engineer"),
("ex", "phoenix-engineer"),
("exs", "phoenix-engineer"),
("svelte", "svelte-engineer"),
("vue", "web-ui-engineer"),
("html", "web-ui-engineer"),
("css", "web-ui-engineer"),
];
const DOC_EXTENSIONS: &[&str] = &["md", "mdx", "rst", "adoc"];
pub(crate) fn delegation_hint_for_path(path: &str) -> &'static str {
use std::path::{Component, Path};
let p = Path::new(path);
let ext = p
.extension()
.and_then(|e| e.to_str())
.map(|e| e.to_ascii_lowercase());
if let Some(ext) = ext.as_deref()
&& DOC_EXTENSIONS.contains(&ext)
{
return DOCUMENTATION_HINT;
}
let in_docs_dir = p
.components()
.any(|c| matches!(c, Component::Normal(os) if os.to_str() == Some("docs")));
if in_docs_dir {
return DOCUMENTATION_HINT;
}
if let Some(ext) = ext.as_deref()
&& let Some((_, agent)) = STACK_AGENTS.iter().find(|(e, _)| *e == ext)
{
return agent;
}
GENERIC_ENGINEER_HINT
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn delegation_hint_for_path_routes_docs() {
for p in [
"README.md",
"docs/reference/foo.md",
"notes.mdx",
"spec.rst",
"docs/provenance/note.txt", ] {
assert_eq!(
delegation_hint_for_path(p),
"the documentation agent",
"{p} should route to the documentation agent"
);
}
}
#[test]
fn delegation_hint_for_path_routes_known_stacks() {
assert_eq!(
delegation_hint_for_path("crates/foo/src/lib.rs"),
"rust-engineer"
);
assert_eq!(delegation_hint_for_path("app/main.py"), "python-engineer");
assert_eq!(
delegation_hint_for_path("web/App.tsx"),
"typescript-engineer"
);
assert_eq!(
delegation_hint_for_path("web/index.js"),
"javascript-engineer"
);
assert_eq!(delegation_hint_for_path("cmd/main.go"), "golang-engineer");
assert_eq!(delegation_hint_for_path("src/Main.java"), "java-engineer");
assert_eq!(delegation_hint_for_path("app/user.rb"), "ruby-engineer");
assert_eq!(delegation_hint_for_path("app/User.php"), "php-engineer");
assert_eq!(delegation_hint_for_path("Program.cs"), "dotnet-engineer");
assert_eq!(delegation_hint_for_path("lib/main.dart"), "dart-engineer");
assert_eq!(
delegation_hint_for_path("web/App.svelte"),
"svelte-engineer"
);
}
#[test]
fn delegation_hint_for_path_falls_back_generic() {
for p in ["Makefile", "README", "a.swift", "a.scala", "a.sql", "a.c"] {
assert_eq!(
delegation_hint_for_path(p),
GENERIC_ENGINEER_HINT,
"{p} should fall back to the generic hint"
);
}
}
#[test]
fn delegation_hint_for_path_docs_dir_component_not_substring() {
assert_ne!(
delegation_hint_for_path("adocs/file.rs"),
"the documentation agent"
);
assert_eq!(delegation_hint_for_path("adocs/file.rs"), "rust-engineer");
}
}