Skip to main content

systemprompt_cli/commands/admin/setup/
mod.rs

1mod common;
2mod docker;
3mod docker_compose;
4mod docker_database;
5mod postgres;
6mod profile;
7mod secrets;
8mod types;
9mod wizard;
10mod wizard_dry_run;
11mod wizard_prompts;
12
13use crate::shared::CommandResult;
14use anyhow::Result;
15use clap::Args;
16
17pub use types::*;
18
19#[derive(Debug, Args)]
20pub struct SetupArgs {
21    #[arg(
22        short,
23        long,
24        help = "Target environment name (e.g., dev, staging, prod)"
25    )]
26    pub environment: Option<String>,
27
28    #[arg(
29        long,
30        help = "Use Docker for PostgreSQL (default: use existing installation)"
31    )]
32    pub docker: bool,
33
34    #[arg(
35        long,
36        env = "SYSTEMPROMPT_DB_HOST",
37        default_value = "localhost",
38        help = "PostgreSQL host"
39    )]
40    pub db_host: String,
41
42    #[arg(
43        long,
44        env = "SYSTEMPROMPT_DB_PORT",
45        default_value = "5432",
46        help = "PostgreSQL port"
47    )]
48    pub db_port: u16,
49
50    #[arg(
51        long,
52        env = "SYSTEMPROMPT_DB_USER",
53        help = "PostgreSQL user (default: systemprompt_`<env>`)"
54    )]
55    pub db_user: Option<String>,
56
57    #[arg(
58        long,
59        env = "SYSTEMPROMPT_DB_PASSWORD",
60        help = "PostgreSQL password (auto-generated if not provided)"
61    )]
62    pub db_password: Option<String>,
63
64    #[arg(
65        long,
66        env = "SYSTEMPROMPT_DB_NAME",
67        help = "PostgreSQL database name (default: systemprompt_`<env>`)"
68    )]
69    pub db_name: Option<String>,
70
71    #[arg(long, env = "GEMINI_API_KEY", help = "Google AI (Gemini) API key")]
72    pub gemini_key: Option<String>,
73
74    #[arg(long, env = "ANTHROPIC_API_KEY", help = "Anthropic (Claude) API key")]
75    pub anthropic_key: Option<String>,
76
77    #[arg(long, env = "OPENAI_API_KEY", help = "OpenAI (GPT) API key")]
78    pub openai_key: Option<String>,
79
80    #[arg(long, env = "GITHUB_TOKEN", help = "GitHub token (optional)")]
81    pub github_token: Option<String>,
82
83    #[arg(long, help = "Run database migrations after setup")]
84    pub migrate: bool,
85
86    #[arg(
87        long,
88        conflicts_with = "migrate",
89        help = "Skip migrations (non-interactive default)"
90    )]
91    pub no_migrate: bool,
92
93    #[arg(long, help = "Preview setup without creating files or making changes")]
94    pub dry_run: bool,
95
96    #[arg(short = 'y', long, help = "Skip confirmation prompts")]
97    pub yes: bool,
98}
99
100impl SetupArgs {
101    pub fn effective_db_user(&self, env_name: &str) -> String {
102        self.db_user
103            .clone()
104            .unwrap_or_else(|| format!("systemprompt_{}", env_name))
105    }
106
107    pub fn effective_db_name(&self, env_name: &str) -> String {
108        self.db_name
109            .clone()
110            .unwrap_or_else(|| format!("systemprompt_{}", env_name))
111    }
112
113    pub const fn has_ai_provider(&self) -> bool {
114        self.gemini_key.is_some() || self.anthropic_key.is_some() || self.openai_key.is_some()
115    }
116}
117
118pub async fn execute(
119    args: SetupArgs,
120    config: &crate::CliConfig,
121) -> Result<CommandResult<SetupOutput>> {
122    wizard::execute(args, config).await
123}