
    (<it?                         d Z ddlZddlZddlmZ  ed      Zedz  Zedz  Zedz  Zdd	hZ	h d
Z
dhZdedeeef   fdZdedeeef   fdZdedeeef   fdZdedeeef   fdZd Zedk(  r e        yy)u   
organization-structure.json 최적화 스크립트
작성자: 엔키 (Enki) - 개발5팀 백엔드 개발자
목적: 메인 파일을 Read tool 25,000 토큰 제한 이하로 축소
    N)Pathz/home/jay/workspace/memoryorganization-structure.jsonzorg-details"organization-structure.backup.jsonprimarystyle>   idnamenoterolemodelcallerenginestatuspersona	expertise	specialtyinvoker   returnc                     t        | t              si i fS i }i }| j                         D ]  \  }}|t        v r|||<   |||<    ||fS )u   
    expertise 딕셔너리에서 primary, style만 유지하고 나머지를 분리.
    Returns: (pruned_expertise, removed_fields)
    )
isinstancedictitemsEXPERTISE_KEEP)r   prunedremovedkeyvals        H/home/jay/workspace/.worktrees/task-2057-dev2/teams/dev5/optimize_org.pyprune_expertiser      sa    
 i&2vFGOO% S. F3KGCL	 7?    memberc                     i }i }d| v r| d   |d<   | j                         D ]P  \  }}|t        v r|dk(  r/t        |t              rt	        |      \  }}||d<   ||d<   =||d<   C|t
        v sL|||<   R ||fS )u`   
    멤버 객체에서 필요 필드만 유지.
    Returns: (pruned_member, detail_data)
    r   r   expertise_full)r   MEMBER_REMOVEr   r   r   MEMBER_KEEP)r!   r   detailr   r   
pruned_exp_s          r   prune_memberr)   1   s    
 FF 6!(+xLLN S-+#t$ / 4
A&0{#+.'(&){#KF3K 6>r    membersc                     g }i }| D ];  }|j                  dd      }t        |      \  }}|j                  |       |s7|||<   = ||fS )uW   
    팀 멤버 목록 처리. 축약된 멤버 목록과 상세 데이터 반환.
    r   unknown)getr)   append)r*   pruned_membersmembers_detailr!   	member_idr   r&   s          r   process_team_membersr2   O   sc     NN /JJtY/	%f-f%(.N9%/ >))r    leadc                 R    | rt        | t              s| i fS t        |       \  }}||fS )uV   
    팀장 객체 처리. 축약된 팀장 데이터와 상세 데이터 반환.
    )r   r   r)   )r3   r   r&   s      r   process_leadr5   `   s3     z$-Rx "$'NFF6>r    c            
      $  :; t        d       t        d       t        d       t        dt                t        t        dd      5 } t        j                  |       }d d d        t        j                         j                  }t        d|dd	       t        j                  d
d
       t        dt                t        j                  t        t               t        dt        j                         j                  dd	       t        d       d   d   d   }t        |      D ]  \  }}|j                  dd|       }i }t        d|        |dk(  rt        |j                  dg             D ]  \  }}	|	j                  dd|       }
d|	v r1|	d   }|j                  dd      }t        |      \  }}||	d<   |r|||<   d|	v r't        |	d         \  }}||	d<   |j!                  |       d|
 d|	d<    d |v rE|d    }t#        |t$              r0d|v r,|j                  dd      }t        |      \  }}||d <   |r|||<   d!|v rE|d!   }t#        |t$              r0d|v r,|j                  dd      }t        |      \  }}||d!<   |r|||<   t        | dz  }|d"|d#}t        |d$d      5 } t        j&                  || d%d&'       d d d        t        d(|j(                   d)|j                         j                  dd*       d| d|d<   d|v rE|d   }t#        |t$              r0d+|v r,|j                  dd      }t        |      \  }}||d<   |r|||<   d|v r't        |d         \  }}||d<   |j!                  |       t        | dz  }|d"|d#}t        |d$d      5 } t        j&                  || d%d&'       d d d        t        d(|j(                   d)|j                         j                  dd*       d| d|d<    t        d,       |d   d-   d.   }|D ]  }|j                  d/d      }i }d|v rE|d   }t#        |t$              r0d+|v r,|j                  dd      }t        |      \  }}||d<   |r|||<   d|v r't        |d         \  }}||d<   |j!                  |       t        | dz  }|d"|d#}t        |d$d      5 } t        j&                  || d%d&'       d d d        t        d0|j(                   d)|j                         j                  dd*       d| d|d<    t        d1t                t        t        d$d      5 } t        j&                  || d%d&'       d d d        t        d2       	 d3d l}|j,                  j/                  d3t1        t3        d4                   d3d5lm}  |t        t        t        6      }|D ]M  }t3        |      j(                  } t3        |      j                         j                  }!t        d0|  d)|!dd*       O t        d7t9        |       d8       t        d<       t        d=       t        d       t        j                         j                  }#d>|#|z  z
  d?z  }$|#d@z  }%t        t        dd      5 } | j?                         }&d d d        t9        &      }'t        dA       t        dB|dd	       t        dC|#dd	       t        dD|$dEdF       t        dG|'ddH       t        dI|%dJdK       t        dL|%dMk  rdNndO        t        dP       	 t        t        dd      5 } t        j                  |       }(d d d        t        dQ       t        dS       tC        dT (d   d   d   D        d       })	 |)d   d3   d   d3   d+   dU   }*t        dV|* dW       	 |(d   d-   d.   d3   d   d+   dU   }*t        dY|* dW       t        d[       |)r|)d   d3   d   ng }+|+d d& D ]=  },d+|,v stK        |,d+         jL                  }-t        d\|,d    d]|- d^|-d_k(  rd`nda        ? t        db       d3;:;fdc: :|(       t        dd; de;d3k(  rd`nda        t        df       |(d   d   d   D ]u  }|j                  ddg      }.|.dk(  rC|j                  dg       D ]-  }/|/j                  ddg      }0d|/v }1t        dh|0 di|1rd`nda        / ]d|v }1t        dj|. di|1rd`nda        w |(d   d-   d.   D ]-  }|j                  d/dg      }2d|v }1t        dk|2 di|1rd`nda        / t        dl       tO        t        jQ                  dm            }3g }4g }5|3D ]  }6|6j(                  dnk(  r|6j                         j                  }7t        d\|6j(                   do|7dd	       |6jR                  jU                  dp      r!|6jR                  dk7  r|5jW                  |6       |4jW                  |6        t        dqt9        |4              t        drt9        |5              t        ds       |(d   d   d   D ]q  }|j                  d      dk(  s|j                  dg       D ]E  }/|/j                  ddg      }0t        |0 dz  }8|8jY                         }9t        dt|0 du|9rd`ndv        G s t        d<       t        dw       t        d       y # 1 sw Y   
