@@ -29,6 +29,7 @@ type ParsedFlagRecord = {
2929export function parseArgs ( argv : string [ ] , options ?: ParseArgsOptions ) : ParsedArgs {
3030 const strictFlags = options ?. strictFlags ?? isStrictFlagModeEnabled ( process . env . AGENT_DEVICE_STRICT_FLAGS ) ;
3131 const flags : CliFlags = { json : false , help : false , version : false } ;
32+ let command : string | null = null ;
3233 const positionals : string [ ] = [ ] ;
3334 const warnings : string [ ] = [ ] ;
3435 const providedFlags : ParsedFlagRecord [ ] = [ ] ;
@@ -41,19 +42,26 @@ export function parseArgs(argv: string[], options?: ParseArgsOptions): ParsedArg
4142 continue ;
4243 }
4344 if ( ! parseFlags ) {
44- positionals . push ( arg ) ;
45+ if ( ! command ) command = arg ;
46+ else positionals . push ( arg ) ;
4547 continue ;
4648 }
4749 const isLongFlag = arg . startsWith ( '--' ) ;
4850 const isShortFlag = arg . startsWith ( '-' ) && arg . length > 1 ;
4951 if ( ! isLongFlag && ! isShortFlag ) {
50- positionals . push ( arg ) ;
52+ if ( ! command ) command = arg ;
53+ else positionals . push ( arg ) ;
5154 continue ;
5255 }
5356
5457 const [ token , inlineValue ] = isLongFlag ? splitLongFlag ( arg ) : [ arg , undefined ] ;
5558 const definition = getFlagDefinition ( token ) ;
5659 if ( ! definition ) {
60+ if ( shouldTreatUnknownDashTokenAsPositional ( command , positionals , arg ) ) {
61+ if ( ! command ) command = arg ;
62+ else positionals . push ( arg ) ;
63+ continue ;
64+ }
5765 throw new AppError ( 'INVALID_ARGS' , `Unknown flag: ${ token } ` ) ;
5866 }
5967
@@ -63,7 +71,6 @@ export function parseArgs(argv: string[], options?: ParseArgsOptions): ParsedArg
6371 providedFlags . push ( { key : definition . key , token } ) ;
6472 }
6573
66- const command = positionals . shift ( ) ?? null ;
6774 const commandSchema = getCommandSchema ( command ) ;
6875 const allowedFlagKeys = new Set < FlagKey > ( [
6976 ...GLOBAL_FLAG_KEYS ,
@@ -165,6 +172,24 @@ function looksLikeFlagToken(value: string): boolean {
165172 return getFlagDefinition ( token ) !== undefined ;
166173}
167174
175+ function shouldTreatUnknownDashTokenAsPositional (
176+ command : string | null ,
177+ positionals : string [ ] ,
178+ arg : string ,
179+ ) : boolean {
180+ if ( ! isNegativeNumericToken ( arg ) ) return false ;
181+ if ( ! command ) return false ;
182+ const schema = getCommandSchema ( command ) ;
183+ if ( ! schema ) return true ;
184+ if ( schema . positionalArgs . length === 0 ) return false ;
185+ if ( positionals . length < schema . positionalArgs . length ) return true ;
186+ return schema . positionalArgs . some ( ( entry ) => entry . includes ( '?' ) ) ;
187+ }
188+
189+ function isNegativeNumericToken ( value : string ) : boolean {
190+ return / ^ - \d + ( \. \d + ) ? $ / . test ( value ) ;
191+ }
192+
168193export function toDaemonFlags ( flags : CliFlags ) : Omit < CliFlags , 'json' | 'help' | 'version' > {
169194 const { json : _json , help : _help , version : _version , ...daemonFlags } = flags ;
170195 return daemonFlags ;
0 commit comments