
    Ni"                     t   d Z ddlZddlZddlmZ ddlmZ  ee      j                  Z	 G d d      Z
defdZed	k(  r{ddlZ eej                         d
k(  r*ej                   d   dk(  r ej"                   e              y edej                   d    dej&                          ej"                  d       yy)uO   Config 통합 로더 — 모든 모듈이 이 로더를 통해 config에 접근    N)Path)Anyc                       e Zd ZdZdZedd       Zedd       ZddZde	de
fdZd	e	de	fd
Zd	e	defdZde	dee	   fdZddZde
d	e	defdZy)ConfigManageru5   싱글톤 Config 매니저. get_instance()로 접근.Nreturnc                 J    | j                    |        | _         | j                   S )N	_instanceclss    >/home/jay/workspace/.worktrees/task-2117-dev1/config/loader.pyget_instancezConfigManager.get_instance   s    == ECM}}    c                     d| _         y)u.   테스트용: 싱글톤 인스턴스 초기화Nr	   r   s    r   resetzConfigManager.reset   s     r   c                     | j                  d      | _        | j                  d      | _        | j                  d      | _        | j                  d      | _        y )N
paths.jsonconstants.jsondesign-system.jsonmodule-registry.json_loadpaths	constantsdesignregistryselfs    r   __init__zConfigManager.__init__   sE    ::l3
#zz*:; JJ';<"jj)?@r   filenamec                     t         |z  }t        |d      5 }t        j                  |      cd d d        S # 1 sw Y   y xY w)Nutf-8encoding)
CONFIG_DIRopenjsonload)r   r    filepathfs       r   r   zConfigManager._load!   s8    ((W- 	 99Q<	  	  	 s   6?keyc                 :    | j                  | j                  |      S )u   paths.json에서 경로 조회.

        Args:
            key: 'roots.workspace', 'memory_dirs.tasks' 등 dot notation 지원

        Returns:
            경로 문자열

        Raises:
            KeyError: 키가 존재하지 않을 때
        )_resolve_dottedr   )r   r+   s     r   get_pathzConfigManager.get_path&   s     ##DJJ44r   c                     | j                  | j                  |      }t        |t              rH|j	                  d      r7|dd }t
        j                  j                  |      }|t        d| d      |S |S )u   constants.json에서 상수 조회.

        Args:
            key: 'chat_id', 'teams.dev1-team', 'thresholds.idle_hours' 등

        Returns:
            상수 값

        Raises:
            KeyError: 키가 존재하지 않을 때
        $   Nu   환경변수 u    가 설정되지 않았습니다)	r-   r   
isinstancestr
startswithosenvirongetEnvironmentError)r   r+   valueenv_var	env_values        r   get_constantzConfigManager.get_constant4   st     $$T^^S9eS!e&6&6s&;ABiG

w/I &wi?_'`aar   	source_idc                 z    | j                   j                  di       j                  |i       j                  dg       S )u   registry에서 해당 값 사용 파일 목록 반환.

        Args:
            source_id: 'chat_id', 'workspace_root' 등

        Returns:
            사용 파일 경로 목록 (없으면 빈 리스트)
        sourcesused_by)r   r7   )r   r=   s     r   get_dependentszConfigManager.get_dependentsJ   s6     }}  B/33IrBFFyRTUUr   c                     | j                  d      | _        | j                  d      | _        | j                  d      | _        | j                  d      | _        y)u(   config 파일 재로딩 (캐시 갱신).r   r   r   r   Nr   r   s    r   reloadzConfigManager.reloadU   sE    ZZ-
$45jj!56

#9:r   datac                     |j                  d      }|}|D ]?  }t        |t              st        d| d| d      ||vrt        d| d| d      ||   }A |S )u+   dot notation 키를 재귀적으로 해석..'u   ' 경로 중 'u!   '에서 dict가 아닌 값 발견u   키 'u   '를 찾을 수 없습니다 ('u	   ' 없음))splitr2   dictKeyError)r   rD   r+   partscurrentparts         r   r-   zConfigManager._resolve_dotted\   s|    		# 	$Dgt,3%~dV;\]^^7"se+J4&PYZ[[dmG	$ r   )r   r   )r   N)__name__
__module____qualname____doc__r
   classmethodr   r   r   r3   rI   r   r.   r   r<   listrA   rC   r-    r   r   r   r      s    ?I 
  A c  d  
5C 5C 5  ,	V 	VS	 	V;
D 
s 
s 
r   r   r   c                     t        t              j                  j                  } | dz  dz  }t        dz  }|j	                         st        d|        yt        |d      5 }t        j                  |      }ddd       t        |d      5 }t        j                  |      }ddd       j                  d	i       }|j                  d
i       }g }j                         D ]  \  }	}
|
j                  dd      }|s|j                  d      }t        |      dk\  r2|d   j                  d      r|d   dd j                         r|d   }d}nd}d}||vr|j                  d| d| d       |s| d}||vs|j                  d| d        |r|D ]  }t        |        yt        d       y# 1 sw Y   <xY w# 1 sw Y   xY w)u   bot_settings_sync.json과 constants.json의 봇 정보 일치 여부를 확인한다.

    Returns:
        0 if all bots and teams match, 1 if mismatches found.
    memoryzbot_settings_sync.jsonr   u(   WARNING: bot_settings_sync.json 없음: r1   r"   r#   Nbotsteamsdisplay_name _   r   devTanuFzWARNING: bot 'z' (z) not in constants.json[bots]z-teamzWARNING: team 'z' not in constants.json[teams]u3   OK: bot_settings_sync.json과 constants.json 일치)r   __file__parentr%   existsprintr&   r'   r(   r7   itemsrH   lenr4   isdigitappend)workspace_root	sync_pathconstants_pathr*   	sync_datar   bots_cfg	teams_cfg
mismatchesr[   cfgrY   rK   bot_short_id
is_dev_botteam_idmsgs                    r   _sync_checkrs   i   s    (^**11N),DDI"22N8DE	i'	* 'a))A,	' 
nw	/ '1))A,	' ]]62.HmmGR0IJ//# 3GGNB7""3'u:?uQx2259eAhqrl>R>R>T 8LJ LJx' c,?\] %e,Gi'!!%gY.LM+2  	C#J		
?@U' '' 's   !F1F>1F;>G__main__   r1   z
sync-checkzUsage: python3 z sync-check)file)rQ   r'   r5   pathlibr   typingr   r_   r`   r%   r   intrs   rN   sysrd   argvexitrb   stderrrT   r   r   <module>r~      s    U  	  (^""
[ [|8S 8v z
388}chhqk\9}K8szzJ r   