
    oi                      4   d Z ddlZddlZdZej                  j                  ed      Zej                  j                  ed      Zdede	e
ef   fdZd	ede	e
ef   fd
Zd	ede	e
ef   fdZded	edee   fdZdd	ededz  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   j1                  d      ng Z eee      Z e ej8                  edd             yy)u   
file_check.py - 파일 존재/경로 검증 verifier
파일 존재 여부, 크기 > 0 확인
events/{task_id}.done 및 reports/{task_id}.md 확인 포함
보고서 내용 검증: task_id 포함 확인, SCQA 섹션 존재 확인
    Nz/home/jay/workspace/memoryeventsreportspathreturnc                 h   	 t         j                  j                  |       sdd|  fS t         j                  j                  |       sdd|  fS t         j                  j	                  |       }|dk(  rdd|  fS dd| d|  fS # t
        $ r
 dd	|  fcY S t        $ r}dd
|  d| fcY d}~S d}~ww xY w)u?   파일 존재 + 크기 > 0 체크. (ok, detail_message) 반환.Fz	MISSING: zNOT A FILE: r   zEMPTY (0 bytes): TzOK (	 bytes): zPERMISSION DENIED: z
OS ERROR: u    — N)osr   existsisfilegetsizePermissionErrorOSError)r   sizees      =/home/jay/workspace/teams/dev7/qc/verifiers.bak/file_check.py_check_filer      s    2ww~~d#IdV,,,ww~~d#L///wwt$19-dV444tD64&111 3+D6222 2
4&aS1112s4   %B %B *B 9	B B1B1	B,&B1,B1task_idc                    t         j                  j                  t              sddt         fS 	 t        j                  t              }|D cg c]  }|j                  |       sd|v s| }}|r.t         j                  j                  t        |d         }dd| fS dd	t         d
|  dfS # t
        $ r}dd| fcY d}~S d}~ww xY wc c}w )u   
    events/ 디렉토리에서 task_id에 해당하는 .done 파일을 찾습니다.
    실제 파일명 패턴: task-4.4.done, task-4.4.done.clear 등
    Fzevents dir not found: zCannot read events dir: Nz.doner   TzDONE FILE FOUND: zNO .done FILE: /z.done (not found))r	   r   isdir
EVENTS_DIRlistdirr   
startswithjoin)r   entriesr   matchesmatched_paths        r   _find_done_filer   !   s    
 77==$.zl;;;5**Z(
 "LQQ\\'%:w!|qLGLww||J
;(777
|1WI=NOOO  504445 Ms/   B. C$C)C.	C7C=CCc                 F   t         j                  j                  t              sddt         fS t         j                  j	                  t        |  d      }t         j                  j                  |      r*	 t         j                  j                  |      }dd| d| fS 	 t        j                  t              }|D cg c](  }|j                  |       s|j                  d      s'|* }}|rQt         j                  j	                  t        |d
         }	 t         j                  j                  |      }dd| d| fS ddt         d|  dfS # t        $ r}dd| fcY d}~S d}~ww xY w# t        $ r}dd	| fcY d}~S d}~ww xY wc c}w # t        $ r
 dd| fcY S w xY w)ur   
    reports/ 디렉토리에서 task_id에 해당하는 .md 파일을 찾습니다.
    패턴: {task_id}.md
    Fzreports dir not found: .mdTREPORT FOUND (r   REPORT READ ERROR: NzCannot read reports dir: r   zREPORT FOUND: NO REPORT: r   .md (not found))r	   r   r   REPORTS_DIRr   r
   r   r   r   r   endswith)r   report_pathr   r   r   r   r   s          r   _find_report_filer(   8   s   
 77==%/}==='',,{wisO<K	ww~~k"	477??;/D>$yFFF
	:jj-G &Ug)>1::eCT1UU77<<WQZ@L=ww|4~dV9\NKKK K='/JJJ#  	4/s333	4  	:5aS999	: V  =~l^<<<=s`   6(E  E+ =FF&F(F 	E(E#E(#E(+	F4F :F FF F r'   c                   
 g }	 t        | d      5 }|j                         
