
    !<iI                     "   d Z ddlZddlmZ ddlmZmZmZmZm	Z	 erddl
mZ ddded	efd
Zded	efdZded	efdZded	efdZdeeedf         ef         deddd	ee         fdZdeeedf         ef         d	ee         fdZdeeedf         ef         deddd	ee         fdZdeeedf         ef         deedf         dedeedf         deedf         d	ee         fdZded	ee         fdZd	efdZdee         ded	ee         fdZdS )zBash completion script generator.

Generates static bash completion scripts using COMPREPLY and compgen.
Targets bash 3.2+ with no external dependencies.
    N)TYPE_CHECKING)CompletionActionCompletionDataclean_choice_textextract_completion_dataget_completion_action)Appappr	   	prog_namereturnc                    |rt          j        d|          st          d|d          |                    dd          }t	          |           }d| ddd| d	d
dg}|                    t          |||                      |                    dg           |                    d           |                    d| d|            |                    d           d                    |          S )a  Generate bash completion script.

    Parameters
    ----------
    app : App
        The Cyclopts application to generate completion for.
    prog_name : str
        Program name (alphanumeric with hyphens/underscores).

    Returns
    -------
    str
        Complete bash completion script.

    Raises
    ------
    ValueError
        If prog_name contains invalid characters.
    z^[a-zA-Z0-9_-]+$zInvalid prog_name: z0. Must be alphanumeric with hyphens/underscores.-_z# Bash completion for z# Generated by Cyclopts z() {z  local cur prev}zcomplete -F _ 
)	rematch
ValueErrorreplacer   extend"_generate_completion_function_bodyappendjoin)r
   r   	func_namecompletion_dataliness        /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/cyclopts/completion/bash.pygenerate_completion_scriptr       s   (  nBH%8)DD nlylllmmm!!#s++I-c22O 	-,,!
