
    iX6                        d Z ddlZddlZddlZddlmZmZ ddlmZ ddlZdedefdZ	ded	e
d
e
defdZdefdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZy)u)   스킬 사용 추적 시스템 테스트.    N)datetime	timedelta)Pathtmp_pathreturnc                     | dz  j                  d       | dz  dz  j                  d       | dz  j                  d       | S )u;   테스트용 임시 workspace 디렉토리를 생성한다.memoryT)parents	dashboarddataskills)mkdir)r   s    T/home/jay/workspace/.worktrees/task-2116-dev1/teams/dev1/tests/test_skill_tracker.py_make_workspacer      sN    -f$++D+9-O    skills_rootdir_namefrontmatterc                 p    | |z  }|j                  dd       |dz  j                  d| d| dd       |S )	u0   스킬 디렉토리와 SKILL.md를 생성한다.T)r
   exist_okzSKILL.mdz---
z
---

# 
utf-8encoding)r   
write_text)r   r   r   	skill_dirs       r   _make_skill_dirr      sQ    h&IOOD4O0''
}Kz4 (  r   c                     ddl }|j                  j                  dt        t	        t
              j                  d   dz               ddlm}  ||       }|S )u(   DataLoader 인스턴스를 반환한다.r   N   r   )
DataLoader)	syspathinsertstrr   __file__r
   serverr    )r   r!   r    loaders       r   _make_data_loaderr(   !   sB    HHOOAs4>11!4{BCD!!FMr   c                 B   t        |       }|dz  }t        |dd       t        |      }|j                         }t	        |      dk\  sJ t        d |D        d      }|J |d   dk(  sJ |d	   d
k(  sJ d|d   v sJ d|d   v sJ |d   dk(  sJ |j                  du sJ y)u?   SKILL.md frontmatter에서 필드를 올바르게 파싱한다.r   my-skilluT   name: my-skill
description: 유용한 스킬
category: seo
triggers:
  - foo
  - bar   c              3   2   K   | ]  }|d    dk(  s|  yw)namer*   N .0ss     r   	<genexpr>z1test_load_skill_registry_basic.<locals>.<genexpr>=   s     ?qyJ'>!?   Ndescriptionu   유용한 스킬categoryseofootriggersbarstatusactiveT)r   r   r(   load_skill_registrylennext_skill_registry_loadedr   wsr   r'   resultskills         r   test_load_skill_registry_basicrD   /   s    		"Bx-Kc r"F'')Fv;!?V?FE#5555%%%E*%%%%E*%%%%?h&&&((D000r   c                     t        |       }|dz  }t        |dd       t        |      }|j                         }t	        d |D        d      }|J |d   dk(  sJ y)uN   description에 DEPRECATED가 포함되면 status='deprecated'로 설정된다.r   	old-skilluG   name: old-skill
