
    &<i                      L   d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZ 	  e ee      j                  j                        Zeej"                  vrej"                  j%                  de       ddlmZ  G d d      Zd	 Zed
k(  r e        yy# e$ r dZY $w xY w)u   
Skill Router - Auto-detect and load skills based on context

Usage:
    python3 skill-router.py test "메시지 내용"
    python3 skill-router.py detect "메시지 내용" --task-type coding
    N)datetime)Path)AnyDictListOptional)capture_inputc                       e Zd ZdZddee   dee   fdZdefdZde	d	e
e	   defd
Zde	de
e	   fdZdedefdZde
e   fdZy)SkillRouterz5Auto-detect and load skills based on context analysisNtriggers_pathworkspace_pathc                     |t        t              j                  dz  }|#t        t              j                  j                  }t        |      | _        t        |      | _        g | _        i | _        y)z
        Initialize SkillRouter

        Args:
            triggers_path: Path to skill-triggers.json (defaults to same directory)
            workspace_path: Path to workspace (defaults to parent of memory directory)
        Nzskill-triggers.json)r   __file__parentr   r   triggersloaded_skills)selfr   r   s      D/home/jay/workspace/.worktrees/task-2057-dev2/memory/skill-router.py__init__zSkillRouter.__init__   sc       N114IIM!!(^2299N!-0">2$&-/    returnc                    	 | j                   j                         st        d| j                           yt        | j                   dd      5 }t	        j
                  |      }ddd       j                  dg       | _        t        dt        | j                         d	       y
# 1 sw Y   CxY w# t        $ r}t        d|        Y d}~yd}~ww xY w)z
        Load trigger definitions from JSON file

        Returns:
            True if loaded successfully, False otherwise
        u!   ⚠️  Triggers file not found: Frutf-8encodingNr   u   ✅ Loaded z skill triggersTu   ❌ Error loading triggers: )
r   existsprintopenjsonloadgetr   len	Exception)r   fdataes       r   load_triggerszSkillRouter.load_triggers2   s    	%%,,.9$:L:L9MNOd((#@ $Ayy|$ !HHZ4DMKDMM 23?CD$ $  	045	s5   2B1 B1 B%#AB1 %B.*B1 1	C:CCcontext
conditionsc                   	 |j                  dd      j                         	|j                  dd      j                         }|D ]~  }|j                  d      }|dk(  r)|j                  dg       }t        	fd|D              r@ y|dk(  sH|j                  d	g       }|s]||D cg c]  }|j                          c}vs~ y y
c c}w )a  
        Check if context matches all conditions

        Args:
            context: Dict with 'message', 'task_type', 'keywords', etc.
            conditions: List of condition dicts to match

        Returns:
            True if all conditions match, False otherwise
        message 	task_typetypekeywordpatternsc              3   B   K   | ]  }|j                         v   y w)N)lower).0patternr,   s     r   	<genexpr>z1SkillRouter.matches_conditions.<locals>.<genexpr>\   s     N'7==?g5Ns   FtypesT)r"   r3   any)
r   r)   r*   r.   	condition	cond_typer1   r7   tr,   s
            @r   matches_conditionszSkillRouter.matches_conditionsI   s     ++i,224KKR0668	# 	!I!f-II%$==R8NXNN k)!gr2e2L17792L!L 	!  3Ms   &Cc                 *  	 | j                   s| j                          g }| j                   D ]  }|j                  d      }|j                  dg       }|j                  dd      }|j                  dd      }| j                  ||      s]|||d}|j	                  |       	 t
        ,t        |t              rt        ||j                  dd	             |s| j                  |        d
ddd	|j                  	fd       |S # t        $ r Y >w xY w)z
        Detect which skills match the context and optionally load them

        Args:
            context: Dict with 'message', 'task_type', 'keywords', etc.

        Returns:
            List of matched skill info dicts
        skillr*   	auto_loadFprioritymedium)r>   r@   r?   r,   r-   r         )highrA   lowc                 .    j                  | d   d      S )Nr@   rB   )r"   )xpriority_orders    r   <lambda>z4SkillRouter.detect_and_load_skills.<locals>.<lambda>   s    .*<*<Qz]A*N r   )key)r   r(   r"   r<   append_capture_input
