Skip to main content

systemprompt_cli/commands/admin/setup/
mod.rs

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