
    i(                     N   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m	Z	 e	e
e
f   Zh dZh dZg d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e   fdZded	ee   fdZded	ee   fdZddddZdee   d	ee   fdZdee   d	efdZddZedk(  r e        yy)uG   lint-workspace.py - workspace 구조 규칙 위반 감지 스크립트.    N)Path)ListTuple>   .envchain.py	.env.keys
.gitignore
kickoff.pyconftest.pydispatch.pyglm-coder.pygroup_chat.pysync-check.pyinbox_utils.pypyproject.tomlorchestrator.pychain_manager.pyreport_parser.pyrequirements.txtdecision_logger.pypyrightconfig.jsoncross_model_review.py.pre-commit-config.yaml	CLAUDE.md>   USER.mdTOOLS.mdIDENTITY.mdBOOTSTRAP.mdHEARTBEAT.mdr   )scriptsworkersteams	workspacereturnc                     g }| j                         D ]<  }|j                         s|j                  t        vs'|j	                  dd| f       > |S )u6   ERROR: workspace 루트에 불필요한 파일 존재.ERRORu)   workspace 루트에 불필요한 파일: )iterdiris_filenameROOT_ALLOWED_FILESappend)r#   
violationsitems      -/home/jay/workspace/scripts/lint-workspace.pycheck_root_unwanted_filesr/   %   s[    "$J!!# ]<<>dii/AAw*STXSY(Z[\]     c           	      P   g }| dz  }|j                         s|S |j                         D ]y  }|j                         s|j                         D ]S  }|j                         r|j                  t        v r'|j                  dd|j                   d|j                   f       U { |S )uC   WARNING: teams/ 하위에 task-* 디렉토리 없이 파일 산재.r"   WARNINGzteams/u$   에 태스크 격리 없는 파일: )existsr'   is_dirr)   TEAM_ALLOWED_FILESr+   )r#   r,   	teams_dirteam_dirr-   s        r.   check_teams_scatterr8   .   s    "$JG#I%%'  $$& 	D{{}yy..'KDII;W 	 r0   c                    g }| dz  }|j                         s|S t        j                         dz
  }|j                  d      D ]G  }|j                         s|j	                         j
                  |k  s2|j                  dd| f       I |S )u$   WARNING: tmp/에 7일 초과 파일.tmpi:	 *r2   u   tmp/에 7일 초과 파일: )r3   timerglobr(   statst_mtimer+   )r#   r,   tmp_dircutoffr-   s        r.   check_tmp_old_filesrB   C   s    "$J%G>>YY[9$Fc" R<<>diik22V;y,H*OPQR r0   c           
      
   g }t         D ]w  }| |z  }|j                         s|j                  d      D ]K  }t        |j	                  d      j                               }|dkD  s2|j                  dd| d| df       M y |S )	uC   INFO: 200줄 초과 .py 파일 (scripts/, workers/, teams/ 하위).z*.pyreplace)errors   INFOu   200줄 초과: z (u   줄))	SCAN_DIRSr3   r=   len	read_text
splitlinesr+   )r#   r,   dirnamescan_dirpy_fileliness         r.   check_long_py_filesrP   P   s    "$J Vw& ~~f- 	VG)));FFHIEs{!!6_WIRwd+S"TU	V	V r0   c                 @   g }| dz  dz  }|j                         s|S t        j                         dz
  }|j                         D ]W  }|j                         s|j                  dk(  s$|j                         j                  |k  sB|j                  dd| f       Y |S )u3   ERROR: memory/events/에 90일 초과 .done 파일.memoryeventsi v z.doner&   u-   memory/events/에 90일 초과 .done 파일: )r3   r<   r'   r(   suffixr>   r?   r+   )r#   r,   
events_dirrA   r-   s        r.   check_memory_events_donerV   ^   s    "$JX%0JYY[:%F""$ a<<>dkkW49M9MPV9Vw*WX\W](^_`a r0   c                     t        j                  |       }|j                  dz  }|j                  dz  }|j                  dz  }d|dd|dd|dd}d|fgS )u!   INFO: 디스크 사용량 요약.i   @u   디스크 사용량: z.1fzGB / u   GB (여유: zGB)rG   )shutil
disk_usagetotalusedfree)r#   usagetotal_gbused_gbfree_gbmsgs         r.   check_disk_usagerb   k   sj    i(E{{Y&Hjj9$Gjj9$G!'#eHS>gVY]Z]
^CSM?r0         )r&   r2   rG   r,   c                     t        | d       S )Nc                 4    t         j                  | d   d      S )Nr   	   )_ORDERget)vs    r.   <lambda>z!sort_violations.<locals>.<lambda>}   s    FJJqtQ,? r0   )key)sortedr,   s    r.   sort_violationsro   |   s    *"?@@r0   c                 .    t        d | D              rdS dS )Nc              3   ,   K   | ]  \  }}|d k(    yw)r&   N ).0sev_s      r.   	<genexpr>z$compute_exit_code.<locals>.<genexpr>   s     <vsAC7N<s   rc   r   )anyrn   s    r.   compute_exit_coderx      s    <<<1C!Cr0   c                     t        j                  d      } | j                  dt        j                  j                  dd      d       | j                         }t        |j                        }g }|t        |      z  }|t        |      z  }|t        |      z  }|t        |      z  }|t        |      z  }|t        |      z  }t        |      }|D ]  \  }}t!        d| d	|         t#        t%        |            )
Nu%   workspace 구조 규칙 위반 감지)descriptionz--workspaceWORKSPACE_ROOTz/home/jay/workspaceuO   workspace 루트 경로 (기본값: $WORKSPACE_ROOT 또는 /home/jay/workspace))defaulthelp[z] )argparseArgumentParseradd_argumentosenvironri   
parse_argsr   r#   r/   r8   rB   rP   rV   rb   ro   print
SystemExitrx   )parserargsr#   all_violationssorted_vrt   ra   s          r.   mainr      s   $$1XYF


/1FG^  
 DT^^$I&(N/	::N))44N))44N))44N.y99N&y11N~.H  S#b  &x0
11r0   __main__)r$   N)__doc__r   r   rX   r<   pathlibr   typingr   r   str	Violationr*   r5   rH   r/   r8   rB   rP   rV   rb   rh   ro   intrx   r   __name__rr   r0   r.   <module>r      s'   M  	    #s(O	
  
 ,	 $y/ 4 DO *
4 
DO 
4 DO 
 
i 
 i  A	.AY ADO AD$y/ Dc D22 zF r0   