systemprompt_cli/commands/admin/setup/
mod.rs1mod 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}