aether_cli/init/
harness.rs1use 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}