1use std::{ffi::OsString, path::PathBuf};
2
3use crate::secrets_cli::SecretsCommand;
4use clap::{Args, Parser, Subcommand};
5
6#[derive(Parser, Debug)]
7#[command(name = "greentic-dev")]
8#[command(version)]
9#[command(about = "Greentic developer tooling CLI")]
10pub struct Cli {
11 #[command(subcommand)]
12 pub command: Command,
13}
14
15#[derive(Subcommand, Debug)]
16pub enum Command {
17 Flow(PassthroughArgs),
19 Pack(PassthroughArgs),
21 Component(PassthroughArgs),
23 #[command(subcommand)]
25 Config(ConfigCommand),
26 #[command(subcommand)]
28 Mcp(McpCommand),
29 Gui(PassthroughArgs),
31 #[command(subcommand)]
33 Secrets(SecretsCommand),
34 #[command(subcommand)]
36 Tools(ToolsCommand),
37 Install(InstallArgs),
39 Cbor(CborArgs),
41 Wizard(Box<WizardCommand>),
43}
44
45#[derive(Args, Debug, Clone)]
46#[command(disable_help_flag = true)]
47pub struct PassthroughArgs {
48 #[arg(
50 value_name = "ARGS",
51 trailing_var_arg = true,
52 allow_hyphen_values = true
53 )]
54 pub args: Vec<OsString>,
55}
56
57#[derive(Subcommand, Debug)]
58pub enum McpCommand {
59 Doctor(McpDoctorArgs),
61}
62
63#[derive(Args, Debug)]
64pub struct McpDoctorArgs {
65 pub provider: String,
67 #[arg(long = "json")]
69 pub json: bool,
70}
71
72#[derive(Subcommand, Debug)]
73pub enum ConfigCommand {
74 Set(ConfigSetArgs),
76}
77
78#[derive(Subcommand, Debug)]
79pub enum ToolsCommand {
80 Install(ToolsInstallArgs),
82}
83
84#[derive(Subcommand, Debug)]
85pub enum InstallSubcommand {
86 Tools(ToolsInstallArgs),
88}
89
90#[derive(Args, Debug)]
91pub struct InstallArgs {
92 #[command(subcommand)]
93 pub command: Option<InstallSubcommand>,
94 #[arg(long = "tenant")]
96 pub tenant: Option<String>,
97 #[arg(long = "token")]
99 pub token: Option<String>,
100 #[arg(long = "bin-dir")]
102 pub bin_dir: Option<PathBuf>,
103 #[arg(long = "docs-dir")]
105 pub docs_dir: Option<PathBuf>,
106 #[arg(long = "locale")]
108 pub locale: Option<String>,
109}
110
111#[derive(Args, Debug)]
112pub struct ToolsInstallArgs {
113 #[arg(long = "latest")]
115 pub latest: bool,
116}
117
118#[derive(Args, Debug)]
119pub struct ConfigSetArgs {
120 pub key: String,
122 pub value: String,
124 #[arg(long = "file")]
126 pub file: Option<PathBuf>,
127}
128
129#[derive(Args, Debug)]
130pub struct CborArgs {
131 #[arg(value_name = "PATH")]
133 pub path: PathBuf,
134}
135
136#[derive(Args, Debug, Clone)]
137pub struct WizardCommand {
138 #[command(subcommand)]
139 pub command: Option<WizardSubcommand>,
140 #[command(flatten)]
141 pub launch: WizardLaunchArgs,
142}
143
144#[derive(Subcommand, Debug, Clone)]
145pub enum WizardSubcommand {
146 Validate(WizardValidateArgs),
148 Apply(WizardApplyArgs),
150}
151
152#[derive(Args, Debug, Clone)]
153pub struct WizardLaunchArgs {
154 #[arg(long = "frontend", default_value = "json")]
156 pub frontend: String,
157 #[arg(long = "locale")]
159 pub locale: Option<String>,
160 #[arg(long = "emit-answers")]
162 pub emit_answers: Option<PathBuf>,
163 #[arg(long = "schema-version")]
165 pub schema_version: Option<String>,
166 #[arg(long = "migrate")]
168 pub migrate: bool,
169 #[arg(long = "out")]
171 pub out: Option<PathBuf>,
172 #[arg(long = "dry-run")]
174 pub dry_run: bool,
175 #[arg(long = "yes")]
177 pub yes: bool,
178 #[arg(long = "non-interactive")]
180 pub non_interactive: bool,
181 #[arg(long = "unsafe-commands")]
183 pub unsafe_commands: bool,
184 #[arg(long = "allow-destructive")]
186 pub allow_destructive: bool,
187}
188
189#[derive(Args, Debug, Clone)]
190pub struct WizardValidateArgs {
191 #[arg(long = "answers")]
193 pub answers: PathBuf,
194 #[arg(long = "frontend", default_value = "json")]
196 pub frontend: String,
197 #[arg(long = "locale")]
199 pub locale: Option<String>,
200 #[arg(long = "emit-answers")]
202 pub emit_answers: Option<PathBuf>,
203 #[arg(long = "schema-version")]
205 pub schema_version: Option<String>,
206 #[arg(long = "migrate")]
208 pub migrate: bool,
209 #[arg(long = "out")]
211 pub out: Option<PathBuf>,
212}
213
214#[derive(Args, Debug, Clone)]
215pub struct WizardApplyArgs {
216 #[arg(long = "answers")]
218 pub answers: PathBuf,
219 #[arg(long = "frontend", default_value = "json")]
221 pub frontend: String,
222 #[arg(long = "locale")]
224 pub locale: Option<String>,
225 #[arg(long = "emit-answers")]
227 pub emit_answers: Option<PathBuf>,
228 #[arg(long = "schema-version")]
230 pub schema_version: Option<String>,
231 #[arg(long = "migrate")]
233 pub migrate: bool,
234 #[arg(long = "out")]
236 pub out: Option<PathBuf>,
237 #[arg(long = "yes")]
239 pub yes: bool,
240 #[arg(long = "non-interactive")]
242 pub non_interactive: bool,
243 #[arg(long = "unsafe-commands")]
245 pub unsafe_commands: bool,
246 #[arg(long = "allow-destructive")]
248 pub allow_destructive: bool,
249}