use std::path::PathBuf;
use crate::bootstrap::ironclaw_base_dir;
use crate::config::helpers::{optional_env, parse_bool_env, parse_optional_env};
use crate::error::ConfigError;
#[derive(Debug, Clone)]
pub struct SkillsConfig {
pub enabled: bool,
pub local_dir: PathBuf,
pub installed_dir: PathBuf,
pub max_active_skills: usize,
pub max_context_tokens: usize,
pub max_scan_depth: usize,
}
impl Default for SkillsConfig {
fn default() -> Self {
Self {
enabled: true,
local_dir: default_skills_dir(),
installed_dir: default_installed_skills_dir(),
max_active_skills: 3,
max_context_tokens: 4000,
max_scan_depth: 3,
}
}
}
fn default_skills_dir() -> PathBuf {
ironclaw_base_dir().join("skills")
}
fn default_installed_skills_dir() -> PathBuf {
ironclaw_base_dir().join("installed_skills")
}
impl SkillsConfig {
pub(crate) fn resolve() -> Result<Self, ConfigError> {
Ok(Self {
enabled: parse_bool_env("SKILLS_ENABLED", true)?,
local_dir: optional_env("SKILLS_DIR")?
.map(PathBuf::from)
.unwrap_or_else(default_skills_dir),
installed_dir: optional_env("SKILLS_INSTALLED_DIR")?
.map(PathBuf::from)
.unwrap_or_else(default_installed_skills_dir),
max_active_skills: parse_optional_env("SKILLS_MAX_ACTIVE", 3)?,
max_context_tokens: parse_optional_env("SKILLS_MAX_CONTEXT_TOKENS", 4000)?,
max_scan_depth: parse_optional_env("SKILLS_MAX_SCAN_DEPTH", 3)?,
})
}
}