
    @i'g                       U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
m
Z
mZ ddlmZ ddlmZmZmZ  eej$                  j'                  dd            Zed	z  d
z  Zedz  dz  Zedz  dz  ZdZded<   dZded<   dhdhdhdhddhddhdhdh e        e        e       dZded<   h dZded<   dHd ZdHd!ZdId"Z dJd#Z!dJd$Z"dKd%Z#dLd&Z$edKd'       Z%edMd(       Z%d)d*dMd+Z%ddd)d,	 	 	 	 	 dNd-Z&dOdPd.Z'dQd/Z(dd0dd1	 	 	 dRd2Z)dSd3Z*	 dT	 	 	 dUd4Z+dSd5Z,dSd6Z-dSd7Z.dSd8Z/dVd9Z0dWd:Z1dXd;Z2dKd<Z3dYd=Z4dSd>Z5dSd?Z6dSd@Z7dSdAZ8dSdBZ9dZdCZ:dSdDZ;d[dEZ<dTd\dFZ=e>dGk(  r e	j~                   e=              yy)]u  
taskctl.py — main 진입 단일화 + 상태 enforcement layer (task-2449 MVP)

회장 절대 기준:
    "taskctl을 거치지 않고는 main을 절대 변경할 수 없다."

상태 모델 (11종):
    CREATED → DISPATCHED → ACKED → RUNNING → PR_OPEN → GUARD_PASS
        → HUMAN_APPROVED → MERGED → DONE
                                ↘ CANCELLED
                                ↘ FAILED

저장 위치:
    {WORKSPACE}/.tasks/state/<task-id>.json

bypass (회장 전용):
    TASKCTL_BYPASS=1 환경변수로 1~5단계 skip. evidence에 강제 기록.

종료 코드:
    0   PASS / 정상 전이
    1   FAIL (가드 차단, 잘못된 전이, evidence 미달, etc.)
    2   internal error (subprocess 실행 실패 등)
    )annotationsN)datetimetimezone)Path)AnyNoReturnoverloadWORKSPACE_ROOTz/home/jay/workspacez.tasksstatescriptszguard.shzqc_report_guard.py)zcancel-kill-switchzqc-checkzhidden-path-auditzlock-in-checkzmerge-safety-checkzgemini-review-gatezci/guardguardztuple[str, ...]REQUIRED_CHECKS)CREATED
DISPATCHEDACKEDRUNNINGPR_OPEN
GUARD_PASSHUMAN_APPROVEDMERGEDDONE	CANCELLEDFAILEDSTATESr   r   r   r   r   r   r   r   zdict[str, set[str]]ALLOWED_TRANSITIONS>   r   r   r   zset[str]TERMINAL_STATESc                 f    t        j                  t        j                        j	                  d      S )Nz%Y-%m-%dT%H:%M:%SZ)r   nowr   utcstrftime     @/home/jay/workspace/.worktrees/task-2453-dev2/scripts/taskctl.py_nowr$   c   s!    <<%../CDDr"   c            	     H   	 t        j                         } 	 t        j                  g ddddt        t                    j                  j                         xs d}|  d| d	S # t        $ r# t        j                  j                  dd      } Y yw xY w# t        $ r d}Y Dw xY w)
NUSERunknown)gitconfigz
user.emailT   )capture_outputtexttimeoutcwdzunknown@localz <>)getpassgetuser	Exceptionosenvironget
subprocessrunstr	WORKSPACEstdoutstrip)useremails     r#   _actorr>   g   s    1  +dA3y>
 &, , 	 V2eWA  1zz~~fi01    s#   A$ AB $)BBB! B!c                    t         |  dz  S )Nz.json)	STATE_DIRtask_ids    r#   _state_pathrC   {   s    '%(((r"   c                    | j                         D ci c]  \  }}|dk7  s|| }}}t        j                  |ddd      S c c}}w )N	_checksumFT),:)ensure_ascii	sort_keys
separators)itemsjsondumps)r   kvpayloads       r#   _canonical_jsonrQ      sE     %B1k1Aq!tBGB::gETjYY Cs
   AAc                x    t        j                  t        |       j                  d            j	                         S )Nutf-8)hashlibsha256rQ   encode	hexdigest)r   s    r#   _compute_checksumrX      s*    >>/%077@AKKMMr"   c                2    | dg d g d d d i d d d i d
