
    j5                        d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
  ed      Z ed      Z ed      Z ed	
       G d d             ZddZed	 	 	 	 	 ddZ	 deedd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)u1  Worktree path 후보 resolver.

ANCHOR-4: worktree 후보 위치 2종을 동시에 grep 한다.
- legacy:  /home/jay/workspace/.worktrees/
- cokacdir: /home/jay/.cokacdir/workspace/<schedule_id>/wt-<task_id>-<team>/

한쪽이 missing 하다는 사실만으로 silent drop 을 단정해서는 안 된다.
    )annotations)	dataclassfield)Path)OptionalSequencez/home/jay/workspace/.worktreesz/home/jay/.cokacdir/workspacez$/home/jay/.cokacdir/schedule_historyT)frozenc                      e Zd ZU dZded<   ded<   ded<    ee      Zded	<    ee      Zded
<   e	dd       Z
e	dd       Zy)WorktreeCandidatesu9   두 후보 위치 + 매칭된 실제 디렉터리 목록.r   legacy_rootcokacdir_rootOptional[Path]schedule_workspace_dir)default_factorytuple[Path, ...]legacy_matchescokacdir_matchesc                H    t        | j                  xs | j                        S N)boolr   r   selfs    _/home/jay/workspace/.worktrees/task-2659-dev6/utils/anu_spawn_visibility_guard/path_resolver.py	any_matchzWorktreeCandidates.any_match    s    D''@4+@+@AA    c                j    t        t        | j                        t        | j                        z         S r   )tuplelistr   r   r   s    r   all_matcheszWorktreeCandidates.all_matches$   s(    T$--.d6K6K1LLMMr   N)returnr   )r    r   )__name__
__module____qualname____doc____annotations__r   r   r   r   propertyr   r    r   r   r   r      sb    C**',U'CN$C).u)E&EB B N Nr   r   c           	        | j                         r| j                         sy|j                  d      }d| dd| d| dd| dd| d| dg}|r3|j                  d| d| d| d| d| d| d| d| | d| g       i }|D ]D  }| j	                  |      D ].  }|j                         s|j                  t        |      |       0 F t        t        |j                         d 	            S )
up  task_id 기반 wt-/iso- 디렉터리를 glob 한다.

    봇 컨벤션은 다음 4 패턴을 허용한다(과거 호환 포함):
      - wt-<task_id_short>-<team>
      - wt-<task_id_short>
      - iso-<task_id_short>-<team>
      - task-<task_id>-<team>
      - <task_id>-<team>

    여기서 task_id_short 는 'task-' prefix 가 제거된 숫자 부분이다.
    r'   ztask-zwt-z-*ziso-ziso-wt--c                    t        |       S r   strps    r   <lambda>z_glob_wt_dirs.<locals>.<lambda>Q   s
    SV r   key)
existsis_dirremoveprefixextendglob
setdefaultr,   r   sortedvalues)roottask_id
team_shortshortpatternsseenpatternmatchs           r   _glob_wt_dirsrB   )   s8    ;;=  )E
eWB
eW
ugR
%
wb'H eWAj\*ugQzl+%*.wa
|,':,'	
 D 3YYw' 	3E||~E
E2	33 +;<==r   r   c               Z    | sy|| z  }|j                         r|j                         r|S dS )u   schedule_id 기반 workspace 디렉터리 경로(존재 시).

    schedule_id 가 None 또는 빈 문자열이면 None.
    디렉터리가 존재하지 않으면 None.
    N)r2   r3   )schedule_idr   	candidates      r   resolve_schedule_workspace_dirrG   T   s5     +I!((*y/?/?/A9KtKr   Nr'   )r   r   extra_cokacdir_schedule_idsc               $   t        || |      }t        ||      }g }t               }	|Dt        || |      D ]4  }
t        |
      }||	vs|	j	                  |       |j                  |
       6 |D ]m  }||z  }|j                         s|j                         s*t        || |      D ]4  }
t        |
      }||	vs|	j	                  |       |j                  |
       6 o ||j                         rz|j                         rj|j                         D ]W  }|j                         st        || |      D ]4  }
t        |
      }||	vs|	j	                  |       |j                  |
       6 Y t        t        |d             }t        |||||      S )uP  두 후보 위치를 동시에 glob 한다.

    cokacdir 측은 schedule_id 가 주어지면 해당 디렉터리 안만 본다.
    schedule_id 가 없으면 모든 schedule_id 디렉터리를 fallback glob
    한다(task-2657 사고 시 ANU 가 schedule_id 컨벤션을 몰라서 누락한
    위치까지 잡아내기 위함).
    rC   c                    t        |       S r   r+   r-   s    r   r/   z-resolve_worktree_candidates.<locals>.<lambda>   s
    c!f r   r0   )r   r   r   r   r   )rB   rG   setr,   addappendr2   r3   iterdirr   r8   r   )r;   r<   rE   r   r   rH   r   schedule_dircokacdir_match_bufvisitedmr1   sid	extra_dirchildr   s                   r   resolve_worktree_candidatesrV   d   s     #;DN1+][L%'G|WjA 	-Aa&C'!C "))!,		- + 1!C'	)"2"2"4"9gzB 1!fg%KK$&--a0	11 }335-:N:N:P"**, 	1E<<>"5':> 1!fg%KK$&--a0	1	1 V$6<LMN#+%) r   )r:   r   r;   r,   r<   Optional[str]r    r   )rE   rW   r   r   r    r   r   )r;   r,   r<   rW   rE   rW   r   r   r   r   rH   zSequence[str]r    r   )r$   
__future__r   dataclassesr   r   pathlibr   typingr   r   LEGACY_WORKTREE_ROOTCOKACDIR_WORKSPACE_ROOTSCHEDULE_HISTORY_ROOTr   rB   rG   rV   r'   r   r   <module>r_      s    # (  % <= >? CD  $N N N$(>\ 2LL L 	L& "&:
 -113::: :
 : : "/: :r   