I
E 
LL3OYPSTTUUU	LL#	LL	LL888Y88999	LL99U    choicec                 .    |                      dd          S )z&Escape single quotes for bash strings.'z'\''r   )r"   s    r   _escape_bash_choicer&   C   s    >>#w'''r!   textc                 ^    |                      dd          } |                      dd          } | S )z*Escape description text for bash comments.r   r   r%   )r'   s    r   _escape_bash_descriptionr*   H   s-    <<c""D<<c""DKr!   actionc                 N    | t           j        k    rdS | t           j        k    rdS dS )zMap completion action to bash compgen flags.

    Parameters
    ----------
    action : CompletionAction
        Completion action type.

    Returns
    -------
    str
        Compgen flags ("-f", "-d", or "").
    z-fz-dr   )r   FILESDIRECTORIES)r+   s    r   _map_completion_action_to_bashr/   O   s1     !'''t	#/	/	/t2r!   r   .c                 >   g }|                     d           |                     d           |                     d           |                    t          |                      |                     d           |                    t          | ||                     |S )aR  Generate the body of the bash completion function.

    Parameters
    ----------
    completion_data : dict
        All extracted completion data.
    prog_name : str
        Program name.
    app : App
        Application instance.

    Returns
    -------
    list[str]
        Lines of bash code for the completion function body.
    z!  cur="${COMP_WORDS[COMP_CWORD]}"z$  prev="${COMP_WORDS[COMP_CWORD-1]}"r   )r   r    _generate_command_path_detection_generate_completion_logic)r   r   r
   r   s       r   r   r   c   s    * E	LL4555	LL7888	LL	LL1/BBCCC	LL	LL+OYLLMMMLr!   c                    t                      }t                      }|                                 D ]}|j        D ][}|                                sE|j        j        r9|j        j        D ],}|                    d          r|                    |           -\|j        D ]6}|j	        D ],}|                    d          s|                    |           -7g }|
                    d           |rHd t          |          D             }	d                    |	          }
|
                    d|
 d           n|
                    d           |
                    d           |
                    d	           |rHd
 t          |          D             }d                    |          }|
                    d| d           n|
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d            |
                    d!           |
                    d"           |
                    d#           |
                    d$           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d           |
                    d%           |
                    d&           |
                    d'           |
                    d(           |
                    d)           |
                    d*           |
                    d+           |
                    d           |
                    d           |
                    d           |S ),a[  Generate bash code to detect the current command path.

    This function generates two passes through COMP_WORDS:
    1. First pass builds cmd_path by identifying valid command names
    2. Second pass counts positionals (non-option words after the command path)

    The two-pass approach is necessary because we need to know the full command
    path length before we can correctly identify which words are positionals.

    Note: all_commands is built globally across all command levels. If a positional
    argument value happens to match a command name from a different level, it could
    be incorrectly classified (though this represents poor CLI design).

    Parameters
    ----------
    completion_data : dict
        All extracted completion data.

    Returns
    -------
    list[str]
        Lines of bash code for command path detection.
    r   zD  # Build list of options that take values (to skip their arguments)c                 ,    g | ]}t          |          S  r&   .0opts     r   
<listcomp>z4_generate_command_path_detection.<locals>.<listcomp>   s!    XXXS+C00XXXr!   r   z  local options_with_values='r$   z  local options_with_values=''r   zK  # Build list of all valid command names (to distinguish from positionals)c                 ,    g | ]}t          |          S r5   r6   r8   cmds     r   r:   z4_generate_command_path_detection.<locals>.<listcomp>   s!    QQQS+C00QQQr!   z  local all_commands='z  local all_commands=''z>  # Detect command path by collecting valid command words onlyz  local -a cmd_path=()z  local i skip_next=0z$  for ((i=1; i<COMP_CWORD; i++)); doz!    local word="${COMP_WORDS[i]}"z#    if [[ $skip_next -eq 1 ]]; thenz      skip_next=0z      continuez    fiz    if [[ $word =~ ^- ]]; thenz*      # Check if this option takes a valuez:      if [[ " $options_with_values " =~ " $word " ]]; thenz        skip_next=1z      fiz    elsezF      # Non-option word - only add to cmd_path if it's a valid commandz3      if [[ " $all_commands " =~ " $word " ]]; thenz        cmd_path+=("$word")z  donez;  # Count positionals (non-option words after command path)z  local positional_count=0z$  local cmd_path_len=${#cmd_path[@]}z  skip_next=0z  local cmd_depth=0z      # Non-option wordz1      if [[ $cmd_depth -lt $cmd_path_len ]]; thenz        # Still in command pathz        ((cmd_depth++))z
      elsez1        # Past command path, this is a positionalz        ((positional_count++)))setvalues	argumentsis_flag	parametername
startswithaddcommandsnamesr   sortedr   )r   options_with_valuesall_commandsdataargumentrC   registered_commandcmd_namer   escaped_optsopts_strescaped_cmdscmds_strs                r   r1   r1      s   0 %%55L&&(( 
/ 
/ 	6 	6H##%% 6(*<*A 6$.3 6 6Ds++ 6+//555"&- 	/ 	/.4 / /**3// / $$X.../	/
 E	LLWXXX 7XXFCV<W<WXXX88L))@X@@@AAAA5666	LL	LL^___ 0QQF<<P<PQQQ88L))9h999::::.///	LL	LLQRRR	LL)***	LL()))	LL7888	LL4555	LL6777	LL$%%%	LL!"""	LL	LL1222	LL=>>>	LLMNNN	LL&'''	LL	LL	LLYZZZ	LLFGGG	LL.///	LL	LL	LL	LL	LLNOOO	LL-...	LL7888	LL!!!	LL&'''	LL7888	LL4555	LL6777	LL$%%%	LL!"""	LL	LL1222	LLMNNN	LL&'''	LL	LL	LL*+++	LLDEEE	LL2333	LL*+++	LL	LLDEEE	LL1222	LL	LL	LLLr!   c                 p  
 g }|j         rt          |j                   nd}|j        rt          |j                  nd}|                    d           |                    d           t	          d |                                 D                       }t          |dz             D ]P

