@principal-ai/quality-lens-cli 0.1.87 → 0.1.89
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 +1 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -362,7 +362,7 @@ NOTE: as of Ohm v16, there is no default action for iteration nodes \u2014 see `
|
|
|
362
362
|
`),u.failures.push(E)),u.totalTests===0&&(u.totalTests=u.passed+u.failed+u.skipped+u.cancelled+u.todo)}format(s){let u=[],p=this.getPathMapper();for(let Y of s.failures){let ue=p.toRelative(Y.file),U=`Test failed: ${Y.testName}`;Y.message&&(U+=`
|
|
363
363
|
${Y.message}`),Y.expected!==void 0&&Y.actual!==void 0&&(U+=`
|
|
364
364
|
Expected: ${Y.expected}
|
|
365
|
-
Actual: ${Y.actual}`),u.push({file:ue,line:Y.line||1,column:Y.column||1,severity:"error",message:U,rule:"test-failed",source:this.name,category:"test-failure"})}let g,E=s.coverageFiles.length>0;if(E)g=s.coverageFiles.map(Y=>{let ue=p.toRelative(Y.file),U=Math.round(Y.lineCoverage*100)/100;return{file:ue,score:U,issueCount:0,errorCount:0,warningCount:0,infoCount:0,hintCount:0}});else{let Y=s.testFiles.map(ue=>p.toRelative(ue));g=this.buildFileMetrics(Y,u)}let k=s.totalTests>0?Math.round(s.passed/s.totalTests*1e4)/100:0,L=E?{line:s.totalLineCoverage,branch:s.totalBranchCoverage,function:s.totalFunctionCoverage}:void 0,W=E?s.coverageFiles.length:s.testFiles.length,H={lensName:this.name,tool:this.config?.tool.name||"node",timestamp:Date.now(),success:s.failed===0,issues:u,fileMetrics:g,metrics:{filesAnalyzed:W,totalIssues:u.length,issuesBySeverity:{error:s.failed,warning:0,info:0,hint:0},executionTime:s.duration,custom:{totalTests:s.totalTests,passedTests:s.passed,failedTests:s.failed,skippedTests:s.skipped,cancelledTests:s.cancelled,todoTests:s.todo,totalSuites:s.totalSuites,passRate:k,duration:s.duration,testFilesRun:s.testFiles.length,outputFormat:s.isTapFormat?"tap":"spec",hasCoverage:E}},coverage:L};return H.qualityScore=l.calculateQualityScore(H),H}getPathMapper(){if(!this.pathMapper){let s=this.config?.cwd||process.cwd();this.pathMapper=new Ngr.PathMapper(s)}return this.pathMapper}};Xce.NodeTestLens=f4e});var Hht=mt(Zce=>{"use strict";Object.defineProperty(Zce,"__esModule",{value:!0});Zce.ESLintLens=void 0;var Ogr=fg(),Lgr=SE(),Mgr=_g(),_4e=class l extends Ogr.BaseLens{name="eslint";description="JavaScript/TypeScript linter";languages=["javascript","typescript"];supportedTools=["eslint"];requirements=Lgr.ESLINT_REQUIREMENTS;pathMapper;static calculateQualityScore(s){if(!s.success||s.error)return 0;let u=s.metrics;if(!u)return 100;let p=Math.max(u.filesAnalyzed,1),{error:g,warning:E,info:k}=u.issuesBySeverity,L=g/p*10,W=E/p*2,H=k/p*.5,Y=L+W+H,ue=Math.max(0,Math.min(100,100-Y));return Math.round(ue*100)/100}parse(s){if(s.stderr&&!s.stdout)throw new Error(`ESLint execution error: ${s.stderr}`);if(!s.stdout)return[];try{let u=s.stdout,p=u.search(/^\s*[{[]/m);p>0&&(this.debug("Stripping npm script preamble from output"),u=u.substring(p));let g=JSON.parse(u);return Array.isArray(g)?g:(this.debug("ESLint output is not an array, wrapping it"),[g])}catch(u){if(this.debug("Failed to parse ESLint output as JSON:",u),s.stderr)throw new Error(`ESLint execution error: ${s.stderr}`);return[]}}format(s){let u=[],p=[],g=this.getPathMapper();for(let ye of s){let ve=g.toRelative(ye.filePath);p.push({path:ve,hasIssues:ye.messages.length>0});for(let Ge of ye.messages)u.push({file:ve,line:Ge.line||1,column:Ge.column||1,endLine:Ge.endLine,endColumn:Ge.endColumn,severity:this.mapESLintSeverity(Ge.severity),message:Ge.message,rule:Ge.ruleId||void 0,source:this.name,category:this.categorizeRule(Ge.ruleId),fix:Ge.fix?{text:Ge.fix.text,range:{start:{line:Ge.line,column:Ge.column},end:{line:Ge.endLine||Ge.line,column:Ge.endColumn||Ge.column}}}:void 0})}let E=s.length,k=s.filter(ye=>ye.messages.length>0).length,L=s.reduce((ye,ve)=>ye+ve.errorCount,0),W=s.reduce((ye,ve)=>ye+ve.warningCount,0),H=s.reduce((ye,ve)=>ye+ve.fixableErrorCount,0),Y=s.reduce((ye,ve)=>ye+ve.fixableWarningCount,0),ue=p.map(ye=>ye.path),U=this.buildFileMetrics(ue,u),Oe={lensName:this.name,tool:this.config?.tool.name||"eslint",timestamp:Date.now(),success:!0,issues:u,analyzedFiles:p,fileMetrics:U,metrics:{filesAnalyzed:E,totalIssues:u.length,issuesBySeverity:{error:L,warning:W,info:0,hint:0},executionTime:0,custom:{filesWithIssues:k,fixableErrors:H,fixableWarnings:Y,totalFixable:H+Y}}};return Oe.qualityScore=l.calculateQualityScore(Oe),Oe}mapESLintSeverity(s){switch(s){case 2:return"error";case 1:return"warning";case 0:default:return"info"}}categorizeRule(s){return s?s.startsWith("@typescript-eslint/")?"typescript":s.startsWith("react/")||s.startsWith("react-hooks/")?"react":s.startsWith("import/")?"imports":s.startsWith("node/")||s.startsWith("n/")?"node":s.includes("security")||s==="no-eval"||s==="no-implied-eval"?"security":s.includes("indent")||s.includes("space")||s.includes("quote")||s.includes("semi")||s.includes("comma")||s.includes("brace")?"style":s.includes("no-unused")||s.includes("no-undef")||s.includes("no-console")||s.includes("prefer-")?"best-practices":"general":"general"}getPathMapper(){if(!this.pathMapper){let s=this.config?.cwd||process.cwd();this.pathMapper=new Mgr.PathMapper(s)}return this.pathMapper}async execute(){return this.config?.tool&&((this.config.tool.args||[]).some(p=>p.includes("--format")||p.includes("-f"))||this.addArgsToNpmScript(["--format","json"])),super.execute()}};Zce.ESLintLens=_4e});var Kht=mt(eue=>{"use strict";Object.defineProperty(eue,"__esModule",{value:!0});eue.JestLens=void 0;var Rgr=fg(),Bgr=SE(),jgr=_g(),p4e=class l extends Rgr.BaseLens{name="jest";description="JavaScript test runner and coverage";languages=["javascript","typescript"];supportedTools=["jest"];requirements=Bgr.JEST_REQUIREMENTS;pathMapper;static calculateQualityScore(s){if(!s.success||s.error)return 0;let u=s.metrics;if(!u?.custom)return 100;let p=u.custom,g=p.totalTests||0,E=p.passedTests||0,k=p.skippedTests||0;if(g===0)return 0;let W=E/g*100,H=k/g*50;if(W-=H,s.coverage?.line!==void 0){let Y=s.coverage.line;Y>80?W+=10:Y>60&&(W+=5)}return W=Math.max(0,Math.min(100,W)),Math.round(W*100)/100}parse(s){if(!s.stdout&&s.stderr&&!s.stderr.includes("FAIL")&&!s.stderr.includes("Test Suites:"))throw new Error(`Jest execution error: ${s.stderr}`);let u;if(s.stdout){let p=s.stdout.indexOf("{"),g=s.stdout.lastIndexOf("}");p!==-1&&g!==-1&&g>p?u=s.stdout.substring(p,g+1):u=s.stdout}if(!u)return this.debug("No JSON output found in stdout"),this.getEmptyResults();try{let p=JSON.parse(u);return this.normalizeResults(p)}catch(p){if(this.debug("Failed to parse Jest output as JSON:",p),this.debug("Attempted to parse:",u?.substring(0,200)),s.stderr)try{let g=s.stderr.indexOf("{"),E=s.stderr.lastIndexOf("}");if(g!==-1&&E!==-1&&E>g){let k=s.stderr.substring(g,E+1),L=JSON.parse(k);return this.normalizeResults(L)}}catch{}return this.debug("Returning empty results due to parse failure"),this.getEmptyResults()}}format(s){let u=[],p=this.getPathMapper();for(let ct of s.testResults){let Lt=p.toRelative(ct.testFilePath||ct.name);ct.failureMessage&&u.push({file:Lt,line:1,column:1,severity:"error",message:this.extractErrorMessage(ct.failureMessage),rule:"test-failure",source:this.name,category:"test-suite"});for(let Wt of ct.assertionResults)if(Wt.status==="failed"){let Nr=Wt.location?.line||1,Lr=Wt.location?.column||1,Fr=Wt.failureMessages.join(`
|
|
365
|
+
Actual: ${Y.actual}`),u.push({file:ue,line:Y.line||1,column:Y.column||1,severity:"error",message:U,rule:"test-failed",source:this.name,category:"test-failure"})}let g,E=s.coverageFiles.length>0;if(E)g=s.coverageFiles.map(Y=>{let ue=p.toRelative(Y.file),U=Math.round(Y.lineCoverage*100)/100;return{file:ue,score:U,issueCount:0,errorCount:0,warningCount:0,infoCount:0,hintCount:0}});else{let Y=s.testFiles.map(ue=>p.toRelative(ue));g=this.buildFileMetrics(Y,u)}let k=s.totalTests>0?Math.round(s.passed/s.totalTests*1e4)/100:0,L=E?{line:s.totalLineCoverage,branch:s.totalBranchCoverage,function:s.totalFunctionCoverage,files:s.coverageFiles.map(Y=>({file:p.toRelative(Y.file),lines:Y.lineCoverage,branches:Y.branchCoverage,functions:Y.functionCoverage}))}:void 0,W=E?s.coverageFiles.length:s.testFiles.length,H={lensName:this.name,tool:this.config?.tool.name||"node",timestamp:Date.now(),success:s.failed===0,issues:u,fileMetrics:g,metrics:{filesAnalyzed:W,totalIssues:u.length,issuesBySeverity:{error:s.failed,warning:0,info:0,hint:0},executionTime:s.duration,custom:{totalTests:s.totalTests,passedTests:s.passed,failedTests:s.failed,skippedTests:s.skipped,cancelledTests:s.cancelled,todoTests:s.todo,totalSuites:s.totalSuites,passRate:k,duration:s.duration,testFilesRun:s.testFiles.length,outputFormat:s.isTapFormat?"tap":"spec",hasCoverage:E}},coverage:L};return H.qualityScore=l.calculateQualityScore(H),H}getPathMapper(){if(!this.pathMapper){let s=this.config?.cwd||process.cwd();this.pathMapper=new Ngr.PathMapper(s)}return this.pathMapper}};Xce.NodeTestLens=f4e});var Hht=mt(Zce=>{"use strict";Object.defineProperty(Zce,"__esModule",{value:!0});Zce.ESLintLens=void 0;var Ogr=fg(),Lgr=SE(),Mgr=_g(),_4e=class l extends Ogr.BaseLens{name="eslint";description="JavaScript/TypeScript linter";languages=["javascript","typescript"];supportedTools=["eslint"];requirements=Lgr.ESLINT_REQUIREMENTS;pathMapper;static calculateQualityScore(s){if(!s.success||s.error)return 0;let u=s.metrics;if(!u)return 100;let p=Math.max(u.filesAnalyzed,1),{error:g,warning:E,info:k}=u.issuesBySeverity,L=g/p*10,W=E/p*2,H=k/p*.5,Y=L+W+H,ue=Math.max(0,Math.min(100,100-Y));return Math.round(ue*100)/100}parse(s){if(s.stderr&&!s.stdout)throw new Error(`ESLint execution error: ${s.stderr}`);if(!s.stdout)return[];try{let u=s.stdout,p=u.search(/^\s*[{[]/m);p>0&&(this.debug("Stripping npm script preamble from output"),u=u.substring(p));let g=JSON.parse(u);return Array.isArray(g)?g:(this.debug("ESLint output is not an array, wrapping it"),[g])}catch(u){if(this.debug("Failed to parse ESLint output as JSON:",u),s.stderr)throw new Error(`ESLint execution error: ${s.stderr}`);return[]}}format(s){let u=[],p=[],g=this.getPathMapper();for(let ye of s){let ve=g.toRelative(ye.filePath);p.push({path:ve,hasIssues:ye.messages.length>0});for(let Ge of ye.messages)u.push({file:ve,line:Ge.line||1,column:Ge.column||1,endLine:Ge.endLine,endColumn:Ge.endColumn,severity:this.mapESLintSeverity(Ge.severity),message:Ge.message,rule:Ge.ruleId||void 0,source:this.name,category:this.categorizeRule(Ge.ruleId),fix:Ge.fix?{text:Ge.fix.text,range:{start:{line:Ge.line,column:Ge.column},end:{line:Ge.endLine||Ge.line,column:Ge.endColumn||Ge.column}}}:void 0})}let E=s.length,k=s.filter(ye=>ye.messages.length>0).length,L=s.reduce((ye,ve)=>ye+ve.errorCount,0),W=s.reduce((ye,ve)=>ye+ve.warningCount,0),H=s.reduce((ye,ve)=>ye+ve.fixableErrorCount,0),Y=s.reduce((ye,ve)=>ye+ve.fixableWarningCount,0),ue=p.map(ye=>ye.path),U=this.buildFileMetrics(ue,u),Oe={lensName:this.name,tool:this.config?.tool.name||"eslint",timestamp:Date.now(),success:!0,issues:u,analyzedFiles:p,fileMetrics:U,metrics:{filesAnalyzed:E,totalIssues:u.length,issuesBySeverity:{error:L,warning:W,info:0,hint:0},executionTime:0,custom:{filesWithIssues:k,fixableErrors:H,fixableWarnings:Y,totalFixable:H+Y}}};return Oe.qualityScore=l.calculateQualityScore(Oe),Oe}mapESLintSeverity(s){switch(s){case 2:return"error";case 1:return"warning";case 0:default:return"info"}}categorizeRule(s){return s?s.startsWith("@typescript-eslint/")?"typescript":s.startsWith("react/")||s.startsWith("react-hooks/")?"react":s.startsWith("import/")?"imports":s.startsWith("node/")||s.startsWith("n/")?"node":s.includes("security")||s==="no-eval"||s==="no-implied-eval"?"security":s.includes("indent")||s.includes("space")||s.includes("quote")||s.includes("semi")||s.includes("comma")||s.includes("brace")?"style":s.includes("no-unused")||s.includes("no-undef")||s.includes("no-console")||s.includes("prefer-")?"best-practices":"general":"general"}getPathMapper(){if(!this.pathMapper){let s=this.config?.cwd||process.cwd();this.pathMapper=new Mgr.PathMapper(s)}return this.pathMapper}async execute(){return this.config?.tool&&((this.config.tool.args||[]).some(p=>p.includes("--format")||p.includes("-f"))||this.addArgsToNpmScript(["--format","json"])),super.execute()}};Zce.ESLintLens=_4e});var Kht=mt(eue=>{"use strict";Object.defineProperty(eue,"__esModule",{value:!0});eue.JestLens=void 0;var Rgr=fg(),Bgr=SE(),jgr=_g(),p4e=class l extends Rgr.BaseLens{name="jest";description="JavaScript test runner and coverage";languages=["javascript","typescript"];supportedTools=["jest"];requirements=Bgr.JEST_REQUIREMENTS;pathMapper;static calculateQualityScore(s){if(!s.success||s.error)return 0;let u=s.metrics;if(!u?.custom)return 100;let p=u.custom,g=p.totalTests||0,E=p.passedTests||0,k=p.skippedTests||0;if(g===0)return 0;let W=E/g*100,H=k/g*50;if(W-=H,s.coverage?.line!==void 0){let Y=s.coverage.line;Y>80?W+=10:Y>60&&(W+=5)}return W=Math.max(0,Math.min(100,W)),Math.round(W*100)/100}parse(s){if(!s.stdout&&s.stderr&&!s.stderr.includes("FAIL")&&!s.stderr.includes("Test Suites:"))throw new Error(`Jest execution error: ${s.stderr}`);let u;if(s.stdout){let p=s.stdout.indexOf("{"),g=s.stdout.lastIndexOf("}");p!==-1&&g!==-1&&g>p?u=s.stdout.substring(p,g+1):u=s.stdout}if(!u)return this.debug("No JSON output found in stdout"),this.getEmptyResults();try{let p=JSON.parse(u);return this.normalizeResults(p)}catch(p){if(this.debug("Failed to parse Jest output as JSON:",p),this.debug("Attempted to parse:",u?.substring(0,200)),s.stderr)try{let g=s.stderr.indexOf("{"),E=s.stderr.lastIndexOf("}");if(g!==-1&&E!==-1&&E>g){let k=s.stderr.substring(g,E+1),L=JSON.parse(k);return this.normalizeResults(L)}}catch{}return this.debug("Returning empty results due to parse failure"),this.getEmptyResults()}}format(s){let u=[],p=this.getPathMapper();for(let ct of s.testResults){let Lt=p.toRelative(ct.testFilePath||ct.name);ct.failureMessage&&u.push({file:Lt,line:1,column:1,severity:"error",message:this.extractErrorMessage(ct.failureMessage),rule:"test-failure",source:this.name,category:"test-suite"});for(let Wt of ct.assertionResults)if(Wt.status==="failed"){let Nr=Wt.location?.line||1,Lr=Wt.location?.column||1,Fr=Wt.failureMessages.join(`
|
|
366
366
|
`)||"Test failed";u.push({file:Lt,line:Nr,column:Lr,severity:"error",message:this.formatTestFailureMessage(Wt.fullName,Fr),rule:"test-failed",source:this.name,category:"test-case"})}}if(s.coverageMap){let ct=this.processCoverageData(s.coverageMap,p);u.push(...ct)}let g=s.numTotalTests||0,E=s.numPassedTests||0,k=s.numFailedTests||0,L=s.numPendingTests+s.numTodoTests,W=s.numTotalTestSuites||0,H=s.numPassedTestSuites||0,Y=s.numFailedTestSuites||0,ue=g>0?E/g*100:0,U=s.testResults.reduce((ct,Lt)=>ct+(Lt.perfStats?.runtime||0),0),Oe=s.testResults.flatMap(ct=>ct.assertionResults.map(Lt=>({name:Lt.fullName,duration:Lt.duration||0,file:p.toRelative(ct.testFilePath||ct.name)}))).filter(ct=>ct.duration>0).sort((ct,Lt)=>Lt.duration-ct.duration).slice(0,5),ye=s.testResults.map(ct=>p.toRelative(ct.testFilePath||ct.name)),ve=this.buildFileMetrics(ye,u),Ge={lensName:this.name,tool:this.config?.tool.name||"jest",timestamp:Date.now(),success:s.success===!0,issues:u,fileMetrics:ve,metrics:{filesAnalyzed:W,totalIssues:u.length,issuesBySeverity:{error:u.filter(ct=>ct.severity==="error").length,warning:u.filter(ct=>ct.severity==="warning").length,info:u.filter(ct=>ct.severity==="info").length,hint:0},executionTime:U,custom:{totalTests:g,passedTests:E,failedTests:k,skippedTests:L,testSuites:W,passedSuites:H,failedSuites:Y,passRate:Math.round(ue*100)/100,duration:U,slowestTests:Oe,snapshot:{total:s.snapshot?.total||0,matched:s.snapshot?.matched||0,unmatched:s.snapshot?.unmatched||0,updated:s.snapshot?.updated||0}}}};return s.coverageMap&&(Ge.coverage=this.buildCoverageData(s.coverageMap,p)),Ge.qualityScore=l.calculateQualityScore(Ge),Ge}buildCoverageData(s,u){let p=[],g=0,E=0,k=0,L=0,W=0,H=0;for(let[Y,ue]of Object.entries(s))if(typeof ue=="object"&&ue!==null){let U=ue,Oe=u.toRelative(U.path||Y),ye=Object.values(U.s||{}),ve=ye.length,Ge=ye.filter(zr=>zr>0).length,ct=Object.values(U.b||{}).flat(),Lt=ct.length,Wt=ct.filter(zr=>zr>0).length,Nr=Object.values(U.f||{}),Lr=Nr.length,Fr=Nr.filter(zr=>zr>0).length,vr=ve>0?Ge/ve*100:100,Ci=Lt>0?Wt/Lt*100:void 0,si=Lr>0?Fr/Lr*100:void 0,ta=this.getUncoveredLines(U);p.push({file:Oe,lines:Math.round(vr*100)/100,branches:Ci!==void 0?Math.round(Ci*100)/100:void 0,functions:si!==void 0?Math.round(si*100)/100:void 0,statements:Math.round(vr*100)/100,uncoveredLines:ta}),g+=ve,E+=Ge,k+=Lt,L+=Wt,W+=Lr,H+=Fr}return{line:g>0?Math.round(E/g*1e4)/100:100,branch:k>0?Math.round(L/k*1e4)/100:void 0,function:W>0?Math.round(H/W*1e4)/100:void 0,statement:g>0?Math.round(E/g*1e4)/100:void 0,files:p}}getUncoveredLines(s){let u=[],p=s.statementMap||{},g=s.s||{};for(let[E,k]of Object.entries(g))if(k===0){let L=p[E];L?.start?.line&&u.push(L.start.line)}return[...new Set(u)].sort((E,k)=>E-k)}processCoverageData(s,u){let p=[];for(let[g,E]of Object.entries(s))if(typeof E=="object"&&E!==null){let k=E,L=u.toRelative(k.path||g),W=Object.values(k.s||{}),H=W.filter(Y=>Y===0).length;if(H>0){let Y=W.length,ue=(Y-H)/Y*100;ue<80&&p.push({file:L,line:1,column:1,severity:ue<50?"warning":"info",message:`Low test coverage: ${Math.round(ue)}% of statements covered`,rule:"low-coverage",source:this.name,category:"coverage"})}}return p}extractErrorMessage(s){let p=s.replace(/\u001b\[[0-9;]*m/g,"").split(`
|
|
367
367
|
`)[0];return p.length>200?p.substring(0,197)+"...":p}formatTestFailureMessage(s,u){let g=u.replace(/\u001b\[[0-9;]*m/g,"").split(`
|
|
368
368
|
`)[0].substring(0,150);return`Test "${s}" failed: ${g}`}getEmptyResults(){return{numFailedTestSuites:0,numFailedTests:0,numPassedTestSuites:0,numPassedTests:0,numPendingTestSuites:0,numPendingTests:0,numRuntimeErrorTestSuites:0,numTodoTests:0,numTotalTestSuites:0,numTotalTests:0,openHandles:[],snapshot:{added:0,didUpdate:!1,failure:!1,filesAdded:0,filesRemoved:0,filesRemovedList:[],filesUnmatched:0,filesUpdated:0,matched:0,total:0,unchecked:0,uncheckedKeysByFile:[],unmatched:0,updated:0},startTime:Date.now(),success:!0,testResults:[],wasInterrupted:!1}}normalizeResults(s){let u=this.getEmptyResults(),p=s;return{...u,...p,testResults:(p.testResults||[]).map(g=>({...g,assertionResults:g.assertionResults||[],perfStats:g.perfStats||{}}))}}getPathMapper(){if(!this.pathMapper){let s=this.config?.cwd||process.cwd();this.pathMapper=new jgr.PathMapper(s)}return this.pathMapper}async execute(){if(this.config?.tool){let s=this.config.tool.args||[];s.some(p=>p==="--json")||this.addArgsToNpmScript(["--json"]),s.some(p=>p.includes("--no-colors")||p.includes("--colors=false"))||this.addArgsToNpmScript(["--no-colors"]),s.some(p=>p==="--coverage")||this.addArgsToNpmScript(["--coverage"])}return super.execute()}};eue.JestLens=p4e});var Qht=mt(FR=>{"use strict";Object.defineProperty(FR,"__esModule",{value:!0});FR.KnipLens=FR.SOURCE_EXTENSIONS=void 0;var qgr=fg(),Jgr=SE(),Ugr=_g();FR.SOURCE_EXTENSIONS=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]);var d4e=class l extends qgr.BaseLens{name="knip";description="Find unused files, exports, and dependencies";languages=["javascript","typescript"];supportedTools=["knip"];requirements=Jgr.KNIP_REQUIREMENTS;pathMapper;injectedSourceFiles;constructor(s,u={}){super(s,u),this.injectedSourceFiles=u.sourceFiles}static calculateQualityScore(s){if(!s.success||s.error)return 0;let u=s.metrics;if(!u?.custom)return 100;let p=u.custom,g=(p.unlistedDependencies||0)*15,E=(p.unresolvedImports||0)*10,k=(p.unusedFiles||0)*5,L=(p.unusedDependencies||0)*2,W=(p.unusedDevDependencies||0)*1,H=(p.unusedExports||0)*1,Y=(p.unusedTypes||0)*.5,ue=g+E+k+L+W+H+Y,U=Math.max(0,Math.min(100,100-ue));return Math.round(U*100)/100}parse(s){let u=s.stderr||s.stdout;if(!u)return this.getEmptyOutput();try{let p=JSON.parse(u);return this.normalizeOutput(p)}catch(p){this.debug("Failed to parse Knip output as JSON, trying to extract from npm wrapper:",p);let g=u.split(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@principal-ai/quality-lens-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.89",
|
|
4
4
|
"description": "CLI tool for running quality lenses on codebases in CI/CD pipelines",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"license": "MIT",
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@principal-ai/codebase-composition": "^0.2.25",
|
|
46
|
-
"@principal-ai/codebase-quality-lenses": "^0.1.
|
|
46
|
+
"@principal-ai/codebase-quality-lenses": "^0.1.57",
|
|
47
47
|
"@principal-ai/quality-lens-registry": "^0.3.3",
|
|
48
48
|
"@principal-ai/repository-abstraction": "^0.2.0",
|
|
49
49
|
"@types/jest": "^30.0.0",
|