couchloop-eq-mcp 1.0.3 → 1.0.5
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/README.md +24 -11
- package/dist/clients/shrinkChatClient.js +1 -1
- package/dist/clients/shrinkChatClient.js.map +1 -1
- package/dist/developer/analyzers/bloat-detector.d.ts +89 -0
- package/dist/developer/analyzers/bloat-detector.d.ts.map +1 -0
- package/dist/developer/analyzers/bloat-detector.js +483 -0
- package/dist/developer/analyzers/bloat-detector.js.map +1 -0
- package/dist/developer/backup/auto-backup.d.ts +96 -0
- package/dist/developer/backup/auto-backup.d.ts.map +1 -0
- package/dist/developer/backup/auto-backup.js +346 -0
- package/dist/developer/backup/auto-backup.js.map +1 -0
- package/dist/developer/blockers/package-blocker.d.ts +33 -0
- package/dist/developer/blockers/package-blocker.d.ts.map +1 -0
- package/dist/developer/blockers/package-blocker.js +224 -0
- package/dist/developer/blockers/package-blocker.js.map +1 -0
- package/dist/developer/evaluators/ai-error-preventer.d.ts +54 -0
- package/dist/developer/evaluators/ai-error-preventer.d.ts.map +1 -0
- package/dist/developer/evaluators/ai-error-preventer.js +270 -0
- package/dist/developer/evaluators/ai-error-preventer.js.map +1 -0
- package/dist/developer/evaluators/build-context-detector.d.ts +44 -0
- package/dist/developer/evaluators/build-context-detector.d.ts.map +1 -0
- package/dist/developer/evaluators/build-context-detector.js +258 -0
- package/dist/developer/evaluators/build-context-detector.js.map +1 -0
- package/dist/developer/evaluators/package-evaluator.d.ts +37 -0
- package/dist/developer/evaluators/package-evaluator.d.ts.map +1 -0
- package/dist/developer/evaluators/package-evaluator.js +278 -0
- package/dist/developer/evaluators/package-evaluator.js.map +1 -0
- package/dist/developer/guards/file-guardian.d.ts +79 -0
- package/dist/developer/guards/file-guardian.d.ts.map +1 -0
- package/dist/developer/guards/file-guardian.js +309 -0
- package/dist/developer/guards/file-guardian.js.map +1 -0
- package/dist/developer/managers/context-manager.d.ts +61 -0
- package/dist/developer/managers/context-manager.d.ts.map +1 -0
- package/dist/developer/managers/context-manager.js +302 -0
- package/dist/developer/managers/context-manager.js.map +1 -0
- package/dist/developer/metrics/complexity-calculator.d.ts +52 -0
- package/dist/developer/metrics/complexity-calculator.d.ts.map +1 -0
- package/dist/developer/metrics/complexity-calculator.js +259 -0
- package/dist/developer/metrics/complexity-calculator.js.map +1 -0
- package/dist/developer/reports/review-summary.d.ts +49 -0
- package/dist/developer/reports/review-summary.d.ts.map +1 -0
- package/dist/developer/reports/review-summary.js +249 -0
- package/dist/developer/reports/review-summary.js.map +1 -0
- package/dist/developer/scanners/review-assistant.d.ts +41 -0
- package/dist/developer/scanners/review-assistant.d.ts.map +1 -0
- package/dist/developer/scanners/review-assistant.js +374 -0
- package/dist/developer/scanners/review-assistant.js.map +1 -0
- package/dist/developer/scanners/secret-scanner.d.ts +66 -0
- package/dist/developer/scanners/secret-scanner.d.ts.map +1 -0
- package/dist/developer/scanners/secret-scanner.js +287 -0
- package/dist/developer/scanners/secret-scanner.js.map +1 -0
- package/dist/developer/scanners/sql-injection-detector.d.ts +54 -0
- package/dist/developer/scanners/sql-injection-detector.d.ts.map +1 -0
- package/dist/developer/scanners/sql-injection-detector.js +174 -0
- package/dist/developer/scanners/sql-injection-detector.js.map +1 -0
- package/dist/developer/scanners/xss-detector.d.ts +60 -0
- package/dist/developer/scanners/xss-detector.d.ts.map +1 -0
- package/dist/developer/scanners/xss-detector.js +229 -0
- package/dist/developer/scanners/xss-detector.js.map +1 -0
- package/dist/developer/types/ai-errors.d.ts +34 -0
- package/dist/developer/types/ai-errors.d.ts.map +1 -0
- package/dist/developer/types/ai-errors.js +271 -0
- package/dist/developer/types/ai-errors.js.map +1 -0
- package/dist/developer/types/package.d.ts +32 -0
- package/dist/developer/types/package.d.ts.map +1 -0
- package/dist/developer/types/package.js +5 -0
- package/dist/developer/types/package.js.map +1 -0
- package/dist/developer/updaters/dependency-updater.d.ts +102 -0
- package/dist/developer/updaters/dependency-updater.d.ts.map +1 -0
- package/dist/developer/updaters/dependency-updater.js +472 -0
- package/dist/developer/updaters/dependency-updater.js.map +1 -0
- package/dist/developer/validators/cargo.d.ts +14 -0
- package/dist/developer/validators/cargo.d.ts.map +1 -0
- package/dist/developer/validators/cargo.js +132 -0
- package/dist/developer/validators/cargo.js.map +1 -0
- package/dist/developer/validators/gem.d.ts +14 -0
- package/dist/developer/validators/gem.d.ts.map +1 -0
- package/dist/developer/validators/gem.js +85 -0
- package/dist/developer/validators/gem.js.map +1 -0
- package/dist/developer/validators/go.d.ts +14 -0
- package/dist/developer/validators/go.d.ts.map +1 -0
- package/dist/developer/validators/go.js +138 -0
- package/dist/developer/validators/go.js.map +1 -0
- package/dist/developer/validators/maven.d.ts +14 -0
- package/dist/developer/validators/maven.d.ts.map +1 -0
- package/dist/developer/validators/maven.js +99 -0
- package/dist/developer/validators/maven.js.map +1 -0
- package/dist/developer/validators/npm.d.ts +14 -0
- package/dist/developer/validators/npm.d.ts.map +1 -0
- package/dist/developer/validators/npm.js +96 -0
- package/dist/developer/validators/npm.js.map +1 -0
- package/dist/developer/validators/nuget.d.ts +15 -0
- package/dist/developer/validators/nuget.d.ts.map +1 -0
- package/dist/developer/validators/nuget.js +107 -0
- package/dist/developer/validators/nuget.js.map +1 -0
- package/dist/developer/validators/pypi.d.ts +14 -0
- package/dist/developer/validators/pypi.d.ts.map +1 -0
- package/dist/developer/validators/pypi.js +118 -0
- package/dist/developer/validators/pypi.js.map +1 -0
- package/dist/developer/validators/registry-manager.d.ts +37 -0
- package/dist/developer/validators/registry-manager.d.ts.map +1 -0
- package/dist/developer/validators/registry-manager.js +89 -0
- package/dist/developer/validators/registry-manager.js.map +1 -0
- package/dist/developer/validators/version-checker.d.ts +145 -0
- package/dist/developer/validators/version-checker.d.ts.map +1 -0
- package/dist/developer/validators/version-checker.js +529 -0
- package/dist/developer/validators/version-checker.js.map +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/auth.d.ts +7 -9
- package/dist/server/middleware/auth.d.ts.map +1 -1
- package/dist/server/middleware/auth.js.map +1 -1
- package/dist/tools/check-versions.d.ts +100 -0
- package/dist/tools/check-versions.d.ts.map +1 -0
- package/dist/tools/check-versions.js +328 -0
- package/dist/tools/check-versions.js.map +1 -0
- package/dist/tools/detect-code-smell.d.ts +9 -0
- package/dist/tools/detect-code-smell.d.ts.map +1 -0
- package/dist/tools/detect-code-smell.js +231 -0
- package/dist/tools/detect-code-smell.js.map +1 -0
- package/dist/tools/index.d.ts +471 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +178 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/journey.js +1 -1
- package/dist/tools/journey.js.map +1 -1
- package/dist/tools/pre-review-code.d.ts +71 -0
- package/dist/tools/pre-review-code.d.ts.map +1 -0
- package/dist/tools/pre-review-code.js +159 -0
- package/dist/tools/pre-review-code.js.map +1 -0
- package/dist/tools/preserve-context.d.ts +27 -0
- package/dist/tools/preserve-context.d.ts.map +1 -0
- package/dist/tools/preserve-context.js +98 -0
- package/dist/tools/preserve-context.js.map +1 -0
- package/dist/tools/protect-files.d.ts +224 -0
- package/dist/tools/protect-files.d.ts.map +1 -0
- package/dist/tools/protect-files.js +286 -0
- package/dist/tools/protect-files.js.map +1 -0
- package/dist/tools/scan-security.d.ts +38 -0
- package/dist/tools/scan-security.d.ts.map +1 -0
- package/dist/tools/scan-security.js +237 -0
- package/dist/tools/scan-security.js.map +1 -0
- package/dist/tools/validate_packages.d.ts +8 -0
- package/dist/tools/validate_packages.d.ts.map +1 -0
- package/dist/tools/validate_packages.js +159 -0
- package/dist/tools/validate_packages.js.map +1 -0
- package/dist/types/auth.d.ts +18 -18
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/auth.js +91 -36
- package/dist/types/auth.js.map +1 -1
- package/dist/types/context.d.ts +46 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +17 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/file-protection.d.ts +50 -0
- package/dist/types/file-protection.d.ts.map +1 -0
- package/dist/types/file-protection.js +9 -0
- package/dist/types/file-protection.js.map +1 -0
- package/dist/utils/errorHandler.d.ts.map +1 -1
- package/dist/utils/errorHandler.js +2 -1
- package/dist/utils/errorHandler.js.map +1 -1
- package/package.json +23 -2
- package/dist/db/migrate.d.ts +0 -4
- package/dist/db/migrate.d.ts.map +0 -1
- package/dist/db/migrate.js +0 -34
- package/dist/db/migrate.js.map +0 -1
- package/dist/db/migrations/schema.d.ts +0 -1074
- package/dist/db/migrations/schema.d.ts.map +0 -1
- package/dist/db/migrations/schema.js +0 -160
- package/dist/db/migrations/schema.js.map +0 -1
- package/dist/db/schema.d.ts +0 -1576
- package/dist/db/schema.d.ts.map +0 -1
- package/dist/db/schema.js +0 -204
- package/dist/db/schema.js.map +0 -1
- package/dist/db/seed.d.ts +0 -4
- package/dist/db/seed.d.ts.map +0 -1
- package/dist/db/seed.js +0 -57
- package/dist/db/seed.js.map +0 -1
- package/dist/db/seedOAuth.d.ts +0 -4
- package/dist/db/seedOAuth.d.ts.map +0 -1
- package/dist/db/seedOAuth.js +0 -76
- package/dist/db/seedOAuth.js.map +0 -1
- package/dist/governance/config.d.ts +0 -66
- package/dist/governance/config.d.ts.map +0 -1
- package/dist/governance/config.js +0 -238
- package/dist/governance/config.js.map +0 -1
- package/dist/governance/detectors/hallucination.d.ts +0 -61
- package/dist/governance/detectors/hallucination.d.ts.map +0 -1
- package/dist/governance/detectors/hallucination.js +0 -338
- package/dist/governance/detectors/hallucination.js.map +0 -1
- package/dist/governance/detectors/inconsistency.d.ts +0 -99
- package/dist/governance/detectors/inconsistency.d.ts.map +0 -1
- package/dist/governance/detectors/inconsistency.js +0 -548
- package/dist/governance/detectors/inconsistency.js.map +0 -1
- package/dist/governance/detectors/toneDrift.d.ts +0 -63
- package/dist/governance/detectors/toneDrift.d.ts.map +0 -1
- package/dist/governance/detectors/toneDrift.js +0 -421
- package/dist/governance/detectors/toneDrift.js.map +0 -1
- package/dist/governance/detectors/unsafeReasoning.d.ts +0 -54
- package/dist/governance/detectors/unsafeReasoning.d.ts.map +0 -1
- package/dist/governance/detectors/unsafeReasoning.js +0 -473
- package/dist/governance/detectors/unsafeReasoning.js.map +0 -1
- package/dist/governance/evaluationEngine.d.ts +0 -112
- package/dist/governance/evaluationEngine.d.ts.map +0 -1
- package/dist/governance/evaluationEngine.js +0 -265
- package/dist/governance/evaluationEngine.js.map +0 -1
- package/dist/governance/intervention.d.ts +0 -81
- package/dist/governance/intervention.d.ts.map +0 -1
- package/dist/governance/intervention.js +0 -405
- package/dist/governance/intervention.js.map +0 -1
- package/dist/server/oauth/anomalyDetection.d.ts +0 -146
- package/dist/server/oauth/anomalyDetection.d.ts.map +0 -1
- package/dist/server/oauth/anomalyDetection.js +0 -405
- package/dist/server/oauth/anomalyDetection.js.map +0 -1
- package/dist/server/oauth/authServer.d.ts +0 -61
- package/dist/server/oauth/authServer.d.ts.map +0 -1
- package/dist/server/oauth/authServer.js +0 -283
- package/dist/server/oauth/authServer.js.map +0 -1
- package/dist/server/oauth/dpop.d.ts +0 -135
- package/dist/server/oauth/dpop.d.ts.map +0 -1
- package/dist/server/oauth/dpop.js +0 -338
- package/dist/server/oauth/dpop.js.map +0 -1
- package/dist/server/oauth/gdpr/consent.d.ts +0 -173
- package/dist/server/oauth/gdpr/consent.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/consent.js +0 -388
- package/dist/server/oauth/gdpr/consent.js.map +0 -1
- package/dist/server/oauth/gdpr/dataPortability.d.ts +0 -214
- package/dist/server/oauth/gdpr/dataPortability.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/dataPortability.js +0 -486
- package/dist/server/oauth/gdpr/dataPortability.js.map +0 -1
- package/dist/server/oauth/gdpr/index.d.ts +0 -103
- package/dist/server/oauth/gdpr/index.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/index.js +0 -273
- package/dist/server/oauth/gdpr/index.js.map +0 -1
- package/dist/server/oauth/gdpr/rightToErasure.d.ts +0 -184
- package/dist/server/oauth/gdpr/rightToErasure.d.ts.map +0 -1
- package/dist/server/oauth/gdpr/rightToErasure.js +0 -527
- package/dist/server/oauth/gdpr/rightToErasure.js.map +0 -1
- package/dist/server/oauth/monitoring/securityMonitor.d.ts +0 -218
- package/dist/server/oauth/monitoring/securityMonitor.d.ts.map +0 -1
- package/dist/server/oauth/monitoring/securityMonitor.js +0 -615
- package/dist/server/oauth/monitoring/securityMonitor.js.map +0 -1
- package/dist/server/oauth/pkce.d.ts +0 -61
- package/dist/server/oauth/pkce.d.ts.map +0 -1
- package/dist/server/oauth/pkce.js +0 -157
- package/dist/server/oauth/pkce.js.map +0 -1
- package/dist/server/oauth/providers/base.d.ts +0 -147
- package/dist/server/oauth/providers/base.d.ts.map +0 -1
- package/dist/server/oauth/providers/base.js +0 -312
- package/dist/server/oauth/providers/base.js.map +0 -1
- package/dist/server/oauth/providers/github.d.ts +0 -55
- package/dist/server/oauth/providers/github.d.ts.map +0 -1
- package/dist/server/oauth/providers/github.js +0 -225
- package/dist/server/oauth/providers/github.js.map +0 -1
- package/dist/server/oauth/providers/google.d.ts +0 -49
- package/dist/server/oauth/providers/google.d.ts.map +0 -1
- package/dist/server/oauth/providers/google.js +0 -153
- package/dist/server/oauth/providers/google.js.map +0 -1
- package/dist/server/oauth/providers/index.d.ts +0 -9
- package/dist/server/oauth/providers/index.d.ts.map +0 -1
- package/dist/server/oauth/providers/index.js +0 -24
- package/dist/server/oauth/providers/index.js.map +0 -1
- package/dist/server/oauth/refreshTokenRotation.d.ts +0 -114
- package/dist/server/oauth/refreshTokenRotation.d.ts.map +0 -1
- package/dist/server/oauth/refreshTokenRotation.js +0 -344
- package/dist/server/oauth/refreshTokenRotation.js.map +0 -1
- package/dist/server/oauth/security.d.ts +0 -101
- package/dist/server/oauth/security.d.ts.map +0 -1
- package/dist/server/oauth/security.js +0 -268
- package/dist/server/oauth/security.js.map +0 -1
- package/dist/server/oauth/tokenEncryption.d.ts +0 -80
- package/dist/server/oauth/tokenEncryption.d.ts.map +0 -1
- package/dist/server/oauth/tokenEncryption.js +0 -218
- package/dist/server/oauth/tokenEncryption.js.map +0 -1
- package/dist/tools/sendMessage-complex-backup.d.ts +0 -6
- package/dist/tools/sendMessage-complex-backup.d.ts.map +0 -1
- package/dist/tools/sendMessage-complex-backup.js +0 -545
- package/dist/tools/sendMessage-complex-backup.js.map +0 -1
- package/dist/tools/sendMessage-revised.d.ts +0 -11
- package/dist/tools/sendMessage-revised.d.ts.map +0 -1
- package/dist/tools/sendMessage-revised.js +0 -429
- package/dist/tools/sendMessage-revised.js.map +0 -1
- package/dist/tools/sendMessage-truly-simple.d.ts +0 -8
- package/dist/tools/sendMessage-truly-simple.d.ts.map +0 -1
- package/dist/tools/sendMessage-truly-simple.js +0 -299
- package/dist/tools/sendMessage-truly-simple.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../../src/developer/managers/context-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complexity Calculator - Metrics for code quality analysis
|
|
3
|
+
* Measures cyclomatic complexity, cognitive complexity, and code metrics
|
|
4
|
+
*/
|
|
5
|
+
export interface ComplexityMetrics {
|
|
6
|
+
cyclomaticComplexity: number;
|
|
7
|
+
cognitiveComplexity: number;
|
|
8
|
+
linesOfCode: number;
|
|
9
|
+
nestingDepth: number;
|
|
10
|
+
functionCount: number;
|
|
11
|
+
maxFunctionLength: number;
|
|
12
|
+
averageFunctionLength: number;
|
|
13
|
+
score: number;
|
|
14
|
+
severity: 'low' | 'medium' | 'high';
|
|
15
|
+
}
|
|
16
|
+
export declare class ComplexityCalculator {
|
|
17
|
+
/**
|
|
18
|
+
* Calculate all complexity metrics for given code
|
|
19
|
+
*/
|
|
20
|
+
calculateMetrics(code: string, language: 'javascript' | 'typescript' | 'python'): ComplexityMetrics;
|
|
21
|
+
/**
|
|
22
|
+
* Calculate cyclomatic complexity (decision points in code)
|
|
23
|
+
* Counts: if, else if, for, while, do, case, catch, ?:, ||, &&
|
|
24
|
+
*/
|
|
25
|
+
private calculateCyclomaticComplexity;
|
|
26
|
+
/**
|
|
27
|
+
* Calculate cognitive complexity (mental burden of understanding code)
|
|
28
|
+
* Similar to cyclomatic but weighs nested structures higher
|
|
29
|
+
*/
|
|
30
|
+
private calculateCognitiveComplexity;
|
|
31
|
+
/**
|
|
32
|
+
* Calculate maximum nesting depth in code
|
|
33
|
+
*/
|
|
34
|
+
private calculateMaxNestingDepth;
|
|
35
|
+
/**
|
|
36
|
+
* Count logical lines of code (excluding comments and blank lines)
|
|
37
|
+
*/
|
|
38
|
+
private countLinesOfCode;
|
|
39
|
+
/**
|
|
40
|
+
* Extract function definitions from code
|
|
41
|
+
*/
|
|
42
|
+
private extractFunctions;
|
|
43
|
+
/**
|
|
44
|
+
* Calculate overall complexity score (0-100, higher is worse)
|
|
45
|
+
*/
|
|
46
|
+
private calculateScore;
|
|
47
|
+
/**
|
|
48
|
+
* Determine severity level based on score
|
|
49
|
+
*/
|
|
50
|
+
private getSeverity;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=complexity-calculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-calculator.d.ts","sourceRoot":"","sources":["../../../src/developer/metrics/complexity-calculator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACrC;AAED,qBAAa,oBAAoB;IAC/B;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,iBAAiB;IAoCnG;;;OAGG;IACH,OAAO,CAAC,6BAA6B;IAiDrC;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IA4CpC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAgBhC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+DxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB;;OAEG;IACH,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Complexity Calculator - Metrics for code quality analysis
|
|
3
|
+
* Measures cyclomatic complexity, cognitive complexity, and code metrics
|
|
4
|
+
*/
|
|
5
|
+
export class ComplexityCalculator {
|
|
6
|
+
/**
|
|
7
|
+
* Calculate all complexity metrics for given code
|
|
8
|
+
*/
|
|
9
|
+
calculateMetrics(code, language) {
|
|
10
|
+
const lines = code.split('\n');
|
|
11
|
+
const linesOfCode = this.countLinesOfCode(lines);
|
|
12
|
+
const cyclomaticComplexity = this.calculateCyclomaticComplexity(code, language);
|
|
13
|
+
const cognitiveComplexity = this.calculateCognitiveComplexity(code, language);
|
|
14
|
+
const nestingDepth = this.calculateMaxNestingDepth(code);
|
|
15
|
+
const functions = this.extractFunctions(code, language);
|
|
16
|
+
const functionCount = functions.length;
|
|
17
|
+
const functionLengths = functions.map(f => f.length);
|
|
18
|
+
const maxFunctionLength = functionLengths.length > 0 ? Math.max(...functionLengths) : 0;
|
|
19
|
+
const averageFunctionLength = functionLengths.length > 0
|
|
20
|
+
? Math.round(functionLengths.reduce((a, b) => a + b, 0) / functionLengths.length)
|
|
21
|
+
: 0;
|
|
22
|
+
// Calculate overall score (0-100, higher is worse)
|
|
23
|
+
const score = this.calculateScore(cyclomaticComplexity, cognitiveComplexity, nestingDepth, maxFunctionLength, linesOfCode);
|
|
24
|
+
return {
|
|
25
|
+
cyclomaticComplexity,
|
|
26
|
+
cognitiveComplexity,
|
|
27
|
+
linesOfCode,
|
|
28
|
+
nestingDepth,
|
|
29
|
+
functionCount,
|
|
30
|
+
maxFunctionLength,
|
|
31
|
+
averageFunctionLength,
|
|
32
|
+
score,
|
|
33
|
+
severity: this.getSeverity(score)
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Calculate cyclomatic complexity (decision points in code)
|
|
38
|
+
* Counts: if, else if, for, while, do, case, catch, ?:, ||, &&
|
|
39
|
+
*/
|
|
40
|
+
calculateCyclomaticComplexity(code, language) {
|
|
41
|
+
let complexity = 1; // Base complexity
|
|
42
|
+
// Count decision points
|
|
43
|
+
const decisionPatterns = [
|
|
44
|
+
/\bif\s*\(/gm,
|
|
45
|
+
/\belse\s+if\s*\(/gm,
|
|
46
|
+
/\belse\b/gm,
|
|
47
|
+
/\bfor\s*\(/gm,
|
|
48
|
+
/\bwhile\s*\(/gm,
|
|
49
|
+
/\bdo\b/gm,
|
|
50
|
+
/\bcase\b/gm,
|
|
51
|
+
/\bcatch\s*\(/gm,
|
|
52
|
+
/\?(?!:)/gm, // Ternary operator (not part of ::)
|
|
53
|
+
/\|\|/gm,
|
|
54
|
+
/&&/gm
|
|
55
|
+
];
|
|
56
|
+
for (const pattern of decisionPatterns) {
|
|
57
|
+
const matches = code.match(pattern);
|
|
58
|
+
if (matches) {
|
|
59
|
+
complexity += matches.length;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// For Python, also count try/except
|
|
63
|
+
if (language === 'python') {
|
|
64
|
+
const pyPatterns = [
|
|
65
|
+
/\bif\s*:/gm,
|
|
66
|
+
/\belif\s*:/gm,
|
|
67
|
+
/\belse\s*:/gm,
|
|
68
|
+
/\bfor\s+\w+\s+in\b/gm,
|
|
69
|
+
/\bwhile\s*:/gm,
|
|
70
|
+
/\btry\s*:/gm,
|
|
71
|
+
/\bexcept\s*:/gm,
|
|
72
|
+
/\bexcept\s+\w+\s*:/gm
|
|
73
|
+
];
|
|
74
|
+
for (const pattern of pyPatterns) {
|
|
75
|
+
const matches = code.match(pattern);
|
|
76
|
+
if (matches) {
|
|
77
|
+
complexity += matches.length;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return Math.max(1, complexity);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Calculate cognitive complexity (mental burden of understanding code)
|
|
85
|
+
* Similar to cyclomatic but weighs nested structures higher
|
|
86
|
+
*/
|
|
87
|
+
calculateCognitiveComplexity(code, _language) {
|
|
88
|
+
let complexity = 0;
|
|
89
|
+
const lines = code.split('\n');
|
|
90
|
+
let currentNestingLevel = 0;
|
|
91
|
+
for (const line of lines) {
|
|
92
|
+
const trimmed = line.trim();
|
|
93
|
+
// Skip comments and empty lines
|
|
94
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed === '') {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
// Track nesting level
|
|
98
|
+
const openBraces = (line.match(/\{/g) || []).length;
|
|
99
|
+
const closeBraces = (line.match(/\}/g) || []).length;
|
|
100
|
+
const nestingDelta = openBraces - closeBraces;
|
|
101
|
+
currentNestingLevel = Math.max(0, currentNestingLevel + nestingDelta);
|
|
102
|
+
// Weight by nesting level
|
|
103
|
+
const baseWeightPatterns = [
|
|
104
|
+
{ regex: /\bif\s*\(/, weight: 1 },
|
|
105
|
+
{ regex: /\belse\s+if\s*\(/, weight: 1 },
|
|
106
|
+
{ regex: /\bfor\s*\(/, weight: 1 },
|
|
107
|
+
{ regex: /\bwhile\s*\(/, weight: 1 },
|
|
108
|
+
{ regex: /\btry\s*\{/, weight: 1 },
|
|
109
|
+
{ regex: /\bcatch\s*\(/, weight: 1 },
|
|
110
|
+
{ regex: /\?(?!:)/, weight: 0.5 }, // Ternary lower weight
|
|
111
|
+
];
|
|
112
|
+
for (const { regex, weight } of baseWeightPatterns) {
|
|
113
|
+
const matches = trimmed.match(regex);
|
|
114
|
+
if (matches) {
|
|
115
|
+
// Nested decisions cost more
|
|
116
|
+
const nestingMultiplier = 1 + (currentNestingLevel * 0.1);
|
|
117
|
+
complexity += matches.length * weight * nestingMultiplier;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return Math.round(complexity);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Calculate maximum nesting depth in code
|
|
125
|
+
*/
|
|
126
|
+
calculateMaxNestingDepth(code) {
|
|
127
|
+
let maxDepth = 0;
|
|
128
|
+
let currentDepth = 0;
|
|
129
|
+
for (const char of code) {
|
|
130
|
+
if (char === '{' || char === '[' || char === '(') {
|
|
131
|
+
currentDepth++;
|
|
132
|
+
maxDepth = Math.max(maxDepth, currentDepth);
|
|
133
|
+
}
|
|
134
|
+
else if (char === '}' || char === ']' || char === ')') {
|
|
135
|
+
currentDepth = Math.max(0, currentDepth - 1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return maxDepth;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Count logical lines of code (excluding comments and blank lines)
|
|
142
|
+
*/
|
|
143
|
+
countLinesOfCode(lines) {
|
|
144
|
+
let count = 0;
|
|
145
|
+
for (const line of lines) {
|
|
146
|
+
const trimmed = line.trim();
|
|
147
|
+
// Skip empty lines and comments
|
|
148
|
+
if (trimmed === '' || trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed.startsWith('*')) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
count++;
|
|
152
|
+
}
|
|
153
|
+
return count;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Extract function definitions from code
|
|
157
|
+
*/
|
|
158
|
+
extractFunctions(code, language) {
|
|
159
|
+
const functions = [];
|
|
160
|
+
if (language === 'python') {
|
|
161
|
+
// Python: def function_name(...)
|
|
162
|
+
const pyFuncRegex = /def\s+(\w+)\s*\([^)]*\):/g;
|
|
163
|
+
let match;
|
|
164
|
+
while ((match = pyFuncRegex.exec(code)) !== null) {
|
|
165
|
+
const funcName = match[1] || 'anonymous';
|
|
166
|
+
const startPos = match.index + match[0].length;
|
|
167
|
+
// Find the function body (indented code after def)
|
|
168
|
+
const restOfCode = code.substring(startPos);
|
|
169
|
+
const lines = restOfCode.split('\n');
|
|
170
|
+
let funcLength = 0;
|
|
171
|
+
const baseIndent = lines[0] ? lines[0].search(/\S/) : 0;
|
|
172
|
+
for (let i = 1; i < lines.length; i++) {
|
|
173
|
+
const line = lines[i];
|
|
174
|
+
if (!line)
|
|
175
|
+
continue;
|
|
176
|
+
const trimmed = line.trim();
|
|
177
|
+
// Stop when we hit a line with same or less indentation (and not empty)
|
|
178
|
+
if (trimmed && line.search(/\S/) <= baseIndent && baseIndent >= 0) {
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
funcLength++;
|
|
182
|
+
}
|
|
183
|
+
functions.push({ name: funcName, length: funcLength });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// JavaScript/TypeScript: function name() {} or const name = () => {}
|
|
188
|
+
const jsFuncRegex = /(?:function\s+(\w+)|const\s+(\w+)\s*=\s*(?:async\s*)?\(|(?:async\s+)?(\w+)\s*\([^)]*\)\s*\{)/g;
|
|
189
|
+
let match;
|
|
190
|
+
while ((match = jsFuncRegex.exec(code)) !== null) {
|
|
191
|
+
const funcName = match[1] || match[2] || match[3] || 'anonymous';
|
|
192
|
+
const startPos = match.index + match[0].length;
|
|
193
|
+
// Count lines until closing brace at same level
|
|
194
|
+
const restOfCode = code.substring(startPos);
|
|
195
|
+
let braceCount = 1;
|
|
196
|
+
let funcLength = 1;
|
|
197
|
+
for (const char of restOfCode) {
|
|
198
|
+
if (char === '{')
|
|
199
|
+
braceCount++;
|
|
200
|
+
else if (char === '}') {
|
|
201
|
+
braceCount--;
|
|
202
|
+
if (braceCount === 0)
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
if (char === '\n')
|
|
206
|
+
funcLength++;
|
|
207
|
+
}
|
|
208
|
+
functions.push({ name: funcName, length: funcLength });
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return functions;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Calculate overall complexity score (0-100, higher is worse)
|
|
215
|
+
*/
|
|
216
|
+
calculateScore(cyclomaticComplexity, cognitiveComplexity, nestingDepth, maxFunctionLength, _linesOfCode) {
|
|
217
|
+
let score = 0;
|
|
218
|
+
// Cyclomatic complexity (0-40 points)
|
|
219
|
+
// 1-5: 0 pts, 6-10: 10 pts, 11-15: 20 pts, 15+: 40 pts
|
|
220
|
+
if (cyclomaticComplexity <= 5)
|
|
221
|
+
score += 0;
|
|
222
|
+
else if (cyclomaticComplexity <= 10)
|
|
223
|
+
score += 10;
|
|
224
|
+
else if (cyclomaticComplexity <= 15)
|
|
225
|
+
score += 20;
|
|
226
|
+
else
|
|
227
|
+
score += 40;
|
|
228
|
+
// Cognitive complexity (0-30 points)
|
|
229
|
+
score += Math.min(30, Math.round(cognitiveComplexity * 2));
|
|
230
|
+
// Nesting depth (0-20 points)
|
|
231
|
+
// 1-3: 0 pts, 4-5: 5 pts, 6-7: 10 pts, 8+: 20 pts
|
|
232
|
+
if (nestingDepth <= 3)
|
|
233
|
+
score += 0;
|
|
234
|
+
else if (nestingDepth <= 5)
|
|
235
|
+
score += 5;
|
|
236
|
+
else if (nestingDepth <= 7)
|
|
237
|
+
score += 10;
|
|
238
|
+
else
|
|
239
|
+
score += 20;
|
|
240
|
+
// Function length (0-10 points)
|
|
241
|
+
// <50: 0 pts, 50-100: 5 pts, 100+: 10 pts
|
|
242
|
+
if (maxFunctionLength >= 100)
|
|
243
|
+
score += 10;
|
|
244
|
+
else if (maxFunctionLength >= 50)
|
|
245
|
+
score += 5;
|
|
246
|
+
return Math.min(100, score);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Determine severity level based on score
|
|
250
|
+
*/
|
|
251
|
+
getSeverity(score) {
|
|
252
|
+
if (score <= 30)
|
|
253
|
+
return 'low';
|
|
254
|
+
if (score <= 60)
|
|
255
|
+
return 'medium';
|
|
256
|
+
return 'high';
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=complexity-calculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity-calculator.js","sourceRoot":"","sources":["../../../src/developer/metrics/complexity-calculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review Summary Generator
|
|
3
|
+
* Generates executive summaries, categorized problem lists, and review complexity estimates
|
|
4
|
+
*/
|
|
5
|
+
import { CodeIssue, ScanResult } from '../scanners/review-assistant.js';
|
|
6
|
+
export interface IssueCategoryGroup {
|
|
7
|
+
category: string;
|
|
8
|
+
severity: 'low' | 'medium' | 'high';
|
|
9
|
+
count: number;
|
|
10
|
+
issues: CodeIssue[];
|
|
11
|
+
fixTime: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ReviewSummary {
|
|
14
|
+
executiveSummary: string;
|
|
15
|
+
categoryGroups: IssueCategoryGroup[];
|
|
16
|
+
complexityScore: number;
|
|
17
|
+
estimatedReviewTime: number;
|
|
18
|
+
riskLevel: 'low' | 'medium' | 'high';
|
|
19
|
+
actionItems: string[];
|
|
20
|
+
fixableSuggestions: Array<{
|
|
21
|
+
line: number;
|
|
22
|
+
current: string;
|
|
23
|
+
suggested: string;
|
|
24
|
+
}>;
|
|
25
|
+
metrics: {
|
|
26
|
+
totalIssues: number;
|
|
27
|
+
criticalCount: number;
|
|
28
|
+
warningCount: number;
|
|
29
|
+
infoCount: number;
|
|
30
|
+
codeQualityScore: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export declare class ReviewSummaryGenerator {
|
|
34
|
+
private scanResult;
|
|
35
|
+
private codeLines;
|
|
36
|
+
constructor(scanResult: ScanResult, codeLines?: number);
|
|
37
|
+
generate(): ReviewSummary;
|
|
38
|
+
private groupIssuesByCategory;
|
|
39
|
+
private estimateCategoryFixTime;
|
|
40
|
+
private calculateComplexityScore;
|
|
41
|
+
private estimateReviewTime;
|
|
42
|
+
private determineRiskLevel;
|
|
43
|
+
private generateActionItems;
|
|
44
|
+
private compileSuggestions;
|
|
45
|
+
private calculateMetrics;
|
|
46
|
+
private generateExecutiveSummary;
|
|
47
|
+
}
|
|
48
|
+
export declare function formatReviewSummaryAsMarkdown(summary: ReviewSummary): string;
|
|
49
|
+
//# sourceMappingURL=review-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-summary.d.ts","sourceRoot":"","sources":["../../../src/developer/reports/review-summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAExE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,kBAAkB,EAAE,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,KAAK,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAS;gBAEd,UAAU,EAAE,UAAU,EAAE,SAAS,GAAE,MAAU;IAKzD,QAAQ,IAAI,aAAa;IA2BzB,OAAO,CAAC,qBAAqB;IA+C7B,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,wBAAwB;IA8BhC,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,wBAAwB;CA+BjC;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAqD5E"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review Summary Generator
|
|
3
|
+
* Generates executive summaries, categorized problem lists, and review complexity estimates
|
|
4
|
+
*/
|
|
5
|
+
export class ReviewSummaryGenerator {
|
|
6
|
+
scanResult;
|
|
7
|
+
codeLines;
|
|
8
|
+
constructor(scanResult, codeLines = 0) {
|
|
9
|
+
this.scanResult = scanResult;
|
|
10
|
+
this.codeLines = codeLines;
|
|
11
|
+
}
|
|
12
|
+
generate() {
|
|
13
|
+
const categoryGroups = this.groupIssuesByCategory();
|
|
14
|
+
const complexityScore = this.calculateComplexityScore();
|
|
15
|
+
const estimatedReviewTime = this.estimateReviewTime(categoryGroups);
|
|
16
|
+
const riskLevel = this.determineRiskLevel();
|
|
17
|
+
const actionItems = this.generateActionItems(categoryGroups);
|
|
18
|
+
const fixableSuggestions = this.compileSuggestions();
|
|
19
|
+
const metrics = this.calculateMetrics();
|
|
20
|
+
const executiveSummary = this.generateExecutiveSummary(complexityScore, riskLevel, metrics);
|
|
21
|
+
return {
|
|
22
|
+
executiveSummary,
|
|
23
|
+
categoryGroups,
|
|
24
|
+
complexityScore,
|
|
25
|
+
estimatedReviewTime,
|
|
26
|
+
riskLevel,
|
|
27
|
+
actionItems,
|
|
28
|
+
fixableSuggestions,
|
|
29
|
+
metrics
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
groupIssuesByCategory() {
|
|
33
|
+
const groups = {};
|
|
34
|
+
const typeToCategory = {
|
|
35
|
+
'console_log': { category: 'Debug Statements', severity: 'low' },
|
|
36
|
+
'commented_code': { category: 'Code Cleanup', severity: 'low' },
|
|
37
|
+
'todo': { category: 'Incomplete Work', severity: 'medium' },
|
|
38
|
+
'fixme': { category: 'Urgent Fixes', severity: 'high' },
|
|
39
|
+
'missing_error_handling': { category: 'Error Handling', severity: 'high' },
|
|
40
|
+
'hardcoded_value': { category: 'Configuration', severity: 'high' },
|
|
41
|
+
'missing_types': { category: 'Type Safety', severity: 'medium' },
|
|
42
|
+
'unreachable_code': { category: 'Dead Code', severity: 'medium' },
|
|
43
|
+
'nested_complexity': { category: 'Code Complexity', severity: 'medium' }
|
|
44
|
+
};
|
|
45
|
+
this.scanResult.issues.forEach(issue => {
|
|
46
|
+
const categoryInfo = typeToCategory[issue.type] || {
|
|
47
|
+
category: issue.type,
|
|
48
|
+
severity: issue.severity
|
|
49
|
+
};
|
|
50
|
+
const key = categoryInfo.category;
|
|
51
|
+
if (!groups[key]) {
|
|
52
|
+
groups[key] = {
|
|
53
|
+
category: categoryInfo.category,
|
|
54
|
+
severity: categoryInfo.severity,
|
|
55
|
+
count: 0,
|
|
56
|
+
issues: [],
|
|
57
|
+
fixTime: this.estimateCategoryFixTime(categoryInfo.category)
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
groups[key].count++;
|
|
61
|
+
groups[key].issues.push(issue);
|
|
62
|
+
});
|
|
63
|
+
// Sort by severity (high > medium > low), then by count
|
|
64
|
+
return Object.values(groups).sort((a, b) => {
|
|
65
|
+
const severityOrder = { high: 0, medium: 1, low: 2 };
|
|
66
|
+
if (severityOrder[a.severity] !== severityOrder[b.severity]) {
|
|
67
|
+
return severityOrder[a.severity] - severityOrder[b.severity];
|
|
68
|
+
}
|
|
69
|
+
return b.count - a.count;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
estimateCategoryFixTime(category) {
|
|
73
|
+
const timeMap = {
|
|
74
|
+
'Debug Statements': 1,
|
|
75
|
+
'Code Cleanup': 2,
|
|
76
|
+
'Incomplete Work': 15,
|
|
77
|
+
'Urgent Fixes': 20,
|
|
78
|
+
'Error Handling': 10,
|
|
79
|
+
'Configuration': 5,
|
|
80
|
+
'Type Safety': 3,
|
|
81
|
+
'Dead Code': 2,
|
|
82
|
+
'Code Complexity': 15
|
|
83
|
+
};
|
|
84
|
+
return timeMap[category] || 5;
|
|
85
|
+
}
|
|
86
|
+
calculateComplexityScore() {
|
|
87
|
+
let score = 0;
|
|
88
|
+
// Base score from issue count
|
|
89
|
+
const issueCount = this.scanResult.totalIssues;
|
|
90
|
+
if (issueCount === 0)
|
|
91
|
+
score = 95;
|
|
92
|
+
else if (issueCount <= 3)
|
|
93
|
+
score = 80;
|
|
94
|
+
else if (issueCount <= 10)
|
|
95
|
+
score = 60;
|
|
96
|
+
else if (issueCount <= 20)
|
|
97
|
+
score = 40;
|
|
98
|
+
else
|
|
99
|
+
score = 20;
|
|
100
|
+
// Adjust for severity mix
|
|
101
|
+
const { high, medium, low } = this.scanResult.issuesBySeverity;
|
|
102
|
+
const highImpact = (high || 0) * 15;
|
|
103
|
+
const mediumImpact = (medium || 0) * 8;
|
|
104
|
+
const lowImpact = (low || 0) * 2;
|
|
105
|
+
score = Math.max(0, score - (highImpact + mediumImpact + lowImpact) / 10);
|
|
106
|
+
// Adjust for critical issue types
|
|
107
|
+
const criticalTypes = ['hardcoded_value', 'missing_error_handling', 'fixme'];
|
|
108
|
+
const criticalCount = this.scanResult.issues.filter(i => criticalTypes.includes(i.type)).length;
|
|
109
|
+
score = Math.max(0, score - criticalCount * 5);
|
|
110
|
+
return Math.min(100, Math.max(0, Math.round(score)));
|
|
111
|
+
}
|
|
112
|
+
estimateReviewTime(groups) {
|
|
113
|
+
let baseTime = 10; // 10 minutes base review time
|
|
114
|
+
// Add time for each issue group
|
|
115
|
+
const groupTime = groups.reduce((total, group) => {
|
|
116
|
+
return total + group.fixTime;
|
|
117
|
+
}, 0);
|
|
118
|
+
// Additional time based on code size
|
|
119
|
+
const sizeAdjustment = Math.ceil(this.codeLines / 100) * 2;
|
|
120
|
+
return baseTime + groupTime + sizeAdjustment;
|
|
121
|
+
}
|
|
122
|
+
determineRiskLevel() {
|
|
123
|
+
const { high, medium } = this.scanResult.issuesBySeverity;
|
|
124
|
+
if ((high || 0) > 0)
|
|
125
|
+
return 'high';
|
|
126
|
+
if ((medium || 0) > 3)
|
|
127
|
+
return 'high';
|
|
128
|
+
if ((medium || 0) > 0)
|
|
129
|
+
return 'medium';
|
|
130
|
+
return 'low';
|
|
131
|
+
}
|
|
132
|
+
generateActionItems(groups) {
|
|
133
|
+
const items = [];
|
|
134
|
+
groups.forEach((group, _index) => {
|
|
135
|
+
const priority = group.severity === 'high' ? 'MUST' : group.severity === 'medium' ? 'SHOULD' : 'CONSIDER';
|
|
136
|
+
items.push(`${priority} fix ${group.count} ${group.category.toLowerCase()} issue(s)`);
|
|
137
|
+
// Add specific guidance for critical categories
|
|
138
|
+
if (group.category === 'Urgent Fixes') {
|
|
139
|
+
items.push(` → Required before merge: ${group.issues.map(i => `Line ${i.line}`).join(', ')}`);
|
|
140
|
+
}
|
|
141
|
+
if (group.category === 'Configuration') {
|
|
142
|
+
items.push(` → Replace hardcoded values with environment variables`);
|
|
143
|
+
}
|
|
144
|
+
if (group.category === 'Error Handling') {
|
|
145
|
+
items.push(` → Add proper error handlers to prevent runtime failures`);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
if (items.length === 0) {
|
|
149
|
+
items.push('✓ No action items - code is clean');
|
|
150
|
+
}
|
|
151
|
+
return items;
|
|
152
|
+
}
|
|
153
|
+
compileSuggestions() {
|
|
154
|
+
const suggestions = [];
|
|
155
|
+
this.scanResult.issues.forEach(issue => {
|
|
156
|
+
if (issue.suggestion) {
|
|
157
|
+
suggestions.push({
|
|
158
|
+
line: issue.line,
|
|
159
|
+
current: issue.code,
|
|
160
|
+
suggested: issue.suggestion
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
return suggestions.slice(0, 10); // Limit to top 10 suggestions
|
|
165
|
+
}
|
|
166
|
+
calculateMetrics() {
|
|
167
|
+
const { high, medium, low } = this.scanResult.issuesBySeverity;
|
|
168
|
+
const total = this.scanResult.totalIssues;
|
|
169
|
+
// Code quality score: 100 - (issues with weighted penalty)
|
|
170
|
+
const qualityPenalty = ((high || 0) * 10) + ((medium || 0) * 5) + ((low || 0) * 1);
|
|
171
|
+
const codeQualityScore = Math.max(0, 100 - qualityPenalty);
|
|
172
|
+
return {
|
|
173
|
+
totalIssues: total,
|
|
174
|
+
criticalCount: high || 0,
|
|
175
|
+
warningCount: medium || 0,
|
|
176
|
+
infoCount: low || 0,
|
|
177
|
+
codeQualityScore
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
generateExecutiveSummary(_complexityScore, riskLevel, metrics) {
|
|
181
|
+
if (metrics.totalIssues === 0) {
|
|
182
|
+
return `Perfect! No issues detected. Code quality score: ${metrics.codeQualityScore}/100. Ready for review.`;
|
|
183
|
+
}
|
|
184
|
+
const riskEmoji = {
|
|
185
|
+
low: '✓',
|
|
186
|
+
medium: '⚠',
|
|
187
|
+
high: '❌'
|
|
188
|
+
};
|
|
189
|
+
const parts = [
|
|
190
|
+
`${riskEmoji[riskLevel]} Risk Level: ${riskLevel.toUpperCase()}`,
|
|
191
|
+
`Code Quality: ${metrics.codeQualityScore}/100`,
|
|
192
|
+
`Issues Found: ${metrics.totalIssues} (${metrics.criticalCount} critical, ${metrics.warningCount} warnings, ${metrics.infoCount} info)`
|
|
193
|
+
];
|
|
194
|
+
if (metrics.criticalCount > 0) {
|
|
195
|
+
parts.push(`Action Required: ${metrics.criticalCount} critical issue(s) must be fixed before merge`);
|
|
196
|
+
}
|
|
197
|
+
if (metrics.warningCount > 0) {
|
|
198
|
+
parts.push(`Review Needed: ${metrics.warningCount} warning(s) should be addressed`);
|
|
199
|
+
}
|
|
200
|
+
return parts.join(' | ');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export function formatReviewSummaryAsMarkdown(summary) {
|
|
204
|
+
let markdown = `# Code Review Summary\n\n`;
|
|
205
|
+
markdown += `## Executive Summary\n${summary.executiveSummary}\n\n`;
|
|
206
|
+
markdown += `## Metrics\n`;
|
|
207
|
+
markdown += `- **Code Quality Score**: ${summary.metrics.codeQualityScore}/100\n`;
|
|
208
|
+
markdown += `- **Complexity Score**: ${summary.complexityScore}/100\n`;
|
|
209
|
+
markdown += `- **Risk Level**: ${summary.riskLevel.toUpperCase()}\n`;
|
|
210
|
+
markdown += `- **Estimated Review Time**: ${summary.estimatedReviewTime} minutes\n`;
|
|
211
|
+
markdown += `- **Total Issues**: ${summary.metrics.totalIssues}\n`;
|
|
212
|
+
markdown += ` - Critical: ${summary.metrics.criticalCount}\n`;
|
|
213
|
+
markdown += ` - Warnings: ${summary.metrics.warningCount}\n`;
|
|
214
|
+
markdown += ` - Info: ${summary.metrics.infoCount}\n\n`;
|
|
215
|
+
if (summary.categoryGroups.length > 0) {
|
|
216
|
+
markdown += `## Issues by Category\n`;
|
|
217
|
+
summary.categoryGroups.forEach(group => {
|
|
218
|
+
markdown += `### ${group.category} (${group.count})\n`;
|
|
219
|
+
markdown += `**Severity**: ${group.severity} | **Est. Fix Time**: ${group.fixTime}min\n\n`;
|
|
220
|
+
group.issues.slice(0, 3).forEach(issue => {
|
|
221
|
+
markdown += `- **Line ${issue.line}**: ${issue.message}\n`;
|
|
222
|
+
if (issue.suggestion) {
|
|
223
|
+
markdown += ` - Suggestion: ${issue.suggestion}\n`;
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
if (group.issues.length > 3) {
|
|
227
|
+
markdown += `- ... and ${group.issues.length - 3} more\n`;
|
|
228
|
+
}
|
|
229
|
+
markdown += '\n';
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
if (summary.actionItems.length > 0) {
|
|
233
|
+
markdown += `## Action Items\n`;
|
|
234
|
+
summary.actionItems.forEach(item => {
|
|
235
|
+
markdown += `- ${item}\n`;
|
|
236
|
+
});
|
|
237
|
+
markdown += '\n';
|
|
238
|
+
}
|
|
239
|
+
if (summary.fixableSuggestions.length > 0) {
|
|
240
|
+
markdown += `## Suggested Fixes\n`;
|
|
241
|
+
summary.fixableSuggestions.forEach(fix => {
|
|
242
|
+
markdown += `### Line ${fix.line}\n`;
|
|
243
|
+
markdown += `\`\`\`\nCurrent: ${fix.current}\n\`\`\`\n`;
|
|
244
|
+
markdown += `**Suggestion**: ${fix.suggested}\n\n`;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return markdown;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=review-summary.js.map
|