talon-cli 0.4.1

Talon CLI: hybrid retrieval over Obsidian vaults and markdown corpora, with grounded answers, MCP server, and agent-native output.
Documentation
use eyre::Result;
use std::io::{self, Write};
use talon_core::config::keychain;

#[derive(Debug, Clone, clap::Subcommand)]
pub enum SecretsSubcommand {
    Set { name: String, key: String },
    Delete { name: String },
    Status,
    Get { name: String },
}

pub fn emit(sub: &SecretsSubcommand) -> Result<()> {
    let mut stdout = io::stdout().lock();
    match sub {
        SecretsSubcommand::Set { name, key } => {
            keychain::set(name, key)?;
            writeln!(stdout, "saved: {name}")?;
        }
        SecretsSubcommand::Delete { name } => {
            if keychain::delete(name)? {
                writeln!(stdout, "deleted: {name}")?;
            } else {
                writeln!(stdout, "not found: {name}")?;
            }
        }
        SecretsSubcommand::Get { name } => match keychain::get(name)? {
            Some(key) => writeln!(stdout, "{key}")?,
            None => writeln!(stdout, "not found: {name}")?,
        },
        SecretsSubcommand::Status => {
            let names = keychain::list_names()?;
            if names.is_empty() {
                writeln!(stdout, "no credentials stored")?;
            } else {
                for name in names {
                    writeln!(stdout, "{name}")?;
                }
            }
        }
    }
    Ok(())
}