
    iX6                     2   d Z ddlZddlmc m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    :/home/jay/workspace/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                 
   t        |       }|dz  }t        |dd       t        |      }|j                         }t	        |      }d}||k\  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            dx}x}}t        d |D        d      }
d}|
|u}|st        j                  d|fd|
|f      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}|
d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|
d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}d}|
d   }||v }|slt        j                  d|fd ||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}d!}|
d   }||v }|slt        j                  d|fd ||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|
d"   }d#}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d$}||u }|st        j                  d%|fd&||f      d't        j                         v st        j                  |      rt        j                  |      nd't        j                  |      t        j                  |      d(z  }d)d*|iz  }t        t        j                  |            dx}x}}y)+u?   SKILL.md frontmatter에서 필드를 올바르게 파싱한다.r   my-skilluT   name: my-skill
description: 유용한 스킬
category: seo
triggers:
  - foo
  - bar   >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenresultpy0py1py3py6assert %(py8)spy8Nc              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'>!?   is notz%(py0)s is not %(py3)sskillr2   r4   assert %(py5)spy5descriptionu   유용한 스킬==z%(py1)s == %(py4)sr3   py4assert %(py6)sr5   categoryseofootriggersin)z%(py1)s in %(py4)sbarstatusactiveT)is)z>%(py2)s
{%(py2)s = %(py0)s._skill_registry_loaded
} is %(py5)sr'   r2   py2rF   zassert %(py7)spy7)r   r   r(   load_skill_registryr/   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationnext_skill_registry_loaded)r   wsr   r'   r0   @py_assert2@py_assert5@py_assert4@py_format7@py_format9rC   @py_assert1@py_format4@py_format6@py_assert0@py_assert3@py_format5@py_format8s                     r   test_load_skill_registry_basicrs   /   sC   		"Bx-Kc r"F'')Fv;!;!;!33vv;!?V?FE55555#55#55555#5555555#55555555%%%%%%%%%%%%%%%%%%%%E*%%5%%%%%5%%%%5%%%%%%%%%%%%E*%%5%%%%%5%%%%5%%%%%%%%%%%?&h&?h&&&&?h&&&?&&&h&&&&&&&((0D0(D0000(D00000060006000(000D0000000r   c                    t        |       }|dz  }t        |dd       t        |      }|j                         }t	        d |D        d      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            dx}}|d   }
d}|
|k(  }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}y)uN   description에 DEPRECATED가 포함되면 status='deprecated'로 설정된다.r   	old-skilluG   name: old-skill
description: DEPRECATED: 더 이상 사용하지 않음c              3   2   K   | ]  }|d    dk(  s|  yw)r9   ru   Nr:   r;   s     r   r>   z6test_load_skill_registry_deprecated.<locals>.<genexpr>W   s     @qyK'?!@r?   Nr@   rB   rC   rD   rE   rF   rU   
deprecatedrH   rJ   rK   rM   r5   )r   r   r(   r[   rd   r\   r]   r^   r_   r`   ra   rb   rc   )r   rf   r   r'   r0   rC   rg   rl   rm   rn   ro   rp   rq   rj   s                 r   #test_load_skill_registry_deprecatedrx   J   s    		"Bx-KR r"F'')F@V@$GE5555?*l*?l****?l***?***l*******r   c                 ~   t        |       }|dz  dz  j                          t        |      }|j                  d      }|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|d   }g }||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|d   }g }||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|d   }g }||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|d   }g }||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}y
)uA   skill-usage.jsonl 파일이 없으면 빈 결과를 반환한다.r   r   1dperiodrH   rJ   rK   rM   r5   Ntotal_callsr   unique_skillsby_skillby_teamby_date
top_skills)	r   rmdirr(   get_skill_usage_statsr\   r]   ra   rb   rc   )	r   rf   r'   statsro   rp   rg   rq   rj   s	            r    test_get_skill_usage_stats_emptyr   _   sv   		"B+%%'r"F((.E?"d"?d""""?d"""?"""d"""""""$1$1$$$$1$$$$$$1$$$$$$$!&Q&!Q&&&&!Q&&&!&&&Q&&&&&&&"""""""""""""""""""!r!r!!!!r!!!!!!r!!!!!!!!r!r!!!!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(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}|d   }d}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}|d   }d
}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}|d    D ci c]  }|d!   |d"    }}|d   }d
}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}|d   }d}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}|d#   D ci c]  }|d$   |d"    }}|d   }d
}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}|d   }d}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}|d%   }t        |      }d&}||k  }|st        j                  d'|fd(||f      d)t        j                          v st        j"                  t              rt        j                  t              nd)t        j                  |      t        j                  |      t        j                  |      d*z  }d+d,|iz  }t        t        j                  |            dx}x}x}}|d%   d-   d!   }d}||k(  }	|	slt        j                  d|	fd||f      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}	}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)r<   rs     r   r>   z7test_get_skill_usage_stats_with_data.<locals>.<genexpr>   s     1A$**Q-1s   !r   r   rz   r{   rH   rJ   rK   rM   r5   r|   r}   r~   r   countr   r   r   
   )<=)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} <= %(py7)sr/   )r2   rY   rL   rZ   zassert %(py9)spy9r   )r   r(   r   nowr   	isoformatr   joinr   r\   r]   ra   rb   rc   r/   r^   r_   r`   )r   rf   r'   r   records
