couchloop-eq-mcp 1.0.4 → 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/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.map +1 -1
- package/dist/types/auth.js +1 -2
- 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
package/README.md
CHANGED
|
@@ -24,17 +24,32 @@ CouchLoop EQ is an MCP (Model Context Protocol) server that provides behavioral
|
|
|
24
24
|
- **Crisis Detection**: Integration with therapeutic AI for emotional support
|
|
25
25
|
- **Memory Context**: Preserves important insights and checkpoints
|
|
26
26
|
|
|
27
|
-
##
|
|
27
|
+
## Quick Start
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
### Option 1: Connect to Demo Server (Easiest)
|
|
30
|
+
|
|
31
|
+
For Claude Desktop (v0.7.0+), add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"mcpServers": {
|
|
36
|
+
"couchloop-eq": {
|
|
37
|
+
"url": "https://couchloop-mcp-production.up.railway.app/mcp",
|
|
38
|
+
"transport": "sse"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
31
42
|
```
|
|
32
43
|
|
|
33
|
-
|
|
44
|
+
Restart Claude and try: **"Start a daily reflection session"**
|
|
34
45
|
|
|
35
|
-
###
|
|
46
|
+
### Option 2: Run Locally (v1.0.4)
|
|
36
47
|
|
|
37
|
-
|
|
48
|
+
```bash
|
|
49
|
+
npm install -g couchloop-eq-mcp
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Add to Claude Desktop configuration:
|
|
38
53
|
|
|
39
54
|
```json
|
|
40
55
|
{
|
|
@@ -42,13 +57,15 @@ Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/
|
|
|
42
57
|
"couchloop-eq": {
|
|
43
58
|
"command": "couchloop-eq-mcp",
|
|
44
59
|
"env": {
|
|
45
|
-
"
|
|
60
|
+
"COUCHLOOP_SERVER": "https://couchloopchat.com"
|
|
46
61
|
}
|
|
47
62
|
}
|
|
48
63
|
}
|
|
49
64
|
}
|
|
50
65
|
```
|
|
51
66
|
|
|
67
|
+
**New in v1.0.4**: Sessions automatically persist locally to `~/.couchloop-mcp/identity.json` - no signup required!
|
|
68
|
+
|
|
52
69
|
### For ChatGPT (Developer Mode)
|
|
53
70
|
|
|
54
71
|
ChatGPT supports MCP servers through Developer Mode. See [CHATGPT_SETUP.md](CHATGPT_SETUP.md) for detailed setup instructions.
|
|
@@ -102,10 +119,6 @@ Save an insight:
|
|
|
102
119
|
"Save this insight: I notice I'm more energized in the mornings"
|
|
103
120
|
```
|
|
104
121
|
|
|
105
|
-
## Get Started
|
|
106
|
-
|
|
107
|
-
Sign up for API access at [couchloop.com](https://couchloop.com)
|
|
108
|
-
|
|
109
122
|
## Support
|
|
110
123
|
|
|
111
124
|
- Issues: [github.com/wisenbergg/couchloop-mcp/issues](https://github.com/wisenbergg/couchloop-mcp/issues)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Bloat Detector - Identifies verbose and over-engineered patterns
|
|
3
|
+
* Detects patterns that create technical debt and suggests simplifications
|
|
4
|
+
*/
|
|
5
|
+
import { ComplexityMetrics } from '../metrics/complexity-calculator.js';
|
|
6
|
+
export interface CodeSmellWarning {
|
|
7
|
+
type: string;
|
|
8
|
+
severity: 'low' | 'medium' | 'high';
|
|
9
|
+
line?: number;
|
|
10
|
+
pattern: string;
|
|
11
|
+
suggestion: string;
|
|
12
|
+
example?: {
|
|
13
|
+
bad: string;
|
|
14
|
+
good: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface BloatDetectionResult {
|
|
18
|
+
issues: CodeSmellWarning[];
|
|
19
|
+
metrics: ComplexityMetrics;
|
|
20
|
+
summary: {
|
|
21
|
+
totalIssues: number;
|
|
22
|
+
criticalIssues: number;
|
|
23
|
+
warningCount: number;
|
|
24
|
+
score: number;
|
|
25
|
+
recommendation: string;
|
|
26
|
+
};
|
|
27
|
+
refactoringPriority: string[];
|
|
28
|
+
}
|
|
29
|
+
export declare class BloatDetector {
|
|
30
|
+
private complexityCalculator;
|
|
31
|
+
constructor(threshold?: number);
|
|
32
|
+
/**
|
|
33
|
+
* Analyze code for bloat patterns
|
|
34
|
+
*/
|
|
35
|
+
analyze(code: string, language: 'javascript' | 'typescript' | 'python'): BloatDetectionResult;
|
|
36
|
+
/**
|
|
37
|
+
* Detect excessive nesting (>3 levels)
|
|
38
|
+
*/
|
|
39
|
+
private detectExcessiveNesting;
|
|
40
|
+
/**
|
|
41
|
+
* Detect unnecessary try-catch blocks
|
|
42
|
+
*/
|
|
43
|
+
private detectUnnecessaryTryCatch;
|
|
44
|
+
/**
|
|
45
|
+
* Detect over-abstraction (single-use abstractions)
|
|
46
|
+
*/
|
|
47
|
+
private detectOverAbstraction;
|
|
48
|
+
/**
|
|
49
|
+
* Detect duplicated code patterns
|
|
50
|
+
*/
|
|
51
|
+
private detectDuplicatePatterns;
|
|
52
|
+
/**
|
|
53
|
+
* Detect verbose conditionals that could be simplified
|
|
54
|
+
*/
|
|
55
|
+
private detectVerboseConditionals;
|
|
56
|
+
/**
|
|
57
|
+
* Detect functions longer than 50 lines
|
|
58
|
+
*/
|
|
59
|
+
private detectLongFunctions;
|
|
60
|
+
/**
|
|
61
|
+
* Detect chained conditionals that could use switch
|
|
62
|
+
*/
|
|
63
|
+
private detectChainedConditionals;
|
|
64
|
+
/**
|
|
65
|
+
* Detect redundant null/undefined checks
|
|
66
|
+
*/
|
|
67
|
+
private detectRedundantNullChecks;
|
|
68
|
+
/**
|
|
69
|
+
* Detect overly complex logic that should be extracted
|
|
70
|
+
*/
|
|
71
|
+
private detectComplexLogic;
|
|
72
|
+
/**
|
|
73
|
+
* Extract function blocks with metadata
|
|
74
|
+
*/
|
|
75
|
+
private extractFunctionBlocks;
|
|
76
|
+
/**
|
|
77
|
+
* Normalize line for duplicate detection
|
|
78
|
+
*/
|
|
79
|
+
private normalizeLine;
|
|
80
|
+
/**
|
|
81
|
+
* Generate recommendation based on issues and metrics
|
|
82
|
+
*/
|
|
83
|
+
private generateRecommendation;
|
|
84
|
+
/**
|
|
85
|
+
* Prioritize refactoring tasks by impact
|
|
86
|
+
*/
|
|
87
|
+
private prioritizeRefactoring;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=bloat-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bloat-detector.d.ts","sourceRoot":"","sources":["../../../src/developer/analyzers/bloat-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAwB,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAE9F,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,oBAAoB,CAAuB;gBACvC,SAAS,GAAE,MAAW;IAMlC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,oBAAoB;IAsC7F;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgD9B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAgEjC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgC7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+B/B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA0DjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAkDjC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAqCjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgC7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsB9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CA0B9B"}
|
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Bloat Detector - Identifies verbose and over-engineered patterns
|
|
3
|
+
* Detects patterns that create technical debt and suggests simplifications
|
|
4
|
+
*/
|
|
5
|
+
import { ComplexityCalculator } from '../metrics/complexity-calculator.js';
|
|
6
|
+
export class BloatDetector {
|
|
7
|
+
complexityCalculator;
|
|
8
|
+
constructor(threshold = 50) {
|
|
9
|
+
this.complexityCalculator = new ComplexityCalculator();
|
|
10
|
+
// Threshold reserved for future use
|
|
11
|
+
void threshold;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Analyze code for bloat patterns
|
|
15
|
+
*/
|
|
16
|
+
analyze(code, language) {
|
|
17
|
+
const issues = [];
|
|
18
|
+
const metrics = this.complexityCalculator.calculateMetrics(code, language);
|
|
19
|
+
// Detect specific patterns
|
|
20
|
+
this.detectExcessiveNesting(code, language, issues);
|
|
21
|
+
this.detectUnnecessaryTryCatch(code, language, issues);
|
|
22
|
+
this.detectOverAbstraction(code, language, issues);
|
|
23
|
+
this.detectDuplicatePatterns(code, language, issues);
|
|
24
|
+
this.detectVerboseConditionals(code, language, issues);
|
|
25
|
+
this.detectLongFunctions(code, language, issues);
|
|
26
|
+
this.detectChainedConditionals(code, language, issues);
|
|
27
|
+
this.detectRedundantNullChecks(code, language, issues);
|
|
28
|
+
this.detectComplexLogic(code, language, issues);
|
|
29
|
+
// Sort by severity
|
|
30
|
+
issues.sort((a, b) => {
|
|
31
|
+
const severityOrder = { high: 0, medium: 1, low: 2 };
|
|
32
|
+
return severityOrder[a.severity] - severityOrder[b.severity];
|
|
33
|
+
});
|
|
34
|
+
const criticalIssues = issues.filter(i => i.severity === 'high').length;
|
|
35
|
+
const warningCount = issues.filter(i => i.severity !== 'high').length;
|
|
36
|
+
return {
|
|
37
|
+
issues,
|
|
38
|
+
metrics,
|
|
39
|
+
summary: {
|
|
40
|
+
totalIssues: issues.length,
|
|
41
|
+
criticalIssues,
|
|
42
|
+
warningCount,
|
|
43
|
+
score: metrics.score,
|
|
44
|
+
recommendation: this.generateRecommendation(issues, metrics)
|
|
45
|
+
},
|
|
46
|
+
refactoringPriority: this.prioritizeRefactoring(issues, metrics)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Detect excessive nesting (>3 levels)
|
|
51
|
+
*/
|
|
52
|
+
detectExcessiveNesting(code, _language, issues) {
|
|
53
|
+
const lines = code.split('\n');
|
|
54
|
+
let maxNesting = 0;
|
|
55
|
+
let nestingStack = [];
|
|
56
|
+
for (let i = 0; i < lines.length; i++) {
|
|
57
|
+
const line = lines[i];
|
|
58
|
+
if (!line)
|
|
59
|
+
continue;
|
|
60
|
+
const openBraces = (line.match(/\{/g) || []).length;
|
|
61
|
+
const closeBraces = (line.match(/\}/g) || []).length;
|
|
62
|
+
for (let j = 0; j < openBraces; j++) {
|
|
63
|
+
nestingStack.push({ level: nestingStack.length + 1, lineNumber: i + 1 });
|
|
64
|
+
}
|
|
65
|
+
for (let j = 0; j < closeBraces; j++) {
|
|
66
|
+
nestingStack.pop();
|
|
67
|
+
}
|
|
68
|
+
const currentNesting = nestingStack.length;
|
|
69
|
+
if (currentNesting > 3 && currentNesting > maxNesting) {
|
|
70
|
+
maxNesting = currentNesting;
|
|
71
|
+
issues.push({
|
|
72
|
+
type: 'excessive_nesting',
|
|
73
|
+
severity: currentNesting > 5 ? 'high' : 'medium',
|
|
74
|
+
line: i + 1,
|
|
75
|
+
pattern: line.trim().substring(0, 50),
|
|
76
|
+
suggestion: `Reduce nesting depth from ${currentNesting} to 3 or less. Extract nested logic into separate functions.`,
|
|
77
|
+
example: {
|
|
78
|
+
bad: `if (user) {
|
|
79
|
+
if (user.email) {
|
|
80
|
+
if (user.email.includes('@')) {
|
|
81
|
+
if (user.verified) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}`,
|
|
87
|
+
good: `const isValidUser = (user) =>
|
|
88
|
+
user?.email?.includes('@') && user?.verified;
|
|
89
|
+
return isValidUser(user) ? true : false;`
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Detect unnecessary try-catch blocks
|
|
97
|
+
*/
|
|
98
|
+
detectUnnecessaryTryCatch(code, _language, issues) {
|
|
99
|
+
// Pattern: try block with no operations that can fail
|
|
100
|
+
const tryBlockRegex = /try\s*\{([^}]+)\}\s*catch\s*\(/gm;
|
|
101
|
+
let match;
|
|
102
|
+
while ((match = tryBlockRegex.exec(code)) !== null) {
|
|
103
|
+
const blockContent = match[1];
|
|
104
|
+
const lineNumber = code.substring(0, match.index).split('\n').length;
|
|
105
|
+
// Check if try block only contains safe operations
|
|
106
|
+
const hasDangerousOps = /(\.\w+\(|fetch|async|await|JSON\.parse|throw)/i.test(blockContent || '');
|
|
107
|
+
if (!hasDangerousOps) {
|
|
108
|
+
issues.push({
|
|
109
|
+
type: 'unnecessary_try_catch',
|
|
110
|
+
severity: 'low',
|
|
111
|
+
line: lineNumber,
|
|
112
|
+
pattern: `try { ... } catch (e) { ... }`,
|
|
113
|
+
suggestion: 'This try-catch wraps safe operations. Remove unnecessary error handling.',
|
|
114
|
+
example: {
|
|
115
|
+
bad: `try {
|
|
116
|
+
if (x) {
|
|
117
|
+
console.log('safe');
|
|
118
|
+
}
|
|
119
|
+
} catch (e) {
|
|
120
|
+
return false;
|
|
121
|
+
}`,
|
|
122
|
+
good: `if (x) {
|
|
123
|
+
console.log('safe');
|
|
124
|
+
}`
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Also detect swallowing errors with no logging/handling
|
|
129
|
+
const catchContent = code.substring(match.index + match[0].length);
|
|
130
|
+
const catchEndIndex = catchContent.indexOf('\n');
|
|
131
|
+
const catchLine = catchContent.substring(0, catchEndIndex);
|
|
132
|
+
if (/catch\s*\([^)]*\)\s*\{\s*(?:return|;|})/i.test(catchLine)) {
|
|
133
|
+
issues.push({
|
|
134
|
+
type: 'swallowed_errors',
|
|
135
|
+
severity: 'high',
|
|
136
|
+
line: lineNumber,
|
|
137
|
+
pattern: `catch (e) { return/; }`,
|
|
138
|
+
suggestion: 'Error is silently swallowed. Add logging or meaningful error handling.',
|
|
139
|
+
example: {
|
|
140
|
+
bad: `try {
|
|
141
|
+
return risky();
|
|
142
|
+
} catch (e) {
|
|
143
|
+
return false;
|
|
144
|
+
}`,
|
|
145
|
+
good: `try {
|
|
146
|
+
return risky();
|
|
147
|
+
} catch (e) {
|
|
148
|
+
logger.error('Operation failed:', e);
|
|
149
|
+
throw new Error('Failed to complete operation');
|
|
150
|
+
}`
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Detect over-abstraction (single-use abstractions)
|
|
158
|
+
*/
|
|
159
|
+
detectOverAbstraction(code, _language, issues) {
|
|
160
|
+
// Pattern: functions/classes used only once
|
|
161
|
+
const functionMatches = code.matchAll(/(?:function|const)\s+(\w+)\s*(?:\(|=)/g);
|
|
162
|
+
const functionNames = new Map();
|
|
163
|
+
for (const match of functionMatches) {
|
|
164
|
+
const name = match[1];
|
|
165
|
+
if (!name)
|
|
166
|
+
continue;
|
|
167
|
+
functionNames.set(name, (functionNames.get(name) || 0) + 1);
|
|
168
|
+
}
|
|
169
|
+
// Find functions that are defined but only called once (or not at all)
|
|
170
|
+
for (const [name, _count] of functionNames.entries()) {
|
|
171
|
+
const callPattern = new RegExp(`\\b${name}\\s*\\(`, 'g');
|
|
172
|
+
const calls = code.match(callPattern);
|
|
173
|
+
const callCount = calls ? calls.length - 1 : 0; // -1 for the definition
|
|
174
|
+
if (callCount === 1) {
|
|
175
|
+
const defIndex = code.indexOf(`${name}\s*(`);
|
|
176
|
+
const lineNumber = code.substring(0, defIndex).split('\n').length;
|
|
177
|
+
issues.push({
|
|
178
|
+
type: 'over_abstraction',
|
|
179
|
+
severity: 'low',
|
|
180
|
+
line: lineNumber,
|
|
181
|
+
pattern: `Function "${name}" defined but used only once`,
|
|
182
|
+
suggestion: `Inline function "${name}" where it's called. Single-use abstractions add complexity without benefit.`
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Detect duplicated code patterns
|
|
189
|
+
*/
|
|
190
|
+
detectDuplicatePatterns(code, _language, issues) {
|
|
191
|
+
const lines = code.split('\n').filter(l => l.trim() && !l.trim().startsWith('//'));
|
|
192
|
+
// Look for repeated line patterns (3+ occurrences)
|
|
193
|
+
const linePatterns = new Map();
|
|
194
|
+
for (let i = 0; i < lines.length; i++) {
|
|
195
|
+
const line = lines[i];
|
|
196
|
+
if (!line)
|
|
197
|
+
continue;
|
|
198
|
+
const normalized = this.normalizeLine(line);
|
|
199
|
+
if (normalized.length > 20) { // Only check substantial lines
|
|
200
|
+
if (!linePatterns.has(normalized)) {
|
|
201
|
+
linePatterns.set(normalized, []);
|
|
202
|
+
}
|
|
203
|
+
linePatterns.get(normalized).push(i + 1);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
for (const [pattern, occurrences] of linePatterns.entries()) {
|
|
207
|
+
if (occurrences.length >= 3) {
|
|
208
|
+
issues.push({
|
|
209
|
+
type: 'code_duplication',
|
|
210
|
+
severity: occurrences.length >= 5 ? 'high' : 'medium',
|
|
211
|
+
line: occurrences[0],
|
|
212
|
+
pattern: pattern.substring(0, 60),
|
|
213
|
+
suggestion: `This pattern appears ${occurrences.length} times (lines ${occurrences.join(', ')}). Extract to a utility function.`
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Detect verbose conditionals that could be simplified
|
|
220
|
+
*/
|
|
221
|
+
detectVerboseConditionals(code, _language, issues) {
|
|
222
|
+
const lines = code.split('\n');
|
|
223
|
+
for (let i = 0; i < lines.length; i++) {
|
|
224
|
+
const line = lines[i];
|
|
225
|
+
if (!line)
|
|
226
|
+
continue;
|
|
227
|
+
// Pattern: if (x === true) or if (x === false)
|
|
228
|
+
if (/if\s*\(\s*\w+\s*===\s*(true|false)\s*\)/.test(line)) {
|
|
229
|
+
issues.push({
|
|
230
|
+
type: 'verbose_boolean_check',
|
|
231
|
+
severity: 'low',
|
|
232
|
+
line: i + 1,
|
|
233
|
+
pattern: line.trim().substring(0, 50),
|
|
234
|
+
suggestion: 'Simplify boolean comparisons. Use "if (x)" instead of "if (x === true)".',
|
|
235
|
+
example: {
|
|
236
|
+
bad: 'if (isActive === true) { ... }',
|
|
237
|
+
good: 'if (isActive) { ... }'
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
// Pattern: if (x !== null && x !== undefined)
|
|
242
|
+
if (/if\s*\(\s*\w+\s*!==\s*null\s*&&\s*\w+\s*!==\s*undefined\s*\)/.test(line)) {
|
|
243
|
+
issues.push({
|
|
244
|
+
type: 'verbose_null_check',
|
|
245
|
+
severity: 'low',
|
|
246
|
+
line: i + 1,
|
|
247
|
+
pattern: line.trim().substring(0, 60),
|
|
248
|
+
suggestion: 'Use optional chaining or nullish coalescing. Replace with "if (x ?? false)".',
|
|
249
|
+
example: {
|
|
250
|
+
bad: 'if (user !== null && user !== undefined) { ... }',
|
|
251
|
+
good: 'if (user) { ... }'
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Pattern: if (condition) { return true; } else { return false; }
|
|
256
|
+
if (/if\s*\([^)]+\)\s*\{\s*return\s+(true|false)\s*;\s*\}\s*else\s*\{\s*return\s+(true|false)/i.test(line)) {
|
|
257
|
+
issues.push({
|
|
258
|
+
type: 'unnecessary_conditional_return',
|
|
259
|
+
severity: 'low',
|
|
260
|
+
line: i + 1,
|
|
261
|
+
pattern: 'if (...) { return true; } else { return false; }',
|
|
262
|
+
suggestion: 'Return the condition directly instead of conditional return statements.',
|
|
263
|
+
example: {
|
|
264
|
+
bad: `if (isValid(data)) {
|
|
265
|
+
return true;
|
|
266
|
+
} else {
|
|
267
|
+
return false;
|
|
268
|
+
}`,
|
|
269
|
+
good: 'return isValid(data);'
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Detect functions longer than 50 lines
|
|
277
|
+
*/
|
|
278
|
+
detectLongFunctions(code, _language, issues) {
|
|
279
|
+
const functions = this.extractFunctionBlocks(code, _language);
|
|
280
|
+
for (const func of functions) {
|
|
281
|
+
if (func.length > 50) {
|
|
282
|
+
issues.push({
|
|
283
|
+
type: 'function_too_long',
|
|
284
|
+
severity: func.length > 100 ? 'high' : 'medium',
|
|
285
|
+
line: func.startLine,
|
|
286
|
+
pattern: `Function "${func.name}" is ${func.length} lines long`,
|
|
287
|
+
suggestion: `Break down "${func.name}" into smaller, focused functions. Ideal length is 20-30 lines.`
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Detect chained conditionals that could use switch
|
|
294
|
+
*/
|
|
295
|
+
detectChainedConditionals(code, _language, issues) {
|
|
296
|
+
// Pattern: if (x === 'a') ... else if (x === 'b') ... else if (x === 'c') ...
|
|
297
|
+
const chainRegex = /(if|else\s+if)\s*\(\s*\w+\s*===\s*['"][^'"]+['"]\s*\)/g;
|
|
298
|
+
let lastMatch = null;
|
|
299
|
+
let chainCount = 0;
|
|
300
|
+
let chainStart = 0;
|
|
301
|
+
for (const match of code.matchAll(chainRegex)) {
|
|
302
|
+
if (lastMatch && match.index - lastMatch.index < 100) {
|
|
303
|
+
chainCount++;
|
|
304
|
+
if (chainCount === 2) {
|
|
305
|
+
chainStart = lastMatch.index;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
chainCount = 0;
|
|
310
|
+
}
|
|
311
|
+
if (chainCount >= 3) {
|
|
312
|
+
const lineNumber = code.substring(0, chainStart).split('\n').length;
|
|
313
|
+
issues.push({
|
|
314
|
+
type: 'chain_of_conditionals',
|
|
315
|
+
severity: 'medium',
|
|
316
|
+
line: lineNumber,
|
|
317
|
+
pattern: `Multiple if/else if with equality checks`,
|
|
318
|
+
suggestion: 'Consider using a switch statement or object map for multiple equality comparisons.',
|
|
319
|
+
example: {
|
|
320
|
+
bad: `if (status === 'pending') {
|
|
321
|
+
handlePending();
|
|
322
|
+
} else if (status === 'active') {
|
|
323
|
+
handleActive();
|
|
324
|
+
} else if (status === 'completed') {
|
|
325
|
+
handleCompleted();
|
|
326
|
+
}`,
|
|
327
|
+
good: `const handlers = {
|
|
328
|
+
pending: handlePending,
|
|
329
|
+
active: handleActive,
|
|
330
|
+
completed: handleCompleted
|
|
331
|
+
};
|
|
332
|
+
handlers[status]?.();`
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
chainCount = 0;
|
|
336
|
+
}
|
|
337
|
+
lastMatch = match;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Detect redundant null/undefined checks
|
|
342
|
+
*/
|
|
343
|
+
detectRedundantNullChecks(code, _language, issues) {
|
|
344
|
+
// Pattern: multiple checks for same variable
|
|
345
|
+
const lines = code.split('\n');
|
|
346
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
347
|
+
const line = lines[i];
|
|
348
|
+
const nextLine = lines[i + 1];
|
|
349
|
+
if (!line || !nextLine)
|
|
350
|
+
continue;
|
|
351
|
+
// Pattern: if (x) { ... if (x) { ... } }
|
|
352
|
+
const xMatches = line.match(/if\s*\(\s*(\w+)\s*\)/);
|
|
353
|
+
if (xMatches && xMatches[1]) {
|
|
354
|
+
const varName = xMatches[1];
|
|
355
|
+
if (nextLine.includes(`if`) && nextLine.includes(varName)) {
|
|
356
|
+
issues.push({
|
|
357
|
+
type: 'redundant_null_check',
|
|
358
|
+
severity: 'low',
|
|
359
|
+
line: i + 2,
|
|
360
|
+
pattern: `Redundant check for ${varName}`,
|
|
361
|
+
suggestion: `Variable "${varName}" is already checked. Combine conditions instead.`,
|
|
362
|
+
example: {
|
|
363
|
+
bad: `if (user) {
|
|
364
|
+
if (user.email) {
|
|
365
|
+
// ...
|
|
366
|
+
}
|
|
367
|
+
}`,
|
|
368
|
+
good: `if (user?.email) {
|
|
369
|
+
// ...
|
|
370
|
+
}`
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Detect overly complex logic that should be extracted
|
|
379
|
+
*/
|
|
380
|
+
detectComplexLogic(code, _language, issues) {
|
|
381
|
+
// Pattern: assignments with complex expressions
|
|
382
|
+
const complexRegex = /\w+\s*=\s*[^;]*(\?|&&|\|\|)[^;]*(\?|&&|\|\|)[^;]*(\?|&&|\|\|)[^;]*;/g;
|
|
383
|
+
let match;
|
|
384
|
+
while ((match = complexRegex.exec(code)) !== null) {
|
|
385
|
+
const lineNumber = code.substring(0, match.index).split('\n').length;
|
|
386
|
+
issues.push({
|
|
387
|
+
type: 'complex_assignment',
|
|
388
|
+
severity: 'medium',
|
|
389
|
+
line: lineNumber,
|
|
390
|
+
pattern: match[0].substring(0, 60),
|
|
391
|
+
suggestion: 'Complex expression assignment. Break into multiple statements for clarity.',
|
|
392
|
+
example: {
|
|
393
|
+
bad: 'const result = x > 5 && y < 10 ? a ? b : c : d ? e : f;',
|
|
394
|
+
good: `const isXInRange = x > 5 && y < 10;
|
|
395
|
+
const result = isXInRange ? (a ? b : c) : (d ? e : f);`
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Extract function blocks with metadata
|
|
402
|
+
*/
|
|
403
|
+
extractFunctionBlocks(code, _language) {
|
|
404
|
+
const functions = [];
|
|
405
|
+
const lines = code.split('\n');
|
|
406
|
+
for (let i = 0; i < lines.length; i++) {
|
|
407
|
+
const line = lines[i];
|
|
408
|
+
if (!line)
|
|
409
|
+
continue;
|
|
410
|
+
// JavaScript/TypeScript function
|
|
411
|
+
if (/(?:function\s+(\w+)|const\s+(\w+)\s*=\s*(?:async\s*)?\(|(?:async\s+)?(\w+)\s*\()/.test(line)) {
|
|
412
|
+
const nameMatch = line.match(/(?:function\s+(\w+)|const\s+(\w+)|(?:async\s+)?(\w+)\s*\()/);
|
|
413
|
+
const name = nameMatch?.[1] || nameMatch?.[2] || nameMatch?.[3] || 'anonymous';
|
|
414
|
+
// Count lines until matching closing brace
|
|
415
|
+
let braceCount = 1;
|
|
416
|
+
let length = 1;
|
|
417
|
+
for (let j = i + 1; j < lines.length && braceCount > 0; j++) {
|
|
418
|
+
const jLine = lines[j];
|
|
419
|
+
if (!jLine)
|
|
420
|
+
continue;
|
|
421
|
+
braceCount += (jLine.match(/\{/g) || []).length;
|
|
422
|
+
braceCount -= (jLine.match(/\}/g) || []).length;
|
|
423
|
+
length++;
|
|
424
|
+
}
|
|
425
|
+
functions.push({ name, startLine: i + 1, length });
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return functions;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Normalize line for duplicate detection
|
|
432
|
+
*/
|
|
433
|
+
normalizeLine(line) {
|
|
434
|
+
return line
|
|
435
|
+
.trim()
|
|
436
|
+
.replace(/\s+/g, ' ')
|
|
437
|
+
.replace(/[0-9]+/g, 'N')
|
|
438
|
+
.replace(/['"][^'"]*['"]/g, 'S');
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Generate recommendation based on issues and metrics
|
|
442
|
+
*/
|
|
443
|
+
generateRecommendation(issues, metrics) {
|
|
444
|
+
const criticalCount = issues.filter(i => i.severity === 'high').length;
|
|
445
|
+
if (criticalCount >= 5) {
|
|
446
|
+
return 'Critical: Major refactoring needed. Multiple serious code smells detected.';
|
|
447
|
+
}
|
|
448
|
+
if (metrics.score > 75) {
|
|
449
|
+
return 'High complexity. Recommend extracting functions and reducing nesting depth.';
|
|
450
|
+
}
|
|
451
|
+
if (metrics.score > 50) {
|
|
452
|
+
return 'Moderate complexity. Consider breaking down long functions and simplifying conditionals.';
|
|
453
|
+
}
|
|
454
|
+
if (issues.length > 0) {
|
|
455
|
+
return 'Minor issues found. Address low-severity items to improve code quality.';
|
|
456
|
+
}
|
|
457
|
+
return 'Code quality is good. Continue monitoring for emerging complexity.';
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Prioritize refactoring tasks by impact
|
|
461
|
+
*/
|
|
462
|
+
prioritizeRefactoring(issues, metrics) {
|
|
463
|
+
const priority = [];
|
|
464
|
+
if (metrics.cyclomaticComplexity > 15) {
|
|
465
|
+
priority.push('Reduce cyclomatic complexity - extract conditional logic');
|
|
466
|
+
}
|
|
467
|
+
if (metrics.nestingDepth > 5) {
|
|
468
|
+
priority.push('Reduce nesting depth - use early returns and extract nested blocks');
|
|
469
|
+
}
|
|
470
|
+
if (metrics.maxFunctionLength > 100) {
|
|
471
|
+
priority.push('Break down oversized functions into smaller, focused units');
|
|
472
|
+
}
|
|
473
|
+
const highSeverityIssues = issues.filter(i => i.severity === 'high');
|
|
474
|
+
if (highSeverityIssues.length > 0) {
|
|
475
|
+
priority.push(`Fix ${highSeverityIssues.length} critical issues: ${highSeverityIssues.map(i => i.type).join(', ')}`);
|
|
476
|
+
}
|
|
477
|
+
if (priority.length === 0) {
|
|
478
|
+
priority.push('Code is well-structured - maintain current quality standards');
|
|
479
|
+
}
|
|
480
|
+
return priority;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
//# sourceMappingURL=bloat-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bloat-detector.js","sourceRoot":"","sources":["../../../src/developer/analyzers/bloat-detector.ts"],"names":[],"mappings":"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"}
|