ddd d ddS )Nr   )
git_diff_shachanged_pathsbranch	pr_numberpr_state	ci_checksguard_sh_resultqc_report_guard_resultmerge_timestamp
exit_codesFusedtsactor)rB   current_statetransitionsevidencehuman_approvedbypassr!   rA   s    r#   
_new_staterm      sG    " #&*#
   t<# r"   c                $   t         j                  dd       | j                  dd        t        |       | d<   t	        | d         }|j                  d      }|j                  t        j                  | dd      d	
       |j                  |       y )NT)parentsexist_okrE   rB   z	.json.tmpF   rH   indentrS   encoding)
r@   mkdirpoprX   rC   with_suffix
write_textrL   rM   replace)r   ptmps      r#   _saver}      st    OOD4O0	IIk4 *51E+E)$%A
--
$CNN4::e%BWNUKKNr"   c                     y Nr!   rA   s    r#   _loadr      s    +.r"   c                    y r   r!   )rB   allow_missings     r#   r   r      s    JMr"   Fr   c          	     ~   t        |       }|j                         s|ry t        d| d|  dd       	 t        j                  |j                  d            }j                  d	d       }t        |      }||k7  rt        d
|  d| d| dd       ||d	<   |S # t        $ r}t        d| d| d       Y d }~_d }~ww xY w)Nu   state 파일 없음: u    (먼저 'taskctl init u	   ' 실행)   rS   rt   u   state 파일 파싱 실패:     → rE   uJ   checksum 불일치: 외부 수정 의심 (state file tampered).
  task_id=z

  stored=z
  expected=u0   
  → taskctl만 상태 변경 가능합니다.)	rC   exists_dierL   loads	read_textr2   rw   rX   )rB   r   r{   r   excstoredexpecteds          r#   r   r      s    GA88:$QC'>wiyQSTU>

1;;;89 YY{D)F 'H 	 "x  " $>?
 	
  E+L  >+A3eC591==>s   %B 	B< B77B<rg   metaforcec          
     f   | d   }|rno||k(  r|dv rne|dv r|t         v rYt        d| d| dd       nEt        j                  |t	                     }||vr#t        d| d| dt        |      xs d	 d
