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