
    üi"                       d Z ddlmZ ddl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
 ddlmZ ddlmZ  eej                  j!                  dd            Zed	z  d
z  dz  Zed	z  dz  Zed	z  dz  Ze
 G d d             Ze
 G d d             ZefddZ	 	 d	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 ddZd dZ	 	 	 	 	 	 d!dZd"dZ	 	 	 	 	 	 d#dZd$dZedk(  r ej@                   e              yy)%u  Memory violation detector (task-2419 Fix 2).

memory/specs/memory-violation-rules.yaml 기반으로 메모리 위반 자동 감지.

사용:
  python3 scripts/memory_violation_detector.py --task-id task-1234
  python3 scripts/memory_violation_detector.py --commit abc1234
  python3 scripts/memory_violation_detector.py --diff-base main
  python3 scripts/memory_violation_detector.py --staged

종료 코드:
  0: 위반 0건
  1: 위반 발견
  2: 룰 spec 또는 입력 에러
    )annotationsN)	dataclass)Path)AnyWORKSPACE_ROOTz/home/jay/workspacememoryspecszmemory-violation-rules.yamlzmemory-check-log.jsonztask-timers.jsonc                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   dZd	ed
<   dZd	ed<   dZd	ed<   dZded<   y)Rulestridname
memory_reftargetseveritydescriptionN
str | Nonepattern_regexfile_pattern	log_fieldr   expected_value)__name__
__module____qualname____annotations__r   r   r   r        R/home/jay/workspace/.worktrees/task-2487-dev2/scripts/memory_violation_detector.pyr   r   #   sI    G
IOKM $M:$#L*# Iz NCr   r   c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y)	Violationr   rule_id	rule_namelocationmatched_contentr   N)r   r   r   r   r   r   r   r    r    1   s    LNMMr   r    c                   	 ddl }| j                         s3t        d|  t        j                         t        j
                  d       t        | d      5 }j                  |      }ddd       g }j                  d	g       D ]  }|j                  t        |d
   |d   |j                  dd      |d   |j                  dd      |j                  dd      |j                  d      |j                  d      |j                  d      |j                  d      
              |S # t        $ r4 t        dt        j                         t        j
                  d       Y Zw xY w# 1 sw Y   xY w)u   YAML 룰 spec 로드.r   Nu(   ERROR: PyYAML 필요. pip install pyyamlfile   u   ERROR: 룰 spec 없음: utf-8encodingrulesr   r   r    r   r   mediumr   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )yamlImportErrorprintsysstderrexitexistsopen	safe_loadgetappendr   )pathr/   fdatar,   rs         r   
load_rulesr>   :   s;   
 ;;=(/cjjA	dW	% !~~a ! EXXgr" Tw6uu\2.X;UU:x0mR0%%0~.eeK(55!12
 	 L3  8szzJ! !s   D$ E$$9E! E!$E-c           	        | rdddd| g}n|r
dd| ddg}ng S 	 t        j                  |dddt        t                    j                  }g }|j                  d      D ]  }|j                         }|s|j                  d	      }t        |      d
k\  s6|d   j                         }|d   j                         }t        |      d
kD  r|d
   j                         nd}	|j                  || d|	 f        |S # t
        $ r g cY S w xY w)u$   commit (sha, message) 목록 반환.gitlogz-1z%--pretty=format:%H%x00%s%x00%b%x00END..HEADTcapture_outputtextcheckcwdzEND
 r(   r      r-   
)

subprocessrunr   	WORKSPACEstdout	Exceptionsplitstriplenr9   )

commit_sha	diff_basecmdoutresultsentrypartsshasubjectbodys
             r   get_commit_messagesr]   Z   s   
 eT#JJW	e	{&13Z[	nn4tY

& 	 &(G7# 	8D!u:?(.."CAhnn&G'*5zA~58>>#2DNNCG9Btf!567	8 N  	s   1C9 9DDc           	     L   |rg d}n| rdddd| g}n|rdd| dddg}ng S 	 t        j                  |d	d	d	t        t              
      j                  }|j                         D cg c]#  }|j                         s|j                         % c}S c c}w # t        $ r g cY S w xY w)u   변경된 파일 목록 반환.)r@   diffz--cached--name-only--diff-filter=ACMr@   showr`   z--pretty=format:r_   rB   ra   TrC   )rK   rL   r   rM   rN   
splitlinesrQ   rO   )rS   rT   stagedrU   rV   r;   s         r   get_changed_filesre   z   s     M	fm-?L	f62MCVW	nn4tY

