
    ~i)                    H   U d Z ddlm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  e	ej                  j                  dd            Zed	z  d
z  dz  ZdZded<    G d de      ZddZddZddZddddd	 	 	 	 	 	 	 	 	 ddZddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy) uX   GitHub merge_queue 진입 클라이언트. admin override / force merge / bypass 차단.    )annotationsN)datetimetimezone)Path)AnyWORKSPACE_ROOTz/home/jay/workspacememoryzorchestration-auditzmerge-queue.jsonl)z--adminzadmin overridezforce-mergebypassztuple[str, ...]ADMIN_FLAG_KEYWORDSc                      e Zd ZdZy)MergeQueueErroruA   merge queue 진입 실패 또는 admin override 차단 시 raise.N)__name__
__module____qualname____doc__     I/home/jay/workspace/.worktrees/task-2481-dev4/utils/merge_queue_client.pyr   r      s    Kr   r   c                 f    t        j                  t        j                        j	                  d      S )Nz%Y-%m-%dT%H:%M:%SZ)r   nowr   utcstrftimer   r   r   _nowr      s!    <<%../CDDr   c                4    t        j                  | fddd|S )u   기본 subprocess.run 래퍼.T)capture_outputtext)
subprocessrun)cmdkwargss     r   _default_runnerr!      s    >>#HdHHHr   c                    | sy| D ]<  }|j                         }t        D ]!  }|j                         |v sd| d| dc c S  > y)u   args에 admin override 흔적이 있으면 사유 string 반환, 없으면 None.

    ADMIN_FLAG_KEYWORDS 중 하나라도 args 내 문자열에 포함되면 차단.
    Nu"   admin override 키워드 감지: 'z' (keyword='z'))lowerr   )argsarg	arg_lowerkws       r   detect_admin_override_attemptr(      s`    
  TIIK	% 	TBxxzY&;C5RDPRSS	TT
 r   TF)	bot_tokenno_admin_overridedry_runrunnerc               |   |t         }|st        d      t        j                  j	                  d      dk(  }|rt        j                  j	                  d      nd}|rt        j                  j	                  d      nd}i }|r||d<   |r|}	d}
