§
    ÎÐjâ  ã                   ó²   — 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Zddlm	Z	 ddl
mZ ddlmZ ddlmZ dZd	Zd
„ Z G d„ d¦  «        Z G d„ de¦  «        ZdS )zJPersistent, shared Markdown skills exposed through ordinary MCP resources.é    N)ÚPath)ÚFileLock)ÚFastMCP)ÚReadResourceContents©ÚResourcezwangp://skills/user/i   c                 óŽ  — t          j        d| t           j        ¬¦  «        }|�|d                              ¦   «         st	          d¦  «        ‚	 t          j        |d         ¦  «        }n*# t
          j        $ r}t	          d|› �¦  «        |‚d }~ww xY wt          |t          ¦  «        r| 
                    d¦  «        |k    rt	          d¦  «        ‚| 
                    d	¦  «        }t          |t          ¦  «        r'|                     ¦   «         rt          |¦  «        d
k    rt	          d¦  «        ‚||                     ¦   «         dœS )Nz---\r?\n(.*?)\r?\n---\r?\n(.+))Úflagsé   zOA skill needs YAML front matter between --- lines and a nonempty Markdown body.é   zInvalid skill front matter: ÚnamezISkill front matter must contain name matching the skill's directory name.Údescriptioni   zCSkill description must be nonempty text of at most 1024 characters.)r   r   )ÚreÚ	fullmatchÚDOTALLÚstripÚ
ValueErrorÚyamlÚ	safe_loadÚ	YAMLErrorÚ
isinstanceÚdictÚgetÚstrÚlen)Úcontentr   ÚmatchÚmetadataÚexcr   s         ú9C:\Users\johnn\OneDrive\Documents\AI\shared\mcp\skills.pyÚskill_metadatar!      sF  € ÝŒLÐ:¸GÍ2Ì9ÐUÑUÔU€EØ€}˜E !œHŸNšNÑ,Ô,€}ÝÐjÑkÔkÐkðHÝ”> %¨¤(Ñ+Ô+ˆˆøÝŒ>ð Hð Hð HÝÐ=¸Ð=Ð=Ñ>Ô>ÀCÐGøøøøðHøøøå�h¥Ñ%Ô%ð f¨¯ª°fÑ)=Ô)=ÀÒ)EÐ)EÝÐdÑeÔeÐeØ—,’,˜}Ñ-Ô-€KÝ�k¥3Ñ'Ô'ð `¨{×/@Ò/@Ñ/BÔ/Bð `ÅcÈ+ÑFVÔFVÐY]ÒF]ÐF]ÝÐ^Ñ_Ô_Ð_Ø¨×):Ò):Ñ)<Ô)<Ð=Ð=Ð=s   ÁA) Á)BÁ8BÂBc                   óB   — e Zd Zd„ Zd„ Zd„ Zd
dedededz  fd„Zd	„ ZdS )Ú
SkillStorec                 ó¨   — t          |¦  «                             ¦   «         | _        t          t	          | j        dz  ¦  «        d¬¦  «        | _        d S )Nz.write.locké
   )Útimeout)r   ÚresolveÚrootr   r   Ú_lock)Úselfr(   s     r    Ú__init__zSkillStore.__init__$   sB   € Ý˜‘J”J×&Ò&Ñ(Ô(ˆŒ	Ý�c $¤)¨mÑ";Ñ<Ô<ÀbÐIÑIÔIˆŒ
ˆ
ˆ
ó    c                 óF  — t          |¦  «        dk    s6t          j        d|¦  «        �!t          |¦  «                             ¦   «         rt          d¦  «        ‚| j        |z  dz                       ¦   «         }|                     | j        ¦  «        st          d¦  «        ‚|S )Né@   z[a-z0-9]+(?:-[a-z0-9]+)*z_Skill name must be a lowercase hyphenated name, at most 64 characters, not a reserved filename.zSKILL.mdz6Skill path must stay inside the user-skills directory.)	r   r   r   r   Úis_reservedr   r(   r'   Úis_relative_to)r*   r   Úpaths      r    r1   zSkillStore.path(   s—   € Ýˆt‰9Œ9�rŠ>ˆ>�Rœ\Ð*EÀtÑLÔLÐTÕX\Ð]aÑXbÔXb×XnÒXnÑXpÔXpÐTÝÐ~ÑÔÐØ”	˜DÑ  :Ñ-×6Ò6Ñ8Ô8ˆØ×"Ò" 4¤9Ñ-Ô-ð 	WÝÐUÑVÔVÐVØˆr,   c                 óþ  — |                       |¦  «        }| j        5  |                     d¦  «        5 }|                     t          dz   ¦  «        }d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   t          |¦  «        t          k    rt          d¦  «        ‚|                     d¦  «        }i t          ||¦  «        ¥t          |z   t          j        |¦  «                             ¦   «         |dœ¥S )NÚrbr   úA skill cannot exceed 128 KiB.úutf-8)ÚuriÚrevisionr   )r1   r)   ÚopenÚreadÚMAX_SKILL_BYTESr   r   Údecoder!   ÚUSER_SKILL_PREFIXÚhashlibÚsha256Ú	hexdigest)r*   r   r1   ÚreaderÚdatar   s         r    r9   zSkillStore.read0   ss  € Ø�yŠy˜‰ŒˆØŒZð 	8ð 	8Ø—’˜4‘”ð 8 FØ—{’{¥?°QÑ#6Ñ7Ô7�ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8õ ˆt‰9Œ9•Ò&Ð&ÝÐ=Ñ>Ô>Ð>Ø—+’+˜gÑ&Ô&ˆð T•. ¨$Ñ/Ô/ð  TÕ8IÈDÑ8PÕ^eÔ^lÐmqÑ^rÔ^r×^|Ò^|Ñ^~Ô^~ð  LSð  Tð  Tð  Tð  	Ts4   �A4³AÁA4ÁA!	Á!A4Á$A!	Á%A4Á4A8Á;A8Nr   r   Úexpected_revisionc                 ó¨  — |                       |¦  «        }t          ||¦  «        }|                     d¦  «        }t          |¦  «        t          k    rt          d¦  «        ‚| j                             dd¬¦  «         | j        5  | 	                    ¦   «         r|  
                    |¦  «        d         nd }||k    rt          d¦  «        ‚|j                             dd¬¦  «         t          j        dd|j        ¬	¦  «        \  }}		 t          j        |d
