
    i%                     r    d Z ddlZddlZddlmZ ddlmZmZmZ  G d d      Z	d Z
d Zed	k(  r e        yy)
u   
프로젝트별 코드 격리 시스템

Usage:
    python3 memory/project-isolation.py check <team_id> <project_id> <file_path>
    python3 memory/project-isolation.py init
    python3 memory/project-isolation.py status
    N)Path)DictListOptionalc                       e Zd ZdZddefdZdefdZd Zdeded	e	e   fd
Z
dede	e   fdZdede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fdZy)ProjectIsolationu   프로젝트 격리 관리자workspace_pathc                 |    t        |      | _        | j                  dz  dz  | _        | j                         | _        y )Nmemoryzproject-isolation-config.json)r   r	   config_path_load_configconfig)selfr	   s     I/home/jay/workspace/.worktrees/task-2116-dev1/memory/project-isolation.py__init__zProjectIsolation.__init__   s8    ">2..9<[['')    returnc                     | j                   j                         r7t        | j                   dd      5 }t        j                  |      cddd       S i i g d}|S # 1 sw Y   yxY w)u   설정 로드rutf-8encodingN)projectsteamsrules)r   existsopenjsonload)r   fdefault_configs      r   r   zProjectIsolation._load_config   sc     ""$d&&g> $!yy|$ $ +-rBGN!!$ $s   AA#c                     | j                   j                  j                  dd       t        | j                   dd      5 }t	        j
                  | j                  |dd       d	d	d	       y	# 1 sw Y   y	xY w)
u   설정 저장T)parentsexist_okwr   r   F   ensure_asciiindentN)r   parentmkdirr   r   dumpr   )r   r    s     r   _save_configzProjectIsolation._save_config$   sf     	%%dT%B$""C': 	DaIIdkk15C	D 	D 	Ds    $A--A6
project_idproject_pathallowed_teamsc                     ||t        |      j                         r,t        t        |      j                         j                        ndd| j
                  d   |<   | j                          y)u   프로젝트 등록pending)pathr0   
created_atr   N)r   r   strstatst_mtimer   r-   )r   r.   r/   r0   s       r   register_projectz!ProjectIsolation.register_project+   s\     !*EI,EWE^E^E`#d<0557@@Afo/
J
+
 	r   team_idassigned_projectsc                 L    d|i| j                   d   |<   | j                          y)u
   팀 등록r:   r   N)r   r-   )r   r9   r:   s      r   register_teamzProjectIsolation.register_team5   s)     *=>O(PGW%r   	file_pathc                    dd|||d}|| j                   d   vrd| d|d<   |S || j                   d   vrd	| d|d<   |S | j                   d   |   }||d
   vrd| d| d|d<   |S | j                   d   |   }t        |d         }t        |      }|j                         s||z  }t        |      }||d<   	 |j	                  |       d|d<   d|d<   |S # t
        $ r d| d| d|d<   |cY S w xY w)u   접근 권한 체크F )allowedreasonr.   r9   r=   r   u   팀 'u   '이(가) 등록되지 않음rA   r   u   프로젝트 'r:   u   '은(는) 프로젝트 'u   '에 할당되지 않음r3   r=   u   파일 'u   '이(가) 프로젝트 'u   ' 경로 외부Tr@   u   접근 허용)r   r   is_absoluter5   relative_to
ValueError)	r   r9   r.   r=   resultteam_configproject_configr/   target_files	            r   check_accesszProjectIsolation.check_access;   si    #b
W^mvw $++g..!&wi/LMF8M T[[44!/
|;XYF8M kk'*73[)<==!&wi/G
|SklF8M Z0<N6239o &&(&4KK(I"+F;	##L1 !y*x  	!))4LZLXghF8M	s   9C C0/C0c                 R    || j                   d   vrg S | j                   d   |   d   S )u$   팀에 할당된 프로젝트 목록r   r:   r   )r   r9   s     r   get_team_projectsz"ProjectIsolation.get_team_projectsg   s4     $++g..I{{7#G,-@AAr   c                 R    || j                   d   vrg S | j                   d   |   d   S )u$   프로젝트에 할당된 팀 목록r   r0   rK   )r   r.   s     r   get_project_teamsz"ProjectIsolation.get_project_teamso   s3     T[[44I{{:&z2?CCr   c                 z    t        | j                  d         t        | j                  d         | j                  dS )u   현재 상태r   r   )r   r   r   )lenr   )r   s    r   statuszProjectIsolation.statusw   s5      J 783t{{SZG[C\hlhshsttr   N)z/home/jay/workspace)__name__
__module____qualname____doc__r5   r   r   r   r-   r   r8   r<   rI   rL   rN   rQ    r   r   r   r      s    '*s *
	"d 	"D3 c RVWZR[ S T#Y *C *S *S *T *XB Bc BDC DDI Du ur   r   c                  |   t               } | j                  dddg       | j                  dddg       | j                  dd	d
g       | j                  ddg       | j                  ddg       | j                  d
dg       t        d       t        t	        j
                  | j                         dd             y)u   기본 설정 초기화z	project-az/home/jay/workspace/project-az	dev1-team)r.   r/   r0   z	project-bz/home/jay/workspace/project-bz	dev2-teamz	project-cz/home/jay/workspace/project-cz	dev3-teamu"   ✅ 기본 설정 초기화 완료Fr&   r'   N)r   r8   r<   printr   dumpsrQ   )	isolations    r   init_default_configr[   }   s     !"I -L]h\i   -L]h\i   -L]h\i  
 K+7K+7K+7	
./	$**Y%%'eA
FGr   c                     ddl } t        | j                        dk  r=t        d       t        d       t        d       t        d       | j	                  d       | j                  d   }t               }|d	k(  rt                y|d
k(  r0t        t        j                  |j                         dd             y|dk(  rt        | j                        dk  rt        d       | j	                  d       | j                  d   }| j                  d   }| j                  d   }|j                  |||      }t        t        j                  |dd             |d   s| j	                  d       yyt        d|        | j	                  d       y)u   CLI 인터페이스r   Nr&   zUsage:z*  python3 memory/project-isolation.py initz,  python3 memory/project-isolation.py statuszN  python3 memory/project-isolation.py check <team_id> <project_id> <file_path>   initrQ   Fr'   check   u8   Error: team_id, project_id, file_path를 입력하세요      r@   zUnknown command: )sysrP   argvrX   exitr   r[   r   rY   rQ   rI   )rc   commandrZ   r9   r.   r=   rE   s          r   mainrg      s<   
388}qh:;<=^_hhqkG "I&	H	djj))+%JK	G	sxx=1LMHHQK((1+XXa[
HHQK	''YGdjjeA>?i HHQK ! 	!'+,r   __main__)rU   r   ospathlibr   typingr   r   r   r   r[   rg   rR   rV   r   r   <module>rl      sJ     	  ' 'iu iuXH6%P zF r   