
    mik              	          d Z ddlZddlZdZdedefdZddeded	edefd
Ze	dk(  rddl
Z
e
j                  dd Zes1 e ej                  ddgddd              e
j                  d       ed   ZdZdev r&ej%                  d      Zede Zeedz   d Zered   Znedd Z eeee      Z e ej                  edd             yy)u   
scope_check.py - 작업 범위(scope) 검증 verifier
audit-trail.jsonl에서 실제 변경 파일을 추출하여 예상 파일 목록과 대조
    Nz1/home/jay/workspace/memory/logs/audit-trail.jsonltask_idreturnc                    ddl }d|  d}	 t        |dd      5 }|j                         }ddd       g }|j                  d      D ]"  }|j                  |j                  d	             $ |j                  d
||j                        D ])  }|j                  d      }||vs|j                  |       + |S # 1 sw Y   xY w# t        t        f$ r g cY S w xY w)uF   보고서의 수정 파일 섹션에서 파일 경로를 자동 추출r   Nz#/home/jay/workspace/memory/reports/z.mdrutf-8encodingzH\|\s*([\w/._-]+\.(?:py|ts|tsx|js|jsx|sh|md|json|yaml|yml))(?::\d+)?\s*\|   za^[-*]\s+`?(/home/jay/workspace/)?([\w/._-]+\.(?:py|ts|tsx|js|jsx|sh|md|json|yaml|yml))(?::\d+)?`?   )	reopenreadFileNotFoundErrorOSErrorfinditerappendgroup	MULTILINE)r   r   report_pathfcontentfilesmatchpaths           :/home/jay/workspace/teams/dev1/qc/verifiers/scope_check.py_extract_files_from_reportr      s    7yDK+sW5 	ffhG	
 Ehjqr %U[[^$% l
 
 {{1~uLL L%	 	w' 	s'   C B7C 7C <C CC expected_filesaudit_trail_pathc                    | st        |      } | sddgdS |r|nt        }	 t        |dd      5 }|j                         }ddd       t               }d}D ]@  }	|	j                         }	|	s	 t        j                  |	      }
|
j                  d      |k7  rBdD ]  }|
j                  |      }t        |t              rG|D ]A  }t        |t               s|j#                  t$        j&                  j)                  |             C kt        |t               s||j#                  t$        j&                  j)                  |              |
j                  d      }t        |t               s|j#                  t$        j&                  j)                  |             C |s#d| dg}|r|j+                  d| d       d|dS | D ch c]!  }t$        j&                  j)                  |      # }}t-        ||z
        }dt/        |       ddt/        |       dg}|r|j+                  d| d       |sd|dS |D ]  }|j+                  d|         d|dS # 1 sw Y   xY w# t        $ r dd	| gdcY S t
        $ r)}dd
t        |      j                   d| gdcY d}~S d}~ww xY w# t        j                  $ r	 |dz  }Y ow xY wc c}w )u  
    audit-trail.jsonl에서 task_id에 해당하는 실제 변경 파일을 추출하고,
    expected_files와 대조하여 범위 이탈 여부를 검증합니다.

    Args:
        expected_files: 변경이 허용된 파일 경로 목록
        task_id: 검사 대상 task ID
        audit_trail_path: audit-trail.jsonl 파일 경로
                          (기본값: /home/jay/workspace/memory/logs/audit-trail.jsonl)

    Returns:
        {"status": "PASS"|"WARN"|"SKIP", "details": [...]}
    SKIPuP   No expected files specified and report extraction failed — scope check skippedstatusdetailsr   r   r   NWARNu,   audit-trail 부재로 범위 검증 불가: u3   audit-trail 읽기 실패로 범위 검증 불가: z: r   r
   r   )r   changed_filesfilez3No changed files found in audit-trail for task_id=''(z! line(s) failed to parse as JSON)z
Expected: z fileszActual: PASSzUnexpected: )r   DEFAULT_AUDIT_TRAIL_PATHr   	readlinesr   r   type__name__setstripjsonloadsJSONDecodeErrorget
isinstanceliststraddosr   normpathr   sortedlen)r   r   r   
trail_pathr   lineseactual_filesparse_errorslineentrykeyvaluesingler$   normalized_expected
unexpectedr   s                     r   verifyrI   '   s     3G< no 
 &6!;SJ
*cG4 	"KKME	" LL 7zz|	JJt$E
 99Y7* . 	:CIIcNE%& >A!!S)$(()9)9!)<=> E3'  !1!1%!89	: 6"fc"RWW--f56376 H	QRSTNNQ|n,MNO W55 >LL 0 0 3LL '::;J S,-.f5
3|$%V,G
 <.(IJK W55 .dV,-. 11M	" 	" 
FzlST
 	
  
MdSTgN^N^M__abcadef
 	

  ## 	AL	8  MsR   I" I I" .J*&K	II" "J'6J'>J"J'"J'*KK__main__r
   r!   z@Usage: scope_check.py <task_id> [audit_trail_path] -- <file> ...r"   Fr   )ensure_asciiindentz--)r   )__doc__r1   r9   r+   r7   r6   r   dictrI   r.   sysargvargsprintdumpsexit_task_id_audit_trail_pathindexsep_idx_middle	_expectedresult     r   <module>r^      s/  
  	N   6a24 a2# a2 a2d a2H z
 88AB<DDJJ!/q.rs"	
 	AwH t|**T"q/1'	 '
H	Ix):;F	*$**V%
:;A r]   