
    (<i2                        d Z ddlZddlZddlZddlZddlZddlmZ  ej                  d      Z		 ddl
mZ  e        dZded	efd
Zded	edz  fdZdedee   ded	eeef   fdZdeded	edz  fdZdee   ded	efdZ	 d)dedee   ded	eeef   fdZedk(  r.ddlZ ej4                  ej6                  d        ej8                  d      Zej=                  dd       ej=                  dd       ej=                  ddg         ej=                  d!d       ej?                         Z e jB                  Z!e!Ae jD                  r5ejF                  jI                  e jJ                  d"d#e jD                   d$      Z!e!ejM                  d%        ee!e jN                  e jJ                        Z( e) ejT                  e(d&d'(             yy# e$ r e	j                  d       Y w xY w)*u2  
codex_gate_check.py - Codex G1 설계 게이트 검증 스크립트

Codex CLI를 통해 설계 문서와 영향받는 코드를 리뷰하고,
발견된 리스크 및 개선 제안을 JSON 형식으로 반환합니다.
Codex 장애 시 마아트 폴백(규칙 기반 검증)으로 자동 전환합니다.
    N)Anycodex_gate_check)load_env_keysu=   utils.env_loader 미설치 — .env.keys 자동 로드 스킵zT/home/jay/.claude/plugins/cache/openai-codex/codex/1.0.3/scripts/codex-companion.mjspathreturnc                     	 t        | dd      5 }|j                         cddd       S # 1 sw Y   yxY w# t        $ r!}t        j	                  d| |       Y d}~yd}~ww xY w)uP   파일을 안전하게 읽어 내용을 반환. 실패 시 빈 문자열 반환.rzutf-8)encodingNu   파일 읽기 실패: %s — %s )openread	Exceptionloggerwarning)r   fes      I/home/jay/workspace/.worktrees/task-2057-dev2/scripts/codex_gate_check.py_read_file_safer      sV    $g. 	!668	 	 	 8$Bs(   6 *	6 36 6 	A AA outputc                    t        j                  d|       }|r5|j                  d      j                         }	 t	        j
                  |      S t        j                  d|       }|r5|j                  d      j                         }	 t	        j
                  |      S y# t        j                  $ r Y cw xY w# t        j                  $ r Y yw xY w)u   
    Codex stdout에서 JSON 객체를 추출합니다.
    ```json ... ``` 블록 또는 직접 JSON 형식을 지원합니다.
    z```json\s*([\s\S]+?)\s*```   z\{[\s\S]+\}r   N)researchgroupstripjsonloadsJSONDecodeError)r   code_block_match	candidatebrace_matchs       r   _extract_json_from_outputr"   &   s     yy!>G$**1-335		::i((
 ))NF3K%%a(..0		::i((  ## 		 ## 		s#   B B5 B21B25C
C	task_fileaffected_filesworkspace_rootc                    t         j                  d       g }g }t        j                  j	                  |       s|j                  dd|  d       n2t        |       }|j                         s|j                  dd|  d       |D ]z  }t        j                  j                  |      r|nt        j                  j                  ||      }t        j                  j	                  |      rd|j                  dd| d       | t        |      dkD  r!|j                  dd	t        |       d
d       t        ||      }|r|j                  d      D ]^  }	t        j                  d|	      }
|
st        |
j!                  d            dk\  s:|j                  dd|	j                          d       ` |j                  d|        t        j                  j	                  |       rLt        |       }g d}|D cg c]	  }||v s| }}|r'|j                  dddj                  |       dd       t#        d |D              }|s|j                  d       | ||dddS c c}w )u   
    마아트 독립 검증 폴백.
    규칙 기반으로 파일 존재 여부를 확인하고 결과를 반환합니다.
    u!   Codex 장애 → 마아트 폴백criticalu7   설계 문서(task_file)가 존재하지 않습니다: )severitydescriptionu1   설계 문서(task_file)가 비어 있습니다: u2   영향받는 파일이 존재하지 않습니다:    highu   변경 범위가 큽니다 (u4   개 파일). 리뷰를 신중하게 진행하세요.
u   (\d+)곳에서 호출됨r   
   u   고영향 파일 감지: u   AST 의존성 분석 결과:
)u   인증u   결제u   보안u   권한PIIu   개인정보u   API키u   토큰mediumu1   설계 문서에 보안 민감 키워드 발견: , u   . 보안 리뷰 권장.c              3   ,   K   | ]  }|d    dk(    ywr(   r'   N .0r	   s     r   	<genexpr>z'_maat_fallback_check.<locals>.<genexpr>   s     Bqq}
2Bs   uA   마아트 폴백 검증 통과: 모든 파일이 존재합니다.maat_fallbackNpassriskssuggestionssourceerror)r   r   osr   isfileappendr   r   isabsjoinlen_get_callers_contextsplitr   r   intr   any)r#   r$   r%   r:   r;   content	file_pathresolvedcallers_ctxlinematchdanger_keywordskwfoundhas_criticals                  r   _maat_fallback_checkrR   @   si    NN67"$EK 77>>)$&!XYbXcd	
 "),}}LL *%VW`Va#b $ 	 "i 89bggll>[d>eww~~h'LL *%WXaWb#c >Q9#n:M9N  OC  D
 	 '~~FK%%d+ 	DII94@EU[[^,2 &%>tzz|n#M 	 	;K=IJ 