& 	 $'>>#3Aaqwwy	AAA 	s*   AB %B;BB B B#"B#c                <   t         j                         sg S 	 t        t         d      5 }t        j                  |      }ddd       j                  dg       D cg c]  }|j                  d      | k(  s| c}S # 1 sw Y   >xY wc c}w # t        $ r g cY S w xY w)u<   memory-check-log.json에서 task_id에 해당하는 entries.r)   r*   Ncheckstask_id)LOG_PATHr5   r6   jsonloadr8   rO   )rh   r;   r<   es       r   get_log_entries_for_taskrm      s    ??	(W- 	 99Q<D	 88Hb1QaQUU95E5PQQ	  	 Q 	s9   B A<B B5B9B <BB BBc                j   | j                   sg S t        j                  | j                   t        j                        }g }|D ]o  \  }}|j	                  |      s|j                  t        | j                  | j                  d|d d  |j                  d      d   d d | j                               q |S )Nzcommit:   rJ   r   P   r!   r"   r#   r$   r   )r   recompile	MULTILINEsearchr9   r    r   r   rP   r   )rulecommitspat
violationsrZ   msgs         r   check_commit_message_ruler{      s     	
**T''
6C"$J S::c?i))"3r7), #		$ 23B 7  r   c                   | j                   sg S t        j                  | j                         }g }|D ]  }| j                  r>dd l}|j	                  t
        j                  j                  |      | j                        sNt        |z  }|j                         sh	 |j                  dd      }t        |j                         d      D ]l  \  }}	|j                  |	      s|j                  t!        | j"                  | j$                  | d| |	j'                         d d | j(                                  |S # t        $ r Y w xY w)	Nr   r)   ignore)r+   errorsrI   :rp   rq   )r   rr   rs   r   fnmatchosr:   basenamerM   r5   	read_textrO   	enumeraterc   ru   r9   r    r   r   rQ   r   )
rv   filesrx   ry   fpathr   fullcontentilines
             r   check_changed_file_ruler      s0   	
**T''
(C"$J ??277#3#3E#:D<M<MN5 {{}	nnghnGG !!3!3!5q9 		GAtzz$!!) GG"ii %was^$(JJL"$5!]]#  		,   		s   D<<	E	E	c                   | j                   sg S g }|D ]  }|j                  | j                         }|| j                  k7  s.|j                  t	        | j
                  | j                  d|j                  dd       d|j                  dd       | j                    d| d| j                   d| j                  	              |S )
Nzlog:mc_id?/rh   =z (expected=)rq   )r   r8   r   r9   r    r   r   r   )rv   entriesry   rl   actuals        r   check_log_entry_ruler      s     >>	"$J 	t~~&T(((i))gs 34AaeeIs6K5LM#'>>"2!F8;tGZGZF[[\ ] 	 r   c            
        t        j                  d      } | j                  d      }|j                  dd       |j                  dd	       |j                  d
d       |j                  ddd       | j	                         }t               }|st        dt        j                         yg }g }g }|j                  rt        |j                        }n|j                  r-t        |j                        }t        |j                        }nQ|j                  r-t        |j                        }t        |j                        }n|j                  rt        d      }g }|D ]  }|j                   dk(  r|j#                  t%        ||             .|j                   dk(  r|j#                  t'        ||             Y|j                   dk(  si|j#                  t)        ||              |st        d       yt        dt+        |       dt        j                         |D ]  }	t        d|	j,                  j/                          d|	j0                   d|	j2                   dt        j                         t        d |	j4                   t        j                         t        d!|	j6                   t        j                         t        t        j                          y")#NzMemory violation detector)r   T)requiredz	--task-idu-   task ID 기반 검사 (memory-check-log.json))helpz--commitu   특정 commit SHA 검사z--diff-baseu   ref..HEAD 범위 검사z--staged
store_trueu   staged 변경 검사)actionr   u'   WARN: 룰 0건. 룰 spec 작성 필요.r&   r   )rS   )rT   )rd   commit_messageschanged_fileslog_entriesu.   [memory-violation-detector] 위반 0건. PASS.u$   
[memory-violation-detector] 위반 u   건 발견:
z  [z] z (r   u       위치: u       내용: rI   )argparseArgumentParseradd_mutually_exclusive_groupadd_argument
parse_argsr>   r1   r2   r3   rh   rm   commitr]   re   rT   rd   r   extendr{   r   r   rR   r   upperr!   r"   r#   r$   )
parsergroupargsr,   rw   r   r   all_violationsrv   vs
             r   mainr      s\   $$1LMF///>E	{)XY	z(BC	}+DE	z,=STDLE7cjjI%'GE(*K||.t||<	%=!T[[9	%?!DNN;	!.&(N K;;++!!";D'"JK[[O+!!"9$"FG[[M)!!"6t["IJK >?	
/N0C/DMRZZ  AJJ$$&'r!))Bq{{m1ECJJWQZZL)

;Q../0szzB3::	
 r   __main__)r:   r   returnz
list[Rule])NN)rS   r   rT   r   r   list[tuple[str, str]])NNF)rS   r   rT   r   rd   boolr   	list[str])rh   r   r   list[dict[str, Any]])rv   r   rw   r   r   list[Violation])rv   r   r   r   r   r   )rv   r   r   r   r   r   )r   int)!__doc__
__future__r   r   rj   r   rr   rK   r2   dataclassesr   pathlibr   typingr   environr8   rM   
RULES_PATHri   TIMERS_PATHr   r    r>   r]   re   rm   r{   r   r   r   r   r4   r   r   r   <module>r      s|   #   	 	  
 !   02GHI	!G+.KK
x"99("%77 
 
 
    ' B "  B "   	.	
.&<
-&3l zCHHTV r   