¦  «        5 }
|
                     |¦  «         |
                     ¦   «          t          j        |
                     ¦   «         ¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        |	|¦  «         t          j          	                    |	¦  «        rt          j        |	¦  «         n9# t          j          	                    |	¦  «        rt          j        |	¦  «         w w xY wd d d ¦  «         n# 1 swxY w Y   ddi|¥t,          |z   t/          j        |¦  «                             ¦   «         dœ¥S )Nr5   r4   T)ÚparentsÚexist_okr7   z‘Skill revision conflict. Read the skill with mcp_resource, then update using its revision; omit expected_revision only when creating a new skill.z.skill-z.tmp)ÚprefixÚsuffixÚdirÚwbÚstatusÚdone)r6   r7   )r1   r!   Úencoder   r:   r   r(   Úmkdirr)   Úexistsr9   ÚparentÚtempfileÚmkstempÚosÚfdopenÚwriteÚflushÚfsyncÚfilenoÚreplaceÚunlinkr<   r=   r>   r?   )r*   r   r   rB   r1   r   rA   r7   ÚfdÚ	temporaryÚwriters              r    ÚsavezSkillStore.save:   s™  € Ø�yŠy˜‰ŒˆÝ! '¨4Ñ0Ô0ˆØ�~Š~˜gÑ&Ô&ˆÝˆt‰9Œ9•Ò&Ð&ÝÐ=Ñ>Ô>Ð>ØŒ	�Š ¨tˆÑ4Ô4Ð4ØŒZð 	)ð 	)Ø6:·k²k±m´mÐM�t—y’y ‘” zÔ2Ð2ÈˆHØ  HÒ,Ð,Ý ð  "uñ  vô  vð  vØŒK×Ò d°TÐÑ:Ô:Ð:Ý$Ô,°IÀfÐRVÔR]Ð^Ñ^Ô^‰MˆB�	ð)Ý”Y˜r 4Ñ(Ô(ð .¨FØ—L’L Ñ&Ô&Ð&Ø—L’L‘N”N�NÝ”H˜VŸ]š]™_œ_Ñ-Ô-Ð-ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .õ ”
