Skip to main content

systemprompt_cli/commands/plugins/
config.rs

1//! `plugins config` command rendering extension config schemas.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use anyhow::{Result, anyhow};
7use clap::Args;
8use systemprompt_extension::ExtensionRegistry;
9
10use super::types::{ExtensionConfigListOutput, ExtensionConfigOutput, ExtensionConfigSummary};
11use crate::CliConfig;
12use crate::shared::CommandOutput;
13
14#[derive(Debug, Clone, Args)]
15pub struct ConfigArgs {
16    #[arg(help = "Extension ID (optional - lists all if not specified)")]
17    pub id: Option<String>,
18}
19
20pub fn execute(args: &ConfigArgs, _config: &CliConfig) -> Result<CommandOutput> {
21    let registry = ExtensionRegistry::discover()?;
22
23    if let Some(id) = &args.id {
24        let ext = registry
25            .get(id)
26            .ok_or_else(|| anyhow!("Extension '{}' not found", id))?;
27
28        let output = ExtensionConfigOutput {
29            extension_id: systemprompt_identifiers::PluginId::new(ext.id()),
30            config_prefix: ext.config_prefix().map(String::from),
31            config_schema: ext.config_schema(),
32            has_config: ext.has_config(),
33        };
34
35        Ok(CommandOutput::card_value(
36            format!("Extension Config: {}", id),
37            &output,
38        ))
39    } else {
40        let mut extensions: Vec<ExtensionConfigSummary> = registry
41            .extensions()
42            .iter()
43            .map(|ext| ExtensionConfigSummary {
44                extension_id: systemprompt_identifiers::PluginId::new(ext.id()),
45                config_prefix: ext.config_prefix().map(String::from),
46                has_config: ext.has_config(),
47            })
48            .collect();
49
50        extensions.sort_by(|a, b| a.extension_id.cmp(&b.extension_id));
51        let total = extensions.len();
52
53        let output = ExtensionConfigListOutput { extensions, total };
54
55        Ok(CommandOutput::table_of(
56            vec!["extension_id", "config_prefix", "has_config"],
57            &output.extensions,
58        )
59        .with_title("Extension Configurations"))
60    }
61}