use std::path::PathBuf;
pub const SKILL_CONTENT: &str = include_str!("SKILL.md");
pub const DOCS_CONTENT: &str = include_str!(concat!(env!("OUT_DIR"), "/flowmark_docs.md"));
pub fn get_skill_content() -> &'static str {
SKILL_CONTENT
}
pub fn get_docs_content() -> String {
if let Ok(exe) = std::env::current_exe() {
if let Some(dir) = exe.parent() {
let readme = dir.join("README.md");
if let Ok(content) = std::fs::read_to_string(&readme) {
return content;
}
if let Some(parent) = dir.parent() {
let readme = parent.join("README.md");
if let Ok(content) = std::fs::read_to_string(&readme) {
return content;
}
}
}
}
DOCS_CONTENT.to_string()
}
pub fn install_skill(agent_base: Option<&str>) -> Result<(), String> {
let base: PathBuf = if let Some(custom) = agent_base {
let p = PathBuf::from(custom);
if p.components().any(|c| matches!(c, std::path::Component::ParentDir)) {
return Err(format!("invalid --agent-base path (contains '..'): {custom}"));
}
p
} else {
let Some(home) = dirs::home_dir() else {
return Err("Could not determine home directory".to_string());
};
home.join(".claude")
};
let skill_dir = base.join("skills").join("flowmark");
let skill_path = skill_dir.join("SKILL.md");
std::fs::create_dir_all(&skill_dir)
.map_err(|e| format!("failed to create skill directory: {e}"))?;
std::fs::write(&skill_path, SKILL_CONTENT)
.map_err(|e| format!("failed to write skill file: {e}"))?;
eprintln!("Installed flowmark skill to {}", skill_path.display());
if agent_base.is_some() {
eprintln!("Tip: Commit .claude/skills/ to share with team");
}
Ok(())
}