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
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { nanoid } from 'nanoid';
|
|
4
|
+
import { logger } from '../../utils/logger.js';
|
|
5
|
+
const CONTEXT_STORE_PATH = path.join(process.cwd(), 'src', 'db', 'context-store.json');
|
|
6
|
+
const MAX_CONTEXT_WINDOW_TOKENS = 200000; // Approximate token limit
|
|
7
|
+
const AVG_CHARS_PER_TOKEN = 4; // Average characters per token
|
|
8
|
+
export class ContextManager {
|
|
9
|
+
store;
|
|
10
|
+
isInitialized = false;
|
|
11
|
+
constructor() {
|
|
12
|
+
this.store = {
|
|
13
|
+
version: '1.0.0',
|
|
14
|
+
entries: [],
|
|
15
|
+
metadata: {
|
|
16
|
+
created_at: new Date().toISOString(),
|
|
17
|
+
last_updated: new Date().toISOString(),
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Initialize the context store from disk
|
|
23
|
+
*/
|
|
24
|
+
async initialize() {
|
|
25
|
+
try {
|
|
26
|
+
// Create parent directory if it doesn't exist
|
|
27
|
+
const dir = path.dirname(CONTEXT_STORE_PATH);
|
|
28
|
+
if (!fs.existsSync(dir)) {
|
|
29
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
30
|
+
}
|
|
31
|
+
// Load existing store or create new one
|
|
32
|
+
if (fs.existsSync(CONTEXT_STORE_PATH)) {
|
|
33
|
+
const data = fs.readFileSync(CONTEXT_STORE_PATH, 'utf-8');
|
|
34
|
+
this.store = JSON.parse(data);
|
|
35
|
+
logger.info(`Loaded context store with ${this.store.entries.length} entries`);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
this.createDefaultStore();
|
|
39
|
+
this.save();
|
|
40
|
+
logger.info('Created new context store');
|
|
41
|
+
}
|
|
42
|
+
this.isInitialized = true;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logger.error('Failed to initialize context manager:', error);
|
|
46
|
+
throw new Error(`Context manager initialization failed: ${error}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Store a context entry
|
|
51
|
+
*/
|
|
52
|
+
async storeEntry(category, content) {
|
|
53
|
+
this.ensureInitialized();
|
|
54
|
+
try {
|
|
55
|
+
const entry = {
|
|
56
|
+
id: nanoid(),
|
|
57
|
+
category,
|
|
58
|
+
content,
|
|
59
|
+
timestamp: new Date(),
|
|
60
|
+
usage_count: 0,
|
|
61
|
+
last_retrieved: null,
|
|
62
|
+
};
|
|
63
|
+
this.store.entries.push(entry);
|
|
64
|
+
this.store.metadata.last_updated = new Date().toISOString();
|
|
65
|
+
this.save();
|
|
66
|
+
logger.info(`Stored context entry: ${entry.id} in category: ${category}`);
|
|
67
|
+
return {
|
|
68
|
+
success: true,
|
|
69
|
+
action: 'store',
|
|
70
|
+
message: `Successfully stored context in "${category}" category`,
|
|
71
|
+
data: [entry],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
logger.error('Error storing context:', error);
|
|
76
|
+
throw new Error(`Failed to store context: ${error}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Retrieve context entries by category or search term
|
|
81
|
+
*/
|
|
82
|
+
async retrieve(category, searchTerm) {
|
|
83
|
+
this.ensureInitialized();
|
|
84
|
+
try {
|
|
85
|
+
let results = this.store.entries;
|
|
86
|
+
// Filter by category if provided
|
|
87
|
+
if (category) {
|
|
88
|
+
results = results.filter((e) => e.category === category);
|
|
89
|
+
}
|
|
90
|
+
// Filter by search term if provided
|
|
91
|
+
if (searchTerm) {
|
|
92
|
+
const term = searchTerm.toLowerCase();
|
|
93
|
+
results = results.filter((e) => e.content.toLowerCase().includes(term));
|
|
94
|
+
}
|
|
95
|
+
// Update usage count and last retrieved timestamp
|
|
96
|
+
results.forEach((entry) => {
|
|
97
|
+
entry.usage_count += 1;
|
|
98
|
+
entry.last_retrieved = new Date();
|
|
99
|
+
});
|
|
100
|
+
this.store.metadata.last_updated = new Date().toISOString();
|
|
101
|
+
this.save();
|
|
102
|
+
if (results.length === 0) {
|
|
103
|
+
return {
|
|
104
|
+
success: true,
|
|
105
|
+
action: 'retrieve',
|
|
106
|
+
message: `No context found${category ? ` in category "${category}"` : ''}${searchTerm ? ` matching "${searchTerm}"` : ''}`,
|
|
107
|
+
data: null,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
logger.info(`Retrieved ${results.length} context entries`);
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
action: 'retrieve',
|
|
114
|
+
message: `Retrieved ${results.length} context entries`,
|
|
115
|
+
data: results,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
logger.error('Error retrieving context:', error);
|
|
120
|
+
throw new Error(`Failed to retrieve context: ${error}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check context window status and provide warnings if needed
|
|
125
|
+
*/
|
|
126
|
+
async check(includeMetadata = false) {
|
|
127
|
+
this.ensureInitialized();
|
|
128
|
+
try {
|
|
129
|
+
const metadata = this.getMetadata();
|
|
130
|
+
let warning;
|
|
131
|
+
if (metadata.context_window_usage_percent > 80) {
|
|
132
|
+
warning = `Context window is ${metadata.context_window_usage_percent.toFixed(1)}% full. Consider archiving or cleaning up old context entries.`;
|
|
133
|
+
}
|
|
134
|
+
else if (metadata.context_window_usage_percent > 60) {
|
|
135
|
+
warning = `Context window is ${metadata.context_window_usage_percent.toFixed(1)}% full. You may want to monitor usage.`;
|
|
136
|
+
}
|
|
137
|
+
const response = {
|
|
138
|
+
success: true,
|
|
139
|
+
action: 'check',
|
|
140
|
+
message: `Context store contains ${metadata.total_entries} entries`,
|
|
141
|
+
warning,
|
|
142
|
+
};
|
|
143
|
+
if (includeMetadata) {
|
|
144
|
+
response.data = metadata;
|
|
145
|
+
}
|
|
146
|
+
return response;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
logger.error('Error checking context:', error);
|
|
150
|
+
throw new Error(`Failed to check context: ${error}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get metadata about the context store
|
|
155
|
+
*/
|
|
156
|
+
getMetadata() {
|
|
157
|
+
const entriesByCategory = {
|
|
158
|
+
architecture: 0,
|
|
159
|
+
requirements: 0,
|
|
160
|
+
constraints: 0,
|
|
161
|
+
decisions: 0,
|
|
162
|
+
'technical-patterns': 0,
|
|
163
|
+
'project-metadata': 0,
|
|
164
|
+
};
|
|
165
|
+
let totalBytes = 0;
|
|
166
|
+
this.store.entries.forEach((entry) => {
|
|
167
|
+
entriesByCategory[entry.category]++;
|
|
168
|
+
totalBytes += entry.content.length;
|
|
169
|
+
});
|
|
170
|
+
const estimatedTokens = totalBytes / AVG_CHARS_PER_TOKEN;
|
|
171
|
+
const usagePercent = (estimatedTokens / MAX_CONTEXT_WINDOW_TOKENS) * 100;
|
|
172
|
+
return {
|
|
173
|
+
total_entries: this.store.entries.length,
|
|
174
|
+
entries_by_category: entriesByCategory,
|
|
175
|
+
total_stored_bytes: totalBytes,
|
|
176
|
+
last_updated: new Date(this.store.metadata.last_updated),
|
|
177
|
+
context_window_usage_percent: Math.min(usagePercent, 100),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Clear old or unused context entries (cleanup)
|
|
182
|
+
*/
|
|
183
|
+
async cleanup(daysOld = 30) {
|
|
184
|
+
this.ensureInitialized();
|
|
185
|
+
try {
|
|
186
|
+
const cutoffDate = new Date();
|
|
187
|
+
cutoffDate.setDate(cutoffDate.getDate() - daysOld);
|
|
188
|
+
const beforeCount = this.store.entries.length;
|
|
189
|
+
this.store.entries = this.store.entries.filter((entry) => {
|
|
190
|
+
const entryDate = new Date(entry.timestamp);
|
|
191
|
+
return entryDate > cutoffDate;
|
|
192
|
+
});
|
|
193
|
+
const removedCount = beforeCount - this.store.entries.length;
|
|
194
|
+
this.store.metadata.last_updated = new Date().toISOString();
|
|
195
|
+
this.save();
|
|
196
|
+
logger.info(`Cleaned up ${removedCount} context entries older than ${daysOld} days`);
|
|
197
|
+
return {
|
|
198
|
+
success: true,
|
|
199
|
+
action: 'retrieve',
|
|
200
|
+
message: `Removed ${removedCount} entries older than ${daysOld} days`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
logger.error('Error cleaning context:', error);
|
|
205
|
+
throw new Error(`Failed to cleanup context: ${error}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Export all context for backup
|
|
210
|
+
*/
|
|
211
|
+
async export() {
|
|
212
|
+
this.ensureInitialized();
|
|
213
|
+
return JSON.parse(JSON.stringify(this.store));
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Import context from backup
|
|
217
|
+
*/
|
|
218
|
+
async import(store) {
|
|
219
|
+
try {
|
|
220
|
+
this.store = store;
|
|
221
|
+
this.store.metadata.last_updated = new Date().toISOString();
|
|
222
|
+
this.save();
|
|
223
|
+
logger.info('Imported context store');
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
logger.error('Error importing context:', error);
|
|
227
|
+
throw new Error(`Failed to import context: ${error}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Create default context store
|
|
232
|
+
*/
|
|
233
|
+
createDefaultStore() {
|
|
234
|
+
this.store = {
|
|
235
|
+
version: '1.0.0',
|
|
236
|
+
entries: [
|
|
237
|
+
{
|
|
238
|
+
id: nanoid(),
|
|
239
|
+
category: 'project-metadata',
|
|
240
|
+
content: 'CouchLoop MCP Server - Model Context Protocol server for stateful conversation management',
|
|
241
|
+
timestamp: new Date(),
|
|
242
|
+
usage_count: 0,
|
|
243
|
+
last_retrieved: null,
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
id: nanoid(),
|
|
247
|
+
category: 'architecture',
|
|
248
|
+
content: 'CouchLoop uses PostgreSQL via Supabase with Drizzle ORM. MCP protocol via stdio for communication. Session/journey/checkpoint management.',
|
|
249
|
+
timestamp: new Date(),
|
|
250
|
+
usage_count: 0,
|
|
251
|
+
last_retrieved: null,
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
id: nanoid(),
|
|
255
|
+
category: 'requirements',
|
|
256
|
+
content: 'Must support multi-turn conversations, session persistence across interruptions, guided journeys, crisis detection via shrink-chat integration',
|
|
257
|
+
timestamp: new Date(),
|
|
258
|
+
usage_count: 0,
|
|
259
|
+
last_retrieved: null,
|
|
260
|
+
},
|
|
261
|
+
],
|
|
262
|
+
metadata: {
|
|
263
|
+
created_at: new Date().toISOString(),
|
|
264
|
+
last_updated: new Date().toISOString(),
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Save store to disk
|
|
270
|
+
*/
|
|
271
|
+
save() {
|
|
272
|
+
try {
|
|
273
|
+
const dir = path.dirname(CONTEXT_STORE_PATH);
|
|
274
|
+
if (!fs.existsSync(dir)) {
|
|
275
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
276
|
+
}
|
|
277
|
+
fs.writeFileSync(CONTEXT_STORE_PATH, JSON.stringify(this.store, null, 2), 'utf-8');
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
logger.error('Failed to save context store:', error);
|
|
281
|
+
throw new Error(`Failed to persist context: ${error}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Ensure manager is initialized
|
|
286
|
+
*/
|
|
287
|
+
ensureInitialized() {
|
|
288
|
+
if (!this.isInitialized) {
|
|
289
|
+
throw new Error('ContextManager not initialized. Call initialize() before using other methods.');
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Singleton instance
|
|
294
|
+
let instance = null;
|
|
295
|
+
export async function getContextManager() {
|
|
296
|
+
if (!instance) {
|
|
297
|
+
instance = new ContextManager();
|
|
298
|
+
await instance.initialize();
|
|
299
|
+
}
|
|
300
|
+
return instance;
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=context-manager.js.map
|
|
@@ -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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"}
|