description: DEPRECATED: 더 이상 사용하지 않음c              3   2   K   | ]  }|d    dk(  s|  yw)r-   rF   Nr.   r/   s     r   r2   z6test_load_skill_registry_deprecated.<locals>.<genexpr>W   s     @qyK'?!@r3   Nr:   
deprecated)r   r   r(   r<   r>   r@   s         r   #test_load_skill_registry_deprecatedrI   J   sp    		"Bx-KR r"F'')F@V@$GE?l***r   c                 
   t        |       }|dz  dz  j                          t        |      }|j                  d      }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ |d   g k(  sJ |d	   g k(  sJ |d
   g k(  sJ |d   g k(  sJ y)uA   skill-usage.jsonl 파일이 없으면 빈 결과를 반환한다.r   r   1dperiodtotal_callsr   unique_skillsby_skillby_teamby_date
top_skillsN)r   rmdirr(   get_skill_usage_stats)r   rA   r'   statss       r    test_get_skill_usage_stats_emptyrV   _   s    		"B+%%'r"F((.E?d"""1$$$!Q&&&"""r!!!r!!!"$$$r   c                     t        |       }t        |      }t        j                  d      }d|t	        d      z
  j                         dddd	d|t	        d
      z
  j                         dddd	d|t	        d      z
  j                         dddd	g}|dz  dz  dz  }|j                  dj                  d |D              d       |j                  d      }|d   dk(  sJ |d   dk(  sJ |d   d
k(  sJ |d   D ci c]  }|d   |d    }}|d   d
k(  sJ |d   dk(  sJ |d   D 	ci c]  }	|	d   |	d    }
}	|
d   d
k(  sJ |
d   dk(  sJ t        |d          d!k  sJ |d    d"   d   dk(  sJ yc c}w c c}	w )#uF   skill-usage.jsonl에 레코드가 있으면 올바르게 집계한다.Ntzshipr+   )hours	dev1-teamztask-1task)skill_id	timestampteam_idtask_idsession_type   	dev2-teamztask-2retror   ztask-3r   r   skill-usage.jsonlr   c              3   F   K   | ]  }t        j                  |        y w)N)jsondumps)r0   rs     r   r2   z7test_get_skill_usage_stats_with_data.<locals>.<genexpr>   s     1A$**Q-1s   !r   r   rK   rL   rM   rN   rO   r^   countrP   r`   rR   
   r   )
r   r(   r   nowr   	isoformatr   joinrT   r=   )r   rA   r'   rm   records
jsonl_pathrU   r1   by_skill_maptby_team_maps              r   $test_get_skill_usage_stats_with_dataru   t   s   		"Br"F
,,$
C 	 22==?""	
 	 22==?""	
  	 22==?""	
G0 k!F*-@@J		111  
 ((.E?d"""1$$$!Q&&&7<Z7HI!AjM1W:-ILI1$$$ A%%%5:95EF1Y<7+FKF{#q((({#q(((u\"#r)))q!*-777 J Gs   ?E6,E;c                    t        |       }t        |      }ddddd}|j                  |      }|d   dk(  sJ d|v sJ |d	z  d
z  dz  }|j                         sJ |j	                  d      j                         D cg c]  }|j                         s| }}t        |      dk(  sJ t        j                  |d         }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ d|v sJ yc c}w )u=   log_skill_usage가 JSONL 파일에 레코드를 추가한다.pdfzmkt-teamztask-999r]   )r^   r`   ra   rb   r:   ok	logged_atr   r   rf   r   r   r+   r   r^   r`   ra   r_   N)
r   r(   log_skill_usageexists	read_text
splitlinesstripr=   rh   loads)	r   rA   r'   r   rB   rq   llinesrecords	            r   test_log_skill_usager      s&   		"Br"F 	D ##D)F(t###&   k!F*-@@J",,g,>IIKY1qwwyQYEYu:??ZZa!F*&&&)
***)
***&    Zs   >C'C'c                    t        |       }t        |      }ddddt        j                  d      j	                         ddd	d
dt        j                  d      j	                         dddi}|dz  }|dz  j                  t        j                  |d      d       |j                          |j                         }t        |t              sJ |D cg c]  }|d   	 }}d|v sJ d	|vsJ yc c}w )uF   status='running' 태스크가 있으면 active_skills로 반환한다.taskstask-100r\   u#   /ship 배포 워크플로우 실행NrX   running)ra   r`   r4   
start_timer:   task-101rd   u   일반 코딩 작업	completed)r   r   r	   ztask-timers.jsonF)ensure_asciir   r   ra   )r   r(   r   rm   rn   r   rh   ri   
load_tasksget_active_skills
isinstancelist)r   rA   r'   	task_data
memory_dirr;   atask_idss           r   test_get_active_skillsr      s   		"Br"F 	%&D&lld3==?# &&5&lld3==?%
I& hJ$$00ITY1Zel0m
%%'Ffd###&,-)-H-!!!X%%% .s   C/c                    t        |       }|dz  }t        |dd       t        |dd       dddgddgd	d
d}|dz  dz  dz  }|j                  t        j                  |      d       t        |      }|j                         }t        d |D        d      }|J |d   dk(  sJ t        d |D        d      }|J |d   dk(  sJ y)ua   skill-agent-mapping.json이 있으면 스킬명 기반으로 카테고리가 자동 분류된다.r   rZ   u.   name: ship
description: 배포 워크플로우	seo-auditu9   name: seo-audit
description: SEO 감사
category: generalztest mappingztdd-enforcementcopywriting)development	marketingshared)_comment
categoriesdefault_categoryr   r   skill-agent-mapping.jsonr   r   c              3   2   K   | ]  }|d    dk(  s|  ywr-   rZ   Nr.   r/   s     r   r2   zFtest_load_skill_registry_auto_category_from_mapping.<locals>.<genexpr>       @QAfI,?q@r3   Nr5   r   c              3   2   K   | ]  }|d    dk(  s|  yw)r-   r   Nr.   r/   s     r   r2   zFtest_load_skill_registry_auto_category_from_mapping.<locals>.<genexpr>  s     DA1V9+CaDr3   r   r   r   r   rh   ri   r(   r<   r>   )	r   rA   r   mappingmapping_pathr'   rB   
ship_skill	seo_skills	            r   3test_load_skill_registry_auto_category_from_mappingr      s	   		"Bx-K K)Z[E #"$56%}5
 %G #f,/IILDJJw/'Br"F'')F@&@$GJ!!!j!]222DDdKI   Z K///r   c                 (   t        |       }|dz  }t        |dd       ddgidd}|dz  dz  d	z  }|j                  t        j                  |      d
       t        |      }|j                         }t        d |D        d      }|J |d   dk(  sJ y)u^   frontmatter에 'general'이 아닌 명시적 카테고리가 있으면 매핑을 무시한다.r   rZ   u3   name: ship
