
    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f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])c                   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   +)TASK_ID_V2_PATTERNmatchstripgroup)smr	   r
   r   r   s         E/home/jay/workspace/.worktrees/task-2721-dev1/utils/task_id_parser.pyparse_task_id_v2r   L   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   is_valid_task_idr   e   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   is_valid_task_id_with_legacyr!   j   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'   v   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   extract_task_id_from_filenamer3      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   r.   r/   r'   )branchr   s     r   extract_task_id_from_branchr7      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")
    Nr5   )textr   s     r   extract_task_idr:      s4     dC %%d+A!!$$r   )r   r   returndict)r   r   r;   r   )r   objectr;   r   )r   zre.Matchr;   r   )r0   r   r;   Optional[str])r6   r   r;   r>   )r9   r   r;   r>   )__doc__
__future__r   retypingr   compiler   r   __annotations__r   r    r.   _TASK_ID_STRICT_PATTERN__all_extra_exports__r   r   r!   r'   r3   r7   r:    r   r   <module>rH      s   & # 	   RZZa 
 ,
J + H G
 &2::3  $  %"**  12 g2;
	X:%(%r   