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(
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}