1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
//! Command-line interface definitions and argument parsing.
//!
//! This module defines the CLI structure for Mago using the [`clap`] crate. It provides
//! a unified interface for all Mago commands (lint, analyze, format, etc.) along with
//! global options that apply across all commands.
//!
//! # Architecture
//!
//! The CLI is structured in three layers:
//!
//! 1. **Top-Level Arguments** ([`CliArguments`]): Global options like workspace path,
//! configuration file, PHP version, and color settings
//! 2. **Command Enum** ([`MagoCommand`]): The specific command to execute (lint, analyze, etc.)
//! 3. **Command-Specific Arguments**: Each command variant contains its own argument struct
//! with command-specific options
//!
//! # Command Execution Flow
//!
//! 1. **Parse Arguments**: [`clap`] parses command-line arguments into [`CliArguments`]
//! 2. **Load Configuration**: Global options are used to load and merge configuration
//! 3. **Dispatch Command**: The [`MagoCommand`] variant dispatches to the appropriate
//! command implementation
//! 4. **Execute**: Each command's `execute()` method performs the actual operation
//!
//! # Available Commands
//!
//! - **`init`** ([`InitCommand`]): Initialize a new Mago configuration file
//! - **`config`** ([`ConfigCommand`]): Display the effective configuration
//! - **`list-files`** ([`ListFilesCommand`]): List files that will be processed
//! - **`lint`** ([`LintCommand`]): Run linting rules on PHP code
//! - **`analyze`** ([`AnalyzeCommand`]): Perform static analysis
//! - **`format`** ([`FormatCommand`]): Format PHP code
//! - **`guard`** ([`GuardCommand`]): Enforce architectural rules
//! - **`ast`** ([`AstCommand`]): Display the abstract syntax tree
//! - **`self-update`** ([`SelfUpdateCommand`]): Update Mago to the latest version
//! - **`generate-completions`** ([`GenerateCompletionsCommand`]): Generate shell completions
//!
//! # Configuration Hierarchy
//!
//! Command-line arguments have the highest precedence in the configuration hierarchy:
//!
//! 1. **CLI Arguments** (highest precedence)
//! 2. Environment variables (prefixed with `MAGO_`)
//! 3. `mago.toml` in the workspace
//! 4. Global config at `~/.config/mago/config.toml`
//! 5. Built-in defaults (lowest precedence)
use PathBuf;
use FromStr;
use ColorChoice;
use Parser;
use Styles;
use AnsiColor;
use Effects;
use PHPVersion;
use crateAnalyzeCommand;
use crateAstCommand;
use crateConfigCommand;
use crateFormatCommand;
use crateGenerateCompletionsCommand;
use crateGuardCommand;
use crateInitCommand;
use crateLintCommand;
use crateListFilesCommand;
use crateSelfUpdateCommand;
use crateError;
/// ANSI color styling configuration for Mago's CLI output.
///
/// This constant defines the color scheme used by [`clap`] when rendering help messages,
/// error messages, and other CLI output. The styling enhances readability and provides
/// visual hierarchy in terminal output.
///
/// # Color Scheme
///
/// - **Headers and Usage**: Bold green
/// - **Literals and Valid Values**: Bold cyan
/// - **Placeholders**: Cyan (non-bold)
/// - **Errors**: Bold red
/// - **Invalid Values**: Bold yellow
///
/// These colors respect terminal color support and will automatically disable if the
/// terminal doesn't support ANSI escape codes.
pub const CLAP_STYLING: Styles = styled
.header
.usage
.literal
.placeholder
.error
.valid
.invalid;
/// Enum representing all available Mago commands.
///
/// This enum is used by [`clap`] to dispatch to the appropriate command implementation
/// based on the subcommand provided by the user. Each variant contains the parsed
/// arguments specific to that command.
///
/// # Command Dispatch
///
/// Commands are dispatched in [`run()`](crate::run) using a match statement that calls
/// the `execute()` method on each command variant. Most commands follow a common pattern:
///
/// 1. Load the database using the orchestrator
/// 2. Create the appropriate service (lint, analyze, format, guard)
/// 3. Run the service and collect results
/// 4. Report results using the configured output format
///
/// # Special Cases
///
/// - **`self-update`**: Handled before configuration loading since it doesn't need
/// project configuration
/// - **`init`**: Interactive command that creates a new configuration file
/// - **`config`**: Diagnostic command that displays the effective configuration
/// - **`list-files`**: Diagnostic command that shows which files will be processed
/// Top-level CLI arguments parsed by [`clap`].
///
/// This struct contains global options that apply to all Mago commands, plus the
/// specific command to execute. Arguments defined here have the highest precedence
/// in the configuration hierarchy and will override settings from configuration files
/// and environment variables.
///
/// # Configuration Precedence
///
/// Values provided via CLI arguments override all other sources:
///
/// 1. **CLI Arguments** (this struct) - highest precedence
/// 2. **Environment Variables** (`MAGO_*` prefix)
/// 3. **Workspace Config** (`mago.toml`)
/// 4. **Global Config** (`~/.config/mago/config.toml`)
/// 5. **Defaults** - lowest precedence
///
/// # Usage Pattern
///
/// The CLI follows this pattern in [`run()`](crate::run):
///
/// 1. Parse arguments into [`CliArguments`] using [`Parser::parse()`]
/// 2. Initialize logging based on debug mode and color settings
/// 3. Handle `self-update` command specially (no config needed)
/// 4. Load and merge configuration from all sources
/// 5. Validate PHP version if not explicitly allowed
/// 6. Initialize thread pool with configured settings
/// 7. Dispatch to the appropriate command's `execute()` method
///
/// # Color Output
///
/// The CLI supports multiple color modes via `--colors`.
/// Colors are automatically disabled when output is piped or when the terminal doesn't
/// support ANSI escape codes.