d       || d<   ||t               |xs dd}|rd|d<   |r||d<   | d   j                  |       y )Nrh   >   r   >   r   r   u   비정상 전이: r   u&    (terminal 상태에서 전이 불가)r   u
    (허용: none)taskctlfromtorf   rg   Tforcedr   ri   )r   r   r   r5   setsortedr$   append)r   targetrg   r   r   srcallowedentrys           r#   _transitionr      s     
 C	36[0	*	*/!%cU%x7]^`ab%))#su5 $SEvhjAZTZ@[[\] $E/f#)	E hf	-&r"   c                j    t        d|  t        j                         t        j                  |       y )N
[taskctl] file)printsysstderrexit)msgcodes     r#   r   r      s"    	Jse
3::.HHTNr"   c                     t        d|         y )Nr   )r   )r   s    r#   	_print_okr      s    	Jse
r"   x   )r.   r-   envc          
         t        j                  | dd|t        |xs t              i t        j
                  |xs i       S )NT)r+   r,   r-   r.   r   )r6   r7   r8   r9   r3   r4   )cmdr.   r-   r   s       r#   _runr      sA    >> y!)rzz)ciR) r"   c                J   t        | j                        }|j                         rt        d| j                          yt	        | j                        }|d   j                  d dt               t               d       t        |       t        d| j                   d| d       y)	Nzalready initialized: r   ri   r   r   zinit u    → CREATED (r   )	rC   rB   r   r   rm   r   r$   r>   r}   )argsr{   r   s      r#   cmd_initr     s    DLL!Axxz)$,,89t||$E	-ITVfh!  
%Ldll^>!A67r"   c                    t        | j                        }t        ||t               |       t	        |       t        | j                   d|        y)Nrg   r   u   : → r   )r   rB   r   r>   r}   r   )r   r   r   r   s       r#   _simple_transition_cmdr     sA    $,,EvVXD9	%LfVH-.r"   c                    t        | d      S )Nr   r   r   s    r#   cmd_dispatchr   '  s    !$55r"   c                    t        | d      S )Nr   r   r   s    r#   cmd_ackr   +  s    !$00r"   c                    t        | d      S )Nr   r   r   s    r#   cmd_runr   /  s    !$	22r"   c                    t        | j                        }| j                  |d   d<   t        |dt	               d| j                  i       t        |       t        | j                   d| j                   d       y)	Nrj   r]   r   prr   u   : → PR_OPEN (PR #r   r   )r   rB   r   r   r>   r}   r   r   r   s     r#   cmd_pr_openr   3  sc    $,,E%)WWE*k"ydggG	%L1$''!<=r"   c            
        t        g d      j                  j                         } t        g d      }|j                  j                         D cg c]  }|j                         s| }}t        g d      j                  j                         }t        g d      j                  }| xs d |xs d |t	        |j                         D cg c]  }|j                         sd c}      dS c c}w c c}w )N)r(   	rev-parsez--abbrev-refHEAD)r(   diffzorigin/main..HEADz--name-only)r(   r   r   )r(   statusz--porcelainr   )r\   rZ   r[   git_status_porcelain_lines)r   r:   r;   
splitlineslen)r\   r   r{   changeddiff_sha	porcelainlns          r#   _collect_git_evidencer   A  s    >?FFLLNFCDD++002@Qaggiq@G@0188>>@H56==I.D (D &)y7K7K7M*\QSQYQYQ[1*\&]	  A +]s   C,%C,	C1C1c                &   | sd i d d ddS t        dddt        |       ddgd	      }|j                  d
k7  r'd i d d |j                  dd  j	                         xs ddS 	 t        j                  |j                  xs d      }|j                  d      xs g }i }|D ]m  }|j                  d      xs |j                  d      xs d}|j                  d      xs( |j                  d      xs |j                  d      xs d}|si|||<   o t        D 	ci c]  }	|	|j                  |	d       }
}	|j                  d      |
||j                  d      |j                  d      dS # t
        j                  $ r}d i d d d| dcY d }~S d }~ww xY wc c}	w )Nno_pr_number)r^   r_   	mergeablemerge_state_statuspr_view_errorghr   viewz--jsonz2state,mergeable,mergeStateStatus,statusCheckRollup   r-   r   gh_errorz{}zjson_parse: statusCheckRollupnamecontext 
conclusionr   r   UNKNOWNMISSINGr   mergeStateStatus)r^   r_   ci_checks_allr   r   )r   r8   
returncoder   r;   rL   r   r:   JSONDecodeErrorr5   r   )r]   procdatar   rollupci_mapchkr   r   nrequired_maps              r#   _collect_pr_evidencer   O  s    r&*^M 	MdFC	NF D ! r&*!%TU!3!9!9!;!IzK 	KSzz$++-. XX)*0bFF &wwv:#'')"4:ggl+ 8swww/? 8*8.7 	%F4L& :IIAAvzz!Y//ILIHHW%!XXk*"hh'9:   S r&*|C5=QS 	SS Js$   #E# F#F6
F FFc                    t         j                         sddddS t        dt        t               | |gd      }|j                  dk(  rd	nd
|j                  |j
                  dd  |j                  dd  dS )Nr      zguard.sh not foundresult	exit_coder   bash   r   r   PASSFAILr   r   stdout_tailstderr_tail)GUARD_SHr   r   r8   r   r:   r   )stagerB   r   s      r#   _run_guard_shr   r  sp    ??##AUVVXw7ED OOq0&f__{{45){{45)	 r"   c           
        t         j                         sddddS t        dt        t               d| dt        t              gd	      }|j
                  d
k(  rdnd|j
                  |j                  dd  |j                  dd  dS )Nr   r   zqc_report_guard.py not foundr   python3z	--task-idz--workspacer   r   r   r   r   r   r   )QC_REPORT_GUARDr   r   r8   r9   r   r:   r   )rB   r   s     r#   _run_qc_report_guardr  ~  s    !!###A_``	C(+wsS\~^D
 !OOq0&f__{{45){{45)	 r"   c                H    | syt        d | j                         D              S )NFc              3  &   K   | ]	  }|d k(    yw)SUCCESSNr!   ).0rO   s     r#   	<genexpr>z,_all_required_checks_pass.<locals>.<genexpr>  s     :!qI~:s   )allvalues)r_   s    r#   _all_required_checks_passr
    s"    :y'7'7'9:::r"   c                $   t        | j                        }|d   }|t        v rt        d| dd       t	               }|d   |d   d<   |d   |d   d<   |d   |d   d<   |d   j                  d	      }t        |      }|d
   |d   d
<   |d   |d   d<   |j                  d      |d   d<   |j                  d      |d   d<   d|v r|d   |d   d<   t        d| j                        }|d   |d   d<   ||d   d<   t        | j                        }|d   |d   d<   ||d   d<   |d   |d   d   d<   |d   |d   d   d<   |d   dk(  xr |d   dk(  }|rvt        |dt               ddd       d|d   d   d<   t        |       t        | j                   d       | j                  r!t        t        j                   |d d!"             y|d#v rt        |d$t               d%d&i       d|d   d   d<   t        |       g }	|d   dk7  r|	j#                  d'|d           |d   dk7  r|	j#                  d(|d           t        | j                   d)d*j%                  |	       d+       | j                  r!t        t        j                   |d d!"             y),Nrh   u   verify 불가: 현재 상태=z (terminal)r   r\   rj   rZ   r[   r]   r^   r_   r   r   r   pre-pushr   r`   guard_sh_detailra   qc_report_guard_detailr   rc   verify_guard_shverify_qc_report_guardr   r   )guard_shqc_report_guardr   r   verifyu   : verify PASS → GUARD_PASSFrq   rr   >   r   r   r   reasonz"verify failed, demoting to PR_OPENz	guard.sh=zqc_report_guard=z: verify FAIL [z, ])r   rB   r   r   r   r5   r   r   r  r   r>   r}   r   machiner   rL   rM   r   join)
r   r   r   git_evpr_npr_evguard_evqc_evall_passfail_reasonss
             r#   