xY w# 1 sw Y   +xY w# 1 sw Y   BxY w# 1 sw Y   (xY w# 1 sw Y   xY w# t:        $ r}"t        d9|" d:       Y d }"~"
d }"~"wt<        $ r}"t        d;|"        Y d }"~"*d }"~"ww xY w# 1 sw Y   xY w# 1 sw Y   xY w# t        j@                  $ r}"t        dR|"        Y d }"~"y d }"~"ww xY w# tD        tF        tH        f$ r}"t        dX|"        Y d }"~"d }"~"ww xY w# tD        tF        tH        f$ r}"t        dZ|"        Y d }"~"$d }"~"ww xY w)xNz<============================================================u,   organization-structure.json 최적화 시작u   
[1] 원본 파일 로드: rzutf-8)encodingu       원본 크기: ,z bytesT)parentsexist_oku   
[2] 백업 생성: u       백업 완료: u9   
[3] 팀별 상세 파일 생성 및 메인 파일 축약	structurecolumnsteamsteam_idzteam-u   
  처리 중: development-office	sub_teamssub_team_idzsub-r3   r   r,   r*   zmemory/org-details/z.jsondetail_pathoffice_leaddirect_workerr   )r?   extracted_fromr0   wF   )ensure_asciiindentu       -> 상세 파일 생성: z (z bytes)r   u   
  센터 처리:rowscenters	center_idz    -> u&   
[4] 메인 파일 저장 (in-place): u'   
[5] 팀별 개별 상세 파일 생성r   z /home/jay/workspace/teams/shared)generate_all_sub_team_details)org_filebackup_file
output_diru       총 u&   개 개별 상세 파일 생성 완료u)       경고: 공통 모듈 로드 실패 (u"   ). 개별 상세 파일 미생성.u0       에러: 개별 상세 파일 생성 실패: z=
============================================================u   검증 결과   d   g	@u   
파일 크기:u     원본:   u     최적화: u     감소율: z.1f%u
   
줄 수: u    줄u   추정 토큰 수: z,.0fu    tokens (문자수/3.2)u   목표 (25,000): ia  u   달성u	   미달성u   
[검증 1] JSON 유효성:u     OK - JSON 파싱 성공u     FAIL - JSON 파싱 실패: u+   
[검증 2] 핵심 필드 접근 테스트:c              3   J   K   | ]  }|j                  d       dk(  s|  yw)r?   r@   N)r-   ).0ts     r   	<genexpr>zmain.<locals>.<genexpr>G  s%     {QRSRWRWXaRbfzRzq{s   ##r   zG  OK - development-office.sub_teams[0].members[0].expertise.primary = ''zG  FAIL - development-office.sub_teams[0].members[0].expertise.primary: z,  OK - centers[0].lead.expertise.primary = 'z,  FAIL - centers[0].lead.expertise.primary: u7   
[검증 3] expertise 타입 확인 (객체여야 함):z  u   .expertise 타입:  r   OKFAILu(   
[검증 4] invoke 필드 제거 확인:c                     t        | t              r'd| v rdz  | j                         D ]
  } |        y t        | t              r| D ]
  } |        y y )Nr   rR   )r   r   valueslist)objvitemcount_invokeinvoke_counts      r   rc   zmain.<locals>.count_invoke`  s`    c4 3!ZZ\  Q T" #T"# #r    u'     메인 파일 내 invoke 필드 수: u    (0이어야 함) u&   
