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