
    Si                         U d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	 dZ
dZh dZdd	d	d	d	d
Zeeef   ed<   d	ZdededefdZdeddfdZdeddfdZdeddfdZddZedk(  r e        yy)uw  파일 크기 체커: Read tool 토큰 리밋(10000) 초과 위험 파일 탐지

사용법:
  python3 file_size_checker.py check <파일경로>          # 단일 파일 체크
  python3 file_size_checker.py scan <디렉토리>           # 디렉토리 스캔
  python3 file_size_checker.py guide <파일경로>           # 큰 파일에 대한 offset/limit 가이드 출력
    N)Path)DictListAnyi'     >   .md.py.yml.json.yamlg      @g      @)r   r	   r   r   r
   BYTES_PER_TOKEN
size_bytes	extensionreturnc                 n    t         j                  |j                         t              }t	        | |z        S )uC   파일 크기(bytes)와 확장자로 토큰 수를 추정합니다.)r   getlowerDEFAULT_BYTES_PER_TOKENint)r   r   bpts      M/home/jay/workspace/.worktrees/task-2117-dev1/teams/dev7/file_size_checker.pyestimate_tokensr      s,    


ioo/1H
ICzC      	file_pathc                    t        |       }|j                         s8t        t        j                  dd|  i             t        j                  d       |j                         j                  }|j                  }t        ||      }|t        kD  }t        |j                               |||t        d}t        t        j                  |dd             y)	u[   단일 파일의 크기를 체크하고 토큰 초과 여부를 JSON으로 출력합니다.erroru#   파일을 찾을 수 없습니다:    pathr   estimated_tokensexceeds_limitlimitF   ensure_asciiindentN)r   is_fileprintjsondumpssysexitstatst_sizesuffixr   TOKEN_LIMITstrresolve)r   r   r   r   r    r!   results          r   	cmd_checkr4   %   s    	?D<<>djj'%H#TUVW$$JI&z9=${2M DLLN# ,&F 
$**V%
:;r   	directoryc           	         t        |       }|j                         s8t        t        j                  dd|  i             t        j                  d       g }d}d}|j                  d      D ]  }|j                         s|j                  j                         t        vr5|dz  }|j                         j                  }|j                  }t        ||      }|t        kD  }	|	r|dz  }|j!                  t#        |j%                               |||	t        d        |j'                  d d	       |||d
}
t        t        j                  |
dd             y)uW   디렉토리를 스캔하여 초과 위험 파일 목록을 JSON으로 출력합니다.r   u)   디렉토리를 찾을 수 없습니다: r   r   *r   c                     | d   S )Nr     )fs    r   <lambda>zcmd_scan.<locals>.<lambda>^   s    Q12 r   T)keyreverse)filestotal_scannedexceeds_countFr#   r$   N)r   is_dirr(   r)   r*   r+   r,   rglobr'   r/   r   SCAN_EXTENSIONSr-   r.   r   r0   appendr1   r2   sort)r5   dir_pathr>   r?   r@   r   r   r   r    r!   r3   s              r   cmd_scanrG   ;   sC   IH??djj'%Nyk#Z[\]"$EMM^^C( 	  "!!#?:^^%--
$$	*:yA(;6QM	))+,$ 0* 
 	0 
JJ2DJA &&F
 
$**V%
:;r   c                    t        |       }|j                         s3t        d|  t        j                         t        j
                  d       	 t        |ddd      5 }|j                         }ddd       t              }|t        z  }t        t        z  }t        d
| d| d       |t        k  rt        d       yd}d}	|	|k  r9||	z
  dz   }
t        ||
      }t        d| d|	 d|        |	|z  }	|dz  }|	|k  r8yy# 1 sw Y   xY w# t        $ r=}t        d	| t        j                         t        j
                  d       Y d}~d}~ww xY w)u[   큰 파일을 Read tool로 읽을 때 필요한 offset/limit 값 안내를 출력합니다.u+   오류: 파일을 찾을 수 없습니다: )filer   rzutf-8replace)encodingerrorsNu+   오류: 파일을 읽을 수 없습니다: u   이 파일은 u	   줄, 약 u,    토큰입니다. Read tool로 읽으려면:uH     (전체를 한 번에 읽을 수 있습니다. offset/limit 불필요)z  Part z	: offset=z, limit=)r   r'   r(   r+   stderrr,   open	readlines	ExceptionlenLINES_PER_TOKENr0   min)r   r   r:   linesetotal_linestotal_estimated_tokenslines_per_chunkpartoffset	remainingr"   s               r   	cmd_guider]   h   s[   	?D<<>;I;GcjjY$gi@ 	"AKKME	" e*K(?: "_4O	
Y/E.F G% 	&
 ,XYDF
K
&(1,	OY/vYvhhug>?/!	 K
1	" 	" ;A3?cjjQs0   D D0D DD 	E3EEc                  ~   t        j                  dt         j                  t              } | j	                  dd      }|j                  dd      }|j                  d	t        d
       |j                  dd      }|j                  dt        d       |j                  dd      }|j                  d	t        d       | j                         }|j                  dk(  rt        |j                         y |j                  dk(  rt        |j                         y |j                  dk(  rt        |j                         y y )NuG   Read tool 토큰 리밋(10000) 초과 위험 파일 탐지 유틸리티)descriptionformatter_classepilogcommandT)destrequiredchecku8   단일 파일의 토큰 초과 여부를 체크합니다)helpr   u   체크할 파일 경로)typerf   scanuR   디렉토리 전체를 스캔하여 초과 위험 파일 목록을 반환합니다r5   u   스캔할 디렉토리 경로guideuE   큰 파일에 대한 offset/limit 읽기 가이드를 출력합니다u$   가이드를 출력할 파일 경로)argparseArgumentParserRawDescriptionHelpFormatter__doc__add_subparsers
add_parseradd_argumentr1   
parse_argsrb   r4   r   rG   r5   r]   )parser
subparserscheck_parserscan_parserguide_parserargss         r   mainrx      s2   $$] <<F
 &&I&EJ ((P ) L k:ST ''i ( K [s9XY ((] ) L k:`aD||w$..!		 		 $..! 
!r   __main__)r   N)rm   rj   r)   r+   pathlibr   typingr   r   r   r0   rS   rC   r   r1   float__annotations__r   r   r   r4   rG   r]   rx   __name__r9   r   r   <module>r      s      
  " ": %c5j!   ! ! ! !< < <,*< *< *<Z& & &R!"H zF r   