systemprompt-cli 0.19.0

Unified CLI for systemprompt.io AI governance: agent orchestration, MCP governance, analytics, profiles, cloud deploy, and self-hosted operations.
Documentation
use anyhow::{Context, Result, anyhow};
use clap::Args;

use super::types::AgentDetailOutput;
use crate::CliConfig;
use crate::interactive::{Prompter, resolve_required};
use crate::shared::CommandOutput;
use systemprompt_loader::ConfigLoader;

#[derive(Debug, Args)]
pub struct ShowArgs {
    #[arg(help = "Agent name (required in non-interactive mode)")]
    pub name: Option<String>,
}

pub(super) fn execute(
    args: ShowArgs,
    prompter: &dyn Prompter,
    config: &CliConfig,
) -> Result<CommandOutput> {
    let services_config = ConfigLoader::load().context("Failed to load services configuration")?;

    let name = resolve_required(args.name, "name", config, || {
        super::shared::prompt_agent_selection(prompter, "Select agent", &services_config)
    })?;

    let agent = services_config
        .agents
        .get(&name)
        .ok_or_else(|| anyhow!("Agent '{}' not found", name))?;

    let provider = agent
        .metadata
        .provider
        .clone()
        .unwrap_or_else(|| "-".to_owned());
    let model = agent
        .metadata
        .model
        .clone()
        .unwrap_or_else(|| "-".to_owned());

    let output = AgentDetailOutput {
        name: agent.name.clone(),
        display_name: agent.card.display_name.clone(),
        description: agent.card.description.clone(),
        port: agent.port,
        endpoint: agent.endpoint.clone(),
        enabled: agent.enabled,
        provider,
        model,
        mcp_servers: agent.metadata.mcp_servers.include.clone(),
        skills_count: agent.metadata.skills.include.len(),
    };

    Ok(CommandOutput::card_value(
        format!("Agent: {}", name),
        &output,
    ))
}