systemprompt-cli 0.2.1

Unified CLI for systemprompt.io AI governance: agent orchestration, MCP governance, analytics, profiles, cloud deploy, and self-hosted operations.
Documentation
use anyhow::{Result, anyhow};
use clap::Args;
use systemprompt_runtime::AppContext;
use systemprompt_users::{UserAdminService, UserService};

use crate::CliConfig;
use crate::commands::admin::users::types::RoleAssignOutput;
use crate::shared::CommandResult;

#[derive(Debug, Args)]
pub struct AssignArgs {
    #[arg(value_name = "USER_ID")]
    pub user: String,

    #[arg(long, value_delimiter = ',')]
    pub roles: Vec<String>,
}

pub async fn execute(
    args: AssignArgs,
    _config: &CliConfig,
) -> Result<CommandResult<RoleAssignOutput>> {
    let ctx = AppContext::new().await?;
    let user_service = UserService::new(ctx.db_pool())?;
    let admin_service = UserAdminService::new(user_service.clone());

    if args.roles.is_empty() {
        return Err(anyhow!("At least one role must be specified"));
    }

    let existing = admin_service.find_user(&args.user).await?;
    let Some(existing_user) = existing else {
        return Err(anyhow!("User not found: {}", args.user));
    };

    let user = user_service
        .assign_roles(&existing_user.id, &args.roles)
        .await?;

    let output = RoleAssignOutput {
        id: user.id.clone(),
        name: user.name.clone(),
        roles: user.roles.clone(),
        message: format!("Roles assigned to user '{}'", user.name),
    };

    Ok(CommandResult::text(output).with_title("Roles Assigned"))
}