
    oi              	           d Z ddlZddlZdZdZh dZdedee   fdZd	edee   fd
Z	dee   dede
fdZ	 	 ddedededefdZy)u   
spec_compliance.py - 작업 지시서 체크리스트 ↔ 보고서 키워드 매칭 verifier
tasks/task-xxx.md의 체크리스트 항목을 보고서에서 키워드로 검색

LLM 호출 없음. 순수 규칙 기반(rule-based) 구현.
    Nz /home/jay/workspace/memory/tasksz"/home/jay/workspace/memory/reports>)      가   것   과   등   때   로   를   및   수   에   와   위   을   의   이   전   후   또는   아래   에서   으로aanasatbebyinisofonortoandareforthefromthatthiswithcontentreturnc                     t        j                  dt         j                        }|j                  |       D cg c]!  }|j	                  d      j                         # c}S c c}w )u   
    마크다운에서 미완료 체크리스트 항목(- [ ]) 텍스트를 추출.

    - [ ] 패턴만 대상 (- [x] 는 이미 완료로 간주하여 제외)

    Returns:
        미완료 체크리스트 항목 텍스트 목록
    z^- \[ \]\s+(.+)$   )recompile	MULTILINEfinditergroupstrip)r,   patternms      B/home/jay/workspace/teams/dev6/qc/verifiers.bak/spec_compliance.py_extract_checklist_itemsr9   ;   sI     jj,bll;G(/(8(8(AB1AGGAJBBBs   &A!textc                     t        j                  dd|       }t        j                  d|      }|D cg c]*  }t        |      dk\  s|j	                         t
        vs)|, }}|S c c}w )u   
    텍스트에서 핵심 키워드를 추출.

    - 2글자 이상 단어만 포함
    - 불용어(STOPWORDS) 제외
    - 마크다운 특수기호, 코드블록 기호 제거

    Returns:
        핵심 키워드 목록
    z[`*_~\[\]()>#] u   [가-힣a-zA-Z0-9]+   )r0   subfindalllenlower	STOPWORDS)r:   cleanedtokenstkeywordss        r8   _extract_keywordsrG   H   s]     ff&T2GZZ.8F!PaSVq[QWWYi5OPHPO Qs   A%A%A%item_keywordsreport_contentc                 X    | syt        fd| D              }|t        |       z  }|dk\  S )u7  
    체크리스트 항목의 핵심 키워드 50% 이상이 보고서에 존재하면 "커버됨" 판정.

    Args:
        item_keywords: 체크리스트 항목에서 추출한 키워드 목록
        report_content: 보고서 전체 텍스트

    Returns:
        True if covered (50% 이상 매칭)
    Tc              3   ,   K   | ]  }|v sd   yw)r/   N ).0kwrI   s     r8   	<genexpr>z _item_covered.<locals>.<genexpr>j   s     Dr^/C!Ds   	g      ?)sumr@   )rH   rI   matchedratios    `  r8   _item_coveredrS   [   s4     DmDDGc-((EC<    task_id	tasks_dirreports_dirc           	         |r|nt         }|r|nt        }t        j                  j	                  ||  d      }t        j                  j	                  ||  d      }t        j                  j                  |      s	dd| gdS 	 t        |dd      5 }|j                         }ddd       t              }
|
sddgdS t        j                  j                  |      s	dd| gdS 	 t        |dd      5 }|j                         }ddd       g }g }|
D ]Y  }t        |      }t        |      }|r|j                  d|        1|j                  d| d| d       |j                  |       [ |r0|j                  ddt!        |       dt!        |
       d       d|dS |j                  ddt!        |
       dt!        |
       d       d|dS # 1 sw Y   1xY w# t        $ r)}	dd	t        |	      j                   d
|	 gdcY d}	~	S d}	~	ww xY w# 1 sw Y   xY w# t        $ r)}	ddt        |	      j                   d
|	 gdcY d}	~	S d}	~	ww xY w)uT  
    작업 지시서 체크리스트와 보고서 키워드 매칭을 검증합니다.

    Args:
        task_id: 검증할 task ID (예: task-792)
        tasks_dir: tasks 디렉토리 경로 (기본: DEFAULT_TASKS_DIR)
        reports_dir: reports 디렉토리 경로 (기본: DEFAULT_REPORTS_DIR)

    Returns:
        {"status": "PASS"|"WARN"|"SKIP", "details": [...]}

        - PASS: 모든 체크리스트 항목이 커버됨 (또는 항목 0개)
        - WARN: 일부 항목 미커버 (details에 미커버 항목 목록)
        - SKIP: task 파일 없음 또는 보고서 없음
    z.mdSKIPzTask file not found: )statusdetailsrzutf-8)encodingNzFailed to read task file: z: PASSu+   No unchecked checklist items found — PASSzReport file not found: zFailed to read report file: z	COVERED: zUNCOVERED: z (keywords: )r   u	   WARN — /u    항목 미커버WARNu	   PASS — u    항목 커버됨)DEFAULT_TASKS_DIRDEFAULT_REPORTS_DIRospathjoinexistsopenreadOSErrortype__name__r9   rG   rS   appendinsertr@   )rU   rV   rW   effective_tasks_direffective_reports_dir	task_pathreport_pathftask_contentechecklist_itemsrI   r[   	uncovereditemrF   covereds                    r8   verifyrz   o   s   ( (1)6G+6K<O0WIS/BI'',,4	oFK 77>>)$/	{;<
 	

)S73 	$q668L	$ /|<O EF
 	
 77>>+&1+?@
 	

+sW5 	&VVXN	& GI #$T*.9NNYtf-.NN[l8*AFGT"# qIc)n%5Qs?7K6LL]^_ W55NN1	#o"6!7q_9M8NN_`a11k	$ 	$ 
4T!W5E5E4FbLM
 	

2	& 	& 
6tAw7G7G6H1#NO
 	

sl   G G#G 'H! 5HH! GG 	H(HHHHH! !	I*III) r{   )__doc__rd   r0   rb   rc   rB   strlistr9   rG   boolrS   dictrz   rL   rT   r8   <module>r      s    
 	6 : *	Z
Cc 
Cd3i 
CC DI &c C D , X2X2X2 X2 
	X2rT   