use std::path::PathBuf;
use super::content::{gemini_dedicated_rules_path, opencode_dedicated_rules_path};
use super::{RulesFormat, RulesTarget};
pub(super) fn build_rules_targets(
home: &std::path::Path,
injection: crate::core::config::RulesInjection,
) -> Vec<RulesTarget> {
use crate::core::config::RulesInjection;
let (gemini_path, gemini_format) = match injection {
RulesInjection::Dedicated => (
gemini_dedicated_rules_path(home),
RulesFormat::DedicatedMarkdown,
),
RulesInjection::Shared | RulesInjection::Off => {
(home.join(".gemini/GEMINI.md"), RulesFormat::SharedMarkdown)
}
};
let (opencode_path, opencode_format) = match injection {
RulesInjection::Dedicated => (
opencode_dedicated_rules_path(home),
RulesFormat::DedicatedMarkdown,
),
RulesInjection::Shared | RulesInjection::Off => (
home.join(".config/opencode/AGENTS.md"),
RulesFormat::SharedMarkdown,
),
};
vec![
RulesTarget {
name: "Gemini CLI",
path: gemini_path,
format: gemini_format,
},
RulesTarget {
name: "VS Code",
path: copilot_instructions_path(home),
format: RulesFormat::SharedMarkdown,
},
RulesTarget {
name: "Copilot CLI",
path: home.join(".copilot/instructions.md"),
format: RulesFormat::SharedMarkdown,
},
RulesTarget {
name: "Cursor",
path: home.join(".cursor/rules/lean-ctx.mdc"),
format: RulesFormat::CursorMdc,
},
RulesTarget {
name: "Windsurf",
path: home.join(".codeium/windsurf/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Zed",
path: crate::core::editor_registry::zed_config_dir(home).join("rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Cline",
path: home.join(".cline/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Roo Code",
path: home.join(".roo/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "OpenCode",
path: opencode_path,
format: opencode_format,
},
RulesTarget {
name: "Continue",
path: home.join(".continue/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Amp",
path: home.join(".ampcoder/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Qwen Code",
path: home.join(".qwen/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Trae",
path: home.join(".trae/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Amazon Q Developer",
path: home.join(".aws/amazonq/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "JetBrains IDEs",
path: home.join(".jb-rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Antigravity",
path: home.join(".gemini/antigravity/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Pi Coding Agent",
path: home.join(".pi/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "AWS Kiro",
path: home.join(".kiro/steering/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Verdent",
path: home.join(".verdent/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Crush",
path: home.join(".config/crush/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Augment",
path: home.join(".augment/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "OpenClaw",
path: home.join(".openclaw/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
RulesTarget {
name: "Codex CLI",
path: crate::core::home::resolve_codex_dir()
.unwrap_or_else(|| home.join(".codex"))
.join("instructions.md"),
format: RulesFormat::SharedMarkdown,
},
RulesTarget {
name: "Grok",
path: home.join(".grok/AGENTS.md"),
format: RulesFormat::SharedMarkdown,
},
RulesTarget {
name: "Hermes Agent",
path: home.join(".hermes/HERMES.md"),
format: RulesFormat::SharedMarkdown,
},
RulesTarget {
name: "Qoder",
path: home.join(".qoder/rules/lean-ctx.md"),
format: RulesFormat::DedicatedMarkdown,
},
]
}
fn copilot_instructions_path(home: &std::path::Path) -> PathBuf {
#[cfg(target_os = "macos")]
{
return home.join("Library/Application Support/Code/User/github-copilot-instructions.md");
}
#[cfg(target_os = "linux")]
{
let user_dirs = [
home.join(".config/Code/User"),
home.join(".config/Code - Insiders/User"),
home.join(".vscode-server/data/User"),
];
let user_dir = user_dirs
.iter()
.find(|p| p.exists())
.cloned()
.unwrap_or_else(|| user_dirs[0].clone());
return user_dir.join("github-copilot-instructions.md");
}
#[cfg(target_os = "windows")]
{
if let Ok(appdata) = std::env::var("APPDATA") {
return PathBuf::from(appdata).join("Code/User/github-copilot-instructions.md");
}
}
#[allow(unreachable_code)]
home.join(".config/Code/User/github-copilot-instructions.md")
}