Skip to main content

aether_cli/init/
harness.rs

1use aether_project::PromptSource;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, clap::ValueEnum)]
4#[clap(rename_all = "kebab-case")]
5pub enum HarnessIntegration {
6    Claude,
7    Agents,
8}
9
10impl HarnessIntegration {
11    fn dir_name(self) -> &'static str {
12        match self {
13            Self::Claude => ".claude",
14            Self::Agents => ".agents",
15        }
16    }
17
18    fn file_name(self) -> &'static str {
19        match self {
20            Self::Claude => "CLAUDE",
21            Self::Agents => "AGENTS",
22        }
23    }
24
25    pub fn title(self) -> String {
26        format!("{}.md + {}/", self.file_name(), self.dir_name())
27    }
28
29    pub fn description(self) -> String {
30        format!("load {}.md, {}/skills, and {}/rules", self.file_name(), self.dir_name(), self.dir_name())
31    }
32
33    pub fn prompt_source(self) -> Option<PromptSource> {
34        Some(PromptSource::file(format!("${{WORKSPACE}}/{}.md", self.file_name())).optional())
35    }
36
37    pub fn skills_dirs(self) -> Vec<String> {
38        self.dirs("skills")
39    }
40
41    pub fn rules_dirs(self) -> Vec<String> {
42        self.dirs("rules")
43    }
44
45    fn dirs(self, subdir: &str) -> Vec<String> {
46        let dir = self.dir_name();
47        vec![format!("${{HOME}}/{dir}/{subdir}"), format!("${{WORKSPACE}}/{dir}/{subdir}")]
48    }
49}