use anyhow::{Context, Result};
use std::env;
use std::fs;
use std::path::PathBuf;
const PLUGIN_TS: &str = include_str!("../../embedded/opencode/lowfat.ts");
fn plugin_path() -> Result<PathBuf> {
let config_home = match env::var("XDG_CONFIG_HOME").ok().filter(|s| !s.is_empty()) {
Some(xdg) => PathBuf::from(xdg),
None => home_dir()
.context("cannot resolve config home (set $HOME or $XDG_CONFIG_HOME)")?
.join(".config"),
};
Ok(config_home.join("opencode").join("plugins").join("lowfat.ts"))
}
fn home_dir() -> Option<PathBuf> {
env::var("HOME")
.or_else(|_| env::var("USERPROFILE")) .ok()
.map(PathBuf::from)
}
pub fn install() -> Result<()> {
let path = plugin_path()?;
if let Some(parent) = path.parent() {
fs::create_dir_all(parent)
.with_context(|| format!("create {}", parent.display()))?;
}
fs::write(&path, PLUGIN_TS).with_context(|| format!("write {}", path.display()))?;
println!("✓ Installed lowfat OpenCode plugin → {}", path.display());
println!(" Restart OpenCode, then run any command (e.g. `git status`).");
Ok(())
}
pub fn uninstall() -> Result<()> {
let path = plugin_path()?;
if path.exists() {
fs::remove_file(&path).with_context(|| format!("remove {}", path.display()))?;
println!("✓ Removed lowfat OpenCode plugin: {}", path.display());
} else {
println!("lowfat OpenCode plugin not installed (nothing to remove).");
}
Ok(())
}