cmd_verifyr    s   $,,E

 C
o,SE=qA"$F"("2E*h(.~(>E*n%)/)@E*o&  -D &E$)*$5E*j!%*;%7E*k"%*YY{%;E*k".3ii8L.ME**+%-2?-Cj/*Z6H+3H+=E*'(+3E*'( .E27/E*./27E*./9A+9NE*l#$56@Ek@RE*l#$<= 	f$ 	&(Ov%  E<vx&,H	J45j,'1eT\\N">?@<<$**UqAB
..E9FH"$HI	K01E*l#H-	%L LV#i(:';<=X& .uX.?@Aodii.E-FaHI||djjU1=>r"   c                    t        | j                        }|d   dk7  rt        d|d    dd       d|d<   t        |dt	               	       d
|d   d   d<   t        |       t        | j                   d       y
)Nrh   r   u   approve 불가: 현재 상태=u    (GUARD_PASS 필요)r   Trk   r   )rg   r   rj   rc   approveu   : → HUMAN_APPROVED)r   rB   r   r   r>   r}   r   r   s     r#   cmd_approver"    s    $,,E_-,U?-C,DDXY	
 #E
'vx812E*l#I.	%L234r"   c                    t        | j                        }t        |dt               dt	        | dd       i       t        |       t        | j                   d       y)Nr   r  r   u   : → CANCELLEDr   )r   rB   r   r>   getattrr}   r   r   s     r#   
cmd_cancelr%    sO    $,,E{&(h =>@	%Lo./r"   c                    t        | j                        }t        |dt               d| j                  i       t        |       t        | j                   d| j                   d       y)Nr   r  r   u   : → FAILED (r   r   )r   rB   r   r>   r  r}   r   r   s     r#   cmd_failr'    sS    $,,Exvx,.	%LnT[[M;<r"   c                   t        | j                  d      }|U| j                  r/t        t	        j
                  | j                  d ddd             yt        d| j                   d       y| j                  r"t        t	        j
                  |dd	
             yt        d|d           t        d|d           t        dt        |d                 |d   }t        d|j                  d              t        d|j                  d              t        d|j                  d              t        d|j                  d              t        d|d           t        d|d           y)NTr   )rB   rh   missingF)rH   r   z: state file missingr   rq   rr   ztask: rB   zstate: rh   ztransitions: ri   rj   zbranch: r\   zpr: r]   z