jsonl_pathr   ro   rp   rg   rq   rj   r=   by_skill_maptby_team_maprl   @py_assert6rh   rr   @py_format10s                        r   $test_get_skill_usage_stats_with_datar   t   sk   		"Br"F
,,$
C 	 22==?""	
 	 22==?""	
  	 22==?""	
G0 k!F*-@@J		111  
 ((.E?"d"?d""""?d"""?"""d"""""""$1$1$$$$1$$$$$$1$$$$$$$!&Q&!Q&&&&!Q&&&!&&&Q&&&&&&&7<Z7HI!AjM1W:-ILI$1$1$$$$1$$$$$$1$$$$$$$ %A% A%%%% A%%% %%%A%%%%%%%5:95EF1Y<7+FKF{#(q(#q((((#q(((#(((q((((((({#(q(#q((((#q(((#(((q(((((((\")3"#)r)#r))))#r))))))3)))3)))")))#)))r)))))))q!*-77-7777-777-7777777777 J Gs   !W=:Xc                 ,   t        |       }t        |      }ddddd}|j                  |      }|d   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }	t        t        j                  |	            dx}x}}d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }
dd|
iz  }t        t        j                  |            dx}}|dz  dz  dz  }|j                  } |       }|sddt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      dz  }t        t        j                  |            dx}}|j                  d      j                         D cg c]  }|j                         s| }}t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j
                  t              ndd t        j                         v st        j                  |      rt        j
                  |      nd t        j
                  |      t        j
                  |      d!z  }	d"d#|	iz  }t        t        j                  |            dx}x}}t!        j"                  |d$         }|d%   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }	t        t        j                  |	            dx}x}}|d&   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }	t        t        j                  |	            dx}x}}|d'   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }	t        t        j                  |	            dx}x}}d(}||v }|st        j                  d|fd||f      t        j
                  |      d)t        j                         v st        j                  |      rt        j
                  |      nd)dz  }
dd|
iz  }t        t        j                  |            dx}}yc c}w )*u=   log_skill_usage가 JSONL 파일에 레코드를 추가한다.pdfzmkt-teamztask-999r   )r   r   r   r   rU   okrH   rJ   rK   rM   r5   N	logged_atrR   z%(py1)s in %(py3)sr0   r3   r4   rE   rF   r   r   r   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   r2   rY   rL   r   r   r+   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr/   linesr1   r6   r7   r   r   r   r   r   record)r   r(   log_skill_usager\   r]   ra   rb   rc   r^   r_   r`   exists	read_text
splitlinesstripr/   r   loads)r   rf   r'   r   r0   ro   rp   rg   rq   rj   rm   rn   r   rl   lr   rh   ri   rk   r   s                       r   test_log_skill_usager      s   		"Br"F 	D ##D)F(#t#t####t######t####### ;&    ;&   ;      &   &       k!F*-@@J::",,g,>IIKY1qwwyQYEYu::?:33uu:ZZa!F*&&&&&&&&&&&&&&&&&&&)*
*
****
******
*******)*
*
****
******
******* ;&    ;&   ;      &   &        Zs   'V=V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ddt        j                         v st        j                  t              rt        j                   t              nddt        j                         v st        j                  |      rt        j                   |      nddt        j                         v st        j                  t              rt        j                   t              ndt        j                   |      dz  }t#        t        j$                  |            d}|D cg c]  }|d   	 }	}d}
|
|	v }|st        j&                  d|fd|
|	f      t        j                   |
      dt        j                         v st        j                  |	      rt        j                   |	      nddz  }dd|iz  }t#        t        j$                  |            dx}
}d	}
|
|	v}|st        j&                  d |fd!|
|	f      t        j                   |
      dt        j                         v st        j                  |	      rt        j                   |	      nddz  }dd|iz  }t#        t        j$                  |            dx}
}yc c}w )"uF   status='running' 태스크가 있으면 active_skills로 반환한다.taskstask-100r   u#   /ship 배포 워크플로우 실행Nr   running)r   r   rG   
start_timerU   task-101r   u   일반 코딩 작업	completed)r   r   r	   ztask-timers.jsonF)ensure_asciir   r   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancerV   list)r2   r3   rY   rL   r   rR   r   task_idsr   rE   rF   )not in)z%(py1)s not in %(py3)s)r   r(   r   r   r   r   r   r   
load_tasksget_active_skillsr   r   r^   r_   r\   r`   ra   rb   rc   r]   )r   rf   r'   	task_data
memory_dirrV   rp   rq   ar   ro   rg   rm   rn   s                 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########:###:######f###f######d###d##########&,-)-H-!:!!!!:!!!:!!!!!!!!!!!!!!!!%:X%%%%:X%%%:%%%%%%X%%%X%%%%%%% .s   "L;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      }d}||u}	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}	}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}t        d  |D        d      }d}||u}	|	st        j                  d|	fd||f      d!t        j                         v st        j                  |      rt        j                  |      nd!t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}	}|d   }d"}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)#ua   skill-agent-mapping.json이 있으면 스킬명 기반으로 카테고리가 자동 분류된다.r   r   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r9   r   Nr:   r;   s     r   r>   zFtest_load_skill_registry_auto_category_from_mapping.<locals>.<genexpr>       @QAfI,?q@r?   Nr@   rB   
ship_skillrD   rE   rF   rN   r   rH   rJ   rK   rM   r5   c              3   2   K   | ]  }|d    dk(  s|  yw)r9   r   Nr:   r;   s     r   r>   zFtest_load_skill_registry_auto_category_from_mapping.<locals>.<genexpr>  s     DA1V9+CaDr?   	seo_skillr   r   r   r   r   r   r(   r[   rd   r\   r]   r^   r_   r`   ra   rb   rc   )r   rf   r   mappingmapping_pathr'   r0   r   rg   rl   rm   rn   ro   rp   rq   rj   r   s                    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!!:T!!!!:T!!!!!!:!!!:!!!T!!!!!!!j!2]2!]2222!]222!222]2222222DDdKI  9D    9D      9   9   D       Z /K/ K//// K/// ///K///////r   c                 V   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      }d}||u}	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}	}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u^   frontmatter에 'general'이 아닌 명시적 카테고리가 있으면 매핑을 무시한다.r   r   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   r>   zGtest_load_skill_registry_explicit_category_preserved.<locals>.<genexpr>2  r   r?   Nr@   rB   r   rD   rE   rF   rN   rO   rH   rJ   rK   rM   r5   r   )r   rf   r   r   r   r'   r0   r   rg   rl   rm   rn   ro   rp   rq   rj   s                   r   4test_load_skill_registry_explicit_category_preservedr     sF   		"Bx-K ? %vh/$G #f,/IILDJJw/'Br"F'')F@&@$GJ!!:T!!!!:T!!!!!!:!!!:!!!T!!!!!!!j!*U*!U****!U***!***U*******r   c                 V   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      }d}||u}	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}	}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uR   매핑 파일에 없는 스킬은 default_category인 'shared'를 할당받는다.r   mystery-skillu6   name: mystery-skill
description: 알 수 없는 스킬r   r   r   r   r   r   r   r   r   c              3   2   K   | ]  }|d    dk(  s|  yw)r9   r   Nr:   r;   s     r   r>   zAtest_load_skill_registry_unmapped_uses_default.<locals>.<genexpr>K  s     F!6o)EAFr?   Nr@   rB   mysteryrD   rE   rF   rN   rH   rJ   rK   rM   r5   r   )r   rf   r   r   r   r'   r0   r   rg   rl   rm   rn   ro   rp   rq   rj   s                   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7$7$77$:*(*(****(******(*******r   c                 F   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(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      dz  }t        j$                  d|j&                         dz   d|iz  }	t)        t        j*                  |	            dx}x}}|j                  } |       }|st        j$                  d      dz   dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      dz  }
t)        t        j*                  |
            dx}}|j-                  d      j/                         D cg c]  }|j1                         s| }}t3        |      }d}||k\  }|st        j                  d |fd!||f      d"t        j                         v st        j                   t2              rt        j"                  t2              nd"d#t        j                         v st        j                   |      rt        j"                  |      nd#t        j"                  |      t        j"                  |      d$z  }t        j$                  d%      d&z   d'|iz  }t)        t        j*                  |            dx}x}}t	        j4                  |d(         }|j6                  }d)} ||      }d}||k(  }|st        j                  d|fd*||f      d+t        j                         v st        j                   |      rt        j"                  |      nd+t        j"                  |      t        j"                  |      t        j"                  |      t        j"                  |      d,z  }t        j$                  d-|       d.z   d/|iz  }t)        t        j*                  |            dx}x}x}x}}d0}||v }|st        j                  d1|fd2||f      t        j"                  |      d+t        j                         v st        j                   |      rt        j"                  |      nd+d3z  }t        j$                  d4      d5z   d6|iz  }t)        t        j*                  |            dx}}d7}||v }|st        j                  d1|fd2||f      t        j"                  |      d+t        j                         v st        j                   |      rt        j"                  |      nd+d3z  }t        j$                  d8      d5z   d6|iz  }t)        t        j*                  |            dx}}d9}||v }|st        j                  d1|fd2||f      t        j"                  |      d+t        j                         v st        j                   |      rt        j"                  |      nd+d3z  }t        j$                  d:      d5z   d6|iz  }t)        t        j*                  |            dx}}|j6                  }d9} ||      }d;}||k(  }|st        j                  d|fd*||f      d+t        j                         v st        j                   |      rt        j"                  |      nd+t        j"                  |      t        j"                  |      t        j"                  |      t        j"                  |      d,z  }t        j$                  d<|       d.z   d/|iz  }t)        t        j*                  |            dx}x}x}x}}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Skillr    )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   rH   )z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sr0   rX   u   스크립트가 실패함: z
>assert %(py7)srZ   Nu#   JSONL 파일이 생성되지 않음zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}output_jsonlr   r   r   r+   r,   r.   r/   r   r1   u   JSONL 레코드가 없음z
>assert %(py8)sr7   r   )zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)sr   )r2   rY   rL   r5   r   u   skill_id 불일치: z
>assert %(py11)spy11r   rR   r   r   u   team_id 필드 없음z
>assert %(py5)srF   r   u   timestamp 필드 없음r   u   session_type 필드 없음hooku   session_type 불일치: )r   r   pytestskipr   r   
subprocessrunr$   
__import__environ
returncoder\   r]   r^   r_   r`   ra   _format_assertmsgstderrrb   rc   r   r   r   r/   r   get)r   logger_scriptr   
hook_inputr0   rl   ri   rp   rn   rr   rq   liner   rg   rh   rj   rk   r   @py_assert8@py_assert7r   @py_format12ro   rm   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PPPPPPPP6PPP6PPPPPPPPP%@#PPPPPPPP G G GG"GGGGGGG<GGG<GGGGGG GGGGGG*44g4FQQSddW[WaWaWcTdEdu:77:?777:77777737773777777u777u777:77777777777777ZZb	"F::LjL:j!LVL!V+LLL!VLLLLLL6LLL6LLL:LLLjLLL!LLLVLLL/CF8-LLLLLLLL79777977797777777777777 7777777;;& ;;;;&;;;;;;;;;;&;;;&;;;;";;;;;;;A>V#AAA>VAAA>AAAAAAVAAAVAAAA%AAAAAAA::TnT:n%TT%/TTT%TTTTTT6TTT6TTT:TTTnTTT%TTTTTT3KF81TTTTTTTT es   #`9`)__doc__builtinsr^   _pytest.assertion.rewrite	assertionrewriter\   r   r   r!   r   r   pathlibr   r   r   r$   r   r(   rs   rx   r   r   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   