˜9 dÑ+Ô+Ð+å”7—>’> )Ñ,Ô,ð )Ý”I˜iÑ(Ô(Ð(øøõ ”7—>’> )Ñ,Ô,ð )Ý”I˜iÑ(Ô(Ð(Ð(ð)øøøð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð ˜&Ð| HÐ|Õ5FÈÑ5MÕ[bÔ[iÐjnÑ[oÔ[o×[yÒ[yÑ[{Ô[{Ð|Ð|Ð|Ð|sP   ÂBHÄGÄAE9Å-GÅ9E=	Å=GÆ E=	ÆGÆ4HÇ6HÈHÈHÈHc                 ó‚   ‡ — ˆ fd„t          ‰ j                             d¦  «        ¦  «        D ¦   «         }d„ |D ¦   «         S )Nc              3   óV   •K  — | ]#}‰                      |j        j        ¦  «        V — Œ$d S ©N)r9   rO   r   )Ú.0r1   r*   s     €r    ú	<genexpr>z'SkillStore.resources.<locals>.<genexpr>S   s4   øè è € Ð`Ð`°4�4—9’9˜Tœ[Ô-Ñ.Ô.Ð`Ð`Ð`Ð`Ð`Ð`r,   z
*/SKILL.mdc                 óX   — g | ]'}t          |d          |d         |d         d¬¦  «        ‘Œ(S )r6   r   r   útext/markdown)r6   r   r   ÚmimeTyper   )ra   Úitems     r    ú
<listcomp>z(SkillStore.resources.<locals>.<listcomp>T   sN   € ð  Mð  Mð  Mð  }A•˜T %œ[¨t°F¬|ÈÈmÔI\ÐgvÐwÑwÔwð  Mð  Mð  Mr,   )Úsortedr(   Úglob)r*   Úrecordss   ` r    Ú	resourceszSkillStore.resourcesR   s^   ø€ Ø`Ð`Ð`Ð`½6À$Ä)Ç.Â.ÐQ]ÑB^ÔB^Ñ;_Ô;_Ð`Ñ`Ô`ˆð Mð  Mð  ELð  Mñ  Mô  Mð  	Mr,   r`   )	Ú__name__Ú
__module__Ú__qualname__r+   r1   r9   r   r]   rk   © r,   r    r#   r#   #   s•   € € € € € ðJð Jð Jðð ð ðTð Tð Tð}ð }˜ð } sð }¸sÀT¹zð }ð }ð }ð }ð0Mð Mð Mð Mð Mr,   r#   c                   ó2   ‡ — e Zd Zˆ fd„Zˆ fd„Zˆ fd„Zˆ xZS )ÚSkillMCPc                ób   •— t          |¦  «        | _         t          ¦   «         j        |i |¤Ž d S r`   )r#   ÚskillsÚsuperr+   )r*   Úskills_rootÚargsÚkwargsÚ	__class__s       €r    r+   zSkillMCP.__init__X   s4   ø€ Ý  Ñ-Ô-ˆŒØ�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ð)Ð)r,   c              ƒ   óŠ   •K  — g t          ¦   «                              ¦   «         ƒ d {V —†¢| j                             ¦   «         ¢S r`   )rt   Úlist_resourcesrs   rk   )r*   rx   s    €r    rz   zSkillMCP.list_resources\   sG   øè è € ØJ•u‘w”w×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/ÐJ°$´+×2GÒ2GÑ2IÔ2IÐJÐJr,   c              ƒ   óh  •K  — t          |¦  «                             t          ¦  «        rb| j                             t          |¦  «        t          t          ¦  «        d …         ¦  «        }t          |d         dd|d         i¬¦  «        gS t          ¦   «                              |¦  «        ƒ d {V —†S )Nr   rd   r7   )r   Ú	mime_typeÚmeta)	r   Ú
startswithr<   rs   r9   r   r   rt   Úread_resource)r*   r6   Úrecordrx   s      €r    r   zSkillMCP.read_resource_   sÃ   øè è € Ýˆs‰8Œ8×ÒÕ0Ñ1Ô1ð 	GØ”[×%Ò%¥c¨#¡h¤h­sÕ3DÑ/EÔ/EÐ/FÐ/FÔ&GÑHÔHˆFÝ(°¸	Ô1BÈoÐeoÐqwð  yCô  rDð  eEð  Fñ  Fô  Fð  Gð  GÝ‘W”W×*Ò*¨3Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/r,   )rl   rm   rn   r+   rz   r   Ú__classcell__)rx   s   @r    rq   rq   W   so   ø€ € € € € ð*ð *ð *ð *ð *ðKð Kð Kð Kð Kð0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0r,   rq   )Ú__doc__r=   rR   r   rP   Úpathlibr   r   Úfilelockr   Úmcp.server.fastmcpr   Ú mcp.server.lowlevel.helper_typesr   Ú	mcp.typesr   r<   r:   r!   r#   rq   ro   r,   r    ú<module>rˆ      s  ðà PÐ PØ €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð à €€€Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ø AÐ AÐ AÐ AÐ AÐ AØ Ð Ð Ð Ð Ð à*Ð Ø€ð>ð >ð >ð 1Mð 1Mð 1Mð 1Mð 1Mñ 1Mô 1Mð 1Mðh0ð 0ð 0ð 0ð 0ˆwñ 0ô 0ð 0ð 0ð 0r,   