
    Sib                    d   d Z ddlmZ ddlZddlmZ 	 ddlZdZ ej                  dej                        Z ej                  dej                        Z ej                  d	ej                        Z ej                  d
ej                        ZddZddZddZddZddZy# e	$ r dZdZY w xY w)u  스킬 SKILL.md frontmatter 파싱 및 메타데이터 추출.

skill_loader.py의 파싱 로직을 분리한 모듈이다.
3계층 Progressive Disclosure 로더에서 사용하는 파싱 함수를 제공한다.

Public API:
    parse_frontmatter(content) -> tuple[dict, str]
    extract_description(fm, body) -> str
    extract_triggers(fm, body) -> list[str]
    extract_requires(fm) -> list[str]
    extract_category(fm, body, skill_name) -> str
    )annotationsN)AnyTFz^---\s*\n(.*?)\n---\s*\nz
^#\s+(.+)$z(?:trigger|use when)zcategory\s*[:=]\s*(.+)c                ^   t         j                  |       }|si | fS |j                  d      }| |j                         d }t        si }|j                         D ]  }d|v s|j                         j                  d      r(|j                  d      \  }}}|j                         }|j                         j                  d      j                  d      }|s~|s|||<    ||fS t        i |fS 	 t        j                  |      }	t        |	t              r|	|fS i |fS # t        $ r i |fcY S w xY w)u   YAML frontmatter를 파싱한다.

    Args:
        content: SKILL.md 전체 내용.

    Returns:
        (frontmatter_dict, body_without_frontmatter).
        YAML 없거나 파싱 실패 시 ({}, content).
       N:-"')_FRONTMATTER_REmatchgroupend_YAML_AVAILABLE
splitlinesstrip
startswith	partition_yaml_module	safe_load
isinstancedict	Exception)
contentr   raw_fmbodyfmlinek_vparseds
             C/home/jay/workspace/.worktrees/task-2117-dev1/utils/skill_parser.pyparse_frontmatterr#   "   s*    !!'*E7{[[^F599;=!D%%' 	Dd{4::<#:#:3#?..-1aGGIGGIOOC(..s3BqE	 4x4x''/fd#4<4x 4xs   /(D D D,+D,c                    | j                  dd      }|rt        |      j                         S t        j	                  |      }|r|j                  d      j                         S y)u   frontmatter 또는 첫 번째 # 헤딩에서 설명을 추출한다.

    Args:
        fm: parse_frontmatter 로 얻은 frontmatter dict.
        body: frontmatter를 제거한 본문.

    Returns:
        설명 문자열. 없으면 빈 문자열.
    description r   )getstrr   _HEADING_REsearchr   )r   r   descr   s       r"   extract_descriptionr,   J   sU     66-$D4y  t$E{{1~##%%    c                   dD ]u  }| j                  |      }|t        |t              r,|D cg c]  }|st        |      j	                           c}c S t        |t              sd|j	                         gc S  g }|j                         D ]K  }t        j                  |      s|j                  d      j	                         }|s;|j                  |       M |S c c}w )u   frontmatter triggers 또는 본문에서 트리거를 추출한다.

    Args:
        fm: parse_frontmatter 로 얻은 frontmatter dict.
        body: frontmatter를 제거한 본문.

    Returns:
        트리거 문자열 목록.
    )triggerstriggerz#-*> )
r'   r   listr(   r   r   _TRIGGER_LINE_REr*   lstripappend)r   r   keyvaltresultr   cleaneds           r"   extract_triggersr:   _   s     ' !ffSk;c4 ,/5q1CFLLN55c3IIK= ! F! '""4(kk'*002Gg&	'
 M 6s
   CCc                   dD ]u  }| j                  |      }|t        |t              r,|D cg c]  }|st        |      j	                           c}c S t        |t              sd|j	                         gc S  g S c c}w )u   frontmatter의 requires/prerequisites를 추출한다.

    Args:
        fm: parse_frontmatter 로 얻은 frontmatter dict.

    Returns:
        의존성 문자열 목록.
    )requiresprerequisites)r'   r   r1   r(   r   )r   r5   r6   rs       r"   extract_requiresr?   |   ss     - !ffSk;c4 ,/5q1CFLLN55c3IIK= ! I 6s
   A=A=c                   | j                  dd      }|rt        |      j                         S t        j	                  |      }|r=|j                  d      j                         j                  d      j                  d      S y)u^  frontmatter category 또는 본문에서 카테고리를 추출한다.

    Args:
        fm: parse_frontmatter 로 얻은 frontmatter dict.
        body: frontmatter를 제거한 본문.
        skill_name: 폴백용 스킬 이름 (현재 사용 안 함, 확장 여지 보존).

    Returns:
        카테고리 문자열. 없으면 'general'.
    categoryr&   r   r	   r
   general)r'   r(   r   _CATEGORY_LINE_REr*   r   )r   r   
skill_namecatr   s        r"   extract_categoryrF      sk     &&R
 C
3x~~$$T*E{{1~##%++C066s;;r-   )r   r(   returnztuple[dict[str, Any], str])r   dict[str, Any]r   r(   rG   r(   )r   rH   r   r(   rG   	list[str])r   rH   rG   rI   )r   rH   r   r(   rD   r(   rG   r(   )__doc__
__future__r   retypingr   yamlr   r   ImportErrorcompileDOTALLr   	MULTILINEr)   
IGNORECASEr2   rC   r#   r,   r:   r?   rF    r-   r"   <module>rU      s    # 	 O
 "**8"))Dbjj52::5r}}E BJJ8"--H %P*:(q  LOs   B# #	B/.B/