@@ -2461,6 +2461,40 @@ function resolveOutput(resolvedFlags: ResolvedFlags): OutputMode {
24612461 return "rich" ;
24622462}
24632463
2464+ function resolveOutputFromArgv ( argv : readonly string [ ] ) : OutputMode {
2465+ for ( let index = 0 ; index < argv . length ; index += 1 ) {
2466+ const token = argv [ index ] ?? "" ;
2467+
2468+ if ( token === "--json" ) {
2469+ return "json" ;
2470+ }
2471+ if ( token === "--md" || token === "--markdown" ) {
2472+ return "md" ;
2473+ }
2474+ if ( token === "--output" ) {
2475+ const value = argv [ index + 1 ] ;
2476+ if ( value === "rich" || value === "md" || value === "json" ) {
2477+ return value ;
2478+ }
2479+ if ( value === "markdown" ) {
2480+ return "md" ;
2481+ }
2482+ continue ;
2483+ }
2484+ if ( token . startsWith ( "--output=" ) ) {
2485+ const value = token . slice ( "--output=" . length ) ;
2486+ if ( value === "rich" || value === "md" || value === "json" ) {
2487+ return value ;
2488+ }
2489+ if ( value === "markdown" ) {
2490+ return "md" ;
2491+ }
2492+ }
2493+ }
2494+
2495+ return "rich" ;
2496+ }
2497+
24642498const DESIGN_SYSTEM_OUTPUT_BY_MODE = {
24652499 rich : "terminal" ,
24662500 md : "markdown" ,
@@ -4545,100 +4579,103 @@ function renderHttpError(
45454579 }
45464580}
45474581
4548- function handleRunError (
4582+ async function handleRunError (
45494583 error : unknown ,
45504584 options : {
45514585 debugStackMode : DebugStackMode | undefined ;
4586+ output : OutputMode ;
45524587 verbose : boolean ;
45534588 program ?: CommanderCommand ;
45544589 argv ?: readonly string [ ] ;
45554590 rootUsageName : string ;
45564591 commandPath : string ;
45574592 userErrorPattern : "runtime-user" | "usage" ;
45584593 }
4559- ) : void {
4594+ ) : Promise < void > {
45604595 const logger = createLogger ( ) ;
45614596
4562- if ( error instanceof UserError ) {
4563- renderCliErrorPattern (
4564- options . userErrorPattern === "usage"
4565- ? {
4566- kind : "usage" ,
4567- message : error . message ,
4568- rootUsageName : options . rootUsageName ,
4569- commandPath : options . commandPath
4570- }
4571- : {
4572- kind : "runtime-user" ,
4573- message : error . message
4574- }
4575- ) ;
4576- return ;
4577- }
4578-
4579- if ( error instanceof Error && error . name === "ToolcraftBugError" ) {
4580- renderCliErrorPattern ( {
4581- kind : "toolcraft-bug" ,
4582- error,
4583- debugStackMode : options . debugStackMode
4584- } ) ;
4585- return ;
4586- }
4587-
4588- if ( error instanceof CommanderError ) {
4589- process . exitCode = error . exitCode ;
4590- if ( error . code === "commander.helpDisplayed" || error . code === "commander.version" ) {
4597+ await withOutputFormat ( options . output , async ( ) => {
4598+ if ( error instanceof UserError ) {
4599+ renderCliErrorPattern (
4600+ options . userErrorPattern === "usage"
4601+ ? {
4602+ kind : "usage" ,
4603+ message : error . message ,
4604+ rootUsageName : options . rootUsageName ,
4605+ commandPath : options . commandPath
4606+ }
4607+ : {
4608+ kind : "runtime-user" ,
4609+ message : error . message
4610+ }
4611+ ) ;
45914612 return ;
45924613 }
4593- if ( error . code === "commander.unknownCommand" ) {
4594- logger . error (
4595- appendUsagePointer (
4596- formatUnknownCommandError ( error , options . program , options . argv ?? process . argv ) ,
4597- {
4598- rootUsageName : options . rootUsageName ,
4599- commandPath : options . commandPath
4600- }
4601- )
4602- ) ;
4614+
4615+ if ( error instanceof Error && error . name === "ToolcraftBugError" ) {
4616+ renderCliErrorPattern ( {
4617+ kind : "toolcraft-bug" ,
4618+ error,
4619+ debugStackMode : options . debugStackMode
4620+ } ) ;
46034621 return ;
46044622 }
4605- if ( error . code === "commander.unknownOption" ) {
4606- const argv = options . argv ?? process . argv ;
4623+
4624+ if ( error instanceof CommanderError ) {
4625+ process . exitCode = error . exitCode ;
4626+ if ( error . code === "commander.helpDisplayed" || error . code === "commander.version" ) {
4627+ return ;
4628+ }
4629+ if ( error . code === "commander.unknownCommand" ) {
4630+ logger . error (
4631+ appendUsagePointer (
4632+ formatUnknownCommandError ( error , options . program , options . argv ?? process . argv ) ,
4633+ {
4634+ rootUsageName : options . rootUsageName ,
4635+ commandPath : options . commandPath
4636+ }
4637+ )
4638+ ) ;
4639+ return ;
4640+ }
4641+ if ( error . code === "commander.unknownOption" ) {
4642+ const argv = options . argv ?? process . argv ;
4643+ logger . error (
4644+ appendUsagePointer ( formatUnknownOptionError ( error , options . program , argv ) , {
4645+ rootUsageName : options . rootUsageName ,
4646+ commandPath :
4647+ options . commandPath . length > 0
4648+ ? options . commandPath
4649+ : findCurrentCommanderCommandPath ( options . program , argv )
4650+ } )
4651+ ) ;
4652+ return ;
4653+ }
46074654 logger . error (
4608- appendUsagePointer ( formatUnknownOptionError ( error , options . program , argv ) , {
4655+ appendUsagePointer ( formatCommanderErrorMessage ( error ) , {
46094656 rootUsageName : options . rootUsageName ,
46104657 commandPath :
46114658 options . commandPath . length > 0
46124659 ? options . commandPath
4613- : findCurrentCommanderCommandPath ( options . program , argv )
4660+ : findCurrentCommanderCommandPath ( options . program , options . argv ?? process . argv )
46144661 } )
46154662 ) ;
46164663 return ;
46174664 }
4618- logger . error (
4619- appendUsagePointer ( formatCommanderErrorMessage ( error ) , {
4620- rootUsageName : options . rootUsageName ,
4621- commandPath :
4622- options . commandPath . length > 0
4623- ? options . commandPath
4624- : findCurrentCommanderCommandPath ( options . program , options . argv ?? process . argv )
4625- } )
4626- ) ;
4627- return ;
4628- }
46294665
4630- if ( isHttpErrorLike ( error ) ) {
4631- renderHttpError ( error , options ) ;
4632- process . exitCode = 1 ;
4633- return ;
4634- }
4666+ if ( isHttpErrorLike ( error ) ) {
4667+ renderHttpError ( error , options ) ;
4668+ process . exitCode = 1 ;
4669+ return ;
4670+ }
46354671
4636- const message = error instanceof Error ? error . message : String ( error ) ;
4637- renderCliErrorPattern ( {
4638- kind : "unexpected" ,
4639- message,
4640- stack : error instanceof Error ? error . stack : undefined ,
4641- debugStackMode : options . debugStackMode
4672+ const message = error instanceof Error ? error . message : String ( error ) ;
4673+ renderCliErrorPattern ( {
4674+ kind : "unexpected" ,
4675+ message,
4676+ stack : error instanceof Error ? error . stack : undefined ,
4677+ debugStackMode : options . debugStackMode
4678+ } ) ;
46424679 } ) ;
46434680}
46444681
@@ -5087,11 +5124,15 @@ export async function runCLI<TServices extends object = Record<string, unknown>>
50875124 process . stderr . write ( `Saved error report to ${ report . displayPath } \n` ) ;
50885125 }
50895126
5090- handleRunError ( error , {
5127+ await handleRunError ( error , {
50915128 debugStackMode :
50925129 resolvedFlags !== undefined
50935130 ? resolveDebugStackMode ( resolvedFlags . debug )
50945131 : getDebugStackModeFromArgv ( process . argv ) ,
5132+ output :
5133+ resolvedFlags !== undefined
5134+ ? resolveOutput ( resolvedFlags )
5135+ : resolveOutputFromArgv ( process . argv ) ,
50955136 verbose : resolvedFlags ? Boolean ( resolvedFlags . verbose ) : process . argv . includes ( "--verbose" ) ,
50965137 program,
50975138 argv : process . argv ,
0 commit comments