
    vDi.              
          d Z ddlZddlZddlZddlZddlZddlmZ dee	   dee	   fdZ
dee	   dee	   fdZd	ee	   d
e	deeee	   f   fdZde	d
e	deee	ee	   f   ee	   f   fdZdedee	   dee	   de	ddf
dZddZedk(  r e        yy)u  
task_scope.py — task 책임 범위 계산 (Guard MVP Phase 1)

4 집합 분리 수집:
  head_diff             : git diff --name-only <base>..HEAD
  index_staged          : git diff --name-only --cached
  working_tree_modified : git diff --name-only
  untracked             : git ls-files --others --exclude-standard

산출물:
  changed_paths.json, scope_matrix.json → --output-dir
    N)Optionalpathsreturnc                 n   t               }| D ]  }|j                  d      r|j                  d       '|j                  d      r|j                  d       J|j                  d      r|j                  d       m|j                  d      r|j                  d       |j                  d	      r|j                  d
       |j                  d      r|j                  d       |j                  d      s|j                  d      r|j                  d       |j                  d        t	        |      S )u<   변경 파일 목록으로 scope list(sorted unique) 반환.z
extension/	extensionzserver/serverz
dashboard/	dashboardzconfig/configzskills/skillszscripts/scriptszdocs/z.mddocsunscoped)set
startswithaddendswithsorted)r   	scope_setpaths      C/home/jay/workspace/.worktrees/task-2466-dev1/scripts/task_scope.pyclassify_scopesr      s    %I &??<(MM+&__Y'MM(#__\*MM+&__Y'MM(#__Y'MM(#__Z(MM)$__W%u)=MM&!MM*%!&" )    scopesc           	      x    ddddddddd}g }| D ]'  }|j                  |      }|s|j                  |       ) |S )	u(   scope list → required test paths list.zextension/__tests__/zserver/tests/zdashboard/tests/ztests/config/ztests/skills/ztests/scripts/N)r   r   r	   r
   r   r   r   r   )getappend)r   _MAPresultscopevals        r   scope_test_matrixr!   0   s\     ,$'$$%	D F hhuoMM# Mr   argscwdc                     dd|g| z   }t        j                  |ddd      }|j                  dk7  r|j                  g fS |j                  j	                         D cg c]  }|j                         s| }}d|fS c c}w )u7   git 명령 실행 → (returncode, lines). shell=False.gitz-CTF)capture_outputtextcheckr   )
subprocessrun
returncodestdout
splitlinesstrip)r"   r#   cmdr   lineliness         r   _run_gitr2   F   s}    $
t
#C^^C4uMFA  "$$$mm668IdDJJLTIEIe8O Js   A;1A;base_shac                    g }t        ddg|      \  }}|dk(  r|r|d   nd}t        dd|  dg|      \  }}|dk7  r|j                  d|  d	| d
       t        g d|      \  }}|dk7  r|j                  d| d
       t        ddg|      \  }}|dk7  r|j                  d| d
       t        g d|      \  }}	|dk7  r|j                  d| d
       | |||||	d}
|rdj                  |      nd}|
|fS )u=   4 집합 수집. 실패 시 (부분 결과, 에러메시지).z	rev-parseHEADr   UNKNOWNdiff--name-onlyz..HEADz	git diff u   ..HEAD 실패 (rc=))r7   r8   z--cachedu   git diff --cached 실패 (rc=u#   git diff (working tree) 실패 (rc=)zls-filesz--othersz--exclude-standardu!   git ls-files --others 실패 (rc=r3   head_sha	head_diffindex_stagedworking_tree_modified	untrackedz; N)r2   r   join)r3   r#   errorsrc
head_linesr;   r<   r=   r>   r?   	diff_setserrs               r   get_diff_setsrF   P   sD   F {F3S9NB
!#qZz!}iH fmz5HI3OMB		Qw	(+=bTCD   CSIB	Qw5bT;< !)&-)@# FB	Qw;B4qAB KSQMB		Qw9"Q?@ #+"*"+"."7"+I  &$))F
4Cc>r   rD   
test_paths
output_dirc                    t        j                  |d       | d   | d   | d   | d   | d   | d   d	}||d
}t        t         j                  j	                  |d      dd      5 }t        j                  ||dd       ddd       t        t         j                  j	                  |d      dd      5 }t        j                  ||dd       ddd       y# 1 sw Y   XxY w# 1 sw Y   yxY w)u;   output_dir에 changed_paths.json, scope_matrix.json 저장.T)exist_okr3   r;   r<   r=   r>   r?   r:   r   rG   zchanged_paths.jsonwzutf-8)encoding   F)indentensure_asciiNzscope_matrix.json)osmakedirsopenr   r@   jsondump)rD   r   rG   rH   changed_paths_objscope_matrix_objfs          r   write_outputsrY   z   s     KK
T* "+:!6!*:!6!*;!7!*>!:!*+B!C!*;!7  
 
bggll:';<cG	T FXY		#QquEF	bggll:':;S7	S EWX		"AaeDE EF FE Es   $C2C!C!C*c                  $   t        j                  d      } | j                  ddd       | j                  dd d	       | j                  d
dd	       | j                  ddd       | j                         }|j                  s<|j
                  s0t        dt        j                         t        j                  d       t        |j                  |j                        \  }}|r3t        d| t        j                         t        j                  d       |d   }t        |      }t        |      }|j                  rB|d   |d   |d   |d   |d   |d   d||dd}t        t        j                   |d             n|t#        ||||j
                         t        d |j
                   t        j                         t        d!| t        j                         t        d"| t        j                         t        j                  d#       y )$Nu?   task_scope.py — task 책임 범위 계산 (Guard MVP Phase 1))descriptionz
--base-shaTu$   비교 기준 SHA (예: origin/main))requiredhelpz--output-diru1   JSON 저장 디렉토리 (--no-output 시 무시))defaultr]   z--cwdz/home/jay/workspaceu2   git 저장소 루트 (기본: /home/jay/workspace)z--no-output
store_trueu9   stdout에만 출력 (파일 저장 안 함, 테스트용))actionr]   uF   오류: --output-dir 또는 --no-output 중 하나가 필요합니다.)file   z[task-scope] ERROR: r<   r3   r;   r=   r>   r?   r:   rK   )changed_pathsscope_matrixF)rP   u   [task-scope] 저장 완료: z[task-scope] scopes=z[task-scope] test_paths=r   )argparseArgumentParseradd_argument
parse_args	no_outputrH   printsysstderrexitrF   r3   r#   r   r!   rT   dumpsrY   )parserr"   rD   rE   	all_pathsr   rG   outs           r   mainrr      s   $$UF tC  E
P  R
)>Q  S
lX  ZD>>$//V]`]g]gh"4==$((;NIs
$SE*< +&IY'F"6*J~~ *3:)>)2:)>)2;)?)2>)B)23J)K)2;)? %(
 	djj512iT__E,T__,=>SZZP$VH-CJJ?(5CJJGHHQKr   __main__)r   N)__doc__re   rT   rQ   r)   rk   typingr   liststrr   r!   tupleintr2   dictrF   rY   rr   __name__ r   r   <module>r}      s     	  
 
49 c .d3i DI ,49 3 5d3i+@ %C %c %eDd3i4H(SV-4W.X %TET E49 E$s) E!E&*E42j zF r   