Skip to main content

systemprompt_cli/commands/plugins/capabilities/
roles.rs

1//! `plugins capabilities roles` command.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use clap::Args;
7
8use crate::CliConfig;
9use crate::commands::plugins::discover_registry;
10use crate::commands::plugins::types::{RoleWithExtension, RolesListOutput};
11use crate::shared::CommandOutput;
12
13#[derive(Debug, Clone, Args)]
14pub struct RolesArgs {
15    #[arg(long, help = "Filter by extension ID")]
16    pub extension: Option<String>,
17}
18
19pub fn execute(args: &RolesArgs, _config: &CliConfig) -> CommandOutput {
20    let registry = discover_registry();
21
22    let roles: Vec<RoleWithExtension> = registry
23        .extensions()
24        .iter()
25        .filter(|ext| args.extension.as_ref().is_none_or(|f| ext.id().contains(f)))
26        .flat_map(|ext| {
27            ext.roles()
28                .iter()
29                .map(|role| RoleWithExtension {
30                    extension_id: systemprompt_identifiers::PluginId::new(ext.id()),
31                    extension_name: ext.name().to_owned(),
32                    role_name: role.name.clone(),
33                    display_name: role.display_name.clone(),
34                    description: role.description.clone(),
35                    permissions: role.permissions.clone(),
36                })
37                .collect::<Vec<_>>()
38        })
39        .collect();
40
41    let total = roles.len();
42
43    let output = RolesListOutput { roles, total };
44
45    CommandOutput::table_of(
46        vec!["extension_id", "role_name", "display_name", "description"],
47        &output.roles,
48    )
49    .with_title("Roles Across Extensions")
50}