systemprompt_cli/commands/admin/
mod.rs1pub mod access_control;
2pub mod agents;
3pub mod bootstrap;
4pub mod bridge;
5pub mod config;
6pub mod keys;
7pub mod session;
8pub mod setup;
9pub mod users;
10
11use anyhow::Result;
12use clap::Subcommand;
13use systemprompt_runtime::DatabaseContext;
14
15use crate::CliConfig;
16use crate::shared::render_result;
17
18#[derive(Debug, Subcommand)]
19pub enum AdminCommands {
20 #[command(subcommand, about = "User management and IP banning")]
21 Users(users::UsersCommands),
22
23 #[command(subcommand, about = "Agent management")]
24 Agents(agents::AgentsCommands),
25
26 #[command(subcommand, about = "Configuration management and rate limits")]
27 Config(config::ConfigCommands),
28
29 #[command(about = "Interactive setup wizard for local development environment")]
30 Setup(setup::SetupArgs),
31
32 #[command(
33 about = "Idempotently ensure the platform admin user exists with the admin role. Required \
34 by every install recipe before services start."
35 )]
36 Bootstrap(bootstrap::BootstrapArgs),
37
38 #[command(subcommand, about = "Manage CLI session and profile switching")]
39 Session(session::SessionCommands),
40
41 #[command(
42 subcommand,
43 about = "Bridge helper enrollment (device certs, exchange codes)"
44 )]
45 Bridge(bridge::BridgeCommands),
46
47 #[command(
48 subcommand,
49 name = "access-control",
50 about = "Access-control baseline operations (DB → YAML export)"
51 )]
52 AccessControl(access_control::AccessControlCommands),
53
54 #[command(
55 subcommand,
56 about = "RSA signing-key generation for the federated JWT plane"
57 )]
58 Keys(keys::KeysCommands),
59}
60
61pub async fn execute(cmd: AdminCommands, config: &CliConfig) -> Result<()> {
62 match cmd {
63 AdminCommands::Users(cmd) => users::execute(cmd, config).await,
64 AdminCommands::Agents(cmd) => agents::execute(cmd).await,
65 AdminCommands::Config(cmd) => config::execute(cmd, config),
66 AdminCommands::Setup(args) => {
67 let result = setup::execute(args, config).await?;
68 render_result(&result);
69 Ok(())
70 },
71 AdminCommands::Bootstrap(args) => {
72 let result = bootstrap::execute(args, config).await?;
73 render_result(&result);
74 Ok(())
75 },
76 AdminCommands::Session(cmd) => session::execute(cmd, config).await,
77 AdminCommands::Bridge(cmd) => bridge::execute(cmd, config).await,
78 AdminCommands::AccessControl(cmd) => access_control::execute(cmd, config).await,
79 AdminCommands::Keys(cmd) => keys::execute(cmd).await,
80 }
81}
82
83pub async fn execute_with_db(
84 cmd: AdminCommands,
85 db_ctx: &DatabaseContext,
86 config: &CliConfig,
87) -> Result<()> {
88 match cmd {
89 AdminCommands::Users(cmd) => users::execute_with_db(cmd, db_ctx, config).await,
90 _ => anyhow::bail!("This command requires full profile context"),
91 }
92}