vigiles 14.6.6 → 14.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit-report.d.ts +1 -1
- package/dist/audit-report.template.html +1 -1
- package/dist/audit-score.js +1 -1
- package/dist/audit-verdict.d.ts +1 -1
- package/dist/audit-verdict.js +2 -2
- package/dist/core/edit-distance.d.ts +12 -0
- package/dist/core/edit-distance.js +36 -0
- package/dist/core/hook-events.js +2 -2
- package/dist/core/linters.d.ts +2 -6
- package/dist/core/linters.js +4 -29
- package/dist/core/tool-contract.js +2 -2
- package/dist/egress.js +4 -2
- package/dist/leaderboard.js +1 -1
- package/dist/sandbox.js +4 -2
- package/package.json +6 -1
package/dist/audit-report.d.ts
CHANGED
|
@@ -91,7 +91,7 @@ export interface AuditReport {
|
|
|
91
91
|
/**
|
|
92
92
|
* The one-line verdict + per-recommendation `pointsIfFixed`, both derived by
|
|
93
93
|
* RE-SCORING (never a hardcoded number). Drives the report's verdict-led header
|
|
94
|
-
* ("Two
|
|
94
|
+
* ("Two fixes away from a B.") and the `+N pts` badges on fix cards.
|
|
95
95
|
* Pure/deterministic — always present.
|
|
96
96
|
*/
|
|
97
97
|
readonly verdict: Verdict;
|
|
@@ -148,7 +148,7 @@ Error generating stack: `+a.message+`
|
|
|
148
148
|
* This source code is licensed under the ISC license.
|
|
149
149
|
* See the LICENSE file in the root directory of this source tree.
|
|
150
150
|
*/const sg=Ft("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]);function im(f){var h,y,s="";if(typeof f=="string"||typeof f=="number")s+=f;else if(typeof f=="object")if(Array.isArray(f)){var x=f.length;for(h=0;h<x;h++)f[h]&&(y=im(f[h]))&&(s&&(s+=" "),s+=y)}else for(y in f)f[y]&&(s&&(s+=" "),s+=y);return s}function cm(){for(var f,h,y=0,s="",x=arguments.length;y<x;y++)(f=arguments[y])&&(h=im(f))&&(s&&(s+=" "),s+=h);return s}const Bf="-",og=f=>{const h=dg(f),{conflictingClassGroups:y,conflictingClassGroupModifiers:s}=f;return{getClassGroupId:U=>{const O=U.split(Bf);return O[0]===""&&O.length!==1&&O.shift(),fm(O,h)||rg(U)},getConflictingClassGroupIds:(U,O)=>{const _=y[U]||[];return O&&s[U]?[..._,...s[U]]:_}}},fm=(f,h)=>{var U;if(f.length===0)return h.classGroupId;const y=f[0],s=h.nextPart.get(y),x=s?fm(f.slice(1),s):void 0;if(x)return x;if(h.validators.length===0)return;const T=f.join(Bf);return(U=h.validators.find(({validator:O})=>O(T)))==null?void 0:U.classGroupId},Wd=/^\[(.+)\]$/,rg=f=>{if(Wd.test(f)){const h=Wd.exec(f)[1],y=h==null?void 0:h.substring(0,h.indexOf(":"));if(y)return"arbitrary.."+y}},dg=f=>{const{theme:h,prefix:y}=f,s={nextPart:new Map,validators:[]};return hg(Object.entries(f.classGroups),y).forEach(([T,U])=>{Df(U,s,T,h)}),s},Df=(f,h,y,s)=>{f.forEach(x=>{if(typeof x=="string"){const T=x===""?h:Fd(h,x);T.classGroupId=y;return}if(typeof x=="function"){if(mg(x)){Df(x(s),h,y,s);return}h.validators.push({validator:x,classGroupId:y});return}Object.entries(x).forEach(([T,U])=>{Df(U,Fd(h,T),y,s)})})},Fd=(f,h)=>{let y=f;return h.split(Bf).forEach(s=>{y.nextPart.has(s)||y.nextPart.set(s,{nextPart:new Map,validators:[]}),y=y.nextPart.get(s)}),y},mg=f=>f.isThemeGetter,hg=(f,h)=>h?f.map(([y,s])=>{const x=s.map(T=>typeof T=="string"?h+T:typeof T=="object"?Object.fromEntries(Object.entries(T).map(([U,O])=>[h+U,O])):T);return[y,x]}):f,yg=f=>{if(f<1)return{get:()=>{},set:()=>{}};let h=0,y=new Map,s=new Map;const x=(T,U)=>{y.set(T,U),h++,h>f&&(h=0,s=y,y=new Map)};return{get(T){let U=y.get(T);if(U!==void 0)return U;if((U=s.get(T))!==void 0)return x(T,U),U},set(T,U){y.has(T)?y.set(T,U):x(T,U)}}},sm="!",gg=f=>{const{separator:h,experimentalParseClassName:y}=f,s=h.length===1,x=h[0],T=h.length,U=O=>{const _=[];let z=0,B=0,R;for(let Q=0;Q<O.length;Q++){let w=O[Q];if(z===0){if(w===x&&(s||O.slice(Q,Q+T)===h)){_.push(O.slice(B,Q)),B=Q+T;continue}if(w==="/"){R=Q;continue}}w==="["?z++:w==="]"&&z--}const L=_.length===0?O:O.substring(B),yt=L.startsWith(sm),ot=yt?L.substring(1):L,W=R&&R>B?R-B:void 0;return{modifiers:_,hasImportantModifier:yt,baseClassName:ot,maybePostfixModifierPosition:W}};return y?O=>y({className:O,parseClassName:U}):U},vg=f=>{if(f.length<=1)return f;const h=[];let y=[];return f.forEach(s=>{s[0]==="["?(h.push(...y.sort(),s),y=[]):y.push(s)}),h.push(...y.sort()),h},bg=f=>({cache:yg(f.cacheSize),parseClassName:gg(f),...og(f)}),pg=/\s+/,xg=(f,h)=>{const{parseClassName:y,getClassGroupId:s,getConflictingClassGroupIds:x}=h,T=[],U=f.trim().split(pg);let O="";for(let _=U.length-1;_>=0;_-=1){const z=U[_],{modifiers:B,hasImportantModifier:R,baseClassName:L,maybePostfixModifierPosition:yt}=y(z);let ot=!!yt,W=s(ot?L.substring(0,yt):L);if(!W){if(!ot){O=z+(O.length>0?" "+O:O);continue}if(W=s(L),!W){O=z+(O.length>0?" "+O:O);continue}ot=!1}const Q=vg(B).join(":"),w=R?Q+sm:Q,xt=w+W;if(T.includes(xt))continue;T.push(xt);const Nt=x(W,ot);for(let Dt=0;Dt<Nt.length;++Dt){const kt=Nt[Dt];T.push(w+kt)}O=z+(O.length>0?" "+O:O)}return O};function Sg(){let f=0,h,y,s="";for(;f<arguments.length;)(h=arguments[f++])&&(y=om(h))&&(s&&(s+=" "),s+=y);return s}const om=f=>{if(typeof f=="string")return f;let h,y="";for(let s=0;s<f.length;s++)f[s]&&(h=om(f[s]))&&(y&&(y+=" "),y+=h);return y};function zg(f,...h){let y,s,x,T=U;function U(_){const z=h.reduce((B,R)=>R(B),f());return y=bg(z),s=y.cache.get,x=y.cache.set,T=O,O(_)}function O(_){const z=s(_);if(z)return z;const B=xg(_,y);return x(_,B),B}return function(){return T(Sg.apply(null,arguments))}}const Et=f=>{const h=y=>y[f]||[];return h.isThemeGetter=!0,h},rm=/^\[(?:([a-z-]+):)?(.+)\]$/i,Ag=/^\d+\/\d+$/,Eg=new Set(["px","full","screen"]),Tg=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Ng=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,jg=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Mg=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,_g=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,nl=f=>Ha(f)||Eg.has(f)||Ag.test(f),Ol=f=>qa(f,"length",Bg),Ha=f=>!!f&&!Number.isNaN(Number(f)),_f=f=>qa(f,"number",Ha),Un=f=>!!f&&Number.isInteger(Number(f)),Og=f=>f.endsWith("%")&&Ha(f.slice(0,-1)),$=f=>rm.test(f),Cl=f=>Tg.test(f),Cg=new Set(["length","size","percentage"]),Dg=f=>qa(f,Cg,dm),Ug=f=>qa(f,"position",dm),Rg=new Set(["image","url"]),Hg=f=>qa(f,Rg,Gg),qg=f=>qa(f,"",Yg),Rn=()=>!0,qa=(f,h,y)=>{const s=rm.exec(f);return s?s[1]?typeof h=="string"?s[1]===h:h.has(s[1]):y(s[2]):!1},Bg=f=>Ng.test(f)&&!jg.test(f),dm=()=>!1,Yg=f=>Mg.test(f),Gg=f=>_g.test(f),Xg=()=>{const f=Et("colors"),h=Et("spacing"),y=Et("blur"),s=Et("brightness"),x=Et("borderColor"),T=Et("borderRadius"),U=Et("borderSpacing"),O=Et("borderWidth"),_=Et("contrast"),z=Et("grayscale"),B=Et("hueRotate"),R=Et("invert"),L=Et("gap"),yt=Et("gradientColorStops"),ot=Et("gradientColorStopPositions"),W=Et("inset"),Q=Et("margin"),w=Et("opacity"),xt=Et("padding"),Nt=Et("saturate"),Dt=Et("scale"),kt=Et("sepia"),Xt=Et("skew"),I=Et("space"),Qt=Et("translate"),It=()=>["auto","contain","none"],Ue=()=>["auto","hidden","clip","visible","scroll"],Pt=()=>["auto",$,h],F=()=>[$,h],Re=()=>["",nl,Ol],te=()=>["auto",Ha,$],ee=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],A=()=>["solid","dashed","dotted","double","none"],C=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],X=()=>["start","end","center","between","around","evenly","stretch"],ut=()=>["","0",$],rt=()=>["auto","avoid","all","avoid-page","page","left","right","column"],d=()=>[Ha,$];return{cacheSize:500,separator:":",theme:{colors:[Rn],spacing:[nl,Ol],blur:["none","",Cl,$],brightness:d(),borderColor:[f],borderRadius:["none","","full",Cl,$],borderSpacing:F(),borderWidth:Re(),contrast:d(),grayscale:ut(),hueRotate:d(),invert:ut(),gap:F(),gradientColorStops:[f],gradientColorStopPositions:[Og,Ol],inset:Pt(),margin:Pt(),opacity:d(),padding:F(),saturate:d(),scale:d(),sepia:ut(),skew:d(),space:F(),translate:F()},classGroups:{aspect:[{aspect:["auto","square","video",$]}],container:["container"],columns:[{columns:[Cl]}],"break-after":[{"break-after":rt()}],"break-before":[{"break-before":rt()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ee(),$]}],overflow:[{overflow:Ue()}],"overflow-x":[{"overflow-x":Ue()}],"overflow-y":[{"overflow-y":Ue()}],overscroll:[{overscroll:It()}],"overscroll-x":[{"overscroll-x":It()}],"overscroll-y":[{"overscroll-y":It()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[W]}],"inset-x":[{"inset-x":[W]}],"inset-y":[{"inset-y":[W]}],start:[{start:[W]}],end:[{end:[W]}],top:[{top:[W]}],right:[{right:[W]}],bottom:[{bottom:[W]}],left:[{left:[W]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Un,$]}],basis:[{basis:Pt()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",$]}],grow:[{grow:ut()}],shrink:[{shrink:ut()}],order:[{order:["first","last","none",Un,$]}],"grid-cols":[{"grid-cols":[Rn]}],"col-start-end":[{col:["auto",{span:["full",Un,$]},$]}],"col-start":[{"col-start":te()}],"col-end":[{"col-end":te()}],"grid-rows":[{"grid-rows":[Rn]}],"row-start-end":[{row:["auto",{span:[Un,$]},$]}],"row-start":[{"row-start":te()}],"row-end":[{"row-end":te()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",$]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",$]}],gap:[{gap:[L]}],"gap-x":[{"gap-x":[L]}],"gap-y":[{"gap-y":[L]}],"justify-content":[{justify:["normal",...X()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...X(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...X(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[xt]}],px:[{px:[xt]}],py:[{py:[xt]}],ps:[{ps:[xt]}],pe:[{pe:[xt]}],pt:[{pt:[xt]}],pr:[{pr:[xt]}],pb:[{pb:[xt]}],pl:[{pl:[xt]}],m:[{m:[Q]}],mx:[{mx:[Q]}],my:[{my:[Q]}],ms:[{ms:[Q]}],me:[{me:[Q]}],mt:[{mt:[Q]}],mr:[{mr:[Q]}],mb:[{mb:[Q]}],ml:[{ml:[Q]}],"space-x":[{"space-x":[I]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[I]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",$,h]}],"min-w":[{"min-w":[$,h,"min","max","fit"]}],"max-w":[{"max-w":[$,h,"none","full","min","max","fit","prose",{screen:[Cl]},Cl]}],h:[{h:[$,h,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[$,h,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[$,h,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[$,h,"auto","min","max","fit"]}],"font-size":[{text:["base",Cl,Ol]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",_f]}],"font-family":[{font:[Rn]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",$]}],"line-clamp":[{"line-clamp":["none",Ha,_f]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",nl,$]}],"list-image":[{"list-image":["none",$]}],"list-style-type":[{list:["none","disc","decimal",$]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[f]}],"placeholder-opacity":[{"placeholder-opacity":[w]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[f]}],"text-opacity":[{"text-opacity":[w]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...A(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",nl,Ol]}],"underline-offset":[{"underline-offset":["auto",nl,$]}],"text-decoration-color":[{decoration:[f]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:F()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",$]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",$]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[w]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ee(),Ug]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Dg]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Hg]}],"bg-color":[{bg:[f]}],"gradient-from-pos":[{from:[ot]}],"gradient-via-pos":[{via:[ot]}],"gradient-to-pos":[{to:[ot]}],"gradient-from":[{from:[yt]}],"gradient-via":[{via:[yt]}],"gradient-to":[{to:[yt]}],rounded:[{rounded:[T]}],"rounded-s":[{"rounded-s":[T]}],"rounded-e":[{"rounded-e":[T]}],"rounded-t":[{"rounded-t":[T]}],"rounded-r":[{"rounded-r":[T]}],"rounded-b":[{"rounded-b":[T]}],"rounded-l":[{"rounded-l":[T]}],"rounded-ss":[{"rounded-ss":[T]}],"rounded-se":[{"rounded-se":[T]}],"rounded-ee":[{"rounded-ee":[T]}],"rounded-es":[{"rounded-es":[T]}],"rounded-tl":[{"rounded-tl":[T]}],"rounded-tr":[{"rounded-tr":[T]}],"rounded-br":[{"rounded-br":[T]}],"rounded-bl":[{"rounded-bl":[T]}],"border-w":[{border:[O]}],"border-w-x":[{"border-x":[O]}],"border-w-y":[{"border-y":[O]}],"border-w-s":[{"border-s":[O]}],"border-w-e":[{"border-e":[O]}],"border-w-t":[{"border-t":[O]}],"border-w-r":[{"border-r":[O]}],"border-w-b":[{"border-b":[O]}],"border-w-l":[{"border-l":[O]}],"border-opacity":[{"border-opacity":[w]}],"border-style":[{border:[...A(),"hidden"]}],"divide-x":[{"divide-x":[O]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[O]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[w]}],"divide-style":[{divide:A()}],"border-color":[{border:[x]}],"border-color-x":[{"border-x":[x]}],"border-color-y":[{"border-y":[x]}],"border-color-s":[{"border-s":[x]}],"border-color-e":[{"border-e":[x]}],"border-color-t":[{"border-t":[x]}],"border-color-r":[{"border-r":[x]}],"border-color-b":[{"border-b":[x]}],"border-color-l":[{"border-l":[x]}],"divide-color":[{divide:[x]}],"outline-style":[{outline:["",...A()]}],"outline-offset":[{"outline-offset":[nl,$]}],"outline-w":[{outline:[nl,Ol]}],"outline-color":[{outline:[f]}],"ring-w":[{ring:Re()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[f]}],"ring-opacity":[{"ring-opacity":[w]}],"ring-offset-w":[{"ring-offset":[nl,Ol]}],"ring-offset-color":[{"ring-offset":[f]}],shadow:[{shadow:["","inner","none",Cl,qg]}],"shadow-color":[{shadow:[Rn]}],opacity:[{opacity:[w]}],"mix-blend":[{"mix-blend":[...C(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":C()}],filter:[{filter:["","none"]}],blur:[{blur:[y]}],brightness:[{brightness:[s]}],contrast:[{contrast:[_]}],"drop-shadow":[{"drop-shadow":["","none",Cl,$]}],grayscale:[{grayscale:[z]}],"hue-rotate":[{"hue-rotate":[B]}],invert:[{invert:[R]}],saturate:[{saturate:[Nt]}],sepia:[{sepia:[kt]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[y]}],"backdrop-brightness":[{"backdrop-brightness":[s]}],"backdrop-contrast":[{"backdrop-contrast":[_]}],"backdrop-grayscale":[{"backdrop-grayscale":[z]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[B]}],"backdrop-invert":[{"backdrop-invert":[R]}],"backdrop-opacity":[{"backdrop-opacity":[w]}],"backdrop-saturate":[{"backdrop-saturate":[Nt]}],"backdrop-sepia":[{"backdrop-sepia":[kt]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[U]}],"border-spacing-x":[{"border-spacing-x":[U]}],"border-spacing-y":[{"border-spacing-y":[U]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",$]}],duration:[{duration:d()}],ease:[{ease:["linear","in","out","in-out",$]}],delay:[{delay:d()}],animate:[{animate:["none","spin","ping","pulse","bounce",$]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[Dt]}],"scale-x":[{"scale-x":[Dt]}],"scale-y":[{"scale-y":[Dt]}],rotate:[{rotate:[Un,$]}],"translate-x":[{"translate-x":[Qt]}],"translate-y":[{"translate-y":[Qt]}],"skew-x":[{"skew-x":[Xt]}],"skew-y":[{"skew-y":[Xt]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",$]}],accent:[{accent:["auto",f]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",$]}],"caret-color":[{caret:[f]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":F()}],"scroll-mx":[{"scroll-mx":F()}],"scroll-my":[{"scroll-my":F()}],"scroll-ms":[{"scroll-ms":F()}],"scroll-me":[{"scroll-me":F()}],"scroll-mt":[{"scroll-mt":F()}],"scroll-mr":[{"scroll-mr":F()}],"scroll-mb":[{"scroll-mb":F()}],"scroll-ml":[{"scroll-ml":F()}],"scroll-p":[{"scroll-p":F()}],"scroll-px":[{"scroll-px":F()}],"scroll-py":[{"scroll-py":F()}],"scroll-ps":[{"scroll-ps":F()}],"scroll-pe":[{"scroll-pe":F()}],"scroll-pt":[{"scroll-pt":F()}],"scroll-pr":[{"scroll-pr":F()}],"scroll-pb":[{"scroll-pb":F()}],"scroll-pl":[{"scroll-pl":F()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",$]}],fill:[{fill:[f,"none"]}],"stroke-w":[{stroke:[nl,Ol,_f]}],stroke:[{stroke:[f,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},Qg=zg(Xg);function pt(...f){return Qg(cm(f))}function Ge({className:f,...h}){return o.jsx("div",{className:pt("rounded-lg border border-border bg-card text-foreground shadow-sm",f),...h})}const Id=f=>typeof f=="boolean"?`${f}`:f===0?"0":f,Pd=cm,Zg=(f,h)=>y=>{var s;if((h==null?void 0:h.variants)==null)return Pd(f,y==null?void 0:y.class,y==null?void 0:y.className);const{variants:x,defaultVariants:T}=h,U=Object.keys(x).map(z=>{const B=y==null?void 0:y[z],R=T==null?void 0:T[z];if(B===null)return null;const L=Id(B)||Id(R);return x[z][L]}),O=y&&Object.entries(y).reduce((z,B)=>{let[R,L]=B;return L===void 0||(z[R]=L),z},{}),_=h==null||(s=h.compoundVariants)===null||s===void 0?void 0:s.reduce((z,B)=>{let{class:R,className:L,...yt}=B;return Object.entries(yt).every(ot=>{let[W,Q]=ot;return Array.isArray(Q)?Q.includes({...T,...O}[W]):{...T,...O}[W]===Q})?[...z,R,L]:z},[]);return Pd(f,U,_,y==null?void 0:y.class,y==null?void 0:y.className)},Lg=Zg("inline-flex items-center rounded-md border px-2 py-0.5 text-xs font-semibold uppercase tracking-wide",{variants:{variant:{default:"border-border bg-background text-muted-foreground",outline:"border-border text-muted-foreground"}},defaultVariants:{variant:"default"}});function qn({className:f,variant:h,...y}){return o.jsx("span",{className:pt(Lg({variant:h}),f),...y})}function mm(f){return f===null?"na":f>=90?"good":f>=70?"warn":"bad"}const ft={good:"text-good",warn:"text-warn",bad:"text-bad",na:"text-na"},Hn={good:"bg-good",warn:"bg-warn",bad:"bg-bad",na:"bg-na"},ai={good:"border-l-good",warn:"border-l-warn",bad:"border-l-bad",na:"border-l-na"},Vg={good:"border-good",warn:"border-warn",bad:"border-bad",na:"border-na"},wg={enforce:"rule",file:"file",cmd:"cmd",dir:"dir"};function Kg({r:f}){return o.jsxs("div",{className:pt("border-l-4 p-3",ai.bad),children:[o.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[o.jsx(qn,{children:wg[f.kind]}),o.jsx("code",{className:"font-mono text-xs text-foreground",children:f.ref})]}),o.jsx("div",{className:"mt-0.5 text-xs text-muted-foreground",children:f.issue})]})}function Jg({data:f}){if(f.total===0)return o.jsxs(Ge,{className:"p-4 text-sm text-muted-foreground",children:["No machine-verifiable references found — add"," ",o.jsx("code",{className:"font-mono text-xs",children:"enforce()"})," calls to a"," ",o.jsx("code",{className:"font-mono text-xs",children:".spec.ts"})," to unlock cross-referencing."]});const h=f.broken===0;return o.jsxs(Ge,{className:"p-5",children:[o.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[o.jsxs("div",{className:"flex items-baseline gap-1.5",children:[o.jsx("span",{className:pt("text-3xl font-bold tabular-nums",h?ft.good:ft.bad),children:f.broken}),o.jsxs("span",{className:"text-sm text-muted-foreground",children:["/ ",f.total," broken"]})]}),h?o.jsxs("span",{className:pt("flex items-center gap-1 text-sm",ft.good),children:[o.jsx(Hf,{size:14})," all ",f.total," reference",f.total===1?"":"s"," resolve"]}):o.jsxs("span",{className:pt("flex items-center gap-1 text-sm",ft.bad),children:[o.jsx(lg,{size:14})," ",f.broken," broken reference",f.broken===1?"":"s"," found"]})]}),f.brokenRefs.length>0&&o.jsx("div",{className:"mt-4 flex flex-col gap-2",children:f.brokenRefs.map((y,s)=>o.jsx(Kg,{r:y},s))})]})}function hm(){const f=window.__VIGILES_SERVE__;return f&&typeof f.token=="string"?f:null}async function kg(f,h,y){try{const s=await fetch(f,{method:"POST",headers:{"content-type":"application/json","x-vigiles-token":y},body:JSON.stringify(h)}),x=await s.json();return{ok:x.ok??s.ok,message:x.message??""}}catch(s){return{ok:!1,message:s instanceof Error?s.message:String(s)}}}const ym="inline-flex items-center gap-2 rounded-md border border-border bg-card px-3 py-1.5 text-left text-xs font-medium hover:border-foreground disabled:opacity-60";function gm({command:f,label:h}){const[y,s]=_e.useState(!1),x=()=>{var T;(T=navigator.clipboard)==null||T.writeText(f).then(()=>{s(!0),setTimeout(()=>s(!1),1500)},()=>{})};return o.jsxs("button",{type:"button",onClick:x,title:`Copy: ${f}`,className:ym,children:[y?o.jsx(Bn,{size:14,className:ft.good}):o.jsx(qf,{size:14,className:"text-muted-foreground"}),o.jsx("span",{className:pt(y&&ft.good),children:y?"copied!":h})]})}function vm({endpoint:f,body:h,token:y,label:s}){const[x,T]=_e.useState("idle"),[U,O]=_e.useState(""),_=()=>{T("running"),kg(f,h,y).then(z=>{T(z.ok?"done":"error"),O(z.message)})};return o.jsxs("button",{type:"button",onClick:_,disabled:x==="running"||x==="done",title:x==="error"?U:s,className:ym,children:[x==="running"&&o.jsx(ag,{size:14,className:"animate-spin text-muted-foreground"}),x==="done"&&o.jsx(Bn,{size:14,className:ft.good}),x==="error"&&o.jsx(fg,{size:14,className:ft.bad}),x==="idle"&&o.jsx(um,{size:14,className:"text-muted-foreground"}),o.jsx("span",{className:pt(x==="done"&&ft.good,x==="error"&&ft.bad),children:x==="done"?"created":x==="error"?"failed":x==="running"?"creating…":s})]})}function $g({path:f,command:h}){const y=hm();return o.jsxs("div",{className:"flex flex-wrap items-center gap-3 border-l-4 border-l-warn p-3",children:[o.jsx("code",{className:"font-mono text-xs text-foreground",children:f}),o.jsx("div",{className:"ml-auto",children:y?o.jsx(vm,{endpoint:"/adopt",body:{target:f},token:y.token,label:"Create spec"}):o.jsx(gm,{command:h,label:"Create spec"})})]})}function Wg({data:f}){const h=hm();return o.jsxs(Ge,{className:"p-5",children:[o.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[o.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[o.jsx(um,{size:16,className:"text-muted-foreground"}),f.surfaces.length," surface",f.surfaces.length===1?"":"s"," not yet spec-managed"]}),o.jsx("div",{className:"ml-auto",children:h?o.jsx(vm,{endpoint:"/adopt-all",body:{},token:h.token,label:"Create all specs"}):o.jsx(gm,{command:f.createAllCommand,label:"Create all specs"})})]}),o.jsx("p",{className:"mt-2 text-xs text-muted-foreground",children:h?"Click to create the typed spec — this report is live, so the CLI writes it for you (re-run audit to see it spec-managed).":"Copy the command and run it in your terminal — the CLI writes the typed spec (the browser can’t write files)."}),f.surfaces.length>0&&o.jsx("div",{className:"mt-4 flex flex-col gap-2",children:f.surfaces.map(y=>o.jsx($g,{path:y.path,command:y.command},y.path))})]})}const Fg="inline-flex items-center gap-2 rounded-md border border-border bg-card px-3 py-1.5 text-left text-xs font-medium hover:border-foreground disabled:opacity-60";function Ig({item:f}){const[h,y]=_e.useState(!1),s=f.configState==="contradiction"?`In this repo, the ${f.linter} rule \`${f.rule}\` is set to "off" in the lint config, but the instructions document "${f.intent}" as a rule. Resolve the contradiction: either remove the override so \`${f.rule}\` is enforced (${f.configFix}), or drop the documented rule if it's intentionally off.`:`In this repo, enable the ${f.linter} rule \`${f.rule}\` (set it to "error") in the lint config, so the documented rule "${f.intent}" is actually enforced. Config to add: ${f.configFix}`,x=()=>{var T;(T=navigator.clipboard)==null||T.writeText(s).then(()=>{y(!0),setTimeout(()=>y(!1),1500)},()=>{})};return o.jsxs("button",{type:"button",onClick:x,title:s,className:Fg,children:[h?o.jsx(Bn,{size:14,className:ft.good}):o.jsx(qf,{size:14,className:"text-muted-foreground"}),o.jsx("span",{className:pt(h&&ft.good),children:h?"copied!":"copy agent prompt"})]})}function li({item:f,tone:h,label:y,action:s}){return o.jsxs(Ge,{className:"flex flex-wrap items-center gap-x-3 gap-y-2 p-3 text-sm",children:[h==="good"?o.jsx(Bn,{size:16,className:ft.good}):o.jsx("span",{className:pt("text-lg leading-none",h==="warn"?ft.warn:h==="bad"?ft.bad:"text-muted-foreground"),children:"●"}),o.jsx("span",{className:"min-w-[12rem] flex-1",children:f.intent}),o.jsx("code",{className:"font-mono text-xs text-muted-foreground",children:f.rule}),o.jsx("span",{className:pt("text-xs",h==="good"?ft.good:h==="warn"?ft.warn:h==="bad"?ft.bad:"text-muted-foreground"),children:y}),s&&o.jsx(Ig,{item:f})]})}function tm({title:f,tone:h,children:y}){return o.jsxs("details",{className:"group",children:[o.jsxs("summary",{className:pt("flex cursor-pointer list-none items-center gap-1.5 py-1 text-xs font-medium",h==="good"?ft.good:"text-muted-foreground"),children:[o.jsx(nm,{size:13,className:"transition-transform group-open:rotate-90"}),f]}),o.jsx("div",{className:"mt-2 space-y-2",children:y})]})}const Of={reuse:{glyph:"✓",label:"enforceable now",blurb:"an off-the-shelf rule already exists → one config line"},hook:{glyph:"⛓",label:"hook",blurb:"an action rule a linter can't see (git push, rm -rf) → a hook gates it"},meta:{glyph:"☰",label:"agent note",blurb:"an instruction to the agent, not a code rule → stays prose"},semantic:{glyph:"✎",label:"judgment call",blurb:"no checker can decide it (“readable”, “idiomatic”) → honestly stays prose"},unrouted:{glyph:"⚙",label:"custom rule",blurb:"no off-the-shelf rule fits, but a custom one CAN — the opt-in synthesis skill writes + gates it (abstains if it can't prove it sound)"}},Pg=["reuse","hook","meta","semantic","unrouted"];function t0({routing:f}){const h=s=>{var x;return(x=f==null?void 0:f.rules.find(T=>T.category===s))==null?void 0:x.text},y=((f==null?void 0:f.rules)??[]).filter(s=>s.category==="reuse"&&s.enabled===!1);return o.jsxs("div",{className:"rounded-lg border border-dashed border-border p-4",children:[o.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[o.jsx(ig,{size:15,className:"text-muted-foreground"}),"Your rules, mapped",o.jsx("span",{className:"text-xs font-normal text-muted-foreground",children:"deterministic · no model"})]}),f&&f.segmented>0?o.jsxs(o.Fragment,{children:[o.jsxs("p",{className:"mt-1.5 text-xs text-muted-foreground",children:["We segmented"," ",o.jsx("span",{className:"font-semibold text-foreground",children:f.segmented})," ","atomic ",f.segmented===1?"rule":"rules"," from your instructions and routed each one — deterministically, no model:"]}),o.jsx("ul",{className:"mt-2 space-y-1.5 text-xs text-muted-foreground",children:Pg.filter(s=>f.counts[s]>0).map(s=>{const x=h(s);return o.jsxs("li",{children:[o.jsxs("span",{className:"font-mono text-foreground",children:[Of[s].glyph," ",f.counts[s]," ",Of[s].label]})," ","— ",Of[s].blurb,s==="reuse"&&y.length>0&&o.jsxs("span",{className:pt("ml-1 font-semibold",ft.bad),children:["(",y.length," documented but OFF)"]}),x&&o.jsxs("span",{className:"mt-0.5 block truncate pl-4 italic opacity-80",children:["e.g. “",x,"”"]})]},s)})}),y.length>0&&o.jsxs("div",{className:pt("mt-2.5 rounded-md border p-2.5","border-l-4"),children:[o.jsxs("p",{className:pt("text-xs font-semibold",ft.bad),children:["⛔ ",y.length," documented but OFF"]}),o.jsxs("p",{className:"mt-0.5 text-xs text-muted-foreground",children:["Your instructions name"," ",y.length===1?"this rule":"these rules"," as enforced, but your linter config has ",y.length===1?"it":"them"," ","disabled:"]}),o.jsxs("ul",{className:"mt-1 space-y-0.5",children:[y.slice(0,6).map(s=>o.jsxs("li",{className:"font-mono text-xs text-muted-foreground",children:[o.jsx("code",{className:ft.bad,children:s.rule})," ",o.jsxs("span",{className:"opacity-70",children:["— ",s.text]})]},s.rule)),y.length>6&&o.jsxs("li",{className:"text-xs text-muted-foreground",children:["+",y.length-6," more"]})]})]}),o.jsx(em,{routing:f}),o.jsx(lm,{})]}):o.jsxs(o.Fragment,{children:[o.jsx(em,{routing:f}),o.jsx("p",{className:"mt-1.5 text-xs text-muted-foreground",children:"Segments your instruction file into atomic rules and routes each one — deterministically, no model:"}),o.jsxs("ul",{className:"mt-2 space-y-1 text-xs text-muted-foreground",children:[o.jsxs("li",{children:[o.jsx("span",{className:"font-mono text-foreground",children:"✓ enforceable now"})," ","— an off-the-shelf rule already exists → enable it"]}),o.jsxs("li",{children:[o.jsx("span",{className:"font-mono text-foreground",children:"⛓ hook"})," — action rules a linter can't see (git push, rm -rf)"]}),o.jsxs("li",{children:[o.jsx("span",{className:"font-mono text-foreground",children:"⚙ custom rule"})," — no off-the-shelf rule fits, but a custom one CAN (“wrap API calls in retry”) → the opt-in synthesis skill, gated"]}),o.jsxs("li",{children:[o.jsx("span",{className:"font-mono text-foreground",children:"✎ judgment call"})," ","— genuinely undecidable (“readable”), honestly left as prose"]})]}),o.jsx(lm,{})]})]})}function em({routing:f}){const h=(f==null?void 0:f.possible)??[],y=(f==null?void 0:f.skipped)??[];if(h.length===0&&y.length===0)return null;const s={};for(const x of y)s[x.reason]=(s[x.reason]??0)+1;return o.jsxs("div",{className:"mt-2.5 space-y-2",children:[h.length>0&&o.jsxs("div",{className:"rounded-md border border-dashed border-border p-2.5",children:[o.jsxs("p",{className:"text-xs font-semibold text-foreground",children:["? ",h.length," possible — rule-ish, below the confidence bar (review)"]}),o.jsxs("ul",{className:"mt-1 space-y-0.5",children:[h.slice(0,6).map((x,T)=>o.jsxs("li",{className:"truncate text-xs italic text-muted-foreground opacity-80",children:["“",x.text,"”"]},`${x.lineStart}-${T}`)),h.length>6&&o.jsxs("li",{className:"text-xs text-muted-foreground",children:["+",h.length-6," more"]})]})]}),y.length>0&&o.jsxs("p",{className:"text-xs text-muted-foreground",children:["⊘ ",y.length," skipped — not treated as rules (",Object.entries(s).map(([x,T])=>`${T} ${x}`).join(" · "),")"]}),o.jsx("p",{className:"text-xs text-muted-foreground opacity-70",children:"Detection is a best-effort, precision-first filter — it won’t catch every rule. Full per-bullet lists are in the JSON report."})]})}function lm(){return o.jsxs("div",{className:"mt-2.5 space-y-1 text-xs text-muted-foreground",children:[o.jsxs("p",{children:[o.jsx("span",{className:"font-medium text-foreground",children:"Enforceable now"})," — enable each in your lint config (one line), or ask your agent to run the"," ",o.jsx("code",{className:"rounded bg-border px-1 font-mono",children:"strengthen"})," ","skill."]}),o.jsxs("p",{children:[o.jsx("span",{className:"font-medium text-foreground",children:"Hooks"})," — author a compiled hook in"," ",o.jsx("code",{className:"rounded bg-border px-1 font-mono",children:".vigiles/hooks/"}),", then"," ",o.jsx("code",{className:"rounded bg-border px-1 font-mono",children:"npx vigiles compile"})," ","wires it into your settings."]}),o.jsxs("p",{children:[o.jsx("span",{className:"font-medium text-foreground",children:"Custom rule (⚙)"})," — no off-the-shelf rule fits, but a custom one CAN enforce it (e.g. “wrap API calls in a retry”). Doable, not a dead end — the opt-in synthesis skill writes and gates it (with a bit of codebase context); it abstains rather than ship a checker it can’t prove sound. Nothing is generated for you automatically."]}),o.jsxs("p",{children:[o.jsx("span",{className:"font-medium text-foreground",children:"Judgment call (✎)"})," — genuinely undecidable (“keep it readable”); no checker can decide it, so it honestly stays prose."]})]})}function e0({data:f,routing:h}){const y=f.filter(_=>_.configState==="in-config"),s=f.filter(_=>_.configState==="preset-maybe"),x=f.filter(_=>_.configState==="not-in-config"),T=f.filter(_=>_.configState==="contradiction"),U=f.length,O=(_,z)=>_>0?o.jsx("div",{className:pt(z),style:{flexGrow:_},"aria-hidden":!0}):null;return o.jsxs("div",{className:"space-y-4",children:[o.jsxs("div",{className:"flex flex-wrap items-baseline justify-between gap-2",children:[o.jsxs("p",{className:"text-sm text-muted-foreground",children:[o.jsx("span",{className:pt("font-semibold",ft.good),children:y.length})," ","of ",U," enforced",s.length>0&&o.jsxs(o.Fragment,{children:[" · ",o.jsx("span",{className:"font-semibold text-foreground",children:s.length})," ","likely via a preset"]}),x.length>0&&o.jsxs(o.Fragment,{children:[" · ",o.jsx("span",{className:pt("font-semibold",ft.warn),children:x.length})," ",x.length===1?"is":"are"," one config line away"]}),T.length>0&&o.jsxs(o.Fragment,{children:[" · ",o.jsx("span",{className:pt("font-semibold",ft.bad),children:T.length})," ","contradicted by config"]}),"."]}),o.jsxs("span",{className:"inline-flex items-center gap-1 text-xs text-muted-foreground",children:[o.jsx(sg,{size:12})," deterministic · no model"]})]}),o.jsxs("div",{className:"flex h-2 overflow-hidden rounded-full bg-border",children:[O(y.length,Hn.good),O(s.length,Hn.na),O(x.length,Hn.warn),O(T.length,Hn.bad)]}),T.length>0&&o.jsx("div",{className:"space-y-2",children:T.map(_=>o.jsx(li,{item:_,tone:"bad",label:"⛔ set to off in your config — your call",action:!0},_.rule))}),x.length>0&&o.jsx("div",{className:"space-y-2",children:x.map(_=>o.jsx(li,{item:_,tone:"warn",label:"enable in 1 line",action:!0},_.rule))}),y.length>0&&o.jsx(tm,{title:`✓ ${y.length} already enforced`,tone:"good",children:y.map(_=>o.jsx(li,{item:_,tone:"good",label:"enforced"},_.rule))}),s.length>0&&o.jsx(tm,{title:`◦ ${s.length} likely enforced via a preset`,tone:"muted",children:s.map(_=>o.jsx(li,{item:_,tone:"muted",label:"preset?"},_.rule))}),o.jsx(t0,{routing:h})]})}function l0({data:f}){return o.jsxs(Ge,{className:"p-5",children:[o.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[o.jsxs("div",{className:"flex items-center gap-2 text-sm font-semibold",children:[o.jsx(ng,{size:16,className:"text-muted-foreground"}),f.total," record",f.total===1?"":"s"," recorded"]}),o.jsx("div",{className:"ml-auto flex flex-wrap gap-1.5",children:f.counts.map(h=>o.jsxs(qn,{variant:"outline",children:[h.count," ",h.kind]},h.kind))})]}),f.recentDenials.length>0&&o.jsxs("div",{className:"mt-4 flex flex-col gap-2",children:[o.jsxs("div",{className:"text-xs uppercase tracking-wide text-muted-foreground",children:["Recent denials (",f.denials,")"]}),f.recentDenials.map((h,y)=>o.jsxs("div",{className:pt("flex flex-wrap items-center gap-2 border-l-4 p-3 text-sm",ai.bad),children:[o.jsx(tg,{size:14,className:ft.bad}),o.jsx("code",{className:"font-mono text-xs",children:h.label}),o.jsx("span",{className:"text-muted-foreground",children:h.reason})]},y))]})]})}function Uf(f){const h=f.replace(/[/\\]+$/,"").split(/[/\\]/);return h[h.length-1]||f}function a0(f){return f>=8?"bad":f>=3?"warn":"na"}function n0({r:f}){const[h,y]=_e.useState(!1),s=`In this repo, ${f.fix}. Context: ${f.rationale} (detector: ${f.detector}).`,x=()=>{var T;(T=navigator.clipboard)==null||T.writeText(s).then(()=>{y(!0),setTimeout(()=>y(!1),1500)},()=>{})};return o.jsxs("button",{type:"button",onClick:x,title:s,className:"inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-2.5 py-1 text-xs font-medium hover:border-foreground",children:[h?o.jsx(Bn,{size:13,className:ft.good}):o.jsx(qf,{size:13,className:"text-muted-foreground"}),o.jsx("span",{className:pt(h&&ft.good),children:h?"copied!":"copy agent prompt"})]})}function u0({r:f,points:h}){const y=f.action==="fix"?cg:eg,s=a0(h);return o.jsxs(Ge,{className:pt("border-l-4 p-4",ai[s]),children:[o.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[o.jsxs(qn,{children:[o.jsx(y,{size:12,className:"mr-1"}),f.action]}),o.jsx("strong",{children:f.surface}),h>0&&o.jsxs("span",{className:pt("rounded-full px-2 py-0.5 text-xs font-semibold",ft[s]),children:["+",h," pts"]}),o.jsx("span",{className:"ml-auto font-mono text-xs text-muted-foreground",children:f.detector})]}),o.jsx("div",{className:"mt-1.5 text-sm text-muted-foreground",children:f.rationale}),o.jsxs("div",{className:"mt-1 flex flex-wrap items-center justify-between gap-2",children:[o.jsxs("span",{className:"text-sm text-good",children:["→ ",f.fix]}),o.jsx(n0,{r:f})]})]})}function i0({c:f}){const h=f.advisory?"na":mm(f.score),y=f.score===null?0:Math.max(0,Math.min(100,f.score));return o.jsxs(Ge,{className:"flex flex-col gap-2 p-3",children:[o.jsxs("div",{className:"flex items-baseline justify-between gap-2",children:[o.jsx("span",{className:"text-xs font-semibold",children:f.key}),o.jsx("span",{className:pt("text-sm font-bold",ft[h]),children:f.advisory?"—":f.score===null?"n/a":f.score})]}),o.jsx("div",{className:"h-1.5 overflow-hidden rounded-full bg-border",children:o.jsx("div",{className:pt("h-full rounded-full",Hn[h]),style:{width:`${y}%`}})}),o.jsx("div",{className:"h-8 overflow-hidden text-[11px] leading-tight text-muted-foreground",children:f.advisory?o.jsx("span",{className:"text-na",children:"advisory — not graded"}):f.findings.length>0?o.jsxs("span",{className:"line-clamp-2",children:[f.findings[0],f.findings.length>1&&o.jsxs("span",{className:"text-foreground",children:[" ","· +",f.findings.length-1," more"]})]}):o.jsxs("span",{className:"inline-flex items-center gap-1 text-good",children:[o.jsx(Hf,{size:11})," clean"]})})]})}function c0({verdict:f,overall:h,dir:y,harness:s}){const x=mm(h);return o.jsxs(Ge,{className:"flex flex-col gap-5 p-7 sm:flex-row sm:items-center",children:[o.jsxs("div",{className:pt("flex h-28 w-28 shrink-0 flex-col items-center justify-center rounded-2xl border-2",Vg[x]),children:[o.jsx("span",{className:pt("text-5xl font-black leading-none",ft[x]),children:f.grade}),o.jsx("span",{className:"mt-1 text-sm font-medium text-muted-foreground",children:h===null?"—":`${h}/100`})]}),o.jsxs("div",{className:"min-w-0",children:[o.jsx("h1",{className:"text-xl font-bold leading-snug tracking-tight sm:text-2xl",children:f.sentence}),o.jsxs("div",{className:"mt-2 text-sm text-muted-foreground",children:[o.jsx("span",{className:"font-medium text-foreground",children:Uf(y)})," ·"," ",s]}),o.jsx("div",{className:"mt-1 text-xs text-muted-foreground",children:"deterministic · no model · nothing leaves your machine"})]})]})}function f0({data:f}){var ot,W;const{score:h,verdict:y,recommendations:s,inventory:x,meta:T,adoptability:U,adoptable:O,observations:_,rulesInventory:z,ruleRouting:B}=f,R=h.empty?null:h.overall;_e.useEffect(()=>{document.title=R===null?`vigiles — ${Uf(T.dir)}`:`vigiles — ${h.grade} (${R}) · ${Uf(T.dir)}`},[R,h.grade,T.dir]);const L=Q=>{var w;return((w=y.perRecommendation.find(xt=>xt.index===Q))==null?void 0:w.pointsIfFixed)??0},yt=s.map((Q,w)=>({r:Q,points:L(w)})).sort((Q,w)=>w.points-Q.points);return o.jsxs("div",{className:"mx-auto max-w-5xl px-6 pb-16 pt-10",children:[o.jsx(c0,{verdict:y,overall:R,dir:T.dir,harness:T.harness}),o.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Categories"}),o.jsx("div",{className:"grid grid-cols-2 gap-2.5 sm:grid-cols-3 lg:grid-cols-5",children:h.categories.map(Q=>o.jsx(i0,{c:Q},Q.key))}),o.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:s.length>0?"Do these first":"Fixes"}),yt.length>0?o.jsx("div",{className:"flex flex-col gap-2.5",children:yt.map(({r:Q,points:w},xt)=>o.jsx(u0,{r:Q,points:w},xt))}):o.jsxs(Ge,{className:"flex items-center gap-2 p-4 text-sm text-good",children:[o.jsx(Hf,{size:16})," No deterministic fixes — the structure is clean."]}),(()=>{const Q=h.categories.find(w=>w.key==="Safety");return!Q||Q.advisory||Q.findings.length===0?null:o.jsxs(o.Fragment,{children:[o.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Review — no auto-fix"}),o.jsx("div",{className:"flex flex-col gap-2.5",children:Q.findings.map((w,xt)=>o.jsx(Ge,{className:pt("border-l-4 p-4",ai.bad),children:o.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-sm",children:[o.jsxs(qn,{children:[o.jsx(ug,{size:12,className:"mr-1"}),"safety"]}),o.jsx("span",{className:"text-muted-foreground",children:w}),o.jsx("span",{className:"ml-auto text-xs text-muted-foreground",children:"your call — no deterministic fix"})]})},xt))})]})})(),U&&o.jsxs(o.Fragment,{children:[o.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Broken references"}),o.jsx("p",{className:"mb-3 text-xs text-muted-foreground",children:"Machine-verifiable references in your instruction file — files, scripts, symbols — checked against your actual repo and config. These don't resolve."}),o.jsx(Jg,{data:U})]}),_&&_.total>0&&o.jsxs(o.Fragment,{children:[o.jsx("h2",{className:"mb-3 mt-9 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:"Flight recorder"}),o.jsxs("p",{className:"mb-3 text-xs text-muted-foreground",children:["What your harness actually did in real sessions — read off the local",o.jsx("code",{className:"mx-1 font-mono",children:".vigiles/runs.jsonl"})," ledger."]}),o.jsx(l0,{data:_})]}),(z&&z.length>0||B&&(B.segmented>0||(((ot=B.possible)==null?void 0:ot.length)??0)>0||(((W=B.skipped)==null?void 0:W.length)??0)>0))&&o.jsxs(o.Fragment,{children:[o.jsxs("h2",{className:"mb-3 mt-9 flex items-center gap-2 text-xs font-semibold uppercase tracking-widest text-muted-foreground",children:["Your rules → enforced",o.jsx(qn,{className:"border-warn text-warn",children:"experimental"})]}),o.jsx("p",{className:"mb-3 text-xs text-muted-foreground",children:"Prose rules in your instruction file that map to an off-the-shelf lint rule — and whether it's actually enforced. Detection is a heuristic, precision-first preview: it won't catch every rule."}),o.jsx(e0,{data:z??[],routing:B})]}),o.jsxs("div",{className:"mt-9 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground",children:[o.jsx("span",{className:"font-semibold uppercase tracking-widest",children:"Ships"}),o.jsxs("span",{children:[x.skills," skills"]}),o.jsxs("span",{children:[x.agents," agents"]}),o.jsxs("span",{children:[x.hooks," hooks"]}),o.jsxs("span",{children:[x.commands," commands"]}),o.jsxs("span",{children:["MCP ",x.mcp?"yes":"no"]}),x.untested>0&&o.jsxs("span",{className:ft.warn,children:[x.untested," untested"]})]}),O&&O.surfaces.length>0&&o.jsxs("details",{className:"group mt-6",children:[o.jsxs("summary",{className:"flex cursor-pointer list-none items-center gap-1.5 text-xs font-semibold uppercase tracking-widest text-muted-foreground hover:text-foreground",children:[o.jsx(nm,{size:13,className:"transition-transform group-open:rotate-90"}),"Optional — turn ",O.surfaces.length," surface",O.surfaces.length>1?"s":""," into typed specs"]}),o.jsx("p",{className:"mb-3 mt-3 text-xs text-muted-foreground",children:"Hardening, not a fix: make vigiles verify these surfaces' references — fully, or one at a time. Skip it until you want CI to gate them."}),o.jsx(Wg,{data:O})]}),o.jsx("footer",{className:"mt-12 text-center text-xs text-muted-foreground",children:"Generated by vigiles — we run your harness, not just read it."})]})}const s0={meta:{schemaVersion:2,tool:"vigiles",kind:"audit",vigilesVersion:"0.0.0",harness:"claude-code",dir:"my-plugin"},score:{overall:77,grade:"C",empty:!1,categories:[{key:"Truthfulness",score:100,weight:1,findings:[]},{key:"Triggering",score:92,weight:1,findings:["1 near-identical skill description (wrong one fires)"]},{key:"Structure",score:92,weight:1,findings:["1 agent tool that doesn't exist (typo / never-available)"]},{key:"Safety",score:80,weight:1,findings:["1 subagent holding all three lethal-trifecta legs (prompt-injection exfil path)"]},{key:"Tested",score:88,weight:1,findings:["4 untested surfaces"]}]},verdict:{sentence:"Two one-line fixes away from a B.",grade:"C",pointsToNextGrade:3,fixesToNextGrade:2,perRecommendation:[{index:0,pointsIfFixed:4},{index:1,pointsIfFixed:2}]},recommendations:[{surface:"reviewer",action:"fix",rationale:`Unknown tool "Reed" — silently dropped, the agent can't use it.`,fix:'change the tool "Reed" to "Read"',detector:"subagent-tool-contract",confidence:"likely"},{surface:"deploy ↔ ship",action:"differentiate",rationale:"Near-identical descriptions (0.92 similar) — the selector can't tell them apart.",fix:"differentiate the descriptions of deploy and ship",detector:"description-overlap",confidence:"possible"}],inventory:{skills:2,agents:1,hooks:1,commands:0,mcp:!1,untested:4},adoptable:{createAllCommand:"npx vigiles init",surfaces:[{path:"skills/deploy/SKILL.md",command:"npx vigiles init --target=skills/deploy/SKILL.md"},{path:"agents/reviewer.md",command:"npx vigiles init --target=agents/reviewer.md"}]},adoptability:{total:7,broken:2,brokenRefs:[{kind:"file",ref:"src/auth/login.ts",issue:"file does not exist"},{kind:"dir",ref:"packages/legacy/",issue:"directory does not exist"}]},ruleRouting:{segmented:8,counts:{reuse:3,hook:2,meta:0,semantic:1,unrouted:2},rules:[{text:"Never use `console.log` in shipped code.",quote:"- Never use `console.log` in shipped code.",file:"CLAUDE.md",lineStart:12,lineEnd:12,confidence:"high",category:"reuse",mechanism:"config-line",rule:"no-console",linter:"eslint",enabled:!1,source:"marker"},{text:"Never push directly to `main` — open a PR.",quote:"- Never push directly to `main` — open a PR.",file:"CLAUDE.md",lineStart:18,lineEnd:18,confidence:"high",category:"hook",mechanism:"hook"},{text:"Run `npm test` before every commit.",quote:"- Run `npm test` before every commit.",file:"CLAUDE.md",lineStart:19,lineEnd:19,confidence:"high",category:"hook",mechanism:"hook"},{text:"Write clear, self-documenting code.",quote:"- Write clear, self-documenting code.",file:"CLAUDE.md",lineStart:21,lineEnd:21,confidence:"high",category:"semantic",mechanism:"prose"},{text:"Prefer named exports over default exports.",quote:"- Prefer named exports over default exports.",file:"CLAUDE.md",lineStart:22,lineEnd:22,confidence:"high",category:"unrouted",mechanism:"synthesize"}]},rulesInventory:[{intent:"strict equality ===",linter:"eslint",matched:"eqeqeq",rule:"eqeqeq",configState:"contradiction",configFix:'"eqeqeq": "error"'},{intent:"no console.log / use the logger",linter:"eslint",matched:"console.log",rule:"no-console",configState:"not-in-config",configFix:'"no-console": "error"'},{intent:"no debugger",linter:"eslint",matched:"no-debugger",rule:"no-debugger",configState:"not-in-config",configFix:'"no-debugger": "error"'},{intent:"no `any` type",linter:"eslint",matched:"no-explicit-any",rule:"@typescript-eslint/no-explicit-any",configState:"in-config",configFix:'"@typescript-eslint/no-explicit-any": "error"'},{intent:"no floating promises",linter:"eslint",matched:"no-floating-promises",rule:"@typescript-eslint/no-floating-promises",configState:"preset-maybe",configFix:'"@typescript-eslint/no-floating-promises": "error"'}]},Cf=window.__VIGILES_DATA__,o0=Cf&&typeof Cf=="object"?Cf:s0;Wy.createRoot(document.getElementById("root")).render(o.jsx(_e.StrictMode,{children:o.jsx(f0,{data:o0})}));</script>
|
|
151
|
-
<style rel="stylesheet" crossorigin>/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-good:var(--good)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{background-color:var(--background);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@layer components;@layer utilities{.visible{visibility:visible}.mx-1{margin-inline:var(--spacing)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mr-1{margin-right:var(--spacing)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-1{margin-left:var(--spacing)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-8{height:calc(var(--spacing) * 8)}.h-28{height:calc(var(--spacing) * 28)}.h-full{height:100%}.w-28{width:calc(var(--spacing) * 28)}.max-w-5xl{max-width:var(--container-5xl)}.min-w-0{min-width:0}.min-w-\[12rem\]{min-width:12rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.list-none{list-style-type:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-bad{border-color:var(--bad)}.border-border{border-color:var(--border)}.border-good{border-color:var(--good)}.border-na{border-color:var(--na)}.border-warn{border-color:var(--warn)}.border-l-bad{border-left-color:var(--bad)}.border-l-good{border-left-color:var(--good)}.border-l-na{border-left-color:var(--na)}.border-l-warn{border-left-color:var(--warn)}.bg-background{background-color:var(--background)}.bg-bad{background-color:var(--bad)}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-good{background-color:var(--good)}.bg-na{background-color:var(--na)}.bg-warn{background-color:var(--warn)}.fill-bad{fill:var(--bad)}.fill-good{fill:var(--good)}.fill-na{fill:var(--na)}.fill-warn{fill:var(--warn)}.stroke-bad{stroke:var(--bad)}.stroke-border{stroke:var(--border)}.stroke-good{stroke:var(--good)}.stroke-na{stroke:var(--na)}.stroke-warn{stroke:var(--warn)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-7{padding:calc(var(--spacing) * 7)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-bad{color:var(--bad)}.text-foreground{color:var(--foreground)}.text-good{color:var(--good)}.text-muted-foreground{color:var(--muted)}.text-na{color:var(--na)}.text-warn{color:var(--warn)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}@media(hover:hover){.hover\:border-foreground:hover{border-color:var(--foreground)}.hover\:text-foreground:hover{color:var(--foreground)}}.disabled\:opacity-60:disabled{opacity:.6}@media(min-width:40rem){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}@media(min-width:64rem){.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}}:root{--background:#fafafa;--card:#fff;--border:#e4e4e7;--foreground:#09090b;--muted:#71717a;--good:#16a34a;--warn:#f59e0b;--bad:#ef4444;--na:#a1a1aa;--radius:.75rem}@media(prefers-color-scheme:dark){:root{--background:#0b0f17;--card:#121826;--border:#1e2636;--foreground:#e6e9ef;--muted:#9aa4b2;--good:#16c784;--warn:#ffb020;--bad:#ff5c5c;--na:#6b7280}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}</style>
|
|
151
|
+
<style rel="stylesheet" crossorigin>/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-good:var(--good)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{background-color:var(--background);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@layer components;@layer utilities{.visible{visibility:visible}.mx-1{margin-inline:var(--spacing)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mr-1{margin-right:var(--spacing)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-1{margin-left:var(--spacing)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-8{height:calc(var(--spacing) * 8)}.h-28{height:calc(var(--spacing) * 28)}.h-full{height:100%}.w-28{width:calc(var(--spacing) * 28)}.max-w-5xl{max-width:var(--container-5xl)}.min-w-0{min-width:0}.min-w-\[12rem\]{min-width:12rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.list-none{list-style-type:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-bad{border-color:var(--bad)}.border-border{border-color:var(--border)}.border-good{border-color:var(--good)}.border-na{border-color:var(--na)}.border-warn{border-color:var(--warn)}.border-l-bad{border-left-color:var(--bad)}.border-l-good{border-left-color:var(--good)}.border-l-na{border-left-color:var(--na)}.border-l-warn{border-left-color:var(--warn)}.bg-background{background-color:var(--background)}.bg-bad{background-color:var(--bad)}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-good{background-color:var(--good)}.bg-na{background-color:var(--na)}.bg-warn{background-color:var(--warn)}.fill-bad{fill:var(--bad)}.fill-good{fill:var(--good)}.fill-na{fill:var(--na)}.fill-warn{fill:var(--warn)}.stroke-bad{stroke:var(--bad)}.stroke-border{stroke:var(--border)}.stroke-good{stroke:var(--good)}.stroke-na{stroke:var(--na)}.stroke-warn{stroke:var(--warn)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-7{padding:calc(var(--spacing) * 7)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-bad{color:var(--bad)}.text-foreground{color:var(--foreground)}.text-good{color:var(--good)}.text-muted-foreground{color:var(--muted)}.text-na{color:var(--na)}.text-warn{color:var(--warn)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-open\:rotate-90:is(:where(.group):is([open],:popover-open,:open) *){rotate:90deg}@media(hover:hover){.hover\:border-foreground:hover{border-color:var(--foreground)}.hover\:text-foreground:hover{color:var(--foreground)}}.disabled\:opacity-60:disabled{opacity:.6}@media(min-width:40rem){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}@media(min-width:64rem){.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}}:root{--background:#fafafa;--card:#fff;--border:#e4e4e7;--foreground:#09090b;--muted:#71717a;--good:#16a34a;--warn:#f59e0b;--bad:#ef4444;--na:#a1a1aa;--radius:.75rem}@media(prefers-color-scheme:dark){:root{--background:#0b0f17;--card:#121826;--border:#1e2636;--foreground:#e6e9ef;--muted:#9aa4b2;--good:#16c784;--warn:#ffb020;--bad:#ff5c5c;--na:#6b7280}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}</style>
|
|
152
152
|
</head>
|
|
153
153
|
<body>
|
|
154
154
|
<div id="root"></div>
|
package/dist/audit-score.js
CHANGED
|
@@ -100,7 +100,7 @@ function structure(r) {
|
|
|
100
100
|
{
|
|
101
101
|
n: deadTools,
|
|
102
102
|
weight: leaderboard_js_1.W_DANGLING_REF,
|
|
103
|
-
label: "agent tool(s)
|
|
103
|
+
label: "unavailable agent tool(s) (typo / never-available)",
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
n: deadMcpTools,
|
package/dist/audit-verdict.d.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* 1. `pointsIfFixed` per recommendation — the exact number of overall points the
|
|
12
12
|
* grade gains if THAT one fix is applied (so a fix card can show `+N pts` and
|
|
13
13
|
* sort by it). Computed as `overall(report − thisFinding) − overall(report)`.
|
|
14
|
-
* 2. A verdict `sentence` for the report header — e.g. "Two
|
|
14
|
+
* 2. A verdict `sentence` for the report header — e.g. "Two fixes away
|
|
15
15
|
* from an A." — where the COUNT is the minimal number of fixes whose COMBINED
|
|
16
16
|
* removal actually crosses the next grade threshold (a real cumulative
|
|
17
17
|
* re-score), and `pointsToNextGrade` is the real threshold gap.
|
package/dist/audit-verdict.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* 1. `pointsIfFixed` per recommendation — the exact number of overall points the
|
|
13
13
|
* grade gains if THAT one fix is applied (so a fix card can show `+N pts` and
|
|
14
14
|
* sort by it). Computed as `overall(report − thisFinding) − overall(report)`.
|
|
15
|
-
* 2. A verdict `sentence` for the report header — e.g. "Two
|
|
15
|
+
* 2. A verdict `sentence` for the report header — e.g. "Two fixes away
|
|
16
16
|
* from an A." — where the COUNT is the minimal number of fixes whose COMBINED
|
|
17
17
|
* removal actually crosses the next grade threshold (a real cumulative
|
|
18
18
|
* re-score), and `pointsToNextGrade` is the real threshold gap.
|
|
@@ -241,7 +241,7 @@ function buildSentence(input, pointsToNextGrade, fixesToNextGrade) {
|
|
|
241
241
|
const nextGrade = (0, leaderboard_js_1.gradeFor)(score.overall + pointsToNextGrade);
|
|
242
242
|
// Reachable by the deterministic fix list: fix-count-forward (the actionable framing).
|
|
243
243
|
if (fixesToNextGrade !== null) {
|
|
244
|
-
return `${capitalize(numberWord(fixesToNextGrade))}
|
|
244
|
+
return `${capitalize(numberWord(fixesToNextGrade))} ${fixNoun(fixesToNextGrade)} away from ${article(nextGrade)} ${nextGrade}.`;
|
|
245
245
|
}
|
|
246
246
|
// Not reachable by recommendations alone — lead with the dominant blocking finding.
|
|
247
247
|
const dom = dominantDeduction(report);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Levenshtein distance for short-string typo detection. Rule names, tool names,
|
|
3
|
+
* and hook events are short, so edit distance is more appropriate than NCD
|
|
4
|
+
* (which is tuned for longer texts).
|
|
5
|
+
*
|
|
6
|
+
* Extracted to its own zero-dependency leaf module so the typo detectors
|
|
7
|
+
* (tool-contract, hook-events) can import it WITHOUT pulling in `core/linters.ts`,
|
|
8
|
+
* which runs a `node:fs`/`process`/`glob` side effect at import time — the
|
|
9
|
+
* blocker to running those detectors in a browser (the in-browser audit demo).
|
|
10
|
+
*/
|
|
11
|
+
export declare function editDistance(a: string, b: string): number;
|
|
12
|
+
//# sourceMappingURL=edit-distance.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.editDistance = editDistance;
|
|
4
|
+
/**
|
|
5
|
+
* Levenshtein distance for short-string typo detection. Rule names, tool names,
|
|
6
|
+
* and hook events are short, so edit distance is more appropriate than NCD
|
|
7
|
+
* (which is tuned for longer texts).
|
|
8
|
+
*
|
|
9
|
+
* Extracted to its own zero-dependency leaf module so the typo detectors
|
|
10
|
+
* (tool-contract, hook-events) can import it WITHOUT pulling in `core/linters.ts`,
|
|
11
|
+
* which runs a `node:fs`/`process`/`glob` side effect at import time — the
|
|
12
|
+
* blocker to running those detectors in a browser (the in-browser audit demo).
|
|
13
|
+
*/
|
|
14
|
+
function editDistance(a, b) {
|
|
15
|
+
if (a === b)
|
|
16
|
+
return 0;
|
|
17
|
+
const m = a.length;
|
|
18
|
+
const n = b.length;
|
|
19
|
+
if (m === 0)
|
|
20
|
+
return n;
|
|
21
|
+
if (n === 0)
|
|
22
|
+
return m;
|
|
23
|
+
const dp = Array.from({ length: n + 1 }, (_, i) => i);
|
|
24
|
+
for (let i = 1; i <= m; i++) {
|
|
25
|
+
let prev = dp[0];
|
|
26
|
+
dp[0] = i;
|
|
27
|
+
for (let j = 1; j <= n; j++) {
|
|
28
|
+
const tmp = dp[j];
|
|
29
|
+
dp[j] =
|
|
30
|
+
a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, dp[j], dp[j - 1]);
|
|
31
|
+
prev = tmp;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return dp[n];
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=edit-distance.js.map
|
package/dist/core/hook-events.js
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.confidentHookEventIssues = confidentHookEventIssues;
|
|
4
4
|
exports.verifyHookEvents = verifyHookEvents;
|
|
5
|
-
const
|
|
5
|
+
const edit_distance_js_1 = require("./edit-distance.js");
|
|
6
6
|
/** Closest known hook event by edit distance (≤ 2) — a confidence signal. */
|
|
7
7
|
function closestEvent(event, dialect) {
|
|
8
8
|
let best = null;
|
|
9
9
|
let bestDistance = Infinity;
|
|
10
10
|
for (const known of dialect.hookEvents) {
|
|
11
|
-
const d = (0,
|
|
11
|
+
const d = (0, edit_distance_js_1.editDistance)(event.toLowerCase(), known.toLowerCase());
|
|
12
12
|
if (d < bestDistance) {
|
|
13
13
|
bestDistance = d;
|
|
14
14
|
best = known;
|
package/dist/core/linters.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* This is the core moat — no other tool resolves rules across 7 catalog APIs
|
|
10
10
|
* (6 linters + Cedar policy language) and checks config-enabled status.
|
|
11
11
|
*/
|
|
12
|
+
import { editDistance } from "./edit-distance.js";
|
|
12
13
|
export type ConfigEnabledStatus = "enabled" | "disabled" | "unknown";
|
|
13
14
|
export interface LinterCheckResult {
|
|
14
15
|
exists: boolean;
|
|
@@ -24,12 +25,7 @@ export interface DetectedLinter {
|
|
|
24
25
|
}
|
|
25
26
|
/** @internal */ export declare function extractLinterName(enforcedBy: string): string;
|
|
26
27
|
/** @internal */ export declare function extractRuleName(enforcedBy: string): string | null;
|
|
27
|
-
|
|
28
|
-
* Levenshtein distance for short-string typo detection. Rule names are
|
|
29
|
-
* short so edit distance is more appropriate than NCD (which is tuned
|
|
30
|
-
* for longer texts).
|
|
31
|
-
*/
|
|
32
|
-
export declare function editDistance(a: string, b: string): number;
|
|
28
|
+
export { editDistance };
|
|
33
29
|
/** @internal */ export declare function clearCedarCache(): void;
|
|
34
30
|
/**
|
|
35
31
|
* Check a single linter rule reference (e.g., "eslint/no-console").
|
package/dist/core/linters.js
CHANGED
|
@@ -11,13 +11,15 @@
|
|
|
11
11
|
* (6 linters + Cedar policy language) and checks config-enabled status.
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.editDistance = void 0;
|
|
14
15
|
exports.extractLinterName = extractLinterName;
|
|
15
16
|
exports.extractRuleName = extractRuleName;
|
|
16
|
-
exports.editDistance = editDistance;
|
|
17
17
|
exports.clearCedarCache = clearCedarCache;
|
|
18
18
|
exports.checkLinterRule = checkLinterRule;
|
|
19
19
|
const node_fs_1 = require("node:fs");
|
|
20
20
|
const node_path_1 = require("node:path");
|
|
21
|
+
const edit_distance_js_1 = require("./edit-distance.js");
|
|
22
|
+
Object.defineProperty(exports, "editDistance", { enumerable: true, get: function () { return edit_distance_js_1.editDistance; } });
|
|
21
23
|
const node_child_process_1 = require("node:child_process");
|
|
22
24
|
const node_module_1 = require("node:module");
|
|
23
25
|
const glob_1 = require("glob");
|
|
@@ -378,38 +380,11 @@ function ruleFileExists(ruleName, rulesDir, basePath) {
|
|
|
378
380
|
function makeResult(ctx, exists, enabled = "unknown", error) {
|
|
379
381
|
return { exists, enabled, linter: ctx.linterName, rule: ctx.ruleName, error };
|
|
380
382
|
}
|
|
381
|
-
/**
|
|
382
|
-
* Levenshtein distance for short-string typo detection. Rule names are
|
|
383
|
-
* short so edit distance is more appropriate than NCD (which is tuned
|
|
384
|
-
* for longer texts).
|
|
385
|
-
*/
|
|
386
|
-
function editDistance(a, b) {
|
|
387
|
-
if (a === b)
|
|
388
|
-
return 0;
|
|
389
|
-
const m = a.length;
|
|
390
|
-
const n = b.length;
|
|
391
|
-
if (m === 0)
|
|
392
|
-
return n;
|
|
393
|
-
if (n === 0)
|
|
394
|
-
return m;
|
|
395
|
-
const dp = Array.from({ length: n + 1 }, (_, i) => i);
|
|
396
|
-
for (let i = 1; i <= m; i++) {
|
|
397
|
-
let prev = dp[0];
|
|
398
|
-
dp[0] = i;
|
|
399
|
-
for (let j = 1; j <= n; j++) {
|
|
400
|
-
const tmp = dp[j];
|
|
401
|
-
dp[j] =
|
|
402
|
-
a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, dp[j], dp[j - 1]);
|
|
403
|
-
prev = tmp;
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
return dp[n];
|
|
407
|
-
}
|
|
408
383
|
/** Top-N closest rule names by edit distance, filtered by a max distance. */
|
|
409
384
|
function closestRuleNames(target, candidates, limit = 3, maxDistance = 4) {
|
|
410
385
|
const scored = [];
|
|
411
386
|
for (const c of candidates) {
|
|
412
|
-
const d = editDistance(target, c);
|
|
387
|
+
const d = (0, edit_distance_js_1.editDistance)(target, c);
|
|
413
388
|
if (d <= maxDistance)
|
|
414
389
|
scored.push({ name: c, dist: d });
|
|
415
390
|
}
|
|
@@ -4,7 +4,7 @@ exports.closestTool = closestTool;
|
|
|
4
4
|
exports.confidentToolIssues = confidentToolIssues;
|
|
5
5
|
exports.disallowedToolIssues = disallowedToolIssues;
|
|
6
6
|
exports.verifyToolContract = verifyToolContract;
|
|
7
|
-
const
|
|
7
|
+
const edit_distance_js_1 = require("./edit-distance.js");
|
|
8
8
|
/**
|
|
9
9
|
* Closest known built-in tool by edit distance (≤ 2), for a "did you mean" hint.
|
|
10
10
|
* The ≤ 2 bound is deliberately tight: a suggestion is a CONFIDENCE signal (this
|
|
@@ -15,7 +15,7 @@ function closestTool(tool, dialect) {
|
|
|
15
15
|
let best = null;
|
|
16
16
|
let bestDistance = Infinity;
|
|
17
17
|
for (const known of dialect.builtinAgentTools) {
|
|
18
|
-
const d = (0,
|
|
18
|
+
const d = (0, edit_distance_js_1.editDistance)(tool.toLowerCase(), known.toLowerCase());
|
|
19
19
|
if (d < bestDistance) {
|
|
20
20
|
bestDistance = d;
|
|
21
21
|
best = known;
|
package/dist/egress.js
CHANGED
|
@@ -48,8 +48,9 @@ function hasBinary(name) {
|
|
|
48
48
|
}).status === 0);
|
|
49
49
|
}
|
|
50
50
|
catch {
|
|
51
|
-
/* v8 ignore
|
|
51
|
+
/* v8 ignore start -- defensive: spawnSync only throws on a fork failure */
|
|
52
52
|
return false;
|
|
53
|
+
/* v8 ignore stop */
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
/**
|
|
@@ -59,9 +60,10 @@ function hasBinary(name) {
|
|
|
59
60
|
* change within a run. `available` is injected so the bwrap probe isn't repeated.
|
|
60
61
|
*/
|
|
61
62
|
function probeEgressAvailable(available) {
|
|
62
|
-
/* v8 ignore
|
|
63
|
+
/* v8 ignore start -- non-Linux has no bwrap/slirp; CI/coverage runs on Linux */
|
|
63
64
|
if (process.platform !== "linux")
|
|
64
65
|
return false;
|
|
66
|
+
/* v8 ignore stop */
|
|
65
67
|
return available && hasBinary("slirp4netns") && hasBinary("nft");
|
|
66
68
|
}
|
|
67
69
|
/** Cached {@link probeEgressAvailable}. `available` = the bwrap-sandbox probe. */
|
package/dist/leaderboard.js
CHANGED
|
@@ -121,7 +121,7 @@ function reportDeductions(r) {
|
|
|
121
121
|
{
|
|
122
122
|
n: deadTools,
|
|
123
123
|
weight: exports.W_DANGLING_REF,
|
|
124
|
-
label: "agent tool(s)
|
|
124
|
+
label: "unavailable agent tool(s) (typo / never-available)",
|
|
125
125
|
},
|
|
126
126
|
{
|
|
127
127
|
n: deadMcpTools,
|
package/dist/sandbox.js
CHANGED
|
@@ -55,9 +55,10 @@ function sandboxAvailable() {
|
|
|
55
55
|
return cachedAvailable;
|
|
56
56
|
}
|
|
57
57
|
function probeSandbox() {
|
|
58
|
-
/* v8 ignore
|
|
58
|
+
/* v8 ignore start -- non-Linux has no bwrap; CI/coverage runs on Linux */
|
|
59
59
|
if (process.platform !== "linux")
|
|
60
60
|
return false;
|
|
61
|
+
/* v8 ignore stop */
|
|
61
62
|
try {
|
|
62
63
|
// The capability that fails when user namespaces are disabled is the
|
|
63
64
|
// namespace creation itself (`--unshare-all`), so probe exactly that.
|
|
@@ -67,8 +68,9 @@ function probeSandbox() {
|
|
|
67
68
|
}).status === 0);
|
|
68
69
|
}
|
|
69
70
|
catch {
|
|
70
|
-
/* v8 ignore
|
|
71
|
+
/* v8 ignore start -- defensive: spawnSync only throws on a fork failure */
|
|
71
72
|
return false;
|
|
73
|
+
/* v8 ignore stop */
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
76
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vigiles",
|
|
3
|
-
"version": "14.
|
|
3
|
+
"version": "14.7.0",
|
|
4
4
|
"description": "Lint & test the harness your AI agent runs on — verify the references in your CLAUDE.md / AGENTS.md and test that your hooks and skills actually work.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|
|
@@ -27,6 +27,11 @@
|
|
|
27
27
|
"url": "https://github.com/zernie/vigiles/issues"
|
|
28
28
|
},
|
|
29
29
|
"license": "MIT",
|
|
30
|
+
"workspaces": [
|
|
31
|
+
"packages/*",
|
|
32
|
+
"report",
|
|
33
|
+
"site"
|
|
34
|
+
],
|
|
30
35
|
"bin": {
|
|
31
36
|
"vigiles": "dist/cli.js"
|
|
32
37
|
},
|