d	}d
}d}g }n |dddt        |       ddgdi t        j                  |      }|j                  dk7  r,t        d|  d|j                  dd j                                	 t        j                  |j                  xs d      }|j	                  d      xs i j	                  dd      }	|j	                  dd      }
|j	                  dd      }|j	                  dd      }|j	                  dd      }|j	                  d      xs g }|r	 t        j                  |      }dd lm}m}  ||	      s!t#        | |	dd!d"||#       t        d$|	 d%      dd&lm}  |       }g }|D ]n  }|j	                  d      xs i j	                  dd      }|j	                  dd      }|j'                         d'k(  sN	  ||       |r||vr^|j)                  |       p |s!t#        | |	dd!d(||#       t        d)|  d*      |d   }|
r;|
j'                         d+vr)t#        | |	|d!d,|
 ||||-	       t        d)|  d.|
 d/      |r;|j'                         d0vr)t#        | |	|d!d1| ||||-	       t        d)|  d2| d3      |r0t#        | |	|d!d4|d5||-	       t+               | |	|d!d4|d5||d6
}| d!d4|d7S ddd8t        |       d9d:d;g} ||d<i t        j                  |      }|j                  dk7  rBd=}t#        | |	|d!||d>||-	       t        d?|  d|j                  dd j                                d@}t#        | |	|d!||d>||-	       t+               | |	|d!||||dA	}| d!||d7S # t        j                  $ r}t        d|       |d}~ww xY w# t        $ r Y nw xY w# t        $ r Y <w xY w)Bu  PR을 merge queue에 진입시킨다. admin override / force merge 절대 금지.

    1) no_admin_override=True 검증 (False면 즉시 MergeQueueError raise)
    2) gh pr view로 PR state, mergeable, mergeStateStatus, author, latestReviews 조회
    3) PR author=bot, latestReviews에 사람 approved 1건 이상 검증
    4) gh pr merge --merge --delete-branch로 merge_queue 진입
       - --admin 플래그 절대 사용 금지
    5) audit jsonl append
    6) 반환: {pr_number, action, outcome, audit_entry}
    Nu[   enqueue_pr: no_admin_override=False 차단 — admin override는 허용되지 않습니다.TASKCTL_TEST_MODE1TASKCTL_PR_REVIEWS_OVERRIDETASKCTL_PR_AUTHOR_OVERRIDEGH_TOKENOPEN	MERGEABLECLEAN ghprviewz--jsonz@state,mergeable,mergeStateStatus,author,latestReviews,headRefOid   )timeoutenvr   u   gh pr view 실패 (PR #z): iz{}u   gh pr view JSON 파싱 실패: authorloginstate	mergeablemergeStateStatus
headRefOidlatestReviews)is_bot_authorassert_human_actorenqueueBLOCKED_NOT_BOT_AUTHOR)	pr_numberr=   revieweractionoutcomehead_shar+   zenqueue_pr: PR author 'uE   '은 bot이 아닙니다. bot author PR만 merge queue 진입 가능.)load_allowed_human_approversAPPROVEDBLOCKED_NO_HUMAN_APPROVALzenqueue_pr: PR #uU   에 사람 reviewer의 APPROVED가 없습니다. 최소 1명의 사람 승인 필요.>   r3   BLOCKED_PR_STATE_)	rH   r=   rI   rJ   rK   rL   r+   r@   merge_state_statusz state='u   ' (OPEN 필요)>   UNKNOWNr4   BLOCKED_MERGEABLE_z mergeable='u   ' (MERGEABLE 필요)DRY_RUNT
tsrH   r=   rI   rJ   rK   rL   r+   r@   rQ   )rH   rJ   rK   audit_entrymergez--mergez--autoz--delete-branchx   FAILEDFu   gh pr merge 실패 (PR #ENQUEUED)	rV   rH   r=   rI   rJ   rK   rL   r@   rQ   )r!   r   osenvirongetstr
returncodestderrstripjsonloadsstdoutJSONDecodeError	Exceptionutils.bot_pr_authorrD   rE   _append_auditrM   upperappendr   )rH   r)   r*   r+   r,   
_test_modereviews_override_rawauthor_overrideenv_with_token	pr_authorpr_stater@   rQ   rL   latest_reviewsprocpr_dataexcrD   rE   rM   allowed_humanshuman_approved_reviewsreviewreviewer_loginr?   rI   rW   	merge_cmd
merge_procrK   s                                  r   
enqueue_prr|   -   sc   $ ~  i
 	
  34;JLV2::>>*GH\`FPbjjnn%ABVZO &(N%.z"#		$/1dFC	N\ 02::00
 ??a!))CDE8J8P8P8R7ST 	Tjj!45G [[*0b55grB	;;w+KKR0	$[[);R@;;|R0 _5; 	!ZZ(<=N
 F#	B&>w	

 %i[ 1: ;
 	
 23N   **X.4"99'2F

7B';;=J&">2!nN&J&--n= "	B&Aw	

 yk *3 4
 	

 &a(H HNN$H4	H(9(&Dw4F		
 yk(?K
 	
 Y__&.FF	H(:9+&Fw4F		
 yki[@TU
 	
 	Hit4F		
 &yI I) T":L	
 # &	
 	
 	dGS^8.I ,rzz,^,J !	Hgu4F		
 &ykZ5F5Ftu5M5S5S5U4VW
 	
 G I'50B	 f9		g6H	K "	 i ## 	T!$CC5"IJPSS	T  		B  sB   ?#O4 'P P.P.4PPP	P+*P+.	P;:P;r6   )r@   rQ   c        	           t         j                  j                  dd       t               | ||||||||d
}	t         j	                  dd      5 }
|
j                  t        j                  |	d      d	z          d
d
d
       y
# 1 sw Y   y
xY w)u,   audit jsonl에 merge queue 이벤트 기록.T)parentsexist_okrU   azutf-8)encodingF)ensure_ascii
N)MERGE_QUEUE_LOGparentmkdirr   openwriterc   dumps)rH   r=   rI   rJ   rK   rL   r+   r@   rQ   recordfs              r   ri   ri     s        =f0F 
		cG		4 ?	

66=>? ? ?s   *BB
)returnr_   )r   z	list[str]r    r   r   zsubprocess.CompletedProcess)r$   zlist[str] | Noner   
str | None)
rH   intr)   r   r*   boolr+   r   r   zdict[str, Any])rH   r   r=   r_   rI   r_   rJ   r_   rK   r_   rL   r_   r+   r   r@   r_   rQ   r_   r   None)r   
__future__r   rc   r\   r   r   r   pathlibr   typingr   r]   r^   	WORKSPACEr   r   __annotations__rg   r   r   r!   r(   r|   ri   r   r   r   <module>r      s1   ^ "  	  '   02GHI	h&)>>ATT'] _ ]Li LEI
$ !"UU U 	U
 U UB  ?? ? 	?
 ? ? ? ? ? ? 
?r   