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(
17        help = "Extension ID (optional - lists all if not specified)",
18        value_parser = crate::shared::parse_extension_id
19    )]
20    pub id: Option<systemprompt_identifiers::ExtensionId>,
21}
22
23pub fn execute(args: &ConfigArgs, _config: &CliConfig) -> Result<CommandOutput> {
24    let registry = ExtensionRegistry::discover()?;
25
26    if let Some(id) = &args.id {
27        let ext = registry
28            .get(id.as_str())
29            .ok_or_else(|| anyhow!("Extension '{}' not found", id))?;
30
31        let output = ExtensionConfigOutput {
32            extension_id: systemprompt_identifiers::ExtensionId::new(ext.id()),
33            config_prefix: ext.config_prefix().map(String::from),
34            config_schema: ext.config_schema(),
35            has_config: ext.has_config(),
36        };
37
38        Ok(CommandOutput::card_value(
39            format!("Extension Config: {}", id),
40            &output,
41        ))
42    } else {
43        let mut extensions: Vec<ExtensionConfigSummary> = registry
44            .extensions()
45            .iter()
46            .map(|ext| ExtensionConfigSummary {
47                extension_id: systemprompt_identifiers::ExtensionId::new(ext.id()),
48                config_prefix: ext.config_prefix().map(String::from),
49                has_config: ext.has_config(),
50            })
51            .collect();
52
53        extensions.sort_by(|a, b| a.extension_id.cmp(&b.extension_id));
54        let total = extensions.len();
55
56        let output = ExtensionConfigListOutput { extensions, total };
57
58        Ok(CommandOutput::table_of(
59            vec!["extension_id", "config_prefix", "has_config"],
60            &output.extensions,
61        )
62        .with_title("Extension Configurations"))
63    }
64}