Skip to main content

systemprompt_cli/commands/plugins/capabilities/
mod.rs

1//! `plugins capabilities` subcommands.
2//!
3//! Aggregates the capabilities each extension contributes — jobs, templates,
4//! schemas, tools, roles, and LLM providers — either as a per-kind listing or
5//! as a single rolled-up summary across the whole extension registry.
6//!
7//! Copyright (c) systemprompt.io — Business Source License 1.1.
8//! See <https://systemprompt.io> for licensing details.
9
10pub mod jobs;
11pub mod llm_providers;
12pub mod roles;
13pub mod schemas;
14pub mod templates;
15pub mod tools;
16
17use clap::{Args, Subcommand};
18
19use super::discover_registry;
20use super::types::CapabilitiesSummaryOutput;
21use crate::CliConfig;
22use crate::shared::{CommandOutput, render_result};
23
24#[derive(Debug, Args)]
25pub struct CapabilitiesArgs {
26    #[command(subcommand)]
27    pub cmd: Option<CapabilitiesCommands>,
28}
29
30#[derive(Debug, Subcommand)]
31pub enum CapabilitiesCommands {
32    #[command(about = "List all jobs across extensions")]
33    Jobs(jobs::JobsArgs),
34
35    #[command(about = "List all templates across extensions")]
36    Templates(templates::TemplatesArgs),
37
38    #[command(about = "List all schemas across extensions")]
39    Schemas(schemas::SchemasArgs),
40
41    #[command(about = "List all tools across extensions")]
42    Tools(tools::ToolsArgs),
43
44    #[command(about = "List all roles across extensions")]
45    Roles(roles::RolesArgs),
46
47    #[command(about = "List all LLM providers across extensions")]
48    LlmProviders(llm_providers::LlmProvidersArgs),
49}
50
51pub(super) fn execute(args: CapabilitiesArgs, config: &CliConfig) {
52    match args.cmd {
53        None => {
54            render_result(&execute_summary(config), config);
55        },
56        Some(CapabilitiesCommands::Jobs(args)) => {
57            render_result(&jobs::execute(&args, config), config);
58        },
59        Some(CapabilitiesCommands::Templates(args)) => {
60            render_result(&templates::execute(&args, config), config);
61        },
62        Some(CapabilitiesCommands::Schemas(args)) => {
63            render_result(&schemas::execute(&args, config), config);
64        },
65        Some(CapabilitiesCommands::Tools(args)) => {
66            render_result(&tools::execute(&args, config), config);
67        },
68        Some(CapabilitiesCommands::Roles(args)) => {
69            render_result(&roles::execute(&args, config), config);
70        },
71        Some(CapabilitiesCommands::LlmProviders(args)) => {
72            render_result(&llm_providers::execute(&args, config), config);
73        },
74    }
75}
76
77fn execute_summary(_config: &CliConfig) -> CommandOutput {
78    let registry = discover_registry();
79
80    let mut jobs = 0;
81    let mut templates = 0;
82    let mut schemas = 0;
83    let mut tools = 0;
84    let mut roles = 0;
85    let mut llm_providers = 0;
86    let mut extension_count = 0;
87
88    for ext in registry.extensions() {
89        extension_count += 1;
90        jobs += ext.jobs().len();
91        schemas += ext.schemas().len();
92        roles += ext.roles().len();
93        llm_providers += ext.llm_providers().len();
94        tools += ext.tool_providers().len();
95
96        for provider in ext.template_providers() {
97            templates += provider.templates().len();
98        }
99    }
100
101    let output = CapabilitiesSummaryOutput {
102        jobs,
103        templates,
104        schemas,
105        tools,
106        roles,
107        llm_providers,
108        extension_count,
109    };
110
111    CommandOutput::card_value("Capabilities Summary", &output)
112}