systemprompt_cli/commands/plugins/
config.rs1use 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}