
    Pi                         d Z ddlZddlZddlmZmZ ddlmZmZ e G d d             Z	de
dee
ee
   f   fd	Zde
dee
   fd
Zde
dee
   fdZde
de	fdZdde	de
de
fdZd Zedk(  r e        yy)u   
스펙 자동 추출 시스템

Usage:
    python3 memory/spec-extractor.py extract "대화 내용"
    python3 memory/spec-extractor.py from-file conversation.txt
    N)asdict	dataclass)DictListc                       e Zd ZU dZdZeed<   dZeed<   dZeed<   dZ	eed<   dZ
eed<   dZee   ed	<   dZee   ed
<   dZeed<   d Zy)ProjectSpecu   프로젝트 스펙 namedescriptionfrontendbackenddatabaseNfeaturesconstraintstimelinec                 R    | j                   g | _         | j                  g | _        y y N)r   r   )selfs    F/home/jay/workspace/.worktrees/task-2117-dev1/memory/spec-extractor.py__post_init__zProjectSpec.__post_init__   s,    == DM#!D $    )__name__
__module____qualname____doc__r
   str__annotations__r   r   r   r   r   r   r   r   r    r   r   r   r      sa    D#NKHcGSHcHd3i!Kc!Hc"r   r   textreturnc                 d   g d}|D cg c]%  }|j                         | j                         v s$|' }}g d}|D cg c]%  }|j                         | j                         v s$|' }}g d}|D cg c]%  }|j                         | j                         v s$|' }}|||dS c c}w c c}w c c}w )u    텍스트에서 키워드 추출)ReactVueAngularu   프론트엔드r   UIu   화면)FastAPIDjangozNode.jsu	   백엔드r   APIu   서버)
PostgreSQLMySQLMongoDBDBu   데이터베이스)r   r   r   )lower)r   frontend_keywordskwfrontend_foundbackend_keywordsbackend_founddb_keywordsdb_founds           r   extract_keywordsr5   $   s     c#4SR
djjl8RbSNS a"2QBbhhjDJJL6PRQMQ QK(GrBHHJ$**,,FGHG&=hWW T R Hs!   %B#B#%B(#B(1%B-B-c                     g }g d}|D ]8  }t        j                  || t         j                        }|j                  |       : g d}|D ]  }|| v s|j	                  |        t        t        |            S )u   기능 목록 추출)u   기능[:\s]+([^\n]+)u   만들고 싶어[:\s]+([^\n]+)u   구현[:\s]+([^\n]+)u   필요[:\s]+([^\n]+))u	   로그인u   회원가입u   결제u   알림u   검색u   대시보드)refindall
IGNORECASEextendappendlistset)r   r   patternspatternmatchesfeature_keywordsr/   s          r   extract_featuresrB   6   s~     H ~H !**WdBMM: !
 c  :OOB  Hr   c                     g }g d}|D ]8  }t        j                  || t         j                        }|j                  |       : t	        t        |            S )u   제약사항 추출)u   제약[:\s]+([^\n]+)u   조건[:\s]+([^\n]+)u   필수[:\s]+([^\n]+)u   금지[:\s]+([^\n]+))r7   r8   r9   r:   r<   r=   )r   r   r>   r?   r@   s        r   extract_constraintsrD   K   sV     K tH $**WdBMM:7#$ K !!r   conversationc           	      P   t        |       }t        |       }t        |       }t        j                  d| t        j
                        }|r|j                  d      j                         nd}t        || dd |d   r|d   d   nd|d   r|d   d   nd|d	   r|d	   d   nd||
      }|S )u   
    대화에서 스펙 자동 추출

    Args:
        conversation: 대화 텍스트

    Returns:
        ProjectSpec: 추출된 스펙
    u   프로젝트[:\s]+([^\n]+)   u   미정N   r   r   r   r   )r
   r   r   r   r   r   r   )	r5   rB   rD   r7   searchr9   groupstripr   )rE   keywordsr   r   
name_matchproject_namespecs          r   extract_spec_from_conversationrP   Z   s      -H  -H &l3K 8,VJ2<:##A&,,.(L  #&,4Z,@*%a(h*29*=#A&8,4Z,@*%a(hD Kr   rO   output_pathc                    |d| j                    d}ddl}|j                  |j                  j	                  |      d       t        |dd	      5 }t        j                  t        |       |d
d       ddd       |S # 1 sw Y   |S xY w)u   스펙 저장Nz!/home/jay/workspace/memory/specs/z
-spec.jsonr   T)exist_okwutf-8encodingF   ensure_asciiindent)	r
   osmakedirspathdirnameopenjsondumpr   )rO   rQ   r\   fs       r   	save_specrd      s     9$))JOKK,tK<	k3	1 AQ		&,a@A A s   #A>>Bc                     ddl } t        | j                        dk  r2t        d       t        d       t        d       | j	                  d       | j                  d   }|dk(  ryt        | j                        d	k  rt        d
       | j	                  d       | j                  d   }t        |      }t        t        j                  t        |      dd             y|dk(  rt        | j                        d	k  rt        d       | j	                  d       | j                  d   }t        |dd      5 }|j                         }ddd       t              }t        |      }t        d|        t        t        j                  t        |      dd             yt        d|        | j	                  d       y# 1 sw Y   xxY w)u   CLI 인터페이스r   NrX   zUsage:u:     python3 memory/spec-extractor.py extract '대화 내용'z=  python3 memory/spec-extractor.py from-file conversation.txtrG   extract   u'   Error: 대화 내용을 입력하세요FrY   z	from-fileu'   Error: 파일 경로를 입력하세요rrU   rV   u   ✅ 스펙 저장 완료: zUnknown command: )syslenargvprintexitrP   ra   dumpsr   r`   readrd   )ri   commandrE   rO   	file_pathrc   rQ   s          r   mainrr      sd   
388}qhJKMNhhqkG)sxx=1;<HHQKxx{-l;djjE!DE	K	sxx=1;<HHQKHHQK	)S73 	$q668L	$ .l;o*;-89djjE!DE 	!'+,	$ 	$s   2F::G__main__r   )r   ra   r7   dataclassesr   r   typingr   r   r   r   r5   rB   rD   rP   rd   rr   r   r   r   r   <module>rv      s     	 )  " " "&X3 X4T#Y#7 X$3 49 *"c "d3i "# # #LK c S  'T zF r   