
    i              	       <   d Z ddlZddlZddlZg dZg dZ ej                  d      Zdede	e
dz  ef   fdZd	edefd
Zd	ede	eef   fdZddededede
fdZedk(  rddlZddlZ eej*                        dkD  rej*                  d   ndZ eej*                        dkD  rej*                  d   ndZes& edej2                          ej4                  d        eee      Z e ej8                  edd              ej4                  ed   dv rdnd       yy)u  
three_docs_check.py - 3문서 검증 verifier

Lv.3+ 작업의 plan.md, context-notes.md, checklist.md 존재 및 내용 검증.
- YAML frontmatter 필수 필드 확인
- plan.md status 업데이트 여부
- 플레이스홀더 미치환 탐지
- checklist 완료율 50% 미만 시 WARN
    N)plan.mdzcontext-notes.mdchecklist.md)task_idtypescopestatusu   \[[가-힣a-zA-Z\s]{2,30}\]contentreturnc                 J   | j                  d      sd| fS | j                  dd      }|dk(  rd| fS | d| j                         }| |dz   d j                         }	 t        j                  |      }t        |t              sd| fS ||fS # t        j                  $ r d| fcY S w xY w)u   
    YAML frontmatter(--- ... ---) 파싱.

    Returns:
        (frontmatter_dict, body) — 파싱 실패 시 (None, content)
    z---Nz
---      )
startswithfindstripyaml	safe_load
isinstancedict	YAMLError)r	   end
yaml_blockbodydatas        C/home/jay/workspace/teams/dev6/qc/verifiers.bak/three_docs_check.py_parse_frontmatterr      s     e$W}
,,w
"C
byW}3%%'J378""$D~~j)$%= Tz>> W}s   (B B B"!B"r   c                 >    t        t        j                  |             S )u;   본문에 미치환 플레이스홀더가 있는지 확인.)bool_PLACEHOLDER_REsearch)r   s    r   _has_placeholderr!   1   s    &&t,--    c                     t        t        j                  d| t        j                              }t        t        j                  d|             }|||z   fS )um   
    checklist.md 본문에서 완료/전체 항목 수 반환.

    Returns:
        (completed, total)
    z- \[x\]z- \[ \])lenrefindall
IGNORECASE)r   checked	uncheckeds      r   _checklist_completionr*   6   sD     "**Zr}}=>GBJJz401IGi'''r"    /home/jay/workspacer   report_path	workspacec           
         |}	 t         j                  j                  |ddd|       }t         j                  j                  |      sddd| |g ddS g }g }g }g }t        D ]{  }	t         j                  j                  ||	      }
t         j                  j                  |
      r|j                  |	d	d
       W|j                  |	       |j                  |	dd
       } |rddddj                  |       |||ddS g }t        D ]  }	t         j                  j                  ||	      }
|	|
d}	 t        |
d      5 }|j                         }d d d        t              \  }}|+d|d<   |j                  |	 d       |j                  |       d|d<   t        D cg c]	  }||vs| }}|r||d<   |j                  |	 d|        ng |d<   |	dk(  r8|j                  dd      }||d<   |d k(  r|j                  d!       d	|d"<   nd|d"<   t        |      r|j                  |	 d#       d	|d$<   nd|d$<   |	d%k(  rXt        |      \  }}||d&<   ||d'<   |d(kD  r6||z  }t        |d)      |d*<   |d+k  r"|j                  d,| d-| d.|d/d0       nd |d*<   |j                  |        |d1|igz   }|rd}d2d3j                  |       }n|rd4}d5d3j                  |       }nd6}d7}d|||||||d8dS # 1 sw Y   xY w# t        $ r:}d| |d<   |j                  |	 d|        |j                  |       Y d }~9d }~ww xY wc c}w )9Nmemoryplanstasksthree_docs_checkSKIPuA   3문서 디렉토리 없음 — Lv.2 이하 작업으로 간주: )	directorychecks)namer   messagedetailsT)fileexistsFFAILu   필수 파일 누락: z, )r5   r6   missing_files)r:   pathzutf-8)encodingu   읽기 오류: erroru   : 읽기 오류 — u   FAIL: frontmatter 파싱 실패r   u    : YAML frontmatter 파싱 실패OKmissing_fieldsu   : 필수 YAML 필드 누락 r   r   r+   plan_statusdraftu&   plan.md status=draft (미업데이트)status_warnu%   : 플레이스홀더 미치환 탐지placeholderr   checklist_completedchecklist_totalr      checklist_ratiog      ?u   checklist.md 완료율 /z (z.0%u   ) — 50% 미만file_resultsu   검증 실패: z; WARNu   경고: PASSu   3문서 검증 통과)r5   r6   rL   failswarns)osr>   joinisdirREQUIRED_DOCSisfileappendopenreadOSErrorr   REQUIRED_YAML_FIELDSgetr!   r*   round)r   r-   r.   _docs_dirr6   rP   rO   r=   fnamefpathrL   resultfr	   efmr   rB   rC   	completedtotalratio
all_checksr   r8   s                             r   verifyri   B   s   A ww||Ix'7KH 77=="&Z[cZde%	
 	
 FEE  "M <Xu-77>>% MM5D9:  'MM5E:;< &/		-0H/IJ% !.		
 		
  "L >$Xu- %u5	eg. #!&&(# &g.D:>F6NLLE7"BCD'v &:IQb[!II'5F#$LLE7">~>NOP')F#$ I&&2.K$/F=!g%EG(,}%(-}% D!LLE7"GHI$(F=!$)F=! N"4T:Iu,5F()(-F$%qy!E),1%O()3;LL#:9+QugRPUVY{Zj!kl,0()F#}>$B NL9::J#DIIe$4#56	TYYu-./) #! (
	 Q# # 	 /s3F7OLLE7"6qc:;'		$ Js<   0L=K4L	M(M4K>	9L	M
/L??M__main__   rI   z0Usage: three_docs_check.py <task_id> [workspace])r:   )r   r.   F)ensure_asciiindentr   )rN   r4   )r+   r,   )__doc__rQ   r%   r   rT   rZ   compiler   strtupler   r   r   r!   intr*   ri   __name__jsonsysr$   argvtidwsprintstderrexitra   dumps r"   r   <module>r~      s[   
 	 ?=  "**;< dTk3.>(? 4.3 .4 .
	( 	(c3h 	(KC Kc K3 K[_ K\ zSXX*#((1+CCHH)!/DB@szzRC2.F	*$**V%
:;CHH&"&66QA> r"   