
    i                        d Z ddlZddlZddlZ ej                  d      Z ej                  dej                        Z ej                  d      Z ej                  dej                        Z	 ej                  dej                        Z
ded	ee   fd
Zdee   d	efdZdeded	ee   fdZdeded	efdZddeded	efdZy)u  
browser_verify.py - 프론트엔드 변경에 대한 듀얼 MCP(Playwright + Chrome DevTools) 검증 verifier

MCP 도구를 직접 호출하지 않고, 팀장이 DIRECT-WORKFLOW에 따라 수행한
브라우저 검증의 증거(스크린샷, 보고서 기록)를 확인합니다.
    Nz^task-\d[\w.\-]*$z%\.(tsx|jsx|vue|svelte|html|css|scss)$z)(dashboard/|frontend/|static/|templates/)uE   콘솔\s*에러\s*0\s*건|console\s*error[:\s]+0|no\s+console\s+erroru>   lighthouse|성능\s*점수|performance\s*score|\blcp\b|\bfcp\bcontentreturnc                    | j                         }d}g }h d}|D ]  }|j                         }|j                  d      rB|dd j                         j                         }||D ch c]  }|j                          c}v }f|si|j                  d      r |S |j	                  d      j                         }	|	s|j                  |	        |S c c}w )uG   task 파일의 ## affected_files 또는 ## 영향 파일 섹션 파싱.F>      변경 파일   영향 파일affected filesaffected_filesz##    Nu   -*• )
splitlinesstrip
startswithlowerlstripappend)
r   lines
in_sectionfilessection_headerslinestrippedheaderhitems
             V/home/jay/workspace/.worktrees/task-2116-dev1/teams/shared/verifiers/browser_verify.py_parse_affected_filesr       s     EJE\O #::<u%ab\'')//1F#G!AGGI#GGJ""5)
 L ??8,224DT"# L $Hs   %Cr   c                 n    | D ]0  }t         j                  |      r yt        j                  |      s0 y y)u9   파일 목록에서 프론트엔드 변경 여부 판별.TF)FRONTEND_EXT_PATTERNSsearchFRONTEND_DIR_PATTERNS)r   fs     r   _is_frontend_changer!   8   s8      ''* ''*	
     task_idworkspace_rootc                     t         j                  j                  |dd      }t         j                  j                  |      sg S t         j                  j                  ||  d      }t	        j                  |      S )uD   memory/screenshots/{task_id}*.png 스크린샷 파일 목록 반환.memoryscreenshotsz*.png)ospathjoinisdirglob)r#   r$   screenshots_dirpatterns       r   _find_screenshotsr/   B   sW    ggll>8]KO77==)	ggll?wiu,=>G99Wr"   c                 x   t         j                  j                  |dd|  d      }t         j                  j                  |      sddddS t	        |dd      5 }|j                         }d	d	d	       t        t        j                              t        t        j                  |            d
dS # 1 sw Y   GxY w)u   
    보고서 파일에서 콘솔 에러 / Lighthouse 기록 존재 여부 반환.
    Returns: {"has_console": bool, "has_lighthouse": bool, "exists": bool}
    r&   reports.mdF)has_consolehas_lighthouseexistsrutf-8encodingNT)
r(   r)   r*   isfileopenreadboolCONSOLE_ERROR_PATTERNr   LIGHTHOUSE_PATTERN)r#   r$   report_pathr    r   s        r   _check_reportrA   K   s    
 '',,~xwisOTK77>>+&$OO	k3	1 Q&&( 188AB188AB  s   B00B9c           	         t         j                  |       s	dd|  gdS t        j                  j	                  |dd|  d      }t        j                  j                  |      s	dd| gdS t        |d	d
      5 }|j                         }ddd       t              }|sddgdS t        |      sddt        |       dgdS dt        |       dg}t        | |      }|s+|j                  d|  d       |j                  d       d|dS |j                  dt        |       ddj	                  d |D               d       t        | |      }|d   s|j                  d       d|dS |d   r|j                  d       n|j                  d       |d    r|j                  d!       n|j                  d"       |d   r|d    sd|dS d#|dS # 1 sw Y   FxY w)$u  
    프론트엔드 변경 여부를 감지하고, 듀얼 MCP 브라우저 검증 증거를 확인합니다.

    Returns:
        {"status": "PASS"|"FAIL"|"SKIP"|"WARN", "details": [...]}

    판정 기준:
        SKIP : 프론트 변경 없음
        PASS : 프론트 변경 + 스크린샷 존재 + 보고서에 콘솔에러/Lighthouse 기록 존재
        WARN : 프론트 변경 + 스크린샷 존재 + Lighthouse 기록 없음
        FAIL : 프론트 변경인데 스크린샷 없음 (L1 스모크테스트 미수행)
    FAILu   잘못된 task_id 형식: )statusdetailsr&   tasksr2   SKIPu   task 파일 없음: r6   r7   r8   Nu0   affected_files 섹션 없음 또는 비어있음u#   프론트엔드 변경 없음 (총 u   개 파일 확인)u"   프론트엔드 변경 감지 — u
   개 파일u1   FAIL: 스크린샷 없음 — memory/screenshots/u   *.png 미발견uV   Playwright MCP를 통한 L1 스모크테스트가 수행되지 않은 것으로 판정u   스크린샷 확인: u   개 (z, c              3   Z   K   | ]#  }t         j                  j                  |       % y w)N)r(   r)   basename).0ss     r   	<genexpr>zverify.<locals>.<genexpr>   s!     KudeBGGL\L\]^L_Kus   )+)r5   uK   WARN: 보고서 파일 없음 — Lighthouse/콘솔 에러 기록 미확인WARNr3   u?   콘솔 에러 기록 확인 (Chrome DevTools MCP 검증 증거)u.   WARN: 보고서에 콘솔 에러 기록 없음r4   u   Lighthouse 점수 기록 확인u+   WARN: 보고서에 Lighthouse 기록 없음PASS)TASK_ID_PATTERNmatchr(   r)   r*   r:   r;   r<   r   r!   lenr/   r   rA   )	r#   r$   	task_pathr    r   r	   rE   r'   reports	            r   verifyrU   ^   s      ) 0J7).T-UVV^Xw7)3PI77>>)$ 0DYK.P-QRR	iw	/ 1&&( +73N .`-abb ~.5c.6I5JJ\]
 	
 4C4G3H
STG $G^<K?yX	
 	op W55NN*3{+;*<E$))KuitKuBuAvvwxy 7N3F(de W55mXYGH89DE - /?(@ W5511g s   :GG)z/home/jay/workspace)__doc__r(   rer,   compilerP   
IGNORECASEr   r   r>   r?   strlistr   r=   r!   r/   dictrA   rU    r"   r   <module>r^      s   
 	  "**12 #

,bmm  #

0 
 #

Lbmm   RZZEr}} 
3 49 0tCy T s C DI 3   &I2C I2 I2 I2r"   