app
Mouser Electronics Search
Public Made by Adomby adom
Mouser component search in your workspace — stock, quantity price breaks, datasheets and lifecycle. CLI verbs, a Hydrogen app, and a shared backend service.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
//! `adom-mouser install` — deploy SKILL.md + BUILD-SKILL.md + bash completions.
use crate::{ok, warn};
use clap::CommandFactory;
use clap_complete::Shell;
use std::fs;
use std::io::Write;
use std::path::PathBuf;
const SKILL_MD: &str = include_str!("../SKILL.md");
const BUILD_SKILL_MD: &str = include_str!("../BUILD-SKILL.md");
pub fn install() -> Result<(), String> {
let home = std::env::var("HOME").map_err(|_| "HOME env var not set".to_string())?;
let skills_root = PathBuf::from(&home).join(".claude").join("skills");
// 1a. User-facing skill
let skill_dir = skills_root.join("adom-mouser");
fs::create_dir_all(&skill_dir).map_err(|e| format!("create {}: {}", skill_dir.display(), e))?;
let skill_path = skill_dir.join("SKILL.md");
fs::write(&skill_path, SKILL_MD).map_err(|e| format!("write {}: {}", skill_path.display(), e))?;
ok(format!("installed skill → {}", skill_path.display()));
// 1b. Build skill (per-app release workflow)
let build_skill_dir = skills_root.join("adom-mouser-build");
fs::create_dir_all(&build_skill_dir)
.map_err(|e| format!("create {}: {}", build_skill_dir.display(), e))?;
let build_skill_path = build_skill_dir.join("SKILL.md");
fs::write(&build_skill_path, BUILD_SKILL_MD)
.map_err(|e| format!("write {}: {}", build_skill_path.display(), e))?;
ok(format!("installed build skill → {}", build_skill_path.display()));
// 2. Bash completions
let comp_dir = PathBuf::from(&home)
.join(".local")
.join("share")
.join("bash-completion")
.join("completions");
fs::create_dir_all(&comp_dir).map_err(|e| format!("create {}: {}", comp_dir.display(), e))?;
let comp_path = comp_dir.join("adom-mouser");
let mut cmd = crate::Cli::command();
let mut buf: Vec<u8> = Vec::new();
clap_complete::generate(Shell::Bash, &mut cmd, "adom-mouser", &mut buf);
fs::write(&comp_path, &buf).map_err(|e| format!("write {}: {}", comp_path.display(), e))?;
ok(format!("installed completions → {}", comp_path.display()));
// 3. Append eval to .bashrc once
let bashrc = PathBuf::from(&home).join(".bashrc");
let current = fs::read_to_string(&bashrc).unwrap_or_default();
if !current.contains("# adom-mouser completions") {
match fs::OpenOptions::new().append(true).open(&bashrc) {
Ok(mut f) => {
let _ = f.write_all(b"\n# adom-mouser completions\neval \"$(adom-mouser completions bash 2>/dev/null)\"\n");
ok("appended completion source line to ~/.bashrc (open a new shell for it to take effect)");
}
Err(e) => warn(format!(".bashrc: {}", e)),
}
}
Ok(())
}