ww~~i !),m-?w??LL$!RSWS\S\]bScRdd{| 
 BEBBL^_ ! "!  @s   7	IIpromptc                    t         j                  j                  t              st        j                  dt               y	 t        j                  dt        dddg| ddd|	      }|j                  d
k7  r/t        j                  d|j                  |j                  dd        yt        |j                        }|r9d|v r5|j                  dd      }|st        j                  d       yt        |      S |S # t        j                  $ r t        j                  d       Y yt        $ r }t        j                  d|       Y d}~yd}~ww xY w)uK   codex-companion.mjs task 명령으로 Codex 호출. 실패 시 None 반환.z!codex-companion.mjs not found: %sNnodetask---jsonTx   )inputcapture_outputtexttimeoutcwdr   u2   codex-companion 비정상 종료: rc=%d, stderr=%s   	rawOutputr   u&   codex-companion rawOutput 비어있음u#   codex-companion 타임아웃 (120s)u!   codex-companion 호출 예외: %s)r>   r   r?   CODEX_COMPANION_PATHr   r   
subprocessrun
returncodestderrr"   stdoutgetTimeoutExpiredr   )rS   r%   resultparsedrawr   s         r   _run_codex_companionrl      s   77>>./:<PQ)63AdC	
 !NNOQWQbQbdjdqdqrvsvdwx*6==9kV+**["-CGH,S11$$ <= :A>s2    A!C4 "AC4 '
C4 2C4 4(EE&EEc           
         | syt         j                  j                  |dd      }t         j                  j                  |      st        j                  d|       yg }| D ]  }	 t        j                  d|d|d|dgd	d	d
|      }|j                  dk7  r-t        j                  d||j                  |j                         a	 t        j                  |j                        }|j                  di       }|j                  dg       }	|	r9|	dd }
dj                  |
      }|j                  d| dt!        |	       d|         |syddj                  |      z   S # t        j                  $ r"}t        j                  d||       Y d}~)d}~ww xY w# t        j"                  $ r t        j                  d|       Y ]t$        $ r"}t        j                  d||       Y d}~d}~ww xY w)u0  
    AST 스크립트를 이용해 affected_files 각각의 callers 정보를 조회합니다.

    Args:
        affected_files: 영향받는 파일 경로 목록
        workspace_root: 워크스페이스 루트 경로

    Returns:
        callers 정보 문자열 (비어있으면 빈 문자열)
    r   scriptszast_dependency_map.pyu)   AST 스크립트를 찾을 수 없음: %spython3z--rootz--filesrX   T   )r[   r\   r]   r^   r   u>   AST 스크립트 비정상 종료 (file=%s, returncode=%d): %su1   AST 스크립트 JSON 파싱 실패 (file=%s): %sNblast_radiuscallersr*   r0   z- z: u   곳에서 호출됨: u3   AST 스크립트 타임아웃 (30s 초과, file=%s)u7   AST 스크립트 호출 중 예외 발생 (file=%s): %su   함수 호출자 정보:
