systemprompt-cli 0.1.22

systemprompt.io OS - CLI for agent orchestration, AI operations, and system management
Documentation
use clap::Args;
use systemprompt_extension::ExtensionRegistry;

use crate::CliConfig;
use crate::commands::plugins::types::{TemplateWithExtension, TemplatesListOutput};
use crate::shared::CommandResult;

#[derive(Debug, Clone, Args)]
pub struct TemplatesArgs {
    #[arg(long, help = "Filter by extension ID")]
    pub extension: Option<String>,
}

pub fn execute(args: &TemplatesArgs, _config: &CliConfig) -> CommandResult<TemplatesListOutput> {
    let registry = ExtensionRegistry::discover();

    let templates: Vec<TemplateWithExtension> = registry
        .extensions()
        .iter()
        .filter(|ext| args.extension.as_ref().is_none_or(|f| ext.id().contains(f)))
        .flat_map(|ext| {
            let ext_id = ext.id().to_string();
            let ext_name = ext.name().to_string();

            ext.template_providers()
                .iter()
                .flat_map(|provider| {
                    provider
                        .templates()
                        .iter()
                        .map(|t| (t.name.clone(), t.content_types.join(", ")))
                        .collect::<Vec<_>>()
                })
                .map(|(name, desc)| TemplateWithExtension {
                    extension_id: ext_id.clone(),
                    extension_name: ext_name.clone(),
                    template_name: name,
                    description: desc,
                })
                .collect::<Vec<_>>()
        })
        .collect();

    let total = templates.len();

    let output = TemplatesListOutput { templates, total };

    CommandResult::table(output)
        .with_title("Templates Across Extensions")
        .with_columns(vec![
            "extension_id".to_string(),
            "template_name".to_string(),
            "description".to_string(),
        ])
}