description: 배포 스킬
category: seor   r   r   r   r   r   r   r   r   c              3   2   K   | ]  }|d    dk(  s|  ywr   r.   r/   s     r   r2   zGtest_load_skill_registry_explicit_category_preserved.<locals>.<genexpr>2  r   r3   Nr5   r6   r   )r   rA   r   r   r   r'   rB   r   s           r   4test_load_skill_registry_explicit_category_preservedr     s    		"Bx-K ? %vh/$G #f,/IILDJJw/'Br"F'')F@&@$GJ!!!j!U***r   c                 (   t        |       }|dz  }t        |dd       ddgidd}|dz  d	z  d
z  }|j                  t        j                  |      d       t        |      }|j                         }t        d |D        d      }|J |d   dk(  sJ y)uR   매핑 파일에 없는 스킬은 default_category인 'shared'를 할당받는다.r   mystery-skillu6   name: mystery-skill
description: 알 수 없는 스킬r   rZ   r   r   r   r   r   r   r   c              3   2   K   | ]  }|d    dk(  s|  yw)r-   r   Nr.   r/   s     r   r2   zAtest_load_skill_registry_unmapped_uses_default.<locals>.<genexpr>K  s     F!6o)EAFr3   Nr5   r   )r   rA   r   r   r   r'   rB   mysterys           r   .test_load_skill_registry_unmapped_uses_defaultr   :  s    		"Bx-KK2kl %vh/$G #f,/IILDJJw/'Br"F'')FFvFMG:(***r   c                 D   t        d      }|j                         st        j                  d       | dz  }t	        j
                  dddddd	d
      }t        j                  dt        |      g|ddi t        d      j                  dt        |      i      }|j                  dk(  sJ d|j                          |j                         sJ d       |j                  d      j                         D cg c]  }|j                         s| }}t!        |      dk\  sJ d       t	        j"                  |d         }|j%                  d      dk(  s
J d|        d|v sJ d       d|v sJ d       d|v sJ d       |j%                  d      d k(  s
J d!|        y"c c}w )#uZ   skill-usage-logger.sh가 올바른 JSONL 필드를 포함하는 레코드를 기록한다.z//home/jay/workspace/hooks/skill-usage-logger.shu3   skill-usage-logger.sh가 아직 구현되지 않음zskill-usage-test.jsonlSkillrZ    )rC   argsz$/home/jay/workspace/teams/dev1/testsztest-session-001)	tool_name
tool_inputcwd
session_idbashTosSKILL_USAGE_JSONL_OVERRIDE)inputcapture_outputtextenvr   u   스크립트가 실패함: u#   JSONL 파일이 생성되지 않음r   r   r+   u   JSONL 레코드가 없음r^   u   skill_id 불일치: r`   u   team_id 필드 없음r_   u   timestamp 필드 없음rb   u   session_type 필드 없음hooku   session_type 불일치: N)r   r{   pytestskiprh   ri   
subprocessrunr$   
__import__environ
returncodestderrr|   r}   r~   r=   r   get)r   logger_scriptoutput_jsonl
hook_inputrB   liner   r   s           r   %test_skill_usage_logger_output_formatr   S  s   JKM!IJ 66L  $*B79,		
J ^^	]#$
&&
(#l*;
	F !P%@#PP!  G"GG *44g4FQQSddW[WaWaWcTdEdu:?777?ZZb	"F::j!V+L/CF8-LL+7 77& ;";; V#A%AA#::n%/T3KF81TT/ es   6FF)__doc__rh   r   r!   r   r   pathlibr   r   r   r$   r   r(   rD   rI   rV   ru   r   r   r   r   r   r   r.   r   r   <module>r      s   /   
 (  
d t   3 4  1T 1d 16+$ +4 +*%t % %*384 38D 38r!4 !D !>!&T !&d !&N#0$ #04 #0R+4 +D +<+T +d +2.UD .UT .Ur   