@@ -16,6 +16,22 @@ pub struct Cli {
16
16
/// Suppress non-essential output
17
17
#[ arg( long, short = 'q' ) ]
18
18
pub quiet : bool ,
19
+
20
+ /// Use named configuration profile
21
+ #[ arg( long, short = 'p' ) ]
22
+ pub profile : Option < String > ,
23
+
24
+ /// Auto-detect CI environment and apply optimizations
25
+ #[ arg( long) ]
26
+ pub detect_ci : bool ,
27
+
28
+ /// Override environment detection (for testing CI configurations locally)
29
+ #[ arg( long) ]
30
+ pub simulate_ci : Option < CiSystem > ,
31
+
32
+ /// Configuration directory for profiles and settings
33
+ #[ arg( long, default_value = "~/.config/mandrel-mcp-th" ) ]
34
+ pub config_dir : PathBuf ,
19
35
}
20
36
21
37
#[ derive( Subcommand , Debug ) ]
@@ -28,6 +44,12 @@ pub enum Commands {
28
44
29
45
/// Validate configuration files
30
46
Validate ( ValidateArgs ) ,
47
+
48
+ /// Manage configuration profiles
49
+ Profile ( ProfileArgs ) ,
50
+
51
+ /// Watch files and auto-generate reports
52
+ Watch ( WatchArgs ) ,
31
53
}
32
54
33
55
#[ derive( Args , Debug ) ]
@@ -101,6 +123,220 @@ pub struct ValidateArgs {
101
123
/// Configuration file to validate
102
124
#[ arg( ) ]
103
125
pub config : PathBuf ,
126
+
127
+ /// Enable strict validation mode (fail on warnings)
128
+ #[ arg( long) ]
129
+ pub strict : bool ,
130
+
131
+ /// Output directory for validation reports
132
+ #[ arg( short = 'o' , long) ]
133
+ pub output : Option < PathBuf > ,
134
+
135
+ /// Report formats to generate for validation results
136
+ #[ arg( short = 'f' , long, value_delimiter = ',' ) ]
137
+ pub formats : Vec < ReportFormat > ,
138
+
139
+ /// Check JSONPath expressions in test cases
140
+ #[ arg( long) ]
141
+ pub check_jsonpath : bool ,
142
+
143
+ /// Validate JSON schema compliance
144
+ #[ arg( long) ]
145
+ pub check_schema : bool ,
146
+
147
+ /// Validate MCP protocol compliance
148
+ #[ arg( long) ]
149
+ pub check_protocol : bool ,
150
+
151
+ /// Enable all validation checks
152
+ #[ arg( long) ]
153
+ pub check_all : bool ,
154
+
155
+ /// Enable detailed validation diagnostics
156
+ #[ arg( long) ]
157
+ pub detailed : bool ,
158
+
159
+ /// Only validate, don't suggest fixes
160
+ #[ arg( long) ]
161
+ pub no_suggestions : bool ,
162
+ }
163
+
164
+ #[ derive( Args , Debug ) ]
165
+ pub struct ProfileArgs {
166
+ #[ command( subcommand) ]
167
+ pub command : ProfileCommand ,
168
+ }
169
+
170
+ #[ derive( Subcommand , Debug ) ]
171
+ pub enum ProfileCommand {
172
+ /// Save current configuration as a named profile
173
+ Save ( ProfileSaveArgs ) ,
174
+
175
+ /// Load and apply a named profile
176
+ Load ( ProfileLoadArgs ) ,
177
+
178
+ /// List all available profiles
179
+ List ,
180
+
181
+ /// Delete a named profile
182
+ Delete ( ProfileDeleteArgs ) ,
183
+
184
+ /// Export profile to file
185
+ Export ( ProfileExportArgs ) ,
186
+
187
+ /// Import profile from file
188
+ Import ( ProfileImportArgs ) ,
189
+
190
+ /// Show profile details
191
+ Show ( ProfileShowArgs ) ,
192
+ }
193
+
194
+ #[ derive( Args , Debug ) ]
195
+ pub struct ProfileSaveArgs {
196
+ /// Profile name
197
+ pub name : String ,
198
+
199
+ /// Profile description
200
+ #[ arg( short = 'd' , long) ]
201
+ pub description : Option < String > ,
202
+
203
+ /// Report formats to include
204
+ #[ arg( short = 'f' , long, value_delimiter = ',' ) ]
205
+ pub formats : Vec < ReportFormat > ,
206
+
207
+ /// Template to use
208
+ #[ arg( short = 't' , long) ]
209
+ pub template : Option < TemplateName > ,
210
+
211
+ /// Organization strategy
212
+ #[ arg( long) ]
213
+ pub organization : Option < OrganizationStrategy > ,
214
+
215
+ /// Timestamp format
216
+ #[ arg( long) ]
217
+ pub timestamp : Option < TimestampFormat > ,
218
+
219
+ /// Include performance metrics
220
+ #[ arg( long) ]
221
+ pub include_performance : Option < bool > ,
222
+
223
+ /// Include validation details
224
+ #[ arg( long) ]
225
+ pub include_validation : Option < bool > ,
226
+
227
+ /// Set as default profile
228
+ #[ arg( long) ]
229
+ pub set_default : bool ,
230
+ }
231
+
232
+ #[ derive( Args , Debug ) ]
233
+ pub struct ProfileLoadArgs {
234
+ /// Profile name to load
235
+ pub name : String ,
236
+
237
+ /// Apply profile settings globally
238
+ #[ arg( long) ]
239
+ pub global : bool ,
240
+ }
241
+
242
+ #[ derive( Args , Debug ) ]
243
+ pub struct ProfileDeleteArgs {
244
+ /// Profile name to delete
245
+ pub name : String ,
246
+
247
+ /// Skip confirmation prompt
248
+ #[ arg( long) ]
249
+ pub force : bool ,
250
+ }
251
+
252
+ #[ derive( Args , Debug ) ]
253
+ pub struct ProfileExportArgs {
254
+ /// Profile name to export
255
+ pub name : String ,
256
+
257
+ /// Output file path
258
+ #[ arg( short = 'o' , long) ]
259
+ pub output : PathBuf ,
260
+
261
+ /// Export format
262
+ #[ arg( long, default_value = "json" ) ]
263
+ pub format : ExportFormat ,
264
+ }
265
+
266
+ #[ derive( Args , Debug ) ]
267
+ pub struct ProfileImportArgs {
268
+ /// Input file path
269
+ pub input : PathBuf ,
270
+
271
+ /// Override profile name
272
+ #[ arg( long) ]
273
+ pub name : Option < String > ,
274
+
275
+ /// Overwrite existing profile
276
+ #[ arg( long) ]
277
+ pub overwrite : bool ,
278
+ }
279
+
280
+ #[ derive( Args , Debug ) ]
281
+ pub struct ProfileShowArgs {
282
+ /// Profile name to show
283
+ pub name : String ,
284
+
285
+ /// Show in detailed format
286
+ #[ arg( long) ]
287
+ pub detailed : bool ,
288
+ }
289
+
290
+ #[ derive( Args , Debug ) ]
291
+ pub struct WatchArgs {
292
+ #[ command( subcommand) ]
293
+ pub command : WatchCommand ,
294
+ }
295
+
296
+ #[ derive( Subcommand , Debug ) ]
297
+ pub enum WatchCommand {
298
+ /// Start watching files for changes
299
+ Start ( WatchStartArgs ) ,
300
+
301
+ /// Stop all watchers
302
+ Stop ,
303
+
304
+ /// Show watch status
305
+ Status ,
306
+ }
307
+
308
+ #[ derive( Args , Debug ) ]
309
+ pub struct WatchStartArgs {
310
+ /// Input files or directories to watch
311
+ pub inputs : Vec < PathBuf > ,
312
+
313
+ /// Output directory for generated reports
314
+ #[ arg( short = 'o' , long, default_value = "./reports" ) ]
315
+ pub output : PathBuf ,
316
+
317
+ /// File patterns to watch (glob patterns)
318
+ #[ arg( short = 'p' , long, value_delimiter = ',' ) ]
319
+ pub patterns : Vec < String > ,
320
+
321
+ /// Report formats to generate
322
+ #[ arg( short = 'f' , long, value_delimiter = ',' ) ]
323
+ pub formats : Vec < ReportFormat > ,
324
+
325
+ /// Debounce delay in milliseconds
326
+ #[ arg( long, default_value = "500" ) ]
327
+ pub debounce : u64 ,
328
+
329
+ /// Auto-open reports in browser
330
+ #[ arg( long) ]
331
+ pub auto_open : bool ,
332
+
333
+ /// Run in background (daemonize)
334
+ #[ arg( long) ]
335
+ pub daemon : bool ,
336
+
337
+ /// Profile to use for report generation
338
+ #[ arg( long) ]
339
+ pub profile : Option < String > ,
104
340
}
105
341
106
342
#[ derive( ValueEnum , Clone , Debug , PartialEq , Serialize , Deserialize ) ]
@@ -137,6 +373,25 @@ pub enum TimestampFormat {
137
373
None , // No timestamp
138
374
}
139
375
376
+ #[ derive( ValueEnum , Clone , Debug , PartialEq , Serialize , Deserialize ) ]
377
+ pub enum CiSystem {
378
+ GitHubActions ,
379
+ Jenkins ,
380
+ GitLabCi ,
381
+ CircleCi ,
382
+ Travis ,
383
+ Buildkite ,
384
+ TeamCity ,
385
+ AzureDevOps ,
386
+ }
387
+
388
+ #[ derive( ValueEnum , Clone , Debug , PartialEq , Serialize , Deserialize ) ]
389
+ pub enum ExportFormat {
390
+ Json ,
391
+ Yaml ,
392
+ Toml ,
393
+ }
394
+
140
395
/// Parse key=value pairs for custom fields
141
396
fn parse_key_val ( s : & str ) -> Result < ( String , String ) , String > {
142
397
let parts: Vec < & str > = s. splitn ( 2 , '=' ) . collect ( ) ;
0 commit comments