guard_sh: r`   zqc_report_guard: ra   zhuman_approved: rk   zbypass: rl   )r   rB   r  r   rL   rM   r   r5   )r   r   evs      r#   
cmd_statusr+    sl   $,,d3E}<<$**)-/=BD E  Jt||n,@AB||djjU1=>  	uY'()*o./01c%"6789::)*+,RVVK()*+
266"34567!"&&)A"B!CDE '7!8 9:;x)*+r"   c                 H    t         j                  j                  dd      dk(  S )NTASKCTL_BYPASSr   1)r3   r4   r5   r!   r"   r#   _bypass_activer/    s    ::>>*B/366r"   c           
        t        | j                        }t               }|r6dt               t	               d|d<   t        dt        j                         n|d   dk7  r6d|d	   d
   d<   t        |       t        d|d    d| j                   dd       |d   dk(  r"d|d	   d
   d<   t        |       t        dd       t        d| j                        }|d   |d	   d<   ||d	   d<   |d   dk7  r)d|d	   d
   d<   t        |       t        d|d    dd       t        | j                        }|d   |d	   d<   ||d	   d<   |d   dk7  r)d|d	   d
   d<   t        |       t        d|d    dd       |d	   j                  d      }|rt        |      }|d   |d	   d<   |d   |d	   d<   |j                  d      |d	   d<   |j                  d       |d	   d <   |j                  d      d!vrE|j                  d      4d|d	   d
   d<   t        |       t        d"|j                  d       d       t        |d         s(d|d	   d
   d<   t        |       t        d#|d    d       |d	   j                  d      }|s"d|d	   d
   d<   t        |       t        d$d       | j                  r~t               }||d	   d%<   d|d	   d&<   d'|d	   d
   d<   t!        |d(t	               d|d)|*       t!        |d+t	               |,       t        |       t#        | j                   d-| d       y't$        j&                  j                  d.d/      }t)        d0d1dt+        |      d2d3d4|gd5d6id78      }	|	j,                  |	j.                  d9d  |	j                  d9d  d:|d	   d;<   |	j,                  d'k7  rW|	j,                  |d	   d
   d<   t        |       t        d<|	j,                   d=|	j                  d>d   |	j,                  xs d       t               }||d	   d%<   d'|d	   d
   d<   t!        |d(t	               ||d?|*       t!        |d+t	               |,       t        |       t#        | j                   d@| dA       y')BNTrd   rl   u3   ★★★ TASKCTL BYPASS USED — Chairman overrider   rh   r   r   rj   rc   mergeu   merge 차단: 현재 상태=u*    (HUMAN_APPROVED 필요. 'taskctl approve u	   ' 먼저)r   u   merge 차단: state=CANCELLEDr  r   r`   guard_sh_detail_merger   u+   merge 차단: guard.sh pre-push FAIL (exit=r   r   ra   qc_report_guard_detail_mergeu)   merge 차단: qc_report_guard FAIL (exit=r]   r^   r_   r   r   >   N	MERGEABLEu   merge 차단: PR mergeable=u1   merge 차단: 8 required CI checks 미통과 — u7   merge 차단: PR 번호 없음 (taskctl pr-open 먼저)rb   merge_dry_runr   r   )dry_runrl   r   r   )rg   r   u)   : dry-run merge → MERGED → DONE (PR #GH_REPOzJeon-Jonghyuk/dev_workspacer   r   z--mergez--delete-branchz--repoTASKCTL_INVOKEDr.  r   )r   r-   r   )r   r   r   merge_subprocessu   merge 실패: gh pr merge exit=z stderr=r   )r   rl   z: merged PR #u    → MERGED → DONE)r   rB   r/  r$   r>   r   r   r   r}   r   r   r  r5   r   r
  r6  r   r   r3   r4   r   r8   r   r:   )
r   r   rl   r  r  r  r  merge_tsrepor   s
             r#   	cmd_merger<    s&   $,,EF&X
