
    Ri$              	          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 ddlmZ g dZ	e
e   ed<   g dZe
e   ed	<   d
edefdZdededefdZd
ed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ede
e   fdZdede
e   fdZdededeee
e   f   fdZdedededdfdZdede
e   ddfdZdededeeef   fdZdededdfdZ d"d Z!e"d!k(  r e!        yy)#u,  cleanup-workspace.py — 워크스페이스 파일 자동 정리 스크립트.

사용법:
  python3 cleanup-workspace.py --dry-run    # 삭제 후보 출력 (기본)
  python3 cleanup-workspace.py --execute    # 실제 삭제
  python3 cleanup-workspace.py --report     # 디스크 사용량 보고
    N)datetime)Path)Any)z	CLAUDE.mdz	MEMORY.mdz.envz	.env.keyszorganization-structure.jsonztask-timers.jsonztoken-ledger.jsonPROTECTED_NAMES)zmemory/reportszmemory/researchzmemory/specszmemory/meetingszmemory/plansPROTECTED_DIRSpreturnc                     t        j                         j                         | j                         j                  z
  dz  S )NiQ )r   now	timestampstatst_mtimer   s    J/home/jay/workspace/.worktrees/task-2117-dev1/scripts/cleanup-workspace.py_ager      s-    LLN$$&):)::eCC    path	workspacec                     | j                   t        v ry	 | j                  |      j                         t        fdt        D              S # t        $ r Y yw xY w)NTFc              3   T   K   | ]  }|k(  xs j                  |d z          ! yw)/N)
startswith).0drels     r   	<genexpr>zis_protected.<locals>.<genexpr>$   s*     Kqsax23>>!c'22Ks   %()namer   relative_toas_posix
ValueErroranyr   )r   r   r   s     @r   is_protectedr"      sW    yyO#y)224 KNKKK  s   A 	AAc                     | j                         r!t        d | j                  d      D              S 	 | j                         j                  S # t
        $ r Y yw xY w)Nc              3   r   K   | ]/  }|j                         s|j                         j                   1 y wN)is_filer   st_size)r   fs     r   r   z_size.<locals>.<genexpr>)   s$     IQYY[1668##Is   77*r   )is_dirsumrglobr   r'   OSErrorr   s    r   _sizer.   '   sM    xxzIQWWS\IIIvvx s   A 	AAc                     | dz  }|j                         rP|j                  d      D cg c]5  }|j                         s|j                         s%t        |      dkD  s4|7 c}S g S c c}w )Ntmpr)      existsr,   r&   r   r   r   r(   s      r   find_tmp_candidatesr5   0   sT    EAVWV^V^V`qwws|R!qxxzaiikd1gPQkARhfhhRs   A(A(A(A(c                 $   | dz  dz  }|j                         sg S |j                         D cg c]X  }|j                         rF|j                  j	                  d      s|j                  j	                  d      rt        |      dkD  r|Z c}S c c}w )Nmemoryeventsz.done.clearz.done.acked   )r3   iterdirr&   r   endswithr   r4   s      r   find_events_candidatesr<   5   sw    Hx'A88:	yy{ !yy{ >!&&//R_B`Q"       ABc                 $   | dz  dz  }|j                         sg S |j                         D cg c]X  }|j                         rF|j                  j	                  d      r+|j                  j                  d      rt        |      dkD  r|Z c}S c c}w )Nr7   tasksz	dispatch-z.mdZ   )r3   r:   r&   r   r   r;   r   r4   s      r   find_dispatch_candidatesrA   >   sy    Hw&A88:	yy{ !yy{qvv00=!&&//RWBXQ"    r=   c                     | dz  }|j                         sg S |j                  d      D cg c]=  }|j                         r+|j                  j	                  d      st        |      dkD  r|? c}S c c}w )Nlogsr)   cleanup-<   )r3   r,   r&   r   r   r   r4   s      r   find_logs_candidatesrF   G   si    FA88:	wws| S!yy{166#4#4Z#@T!Wr\  S S Ss   AA0c                     | dz  dz  }|j                         rP|j                  d      D cg c]5  }|j                         s|j                         s%t        |      dkD  s4|7 c}S g S c c}w )Nr7   backupsr)   r@   r2   r4   s      r   find_backups_candidatesrI   O   sY    Hy(AWXW_W_Waqwws|S!qxxzaiikd1gPRlASigiiSs   A+A+A+"A+c           	      t   | dz  }| dz  dz  }|j                         sg S g }|j                  d      D ]  }|j                  d      D ]l  }|j                         rt        |      dk  r"|j                         s3t	        |j                  d|j
                   d            s\|j                  |       n  |S )Nteamsr7   reportszdev*ztask-*r9   r)   )r3   globr*   r   r!   r   append)r   	teams_dirreports_dirresultteamtask_dirs         r   find_team_task_candidatesrT   T   s    G#Ih&2K	Fv& (		(+ 	(H??$X"(<!!#K,<,<qq=Q,R(Sh'		(( Mr   cokacdir_wsc                     | j                         sg S | j                         D cg c]I  }|j                         s|j                  d      D ]"  }|j	                         rt        |      dkD  r|$ K c}}S c c}}w )Nr)   r9   )r3   r:   r*   r,   r&   r   )rU   projr(   s      r   find_cokacdir_candidatesrX   c   su    	%--/ F$4;;=ZZ_F		Q"  FA F F Fs
   A88A8c           	          t        |       t        |       t        |       t        |       t	        |       t        |       t        |      dS )N)r0   r8   dispatchrC   rH   
