
    i              
          d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlm	Z	  eej                  j                  dd            Zedz  d	z  Zedz  d
z  Zedz  d
z  dz  Zdede	e   fdZdede	e   fdZdedee   fdZdededededdf
dZddedededefdZ	 	 ddedededefdZdedee   dee   defdZd dZedk(  r e        yy)!uM  
cross_model_review.py - 크로스모델 코드 리뷰 트리거

critical/security 레벨 작업 완료 시 비너스(Gemini) 또는 아틀라스(GPT)에
독립 코드 리뷰를 요청하고, 발견 사항을 교차 분석한다.

출처: gstack /codex 패턴 (MIT 라이선스, https://github.com/garrytan/gstack)
3가지 모드: Review, Challenge, Consult

Usage:
    python3 cross_model_review.py --task-id task-xxx --mode review
    python3 cross_model_review.py --task-id task-xxx --mode challenge
    python3 cross_model_review.py --task-id task-xxx --mode consult --question "..."
    N)datetime)Path)OptionalWORKSPACE_ROOTz/home/jay/workspacememoryreportsevents	decisionstask_idreturnc                 `    t         |  dz  }|j                         sy|j                  d      S )u0   task_id에 해당하는 보고서 내용 로드..mdNutf-8encoding)REPORTS_DIRexists	read_text)r   report_paths     )/home/jay/workspace/cross_model_review.py_load_reportr      s5    7)3/K  ' 22    c                     t         |  dz  }|j                         sy	 t        j                  |j	                  d            S # t        j
                  t        f$ r Y yw xY w)u   .done 파일 로드.z.doneNr   r   )
EVENTS_DIRr   jsonloadsr   JSONDecodeErrorOSError)r   	done_paths     r   
_load_doner    '   sa    y..Izz)--w-?@@  '* s   $A A A c                     ddl }t        |       }|sg S |j                  d|      }|D cg c]$  }t        j                  j                  |      s#|& c}S c c}w )u,   보고서에서 변경 파일 목록 추출.r   Nz0(/home/jay/workspace/\S+\.(?:py|js|ts|tsx|html)))rer   findallospathisfile)r   r"   reportpathsps        r   _get_changed_filesr*   2   sK    '"F	JJJFSE2!q 1A222s   $AAstagedecisionextrac                 4   t         j                  dd       | ||t        j                         j	                         d|}t         |  dz  }t        |dd      5 }|j                  t        j                  |d	      d
z          ddd       y# 1 sw Y   yxY w)u$   JSONL 결정 히스토리에 기록.Tparentsexist_ok)r   r+   r,   	timestampz.jsonlar   r   F)ensure_ascii
N)	DECISIONS_DIRmkdirr   now	isoformatopenwriter   dumps)r   r+   r,   r-   entrydecisions_filefs          r   _record_decisionr@   <   s    t4\\^--/	
 E #y%77N	ncG	4 >	

5u5<=> > >s   *BBmodequestionc           
          t        |       }t        |       }d|  d| d|r|dd nd dt        |       d	}|dd	 D ]  }|d
| dz  } |dk(  r|dz  }|S |dk(  r|dz  }|S |dk(  r	|d| dz  }|S )u+   크로스모델 리뷰 프롬프트 생성.u1   # 크로스모델 코드 리뷰 요청

## Task: u   
## 모드: u   
## 보고서 요약:
Ni  u   보고서 없음u   

## 변경 파일 (u   개):
   z- r5   reviewu  
## 리뷰 지시사항
위 작업의 코드 변경을 독립적으로 리뷰하세요.

### Pass 1 (CRITICAL — 발견 시 FAIL):
- SQL & Data Safety: 위험한 쿼리 패턴
- Race Conditions: 동시 접근 위험
- LLM Output Trust Boundary: AI 출력 미검증 사용
- Security: 인젝션, 인증 우회, 비밀키 노출

### Pass 2 (INFORMATIONAL — 경고만):
- Magic Numbers, Dead Code, Test Gaps, Performance

각 발견 사항에 대해:
- 파일:줄번호
- 카테고리 (CRITICAL/INFORMATIONAL)
- 설명
- 수정 제안
	challengeu	  
## 챌린지 모드 지시사항
적대적 관점에서 코드를 검토하세요. 코드를 깨뜨리려는 시도를 하세요.

1. 입력 경계값에서 깨지는 시나리오
2. 동시성 문제
3. 에러 핸들링 누락
4. 보안 취약점
5. 성능 병목
consultur   
## 컨설팅 모드 지시사항
아래 질문에 대해 코드 맥락을 참고하여 답변하세요:

질문: )r   r*   len)r   rA   rB   r'   changed_filesbase_promptr?   s          r   build_review_promptrK   K   s    '"F&w/M

 6 0 1 2}%& 'K 3B "A3bz!" x  	L ' 
	 	 		$  
	 	 

 	 	 r   c                    t        |       }|sddt        |  dz   dS t        |       }|s	dd|  ddS t        | ||      }t        dz  dz  }|j                  d	d	
       ||  d| dt        j                         j                  d       dz  }|j                  |d       t        | dd| |t        |             d| |t        |      t        |      t        t        |             d| d| ddS )ub   크로스모델 리뷰 요청 생성 (실제 API 호출은 하지 않음, 프롬프트만 생성).erroru   보고서 없음: r   )statusmessageu   .done 파일 없음: u+   . 작업 완료 후 리뷰 요청하세요.r   zcross-reviewsTr/   -z%Y%m%d%H%M%Sr   r   cross_reviewz#Cross-model review requested: mode=)r+   r,   rA   output_fileokuH   크로스모델 리뷰 프롬프트 생성 완료.
프롬프트 파일: u}   
비너스(Gemini) 또는 아틀라스(GPT)에 이 프롬프트를 전달하세요.
dispatch.py --team dev3-team --task-file u    로 위임 가능.)rN   r   rA   prompt_fileprompt_lengthrI   rO   )r   r   r    rK   	WORKSPACEr7   r   r8   strftime
write_textr@   strrH   r*   )r   rA   rB   r'   doneprompt
output_dirrR   s           r   generate_review_requestr]      sH    '"F+KWIS/,I+JK
 	

 gD.wi7bc
 	

 !$9F X%7JTD1'!D68<<>3J3J>3Z2[[^__K6G4 6tf=$ ;'V/89$$/= 188C}DWY r   claude_findingsother_findingsc                     t        |      }t        |      }||z  }||z
  }||z
  }t        ||z        }|dkD  rt        |      |z  dz  nd}	| t        |	d      t        |      t        |      t        |      |d}
t	        | dd|	dd	|
       |
S )u*   두 엔진의 발견 사항 교차 분석.r   d   g      Y@   )r   agreement_rate
both_foundonly_claude
only_othertotal_uniquecross_review_analysiszAgreement rate: z.1f%)r+   r,   findings)setrH   roundlistr@   )r   r^   r_   
claude_set	other_setbothre   rf   total	agreementresults              r   analyze_cross_findingsrt      s     _%JN#I	!Dy(KZ'J
Y&'E+019D	E!C'%I 	1-4jK(:&!F %#Ic?!4	 Mr   c                  h   t        j                  d      } | j                  ddd       | j                  ddg d	d
       | j                  ddd       | j                         }t	        |j
                  |j                  |j                        }t        t        j                  |dd             y )Nu   크로스모델 코드 리뷰)descriptionz	--task-idTu   리뷰할 task ID)requiredhelpz--moderE   )rE   rF   rG   u(   리뷰 모드 (review/challenge/consult))defaultchoicesrx   z
--question u   consult 모드 질문)ry   rx   )r   rA   rB   F   )r4   indent)argparseArgumentParseradd_argument
parse_argsr]   r   rA   rB   printr   r<   )parserargsrs   s      r   mainr      s    $$1PQF
d9LM
27	   b7NOD$YYF 
$**V%
:;r   __main__)r{   )rE   r{   )r   N)__doc__r~   r   r$   sysr   pathlibr   typingr   environgetrV   r   r   r6   rY   r   dictr    rm   r*   objectr@   rK   r]   rt   r   __name__ r   r   <module>r      s{     	 
    02GHI	("Y.!H,
H$x/+=3# 3(3- 3  3 3S	 3>c ># > >v >RV >8 8C 83 8 8z 33
3 3 
	3l!!#Y! I! 
	!H<, zF r   