fd|                                 D             }|s&|                    d
 d           
d	k    r'|                    t          | dd
||                     n|                    d           t          |          D ]k}d
                    |          }	|                    d|	 d           |                    t          | |d||                     |                    d           l|                    d           |                    d           |                    d           |                    d           R|                    d           |                    d           |                    d           |S )aM  Generate the main completion logic using case statements.

    Parameters
    ----------
    completion_data : dict
        All extracted completion data.
    prog_name : str
        Program name.
    app : App
        Application instance.

    Returns
    -------
    list[str]
        Lines of bash code for completion logic.
    r5   z4  # Determine command level and generate completionsz  case "${#cmd_path[@]}" inc              3   4   K   | ]}t          |          V  d S Nlen)r8   paths     r   	<genexpr>z-_generate_completion_logic.<locals>.<genexpr>  s(      AA$CIIAAAAAAr!      c                 :    g | ]}t          |          k    |S r5   rV   )r8   rX   depths     r   r:   z._generate_completion_logic.<locals>.<listcomp>  s*    XXX4SYYRWEWEW$EWEWEWr!       )r   z      z      case "${cmd_path[@]}" inr   z	        "z")z
          z          ;;z
        *)z
      esacz      ;;z    *)z  esac)
help_flagstupleversion_flagsr   maxkeysranger   _generate_completions_for_pathrH   r   )r   r   r
   r   r_   ra   	max_depthrelevant_pathsrX   path_strr\   s             @r   r2   r2      sE   * E*-.@s~&&&bJ030AIE#+,,,rM	LLGHHH	LL.///AA/*>*>*@*@AAAAAIy1}%% ! !XXXX?+?+?+A+AXXX 	_E___%%%A::LL7XWacpqqrrrrLL9:::~.. - -88D>>55556662?D,Xbdqrr   ^,,,,LL&&&LL(((LL&&&Z    	LL	LL	LLLr!   command_pathindentr_   ra   c                 \   || vr| dgS | |         }g }g }d |j         D             }|D ]q}	|	j        j        pg D ],}
|
                    d          r|                    |
           -|	j        D ],}
|
                    d          r|                    |
           -rg }|j        D ]6}|j        D ],}
|
                    d          r|                    |
           -7|D ]4}|                    d          r||vr||vr|                    |           5|D ]4}|                    d          r||vr||vr|                    |           5|                    |           g }|j        D ]6}|j        D ],}|                    d          s|                    |           -7d |j         D             }|	                    d            |                    | d           |r=d |D             }d	
                    |          }|                    | d
| d           n|                    | d           |                    | d           t          |j                   }|r0t          |j         ||| d          }|                    |           n|r=d |D             }d	
                    |          }|                    | d
