@@ -510,8 +510,15 @@ def _build_wrapper_code(
510510
511511 if ext == "py" :
512512 argv_list = [script_path ]
513- for k , v in script_args .items ():
513+ for k , v in script_args .get ( "args" , {}). items ():
514514 argv_list .extend ([f"--{ k } " , str (v )])
515+ for k , v in script_args .get ("short_options" , {}).items ():
516+ argv_list .extend ([f"-{ k } " , str (v )])
517+ positional_args = script_args .get ("positional_args" , [])
518+ if positional_args :
519+ argv_list .append ("--" )
520+ for v in positional_args :
521+ argv_list .append (str (v ))
515522 code_lines .extend ([
516523 f" sys.argv = { argv_list !r} " ,
517524 " try:" ,
@@ -522,8 +529,15 @@ def _build_wrapper_code(
522529 ])
523530 elif ext in ("sh" , "bash" ):
524531 arr = ["bash" , script_path ]
525- for k , v in script_args .items ():
532+ for k , v in script_args .get ( "args" , {}). items ():
526533 arr .extend ([f"--{ k } " , str (v )])
534+ for k , v in script_args .get ("short_options" , {}).items ():
535+ arr .extend ([f"-{ k } " , str (v )])
536+ positional_args = script_args .get ("positional_args" , [])
537+ if positional_args :
538+ arr .append ("--" )
539+ for v in positional_args :
540+ arr .append (str (v ))
527541 timeout = self ._script_timeout
528542 code_lines .extend ([
529543 " try:" ,
@@ -590,8 +604,23 @@ def _get_declaration(self) -> types.FunctionDeclaration | None:
590604 "args" : {
591605 "type" : "object" ,
592606 "description" : (
593- "Optional arguments to pass to the script as key-value"
594- " pairs."
607+ "Optional arguments to pass as long options (e.g.,"
608+ " {'n': 5} becomes --n 5)."
609+ ),
610+ },
611+ "short_options" : {
612+ "type" : "object" ,
613+ "description" : (
614+ "Optional SHORT options to pass (e.g., {'n': 5}"
615+ " becomes -n 5)."
616+ ),
617+ },
618+ "positional_args" : {
619+ "type" : "array" ,
620+ "items" : {"type" : "string" },
621+ "description" : (
622+ "Optional list of positional arguments in exact order"
623+ " (e.g., ['input.txt', 'output.txt'])."
595624 ),
596625 },
597626 },
@@ -604,16 +633,38 @@ async def run_async(
604633 ) -> Any :
605634 skill_name = args .get ("skill_name" )
606635 script_path = args .get ("script_path" )
607- script_args = args .get ("args" , {})
608- if not isinstance (script_args , dict ):
636+ script_args = {
637+ "args" : args .get ("args" , {}),
638+ "short_options" : args .get ("short_options" , {}),
639+ "positional_args" : args .get ("positional_args" , []),
640+ }
641+ if not isinstance (script_args ["args" ], dict ):
609642 return {
610643 "error" : (
611644 "'args' must be a JSON object (key-value pairs),"
612- f" got { type (script_args ).__name__ } ."
645+ f" got { type (script_args [ 'args' ] ).__name__ } ."
613646 ),
614647 "error_code" : "INVALID_ARGS_TYPE" ,
615648 }
616649
650+ if not isinstance (script_args ["short_options" ], dict ):
651+ return {
652+ "error" : (
653+ "'short_options' must be a JSON object (key-value pairs),"
654+ f" got { type (script_args ['short_options' ]).__name__ } ."
655+ ),
656+ "error_code" : "INVALID_SHORT_OPTIONS_TYPE" ,
657+ }
658+
659+ if not isinstance (script_args ["positional_args" ], list ):
660+ return {
661+ "error" : (
662+ "'positional_args' must be a JSON array (list),"
663+ f" got { type (script_args ['positional_args' ]).__name__ } ."
664+ ),
665+ "error_code" : "INVALID_POSITIONAL_ARGS_TYPE" ,
666+ }
667+
617668 if not skill_name :
618669 return {
619670 "error" : "Skill name is required." ,
0 commit comments