
    (<ig              	          d Z ddlZddlZddlZddlZej
                  j                  dd      dz   Zej                  j                  ed      Z
 ej                  dej                        Z ej                  dej                        Zd	ed
edz  fdZd	ed
eeef   dz  fdZded
efdZdededed
ee   fdZd	ed
edz  fdZded
efdZy)u  
gemini_review_check.py — Gemini PR 리뷰 교차검증 verifier

보고서의 "Gemini PR 리뷰" 섹션과 실제 GitHub PR 코멘트의 severity를 교차검증한다.
보고서에 "High 0건"이라 되어 있는데 실제 Gemini 코멘트에 HIGH가 있으면 FAIL.
    NWORKSPACE_ROOTz/home/jay/workspacez/memoryreportsz&!\[(security-critical|critical|high)\]z!\[(medium)\]report_contentreturnc                     g d}|D ]<  }t        j                  || t         j                        }|s+|j                  d      c S  y)u*   보고서에서 PR 번호를 추출한다.)zPR\s*#(\d+)z$pr_number[\"']?\s*[:=]\s*[\"']?(\d+)z/pulls?/(\d+)z#(\d+)\s+worktree\s+finish   N)research
IGNORECASEgroupr   patternspms       [/home/jay/workspace/.worktrees/task-2057-dev2/teams/shared/verifiers/gemini_review_check.py_extract_pr_numberr      sF    H  IIa7771:     c                     t        j                  d|       }|r1|j                  d      |j                  d      j                  d      fS y)u+   보고서에서 owner/repo를 추출한다.z github\.com/([^/\s]+)/([^/\s#]+)r      /N)r	   r
   r   rstrip)r   r   s     r   _extract_repo_infor   %   s?    
		5~FAwwqz1771:,,S111r   bodyc                     | j                         }d|v s-d|v s)d| v s%d| v s!d| v st        j                  |       sd|v sd|v ryd	|v s%d
| v s!d| v sd| v st        j                  |       sd|v ryy)u5   Gemini 코멘트 body에서 severity를 파싱한다.zseverity: highzseverity: criticalu   🔴HIGHCRITICALzhigh-priority.svgzcritical.svghighzseverity: mediumu   ⚠️MEDIUMWARNINGzmedium-priority.svgmediumlow)lower_HIGH_IMG_REr
   _MEDIUM_IMG_RE)r   
body_lowers     r    _parse_gemini_severity_from_bodyr&   -   s    JJ&:-T>T>t$*,Z'j(tt  & J.r   ownerrepo	pr_numberc                    	 t        j                  ddd|  d| d| dgddd	      }|j                  d
k7  rg S t        j                  |j
                        }g }|D ]z  }|j                  di       j                  dd      }d|j                         vr8|j                  dd      }|j                  t        |      |j                  dd      |dd d       | |S # t         j                  t        j                  t        f$ r g cY S w xY w)u5   GitHub API로 PR의 Gemini 코멘트를 조회한다.ghapizrepos/r   z/pulls/z	/commentsT   )capture_outputtexttimeoutr   userlogin geminir   pathN   )severityr5   body_preview)
subprocessrun
returncodejsonloadsstdoutTimeoutExpiredJSONDecodeError	Exceptiongetr"   appendr&   )	r'   r(   r)   resultcommentsgemini_commentscr1   r   s	            r   _fetch_pr_gemini_commentsrH   G   s   	5F5'4&	{)LMdB
 !I::fmm, O 	uuVR $$Wb14::<'uuVR 8>EE&"% #J 
 		  %%t';';YG 	s   6C C *DDc                     g d}|D ]E  }t        j                  || t         j                        }|s+t        |j	                  d            c S  y)u=   보고서에서 Gemini 리뷰의 High 건수를 추출한다.)u   High\s+(\d+)\s*건z(high_severity_count[\"']?\s*[:=]\s*(\d+)zHIGH\s*[:=]\s*(\d+)r   N)r	   r
   r   intr   r   s       r   _extract_report_high_countrK   b   sJ    H
  #IIa7qwwqz?"# r   task_idc           	         t         j                  j                  t        |  d      }t         j                  j	                  |      sddgdS t        |d      5 }|j                         }ddd       dj                         vr
d	|vrdd
gdS t        |      }|sddgdS t        |      }|sddgdS |\  }}t        |      }	t        |||      }
|
s
dd| dgdS t        d |
D              }t        d |
D              }d| dt        |
       d| d| d	g}|	"|	|k7  r|j                  d|	 d| d       d|dS |	|dkD  r|j                  d| d       d|dS |j                  d       d|dS # 1 sw Y   xY w)u   
    QC verifier 인터페이스.
    보고서의 Gemini 리뷰 결과와 실제 PR 코멘트를 교차검증한다.

    Returns:
        {"status": "PASS"|"FAIL"|"SKIP", "details": [...]}
    z.mdSKIPu   보고서 파일 없음)statusdetailszutf-8)encodingNr4   Geminiu(   보고서에 Gemini 관련 내용 없음u'   보고서에서 PR 번호 추출 실패u)   보고서에서 repo 정보 추출 실패zPR #u.   에서 Gemini 코멘트를 조회하지 못함c              3   2   K   | ]  }|d    dk(  sd  yw)r7   r   r   N .0rG   s     r   	<genexpr>zrun.<locals>.<genexpr>   s     LAAjMV4KaL   c              3   2   K   | ]  }|d    dk(  sd  yw)r7   r    r   NrT   rU   s     r   rW   zrun.<locals>.<genexpr>   s     Paa
mx6OPrX   u   : Gemini 코멘트 u
   건 (High z	, Medium )u   불일치: 보고서 High=u   건, 실제 High=u   건FAILr   u8   경고: 보고서에 High 건수 미명시, 실제 High=u
   건 발견u   교차검증 통과PASS)osr5   joinREPORTS_DIRexistsopenreadr"   r   r   rK   rH   sumlenrC   )rL   kwargsreport_pathfr   r)   	repo_infor'   r(   report_highrF   actual_highactual_mediumrP   s                 r   r:   r:   q   s    '',,{wisO<K77>>+& .G-HII	kG	, "" ~++--(.2P .X-YZZ">2I .W-XYY">2I .Y-Z[[KE4 -^<K 0tYGO YK?m.n-oppLLLKP?PPM yk,S-A,B*[MYbcpbqqrsG
 ;+#=(5F{mSVW	
 !W55 {QF{mS]^	
 !W55NN()11_" "s   E66F )__doc__r<   r]   r	   r9   environrB   MEMORY_BASEr5   r^   r_   compiler   r#   r$   strr   tupler   r&   listdictrH   rJ   rK   r:   rT   r   r   <module>rt      s    	 	 jjnn-/DE	Qggll;	2 rzzCR]]S,bmm<s sTz  s uS#X/E 3 3 4S   T
 6s sTz ;2 ;24 ;2r   