[검증 5] detail_path 추가 확인:?z  sub_team z: detail_path z  team z	  center uF   
[검증 6] 생성된 상세 파일 및 개별 sub-team 파일 확인:z*.jsonr   z: devu   
  집계 팀 파일 수: u     개별 sub-team 파일 수: u(   
  개별 sub-team 파일 존재 확인:z    z.json: u   FAIL (없음)u   최적화 완료!)-printORG_FILEopenjsonloadstatst_size
DETAIL_DIRmkdirBACKUP_FILEshutilcopy2	enumerater-   r5   r2   updater   r   dumpr	   syspathinsertstrr   generate_org_detailsrN   lenImportError	Exception	readlinesJSONDecodeErrornextKeyError
IndexError	TypeErrortype__name__sortedglobstem
startswithr.   exists)<fdata	orig_sizer>   team_idxteamr?   team_members_detailsub_idxsub_teamsub_id	lead_origlead_idpruned_leadlead_detailr/   
sub_detaildwdw_id	pruned_dw	dw_detaildetail_filedetail_data
mem_detailrL   centerrM   center_members_detailrv   rN   	generatedfpfnamefsizeenew_size	reductionestimated_tokenslines
line_countverify_data
dev_officer   dev_membersmexp_typetidsubsidhas_dpciddetail_filesaggregate_filessubteam_filesdfsizeexpectedr   rc   rd   s<                                                             @@r   mainr   l   s_   	(O	
89	(O 
(

34	hg	. !yy| ''I		!}F
34 TD1	!+
/0
LL;'	 0 0 2 : :1=V
DE 

FGi(1E#E* ]G$((9hZ&89  	*+**%.txxR/H%I N!!mtG95EF X% ( 0I'mmD)<G/;I/F,K'2HV$"7B+G4 (1EhyFY1Z.NJ*8HY''..z: -@xu*M''N, $ /	i.493D'mmD)<G/;I/F,K*5D'"7B+G4$&/*b$'DBJFF43E+7+;(Iy,5D) 5>+E2 %'%'88K""?"5K
 k39 HQ		+quQGH1+2B2B1C2kFVFVFXF`F`abEccjkl %8y"FD ~ L	i.;)3K'mmD)<G/;I/F,K#.DL"7B+G4 D -A$y/-R*
"0Y#**:6 %'%'88K""?"5K
 k39 HQ		+quQGH1+2B2B1C2kFVFVFXF`F`abEccjkl %8y"FD{]G@ 

;'	2G  GJJ{I6	 " VvI)T*{i/G#--i8+7	+B([!,v5@)'2 )=fY>O)P&NJ .F9!((4 !i[#66 ;3

 +sW5 	DIIk15C	D(()K,<,<,>,F,Fq+IQR #6i[ F}A GF 
3H:
>?	hg	. 9!		$a89 

45F3t$FGHIF1#!
	
  	7BHMMEHMMO++EGE7"U1IW56	7 	Y((NOP 
/	/	(O}}&&HX	))S0I#~ 
hg	. !UJ		L1V
,-	M(1V
,-	M)C
*+	K
1~T
*+	 066M
NO	*:e*ChU
VW 

()(C'2 	'a))A,K	')* 

89 {+k":9"Eg"N{  ~B  CJ]%a(3A6{CINWX[W\\]^_
B+&v.y9!<VD[QR[\<SECD
 

DE;E*[)!,Y72K!_ h!AkN+44HBqwi28*AhRXFXd^d=efgh 

56L	# 	3L>AS\hlm\mTXsySz
{| 

34K(3G< 	Mhhy#&&&xxR0 UggmS1&#-C5vt66RSTU
 #d*FGC5vt6.JKL	M k*629= Kjjc*&(	#nVT,HIJK 

ST*//(34LOM 	'77::wwy  277)2d1XV,-77e$4H)H  $""2&	' 
'O(<'=
>?	*3}+=*>
?@ 

56K(3G< P88I"66xxR0 PggmS1%3%u5!*SE_(MNO	PP 
/	
	(OW	 PH HBH HJ	D 	D9 9(  a9!<^_`` F@DEEF 	' 	'  -aS12 j), ]WXYWZ[\\] j), B<QC@AABs   k#-k0#k=
l
l?B9l$ m*9n m7!n #n2  &o" #k-0k:	=l	
l	l!$	m'-mm'm""m'*m47n<n n/n**n/2ooo"p6p

p__main__)__doc__rj   rq   pathlibr   
MEMORY_DIRrh   rn   rp   r   r%   r$   objecttupler   r   r)   r_   r2   r5   r   r    r    r   <module>r      s       ./
55-'
?? W%; 
v %d
*; ( %d
"3 <*$ *5t+< *"	t 	dDj 1 	rj	 zF r    