isinstancestrr$   
load_skillsort)
r   r)   matched_skillstrigger
skill_namer*   r?   r@   
skill_inforH   s
            @r   detect_and_load_skillsz"SkillRouter.detect_and_load_skillsf   s    }} }} 	0G W-J \26JK7I{{:x8H&&w
;'1xV_`
%%j1%1jS6Q&z7;;y"3MN OOJ/#	0( #$q; NO ! s   !2D	DDrS   c                    || j                   v rt        d| d       y| j                  dz  dz  | dz  }|j                         rj	 t	        |dd	      5 }|j                         }d
d
d
       |t        j                         j                         d| j                   |<   t        d|        yt        d|        y# 1 sw Y   ZxY w# t        $ r}t        d| d|        Y d
}~yd
}~ww xY w)z
        Load a skill by reading its SKILL.md file

        Args:
            skill_name: Name of the skill to load

        Returns:
            True if loaded successfully, False otherwise
        u      ℹ️  Skill 'z' already loadedTzai-organizationskillsz.mdr   r   r   N)namecontent	loaded_atu      ✅ Skill 로드됨: u      ❌ Skill 로드 실패 (z): Fu       ⚠️  Skill 파일 없음: )
r   r   r   r   r   readr   now	isoformatr$   )r   rS   
skill_pathr%   skill_contentr'   s         r   rO   zSkillRouter.load_skill   s    +++&zl2BCD ((+<<xGZLX[J\\
 *cG< -$%FFHM-
 ',!)!9!9!;2"":. 0=>
 4ZLAB#- -  4ZLA3GHs1   C C 'A	C  C	C 	C0C++C0c                 H    t        | j                  j                               S )zGet list of loaded skill names)listr   keys)r   s    r   get_loaded_skillszSkillRouter.get_loaded_skills   s    D&&++-..r   )NN)__name__
__module____qualname____doc__r   rN   r   boolr(   r   r   r<   rU   rO   rc    r   r   r   r      s    ?0hsm 0HUXM 0&t .$ DJ 4 :&d &tDz &P%S %T %N/49 /r   r   c            
         t        t        j                        dk  r$t        t               t        j
                  d       t        j                  d   } | dk(  rt        t        j                        dkD  rt        j                  d   nd}t               }|j                          |dd}t        d| d       |j                  |      }|r>t        d	t        |       d
       |D ]   }t        d|d    d|d    d|d    d       " nt        d       t        d|j                                 y| dk(  r\t        t        j                        dkD  rt        j                  d   nd}d}dt        j                  v rVt        j                  j                  d      }|dz   t        t        j                        k  rt        j                  |dz      nd}t               }|j                          ||d}t        d       t        d| d       t        d| d       |j                  |      }|r>t        d	t        |       d
       |D ]   }t        d|d    d|d    d|d    d       " nt        d       t        d|j                                 yt        d|         t        t               t        j
                  d       y)zCLI interface for testing   rB   testrC   r-   )r,   r.   u   
🔍 Analyzing: "z"
u   
✅ Matched z
 skill(s):u      • r>   z (priority: r@   z, auto_load: r?   )u'   
⚠️  No skills matched this contextu   
📚 Loaded skills: detectz--task-typeu   
🔍 Analyzing:z   Message: ""z   Task type: "zUnknown command: N)r#   sysargvr   rg   exitr   r(   rU   rc   index)commandr,   routerr)   matchedr>   r.   idxs           r   mainrx      s    388}qghhqkG&!$SXX!2#((1+%B7#G9C01//8N3w<.
;<  sg/|E*<M;Nm\abm\n[oopqrs <=&v'?'?'A&BCD	H	!$SXX!2#((1+	CHH$((../C-01Ws388}-Dq)"I%I>!#gYa()	{#.///8N3w<.
;<  sg/|E*<M;Nm\abm\n[oopqrs <=&v'?'?'A&BCD 	!'+,gr   __main__)rg   r    osrerp   r   pathlibr   typingr   r   r   r   rN   r   r   _ws_rootpathinsertscripts.autoresearch.capturer	   rL   r$   r   rx   rd   ri   r   r   <module>r      s     	 	 
   , ,4>((//0Hsxx8$L
[/ [/|>B zF G  Ns   AB B#"B#