
    8#jZ%              
       <   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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edede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)Path)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      E/home/jay/workspace/.worktrees/task-2729+7-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"   1   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_gitr3   G   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=))r8   r9   z--cachedu   git diff --cached 실패 (rc=u#   git diff (working tree) 실패 (rc=)zls-filesz--othersz--exclude-standardu!   git ls-files --others 실패 (rc=r4   head_sha	head_diffindex_stagedworking_tree_modified	untrackedz; N)r3   r   join)r4   r$   errorsrc
head_linesr<   r=   r>   r?   r@   	diff_setserrs               r   get_diff_setsrG   Q   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   rE   
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_okr4   r<   r=   r>   r?   r@   r;   r   rH   zchanged_paths.jsonwzutf-8)encoding   F)indentensure_asciiNzscope_matrix.json)osmakedirsopenr   rA   jsondump)rE   r   rH   rI   changed_paths_objscope_matrix_objfs          r   write_outputsrZ   {   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*task_id	workspacec                 R   |dz  dz  |  dz  }d}|j                         r4	 t        j                  |j                               j	                  dd      }t        j                         }d|v xs" dt        j                  j	                  dd      v }|r|r|S y# t
        $ r d}Y Pw xY w)	u   lock_sha..HEAD 기준 diff base 결정 (PR sub-task worktree 오판 방지).

    worktree 컨텍스트 + lock 파일에 lock_sha 존재 시 lock_sha 반환,
    그 외에는 origin/main fallback.
    z.taskslocksz.lock lock_shaz/.worktrees/GIT_DIRzorigin/main)	existsrU   loads	read_textr   	ExceptionrR   getcwdenviron)r[   r\   	lock_filer`   r$   is_worktrees         r   _resolve_diff_baserj      s     H$w.G9E1BBIH	zz)"5"5"78<<ZLH ))+C C'Z>RZZ^^IWY=Z+ZKx  	H	s   3B B&%B&c                     t        j                  d      } | j                  ddd       | j                  dd 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       |j                  }|dv rM|j                  xs d}t        |t        |j                              }t        d| t        j                         t        ||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-shaTuP   비교 기준 SHA (예: origin/main, 또는 auto/AUTO로 lock_sha 자동 분기))requiredhelpz--output-diru1   JSON 저장 디렉토리 (--no-output 시 무시))defaultrn   z--cwdz/home/jay/workspaceu2   git 저장소 루트 (기본: /home/jay/workspace)z	--task-idu:   task ID (auto/AUTO base-sha 시 lock_sha 조회에 사용)z--workspaceuN   워크스페이스 루트 (lock 파일 검색용, 기본: /home/jay/workspace)z--no-output
store_trueu9   stdout에만 출력 (파일 저장 안 함, 테스트용))actionrn   uF   오류: --output-dir 또는 --no-output 중 하나가 필요합니다.)file   )autoAUTOr_   u   [task-scope] base_sha auto → z[task-scope] ERROR: r=   r4   r<   r>   r?   r@   r;   rL   )changed_pathsscope_matrixF)rQ   u   [task-scope] 저장 완료: z[task-scope] scopes=z[task-scope] test_paths=r   )argparseArgumentParseradd_argument
parse_args	no_outputrI   printsysstderrexitr4   r[   rj   r   r\   rG   r$   r   r"   rU   dumpsrZ   )
parserr#   r4   r[   rE   rF   	all_pathsr   rH   outs
             r   mainr      sd   $$UF to  q
P  R
)>Q  S
TY  [
/Dm  o
lX  ZD>>$//V]`]g]gh }}H##,,$"%gtDNN/CD/z:L"8TXX6NIs
$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__rx   rU   rR   r*   r~   pathlibr   typingr   liststrr   r"   tupleintr3   dictrG   rZ   rj   r   __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4   .=@ zF r   