ddd       |r|
vr|j                  d| d       g dg dg d	g d
d}g }|j	                         D ]-  \  }}t        
fd|D              }	|	r|j                  |       / |r|j                  d| d       |S # 1 sw Y   xY w# t        $ r }|j                  d|        |cY d}~S d}~ww xY w)u  
    보고서 내용을 읽어 추가 검증을 수행하고 WARN 메시지 목록을 반환.

    검증 항목:
    1. task_id 문자열 포함 여부 (없으면 WARN)
    2. SCQA 필수 섹션 존재 여부 (없으면 WARN)

    SCQA 패턴:
      S: "**S**:" 또는 "S:" 또는 "Situation"
      C: "**C**:" 또는 "C:" 또는 "Complication"
      Q: "**Q**:" 또는 "Q:" 또는 "Question"
      A: "**A**:" 또는 "A:" 또는 "Answer"
    zutf-8)encodingNu-   WARN: 보고서 내용을 읽을 수 없음: zWARN: task_id 'uN   '이(가) 보고서에 없음 — 다른 task 보고서를 복사한 가능성)z
\*\*S\*\*:z(?<![A-Za-z])S:	Situation)z
\*\*C\*\*:z(?<![A-Za-z])C:Complication)z
\*\*Q\*\*:z(?<![A-Za-z])Q:Question)z
\*\*A\*\*:z(?<![A-Za-z])A:Answer)SCQAc              3   J   K   | ]  }t        j                  |        y w)N)research).0pcontents     r   	<genexpr>z(_check_report_content.<locals>.<genexpr>~   s     <aBIIa)<s    #u   WARN: SCQA 섹션 누락 u'    — SCQA 포맷 권장 (필수 아님))openreadr   appenditemsany)r'   r   warnsfr   scqa_patternsmissing_sectionssectionpatternsfoundr8   s             @r   _check_report_contentrF   Y   s    E+0 	AffhG	 7')wi/}~ ?A=;	+M #%*002 -<8<<##G,-
 01A0BBijkL7	 	 DQCHIs3   B< B0B< 0B95B< <	C%C C% C% F
file_paths	skip_done_reports_dirc                    |g }|r|nt         }g }d}d}g }|D ].  }	t        |	      \  }
}|j                  |       |dz  }|
r*|dz  }0 | rb|r|j                  d       n+t        |       \  }
}|j                  |       |dz  }|
s|dz  }|r}t        j
                  j                  ||  d      }t        j
                  j                  |      r-	 t        j
                  j                  |      }dd| d| }}
|}nVd	d| d|  d}}
d}nHt        |       \  }
}|
r6|j                  dd      }t        |      dkD  r|d   j                         nd}nd}|j                  |       |dz  }|
s|dz  }n>|r<t        j
                  j                  |      rt        ||       }|j                  |       |dk(  rddgdS ||z
  }|j                  | d| d       |dkD  rd}n|rd}nd}||dS # t        $ r}d	d
| }}
d}Y d}~d}~ww xY w)u  
    파일 존재 여부를 검증합니다.

    Args:
        task_id: task ID (events/.done 및 reports/.md 확인에 사용)
        file_paths: 추가로 검사할 파일 경로 목록
        skip_done: True이면 .done 파일 체크를 건너뜀 (--gate 모드에서 사용)
        _reports_dir: (테스트용) reports 디렉토리 경로. 기본값은 REPORTS_DIR.

    Returns:
        {"status": "PASS"|"FAIL"|"WARN"|"SKIP", "details": [...]}
    Nr      z0SKIPPED .done check (--gate mode will create it)r    Tr!   r   Fr"   r#   r   r$   z: SKIPzNo files to check)statusdetailsz checks passedFAILWARNPASS)r%   r   r<   r   r	   r   r   r   r   r   r(   splitlenstriprF   extend)r   rH   rI   rJ   reports_dirrO   failurestotalcontent_warnsr   okmsgreport_path_exactr   found_report_pathr   partspassedrN   s                      r   verifyra      sO    
".,KKGHE!M  d#Cs
MH NNMO%g.GBNN3QJEA  "[WIS/ Jww~~/0-77??+<=D"nTF)DUCV$WB4E%
  ;{m1WI_!UC$(!'0GB		$*8;E
QE!HNN$4D!$(!s
MH277>>2C#D12CWMMNN=)z .A-BCCXFNNfXQug^45!|	11M  -#':1#%>B(,%-s   +G* *	H3	HH__main__rL      ,)r   rH   )ensure_asciiindent)rG   NFrG   )__doc__r	   r4   MEMORY_BASEr   r   r   r%   strtupleboolr   r   r(   listrF   dictra   __name__jsonsysrT   argvtidrS   pathsresultprintdumps     r   <module>ry      sm   
 	*WW\\+x0
ggll;	22c 2eD#I. 2"PS PU49%5 P.Ks KuT3Y'7 KB,s ,S ,T#Y ,^Y2C Y2$+ Y2 Y2eh Y2rv Y2x zSXX*#((1+C&)#((ma&7CHHQKc"RECE2F	*$**V%
:; rx   