Files
ezra-environment/tools/__pycache__/skill_validator.cpython-312.pyc

45 lines
14 KiB
Plaintext
Raw Normal View History

<EFBFBD>
<00>5<EFBFBD>i<EFBFBD>!<00><00><><00>dZddlZddlZddlmZddlmZGd<05>d<06>ZGd<07>d<08>Ze d k(r/e<08>Z
e
j<00>Z e e
je <0C><00>yy)
z<EFBFBD>
Skill validation framework for Ezra.
Validates SKILL.md files for completeness, structure, and quality.
Epic: EZRA-SELF-001 / Phase 3 - Skill System Enhancement
Author: Ezra (self-improvement)
<EFBFBD>N)<01>Path)<01>Optionalc<00>,<00>eZdZdZddededefd<05>Zd<06>Zy) <09>SkillValidationErrorzA single validation finding.<2E>level<65>message<67>fieldc<00>.<00>||_||_||_y<00>N)rrr )<04>selfrrr s <20>4/root/wizards/ezra/tests/../tools/skill_validator.py<70>__init__zSkillValidationError.__init__s<00><00><1A><04>
<EFBFBD><1E><04> <0C><1A><04>
<EFBFBD>c<00><><00>dddd<04>j|jd<05>}|jrd|j<00>d<07>nd}|<01>d |j<00>|<02>d
|j<00><00>S) N<>❌uu)<03>ERROR<4F>WARNING<4E>INFO<46>?z [<5B>]<5D><00> z: )<04>getrr r)r <00>prefix<69> field_strs r <00>__repr__zSkillValidationError.__repr__s]<00><00> <20>X<EFBFBD>x<EFBFBD>H<>L<>L<>T<EFBFBD>Z<EFBFBD>Z<EFBFBD>Y\<5C>]<5D><06>*.<2E>*<2A>*<2A>b<EFBFBD><14><1A><1A> <0C>A<EFBFBD>&<26>"<22> <09><18><18><11>4<EFBFBD>:<3A>:<3A>,<2C>y<EFBFBD>k<EFBFBD><12>D<EFBFBD>L<EFBFBD>L<EFBFBD>><3E>B<>BrN)r)<07>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__<5F>strrr<00>rr rrs%<00><00>&<26><1B>c<EFBFBD><1B>C<EFBFBD><1B><03><1B>
Crrc<00><><00>eZdZdZgd<02>ZddgZddgZddgZd <09>Zd
e d e
e fd <0C>Z d e d efd<0E>Zd e d e fd<0F>Zdefd<11>Zde fd<13>Zde fd<15>Zdde d efd<18>Zded e fd<1A>Zy)<1C>SkillValidatorz5Validate SKILL.md files for quality and completeness.)<03>name<6D> description<6F>version<6F>author<6F>tags<67>trigger<65>steps<70>pitfalls<6C> verificationc<00><00>g|_yr )<01>errors)r s r rzSkillValidator.__init__%s <00><00><18><04> r<00>path<74>returnc<00>*<00>g|_t|<01>}|j<00>s5|jjt dd|<01><00>d<03><00>|jS|j <00>}|j <00>s2|jjt ddd<03><00>|jS|j|<02>}|j|<03>|j|<02>}|j|<04>|j|j<00>|jS)z Validate a single SKILL.md file.rzFile not found: <20>filez File is empty) r/r<00>exists<74>appendr<00> read_text<78>strip<69>_parse_frontmatter<65>_validate_frontmatter<65> _extract_body<64>_validate_body<64>_validate_directory<72>parent)r r0<00>content<6E> frontmatter<65>bodys r <00> validate_filezSkillValidator.validate_file(s<><00><00><18><04> <0B><13>D<EFBFBD>z<EFBFBD><04><13>{<7B>{<7B>}<7D> <10>K<EFBFBD>K<EFBFBD> <1E> <1E>3<>G<EFBFBD>?O<>PT<50>v<EFBFBD>=V<>X^<5E>_<> `<60><17>;<3B>;<3B> <1E><16>.<2E>.<2E>"<22><07><16>}<7D>}<7D><EFBFBD> <10>K<EFBFBD>K<EFBFBD> <1E> <1E>3<>G<EFBFBD>_<EFBFBD>f<EFBFBD>U<> V<><17>;<3B>;<3B> <1E><1B>-<2D>-<2D>g<EFBFBD>6<> <0B> <0C>"<22>"<22>;<3B>/<2F><14>!<21>!<21>'<27>*<2A><04> <0C><1B><1B>D<EFBFBD>!<21> <0A> <20> <20><14><1B><1B>-<2D><13>{<7B>{<7B>rr>c<00><><00>tjd|tj<00>}|s(|jj t ddd<04><00>iS t j|jd<05><00>}t|t<00>r|SiS#t j$r5}|jj t dd|<04><00>d<04><00>icYd}~Sd}~wwxYw)zExtract YAML frontmatter.z^---\s*\n(.*?)\n---rz/No YAML frontmatter found (must start with ---)r?<00>zInvalid YAML: N) <0C>re<72>match<63>DOTALLr/r5r<00>yaml<6D> safe_load<61>group<75>
isinstance<EFBFBD>dict<63> YAMLError)r r>rE<00>data<74>es r r8z!SkillValidator._parse_frontmatterCs<><00><00><12><08><08>/<2F><17>"<22>)<29>)<29>D<><05><14> <10>K<EFBFBD>K<EFBFBD> <1E> <1E>3<>G<EFBFBD>=n<>p}<7D>~<7E> <><15>I<EFBFBD> <16><17>><3E>><3E>%<25>+<2B>+<2B>a<EFBFBD>.<2E>1<>D<EFBFBD>%<25>d<EFBFBD>D<EFBFBD>1<>4<EFBFBD> 9<>r<EFBFBD> 9<><39><13>~<7E>~<7E> <16> <10>K<EFBFBD>K<EFBFBD> <1E> <1E>3<>G<EFBFBD>~<7E>a<EFBFBD>S<EFBFBD>=Q<>S`<60>a<> b<><15>I<EFBFBD><49> <16>s$<00>5B <00>B <00> C<03>*C <03>C<03> Cc<00>v<00>tjd|tj<00>}|r|jd<02>S|S)z(Extract markdown body after frontmatter.z^---\s*\n.*?\n---\s*\n(.*)rC)rDrErFrI)r r>rEs r r:zSkillValidator._extract_bodyPs.<00><00><12><08><08>6<><07><12><19><19>K<><05>!&<26>u<EFBFBD>{<7B>{<7B>1<EFBFBD>~<7E>3<>G<EFBFBD>3r<00>fmc <00>4<00>|jD]_}||vr*|jjtdd|<02><00>d<03><00><00>1||r<01>7|jjtdd|<02><00>d<03><00><00>a|jD]0}||vs<01>|jjtdd|<02><00>d<03><00><00>2d|vr<>t |d<00>}t jd|<03>s*|jjtdd |<03>d
<EFBFBD>d<03><00>t|<03>d kDr3|jjtdd t|<03><00>d <0A>d<03><00>d|vr{|drvt |d<00>}t|<04>dkr&|jjtddd<03><00>t|<04>dkDr&|jjtddd<03><00>d|vrU|drOt |d<00>}t jd|<05>s*|jjtdd|<05><00>d<03><00>yyyy)zValidate frontmatter fields.rzMissing required field: r?zEmpty required field: rzMissing recommended field: r%z^[a-z0-9][a-z0-9_-]*$zInvalid name 'z&': use lowercase, hyphens, underscores<65>@zName too long (z chars, max 64)r&<00>
z"Description too short (< 10 chars)<29><>z#Description very long (> 200 chars)r'z^\d+\.\d+(\.\d+)?$zNon-semver version: N) <09>REQUIRED_FRONTMATTERr/r5r<00>RECOMMENDED_FRONTMATTERr!rDrE<00>len)r rPr r%<00>desc<73>vers r r9z$SkillValidator._validate_frontmatterUs<00><00><19>.<2E>.<2E> s<01>E<EFBFBD><14>B<EFBFBD><EFBFBD><14> <0B> <0B>"<22>"<22>#7<><07>C[<5B>\a<>[b<>Ac<41>er<65>#s<>t<><17><05>Y<EFBFBD><14> <0B> <0B>"<22>"<22>#7<><07>CY<43>Z_<5A>Y`<60>Aa<41>cp<63>#q<>r<>  s<01> <1A>1<>1<> z<01>E<EFBFBD><14>B<EFBFBD><EFBFBD><14> <0B> <0B>"<22>"<22>#7<> <09>E`<60>af<61>`g<>Ch<43>jw<6A>#x<>y<> z<01>
<12>R<EFBFBD><<3C><16>r<EFBFBD>&<26>z<EFBFBD>?<3F>D<EFBFBD><15>8<EFBFBD>8<EFBFBD>4<>d<EFBFBD>;<3B><14> <0B> <0B>"<22>"<22>#7<><07>><3E>RV<52>QW<51>W}<7D>A~<7E>AN<02>$O<02>P<02><12>4<EFBFBD>y<EFBFBD>2<EFBFBD>~<7E><14> <0B> <0B>"<22>"<22>#7<><07>?<3F>SV<53>W[<5B>S\<5C>R]<5D>]l<>Am<41>o|<7C>#}<7D>~<7E> <19>B<EFBFBD> <1E>2<EFBFBD>m<EFBFBD>#4<><16>r<EFBFBD>-<2D>(<28>)<29>D<EFBFBD><12>4<EFBFBD>y<EFBFBD>2<EFBFBD>~<7E><14> <0B> <0B>"<22>"<22>#7<> <09>Cg<43>iv<69>#w<>x<><12>4<EFBFBD>y<EFBFBD>3<EFBFBD><EFBFBD><14> <0B> <0B>"<22>"<22>#7<> <09>Ch<43>jw<6A>#x<>y<> <15><02>?<3F>r<EFBFBD>)<29>}<7D><15>b<EFBFBD><19>m<EFBFBD>$<24>C<EFBFBD><15>8<EFBFBD>8<EFBFBD>1<>3<EFBFBD>7<><14> <0B> <0B>"<22>"<22>#7<> <09>EY<45>Z]<5D>Y^<5E>C_<43>an<61>#o<>p<>8<> -<2D>?rr@c<00>^<00> <0B>tjd|tj<00>}|D<00>cgc] }|j<00>j <00><00><02>"}}|j
D]B<00> t <00> fd<02>|D<00><00>}|r<01>|jjtdd<04> <0B><00>d<05><00><00>D|jD]B<00> t <00> fd<06>|D<00><00>}|r<01>|jjtdd<08> <0B><00>d<05><00><00>Dtjd |tjtjz<00>}|rj|jd
<EFBFBD>}tjd |tj<00>}t|<08>d kr&|jjtdd d<05><00>tjd|<01>} t| <09>d kr&|jjtddd<05><00>t|j!<00><00>}
|
dkr+|jjtdd|
<EFBFBD>d<13>d<05><00>yycc}w)z!Validate markdown body structure.z ^#+\s+(.+)$c3<00>B<00>K<00>|]}<01>j<00>|v<00><01><00>y<00>wr <00><01>lower<65><03>.0<EFBFBD>h<>sections <20>r <00> <genexpr>z0SkillValidator._validate_body.<locals>.<genexpr>}<00><00><><00><><00>D<><11><07> <0A> <0A><0F>1<EFBFBD>,<2C>D<><44><00>rzMissing required section: r@c3<00>B<00>K<00>|]}<01>j<00>|v<00><01><00>y<00>wr r\r^s <20>r rbz0SkillValidator._validate_body.<locals>.<genexpr><3E>rcrdrzMissing recommended section: zJ(?:^|\n)(?:#+\s+.*?(?:step|procedure|instructions).*?\n)(.*?)(?=\n#+\s|\Z)rCz^\d+\.<2E>z-Steps section has fewer than 2 numbered itemsz```ru1No code blocks found — consider adding examples<65>2zVery short body (z words)N)rD<00>findall<6C> MULTILINEr]r7<00>REQUIRED_SECTIONS<4E>anyr/r5r<00>RECOMMENDED_SECTIONS<4E>search<63>
IGNORECASErFrIrW<00>split) r r@<00>headersr`<00> headers_lower<65>found<6E> steps_match<63> steps_content<6E>numbered<65> code_blocks<6B>
word_countras @r r;zSkillValidator._validate_bodyws<><00><><00><14>*<2A>*<2A>^<5E>T<EFBFBD>2<EFBFBD><<3C><<3C>@<40><07>4;<3B><<3C>q<EFBFBD><11><17><17><19><1F><1F>*<2A><<3C> <0A><<3C><1B>-<2D>-<2D> r<01>G<EFBFBD><17>D<>m<EFBFBD>D<>D<>E<EFBFBD><18><14> <0B> <0B>"<22>"<22>#7<><07>C]<5D>^e<>]f<>Ag<41>io<69>#p<>q<> r<01>
<1C>0<>0<> w<01>G<EFBFBD><17>D<>m<EFBFBD>D<>D<>E<EFBFBD><18><14> <0B> <0B>"<22>"<22>#7<> <09>Eb<45>cj<63>bk<62>Cl<43>nt<6E>#u<>v<> w<01> <19>i<EFBFBD>i<EFBFBD> m<>os<6F>uw<75>vC<02>vC<02>FH<02>FO<02>FO<02>vO<02>P<02> <0B> <16>'<27>-<2D>-<2D>a<EFBFBD>0<>M<EFBFBD><19>z<EFBFBD>z<EFBFBD>)<29>]<5D>B<EFBFBD>L<EFBFBD>L<EFBFBD>I<>H<EFBFBD><12>8<EFBFBD>}<7D>q<EFBFBD> <20><14> <0B> <0B>"<22>"<22>#7<> <09>Cr<43>tz<74>#{<7B>|<7C><19>j<EFBFBD>j<EFBFBD><16><14>.<2E> <0B> <0E>{<7B> <1B>a<EFBFBD> <1F> <10>K<EFBFBD>K<EFBFBD> <1E> <1E>3<>F<EFBFBD><o<>qw<71>x<> y<><19><14><1A><1A><1C>&<26>
<EFBFBD> <15><02>?<3F> <10>K<EFBFBD>K<EFBFBD> <1E> <1E>3<>I<EFBFBD>AR<41>S]<5D>R^<5E>^e<>?f<>hn<68>o<> p<> <1B><>7=s<00>%H*<04> skill_dirc <00><><00>hd<01>}|j<00>D]V}|j<00>s<01>|j|vs<01>#|jj t dd|j<00>d<04>d<05><00><00>Xy)z#Validate skill directory structure.><00>assets<74>scripts<74> templates<65>
referencesrzNon-standard subdirectory: <20>/<2F> directoryN)<06>iterdir<69>is_dirr%r/r5r)r rx<00> valid_subdirs<72>childs r r<z"SkillValidator._validate_directory<72>se<00><00>H<> <0A><1E>&<26>&<26>(<28> ~<01>E<EFBFBD><14>|<7C>|<7C>~<7E>%<25>*<2A>*<2A>M<EFBFBD>"A<><14> <0B> <0B>"<22>"<22>#7<> <09>E`<60>af<61>ak<61>ak<61>`l<>lm<6C>Cn<43>p{<7B>#|<7C>}<7D> ~rN<> skills_rootc <00><00>t|xsd<01>}i}t|jd<02><00>D]<5D>}|jj}|j |<03>}t |<03>t|D<00>cgc]}|jdk(s<01>|<06><02>c}<06>t|D<00>cgc]}|jdk(s<01>|<06><02>c}<06>t|D<00>cgc]}|jdk(s<01>|<06><02>c}<06>|D<00>cgc] }t|<06><00><02>c}d<06>||<<00><>|Scc}wcc}wcc}wcc}w)z+Validate all skills under a root directory.z/root/wizards/ezra/home/skillszSKILL.mdrrr)r0r/<00>warnings<67>info<66>findings)
r<00>sorted<65>rglobr=r%rAr!rWr<00>repr)r r<><00>results<74>skill_md<6D>
skill_namer/rNs r <00> validate_allzSkillValidator.validate_all<6C>s<><00><00><1A>;<3B>J<>*J<>K<> <0B><14><07><1E>{<7B>0<>0<><1A><<3C>=<3D> <0E>H<EFBFBD>!<21><1F><1F>-<2D>-<2D>J<EFBFBD><19>'<27>'<27><08>1<>F<EFBFBD><1B>H<EFBFBD> <0A><1D>&<26>G<>Q<EFBFBD>A<EFBFBD>G<EFBFBD>G<EFBFBD>w<EFBFBD>4F<34>q<EFBFBD>G<>H<><1F>F<EFBFBD> K<>q<EFBFBD>a<EFBFBD>g<EFBFBD>g<EFBFBD><19>6J<36><11> K<>L<><1B><06>D<>1<EFBFBD>!<21>'<27>'<27>V<EFBFBD>2C<32>Q<EFBFBD>D<>E<>.4<EFBFBD>5<><11>T<EFBFBD>!<21>W<EFBFBD>5<> #<0E>G<EFBFBD>J<EFBFBD> <1F> <0E><17><0E><> H<01><> K<><4B>D<><44>5s*<00>)C: <0C>>C: <0C>C?<0E>&C?<0E>9D<10>D<10>D r<>c<00>8<00>ddt|<01><00><00>dg}td<04>|j<00>D<00><00>}td<05>|j<00>D<00><00>}|jd|<03>d|<04>d<08><05>|jd<03>t |j <00>d <09>d
<EFBFBD> <0B>}|D]n\}}|d d k(rdnd}|jd|<08>d|<06><00><04>|dr|dD]} |jd| <09><00><02><00>n|jd<14>|jd<03><00>pdj |<02>S)z&Format validation results as a report.z# Skill Validation Reportz**Skills scanned:** rc3<00>&K<00>|] }|d<00><01><00> y<01>w)r/Nr"<00>r_<00>rs r rbz/SkillValidator.format_report.<locals>.<genexpr><3E>s<00><00><><00>A<>1<EFBFBD>1<EFBFBD>X<EFBFBD>;<3B>A<><41><00>c3<00>&K<00>|] }|d<00><01><00> y<01>w)r<>Nr"r<>s r rbz/SkillValidator.format_report.<locals>.<genexpr><3E>s<00><00><><00>E<>q<EFBFBD>Q<EFBFBD>z<EFBFBD>]<5D>E<>r<EFBFBD>z **Total:** z errors, z warningsc<00>"<00>|dd|ddfS)NrCr/r<>r")<01>xs r <00><lambda>z.SkillValidator.format_report.<locals>.<lambda><3E>s <00><00><01>!<21><04>X<EFBFBD><0E>PQ<50>RS<52>PT<50>U_<55>P`<60>?a<>rT)<02>key<65>reverser/ru✅rz### rr<>z z No issues found<6E>
)rW<00>sum<75>valuesr5r<><00>items<6D>join)
r r<><00>lines<65> total_errors<72>total_warnings<67>sorted_resultsr%r<><00>icon<6F>fs
r <00> format_reportzSkillValidator.format_report<72>s%<00><00> (<28>"<22>3<EFBFBD>w<EFBFBD><<3C>.<2E> 1<> <0E>
<EFBFBD><05> <1B>A<><07><0E><0E>0@<40>A<>A<> <0C><1C>E<>G<EFBFBD>N<EFBFBD>N<EFBFBD>4D<34>E<>E<><0E> <0A> <0C> <0C>{<7B><<3C>.<2E> <09>.<2E>9I<39><19>S<>T<> <0A> <0C> <0C>R<EFBFBD><18> <20><07> <0A> <0A><0F>5a<35>ko<6B>p<><0E>%<25> <1D>G<EFBFBD>D<EFBFBD>!<21><1D>h<EFBFBD>K<EFBFBD>1<EFBFBD>,<2C>5<EFBFBD>%<25>D<EFBFBD> <11>L<EFBFBD>L<EFBFBD>4<EFBFBD><04>v<EFBFBD>Q<EFBFBD>t<EFBFBD>f<EFBFBD>-<2D> .<2E><10><1A>}<7D><1A>:<3A><1D>+<2B>A<EFBFBD><19>L<EFBFBD>L<EFBFBD>2<EFBFBD>a<EFBFBD>S<EFBFBD><18>*<2A>+<2B><16> <0C> <0C>0<>1<> <11>L<EFBFBD>L<EFBFBD><12> <1C> <1D><14>y<EFBFBD>y<EFBFBD><15><1F>rr )rrrr rUrVrjrlrr<00>listrrAr!rKr8r:r9r;r<r<>r<>r"rr r$r$s<><00><00>?<3F>=<3D><18>'<27><16>0<><1B>"<22>G<EFBFBD>,<2C><15>&<26><0E>7<><18><19><1B>$<24><1B>4<EFBFBD>0D<30>+E<><1B>6 <16>#<23> <16>$<24> <16>4<>S<EFBFBD>4<>S<EFBFBD>4<>
q<01><04> q<01>Dq<01>3<EFBFBD>q<01>B~<01>T<EFBFBD>~<01><17><04><17><04><17>  <20>T<EFBFBD> <20>c<EFBFBD> rr$<00>__main__)r rDrG<00>pathlibr<00>typingrrr$r<00>vr<76>r<><00>printr<74>r"rr <00><module>r<>se<00><01><04>
<EFBFBD> <0B><18><1B>
C<01>
C<01>m <20>m <20>` <0C>z<EFBFBD><19><16><18>A<EFBFBD><0F>n<EFBFBD>n<EFBFBD><1E>G<EFBFBD> <09>!<21>/<2F>/<2F>'<27>
"<22>#<23>r