| d           nA|r'|                    t          || d                     n|                    | d           |                    | d           |S )a  Generate completions for a specific command path.

    Parameters
    ----------
    completion_data : dict
        All extracted completion data.
    command_path : tuple[str, ...]
        Current command path.
    indent : str
        Indentation string.
    help_flags : tuple[str, ...]
        Help flag names.
    version_flags : tuple[str, ...]
        Version flag names.

    Returns
    -------
    list[str]
        Lines of bash code for completions at this command path.
    COMPREPLY=()c                 H    g | ]}|                                 |j        | S r5   )is_positional_onlyshowr8   args     r   r:   z2_generate_completions_for_path.<locals>.<listcomp>Q  s2    ___C9O9O9Q9Q_VYV^_C___r!   r   c                 .    g | ]}|j         	|j        |S rU   )indexro   rp   s     r   r:   z2_generate_completions_for_path.<locals>.<listcomp>r  s(    [[[s	8MRURZ8Ms8M8M8Mr!   c                 "    | j         | j         ndS )Nr   )rs   )as    r   <lambda>z0_generate_completions_for_path.<locals>.<lambda>s  s    !'2Eqww1 r!   )keyzif [[ ${cur} == -* ]]; thenc                 ,    g | ]}t          |          S r5   r6   r7   s     r   r:   z2_generate_completions_for_path.<locals>.<listcomp>x  s!    GGG.s33GGGr!   r   z  COMPREPLY=( $(compgen -W '' -- "${cur}") )z  COMPREPLY=()else  c                 ,    g | ]}t          |          S r5   r6   r<   s     r   r:   z2_generate_completions_for_path.<locals>.<listcomp>  s!    III/44IIIr!   fi)r@   rB   rC   rD   r   	negativesrF   rG   r   sortr   _check_if_prev_needs_value#_generate_value_completion_for_prev_generate_positional_completion)r   ri   rj   r_   ra   rK   r   optionskeyword_argsrL   rC   flag_commandsrM   flagrF   rN   positional_argsescaped_optionsoptions_strneeds_value_completionvalue_completion_linesescaped_commandscommands_strs                          r   re   re   /  s   6 ?**'''((<(DEG__4>___L  % %&+1r 	% 	%Ds## %t$$$& 	% 	%Ds## %t$$$	% M"m + +&, 	+ 	+Ds## +$$T***	+  ! !??3 	!D$7$7D<U<UNN4    ! !??3 	!D$7$7D<U<UNN4   NN=!!!H"m * **0 	* 	*H&&s++ *)))	* \[dn[[[OLLMMM	LLF999::: 0GGwGGGhh//]]K]]]^^^^...///	LLF!!!7GG 0!DNHo&}}}"
 "
 	+,,,,	 0IIIIIxx 011^^L^^^____	 04_mmmTTUUUU...///	LLFLr!   c                    g }t          |           dk    r| d                             d          }t          | d         j                  }|r>d |D             }d                    |          }|                    | d| d           nt          |          }|r|                    | d	| d
           n|                    | d           nn|                    | d           t          |           D ]\  }}	|	                    d          }t          |	j                  }|                    | d| d           |r=d |D             }d                    |          }|                    | d| d           nEt          |          }|r|                    | d| d
           n|                    | d           |                    | d           |                    | d           |                    | d           |                    | d           |                    | d           |S )aE  Generate position-aware positional argument completion.

    Parameters
    ----------
    positional_args : list
        List of positional arguments sorted by index.
    indent : str
        Indentation string.

    Returns
    -------
    list[str]
        Lines of bash code for position-aware positional completion.
    rZ   r   Tforcec                 F    g | ]}t          t          |                    S r5   r&   r   r8   cs     r   r:   z3_generate_positional_completion.<locals>.<listcomp>  s*    ZZZQ23DQ3G3GHHZZZr!   r   COMPREPLY=( $(compgen -W 'ry   zCOMPREPLY=( $(compgen  -- "${cur}") )rl   zcase ${positional_count} inr{   r^   c                 F    g | ]}t          t          |                    S r5   r   r   s     r   r:   z3_generate_positional_completion.<locals>.<listcomp>  +    "^"^"^QR#67H7K7K#L#L"^"^"^r!       COMPREPLY=( $(compgen -W '    COMPREPLY=( $(compgen     COMPREPLY=()    ;;  *)esac)rW   get_choicesr   hintr   r   r/   	enumerate)
r   rj   r   choicesr+   escaped_choiceschoices_strcompgen_flagidxrL   s
             r   r   r     s    E
?q  !!$00t0<<&q'9'>?? 		6ZZRYZZZO((?33KLLF__k___````9&AAL 6]]l]]]^^^^4445555 	===>>>&77 	, 	,MC***66G*8=99FLLF,,c,,,--- 	>"^"^V]"^"^"^!hh77ggkggghhhh=fEE >LLF!e!el!e!e!effffLLF!<!<!<===LLF***++++ 	___%%%000111&&&'''___%%%Lr!   c                     | D ]@}|                                 s*|j        j        pg D ]}|                    d          r  dS AdS )a  Check if any options take values, requiring prev-word completion logic.

    Parameters
    ----------
    arguments : ArgumentCollection
        Arguments to check.

    Returns
    -------
    bool
        True if any option (starts with -) takes a value (is not a flag).
    r   TF)rA   rB   rC   rD   )r@   rL   rC   s      r   r   r     si         !! 	  */52    ??3''  444 5r!   rF   c                    g }|                     | d           d}| D ]}|                                rd |j        j        pg D             }|s3d}|                    d          }t          |j                  }	|D ]}
