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 roles;
12pub mod schemas;
13pub mod templates;
14pub mod tools;
15
16use clap::{Args, Subcommand};
17
18use super::discover_registry;
19use super::types::CapabilitiesSummaryOutput;
20use crate::CliConfig;
21use crate::shared::{CommandOutput, render_result};
22
23#[derive(Debug, Args)]
24pub struct CapabilitiesArgs {
25    #[command(subcommand)]
26    pub cmd: Option<CapabilitiesCommands>,
27}
28
29#[derive(Debug, Subcommand)]
30pub enum CapabilitiesCommands {
31    #[command(about = "List all jobs across extensions")]
32    Jobs(jobs::JobsArgs),
33
34    #[command(about = "List all templates across extensions")]
35    Templates(templates::TemplatesArgs),
36
37    #[command(about = "List all schemas across extensions")]
38    Schemas(schemas::SchemasArgs),
39
40    #[command(about = "List all tools across extensions")]
41    Tools(tools::ToolsArgs),
42
43    #[command(about = "List all roles across extensions")]
44    Roles(roles::RolesArgs),
45}
46
47pub(super) fn execute(args: CapabilitiesArgs, config: &CliConfig) {
48    match args.cmd {
49        None => {
50            render_result(&execute_summary(config), config);
51        },
52        Some(CapabilitiesCommands::Jobs(args)) => {
53            render_result(&jobs::execute(&args, config), config);
54        },
55        Some(CapabilitiesCommands::Templates(args)) => {
56            render_result(&templates::execute(&args, config), config);
57        },
58        Some(CapabilitiesCommands::Schemas(args)) => {
59            render_result(&schemas::execute(&args, config), config);
60        },
61        Some(CapabilitiesCommands::Tools(args)) => {
62            render_result(&tools::execute(&args, config), config);
63        },
64        Some(CapabilitiesCommands::Roles(args)) => {
65            render_result(&roles::execute(&args, config), config);
66        },
67    }
68}
69
70fn execute_summary(_config: &CliConfig) -> CommandOutput {
71    let registry = discover_registry();
72
73    let mut jobs = 0;
74    let mut templates = 0;
75    let mut schemas = 0;
76    let mut tools = 0;
77    let mut roles = 0;
78    let mut extension_count = 0;
79
80    for ext in registry.extensions() {
81        extension_count += 1;
82        jobs += ext.jobs().len();
83        schemas += ext.schemas().len();
84        roles += ext.roles().len();
85        tools += ext.tool_providers().len();
86
87        for provider in ext.template_providers() {
88            templates += provider.templates().len();
89        }
90    }
91
92    let output = CapabilitiesSummaryOutput {
93        jobs,
94        templates,
95        schemas,
96        tools,
97        roles,
98        extension_count,
99    };
100
101    CommandOutput::card_value("Capabilities Summary", &output)
102}