@principal-ai/quality-lens-cli 0.1.25 → 0.1.26
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/cli.js
CHANGED
|
@@ -974,7 +974,7 @@ Make sure that all grammar rule definitions are done before 'performSelfAnalysis
|
|
|
974
974
|
`+_.map(c=>c.message).join(`
|
|
975
975
|
`)),this.errors=_}},par=class extends LR{constructor(_){super(_)}},Clt=Ao.default.build("{{digit}}{4}",{digit:aE}),Slt=Ao.default.build("{{digit}}{2}",{digit:aE}),Elt=Ao.default.build("{{digit}}{2}",{digit:aE}),xlt=/[Tt ]/,AFe=Ao.default.build("{{digit}}{2}",{digit:aE}),FFe=Ao.default.build("{{digit}}{2}",{digit:aE}),Tlt=Ao.default.build("{{digit}}{2}",{digit:aE}),dar=Ao.default.build("\\.{{digit}}+",{digit:aE}),mar=Ao.default.build("[+-]{{timeHour}}:{{timeMinute}}",{timeHour:AFe,timeMinute:FFe}),har=Ao.default.build("[Zz]|{{timeNumOffset}}",{timeNumOffset:mar}),kFe=Ao.default.build("{{timeHour}}:{{timeMinute}}:{{timeSecond}}{{timeSecFrac}}?",{timeHour:AFe,timeMinute:FFe,timeSecond:Tlt,timeSecFrac:dar}),IFe=Ao.default.build("{{dateFullYear}}-{{dateMonth}}-{{dateMDay}}",{dateFullYear:Clt,dateMonth:Slt,dateMDay:Elt}),gar=Ao.default.build("{{partialTime}}{{timeOffset}}",{partialTime:kFe,timeOffset:har}),yar=Ao.default.build("{{fullDate}}{{timeDelim}}{{fullTime}}",{fullDate:IFe,timeDelim:xlt,fullTime:gar}),Dar=Ao.default.build("{{fullDate}}{{timeDelim}}{{partialTime}}",{fullDate:IFe,timeDelim:xlt,partialTime:kFe}),bar=IFe,Alt=kFe,Car=Ao.default.build("{{offsetDateTime}}|{{localDateTime}}|{{localDate}}|{{localTime}}",{offsetDateTime:yar,localDateTime:Dar,localDate:bar,localTime:Alt}),Yae=Gu({name:"DateTime",pattern:Car}),Sar=_=>{let c=Ao.default.build("({{dateFullYear}})-({{dateMonth}})-({{dateMDay}})",{dateFullYear:Clt,dateMonth:Slt,dateMDay:Elt}),f=Ao.default.exec(_,c);if(f){let g=Number(f[1]),S=Number(f[2]),w=Number(f[3]),J=new Date(g,S-1,w);return J.getFullYear()===g&&J.getMonth()+1===S&&J.getDate()===w}return!0},Ear=_=>{let c=Ao.default.build("({{timeHour}}):({{timeMinute}}):({{timeSecond}})",{timeHour:AFe,timeMinute:FFe,timeSecond:Tlt}),f=Ao.default.exec(_,c);if(f){let g=Number(f[1]),S=Number(f[2]),w=Number(f[3]),J=new Date(0,0,0,g,S,w);return J.getHours()===g&&J.getMinutes()===S&&J.getSeconds()===w}return!0},xar=_=>Sar(_)&&Ear(_);N1(Yae,_=>{var c;if(!xar(_))throw new LR(`Invalid date time: ${_}`);return((c=_.match(Alt))==null?void 0:c.index)===0?_:new Date(_)});var Flt=Gu({name:"DotSeparator",pattern:/\./,label:"."}),DFe=Gu({name:"ExpressionNewLine",pattern:xk}),Tar=blt,klt=Ao.default.build("{{digit}}({{digit}}|{{underscore}}{{digit}})*",{digit:aE,underscore:XV}),Aar=Ao.default.build("({{minus}}|{{plus}})?{{zeroPrefixableInt}}",{minus:xFe,plus:TFe,zeroPrefixableInt:klt}),Far=Ao.default.build("[Ee]{{floatExpPart}}",{floatExpPart:Aar}),kar=/\./,Iar=Ao.default.build("{{decimalPoint}}{{zeroPrefixableInt}}",{decimalPoint:kar,zeroPrefixableInt:klt}),war=/inf/,Par=/nan/,Nar=Ao.default.build("({{minus}}|{{plus}})?({{inf}}|{{nan}})",{minus:xFe,plus:TFe,inf:war,nan:Par}),Oar=Ao.default.build("{{floatIntPart}}({{exp}}|{{frac}}{{exp}}?)|{{specialFloat}}",{floatIntPart:Tar,exp:Far,frac:Iar,specialFloat:Nar}),Zae=Gu({name:"Float",pattern:Oar}),Lar=_=>_==="inf"||_==="+inf"?1/0:_==="-inf"?-1/0:_==="nan"||_==="+nan"||_==="-nan"?NaN:null;N1(Zae,_=>{let c=Lar(_);if(c!==null)return c;let f=_.replace(/_/g,"");return parseFloat(f)});var Rar=/}/,bFe=Gu({name:"InlineTableClose",pattern:Rar,label:"}",pop_mode:!0}),Mar=/{/,Ilt=Gu({name:"InlineTableOpen",pattern:Mar,label:"{",push_mode:"InlineTable"}),Bar=/,/,wlt=Gu({name:"InlineTableSep",pattern:Bar,label:",",pop_mode:!0,push_mode:"InlineTable"}),YV=Gu({name:"Integer",pattern:z_.NA});N1(YV,HV);var wFe=Gu({name:"KeyValueSeparator",pattern:/=/,label:"=",push_mode:"Value"}),Plt=Gu({name:"Newline",pattern:xk,pop_mode:!0}),Ek=Gu({name:"SimpleKey",pattern:z_.NA});N1(Ek,HV);var Nlt=Gu({name:"StdTableClose",pattern:/]/,label:"]",push_mode:"Value"}),Olt=Gu({name:"StdTableOpen",pattern:/\[/,label:"["}),o7=Gu({name:"String",pattern:z_.NA});N1(o7,HV);var jar=Ao.default.build("{{whiteSpaceChar}}+",{whiteSpaceChar:RR}),Llt=Gu({name:"WhiteSpace",pattern:jar,group:z_.SKIPPED}),Jar=Ao.default.build("^{{whiteSpaceChar}}*{{newline}}(?:{{whiteSpaceChar}}|{{newline}})*",{whiteSpaceChar:RR,newline:xk}),qar=_=>{let c=Ao.default.exec(_,Jar);return c?c[0].length:0},Rlt=_=>{let c="";for(let f=0;f<_.length;f++){let g=_[f];if(g==="\\"){f++;let S=qar(_.slice(f));if(S>0){f+=S-1;continue}switch(_[f]){case"b":c+="\b";break;case"t":c+=" ";break;case"n":c+=`
|
|
976
976
|
`;break;case"f":c+="\f";break;case"r":c+="\r";break;case'"':c+='"';break;case"\\":c+="\\";break;case"u":{let w=_.slice(f+1,f+5),J=parseInt(w,16);if(J>55295&&J<57344)throw new LR(`Invalid Unicode code point: \\u${w}`);c+=String.fromCodePoint(J),f+=4;break}case"U":{let w=_.slice(f+1,f+9),J=parseInt(w,16);if(J>1114111)throw new LR(`Invalid Unicode code point: \\U${w}`);c+=String.fromCodePoint(J),f+=8;break}case _.match(/^[0-7]{1,3}$/):}}else c+=g}return c},Mlt=_=>_.substring(3,_.length-3).replace(/^(\r\n|\n)/,""),zar=Ao.default.build("{{quotationMark}}{3}",{quotationMark:SFe}),War=Ao.default.build("{{whiteSpaceChar}}|!|[#-\\x5B]|[\\x5D-~]|{{nonAscii}}",{whiteSpaceChar:RR,nonAscii:QV}),Uar=Ao.default.build("{{multiLineBasicUnescaped}}|{{escaped}}",{multiLineBasicUnescaped:War,escaped:Dlt}),Var=Ao.default.build("{{whiteSpaceChar}}*",{whiteSpaceChar:RR}),Gar=Ao.default.build("{{escape}}{{whiteSpace}}{{newline}}({{whiteSpaceChar}}|{{newline}})*",{escape:ylt,whiteSpace:Var,newline:xk,whiteSpaceChar:RR}),$ar=Ao.default.build("{{multiLineBasicChar}}|{{newline}}|{{multiLineBasicEscapedNewline}}",{multiLineBasicChar:Uar,newline:xk,multiLineBasicEscapedNewline:Gar}),Har=Ao.default.build("{{quotationMark}}{1,2}",{quotationMark:SFe}),Kar=Ao.default.build("{{multiLineBasicContent}}*({{multiLineBasicQuotes}}{{multiLineBasicContent}}+)*{{multiLineBasicQuotes}}?",{multiLineBasicContent:$ar,multiLineBasicQuotes:Har}),Blt=Gu({name:"MultiLineBasicString",pattern:Ao.default.build("{{multiLineBasicStringDelimiter}}{{newline}}?{{multiLineBasicBody}}{{multiLineBasicStringDelimiter}}",{multiLineBasicStringDelimiter:zar,newline:xk,multiLineBasicBody:Kar}),label:'"""MultiLineBasicString"""',categories:[o7],line_breaks:!0});N1(Blt,_=>{let c=Mlt(_);return Rlt(c)});var Qar=Ao.default.build("{{apostrophe}}{3}",{apostrophe:EFe}),Xar=Ao.default.build(" |[ -&]|[\\x28-~]|{{nonAscii}}",{nonAscii:QV}),Yar=Ao.default.build("{{multiLineLiteralChar}}|{{newline}}",{multiLineLiteralChar:Xar,newline:xk}),Zar=Ao.default.build("{{apostrophe}}{1,2}",{apostrophe:EFe}),eor=Ao.default.build("{{multiLineLiteralContent}}*({{multiLineLiteralQuotes}}{{multiLineLiteralContent}}+)*{{multiLineLiteralQuotes}}?",{multiLineLiteralContent:Yar,multiLineLiteralQuotes:Zar}),jlt=Gu({name:"MultiLineLiteralString",pattern:Ao.default.build("{{multiLineLiteralStringDelimiter}}{{newline}}?{{multiLineLiteralBody}}{{multiLineLiteralStringDelimiter}}",{multiLineLiteralStringDelimiter:Qar,newline:xk,multiLineLiteralBody:eor}),label:"'''MultiLineLiteralString'''",categories:[o7],line_breaks:!0});N1(jlt,Mlt);var PFe=Gu({name:"QuotedKey",pattern:z_.NA,categories:[Ek]});N1(PFe,HV);var tor=Ao.default.build("{{whiteSpaceChar}}|!|[#-\\x5B]|[\\x5D-~]|{{nonAscii}}",{whiteSpaceChar:RR,nonAscii:QV}),ror=Ao.default.build("{{basicUnescaped}}|{{escaped}}",{basicUnescaped:tor,escaped:Dlt}),NFe=Gu({name:"BasicString",pattern:Ao.default.build("{{quotationMark}}{{basicChar}}*{{quotationMark}}",{quotationMark:SFe,basicChar:ror}),label:'"BasicString"',categories:[PFe,o7]});N1(NFe,_=>{let c=_.slice(1,-1);return Rlt(c)});var nor=Ao.default.build(" |[ -&]|[\\x28-~]|{{nonAscii}}",{nonAscii:QV}),OFe=Gu({name:"LiteralString",pattern:Ao.default.build("{{apostrophe}}{{literalChar}}*{{apostrophe}}",{apostrophe:EFe,literalChar:nor}),label:"'LiteralString'",categories:[PFe,o7]});N1(OFe,_=>_.slice(1,-1));var ior=/0x/,sor=/0o/,aor=/0b/,oor=/[0-7]/,cor=/[01]/,uor=Ao.default.build("{{hexPrefix}}{{hexDigit}}({{hexDigit}}|{{underscore}}{{hexDigit}})*",{hexPrefix:ior,hexDigit:vlt,underscore:XV}),lor=Ao.default.build("{{octPrefix}}{{digit0_7}}({{digit0_7}}|{{underscore}}{{digit0_7}})*",{octPrefix:sor,digit0_7:oor,underscore:XV}),_or=Ao.default.build("{{binPrefix}}{{digit0_1}}({{digit0_1}}|{{underscore}}{{digit0_1}})*",{binPrefix:aor,digit0_1:cor,underscore:XV}),por=Ao.default.build("{{hexInteger}}|{{octalInteger}}|{{binaryInteger}}",{hexInteger:uor,octalInteger:lor,binaryInteger:_or}),Jlt=Gu({name:"NonDecimalInteger",pattern:por,categories:[YV]}),dor=(_,c)=>{let f=BigInt(0);for(let g=0;g<_.length;g++){let S=_[g],w=parseInt(S,c);f=f*BigInt(c)+BigInt(w)}return f},mor=_=>{if(_.startsWith("0x"))return 16;if(_.startsWith("0o"))return 8;if(_.startsWith("0b"))return 2};N1(Jlt,_=>{let c=_.replace(/_/g,"").slice(2),f=mor(_),g=parseInt(c,f);return Number.isSafeInteger(g)?g:dor(c,f)});var qlt=Gu({name:"DecimalInteger",pattern:blt,categories:[YV]});N1(qlt,_=>{let c=_.replace(/_/g,""),f=parseInt(c);return Number.isSafeInteger(f)?f||0:BigInt(c)});var hor=/[a-zA-Z]/,gor=Ao.default.build("({{alpha}}|{{digit}}|-|_)+",{alpha:hor,digit:aE}),zlt=Gu({name:"UnquotedKey",pattern:gor,categories:[Ek]});N1(zlt,_=>_);var yor=/#/,vor=Ao.default.build(" |[ -~]|{{nonAscii}}",{nonAscii:QV}),Dor=Ao.default.build("{{commentStartChar}}{{nonEol}}*",{commentStartChar:yor,nonEol:vor}),Wlt=Gu({name:"Comment",pattern:Dor,group:"comment"}),bor=/true/,Ult=Gu({name:"True",pattern:bor,label:"true",categories:[KV]});N1(Ult,()=>!0);var Cor=/false/,Vlt=Gu({name:"False",pattern:Cor,label:"false",categories:[KV]});N1(Vlt,()=>!1);var Sor=Gu({name:"IgnoredNewline",pattern:xk,group:z_.SKIPPED}),Eor=Gu({name:"InlineTableKeyValSep",pattern:/=/,label:"=",push_mode:"Value",pop_mode:!0,categories:[wFe]}),ult=[Llt,NFe,OFe,zlt,Flt,Ek],llt=[Llt,Blt,jlt,NFe,OFe,Ult,Vlt,Yae,Zae,Jlt,qlt,dlt,Ilt,Wlt],Glt={modes:{Key:[Wlt,DFe,wFe,glt,hlt,Olt,Nlt,...ult],Value:[...llt,Plt,wlt,bFe],Array:[...llt,Sor,mlt,plt],InlineTable:[...ult,Eor,bFe]},defaultMode:"Key"},xor=new z_(Glt,{ensureOptimizations:!0,skipValidations:!Xae.isDebug(),traceInitPerf:Xae.isDebug()}),Tor=class extends ZU{toml=this.RULE("toml",()=>{this.MANY(()=>this.CONSUME(DFe)),this.MANY1(()=>{this.SUBRULE1(this.expression),this.OPTION2(()=>{this.CONSUME1(Plt),this.MANY3(()=>this.CONSUME2(DFe))})})});valueCache;dottedKey=this.RULE("dottedKey",()=>{this.CONSUME(Ek),this.AT_LEAST_ONE(()=>{this.CONSUME(Flt),this.CONSUME1(Ek)})});key=this.RULE("key",()=>{this.OR({MAX_LOOKAHEAD:2,DEF:[{ALT:()=>this.SUBRULE(this.dottedKey)},{ALT:()=>this.CONSUME(Ek)}]})});inlineTableKeyValues=this.RULE("inlineTableKeyValues",()=>{this.MANY_SEP({SEP:wlt,DEF:()=>this.SUBRULE(this.keyValue)})});inlineTable=this.RULE("inlineTable",()=>{this.CONSUME(Ilt),this.OPTION(()=>this.SUBRULE(this.inlineTableKeyValues)),this.CONSUME(bFe)});array=this.RULE("array",()=>{this.CONSUME(dlt),this.OPTION(()=>this.SUBRULE(this.arrayValues)),this.CONSUME(plt)});value=this.RULE("value",()=>{this.OR(this.valueCache||(this.valueCache=[{ALT:()=>this.CONSUME(o7)},{ALT:()=>this.CONSUME(KV)},{ALT:()=>this.SUBRULE(this.array)},{ALT:()=>this.SUBRULE(this.inlineTable)},{ALT:()=>this.CONSUME(Yae)},{ALT:()=>this.CONSUME(Zae)},{ALT:()=>this.CONSUME(YV)}]))});keyValue=this.RULE("keyValue",()=>{this.SUBRULE(this.key),this.CONSUME(wFe),this.SUBRULE(this.value)});arrayValues=this.RULE("arrayValues",()=>{this.SUBRULE(this.value);let _=!0;this.MANY({GATE:()=>_,DEF:()=>{this.CONSUME(mlt),this.OPTION(()=>this.SUBRULE1(this.value))||(_=!1)}})});stdTable=this.RULE("stdTable",()=>{this.CONSUME(Olt),this.SUBRULE(this.key),this.CONSUME(Nlt)});arrayTable=this.RULE("arrayTable",()=>{this.CONSUME(glt),this.SUBRULE(this.key),this.CONSUME(hlt)});table=this.RULE("table",()=>{this.OR([{ALT:()=>this.SUBRULE(this.stdTable)},{ALT:()=>this.SUBRULE(this.arrayTable)}])});expression=this.RULE("expression",()=>{this.OR([{ALT:()=>this.SUBRULE(this.keyValue)},{ALT:()=>this.SUBRULE(this.table)}])});constructor(){super(Glt,{traceInitPerf:Xae.isDebug(),maxLookahead:1,skipValidations:!Xae.isDebug()}),this.performSelfAnalysis()}},$V=new Tor,flt=_=>_&&(_.constructor===Object||_.constructor===void 0),Qae=()=>Object.create(null),yFe=(_,c)=>{try{return _()}catch(f){if(f instanceof OR)throw new par(c)}},OR=class extends Error{},Aor=$V.getBaseCstVisitorConstructor(),vFe=Symbol("explicitlyDeclared"),_lt=Symbol("implicitlyDeclared"),GV=Symbol("notEditable"),For=class extends Aor{constructor(){super(),this.validateVisitor()}toml(_){var c;let f=Qae(),g=f;return(c=_.expression)==null||c.forEach(S=>g=this.visit(S,{current:g,root:f})),this.cleanInternalProperties(f),f}expression(_,{current:c,root:f}){if(_.keyValue)return this.visit(_.keyValue,c),c;if(_.table)return this.visit(_.table,f)}keyValue(_,c){let f=this.visit(_.key),g=this.visit(_.value);yFe(()=>this.assignValue(f,g,c),`Cannot assign value to '${f.join(".")}'`)}key(_){return _.dottedKey?this.visit(_.dottedKey):[this.interpret(_,Ek)]}dottedKey(_){return this.interpret(_,Ek)}inlineTableKeyValues(_,c){_.keyValue&&_.keyValue.forEach(f=>this.visit(f,c))}inlineTable(_){let c=Qae();return c[GV]=!0,_.inlineTableKeyValues&&this.visit(_.inlineTableKeyValues,c),c}value(_){return _.array?this.visit(_.array):_.inlineTable?this.visit(_.inlineTable):this.interpret(_,o7,Zae,KV,Yae,YV)}arrayValues(_,c){return _.value.forEach(f=>c.push(this.visit(f))),c}array(_){let c=[];return c[GV]=!0,_.arrayValues?this.visit(_.arrayValues,c):c}table(_,c){if(_.stdTable)return this.visit(_.stdTable,c);if(_.arrayTable)return this.visit(_.arrayTable,c)}stdTable(_,c){let f=this.visit(_.key);return yFe(()=>this.createTable(f,c),`Cannot create table '${f.join(".")}'`)}arrayTable(_,c){let f=this.visit(_.key);return yFe(()=>{let g=this.getOrCreateArray(f,c);if(g[GV])throw new OR;let S=Qae();return g.push(S),S},`Cannot create array table '${f.join(".")}'`)}cleanInternalProperties(_){for(let c of Object.getOwnPropertySymbols(_))delete _[c];for(let c in _)typeof _[c]=="object"&&this.cleanInternalProperties(_[c]),Array.isArray(_[c])&&_[c].forEach(f=>this.cleanInternalProperties(f))}interpret(_,...c){for(let f of c)if(_[f.name]){let g=_[f.name].map(S=>CFe[f.name](S.image,S,f.name));return g.length===1?g[0]:g}}assignPrimitiveValue(_,c,f){if(_ in f)throw new OR;return flt(c)&&(c[vFe]=!0),f[_]=c,f}tryCreatingObject(_,c,f,g,S){if(c[_]){if(!flt(c[_])||!S&&c[_][vFe]||!g&&c[_][_lt]||c[_][GV])throw new OR}else c[_]=Qae(),f&&(c[_][f]=!0);return c[_]}assignValue(_,c,f){let[g,...S]=_;return S.length>0?(this.tryCreatingObject(g,f,_lt,!0,!1),this.assignValue(S,c,f[g])):this.assignPrimitiveValue(g,c,f)}createTable(_,c){let[f,...g]=_;if(g.length>0){if(Array.isArray(c[f])){if(c[f][GV])throw new OR;let S=c[f][c[f].length-1];return this.createTable(g,S)}return this.tryCreatingObject(f,c,null,!0,!0),this.createTable(g,c[f])}return this.tryCreatingObject(f,c,vFe,!1,!1)}getOrCreateArray(_,c){let[f,...g]=_;if(g.length>0){if(Array.isArray(c[f])){let S=c[f][c[f].length-1];return this.getOrCreateArray(g,S)}return this.tryCreatingObject(f,c,null,!0,!0),this.getOrCreateArray(g,c[f])}if(c[f]&&!Array.isArray(c[f]))throw new OR;return c[f]=c[f]||[],c[f]}},kor=new For,LFe=_=>{let c=xor.tokenize(_);if(c.errors.length>0)throw new far(c.errors);$V.input=c.tokens;let f=$V.toml();if($V.errors.length>0)throw new _ar($V.errors);return kor.visit(f)};var Ift=wy(kft(),1);var Mcr={eslint:"linting",biome:"linting",oxlint:"linting",typescript:"types",flow:"types",test:"tests",jest:"tests",vitest:"tests",mocha:"tests",playwright:"tests",cypress:"tests",prettier:"formatting",knip:"deadCode",depcheck:"deadCode",typedoc:"documentation",jsdoc:"documentation",alexandria:"documentation"},Bcr=["eslint","typescript","test","prettier","knip","typedoc","alexandria"],jcr={lint:"eslint",eslint:"eslint",typecheck:"typescript","type-check":"typescript",tsc:"typescript",test:"test",jest:"jest",vitest:"vitest",format:"prettier",prettier:"prettier",knip:"knip",unused:"knip",docs:"alexandria",alexandria:"alexandria",typedoc:"typedoc"},nG=class{static detectLensCommands(c){let f=new Map;for(let g of c)if(g.name.startsWith("lens:")){let S=g.name.split(":");if(S.length>=3){let w=S[1],J=S[2];f.has(w)||f.set(w,{lensId:w,operations:new Set}),f.get(w).operations.add(J),g.isLensCommand=!0,g.lensId=w,g.lensOperation=J}}return f.size===0&&this.applyFallbackDetection(c,f),f}static applyFallbackDetection(c,f){for(let g of c){let S=jcr[g.name];if(S){f.has(S)||f.set(S,{lensId:S,operations:new Set});let w=g.name.includes("coverage")?"coverage":"check";f.get(S).operations.add(w),g.isLensCommand=!0,g.lensId=S,g.lensOperation=w}}}static calculateMetrics(c,f){let g={};for(let[S]of c){let w=Mcr[S];if(w){let J=f?.get(S);J!==void 0&&(g[w]=J)}}return g}static getAvailableLenses(c){return Array.from(c.keys())}static getMissingLenses(c){let f=new Set(c.keys());return Bcr.filter(g=>!f.has(g))}static calculateQualityProfile(c,f){let g=this.detectLensCommands(c),S=this.calculateMetrics(g,f),w=this.getAvailableLenses(g),J=this.getMissingLenses(g);return{hexagon:S,availableLenses:w,missingLenses:J}}};var iG=class{manifestFileName="package.json";packageType="node";canParse(c){return c.endsWith("package.json")}parseContent(c){try{return JSON.parse(c)}catch{return null}}extractPackageData(c,f){let g;f==="package.json"?g="":f.endsWith("/package.json")?g=f.slice(0,-13):g=f;let S=this.extractCommands(c,g);return{name:c.name||"unnamed",version:c.version,path:g,manifestPath:f,packageManager:"unknown",dependencies:c.dependencies||{},devDependencies:c.devDependencies||{},peerDependencies:c.peerDependencies||{},isMonorepoRoot:!!c.workspaces,isWorkspace:!1,parentPackage:void 0,availableCommands:S}}extractCommands(c,f){let g=[];return c.scripts&&Object.entries(c.scripts).forEach(([w,J])=>{g.push({name:w,command:`npm run ${w}`,description:J.length>50?J.substring(0,47)+"...":J,type:"script",workingDirectory:f})}),[{name:"install",command:"npm install",description:"Install dependencies"},{name:"ci",command:"npm ci",description:"Clean install dependencies"},{name:"update",command:"npm update",description:"Update dependencies"}].forEach(w=>{g.push({...w,type:"standard",workingDirectory:f})}),g}detectWorkspaces(c){return Array.isArray(c.workspaces)?c.workspaces:c.workspaces&&typeof c.workspaces=="object"&&"packages"in c.workspaces&&c.workspaces.packages||null}detectPackageManager(c,f){if(c.packageManager){let g=c.packageManager.split("@")[0];if(["npm","yarn","pnpm"].includes(g))return g}return f.some(g=>g.endsWith("yarn.lock"))?"yarn":f.some(g=>g.endsWith("pnpm-lock.yaml"))?"pnpm":(f.some(g=>g.endsWith("package-lock.json")),"npm")}detectConfigs(c,f,g){let S={},w={knip:["knip.json","knip.jsonc",".knip.json","knip.config.js","knip.config.ts","knip.config.mjs"],eslint:[".eslintrc",".eslintrc.js",".eslintrc.json",".eslintrc.yml",".eslintrc.yaml","eslint.config.js","eslint.config.mjs",".eslintrc.cjs"],prettier:[".prettierrc",".prettierrc.js",".prettierrc.json",".prettierrc.yml",".prettierrc.yaml","prettier.config.js",".prettierrc.toml"],typescript:["tsconfig.json","tsconfig.base.json"],jest:["jest.config.js","jest.config.ts","jest.config.mjs","jest.config.cjs","jest.config.json"],vitest:["vitest.config.js","vitest.config.ts","vitest.config.mjs"],webpack:["webpack.config.js","webpack.config.ts","webpack.config.mjs"],vite:["vite.config.js","vite.config.ts","vite.config.mjs"],rollup:["rollup.config.js","rollup.config.ts","rollup.config.mjs"],babel:[".babelrc",".babelrc.js",".babelrc.json","babel.config.js","babel.config.json"],dockerfile:["Dockerfile","dockerfile","Dockerfile.dev","Dockerfile.prod"],gitignore:[".gitignore"],editorconfig:[".editorconfig"]},J=c==="."||c===""?"":c.endsWith("/")?c:c+"/";if(f.allFiles)for(let[re,_e]of Object.entries(w))for(let ve of _e){let Ce=J+ve;if(f.allFiles.some(Y=>Y.path===Ce||Y.relativePath===Ce)){S[re]={path:Ce,exists:!0,type:this.getConfigFileType(ve)};break}}return g&&(g.eslintConfig&&(S.eslint={path:J+"package.json",exists:!0,type:"json",isInline:!0,inlineField:"eslintConfig"}),g.prettier&&(S.prettier={path:J+"package.json",exists:!0,type:"json",isInline:!0,inlineField:"prettier"}),g.jest&&(S.jest={path:J+"package.json",exists:!0,type:"json",isInline:!0,inlineField:"jest"}),g.babel&&(S.babel={path:J+"package.json",exists:!0,type:"json",isInline:!0,inlineField:"babel"})),S}getConfigFileType(c){return c.endsWith(".json")||c.endsWith(".jsonc")?"json":c.endsWith(".yml")||c.endsWith(".yaml")?"yaml":c.endsWith(".toml")?"toml":c.endsWith(".js")||c.endsWith(".mjs")||c.endsWith(".cjs")?"js":c.endsWith(".ts")||c.endsWith(".mts")||c.endsWith(".cts")?"ts":c.endsWith(".ini")?"ini":"custom"}detectDocsFolder(c,f,g){let S=["docs","documentation","doc"],w=c==="."||c===""?"":c;if(w&&!w.endsWith("/")&&(w+="/"),!f.allFiles)return;for(let ve of S){let Ce=w+ve;if(f.allFiles.some(Y=>Y.path?.toLowerCase().startsWith(Ce.toLowerCase()+"/"))){let Y=f.allFiles.find(ut=>ut.path?.toLowerCase().startsWith(Ce.toLowerCase()+"/"))?.path;return Y?Y.substring(0,Y.indexOf("/",w.length)).substring(w.length):ve}}let J=new Map;for(let ve of f.allFiles){if(!ve.path||w!==""&&!ve.path.startsWith(w))continue;let we=(w===""?ve.path:ve.path.substring(w.length)).split("/");if(we.length===2){let Y=we[0],ut=we[1];J.has(Y)||J.set(Y,{docFiles:0,totalFiles:0});let Xe=J.get(Y);Xe.totalFiles++,this.isDocumentationFile(ut)&&Xe.docFiles++}}let re,_e=.5;for(let[ve,Ce]of Array.from(J.entries()))if(Ce.docFiles>=2){let we=Ce.docFiles/Ce.totalFiles;we>_e&&(_e=we,re=ve)}return re}isDocumentationFile(c){let f=c.toLowerCase();return[".md",".mdx",".rst",".txt",".adoc",".asciidoc"].some(J=>f.endsWith(J))?!0:[/^readme/i,/^changelog/i,/^changes/i,/^history/i,/^license/i,/^copying/i,/^install/i,/^usage/i,/^guide/i,/^tutorial/i,/^manual/i,/^faq/i,/^api/i,/^reference/i,/^spec/i,/^specification/i].some(J=>J.test(c))}},ske=class{manifestFileName="pyproject.toml";packageType="python";canParse(c){return c.endsWith("pyproject.toml")||c.endsWith("setup.py")||c.endsWith("requirements.txt")}parseContent(c){try{return LFe(c)}catch{return null}}extractPackageData(c,f){let g,S=f.split("/").pop()||"";f===S?g="":g=f.substring(0,f.lastIndexOf("/"));let w=c.tool?.poetry,J=c.project,re=w?.name||J?.name||"unnamed",_e=w?.version||J?.version,ve={},Ce={};if(w?.dependencies&&Object.entries(w.dependencies).forEach(([Y,ut])=>{Y!=="python"&&(ve[Y]=typeof ut=="string"?ut:JSON.stringify(ut))}),w?.["dev-dependencies"]&&Object.entries(w["dev-dependencies"]).forEach(([Y,ut])=>{Ce[Y]=typeof ut=="string"?ut:JSON.stringify(ut)}),J?.dependencies&&Array.isArray(J.dependencies))try{let Y=J.dependencies.join(`
|
|
977
|
-
`);(0,Ift.parsePipRequirementsFile)(Y).forEach(Xe=>{if(Xe.type==="ProjectName"&&Xe.name){let We="*";Xe.versionSpec&&Xe.versionSpec.length>0&&(We=Xe.versionSpec[0].version||"*"),ve[Xe.name]=We}})}catch(Y){console.warn("Failed to parse PEP 621 dependencies with pip-requirements-js, falling back to simple parsing:",Y),J.dependencies.forEach(ut=>{let Xe=ut.trim(),We=Xe.indexOf(" ");We>0?ve[Xe.substring(0,We)]="*":ve[Xe]="*"})}let we=this.detectPythonPackageManager(c);return{name:re,version:_e,path:g,manifestPath:f,packageManager:we,dependencies:ve,devDependencies:Ce,peerDependencies:{},isMonorepoRoot:!1,isWorkspace:!1,parentPackage:void 0,availableCommands:[]}}detectWorkspaces(c){return null}detectPackageManager(c,f){return this.detectPythonPackageManager(c)}detectPythonPackageManager(c){return c.tool?.poetry?"poetry":"pip"}detectDocsFolder(c,f,g){return new iG().detectDocsFolder(c,f,{})}},ake=class{manifestFileName="Cargo.toml";packageType="cargo";canParse(c){return c.endsWith("Cargo.toml")}parseContent(c){try{return LFe(c)}catch{return null}}extractPackageData(c,f){let g=c.package;if(!g)return null;let S;f==="Cargo.toml"?S="":f.endsWith("/Cargo.toml")?S=f.slice(0,-11):S=f;let w={},J={};return c.dependencies&&Object.entries(c.dependencies).forEach(([re,_e])=>{w[re]=typeof _e=="string"?_e:JSON.stringify(_e)}),c["dev-dependencies"]&&Object.entries(c["dev-dependencies"]).forEach(([re,_e])=>{J[re]=typeof _e=="string"?_e:JSON.stringify(_e)}),{name:g.name||"unnamed",version:g.version,path:S,manifestPath:f,packageManager:"cargo",dependencies:w,devDependencies:J,peerDependencies:{},isMonorepoRoot:!!c.workspace,isWorkspace:!1,parentPackage:void 0,availableCommands:[]}}detectWorkspaces(c){return c.workspace?.members||null}detectPackageManager(){return"cargo"}detectDocsFolder(c,f,g){return new iG().detectDocsFolder(c,f,{})}},qR=class{parsers=[new iG,new ske,new ake];async discoverPackages(c,f){let g=[];if(!c.allFiles)return g;let S=c.allFiles.filter(J=>J.path?this.parsers.some(re=>re.canParse(J.path)):!1),w=c.allFiles.map(J=>J.path).filter(Boolean);for(let J of S){if(!J.path)continue;let re=this.parsers.find(_r=>_r.canParse(J.path));if(!re)continue;let _e=null;if(f)try{let _r=await f(J.path);_r&&(_e=re.parseContent(_r))}catch(_r){console.warn(`Could not read or parse ${J.path}:`,_r);continue}else{let _r=J.path.split("/").slice(-2,-1)[0]||"unnamed";_e=this.createMinimalManifest(re.packageType,_r)}if(!_e)continue;let ve=re.extractPackageData(_e,J.path);if(!ve){console.warn(`[PackageLayerModule] extractPackageData returned null for ${J.path}`,{content:_e,parser:re.packageType});continue}let Ce=J.path.substring(0,J.path.lastIndexOf("/")),we=w.filter(_r=>_r.startsWith(Ce)&&this.isLockFile(_r));ve.packageManager=re.detectPackageManager(_e,we),re.packageType==="node"&&ve.availableCommands&&ve.packageManager&&ve.packageManager!=="unknown"&&ve.packageManager!=="npm"&&(ve.availableCommands=ve.availableCommands.map(_r=>{if(_r.command.includes("npm ")){let Hr=_r.command;return ve.packageManager==="yarn"?Hr=Hr.replace("npm run","yarn").replace("npm install","yarn install").replace("npm ci","yarn install --frozen-lockfile").replace("npm update","yarn upgrade"):ve.packageManager==="pnpm"&&(Hr=Hr.replace("npm","pnpm")),{..._r,command:Hr}}return _r}));let Y={id:`package-manifest-${ve.path}`,name:re.manifestFileName,patterns:[{type:"exact",pattern:J.path,description:`${re.packageType} package manifest`}],matchedFiles:[J.path],fileCount:1},ut;re.detectConfigs&&(ut=re.detectConfigs(ve.path,c,_e));let Xe;re.detectDocsFolder&&(Xe=re.detectDocsFolder(ve.path,c,_e));let We=ve.availableCommands?nG.calculateQualityProfile(ve.availableCommands):void 0,Jt={id:`package-${re.packageType}-${ve.path.replace(/[^a-zA-Z0-9-]/g,"-")}`,name:ve.name,type:re.packageType,enabled:!0,derivedFrom:{fileSets:[Y],derivationType:"content",description:`${re.packageType} package defined in ${re.manifestFileName}`,contentExtraction:{method:"parse",parser:{format:re.manifestFileName.endsWith(".json")?"json":"toml",paths:re.packageType==="node"?[""]:re.packageType==="python"?["tool.poetry","project"]:["package"]}}},packageData:ve,configFiles:ut,docsFolder:Xe,qualityMetrics:We,pillar:"foundationHealth"};g.push(Jt)}return this.resolveWorkspaceRelationships(g),g}createPackageLayersFromBoundaries(c){return c.map(f=>{let g={id:`package-manifest-${f.rootPath||"root"}`,name:"package.json",patterns:[{type:"exact",pattern:f.packageJsonPath,description:"Node.js package manifest"}],matchedFiles:[f.packageJsonPath],fileCount:1},S={name:f.packageData?.name||f.name,version:f.packageData?.version,path:f.rootPath||".",manifestPath:f.packageJsonPath,packageManager:"unknown",dependencies:{},devDependencies:{},peerDependencies:{},isMonorepoRoot:!!f.packageData?.workspaces,isWorkspace:!f.isRoot&&c.length>1,parentPackage:f.isRoot?void 0:"root"};return{id:`package-node-${f.id}`,name:S.name,type:"node",enabled:!0,derivedFrom:{fileSets:[g],derivationType:"content",description:"Node.js package defined in package.json"},packageData:S,pillar:"foundationHealth"}})}isLockFile(c){return["package-lock.json","yarn.lock","pnpm-lock.yaml","poetry.lock","Pipfile.lock","Cargo.lock"].some(g=>c.endsWith(g))}resolveWorkspaceRelationships(c){let f=c.filter(g=>g.packageData.path==="."||g.packageData.path==="");c.forEach(g=>{if(g.packageData.path!=="."&&g.packageData.path!==""){g.packageData.isWorkspace=!0;let S=g.packageData.path.includes("/")?g.packageData.path.substring(0,g.packageData.path.lastIndexOf("/")):".",w=c.find(J=>J.packageData.path===S);w&&(g.packageData.parentPackage=w.packageData.name)}})}createMinimalManifest(c,f){switch(c){case"node":return{name:f,version:"0.0.0",dependencies:{},devDependencies:{}};case"python":return{project:{name:f,version:"0.0.0"}};case"cargo":return{package:{name:f,version:"0.0.0"}};default:return{}}}};var L1=wy(y_t(),1);var Uur=wy(Doe(),1);var Gur=wy(Doe(),1);var $ur=wy(Doe(),1);var NT=wy(require("path")),W4=wy(require("fs/promises")),jke=class{constructor(c){this.basePath=c}async readFile(c){try{let f=NT.isAbsolute(c)?c:NT.join(this.basePath,c);return{content:await W4.readFile(f,"utf-8")}}catch(f){return console.error(`[CLIFileSystemAdapter] Failed to read ${c}:`,f),null}}async fileExists(c){try{let f=NT.isAbsolute(c)?c:NT.join(this.basePath,c);return await W4.access(f),!0}catch{return!1}}async readDirectory(c){try{let f=NT.isAbsolute(c)?c:NT.join(this.basePath,c);return await W4.readdir(f)}catch(f){return console.error(`[CLIFileSystemAdapter] Failed to read directory ${c}:`,f),[]}}async isDirectory(c){try{let f=NT.isAbsolute(c)?c:NT.join(this.basePath,c);return(await W4.stat(f)).isDirectory()}catch{return!1}}async buildFilteredFileTree(c,f,g){return{paths:[]}}},lG=class{constructor(){this.packageModule=new qR}async extractPackages(c,f){try{let g=new jke(f),S=async J=>(await g.readFile(J))?.content||"",w=await this.packageModule.discoverPackages(c,S);return console.info(`[RepositoryScanner] Found ${w.length} packages in ${f}`),w}catch(g){return console.error("[RepositoryScanner] Failed to extract packages:",g),[]}}};var Kv=wy(Xke());var Yke=require("child_process"),Zke=require("stream"),Poe=class{constructor(){this.type="node"}async execute(c,f=[],g={}){let S=Date.now();return new Promise(w=>{let J="",re="",ve={...g.env||process.env};delete ve.NODE_OPTIONS,delete ve.TS_NODE_PROJECT,delete ve.TS_NODE_TRANSPILE_ONLY;let Ce=(0,Yke.spawn)(c,f,{cwd:g.cwd,env:ve,shell:!0});Ce.stdout&&Ce.stdout.on("data",Y=>{J+=Y.toString()}),Ce.stderr&&Ce.stderr.on("data",Y=>{re+=Y.toString()});let we;g.timeout&&(we=setTimeout(()=>{Ce.kill("SIGTERM")},g.timeout)),Ce.on("error",Y=>{we&&clearTimeout(we),w({stdout:J,stderr:re||Y.message,exitCode:1,duration:Date.now()-S,command:c,args:f,error:Y})}),Ce.on("close",Y=>{we&&clearTimeout(we),w({stdout:J,stderr:re,exitCode:Y??0,duration:Date.now()-S,command:c,args:f})})})}stream(c,f=[],g={}){let w={...g.env||process.env};delete w.NODE_OPTIONS,delete w.TS_NODE_PROJECT,delete w.TS_NODE_TRANSPILE_ONLY;let J=(0,Yke.spawn)(c,f,{cwd:g.cwd,env:w,shell:!0}),re=new Promise(_e=>{let ve="",Ce="",we=Date.now();J.stdout&&J.stdout.on("data",Y=>{ve+=Y.toString()}),J.stderr&&J.stderr.on("data",Y=>{Ce+=Y.toString()}),J.on("close",Y=>{_e({stdout:ve,stderr:Ce,exitCode:Y??0,duration:Date.now()-we,command:c,args:f})}),J.on("error",Y=>{_e({stdout:ve,stderr:Ce||Y.message,exitCode:1,duration:Date.now()-we,command:c,args:f,error:Y})})});return{stdout:J.stdout||new Zke.Readable({read(){}}),stderr:J.stderr||new Zke.Readable({read(){}}),exitPromise:re,kill:()=>{J.kill("SIGTERM")}}}async isAvailable(c){try{let f=["--version"];return(await this.execute(c,f,{timeout:5e3})).exitCode===0}catch{return!1}}};var Noe=class{constructor(){this.executor=new Poe,this.lenses=new Map,this.initializeLenses()}initializeLenses(){console.log("[QualityLensService] Initializing lenses...");let c=new Kv.ESLintLens(this.executor);this.lenses.set("eslint",c),this.lenses.set("lint",c);let f=new Kv.JestLens(this.executor);this.lenses.set("jest",f),this.lenses.set("test",f);let g=new Kv.TypeScriptLens(this.executor);this.lenses.set("typescript",g),this.lenses.set("typecheck",g),this.lenses.set("tsc",g);let S=new Kv.KnipLens(this.executor);this.lenses.set("knip",S),this.lenses.set("deadcode",S);let w=new Kv.PrettierLens(this.executor);this.lenses.set("prettier",w),this.lenses.set("format",w);let J=new Kv.GitLens(this.executor);this.lenses.set("git",J);let re=new Kv.AlexandriaLens(this.executor);this.lenses.set("alexandria",re),this.lenses.set("docs",re)}async executeTool(c){let f=Date.now();if(!c.packageLayer||!c.packageCommand)throw new Error("packageLayer and packageCommand are required. Legacy execution has been removed.");return this.executeWithPackageLayer(c,f)}async executeWithPackageLayer(c,f){let{repoPath:g,packageLayer:S,packageCommand:w}=c;if(!S||!w)throw new Error("packageLayer and packageCommand are required for new execution path");let J=S.packageData.path||"",re=J?`${g}/${J}`:g;if(!w.isLensCommand||!w.lensId)return console.log(`[QualityLensService] Not a lens command, executing directly: ${w.name}`),this.executeNonLensCommand(c,w,re,f);let _e=this.lenses.get(w.lensId);if(!_e)return console.warn(`[QualityLensService] No lens registered for: ${w.lensId}`),this.executeNonLensCommand(c,w,re,f);console.log(`[QualityLensService] Using ${_e.name} for command: ${w.name} (lensId: ${w.lensId})`);try{let{command:ve,args:Ce}=this.parseCommandString(w.command);_e.configure({cwd:re,tool:{name:w.lensId,command:ve,args:Ce,cwd:re,available:!0}});let we=await _e.run(),{success:Y,exitCode:ut}=this.determineLensSuccess(we);return{success:Y,toolName:w.lensId,command:w.command,packagePath:J,exitCode:ut,duration:Date.now()-f,stdout:we.raw?.stdout||"",stderr:we.raw?.stderr||we.error?.message||"",lensResult:we,qualityContext:{lensId:w.lensId,operation:w.lensOperation,availableLenses:S.qualityMetrics?.availableLenses,missingLenses:S.qualityMetrics?.missingLenses}}}catch(ve){return console.error("[QualityLensService] Error:",ve),this.createErrorResponse(w.lensId||w.name,w.command,J,ve,f)}}async executeNonLensCommand(c,f,g,S){let{command:w,args:J}=this.parseCommandString(f.command);try{let re=await this.executor.execute(w,J,{cwd:g});return{success:re.exitCode===0,toolName:f.name,command:f.command,packagePath:c.packageLayer?.packageData.path,exitCode:re.exitCode,duration:Date.now()-S,stdout:re.stdout,stderr:re.stderr}}catch(re){return this.createErrorResponse(f.name,f.command,c.packageLayer?.packageData.path,re,S)}}parseCommandString(c){if(c.startsWith("npm run "))return{command:"npm",args:["run",...c.split(" ").slice(2)]};if(c.startsWith("yarn "))return{command:"yarn",args:c.split(" ").slice(1)};if(c.startsWith("pnpm "))return{command:"pnpm",args:c.split(" ").slice(1)};let f=c.split(" ");return{command:f[0]||"",args:f.slice(1)}}determineLensSuccess(c){let f=0;return c.raw?.exitCode!==void 0?f=c.raw.exitCode:(c.error||c.metrics?.issuesBySeverity?.error&&c.metrics.issuesBySeverity.error>0)&&(f=1),{success:f!==127,exitCode:f}}createErrorResponse(c,f,g,S,w){return{success:!1,toolName:c,command:f,packagePath:g,exitCode:1,duration:Date.now()-w,stdout:"",stderr:S.message||"Tool execution failed",error:S.message}}getAvailableLenses(){return Array.from(this.lenses.keys())}hasLensForTool(c){return this.lenses.has(c.toLowerCase())}};var Ooe=class{mapLensToHexagonDimension(c){return{jest:"tests",test:"tests",knip:"deadCode",deadcode:"deadCode",prettier:"formatting",format:"formatting",eslint:"linting",lint:"linting",typescript:"types",typecheck:"types",tsc:"types",alexandria:"documentation"}[c.toLowerCase()]||null}getIssuePath(c){return c.file}findOwningPackage(c,f){let g,S=0;for(let w of f)w.path&&(c.startsWith(w.path+"/")||c===w.path)&&w.path.length>S&&(S=w.path.length,g=w);return g}distributeIssuesToPackages(c){let f=c.filter(w=>w.packagePath&&w.packagePath!=="").map(w=>({name:w.package,path:w.packagePath})).filter((w,J,re)=>re.findIndex(_e=>_e.path===w.path)===J);if(f.length===0)return c;let g=new Map,S=[];for(let w of c){if(w.packagePath&&w.packagePath!==""){S.push(w);continue}let J=w.result?.lensResult?.issues;if(!J||J.length===0){S.push(w);continue}let re=[];for(let _e of J){let ve=this.getIssuePath(_e);if(!ve){re.push(_e);continue}let Ce=this.findOwningPackage(ve,f);if(Ce){let we=Ce.path;g.has(we)||g.set(we,new Map);let Y=g.get(we);Y.has(w.lens)||Y.set(w.lens,[]);let ut=ve.slice(Ce.path.length+1),Xe={..._e,file:ut,originalPath:ve};Y.get(w.lens).push(Xe)}else re.push(_e)}if(w.result?.lensResult){let _e={...w,result:{...w.result,lensResult:{...w.result.lensResult,issues:re,metrics:this.recalculateMetricsFromIssues(w.result.lensResult.metrics,re)}}};S.push(_e)}else S.push(w)}for(let[w,J]of g){let re=f.find(_e=>_e.path===w);if(re)for(let[_e,ve]of J){let Ce=S.findIndex(we=>we.packagePath===w&&we.lens===_e);if(Ce>=0){let we=S[Ce];if(we?.result?.lensResult){let ut=[...we.result.lensResult.issues||[],...ve];S[Ce]={...we,result:{...we.result,lensResult:{...we.result.lensResult,issues:ut,metrics:this.recalculateMetricsFromIssues(we.result.lensResult.metrics,ut)}}}}}else{let we=c.find(ut=>ut.lens===_e&&(!ut.packagePath||ut.packagePath==="")),Y={lensName:_e,tool:_e,timestamp:Date.now(),success:!0,issues:ve,metrics:this.createMetricsFromIssues(ve)};S.push({package:re.name,packagePath:re.path,lens:_e,command:we?.command||_e,timestamp:we?.timestamp||Date.now(),result:{success:!0,toolName:_e,command:we?.command||_e,packagePath:re.path,exitCode:ve.length>0?1:0,duration:0,stdout:"",stderr:"",lensResult:Y}})}}}return S}createMetricsFromIssues(c){let f={error:0,warning:0,info:0,hint:0};for(let S of c){let w=S.severity?.toLowerCase()||"warning";w in f&&f[w]++}return{filesAnalyzed:new Set(c.map(S=>this.getIssuePath(S)).filter(Boolean)).size||1,totalIssues:c.length,issuesBySeverity:f,executionTime:0}}recalculateMetricsFromIssues(c,f){let g=this.createMetricsFromIssues(f);return c?.custom&&(g.custom=c.custom),c?.executionTime&&(g.executionTime=c.executionTime),g}extractQualityScore(c){if(c.result?.lensResult?.qualityScore!==void 0&&c.result.lensResult.qualityScore!==null&&c.result.lensResult.qualityScore>0)return c.result.lensResult.qualityScore;let f=c.result?.lensResult?.metrics;if(f){if(!c.result?.success)return 0;let g=f.totalIssues||0,S=f.filesAnalyzed||1;if(g===0)return 100;let w=f.issuesBySeverity||{},J=(w.error||0)*3,re=(w.warning||0)*2,_e=(w.info||0)*1,ve=(w.hint||0)*.5,we=(J+re+_e+ve)/S,Y=Math.max(0,100-we*10);return Math.round(Y)}return 0}calculateHexagonMetrics(c){let f={tests:0,deadCode:0,formatting:0,linting:0,types:0,documentation:0};for(let g of c){let S=this.mapLensToHexagonDimension(g.lens);if(S){let w=this.extractQualityScore(g);S==="deadCode"&&(w=100-w),S==="deadCode"?f[S]=f[S]===0?w:Math.min(f[S],w):f[S]=Math.max(f[S],w)}}return f}getGitMetadata(){let c={};if(process.env.GITHUB_SHA&&(c.commit=process.env.GITHUB_SHA),process.env.GITHUB_REF){let f=process.env.GITHUB_REF;f.startsWith("refs/heads/")?c.branch=f.replace("refs/heads/",""):f.startsWith("refs/pull/")&&(c.branch=f)}if(process.env.GITHUB_REPOSITORY&&(c.repository=process.env.GITHUB_REPOSITORY),Object.keys(c).length!==0)return c}calculatePerPackageMetrics(c){let f=new Map;for(let S of c){let w=f.get(S.package);w?w.results.push(S):f.set(S.package,{path:S.packagePath,results:[S]})}let g=[];for(let[S,{path:w,results:J}]of f)g.push({name:S,path:w,hexagon:this.calculateHexagonMetrics(J)});return g}format(c){let f=this.getGitMetadata(),g=this.distributeIssuesToPackages(c),S=this.calculatePerPackageMetrics(g),w={metadata:{timestamp:new Date().toISOString(),version:"1.0.0",totalPackages:S.length,totalLenses:g.length,...f&&{git:f}},results:g.map(J=>({package:{name:J.package,path:J.packagePath},lens:{id:J.lens,command:J.command},execution:{success:J.result?.success??!1,exitCode:J.result?.exitCode,duration:J.result?.duration,timestamp:J.timestamp},issues:J.result?.lensResult?.issues||[],metrics:J.result?.lensResult?.metrics||{},coverage:J.result?.lensResult?.coverage,fileMetrics:J.result?.lensResult?.fileMetrics,qualityContext:J.result?.qualityContext||{},error:J.error}))};return S.length>0&&(w.qualityMetrics={packages:S}),JSON.stringify(w,null,2)}};var Z_t=(_=0)=>c=>`\x1B[${c+_}m`,ept=(_=0)=>c=>`\x1B[${38+_};5;${c}m`,tpt=(_=0)=>(c,f,g)=>`\x1B[${38+_};2;${c};${f};${g}m`,Zp={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},Ewr=Object.keys(Zp.modifier),Ilr=Object.keys(Zp.color),wlr=Object.keys(Zp.bgColor),xwr=[...Ilr,...wlr];function Plr(){let _=new Map;for(let[c,f]of Object.entries(Zp)){for(let[g,S]of Object.entries(f))Zp[g]={open:`\x1B[${S[0]}m`,close:`\x1B[${S[1]}m`},f[g]=Zp[g],_.set(S[0],S[1]);Object.defineProperty(Zp,c,{value:f,enumerable:!1})}return Object.defineProperty(Zp,"codes",{value:_,enumerable:!1}),Zp.color.close="\x1B[39m",Zp.bgColor.close="\x1B[49m",Zp.color.ansi=Z_t(),Zp.color.ansi256=ept(),Zp.color.ansi16m=tpt(),Zp.bgColor.ansi=Z_t(10),Zp.bgColor.ansi256=ept(10),Zp.bgColor.ansi16m=tpt(10),Object.defineProperties(Zp,{rgbToAnsi256:{value(c,f,g){return c===f&&f===g?c<8?16:c>248?231:Math.round((c-8)/247*24)+232:16+36*Math.round(c/255*5)+6*Math.round(f/255*5)+Math.round(g/255*5)},enumerable:!1},hexToRgb:{value(c){let f=/[a-f\d]{6}|[a-f\d]{3}/i.exec(c.toString(16));if(!f)return[0,0,0];let[g]=f;g.length===3&&(g=[...g].map(w=>w+w).join(""));let S=Number.parseInt(g,16);return[S>>16&255,S>>8&255,S&255]},enumerable:!1},hexToAnsi256:{value:c=>Zp.rgbToAnsi256(...Zp.hexToRgb(c)),enumerable:!1},ansi256ToAnsi:{value(c){if(c<8)return 30+c;if(c<16)return 90+(c-8);let f,g,S;if(c>=232)f=((c-232)*10+8)/255,g=f,S=f;else{c-=16;let re=c%36;f=Math.floor(c/36)/5,g=Math.floor(re/6)/5,S=re%6/5}let w=Math.max(f,g,S)*2;if(w===0)return 30;let J=30+(Math.round(S)<<2|Math.round(g)<<1|Math.round(f));return w===2&&(J+=60),J},enumerable:!1},rgbToAnsi:{value:(c,f,g)=>Zp.ansi256ToAnsi(Zp.rgbToAnsi256(c,f,g)),enumerable:!1},hexToAnsi:{value:c=>Zp.ansi256ToAnsi(Zp.hexToAnsi256(c)),enumerable:!1}}),Zp}var Nlr=Plr(),lE=Nlr;var Roe=wy(require("node:process"),1),npt=wy(require("node:os"),1),e6e=wy(require("node:tty"),1);function CC(_,c=globalThis.Deno?globalThis.Deno.args:Roe.default.argv){let f=_.startsWith("-")?"":_.length===1?"-":"--",g=c.indexOf(f+_),S=c.indexOf("--");return g!==-1&&(S===-1||g<S)}var{env:ed}=Roe.default,Loe;CC("no-color")||CC("no-colors")||CC("color=false")||CC("color=never")?Loe=0:(CC("color")||CC("colors")||CC("color=true")||CC("color=always"))&&(Loe=1);function Olr(){if("FORCE_COLOR"in ed)return ed.FORCE_COLOR==="true"?1:ed.FORCE_COLOR==="false"?0:ed.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(ed.FORCE_COLOR,10),3)}function Llr(_){return _===0?!1:{level:_,hasBasic:!0,has256:_>=2,has16m:_>=3}}function Rlr(_,{streamIsTTY:c,sniffFlags:f=!0}={}){let g=Olr();g!==void 0&&(Loe=g);let S=f?Loe:g;if(S===0)return 0;if(f){if(CC("color=16m")||CC("color=full")||CC("color=truecolor"))return 3;if(CC("color=256"))return 2}if("TF_BUILD"in ed&&"AGENT_NAME"in ed)return 1;if(_&&!c&&S===void 0)return 0;let w=S||0;if(ed.TERM==="dumb")return w;if(Roe.default.platform==="win32"){let J=npt.default.release().split(".");return Number(J[0])>=10&&Number(J[2])>=10586?Number(J[2])>=14931?3:2:1}if("CI"in ed)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(J=>J in ed)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(J=>J in ed)||ed.CI_NAME==="codeship"?1:w;if("TEAMCITY_VERSION"in ed)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(ed.TEAMCITY_VERSION)?1:0;if(ed.COLORTERM==="truecolor"||ed.TERM==="xterm-kitty"||ed.TERM==="xterm-ghostty"||ed.TERM==="wezterm")return 3;if("TERM_PROGRAM"in ed){let J=Number.parseInt((ed.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(ed.TERM_PROGRAM){case"iTerm.app":return J>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(ed.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(ed.TERM)||"COLORTERM"in ed?1:w}function rpt(_,c={}){let f=Rlr(_,{streamIsTTY:_&&_.isTTY,...c});return Llr(f)}var Mlr={stdout:rpt({isTTY:e6e.default.isatty(1)}),stderr:rpt({isTTY:e6e.default.isatty(2)})},ipt=Mlr;function spt(_,c,f){let g=_.indexOf(c);if(g===-1)return _;let S=c.length,w=0,J="";do J+=_.slice(w,g)+c+f,w=g+S,g=_.indexOf(c,w);while(g!==-1);return J+=_.slice(w),J}function apt(_,c,f,g){let S=0,w="";do{let J=_[g-1]==="\r";w+=_.slice(S,J?g-1:g)+c+(J?`\r
|
|
977
|
+
`);(0,Ift.parsePipRequirementsFile)(Y).forEach(Xe=>{if(Xe.type==="ProjectName"&&Xe.name){let We="*";Xe.versionSpec&&Xe.versionSpec.length>0&&(We=Xe.versionSpec[0].version||"*"),ve[Xe.name]=We}})}catch(Y){console.warn("Failed to parse PEP 621 dependencies with pip-requirements-js, falling back to simple parsing:",Y),J.dependencies.forEach(ut=>{let Xe=ut.trim(),We=Xe.indexOf(" ");We>0?ve[Xe.substring(0,We)]="*":ve[Xe]="*"})}let we=this.detectPythonPackageManager(c);return{name:re,version:_e,path:g,manifestPath:f,packageManager:we,dependencies:ve,devDependencies:Ce,peerDependencies:{},isMonorepoRoot:!1,isWorkspace:!1,parentPackage:void 0,availableCommands:[]}}detectWorkspaces(c){return null}detectPackageManager(c,f){return this.detectPythonPackageManager(c)}detectPythonPackageManager(c){return c.tool?.poetry?"poetry":"pip"}detectDocsFolder(c,f,g){return new iG().detectDocsFolder(c,f,{})}},ake=class{manifestFileName="Cargo.toml";packageType="cargo";canParse(c){return c.endsWith("Cargo.toml")}parseContent(c){try{return LFe(c)}catch{return null}}extractPackageData(c,f){let g=c.package;if(!g)return null;let S;f==="Cargo.toml"?S="":f.endsWith("/Cargo.toml")?S=f.slice(0,-11):S=f;let w={},J={};return c.dependencies&&Object.entries(c.dependencies).forEach(([re,_e])=>{w[re]=typeof _e=="string"?_e:JSON.stringify(_e)}),c["dev-dependencies"]&&Object.entries(c["dev-dependencies"]).forEach(([re,_e])=>{J[re]=typeof _e=="string"?_e:JSON.stringify(_e)}),{name:g.name||"unnamed",version:g.version,path:S,manifestPath:f,packageManager:"cargo",dependencies:w,devDependencies:J,peerDependencies:{},isMonorepoRoot:!!c.workspace,isWorkspace:!1,parentPackage:void 0,availableCommands:[]}}detectWorkspaces(c){return c.workspace?.members||null}detectPackageManager(){return"cargo"}detectDocsFolder(c,f,g){return new iG().detectDocsFolder(c,f,{})}},qR=class{parsers=[new iG,new ske,new ake];async discoverPackages(c,f){let g=[];if(!c.allFiles)return g;let S=c.allFiles.filter(J=>J.path?this.parsers.some(re=>re.canParse(J.path)):!1),w=c.allFiles.map(J=>J.path).filter(Boolean);for(let J of S){if(!J.path)continue;let re=this.parsers.find(_r=>_r.canParse(J.path));if(!re)continue;let _e=null;if(f)try{let _r=await f(J.path);_r&&(_e=re.parseContent(_r))}catch(_r){console.warn(`Could not read or parse ${J.path}:`,_r);continue}else{let _r=J.path.split("/").slice(-2,-1)[0]||"unnamed";_e=this.createMinimalManifest(re.packageType,_r)}if(!_e)continue;let ve=re.extractPackageData(_e,J.path);if(!ve){console.warn(`[PackageLayerModule] extractPackageData returned null for ${J.path}`,{content:_e,parser:re.packageType});continue}let Ce=J.path.substring(0,J.path.lastIndexOf("/")),we=w.filter(_r=>_r.startsWith(Ce)&&this.isLockFile(_r));ve.packageManager=re.detectPackageManager(_e,we),re.packageType==="node"&&ve.availableCommands&&ve.packageManager&&ve.packageManager!=="unknown"&&ve.packageManager!=="npm"&&(ve.availableCommands=ve.availableCommands.map(_r=>{if(_r.command.includes("npm ")){let Hr=_r.command;return ve.packageManager==="yarn"?Hr=Hr.replace("npm run","yarn").replace("npm install","yarn install").replace("npm ci","yarn install --frozen-lockfile").replace("npm update","yarn upgrade"):ve.packageManager==="pnpm"&&(Hr=Hr.replace("npm","pnpm")),{..._r,command:Hr}}return _r}));let Y={id:`package-manifest-${ve.path}`,name:re.manifestFileName,patterns:[{type:"exact",pattern:J.path,description:`${re.packageType} package manifest`}],matchedFiles:[J.path],fileCount:1},ut;re.detectConfigs&&(ut=re.detectConfigs(ve.path,c,_e));let Xe;re.detectDocsFolder&&(Xe=re.detectDocsFolder(ve.path,c,_e));let We=ve.availableCommands?nG.calculateQualityProfile(ve.availableCommands):void 0,Jt={id:`package-${re.packageType}-${ve.path.replace(/[^a-zA-Z0-9-]/g,"-")}`,name:ve.name,type:re.packageType,enabled:!0,derivedFrom:{fileSets:[Y],derivationType:"content",description:`${re.packageType} package defined in ${re.manifestFileName}`,contentExtraction:{method:"parse",parser:{format:re.manifestFileName.endsWith(".json")?"json":"toml",paths:re.packageType==="node"?[""]:re.packageType==="python"?["tool.poetry","project"]:["package"]}}},packageData:ve,configFiles:ut,docsFolder:Xe,qualityMetrics:We,pillar:"foundationHealth"};g.push(Jt)}return this.resolveWorkspaceRelationships(g),g}createPackageLayersFromBoundaries(c){return c.map(f=>{let g={id:`package-manifest-${f.rootPath||"root"}`,name:"package.json",patterns:[{type:"exact",pattern:f.packageJsonPath,description:"Node.js package manifest"}],matchedFiles:[f.packageJsonPath],fileCount:1},S={name:f.packageData?.name||f.name,version:f.packageData?.version,path:f.rootPath||".",manifestPath:f.packageJsonPath,packageManager:"unknown",dependencies:{},devDependencies:{},peerDependencies:{},isMonorepoRoot:!!f.packageData?.workspaces,isWorkspace:!f.isRoot&&c.length>1,parentPackage:f.isRoot?void 0:"root"};return{id:`package-node-${f.id}`,name:S.name,type:"node",enabled:!0,derivedFrom:{fileSets:[g],derivationType:"content",description:"Node.js package defined in package.json"},packageData:S,pillar:"foundationHealth"}})}isLockFile(c){return["package-lock.json","yarn.lock","pnpm-lock.yaml","poetry.lock","Pipfile.lock","Cargo.lock"].some(g=>c.endsWith(g))}resolveWorkspaceRelationships(c){let f=c.filter(g=>g.packageData.path==="."||g.packageData.path==="");c.forEach(g=>{if(g.packageData.path!=="."&&g.packageData.path!==""){g.packageData.isWorkspace=!0;let S=g.packageData.path.includes("/")?g.packageData.path.substring(0,g.packageData.path.lastIndexOf("/")):".",w=c.find(J=>J.packageData.path===S);w&&(g.packageData.parentPackage=w.packageData.name)}})}createMinimalManifest(c,f){switch(c){case"node":return{name:f,version:"0.0.0",dependencies:{},devDependencies:{}};case"python":return{project:{name:f,version:"0.0.0"}};case"cargo":return{package:{name:f,version:"0.0.0"}};default:return{}}}};var L1=wy(y_t(),1);var Uur=wy(Doe(),1);var Gur=wy(Doe(),1);var $ur=wy(Doe(),1);var NT=wy(require("path")),W4=wy(require("fs/promises")),jke=class{constructor(c){this.basePath=c}async readFile(c){try{let f=NT.isAbsolute(c)?c:NT.join(this.basePath,c);return{content:await W4.readFile(f,"utf-8")}}catch(f){return console.error(`[CLIFileSystemAdapter] Failed to read ${c}:`,f),null}}async fileExists(c){try{let f=NT.isAbsolute(c)?c:NT.join(this.basePath,c);return await W4.access(f),!0}catch{return!1}}async readDirectory(c){try{let f=NT.isAbsolute(c)?c:NT.join(this.basePath,c);return await W4.readdir(f)}catch(f){return console.error(`[CLIFileSystemAdapter] Failed to read directory ${c}:`,f),[]}}async isDirectory(c){try{let f=NT.isAbsolute(c)?c:NT.join(this.basePath,c);return(await W4.stat(f)).isDirectory()}catch{return!1}}async buildFilteredFileTree(c,f,g){return{paths:[]}}},lG=class{constructor(){this.packageModule=new qR}async extractPackages(c,f){try{let g=new jke(f),S=async J=>(await g.readFile(J))?.content||"",w=await this.packageModule.discoverPackages(c,S);return console.info(`[RepositoryScanner] Found ${w.length} packages in ${f}`),w}catch(g){return console.error("[RepositoryScanner] Failed to extract packages:",g),[]}}};var Kv=wy(Xke());var Yke=require("child_process"),Zke=require("stream"),Poe=class{constructor(){this.type="node"}async execute(c,f=[],g={}){let S=Date.now();return new Promise(w=>{let J="",re="",ve={...g.env||process.env};delete ve.NODE_OPTIONS,delete ve.TS_NODE_PROJECT,delete ve.TS_NODE_TRANSPILE_ONLY;let Ce=(0,Yke.spawn)(c,f,{cwd:g.cwd,env:ve,shell:!0});Ce.stdout&&Ce.stdout.on("data",Y=>{J+=Y.toString()}),Ce.stderr&&Ce.stderr.on("data",Y=>{re+=Y.toString()});let we;g.timeout&&(we=setTimeout(()=>{Ce.kill("SIGTERM")},g.timeout)),Ce.on("error",Y=>{we&&clearTimeout(we),w({stdout:J,stderr:re||Y.message,exitCode:1,duration:Date.now()-S,command:c,args:f,error:Y})}),Ce.on("close",Y=>{we&&clearTimeout(we),w({stdout:J,stderr:re,exitCode:Y??0,duration:Date.now()-S,command:c,args:f})})})}stream(c,f=[],g={}){let w={...g.env||process.env};delete w.NODE_OPTIONS,delete w.TS_NODE_PROJECT,delete w.TS_NODE_TRANSPILE_ONLY;let J=(0,Yke.spawn)(c,f,{cwd:g.cwd,env:w,shell:!0}),re=new Promise(_e=>{let ve="",Ce="",we=Date.now();J.stdout&&J.stdout.on("data",Y=>{ve+=Y.toString()}),J.stderr&&J.stderr.on("data",Y=>{Ce+=Y.toString()}),J.on("close",Y=>{_e({stdout:ve,stderr:Ce,exitCode:Y??0,duration:Date.now()-we,command:c,args:f})}),J.on("error",Y=>{_e({stdout:ve,stderr:Ce||Y.message,exitCode:1,duration:Date.now()-we,command:c,args:f,error:Y})})});return{stdout:J.stdout||new Zke.Readable({read(){}}),stderr:J.stderr||new Zke.Readable({read(){}}),exitPromise:re,kill:()=>{J.kill("SIGTERM")}}}async isAvailable(c){try{let f=["--version"];return(await this.execute(c,f,{timeout:5e3})).exitCode===0}catch{return!1}}};var Noe=class{constructor(){this.executor=new Poe,this.lenses=new Map,this.initializeLenses()}initializeLenses(){console.log("[QualityLensService] Initializing lenses...");let c=new Kv.ESLintLens(this.executor);this.lenses.set("eslint",c),this.lenses.set("lint",c);let f=new Kv.JestLens(this.executor);this.lenses.set("jest",f),this.lenses.set("test",f);let g=new Kv.TypeScriptLens(this.executor);this.lenses.set("typescript",g),this.lenses.set("typecheck",g),this.lenses.set("tsc",g);let S=new Kv.KnipLens(this.executor);this.lenses.set("knip",S),this.lenses.set("deadcode",S);let w=new Kv.PrettierLens(this.executor);this.lenses.set("prettier",w),this.lenses.set("format",w);let J=new Kv.GitLens(this.executor);this.lenses.set("git",J);let re=new Kv.AlexandriaLens(this.executor);this.lenses.set("alexandria",re),this.lenses.set("docs",re)}async executeTool(c){let f=Date.now();if(!c.packageLayer||!c.packageCommand)throw new Error("packageLayer and packageCommand are required. Legacy execution has been removed.");return this.executeWithPackageLayer(c,f)}async executeWithPackageLayer(c,f){let{repoPath:g,packageLayer:S,packageCommand:w}=c;if(!S||!w)throw new Error("packageLayer and packageCommand are required for new execution path");let J=S.packageData.path||"",re=J?`${g}/${J}`:g;if(!w.isLensCommand||!w.lensId)return console.log(`[QualityLensService] Not a lens command, executing directly: ${w.name}`),this.executeNonLensCommand(c,w,re,f);let _e=this.lenses.get(w.lensId);if(!_e)return console.warn(`[QualityLensService] No lens registered for: ${w.lensId}`),this.executeNonLensCommand(c,w,re,f);console.log(`[QualityLensService] Using ${_e.name} for command: ${w.name} (lensId: ${w.lensId})`);try{let{command:ve,args:Ce}=this.parseCommandString(w.command);_e.configure({cwd:re,tool:{name:w.lensId,command:ve,args:Ce,cwd:re,available:!0}});let we=await _e.run(),{success:Y,exitCode:ut}=this.determineLensSuccess(we);return{success:Y,toolName:w.lensId,command:w.command,packagePath:J,exitCode:ut,duration:Date.now()-f,stdout:we.raw?.stdout||"",stderr:we.raw?.stderr||we.error?.message||"",lensResult:we,qualityContext:{lensId:w.lensId,operation:w.lensOperation,availableLenses:S.qualityMetrics?.availableLenses,missingLenses:S.qualityMetrics?.missingLenses}}}catch(ve){return console.error("[QualityLensService] Error:",ve),this.createErrorResponse(w.lensId||w.name,w.command,J,ve,f)}}async executeNonLensCommand(c,f,g,S){let{command:w,args:J}=this.parseCommandString(f.command);try{let re=await this.executor.execute(w,J,{cwd:g});return{success:re.exitCode===0,toolName:f.name,command:f.command,packagePath:c.packageLayer?.packageData.path,exitCode:re.exitCode,duration:Date.now()-S,stdout:re.stdout,stderr:re.stderr}}catch(re){return this.createErrorResponse(f.name,f.command,c.packageLayer?.packageData.path,re,S)}}parseCommandString(c){if(c.startsWith("npm run "))return{command:"npm",args:["run",...c.split(" ").slice(2)]};if(c.startsWith("yarn "))return{command:"yarn",args:c.split(" ").slice(1)};if(c.startsWith("pnpm "))return{command:"pnpm",args:c.split(" ").slice(1)};let f=c.split(" ");return{command:f[0]||"",args:f.slice(1)}}determineLensSuccess(c){let f=0;return c.raw?.exitCode!==void 0?f=c.raw.exitCode:(c.error||c.metrics?.issuesBySeverity?.error&&c.metrics.issuesBySeverity.error>0)&&(f=1),{success:f!==127,exitCode:f}}createErrorResponse(c,f,g,S,w){return{success:!1,toolName:c,command:f,packagePath:g,exitCode:1,duration:Date.now()-w,stdout:"",stderr:S.message||"Tool execution failed",error:S.message}}getAvailableLenses(){return Array.from(this.lenses.keys())}hasLensForTool(c){return this.lenses.has(c.toLowerCase())}};var Ooe=class{constructor(){this.fileCountsByPackage=new Map}setFileTree(c){this.fileTree=c,this.calculateFileCountsPerPackage()}calculateFileCountsPerPackage(){if(!this.fileTree)return;this.fileCountsByPackage.clear();let c=new Set(["ts","tsx","js","jsx","mts","mjs","cts","cjs",".ts",".tsx",".js",".jsx",".mts",".mjs",".cts",".cjs"]);for(let f of this.fileTree.allFiles){let g=f.extension||"";if(!c.has(g)&&!c.has(g.replace(/^\./,"")))continue;let S=f.relativePath;if(S.includes(".test.")||S.includes(".spec.")||S.includes("__tests__")||S.includes("__mocks__")||S.endsWith(".config.ts")||S.endsWith(".config.js"))continue;let w=this.fileCountsByPackage.get("")||0;this.fileCountsByPackage.set("",w+1);let J=S.split("/"),re="";for(let _e=0;_e<J.length-1;_e++){re=re?`${re}/${J[_e]}`:J[_e];let ve=this.fileCountsByPackage.get(re)||0;this.fileCountsByPackage.set(re,ve+1)}}}getFileCountForPackage(c){return this.fileCountsByPackage.get(c||"")||0}mapLensToHexagonDimension(c){return{jest:"tests",test:"tests",knip:"deadCode",deadcode:"deadCode",prettier:"formatting",format:"formatting",eslint:"linting",lint:"linting",typescript:"types",typecheck:"types",tsc:"types",alexandria:"documentation"}[c.toLowerCase()]||null}getIssuePath(c){return c.file}findOwningPackage(c,f){let g,S=0;for(let w of f)w.path&&(c.startsWith(w.path+"/")||c===w.path)&&w.path.length>S&&(S=w.path.length,g=w);return g}distributeIssuesToPackages(c){let f=c.filter(w=>w.packagePath&&w.packagePath!=="").map(w=>({name:w.package,path:w.packagePath})).filter((w,J,re)=>re.findIndex(_e=>_e.path===w.path)===J);if(f.length===0)return c;let g=new Map,S=[];for(let w of c){if(w.packagePath&&w.packagePath!==""){S.push(w);continue}let J=w.result?.lensResult?.issues;if(!J||J.length===0){S.push(w);continue}let re=[];for(let _e of J){let ve=this.getIssuePath(_e);if(!ve){re.push(_e);continue}let Ce=this.findOwningPackage(ve,f);if(Ce){let we=Ce.path;g.has(we)||g.set(we,new Map);let Y=g.get(we);Y.has(w.lens)||Y.set(w.lens,[]);let ut=ve.slice(Ce.path.length+1),Xe={..._e,file:ut,originalPath:ve};Y.get(w.lens).push(Xe)}else re.push(_e)}if(w.result?.lensResult){let _e={...w,result:{...w.result,lensResult:{...w.result.lensResult,issues:re,metrics:this.recalculateMetricsFromIssues(w.result.lensResult.metrics,re)}}};S.push(_e)}else S.push(w)}for(let[w,J]of g){let re=f.find(_e=>_e.path===w);if(re)for(let[_e,ve]of J){let Ce=S.findIndex(we=>we.packagePath===w&&we.lens===_e);if(Ce>=0){let we=S[Ce];if(we?.result?.lensResult){let ut=[...we.result.lensResult.issues||[],...ve];S[Ce]={...we,result:{...we.result,lensResult:{...we.result.lensResult,issues:ut,metrics:this.recalculateMetricsFromIssues(we.result.lensResult.metrics,ut)}}}}}else{let we=c.find(ut=>ut.lens===_e&&(!ut.packagePath||ut.packagePath==="")),Y={lensName:_e,tool:_e,timestamp:Date.now(),success:!0,issues:ve,metrics:this.createMetricsFromIssues(ve)};S.push({package:re.name,packagePath:re.path,lens:_e,command:we?.command||_e,timestamp:we?.timestamp||Date.now(),result:{success:!0,toolName:_e,command:we?.command||_e,packagePath:re.path,exitCode:ve.length>0?1:0,duration:0,stdout:"",stderr:"",lensResult:Y}})}}}return S}createMetricsFromIssues(c){let f={error:0,warning:0,info:0,hint:0};for(let S of c){let w=S.severity?.toLowerCase()||"warning";w in f&&f[w]++}return{filesAnalyzed:new Set(c.map(S=>this.getIssuePath(S)).filter(Boolean)).size||1,totalIssues:c.length,issuesBySeverity:f,executionTime:0}}recalculateMetricsFromIssues(c,f){let g=this.createMetricsFromIssues(f);return c?.custom&&(g.custom=c.custom),c?.executionTime&&(g.executionTime=c.executionTime),g}extractQualityScore(c){if(c.result?.lensResult?.qualityScore!==void 0&&c.result.lensResult.qualityScore!==null&&c.result.lensResult.qualityScore>0)return c.result.lensResult.qualityScore;if(!c.result?.success)return 0;let f=c.result?.lensResult?.issues||[];if(f.length===0)return 100;let g=new Set(f.map(_e=>_e.file)).size,S=c.packagePath||"",w=this.getFileCountForPackage(S);if(w===0){let _e=c.result?.lensResult?.metrics?.filesAnalyzed||1,ve=Math.max(0,_e-g);return Math.round(ve/_e*100)}let J=Math.max(0,w-g);return Math.round(J/w*100)}calculateHexagonMetrics(c){let f={tests:0,deadCode:0,formatting:0,linting:0,types:0,documentation:0};for(let g of c){let S=this.mapLensToHexagonDimension(g.lens);if(S){let w=this.extractQualityScore(g);S==="deadCode"&&(w=100-w),S==="deadCode"?f[S]=f[S]===0?w:Math.min(f[S],w):f[S]=Math.max(f[S],w)}}return f}getGitMetadata(){let c={};if(process.env.GITHUB_SHA&&(c.commit=process.env.GITHUB_SHA),process.env.GITHUB_REF){let f=process.env.GITHUB_REF;f.startsWith("refs/heads/")?c.branch=f.replace("refs/heads/",""):f.startsWith("refs/pull/")&&(c.branch=f)}if(process.env.GITHUB_REPOSITORY&&(c.repository=process.env.GITHUB_REPOSITORY),Object.keys(c).length!==0)return c}calculatePerPackageMetrics(c){let f=new Map;for(let S of c){let w=f.get(S.package);w?w.results.push(S):f.set(S.package,{path:S.packagePath,results:[S]})}let g=[];for(let[S,{path:w,results:J}]of f)g.push({name:S,path:w,hexagon:this.calculateHexagonMetrics(J)});return g}format(c){let f=this.getGitMetadata(),g=this.distributeIssuesToPackages(c),S=this.calculatePerPackageMetrics(g),w={metadata:{timestamp:new Date().toISOString(),version:"1.0.0",totalPackages:S.length,totalLenses:g.length,...f&&{git:f}},results:g.map(J=>({package:{name:J.package,path:J.packagePath},lens:{id:J.lens,command:J.command},execution:{success:J.result?.success??!1,exitCode:J.result?.exitCode,duration:J.result?.duration,timestamp:J.timestamp},issues:J.result?.lensResult?.issues||[],metrics:J.result?.lensResult?.metrics||{},coverage:J.result?.lensResult?.coverage,fileMetrics:J.result?.lensResult?.fileMetrics,qualityContext:J.result?.qualityContext||{},error:J.error}))};return S.length>0&&(w.qualityMetrics={packages:S}),JSON.stringify(w,null,2)}};var Z_t=(_=0)=>c=>`\x1B[${c+_}m`,ept=(_=0)=>c=>`\x1B[${38+_};5;${c}m`,tpt=(_=0)=>(c,f,g)=>`\x1B[${38+_};2;${c};${f};${g}m`,Zp={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},Ewr=Object.keys(Zp.modifier),Ilr=Object.keys(Zp.color),wlr=Object.keys(Zp.bgColor),xwr=[...Ilr,...wlr];function Plr(){let _=new Map;for(let[c,f]of Object.entries(Zp)){for(let[g,S]of Object.entries(f))Zp[g]={open:`\x1B[${S[0]}m`,close:`\x1B[${S[1]}m`},f[g]=Zp[g],_.set(S[0],S[1]);Object.defineProperty(Zp,c,{value:f,enumerable:!1})}return Object.defineProperty(Zp,"codes",{value:_,enumerable:!1}),Zp.color.close="\x1B[39m",Zp.bgColor.close="\x1B[49m",Zp.color.ansi=Z_t(),Zp.color.ansi256=ept(),Zp.color.ansi16m=tpt(),Zp.bgColor.ansi=Z_t(10),Zp.bgColor.ansi256=ept(10),Zp.bgColor.ansi16m=tpt(10),Object.defineProperties(Zp,{rgbToAnsi256:{value(c,f,g){return c===f&&f===g?c<8?16:c>248?231:Math.round((c-8)/247*24)+232:16+36*Math.round(c/255*5)+6*Math.round(f/255*5)+Math.round(g/255*5)},enumerable:!1},hexToRgb:{value(c){let f=/[a-f\d]{6}|[a-f\d]{3}/i.exec(c.toString(16));if(!f)return[0,0,0];let[g]=f;g.length===3&&(g=[...g].map(w=>w+w).join(""));let S=Number.parseInt(g,16);return[S>>16&255,S>>8&255,S&255]},enumerable:!1},hexToAnsi256:{value:c=>Zp.rgbToAnsi256(...Zp.hexToRgb(c)),enumerable:!1},ansi256ToAnsi:{value(c){if(c<8)return 30+c;if(c<16)return 90+(c-8);let f,g,S;if(c>=232)f=((c-232)*10+8)/255,g=f,S=f;else{c-=16;let re=c%36;f=Math.floor(c/36)/5,g=Math.floor(re/6)/5,S=re%6/5}let w=Math.max(f,g,S)*2;if(w===0)return 30;let J=30+(Math.round(S)<<2|Math.round(g)<<1|Math.round(f));return w===2&&(J+=60),J},enumerable:!1},rgbToAnsi:{value:(c,f,g)=>Zp.ansi256ToAnsi(Zp.rgbToAnsi256(c,f,g)),enumerable:!1},hexToAnsi:{value:c=>Zp.ansi256ToAnsi(Zp.hexToAnsi256(c)),enumerable:!1}}),Zp}var Nlr=Plr(),lE=Nlr;var Roe=wy(require("node:process"),1),npt=wy(require("node:os"),1),e6e=wy(require("node:tty"),1);function CC(_,c=globalThis.Deno?globalThis.Deno.args:Roe.default.argv){let f=_.startsWith("-")?"":_.length===1?"-":"--",g=c.indexOf(f+_),S=c.indexOf("--");return g!==-1&&(S===-1||g<S)}var{env:ed}=Roe.default,Loe;CC("no-color")||CC("no-colors")||CC("color=false")||CC("color=never")?Loe=0:(CC("color")||CC("colors")||CC("color=true")||CC("color=always"))&&(Loe=1);function Olr(){if("FORCE_COLOR"in ed)return ed.FORCE_COLOR==="true"?1:ed.FORCE_COLOR==="false"?0:ed.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(ed.FORCE_COLOR,10),3)}function Llr(_){return _===0?!1:{level:_,hasBasic:!0,has256:_>=2,has16m:_>=3}}function Rlr(_,{streamIsTTY:c,sniffFlags:f=!0}={}){let g=Olr();g!==void 0&&(Loe=g);let S=f?Loe:g;if(S===0)return 0;if(f){if(CC("color=16m")||CC("color=full")||CC("color=truecolor"))return 3;if(CC("color=256"))return 2}if("TF_BUILD"in ed&&"AGENT_NAME"in ed)return 1;if(_&&!c&&S===void 0)return 0;let w=S||0;if(ed.TERM==="dumb")return w;if(Roe.default.platform==="win32"){let J=npt.default.release().split(".");return Number(J[0])>=10&&Number(J[2])>=10586?Number(J[2])>=14931?3:2:1}if("CI"in ed)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(J=>J in ed)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(J=>J in ed)||ed.CI_NAME==="codeship"?1:w;if("TEAMCITY_VERSION"in ed)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(ed.TEAMCITY_VERSION)?1:0;if(ed.COLORTERM==="truecolor"||ed.TERM==="xterm-kitty"||ed.TERM==="xterm-ghostty"||ed.TERM==="wezterm")return 3;if("TERM_PROGRAM"in ed){let J=Number.parseInt((ed.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(ed.TERM_PROGRAM){case"iTerm.app":return J>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(ed.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(ed.TERM)||"COLORTERM"in ed?1:w}function rpt(_,c={}){let f=Rlr(_,{streamIsTTY:_&&_.isTTY,...c});return Llr(f)}var Mlr={stdout:rpt({isTTY:e6e.default.isatty(1)}),stderr:rpt({isTTY:e6e.default.isatty(2)})},ipt=Mlr;function spt(_,c,f){let g=_.indexOf(c);if(g===-1)return _;let S=c.length,w=0,J="";do J+=_.slice(w,g)+c+f,w=g+S,g=_.indexOf(c,w);while(g!==-1);return J+=_.slice(w),J}function apt(_,c,f,g){let S=0,w="";do{let J=_[g-1]==="\r";w+=_.slice(S,J?g-1:g)+c+(J?`\r
|
|
978
978
|
`:`
|
|
979
979
|
`)+f,S=g+1,g=_.indexOf(`
|
|
980
980
|
`,S)}while(g!==-1);return w+=_.slice(S),w}var{stdout:opt,stderr:cpt}=ipt,t6e=Symbol("GENERATOR"),QR=Symbol("STYLER"),_G=Symbol("IS_EMPTY"),upt=["ansi","ansi","ansi256","ansi16m"],XR=Object.create(null),Blr=(_,c={})=>{if(c.level&&!(Number.isInteger(c.level)&&c.level>=0&&c.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let f=opt?opt.level:0;_.level=c.level===void 0?f:c.level};var jlr=_=>{let c=(...f)=>f.join(" ");return Blr(c,_),Object.setPrototypeOf(c,pG.prototype),c};function pG(_){return jlr(_)}Object.setPrototypeOf(pG.prototype,Function.prototype);for(let[_,c]of Object.entries(lE))XR[_]={get(){let f=Moe(this,n6e(c.open,c.close,this[QR]),this[_G]);return Object.defineProperty(this,_,{value:f}),f}};XR.visible={get(){let _=Moe(this,this[QR],!0);return Object.defineProperty(this,"visible",{value:_}),_}};var r6e=(_,c,f,...g)=>_==="rgb"?c==="ansi16m"?lE[f].ansi16m(...g):c==="ansi256"?lE[f].ansi256(lE.rgbToAnsi256(...g)):lE[f].ansi(lE.rgbToAnsi(...g)):_==="hex"?r6e("rgb",c,f,...lE.hexToRgb(...g)):lE[f][_](...g),Jlr=["rgb","hex","ansi256"];for(let _ of Jlr){XR[_]={get(){let{level:f}=this;return function(...g){let S=n6e(r6e(_,upt[f],"color",...g),lE.color.close,this[QR]);return Moe(this,S,this[_G])}}};let c="bg"+_[0].toUpperCase()+_.slice(1);XR[c]={get(){let{level:f}=this;return function(...g){let S=n6e(r6e(_,upt[f],"bgColor",...g),lE.bgColor.close,this[QR]);return Moe(this,S,this[_G])}}}}var qlr=Object.defineProperties(()=>{},{...XR,level:{enumerable:!0,get(){return this[t6e].level},set(_){this[t6e].level=_}}}),n6e=(_,c,f)=>{let g,S;return f===void 0?(g=_,S=c):(g=f.openAll+_,S=c+f.closeAll),{open:_,close:c,openAll:g,closeAll:S,parent:f}},Moe=(_,c,f)=>{let g=(...S)=>zlr(g,S.length===1?""+S[0]:S.join(" "));return Object.setPrototypeOf(g,qlr),g[t6e]=_,g[QR]=c,g[_G]=f,g},zlr=(_,c)=>{if(_.level<=0||!c)return _[_G]?"":c;let f=_[QR];if(f===void 0)return c;let{openAll:g,closeAll:S}=f;if(c.includes("\x1B"))for(;f!==void 0;)c=spt(c,f.close,f.open),f=f.parent;let w=c.indexOf(`
|
|
@@ -1099,7 +1099,7 @@ jobs:
|
|
|
1099
1099
|
name: quality-lens-results-\${{ github.sha }}
|
|
1100
1100
|
path: results.json
|
|
1101
1101
|
if-no-files-found: warn
|
|
1102
|
-
`,s6e={eslint:{bin:"eslint",args:[".","--ext",".ts,.tsx,.js,.jsx","--format","json"]},lint:{bin:"eslint",args:[".","--ext",".ts,.tsx,.js,.jsx","--format","json"]},typescript:{bin:"tsc",args:["--noEmit","--pretty","false"]},typecheck:{bin:"tsc",args:["--noEmit","--pretty","false"]},jest:{bin:"jest",args:["--passWithNoTests","--json","--no-colors"]},test:{bin:"jest",args:["--passWithNoTests","--json","--no-colors"]},prettier:{bin:"prettier",args:["--check",".","--no-error-on-unmatched-pattern","--no-color"]},format:{bin:"prettier",args:["--check",".","--no-error-on-unmatched-pattern","--no-color"]},knip:{bin:"knip",args:["--reporter","json"]},alexandria:{bin:"alexandria",args:["lint","--json","--errors-only"]},docs:{bin:"alexandria",args:["lint","--json","--errors-only"]}},Joe={eslint:["npx","--yes","eslint",".","--ext",".ts,.tsx,.js,.jsx","--format","json"],lint:["npx","--yes","eslint",".","--ext",".ts,.tsx,.js,.jsx","--format","json"],typescript:["npx","--yes","tsc","--noEmit","--pretty","false"],typecheck:["npx","--yes","tsc","--noEmit","--pretty","false"],jest:["npx","--yes","jest","--passWithNoTests","--json","--no-colors"],test:["npx","--yes","jest","--passWithNoTests","--json","--no-colors"],prettier:["npx","--yes","prettier","--check",".","--no-error-on-unmatched-pattern","--no-color"],format:["npx","--yes","prettier","--check",".","--no-error-on-unmatched-pattern","--no-color"],knip:["npx","--yes","knip","--reporter","json"],alexandria:["npx","--yes","@principal-ai/alexandria-cli","lint","--json","--errors-only"],docs:["npx","--yes","@principal-ai/alexandria-cli","lint","--json","--errors-only"]};async function $lr(_,c){let f=fE.join(_,"node_modules",".bin",c);try{return await OT.access(f),!0}catch{return!1}}function Hlr(_,c){let f=Date.now(),g=s6e[_];return g?new Promise(S=>{let w="",J="",_e=`"${fE.join(c,"node_modules",".bin",g.bin)}" ${g.args.join(" ")}`,ve=(0,a6e.spawn)(_e,[],{cwd:c,shell:!0});ve.stdout&&ve.stdout.on("data",Ce=>{w+=Ce.toString()}),ve.stderr&&ve.stderr.on("data",Ce=>{J+=Ce.toString()}),ve.on("close",Ce=>{S({success:Ce!==null&&Ce!==127,stdout:w,stderr:J,duration:Date.now()-f,exitCode:Ce??1})}),ve.on("error",Ce=>{S({success:!1,stdout:w,stderr:J||Ce.message,duration:Date.now()-f,exitCode:1})})}):Promise.resolve({success:!1,stdout:"",stderr:`No local command defined for lens: ${_}`,duration:Date.now()-f,exitCode:1})}function Klr(_,c){let f=Date.now(),g=Joe[_];return g?new Promise(S=>{let w="",J="",re=g.join(" "),_e=(0,a6e.spawn)(re,[],{cwd:c,shell:!0});_e.stdout&&_e.stdout.on("data",ve=>{w+=ve.toString()}),_e.stderr&&_e.stderr.on("data",ve=>{J+=ve.toString()}),_e.on("close",ve=>{S({success:ve!==null&&ve!==127,stdout:w,stderr:J,duration:Date.now()-f,exitCode:ve??1})}),_e.on("error",ve=>{S({success:!1,stdout:w,stderr:J||ve.message,duration:Date.now()-f,exitCode:1})})}):Promise.resolve({success:!1,stdout:"",stderr:`No npx command defined for lens: ${_}`,duration:Date.now()-f,exitCode:1})}async function lpt(_){let c=await fpt(_,"");return new joe().build({files:c,rootPath:_})}async function fpt(_,c){let f=[],g=await OT.readdir(_,{withFileTypes:!0});for(let S of g){if(Qlr(S.name))continue;let w=fE.join(_,S.name),J=c?`${c}/${S.name}`:S.name;if(S.isDirectory()){let re=await fpt(w,J);f.push(...re)}else S.isFile()&&f.push(J)}return f}function Qlr(_){return["node_modules",".git",".next",".nuxt","dist","build","coverage",".turbo",".cache"].includes(_)||_.startsWith(".")}async function Xlr(_){let c=new lG,f=new Noe,g=new Ooe,S=new Boe;try{let w=fE.resolve(_.path);console.log(`Scanning repository: ${w}`);let J=await lpt(w)
|
|
1102
|
+
`,s6e={eslint:{bin:"eslint",args:[".","--ext",".ts,.tsx,.js,.jsx","--format","json"]},lint:{bin:"eslint",args:[".","--ext",".ts,.tsx,.js,.jsx","--format","json"]},typescript:{bin:"tsc",args:["--noEmit","--pretty","false"]},typecheck:{bin:"tsc",args:["--noEmit","--pretty","false"]},jest:{bin:"jest",args:["--passWithNoTests","--json","--no-colors"]},test:{bin:"jest",args:["--passWithNoTests","--json","--no-colors"]},prettier:{bin:"prettier",args:["--check",".","--no-error-on-unmatched-pattern","--no-color"]},format:{bin:"prettier",args:["--check",".","--no-error-on-unmatched-pattern","--no-color"]},knip:{bin:"knip",args:["--reporter","json"]},alexandria:{bin:"alexandria",args:["lint","--json","--errors-only"]},docs:{bin:"alexandria",args:["lint","--json","--errors-only"]}},Joe={eslint:["npx","--yes","eslint",".","--ext",".ts,.tsx,.js,.jsx","--format","json"],lint:["npx","--yes","eslint",".","--ext",".ts,.tsx,.js,.jsx","--format","json"],typescript:["npx","--yes","tsc","--noEmit","--pretty","false"],typecheck:["npx","--yes","tsc","--noEmit","--pretty","false"],jest:["npx","--yes","jest","--passWithNoTests","--json","--no-colors"],test:["npx","--yes","jest","--passWithNoTests","--json","--no-colors"],prettier:["npx","--yes","prettier","--check",".","--no-error-on-unmatched-pattern","--no-color"],format:["npx","--yes","prettier","--check",".","--no-error-on-unmatched-pattern","--no-color"],knip:["npx","--yes","knip","--reporter","json"],alexandria:["npx","--yes","@principal-ai/alexandria-cli","lint","--json","--errors-only"],docs:["npx","--yes","@principal-ai/alexandria-cli","lint","--json","--errors-only"]};async function $lr(_,c){let f=fE.join(_,"node_modules",".bin",c);try{return await OT.access(f),!0}catch{return!1}}function Hlr(_,c){let f=Date.now(),g=s6e[_];return g?new Promise(S=>{let w="",J="",_e=`"${fE.join(c,"node_modules",".bin",g.bin)}" ${g.args.join(" ")}`,ve=(0,a6e.spawn)(_e,[],{cwd:c,shell:!0});ve.stdout&&ve.stdout.on("data",Ce=>{w+=Ce.toString()}),ve.stderr&&ve.stderr.on("data",Ce=>{J+=Ce.toString()}),ve.on("close",Ce=>{S({success:Ce!==null&&Ce!==127,stdout:w,stderr:J,duration:Date.now()-f,exitCode:Ce??1})}),ve.on("error",Ce=>{S({success:!1,stdout:w,stderr:J||Ce.message,duration:Date.now()-f,exitCode:1})})}):Promise.resolve({success:!1,stdout:"",stderr:`No local command defined for lens: ${_}`,duration:Date.now()-f,exitCode:1})}function Klr(_,c){let f=Date.now(),g=Joe[_];return g?new Promise(S=>{let w="",J="",re=g.join(" "),_e=(0,a6e.spawn)(re,[],{cwd:c,shell:!0});_e.stdout&&_e.stdout.on("data",ve=>{w+=ve.toString()}),_e.stderr&&_e.stderr.on("data",ve=>{J+=ve.toString()}),_e.on("close",ve=>{S({success:ve!==null&&ve!==127,stdout:w,stderr:J,duration:Date.now()-f,exitCode:ve??1})}),_e.on("error",ve=>{S({success:!1,stdout:w,stderr:J||ve.message,duration:Date.now()-f,exitCode:1})})}):Promise.resolve({success:!1,stdout:"",stderr:`No npx command defined for lens: ${_}`,duration:Date.now()-f,exitCode:1})}async function lpt(_){let c=await fpt(_,"");return new joe().build({files:c,rootPath:_})}async function fpt(_,c){let f=[],g=await OT.readdir(_,{withFileTypes:!0});for(let S of g){if(Qlr(S.name))continue;let w=fE.join(_,S.name),J=c?`${c}/${S.name}`:S.name;if(S.isDirectory()){let re=await fpt(w,J);f.push(...re)}else S.isFile()&&f.push(J)}return f}function Qlr(_){return["node_modules",".git",".next",".nuxt","dist","build","coverage",".turbo",".cache"].includes(_)||_.startsWith(".")}async function Xlr(_){let c=new lG,f=new Noe,g=new Ooe,S=new Boe;try{let w=fE.resolve(_.path);console.log(`Scanning repository: ${w}`);let J=await lpt(w);g.setFileTree(J);let re=await c.extractPackages(J,w);re.length===0&&(console.warn("No packages found in repository"),process.exit(1)),console.log(`Found ${re.length} package(s)`);let _e=_.lenses?_.lenses.split(",").map(we=>we.trim()):null,ve=[];for(let we of re){let Y=we.packageData.availableCommands?.filter(We=>!(!We.isLensCommand||_e&&!_e.includes(We.lensId||"")));if(!Y||Y.length===0){console.log(`Skipping ${we.packageData.name} (no lens commands)`);continue}console.log(`
|
|
1103
1103
|
Running lenses for ${we.packageData.name}...`);let ut=we.packageData.path||"",Xe=ut?fE.join(w,ut):w;for(let We of Y){let Jt=We.lensId||"unknown";console.log(` - ${Jt}: ${We.name}`);try{let _r;if(_.install&&(s6e[Jt]||Joe[Jt])){let Hr=s6e[Jt],Pn=Hr?await $lr(Xe,Hr.bin):!1,ki,ns;Pn&&Hr?(console.log(` [local] Using installed ${Hr.bin}`),ki=await Hlr(Jt,Xe),ns=`node_modules/.bin/${Hr.bin} ${Hr.args.join(" ")}`):Joe[Jt]?(console.log(" [npx] Tool not installed locally, using npx"),ki=await Klr(Jt,Xe),ns=Joe[Jt].join(" ")):(ki={success:!1,stdout:"",stderr:`No command available for lens: ${Jt}`,duration:0,exitCode:1},ns="none");let Vn=Vlr(Jt,ki.stdout,ki.stderr,ki.exitCode,Xe);_r={success:ki.success,toolName:Jt,command:ns,packagePath:ut,exitCode:ki.exitCode,duration:ki.duration,stdout:ki.stdout,stderr:ki.stderr,lensResult:Vn}}else _r=await f.executeTool({repoPath:w,packageLayer:we,packageCommand:We});ve.push({package:we.packageData.name,packagePath:we.packageData.path,lens:Jt,command:We.name,result:_r,timestamp:Date.now()}),console.log(` ${_r.success?"\u2713":"\u2717"} ${_r.success?"Success":"Failed"} (${_r.duration}ms)`)}catch(_r){console.error(` \u2717 Error: ${_r.message}`),ve.push({package:we.packageData.name,packagePath:we.packageData.path,lens:Jt,command:We.name,error:_r.message,timestamp:Date.now()})}}}if(_.format==="json"){let we=g.format(ve);_.output?(await OT.writeFile(_.output,we,"utf-8"),console.log(`
|
|
1104
1104
|
Results written to: ${_.output}`)):console.log(`
|
|
1105
1105
|
`+we)}else S.report(ve);let Ce=ve.some(we=>we.error||!we.result?.success);process.exit(Ce?1:0)}catch(w){console.error("Fatal error:",w.message),process.exit(1)}}FKe(YEe(process.argv)).command("run [path]","Run quality lenses on repository",_=>_.positional("path",{describe:"Repository path",type:"string",default:process.cwd()}).option("output",{alias:"o",describe:"Output file for results",type:"string"}).option("lenses",{describe:"Specific lenses to run (comma-separated)",type:"string",example:"eslint,jest,typescript"}).option("format",{describe:"Output format",choices:["json","console"],default:"console"}).option("install",{alias:"i",describe:"Run tools via npx (no local dependencies required)",type:"boolean",default:!1}),_=>Xlr(_)).command("list [path]","List available lenses in repository",_=>_.positional("path",{describe:"Repository path",type:"string",default:process.cwd()}),async _=>{let c=fE.resolve(_.path),f=new lG;console.log(`Scanning repository: ${c}`);let g=await lpt(c);(await f.extractPackages(g,c)).forEach(w=>{console.log(`
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { QualityHexagonMetrics, GitMetadata } from '@principal-ai/codebase-quality-lenses';
|
|
2
|
+
import type { FileTree } from '@principal-ai/repository-abstraction';
|
|
2
3
|
import type { ToolExecutionResponse } from '../service/QualityLensService';
|
|
3
4
|
export type { QualityHexagonMetrics, GitMetadata };
|
|
4
5
|
export interface PackageQualityMetrics {
|
|
@@ -50,6 +51,11 @@ export interface LensExecutionResult {
|
|
|
50
51
|
timestamp: number;
|
|
51
52
|
}
|
|
52
53
|
export declare class JsonFormatter {
|
|
54
|
+
private fileTree?;
|
|
55
|
+
private fileCountsByPackage;
|
|
56
|
+
setFileTree(fileTree: FileTree): void;
|
|
57
|
+
private calculateFileCountsPerPackage;
|
|
58
|
+
getFileCountForPackage(packagePath: string): number;
|
|
53
59
|
private mapLensToHexagonDimension;
|
|
54
60
|
private getIssuePath;
|
|
55
61
|
private findOwningPackage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonFormatter.d.ts","sourceRoot":"","sources":["../../src/output/JsonFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,WAAW,EAIZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAG3E,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC;AAKnD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,qBAAqB,CAAC;CAChC;AAKD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,CAAC,EAAE,WAAW,CAAC;KACnB,CAAC;IACF,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QACtC,SAAS,EAAE;YACT,OAAO,EAAE,OAAO,CAAC;YACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,MAAM,EAAE,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,cAAc,CAAC,EAAE;QACf,QAAQ,EAAE,qBAAqB,EAAE,CAAC;KACnC,CAAC;CACH;AAKD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAoBD,qBAAa,aAAa;
|
|
1
|
+
{"version":3,"file":"JsonFormatter.d.ts","sourceRoot":"","sources":["../../src/output/JsonFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,WAAW,EAIZ,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAG3E,YAAY,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC;AAKnD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,qBAAqB,CAAC;CAChC;AAKD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,CAAC,EAAE,WAAW,CAAC;KACnB,CAAC;IACF,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QACtC,SAAS,EAAE;YACT,OAAO,EAAE,OAAO,CAAC;YACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,MAAM,EAAE,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,cAAc,CAAC,EAAE;QACf,QAAQ,EAAE,qBAAqB,EAAE,CAAC;KACnC,CAAC;CACH;AAKD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAoBD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,mBAAmB,CAAkC;IAK7D,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IASrC,OAAO,CAAC,6BAA6B;IAgDrC,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAOnD,OAAO,CAAC,yBAAyB;IAwBjC,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,iBAAiB;IAgCzB,OAAO,CAAC,0BAA0B;IA0KlC,OAAO,CAAC,uBAAuB;IA+B/B,OAAO,CAAC,4BAA4B;IAqBpC,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,uBAAuB;IA0C/B,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,0BAA0B;IAgClC,MAAM,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,MAAM;CAkD/C"}
|