|                     | d|
 d           |r=d |D             }d	                    |          }|                     | d
| d           nEt          |	          }|r|                     | d| d           n|                     | d           |                     | d           |r|                     | d           |r=d |D             }d	                    |          }|                     | d
| d           nA|r'|	                    t          || d                     n|                     | d           |                     | d           |                     | d           ng }|r=d |D             }d	                    |          }|                     | d| d           n>|r$|	                    t          ||                     n|                     | d           |S )a  Generate value completion based on previous word.

    Parameters
    ----------
    arguments : ArgumentCollection
        Arguments with potential values.
    commands : list[str]
        Available commands at this level.
    positional_args : list
        List of positional arguments sorted by index.
    indent : str
        Indentation string.

    Returns
    -------
    list[str]
        Lines of bash code for value completion.
    zcase "${prev}" inFc                 <    g | ]}|                     d           |S )r   )rD   )r8   rC   s     r   r:   z7_generate_value_completion_for_prev.<locals>.<listcomp>  s*    ZZZ$T__UXEYEYZZZZr!   Tr   r{   r^   c                 F    g | ]}t          t          |                    S r5   r   r   s     r   r:   z7_generate_value_completion_for_prev.<locals>.<listcomp>  r   r!   r   r   ry   r   r   r   r   r   c                 ,    g | ]}t          |          S r5   r6   r<   s     r   r:   z7_generate_value_completion_for_prev.<locals>.<listcomp>  !    MMMS 3C 8 8MMMr!   r]   r   c                 ,    g | ]}t          |          S r5   r6   r<   s     r   r:   z7_generate_value_completion_for_prev.<locals>.<listcomp>(  r   r!   r   rl   )r   rA   rB   rC   r   r   r   r   r/   r   r   )r@   rF   r   rj   r   	has_casesrL   rG   r   r+   rC   r   r   r   r   r   s                   r   r   r     s6   & E	LLF///000I , , 	ZZ8#5#:#@bZZZ 		&&T&22&x}55 	, 	,DLLF--d---... 	>"^"^V]"^"^"^!hh77ggkggghhhh=fEE >LLF!e!el!e!e!effffLLF!<!<!<===LLF***++++	,   2___%%% 	6MMHMMM88$455LLLFdd,dddeeee 	6LL8V///ZZ[[[[LLF444555&&&'''___%%%% 	2MMHMMM88$455LLLF``l```aaaa 	2LL8&QQRRRRLLF000111Lr!   )__doc__r   typingr   cyclopts.completion._baser   r   r   r   r   cycloptsr	   strr    r&   r*   r/   dictr`   listr   r1   r2   re   r   boolr   r   r5   r!   r   <module>r      s    
			                           *E *c *c * * * *Z( ( ( ( ( (
3 3    +;     (%S/>9: 
 
#Y	   Djd5c?N;Z6[ j`deh`i j j j jZ:%S/>9::: 
: 
#Y	: : : :zc%S/>9:cS/c c c3h	c
 c?c 
#Yc c c cL9S 9T#Y 9 9 9 9xT    *JT#Y Jad Jimnqir J J J J J Jr!   