
    } j                    *   U d Z ddlmZ ddlZddlmZ  ej                  d      ZeZde	d<   dZ
d	e	d
<    ej                  d      Z ej                  d      Z ej                  d      ZeZde	d<   efZg dZddZddZddZddZddZddZddZy)a9  Task ID parsing utilities (V2).

Supports unified parsing of task IDs across files, branches, and CLI args.

V2 pattern:
    task-<digits>(_<phase>)?(_<parallel>)?(+<retry>)?
    - phase:    \d+\.\d+   (e.g. _1.2)
    - parallel: [a-z]         (e.g. _a)
    - retry:    \d+           (e.g. +1)

Examples
--------
- ``task-2469``                 -> base only
- ``task-2469+1``               -> retry suffix preserved
- ``task-2469_1.2``             -> phase
- ``task-2469_1.2_a``           -> phase + parallel
- ``task-2469_1.2_a+3``         -> phase + parallel + retry
    )annotationsN)OptionalzZ^task-(?P<num>\d+)(?:_(?P<phase>\d+\.\d+))?(?:_(?P<parallel>[a-z]))?(?:\+(?P<retry>\d+))?$z
re.Pattern
TASK_ID_REz-^task-\d+(?:_\d+\.\d+)?(?:_[a-z])?(?:\+\d+)?$strTASK_ID_PATTERNz,^task-\d+(?:\.\d+)*(?:\.dev\d+)?(?:\.done)?$zftask-(?P<num>\d+)(?:_(?P<phase>\d+\.\d+))?(?:_(?P<parallel>[a-z]))?(?:\+(?P<retry>\d+))?(?![0-9+_a-z])zy(?<![A-Za-z0-9_\-])task-(?P<num>\d+)(?:_(?P<phase>\d+\.\d+))?(?:_(?P<parallel>[a-z]))?(?:\+(?P<retry>\d+))?(?![0-9+_a-z])TASK_ID_STRICT_RE)
TASK_ID_V2_PATTERNr   r   r   parse_task_id_v2is_valid_task_idis_valid_task_id_with_legacyextract_task_idextract_task_id_from_filenameextract_task_id_from_branchc                   t         j                  | j                               }|sddddddS d|j                  d       }|j                  d      rd|j                  d       nd}|j                  d      rd|j                  d       nd}|j                  d      rd	|j                  d       nd}|||||j                  d      dS )
a  Parse a V2 task id string into structural components.

    Returns a dict with keys ``base``, ``phase``, ``parallel``, ``retry``.
    For inputs that don't match, returns dict with all values ``None``.

    Examples
    --------
    >>> sorted(parse_task_id_v2("task-2469+1").items())
    [('base', 'task-2469'), ('num', '2469'), ('parallel', None), ('phase', None), ('retry', '+1')]
    N)basephaseparallelretrynumtask-r   r   _r   r   +)r	   matchstripgroup)smr   r   r   r   s         K/home/jay/workspace/.worktrees/task-2547-dev6-clean/utils/task_id_parser.pyr
   r
   ]   s     	  +AtUYZZ1775>"#D&'ggg&6a !"DE,-GGJ,?177:&'(TH&'ggg&6a !"DE 5hWXW^W^_dWeff    c                L    t         j                  | j                               duS )z5Return True iff ``s`` matches the V2 pattern exactly.N)r	   r   r   r   s    r   r   r   v   s    ##AGGI.d::r   c                    t        | t              sy| j                         } t        t        j                  |             xs t        t        j                  |             S )u   V2 task id 또는 legacy dot-phase task id를 PASS.

    legacy 예시: task-9.1, task-1234.5, task-648.1.dev1, task-648.1.dev1.done
    V2 예시:    task-2485+1, task-2487+1, task-2469_1.2_a+3
    F)
isinstancer   r   boolr	   r   _LEGACY_DOTPHASE_PATTERNr!   s    r   r   r   {   sJ     a		A"((+,W5M5S5STU5V0WWr   c                   d| j                  d       g}| j                  d      r#|j                  d| j                  d              | j                  d      r#|j                  d| j                  d              | j                  d      r#|j                  d| j                  d              dj                  |      S )	Nr   r   r   r   r   r   r    )r   appendjoin)r   partss     r   _reassemble_from_matchr+      s    QWWU^$%&Ewwwq)*+,wwzq,-./wwwq)*+,775>r   c                   t        | t              r| sy| j                  dd      d   }d|v r|j                  dd      d   n|}t        j	                  |      }|rt        |      S t        j                  |       }|rt        |      S y)zExtract a task id from a filename or path.

    Examples
    --------
    >>> extract_task_id_from_filename("memory/tasks/task-2469+1.md")
    'task-2469+1'
    >>> extract_task_id_from_filename("task-2469_1.2_a+3.md")
    'task-2469_1.2_a+3'
    N/   .r   )r#   r   rsplitr	   r   r+   _TASK_ID_LOOSE_PATTERNsearch)filenamebasenamestemr   s       r   r   r      s     h$H sA&r*H),8??3"1%hD  &A%a(( 	%%h/A%a((r   c                n    t        | t              r| syt        j                  |       }|syt	        |      S )zExtract a task id from a branch name.

    Examples
    --------
    >>> extract_task_id_from_branch("task/task-2467+3-dev6")
    'task-2467+3'
    >>> extract_task_id_from_branch("task/task-2469_1.2-dev2")
    'task-2469_1.2'
    Nr#   r   r2   r3   r+   )branchr   s     r   r   r      s4     fc"&%%f-A!!$$r   c                n    t        | t              r| syt        j                  |       }|syt	        |      S )a  Extract the first task id from arbitrary text (branch name, PR title, body, etc.).

    Uses the loose (unanchored) pattern to find a task id embedded anywhere in
    the input string.

    Examples
    --------
    >>> extract_task_id("foo-task-2472+1-bar")
    'task-2472+1'
    >>> extract_task_id("fix issue task-2467+3 in CI")
    'task-2467+3'
    >>> extract_task_id("no task here")
    Nr8   )textr   s     r   r   r      s4     dC %%d+A!!$$r   )r   r   returndict)r   r   r<   r$   )r   objectr<   r$   )r   zre.Matchr<   r   )r4   r   r<   Optional[str])r9   r   r<   r?   )r;   r   r<   r?   )__doc__
__future__r   retypingr   compiler	   r   __annotations__r   r%   r2   _TASK_ID_STRICT_PATTERNr   __all_extra_exports____all__r
   r   r   r+   r   r   r    r   r   <module>rJ      s   & # 	   RZZa 
 ,
J + H G
 &2::3  $  %"**  !8 : 7 12 g2;
	X:%(%r   