h
 	C#**U !%5578E*l+G4%L.u_/E.F G<<@LL>T ![078E*l+G4%L0!4 T\\:/7/Aj+,5=j12H'78E*l+G4%L!+./q2 %T\\26;Hoj23<Aj89?f$78E*l+G4%L{+,A/ Z $$[1(.E,1*,=E*j)-2;-?E*k*-2YY{-CE*k*6;ii@T6UE*23yy%-@@99[)5?@E*%l3G<%L5eii6L5MN -U;-?@;<j!,/8eG[)*,   -D34j,'0eFJ||6/7j+,-1j/*34j,'0E868%)V< 	" 	E6@eT\\N"KD6QRST ::>>)%BCD	tWc$i4ExQUV$D __{{45){{45)-E*()
 !37??j,'0e-doo-> ?kk$%()+OO q	

 vH+3E*'(/0E*l#G,xvx F3 vVXV<	%LmD61EFGr"   c                    t        j                  dd      } | j                  dd      }d }|j                  dd	
      } ||       |j	                  t
               |j                  dd
      } ||       |j	                  t               |j                  dd
      } ||       |j	                  t               |j                  dd
      } ||       |j	                  t               |j                  dd
      } ||       |j                  dt        dd       |j	                  t               |j                  dd
      } ||       |j                  ddd       |j	                  t               |j                  dd
      } ||       |j	                  t               |j                  dd 
      } ||       |j                  d!dd"       |j	                  t               |j                  d#d$
      } ||       |j                  d%d &       |j	                  t               |j                  d'd(
      } ||       |j                  d%d)       |j	                  t                |j                  d*d+
      } ||       |j                  ddd,       |j	                  t"               | S )-Nr   uI   task 상태 enforcement layer + main 진입 단일 경로 (task-2449 MVP))progdescriptioncommandT)destrequiredc                *    | j                  dd       y )NrB   u   task ID (예: task-2449)help)add_argument)sps    r#   _add_taskidz!build_parser.<locals>._add_taskid  s    
	(BCr"   initu   CREATED 상태 생성rD  )funcdispatchu   DISPATCHED 전환acku   ACKED 전환 (봇 수신)r7   u   RUNNING 전환zpr-openu   PR_OPEN 전환z--pru	   PR 번호)typerB  rE  r  uO   evidence 자동 수집 + guard.sh + qc_report_guard 실행, PASS 시 GUARD_PASSz	--machine
store_trueu   state JSON 출력)actionrE  r!  u%   HUMAN_APPROVED 전환 (회장 승인)r1  u   main 진입 단일 경로z	--dry-runu,   actual gh pr merge skip — 상태만 전이cancelu   CANCELLED 전환z--reason)defaultfailu   FAILED 전환)rB  r   u   현재 상태 + evidence 출력u   JSON 출력)argparseArgumentParseradd_subparsers
add_parserset_defaultsr   r   r   r   rF  intr   r  r"  r<  r%  r'  r+  )r{   subrH  rG  s       r#   build_parserrZ    sf   _	A 

	D

9CD 
%<	=BOR__(_3	
)<	=BOR__,_7	$?	@BOR__'_2	$4	5BOR__'_2		(8	9BOOOFt+OFOOO%	^ 
 
`BOOOK;NOOOOO$		(O	PBOR__+_6	&A	BBOOOKG  IOOO#	'9	:BOOOJO-OOO$	_	5BOOOJO.OOO"	'H	IBOOOK=OIOOO$Hr"   c                D   t               }|j                  |       }	 |j                  |      }xs dS # t        $ r  t        j
                  $ r}t        d| d       Y d }~6d }~wt        $ r/}t        dt        |      j                   d| d       Y d }~ld }~ww xY w)Nzsubprocess timeout: rq   zinternal error: z: r   )
rZ  
parse_argsrJ  
SystemExitr6   TimeoutExpiredr   r2   rM  __name__)argvparserr   rcr   s        r#   mainrc    s    ^FT"D@YYt_ 7N  $$ .#C5)1-- @S	 2 232cU;Q??@s!   4 BA$$B0%BB__main__)returnr8   )rB   r8   re  r   )r   dict[str, Any]re  r8   )rB   r8   re  rf  )r   rf  re  None)rB   r8   r   boolre  dict[str, Any] | None)r   rf  r   r8   rg   z
str | Noner   ri  r   rh  re  rg  )r   )r   r8   r   rX  re  r   )r   r8   re  rg  )
r   z	list[str]r.   zPath | Noner-   rX  r   zdict[str, str] | Nonere  zsubprocess.CompletedProcess)r   argparse.Namespacere  rX  r   )r   rj  r   r8   r   ri  re  rX  )re  rf  )r]   z
int | Nonere  rf  )r   r8   rB   r8   re  rf  )r_   zdict[str, str]re  rh  )re  rh  )re  zargparse.ArgumentParser)r`  zlist[str] | Nonere  rX  )@__doc__
__future__r   rS  r0   rT   rL   r3   r6   r   r   r   pathlibr   typingr   r   r	   r4   r5   r9   r@   r   r  r   __annotations__r   r   r   r   r$   r>   rC   rQ   rX   rm   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r"  r%  r'  r+  r/  r<  rZ  rc  r_  r   r!   r"   r#   <module>rp     s/  . #     	  
 '  * *  02GHI	 7*	y :-i'*>>	$ 	   ~)[{i(#Y/jhEe, (  < ;E()Z
N, 
 . 
 .	 M 
 M16 < LP.2#'+''(,'N
 04C&*	#	/J	" :>!6BE613 F	;:D<7@P9x zCHHTV r"   