team_taskscokacdir)r5   r<   rA   rF   rI   rT   rX   )r   rU   s     r   _all_candidatesr]   j   sD    "9-(3,Y7$Y/*95/	:,[9 r   dry_runc           	         t        | |      }|j                         D cg c]  }|D ]  }t        ||       r|  }}}|rdnd}g }d}	|D ]q  }| d| dt        |      dd}
t	        |
       |j                  |
       |r7	 |j                         rt        j                  |      n|j                          |	dz  }	s |s(t        | |       t	        d|	 dt        |       d       y t	        dt        |       d       y c c}}w # t        $ r.}d	| d
| }t	        |       |j                  |       Y d }~d }~ww xY w)Nz	[DRY-RUN]z[DELETE]r    z  (,z bytes)   z[ERROR] z: u   
삭제 완료: r   u    항목u   
[DRY-RUN] 삭제 후보: u    항목 (실제 삭제 없음))r]   valuesr"   r.   printrN   r*   shutilrmtreeunlinkr-   
_write_loglen)r   r^   rU   catsitemsr   totaltag	log_linesdeletedlineeerrs                r   run_cleanuprs   v   sC   9k2D KKM[55[aQPY@ZQ[Q[E[ +jCIG 
2as#eAhq\1d2$%HHJa AHHJ1
2 9i(!'!CJ<w?@+CJ<7UVW' \  2 2aS)c
I,,S112s"   DD:D			E $D;;E linesc                 ~   | dz  }|j                  dd       |dt        j                         j                  d       dz  }t	        |dd	      5 }|j                  d
t        j                         j                          d       |j                  dj                  |      dz          d d d        y # 1 sw Y   y xY w)NrC   T)parentsexist_okrD   z%Y-%m-%dz.logazutf-8)encodingz
=== cleanup-workspace z ===

)mkdirr   r   strftimeopenwrite	isoformatjoin)r   rt   logs_dirlog_filefhs        r   rh   rh      s    6!HNN4$N/HX\\^%<%<Z%H$INNH	hg	. *"
+HLLN,D,D,F+GvNO
5!D()* * *s   AB33B<c                    t        | |      }i }d\  }}|j                         D ]W  \  }}|D cg c]  }t        ||       r| }	}t        d |	D              }
t	        |	      |
d||<   |t	        |	      z  }||
z  }Y |||dS c c}w )N)r   r   c              3   2   K   | ]  }t        |        y wr%   )r.   )r   r   s     r   r   zbuild_report.<locals>.<genexpr>   s     ,aq,s   )count
size_bytes)total_candidatestotal_size_bytes
categories)r]   rk   r"   r+   ri   )r   rU   rj   cat_infototal_ntotal_szcatrk   r   filteredszs              r   build_reportr      s    9k2D*,HGXjjl 1
U$G!LI,FAGG,8,,"%h-rB3x= (b.(	1
 !(XU]^^	 Hs   B Bc           
      J   t        | |      }t        d       t        d|         t        d       |d   j                         D ]&  \  }}t        d|dd|d   dd	|d
   dz  dd       ( t        d       t        dddd|d   dd	|d   dz  dd       t        d       y )Nz<============================================================u2     워크스페이스 정리 보고서  |  기준: r   z  z<15r`   r   z>5u   개   r   i   z>8.2fz MBz<------------------------------------------------------------u   합계r   r   u    MB 정리 가능)r   rd   rk   )r   rU   datar   infos        r   print_reportr      s    	;/D	(O	>yk
JK	(O,'--/ \	T3s)1T']2.fT,5G5OPU4VVYZ[\	(O	BxnAd#56r:&FXAYZaAabg@hhy
z{	(Or   c            
      8   t        j                  d      } | j                         }|j                  dddd       |j                  ddd	
       |j                  ddd
       | j                  dt        t	        t
        j                  j                  dd                   | j                         }|j                  }t	        j                         dz  dz  }|j                  rt        ||       y |j                  rt        |d|       y t        |d|       y )Nu'   워크스페이스 파일 자동 정리)descriptionz	--dry-run
store_trueTu    삭제 후보 출력 (기본값))actiondefaulthelpz	--executeu   실제 삭제)r   r   z--reportu   디스크 사용량 보고z--workspaceWORKSPACE_ROOTz/home/jay/workspace)typer   z	.cokacdirr   F)r   r^   rU   )argparseArgumentParseradd_mutually_exclusive_groupadd_argumentr   osenvironget
parse_argsr   homereportr   executers   )parsergargswscokacs        r   mainr      s    $$1Z[F++-ANN;|THjNkNN;|/NJNN:l9UNV
D $RZZ^^4DF[%\ ]  _D~~BIIK+%3E{{R	b%UCb$EBr   __main__)r	   N)#__doc__r   r   re   r   pathlibr   typingr   r   liststr__annotations__r   floatr   boolr"   intr.   r5   r<   rA   rF   rI   rT   rX   dictr]   rs   rh   r   r   r   __name__ r   r   <module>r      s       c S	 DD DU DLt L L LT c i4 iDJ i
d tDz  d SD ST$Z Sjt jT
 j
 $t* F$ F4: F	t 	$ 	4T$Z;P 	X4 X$ XT Xd X0*$ *tCy *T *	_D 	_t 	_S#X 	_	D 	t 	 	C& zF r   