r,   )r>   r   rB   r?   r   r   rb   rc   rd   re   r   r   rf   r   rg   r@   rC   rh   r   )r$   r%   
ast_scriptlinesrI   ri   datar   rq   rr   top_callers
caller_strs               r   rD   rD      s    ni9PQJ77>>*%BJOE# +d	*	d^^ny  $"F   A%T%%MM	 zz&--0
  88NB7L!-!1!1)R!@G%bqk!YY{3
r)Bs7|n<QR\Q]^_M+dZ '$))E*:::+ '' RT]_`a (( 	]NNPR[\ 	dNNTV_abcc	dsJ   #AFE AFF+FFFF)G&<G&G!!G&/home/jay/workspacec                    t         j                  d| |       t        j                  j	                  d      st         j                  d       t        |       }|st         j                  d|        g }|D ]e  }t        j                  j                  |      r|nt        j                  j                  ||      }t        |      }|j                  d| d|        g |rdj                  |      nd}t        ||      }	|	rd|	 nd	}
d
| d| |
 d}d}d}t         j                  d       t        ||      }|d}t         j                  d       |"t         j                  d       t        | ||      S |j	                  dg       }|j	                  dg       }t        d |D              }t         j                  d|t        |      |       | |||ddS )u`  
    Codex G1 설계 게이트 검증 메인 함수.

    Args:
        task_file: 설계 문서(task 파일) 경로
        affected_files: 영향받는 파일 경로 목록
        workspace_root: 워크스페이스 루트 경로 (기본값: /home/jay/workspace)

    Returns:
        검증 결과 dict (pass, risks, suggestions, source, error)
    u8   codex_gate_check 시작: task_file=%s, affected_files=%sOPENAI_API_KEYuh   OPENAI_API_KEY 환경변수가 설정되지 않았습니다. Codex 호출이 실패할 수 있습니다.u0   task_file 내용 없음 또는 읽기 실패: %sz--- z ---
z

u   (영향받는 파일 없음)r   u   다음 설계 문서와 코드를 리뷰하여 JSON 형식으로 응답하세요.

응답 형식:
{"risks": [{"severity": "critical|high|medium|low", "description": "설명"}], "suggestions": ["제안1"]}

설계 문서:
u   

영향받는 코드:
r,   codexNu    Codex companion 호출 시도...codex_companionu   codex-companion 성공u+   Codex companion 실패 → 마아트 폴백r:   r;   c              3   D   K   | ]  }|j                  d       dk(    ywr2   )rg   r4   s     r   r6   z#codex_gate_check.<locals>.<genexpr>H  s     F1quuZ(J6Fs    u6   Codex 리뷰 완료 (source=%s): risks=%d, critical=%sr8   )r   infor>   environrg   r   r   r   rA   rB   r@   rD   rl   rR   rG   rC   )r#   r$   r%   task_content
code_partsrI   rJ   rH   code_contentrK   callers_sectionrS   r<   rj   r:   r;   rQ   s                    r   r   r     s     KKJIWef::>>*+  B  	C #9-LI9U J# =	 "i 89bggll>[d>e!(+D6';<= /96;;z*>\L '~~FK /:[M*rO     
F FF KK23!&.9F",- ~AB#I~~NN JJw#E**]B/KFFFL
KKH&RUV[R\^jk ! "     __main__z1%(asctime)s [%(levelname)s] %(name)s: %(message)s)levelformatu    Codex G1 설계 게이트 검증)r)   z	--task-id)defaultz--task-filez--affected-files*)nargsr   z--workspacememorytasksz.mdu;   --task-file 또는 --task-id 중 하나가 필요합니다.F   )ensure_asciiindent)rx   )+__doc__r   loggingr>   r   rb   typingr   	getLoggerr   utils.env_loaderr   ImportErrordebugra   strr   dictr"   listrR   rl   rD   r   __name__argparsebasicConfigINFOArgumentParserparseradd_argument
parse_argsargsr#   task_idr   rB   	workspacer=   r$   ri   printdumpsr3   r   r   <module>r      sk     	 	  			-	.R.O n # # c dTk 4TTIT T 
#s(^	Tn c dTk FE;c E;C E;C E;V 0PPIP P 
#s(^	Pf zGgll3fg$X$$1STF
T2
t4
*#rB
/DED IT\\GGLL7t||nTWDXY	RSi)<)<dnnMF	*$**V%
:;' 	  R
LLPQRs   G G%$G%