diff --git a/src/cli.rs b/src/cli.rs index 1cd49aa7952d63c712460d25d5714fcb248b91a9..8c25b5cda32884530c08036ae89ffd826f25d297 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -141,6 +141,13 @@ pub enum Command { /// Path to JSONL file (- for stdin) file: String, }, + + /// Install the agent skill file (SKILL.md) + Skill { + /// Skills directory (writes managing-tasks-with-td/SKILL.md inside) + #[arg(long)] + dir: Option, + }, } #[derive(Subcommand)] diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index d10bf6f5820c2531e423ab797b8fd3e4328e97fc..52ed422b69e79e8d89b0d6e04a5a11c3df4ccc53 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -11,6 +11,7 @@ mod ready; mod reopen; mod search; mod show; +mod skill; mod stats; mod update; @@ -128,5 +129,6 @@ pub fn dispatch(cli: &Cli) -> Result<()> { let root = require_root()?; import::run(&root, file) } + Command::Skill { dir } => skill::run(dir.as_deref()), } } diff --git a/src/cmd/skill.rs b/src/cmd/skill.rs index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c037f52caaef426b9416f7df91a7b4a2089b81f3 100644 --- a/src/cmd/skill.rs +++ b/src/cmd/skill.rs @@ -0,0 +1,34 @@ +use anyhow::{bail, Result}; +use std::path::PathBuf; + +const SKILL_CONTENT: &str = include_str!("../../SKILL.md"); +const SKILL_DIR: &str = "managing-tasks-with-td"; +const SKILL_FILE: &str = "SKILL.md"; + +fn default_skills_dir() -> Result { + if let Ok(xdg) = std::env::var("XDG_CONFIG_HOME") { + Ok(PathBuf::from(xdg).join("agents/skills")) + } else if let Ok(home) = std::env::var("HOME") { + Ok(PathBuf::from(home).join(".config/agents/skills")) + } else { + bail!("neither $XDG_CONFIG_HOME nor $HOME is set"); + } +} + +pub fn run(dir: Option<&str>) -> Result<()> { + let skills_dir = match dir { + Some(d) => PathBuf::from(d), + None => default_skills_dir()?, + }; + + let dest_dir = skills_dir.join(SKILL_DIR); + std::fs::create_dir_all(&dest_dir)?; + + let dest = dest_dir.join(SKILL_FILE); + std::fs::write(&dest, SKILL_CONTENT)?; + + let c = crate::color::stderr_theme(); + eprintln!("{}info:{} wrote {}", c.blue, c.reset, dest.display()); + + Ok(()) +}