
    SiF                        U d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 i Z
ded<   dddZddd	Zdd
ZddZddZdddZdddZdddZdd dZdd dZdd dZdd dZdd dZdd dZdd!dZdddZy)"u   organization-structure.json에서 팀/봇 매핑을 동적으로 로드하는 유틸리티.

팀 추가/삭제 시 코드 수정 없이 이 파일을 통해 모든 매핑이 자동 갱신됩니다.
    )annotationsN)Path)Optionalzdict[str, dict]_CACHEc                J    | xs  t         j                  j                  dd      S )NWORKSPACE_ROOTz/home/jay/workspace)osenvironget)workspace_roots    A/home/jay/workspace/.worktrees/task-2117-dev1/utils/org_loader.py_get_workspace_rootr      s    TRZZ^^,<>STT    c                    t        |       }|t        v r	t        |   S t        |      dz  dz  }	 t        j                  |j                  d            }|t        |<   |S # t        $ r i t        |<   i cY S w xY w)uO   organization-structure.json 로드 (캐시 포함). 실패 시 빈 dict 반환.memoryzorganization-structure.jsonzutf-8)encoding)r   r   r   jsonloads	read_text	Exception)r   rootpathdatas       r   	_load_orgr      sz    ~.Dv~d|: #@@Dzz$..'.:;t t	s   /A A65A6c                 ,    t         j                          y)u   캐시를 초기화한다.N)r   clear r   r   invalidate_cacher   $   s    
LLNr   c                    | j                  di       j                  di       j                  dg       }|D ]  }|j                  d      dk(  s|c S  i S )N	structurecolumnsteamsteam_iddevelopment-office)r   )r   r"   teams      r   _get_dev_officer&   )   sY    HH["%)))R8<<WbIE 88I"66K Ir   c                0    t        t        d      | z         S )u4   0-based index → bot letter (0→'b', 1→'c', ...)b)chrord)indexs    r   _bot_letterr,   1   s    s3x%  r   c                N    t        |       }t        |      j                  dg       S )uH   development-office의 sub_teams 목록 반환. 실패 시 빈 리스트.	sub_teams)r   r&   r   )r   r   s     r   get_dev_teamsr/   6   s$    ^$D4 $$["55r   c                D    t        |       D cg c]  }|d   	 c}S c c}w )z["dev1-team", "dev2-team", ...]sub_team_id)r/   )r   ts     r   get_dev_team_idsr3   <   s     &3N&CDAmDDDs   c                ^    t        |       D cg c]  }|j                  dd       c}S c c}w )z["dev1", "dev2", ...]-team r3   replacer   tids     r   get_dev_short_idsr;   A   s&    0@0PQCKK$QQQs   *c                `    t        |       D ci c]  }||j                  dd       c}S c c}w )z/{"dev1-team": "dev1", "dev2-team": "dev2", ...}r5   r6   r7   r9   s     r   build_team_bot_mapr=   F   s+    5En5UVcCWb))VVVs   +c                    i }t        t        |             D ]+  \  }}|d   j                  dd      }||dt        |       <   - |S )uJ   {"bot-b": "dev1", "bot-c": "dev2", ...}  (dev1→bot-b, dev2→bot-c, ...)r1   r5   r6   bot-)	enumerater/   r8   r,   )r   resultir%   shorts        r   build_bot_to_key_maprD   K   sX    F]>:; 04]#++GR8*/k!n%&'0 Mr   c                j    i }t        t        |             D ]  \  }}dt        |       ||d   <    |S )z1{"dev1-team": "bot-b", "dev2-team": "bot-c", ...}r?   r1   )r@   r/   r,   )r   rA   rB   r%   s       r   build_team_to_bot_id_maprF   T   sD    F]>:; >4(,[^,<&=tM"#>Mr   c                    i }t        t        |             D ]O  \  }}|d   j                  dd      }|j                  d|      }dt	        |      j                          d| d||<   Q |S )u?   {"dev1": "봇B (개발1팀)", "dev2": "봇C (개발2팀)", ...}r1   r5   r6   sub_team_nameu   봇z ())r@   r/   r8   r   r,   upper)r   rA   rB   r%   rC   names         r   build_bot_labelsrL   \   sz    F]>:; @4]#++GR8xx/k!n2245RvQ?u@ Mr   c                    i }t        |       D ]G  }|d   }|j                  dd      }|rt        j                  dd|      n|j	                  dd      ||<   I |S )uF   {"dev1-team": "1팀", "dev2-team": "2팀", ...}  (개발N팀 → N팀)r1   rH   r6   u   ^개발r5   )r/   r   resubr8   )r   rA   r%   r:   rK   s        r   build_short_labelsrP   f   sd    Fn- Y=!xx,6:bffZT2GUW@XsY Mr   c           	     l    t        |       D ci c]  }|d   |j                  d|d          c}S c c}w )u;   {"dev1-team": "개발1팀", "dev2-team": "개발2팀", ...}r1   rH   )r/   r   )r   r%   s     r   build_full_labelsrR   p   sC     YfftXuPT]TXXotM7JKK  s    1c                L    t        |       D ci c]  }|| }}d|d<   |S c c}w )z"{"dev1": "dev1", ..., "anu": None}Nanu)r;   )r   srA   s      r   build_bot_team_maprV   w   s2    6G6W'X1'XF'XF5MM (Ys   
!c                8   t        |       }|j                  di       j                  di       j                  dg       }g }|D ]U  }|j                  d      }|dk(  r)|j                  d |j                  dg       D               B|sE|j                  |       W |S )u8   모든 팀 ID (dev + marketing, consulting, ...) 반환.r    r!   r"   r#   r$   c              3  &   K   | ]	  }|d      yw)r1   Nr   ).0rO   s     r   	<genexpr>z#get_all_team_ids.<locals>.<genexpr>   s     R#m,Rs   r.   )r   r   extendappend)r   r   r"   rA   r%   r:   s         r   get_all_team_idsr]   ~   s    ^$DHH["%)))R8<<WbIEF hhy!&&MMRb8QRRMM# Mr   )N)r   
str | Nonereturnstr)r   r^   r_   dict)r_   None)r   ra   r_   ra   )r+   intr_   r`   )r   r^   r_   z
list[dict])r   r^   r_   z	list[str])r   r^   r_   zdict[str, str])r   r^   r_   zdict[str, Optional[str]])__doc__
__future__r   r   r	   rN   pathlibr   typingr   r   __annotations__r   r   r   r&   r,   r/   r3   r;   r=   rD   rF   rL   rP   rR   rV   r]   r   r   r   <module>ri      s|   
 #  	 	   U
!
6E
R
W
r   