codeguardian-mcp 1.0.0
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/LICENSE +21 -0
- package/README.md +348 -0
- package/dist/agent/agentTools.d.ts +26 -0
- package/dist/agent/agentTools.d.ts.map +1 -0
- package/dist/agent/agentTools.js +699 -0
- package/dist/agent/agentTools.js.map +1 -0
- package/dist/agent/autoValidator.d.ts +110 -0
- package/dist/agent/autoValidator.d.ts.map +1 -0
- package/dist/agent/autoValidator.js +964 -0
- package/dist/agent/autoValidator.js.map +1 -0
- package/dist/agent/fileWatcher.d.ts +28 -0
- package/dist/agent/fileWatcher.d.ts.map +1 -0
- package/dist/agent/fileWatcher.js +88 -0
- package/dist/agent/fileWatcher.js.map +1 -0
- package/dist/agent/guardianPersistence.d.ts +98 -0
- package/dist/agent/guardianPersistence.d.ts.map +1 -0
- package/dist/agent/guardianPersistence.js +296 -0
- package/dist/agent/guardianPersistence.js.map +1 -0
- package/dist/agent/mcpNotifications.d.ts +38 -0
- package/dist/agent/mcpNotifications.d.ts.map +1 -0
- package/dist/agent/mcpNotifications.js +81 -0
- package/dist/agent/mcpNotifications.js.map +1 -0
- package/dist/analyzers/aiPatterns.d.ts +16 -0
- package/dist/analyzers/aiPatterns.d.ts.map +1 -0
- package/dist/analyzers/aiPatterns.js +103 -0
- package/dist/analyzers/aiPatterns.js.map +1 -0
- package/dist/analyzers/antiPatterns.d.ts +60 -0
- package/dist/analyzers/antiPatterns.d.ts.map +1 -0
- package/dist/analyzers/antiPatterns.js +198 -0
- package/dist/analyzers/antiPatterns.js.map +1 -0
- package/dist/analyzers/builtinTypes.d.ts +18 -0
- package/dist/analyzers/builtinTypes.d.ts.map +1 -0
- package/dist/analyzers/builtinTypes.js +1275 -0
- package/dist/analyzers/builtinTypes.js.map +1 -0
- package/dist/analyzers/complexity.d.ts +14 -0
- package/dist/analyzers/complexity.d.ts.map +1 -0
- package/dist/analyzers/complexity.js +610 -0
- package/dist/analyzers/complexity.js.map +1 -0
- package/dist/analyzers/findingVerifier.d.ts +59 -0
- package/dist/analyzers/findingVerifier.d.ts.map +1 -0
- package/dist/analyzers/findingVerifier.js +1169 -0
- package/dist/analyzers/findingVerifier.js.map +1 -0
- package/dist/analyzers/impactAnalyzer.d.ts +53 -0
- package/dist/analyzers/impactAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/impactAnalyzer.js +152 -0
- package/dist/analyzers/impactAnalyzer.js.map +1 -0
- package/dist/analyzers/languageDetector.d.ts +48 -0
- package/dist/analyzers/languageDetector.d.ts.map +1 -0
- package/dist/analyzers/languageDetector.js +404 -0
- package/dist/analyzers/languageDetector.js.map +1 -0
- package/dist/analyzers/parsers/incrementalParser.d.ts +53 -0
- package/dist/analyzers/parsers/incrementalParser.d.ts.map +1 -0
- package/dist/analyzers/parsers/incrementalParser.js +193 -0
- package/dist/analyzers/parsers/incrementalParser.js.map +1 -0
- package/dist/analyzers/parsers/scopeResolver.d.ts +92 -0
- package/dist/analyzers/parsers/scopeResolver.d.ts.map +1 -0
- package/dist/analyzers/parsers/scopeResolver.js +324 -0
- package/dist/analyzers/parsers/scopeResolver.js.map +1 -0
- package/dist/analyzers/parsers/semanticIndex.d.ts +127 -0
- package/dist/analyzers/parsers/semanticIndex.d.ts.map +1 -0
- package/dist/analyzers/parsers/semanticIndex.js +429 -0
- package/dist/analyzers/parsers/semanticIndex.js.map +1 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts +42 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.js +233 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.js.map +1 -0
- package/dist/analyzers/parsers/treeSitterParser.d.ts +76 -0
- package/dist/analyzers/parsers/treeSitterParser.d.ts.map +1 -0
- package/dist/analyzers/parsers/treeSitterParser.js +709 -0
- package/dist/analyzers/parsers/treeSitterParser.js.map +1 -0
- package/dist/analyzers/relevanceScorer.d.ts +43 -0
- package/dist/analyzers/relevanceScorer.d.ts.map +1 -0
- package/dist/analyzers/relevanceScorer.js +200 -0
- package/dist/analyzers/relevanceScorer.js.map +1 -0
- package/dist/analyzers/standardLibrary.d.ts +22 -0
- package/dist/analyzers/standardLibrary.d.ts.map +1 -0
- package/dist/analyzers/standardLibrary.js +211 -0
- package/dist/analyzers/standardLibrary.js.map +1 -0
- package/dist/analyzers/symbolGraph.d.ts +30 -0
- package/dist/analyzers/symbolGraph.d.ts.map +1 -0
- package/dist/analyzers/symbolGraph.js +380 -0
- package/dist/analyzers/symbolGraph.js.map +1 -0
- package/dist/analyzers/symbolTable.d.ts +18 -0
- package/dist/analyzers/symbolTable.d.ts.map +1 -0
- package/dist/analyzers/symbolTable.js +176 -0
- package/dist/analyzers/symbolTable.js.map +1 -0
- package/dist/analyzers/typeChecker.d.ts +13 -0
- package/dist/analyzers/typeChecker.d.ts.map +1 -0
- package/dist/analyzers/typeChecker.js +580 -0
- package/dist/analyzers/typeChecker.js.map +1 -0
- package/dist/analyzers/usagePatterns.d.ts +42 -0
- package/dist/analyzers/usagePatterns.d.ts.map +1 -0
- package/dist/analyzers/usagePatterns.js +75 -0
- package/dist/analyzers/usagePatterns.js.map +1 -0
- package/dist/api-contract/context/backend.d.ts +19 -0
- package/dist/api-contract/context/backend.d.ts.map +1 -0
- package/dist/api-contract/context/backend.js +64 -0
- package/dist/api-contract/context/backend.js.map +1 -0
- package/dist/api-contract/context/contract.d.ts +34 -0
- package/dist/api-contract/context/contract.d.ts.map +1 -0
- package/dist/api-contract/context/contract.js +306 -0
- package/dist/api-contract/context/contract.js.map +1 -0
- package/dist/api-contract/context/frontend.d.ts +19 -0
- package/dist/api-contract/context/frontend.d.ts.map +1 -0
- package/dist/api-contract/context/frontend.js +64 -0
- package/dist/api-contract/context/frontend.js.map +1 -0
- package/dist/api-contract/detector.d.ts +28 -0
- package/dist/api-contract/detector.d.ts.map +1 -0
- package/dist/api-contract/detector.js +393 -0
- package/dist/api-contract/detector.js.map +1 -0
- package/dist/api-contract/extractors/python.d.ts +32 -0
- package/dist/api-contract/extractors/python.d.ts.map +1 -0
- package/dist/api-contract/extractors/python.js +521 -0
- package/dist/api-contract/extractors/python.js.map +1 -0
- package/dist/api-contract/extractors/pythonAstUtils.d.ts +44 -0
- package/dist/api-contract/extractors/pythonAstUtils.d.ts.map +1 -0
- package/dist/api-contract/extractors/pythonAstUtils.js +489 -0
- package/dist/api-contract/extractors/pythonAstUtils.js.map +1 -0
- package/dist/api-contract/extractors/tsAstUtils.d.ts +47 -0
- package/dist/api-contract/extractors/tsAstUtils.d.ts.map +1 -0
- package/dist/api-contract/extractors/tsAstUtils.js +173 -0
- package/dist/api-contract/extractors/tsAstUtils.js.map +1 -0
- package/dist/api-contract/extractors/typescript.d.ts +32 -0
- package/dist/api-contract/extractors/typescript.d.ts.map +1 -0
- package/dist/api-contract/extractors/typescript.js +666 -0
- package/dist/api-contract/extractors/typescript.js.map +1 -0
- package/dist/api-contract/index.d.ts +104 -0
- package/dist/api-contract/index.d.ts.map +1 -0
- package/dist/api-contract/index.js +232 -0
- package/dist/api-contract/index.js.map +1 -0
- package/dist/api-contract/types.d.ts +151 -0
- package/dist/api-contract/types.d.ts.map +1 -0
- package/dist/api-contract/types.js +19 -0
- package/dist/api-contract/types.js.map +1 -0
- package/dist/api-contract/validators/endpoint.d.ts +21 -0
- package/dist/api-contract/validators/endpoint.d.ts.map +1 -0
- package/dist/api-contract/validators/endpoint.js +224 -0
- package/dist/api-contract/validators/endpoint.js.map +1 -0
- package/dist/api-contract/validators/index.d.ts +40 -0
- package/dist/api-contract/validators/index.d.ts.map +1 -0
- package/dist/api-contract/validators/index.js +875 -0
- package/dist/api-contract/validators/index.js.map +1 -0
- package/dist/api-contract/validators/parameter.d.ts +17 -0
- package/dist/api-contract/validators/parameter.d.ts.map +1 -0
- package/dist/api-contract/validators/parameter.js +250 -0
- package/dist/api-contract/validators/parameter.js.map +1 -0
- package/dist/api-contract/validators/type.d.ts +38 -0
- package/dist/api-contract/validators/type.d.ts.map +1 -0
- package/dist/api-contract/validators/type.js +244 -0
- package/dist/api-contract/validators/type.js.map +1 -0
- package/dist/context/apiContract/complexTypeSupport.d.ts +83 -0
- package/dist/context/apiContract/complexTypeSupport.d.ts.map +1 -0
- package/dist/context/apiContract/complexTypeSupport.js +665 -0
- package/dist/context/apiContract/complexTypeSupport.js.map +1 -0
- package/dist/context/apiContract/graphqlSupport.d.ts +105 -0
- package/dist/context/apiContract/graphqlSupport.d.ts.map +1 -0
- package/dist/context/apiContract/graphqlSupport.js +671 -0
- package/dist/context/apiContract/graphqlSupport.js.map +1 -0
- package/dist/context/apiContract/index.d.ts +14 -0
- package/dist/context/apiContract/index.d.ts.map +1 -0
- package/dist/context/apiContract/index.js +17 -0
- package/dist/context/apiContract/index.js.map +1 -0
- package/dist/context/apiContract/webSocketSupport.d.ts +104 -0
- package/dist/context/apiContract/webSocketSupport.d.ts.map +1 -0
- package/dist/context/apiContract/webSocketSupport.js +465 -0
- package/dist/context/apiContract/webSocketSupport.js.map +1 -0
- package/dist/context/apiContractContext.d.ts +15 -0
- package/dist/context/apiContractContext.d.ts.map +1 -0
- package/dist/context/apiContractContext.js +979 -0
- package/dist/context/apiContractContext.js.map +1 -0
- package/dist/context/apiContractExtraction.d.ts +52 -0
- package/dist/context/apiContractExtraction.d.ts.map +1 -0
- package/dist/context/apiContractExtraction.js +438 -0
- package/dist/context/apiContractExtraction.js.map +1 -0
- package/dist/context/contextLineage.d.ts +79 -0
- package/dist/context/contextLineage.d.ts.map +1 -0
- package/dist/context/contextLineage.js +259 -0
- package/dist/context/contextLineage.js.map +1 -0
- package/dist/context/contextOrchestrator.d.ts +57 -0
- package/dist/context/contextOrchestrator.d.ts.map +1 -0
- package/dist/context/contextOrchestrator.js +162 -0
- package/dist/context/contextOrchestrator.js.map +1 -0
- package/dist/context/intentTracker.d.ts +73 -0
- package/dist/context/intentTracker.d.ts.map +1 -0
- package/dist/context/intentTracker.js +168 -0
- package/dist/context/intentTracker.js.map +1 -0
- package/dist/context/projectContext.d.ts +219 -0
- package/dist/context/projectContext.d.ts.map +1 -0
- package/dist/context/projectContext.js +1984 -0
- package/dist/context/projectContext.js.map +1 -0
- package/dist/prompts/index.d.ts +17 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +260 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/library.d.ts +51 -0
- package/dist/prompts/library.d.ts.map +1 -0
- package/dist/prompts/library.js +65 -0
- package/dist/prompts/library.js.map +1 -0
- package/dist/prompts/templates.d.ts +44 -0
- package/dist/prompts/templates.d.ts.map +1 -0
- package/dist/prompts/templates.js +97 -0
- package/dist/prompts/templates.js.map +1 -0
- package/dist/queue/jobPersistence.d.ts +46 -0
- package/dist/queue/jobPersistence.d.ts.map +1 -0
- package/dist/queue/jobPersistence.js +158 -0
- package/dist/queue/jobPersistence.js.map +1 -0
- package/dist/queue/jobQueue.d.ts +116 -0
- package/dist/queue/jobQueue.d.ts.map +1 -0
- package/dist/queue/jobQueue.js +275 -0
- package/dist/queue/jobQueue.js.map +1 -0
- package/dist/queue/validationJob.d.ts +69 -0
- package/dist/queue/validationJob.d.ts.map +1 -0
- package/dist/queue/validationJob.js +435 -0
- package/dist/queue/validationJob.js.map +1 -0
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +328 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/validationReportStore.d.ts +170 -0
- package/dist/resources/validationReportStore.d.ts.map +1 -0
- package/dist/resources/validationReportStore.js +515 -0
- package/dist/resources/validationReportStore.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +102 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/asyncValidation.d.ts +19 -0
- package/dist/tools/asyncValidation.d.ts.map +1 -0
- package/dist/tools/asyncValidation.js +346 -0
- package/dist/tools/asyncValidation.js.map +1 -0
- package/dist/tools/buildContext.d.ts +17 -0
- package/dist/tools/buildContext.d.ts.map +1 -0
- package/dist/tools/buildContext.js +188 -0
- package/dist/tools/buildContext.js.map +1 -0
- package/dist/tools/getDependencyGraph.d.ts +16 -0
- package/dist/tools/getDependencyGraph.d.ts.map +1 -0
- package/dist/tools/getDependencyGraph.js +436 -0
- package/dist/tools/getDependencyGraph.js.map +1 -0
- package/dist/tools/incrementalValidation.d.ts +71 -0
- package/dist/tools/incrementalValidation.d.ts.map +1 -0
- package/dist/tools/incrementalValidation.js +203 -0
- package/dist/tools/incrementalValidation.js.map +1 -0
- package/dist/tools/index.d.ts +24 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +106 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/validateCode.d.ts +17 -0
- package/dist/tools/validateCode.d.ts.map +1 -0
- package/dist/tools/validateCode.js +368 -0
- package/dist/tools/validateCode.js.map +1 -0
- package/dist/tools/validateCodeLite.d.ts +2 -0
- package/dist/tools/validateCodeLite.d.ts.map +1 -0
- package/dist/tools/validateCodeLite.js +2 -0
- package/dist/tools/validateCodeLite.js.map +1 -0
- package/dist/tools/validation/builtins.d.ts +92 -0
- package/dist/tools/validation/builtins.d.ts.map +1 -0
- package/dist/tools/validation/builtins.js +2184 -0
- package/dist/tools/validation/builtins.js.map +1 -0
- package/dist/tools/validation/contextualNaming.d.ts +99 -0
- package/dist/tools/validation/contextualNaming.d.ts.map +1 -0
- package/dist/tools/validation/contextualNaming.js +959 -0
- package/dist/tools/validation/contextualNaming.js.map +1 -0
- package/dist/tools/validation/deadCode.d.ts +115 -0
- package/dist/tools/validation/deadCode.d.ts.map +1 -0
- package/dist/tools/validation/deadCode.js +861 -0
- package/dist/tools/validation/deadCode.js.map +1 -0
- package/dist/tools/validation/extractors/index.d.ts +131 -0
- package/dist/tools/validation/extractors/index.d.ts.map +1 -0
- package/dist/tools/validation/extractors/index.js +233 -0
- package/dist/tools/validation/extractors/index.js.map +1 -0
- package/dist/tools/validation/extractors/javascript.d.ts +73 -0
- package/dist/tools/validation/extractors/javascript.d.ts.map +1 -0
- package/dist/tools/validation/extractors/javascript.js +1841 -0
- package/dist/tools/validation/extractors/javascript.js.map +1 -0
- package/dist/tools/validation/extractors/python.d.ts +93 -0
- package/dist/tools/validation/extractors/python.d.ts.map +1 -0
- package/dist/tools/validation/extractors/python.js +799 -0
- package/dist/tools/validation/extractors/python.js.map +1 -0
- package/dist/tools/validation/manifest.d.ts +45 -0
- package/dist/tools/validation/manifest.d.ts.map +1 -0
- package/dist/tools/validation/manifest.js +719 -0
- package/dist/tools/validation/manifest.js.map +1 -0
- package/dist/tools/validation/parser.d.ts +58 -0
- package/dist/tools/validation/parser.d.ts.map +1 -0
- package/dist/tools/validation/parser.js +232 -0
- package/dist/tools/validation/parser.js.map +1 -0
- package/dist/tools/validation/registry.d.ts +15 -0
- package/dist/tools/validation/registry.d.ts.map +1 -0
- package/dist/tools/validation/registry.js +169 -0
- package/dist/tools/validation/registry.js.map +1 -0
- package/dist/tools/validation/scoring.d.ts +54 -0
- package/dist/tools/validation/scoring.d.ts.map +1 -0
- package/dist/tools/validation/scoring.js +242 -0
- package/dist/tools/validation/scoring.js.map +1 -0
- package/dist/tools/validation/types.d.ts +120 -0
- package/dist/tools/validation/types.d.ts.map +1 -0
- package/dist/tools/validation/types.js +11 -0
- package/dist/tools/validation/types.js.map +1 -0
- package/dist/tools/validation/unusedLocals.d.ts +36 -0
- package/dist/tools/validation/unusedLocals.d.ts.map +1 -0
- package/dist/tools/validation/unusedLocals.js +333 -0
- package/dist/tools/validation/unusedLocals.js.map +1 -0
- package/dist/tools/validation/validation.d.ts +98 -0
- package/dist/tools/validation/validation.d.ts.map +1 -0
- package/dist/tools/validation/validation.js +1837 -0
- package/dist/tools/validation/validation.js.map +1 -0
- package/dist/types/codeGraph.d.ts +163 -0
- package/dist/types/codeGraph.d.ts.map +1 -0
- package/dist/types/codeGraph.js +9 -0
- package/dist/types/codeGraph.js.map +1 -0
- package/dist/types/symbolGraph.d.ts +68 -0
- package/dist/types/symbolGraph.d.ts.map +1 -0
- package/dist/types/symbolGraph.js +10 -0
- package/dist/types/symbolGraph.js.map +1 -0
- package/dist/types/tools.d.ts +43 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +7 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/fileFilter.d.ts +37 -0
- package/dist/utils/fileFilter.d.ts.map +1 -0
- package/dist/utils/fileFilter.js +91 -0
- package/dist/utils/fileFilter.js.map +1 -0
- package/dist/utils/gitUtils.d.ts +28 -0
- package/dist/utils/gitUtils.d.ts.map +1 -0
- package/dist/utils/gitUtils.js +81 -0
- package/dist/utils/gitUtils.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +38 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/serialization.d.ts +25 -0
- package/dist/utils/serialization.d.ts.map +1 -0
- package/dist/utils/serialization.js +53 -0
- package/dist/utils/serialization.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Report Store
|
|
3
|
+
*
|
|
4
|
+
* In-memory store for validation reports, exposed via MCP Resources.
|
|
5
|
+
* This allows LLMs to receive a compact URI instead of massive JSON blobs.
|
|
6
|
+
*
|
|
7
|
+
* Reports are saved in TWO locations:
|
|
8
|
+
* 1. `.codeguardian/reports/` - internal cache (gitignored)
|
|
9
|
+
* 2. `codeguardian-report.json` - LLM-readable file at project root (NOT gitignored)
|
|
10
|
+
*
|
|
11
|
+
* The LLM-readable file allows AI assistants to access results via standard
|
|
12
|
+
* file-reading tools, even when `.codeguardian/` is in `.gitignore`.
|
|
13
|
+
*
|
|
14
|
+
* @format
|
|
15
|
+
*/
|
|
16
|
+
import { logger } from '../utils/logger.js';
|
|
17
|
+
import * as fs from 'fs/promises';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
const REPORTS_DIR = ".codeguardian/reports";
|
|
20
|
+
/**
|
|
21
|
+
* The LLM-readable report filename.
|
|
22
|
+
* This is placed at the project root, outside `.codeguardian/`, so that
|
|
23
|
+
* LLM file-reading tools (which often respect .gitignore) can access it.
|
|
24
|
+
*/
|
|
25
|
+
const LLM_REPORT_FILENAME = "codeguardian-report.json";
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Report Store
|
|
28
|
+
// ============================================================================
|
|
29
|
+
class ValidationReportStore {
|
|
30
|
+
reports = new Map();
|
|
31
|
+
TTL = 24 * 60 * 60 * 1000; // 24 hours
|
|
32
|
+
cleanupInterval;
|
|
33
|
+
CHUNK_SIZE = 25; // Issues per chunk
|
|
34
|
+
reportsDir;
|
|
35
|
+
// Map from jobId → projectPath for tracking which project owns which report
|
|
36
|
+
jobProjectMap = new Map();
|
|
37
|
+
constructor(baseDir = REPORTS_DIR) {
|
|
38
|
+
this.reportsDir = baseDir;
|
|
39
|
+
// Initialize persistence (non-blocking, with error handling)
|
|
40
|
+
this.initializePersistence().then(() => {
|
|
41
|
+
// Start cleanup interval after initialization
|
|
42
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 60 * 1000);
|
|
43
|
+
// Don't keep the process alive just for periodic cleanup
|
|
44
|
+
this.cleanupInterval.unref?.();
|
|
45
|
+
}).catch((err) => {
|
|
46
|
+
logger.error("Failed to initialize report store persistence:", err);
|
|
47
|
+
// Still start cleanup even if persistence failed
|
|
48
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), 60 * 1000);
|
|
49
|
+
// Don't keep the process alive just for periodic cleanup
|
|
50
|
+
this.cleanupInterval.unref?.();
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Initialize persistence (create directories and load existing)
|
|
55
|
+
*/
|
|
56
|
+
async initializePersistence() {
|
|
57
|
+
try {
|
|
58
|
+
await fs.mkdir(this.reportsDir, { recursive: true });
|
|
59
|
+
logger.info(`Report persistence initialized: ${this.reportsDir}`);
|
|
60
|
+
await this.loadAllReports();
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
logger.error("Failed to initialize report persistence:", error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Save report to disk in the project-specific directory.
|
|
68
|
+
*
|
|
69
|
+
* Saves to TWO locations:
|
|
70
|
+
* 1. `.codeguardian/reports/{jobId}.json` - internal cache (gitignored)
|
|
71
|
+
* 2. `codeguardian-report.json` - LLM-readable file at project root
|
|
72
|
+
*
|
|
73
|
+
* The LLM-readable file is placed OUTSIDE `.codeguardian/` so that
|
|
74
|
+
* AI assistants using file-reading tools (which often respect .gitignore)
|
|
75
|
+
* can still access the validation results.
|
|
76
|
+
*/
|
|
77
|
+
async saveReportToDisk(projectPath, report) {
|
|
78
|
+
try {
|
|
79
|
+
// 1. Save to internal cache (.codeguardian/reports/)
|
|
80
|
+
const reportsDir = path.resolve(projectPath, ".codeguardian/reports");
|
|
81
|
+
await fs.mkdir(reportsDir, { recursive: true });
|
|
82
|
+
const filePath = path.join(reportsDir, `${report.jobId}.json`);
|
|
83
|
+
await fs.writeFile(filePath, JSON.stringify(report, null, 2), "utf-8");
|
|
84
|
+
logger.info(`Report saved to project disk: ${filePath}`);
|
|
85
|
+
// 2. Save LLM-readable report to project root (outside .codeguardian/)
|
|
86
|
+
await this.saveLLMReadableReport(projectPath, report);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
logger.error(`Failed to save report ${report.jobId} to project ${projectPath}:`, error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Save an LLM-readable report file at the project root.
|
|
94
|
+
*
|
|
95
|
+
* This file is NOT inside `.codeguardian/` so it can be read by
|
|
96
|
+
* LLM file-reading tools that respect `.gitignore`.
|
|
97
|
+
*
|
|
98
|
+
* The file is intentionally compact: it includes the summary, score,
|
|
99
|
+
* recommendation, and the full issues list. For very large reports,
|
|
100
|
+
* the LLM can use pagination via the MCP Resources API.
|
|
101
|
+
*/
|
|
102
|
+
async saveLLMReadableReport(projectPath, report) {
|
|
103
|
+
try {
|
|
104
|
+
const resolvedPath = path.resolve(projectPath);
|
|
105
|
+
const llmReportPath = path.join(resolvedPath, LLM_REPORT_FILENAME);
|
|
106
|
+
// Build a compact but complete report
|
|
107
|
+
const llmReport = {
|
|
108
|
+
_meta: {
|
|
109
|
+
generatedBy: "CodeGuardian MCP",
|
|
110
|
+
generatedAt: new Date(report.createdAt).toISOString(),
|
|
111
|
+
purpose: "LLM-readable validation report. This file is placed outside .codeguardian/ so AI assistants can read it.",
|
|
112
|
+
jobId: report.jobId,
|
|
113
|
+
expiresAt: new Date(report.expiresAt).toISOString(),
|
|
114
|
+
},
|
|
115
|
+
summary: report.summary,
|
|
116
|
+
stats: report.stats,
|
|
117
|
+
score: report.score,
|
|
118
|
+
recommendation: report.recommendation,
|
|
119
|
+
hallucinations: report.hallucinations,
|
|
120
|
+
deadCode: report.deadCode,
|
|
121
|
+
};
|
|
122
|
+
await fs.writeFile(llmReportPath, JSON.stringify(llmReport, null, 2), "utf-8");
|
|
123
|
+
logger.info(`LLM-readable report saved: ${llmReportPath}`);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
logger.error(`Failed to save LLM-readable report for ${report.jobId}:`, error);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get the path to the LLM-readable report file for a project
|
|
131
|
+
*/
|
|
132
|
+
getLLMReportPath(projectPath) {
|
|
133
|
+
return path.join(path.resolve(projectPath), LLM_REPORT_FILENAME);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get the project path associated with a job
|
|
137
|
+
*/
|
|
138
|
+
getJobProjectPath(jobId) {
|
|
139
|
+
return this.jobProjectMap.get(jobId);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Delete report from disk
|
|
143
|
+
*/
|
|
144
|
+
async deleteReportFromDisk(jobId) {
|
|
145
|
+
const projectPath = this.jobProjectMap.get(jobId);
|
|
146
|
+
if (!projectPath)
|
|
147
|
+
return;
|
|
148
|
+
try {
|
|
149
|
+
// Delete from internal cache
|
|
150
|
+
const filePath = path.join(path.resolve(projectPath), ".codeguardian/reports", `${jobId}.json`);
|
|
151
|
+
await fs.unlink(filePath).catch(() => { });
|
|
152
|
+
// Note: We don't delete the LLM-readable report here because it may have been
|
|
153
|
+
// overwritten by a newer validation run. It will be overwritten on next validation.
|
|
154
|
+
logger.debug(`Report deleted from disk: ${jobId}`);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
// Ignore deletion errors
|
|
158
|
+
}
|
|
159
|
+
this.jobProjectMap.delete(jobId);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Load all reports from disk by scanning known project paths
|
|
163
|
+
* from guardian persistence configs.
|
|
164
|
+
*/
|
|
165
|
+
async loadAllReports() {
|
|
166
|
+
try {
|
|
167
|
+
// Try to load guardian configs to discover project paths
|
|
168
|
+
const { guardianPersistence } = await import('../agent/guardianPersistence.js');
|
|
169
|
+
const configs = await guardianPersistence.loadAllGuardians();
|
|
170
|
+
const projectPaths = new Set();
|
|
171
|
+
for (const config of configs) {
|
|
172
|
+
projectPaths.add(config.projectPath);
|
|
173
|
+
}
|
|
174
|
+
// Scan each project's .codeguardian/reports/ directory
|
|
175
|
+
for (const projectPath of projectPaths) {
|
|
176
|
+
try {
|
|
177
|
+
const reportsDir = path.resolve(projectPath, ".codeguardian/reports");
|
|
178
|
+
const files = await fs.readdir(reportsDir);
|
|
179
|
+
for (const file of files) {
|
|
180
|
+
if (!file.endsWith('.json'))
|
|
181
|
+
continue;
|
|
182
|
+
try {
|
|
183
|
+
const content = await fs.readFile(path.join(reportsDir, file), 'utf-8');
|
|
184
|
+
const report = JSON.parse(content);
|
|
185
|
+
// Skip expired reports
|
|
186
|
+
if (report.expiresAt < Date.now()) {
|
|
187
|
+
logger.debug(`Skipping expired report: ${report.jobId}`);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
this.reports.set(report.jobId, report);
|
|
191
|
+
this.jobProjectMap.set(report.jobId, projectPath);
|
|
192
|
+
logger.debug(`Loaded persisted report: ${report.jobId}`);
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
logger.warn(`Failed to load report file ${file}:`, err);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
if (err.code !== 'ENOENT') {
|
|
201
|
+
logger.warn(`Failed to scan reports in ${projectPath}:`, err);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (this.reports.size > 0) {
|
|
206
|
+
logger.info(`Loaded ${this.reports.size} persisted validation report(s) from disk`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
logger.warn("Failed to load persisted reports:", error);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Store a validation report
|
|
215
|
+
*
|
|
216
|
+
* IMPORTANT: This method is async and waits for the report to be written to disk.
|
|
217
|
+
* This ensures the file exists immediately when the method resolves.
|
|
218
|
+
*/
|
|
219
|
+
async store(jobId, projectPath, report) {
|
|
220
|
+
const now = Date.now();
|
|
221
|
+
const storedReport = {
|
|
222
|
+
jobId,
|
|
223
|
+
createdAt: now,
|
|
224
|
+
expiresAt: now + this.TTL,
|
|
225
|
+
...report,
|
|
226
|
+
};
|
|
227
|
+
this.reports.set(jobId, storedReport);
|
|
228
|
+
// Track project path for this job
|
|
229
|
+
if (projectPath) {
|
|
230
|
+
this.jobProjectMap.set(jobId, path.resolve(projectPath));
|
|
231
|
+
}
|
|
232
|
+
// Save to the specific project path and wait for it to complete
|
|
233
|
+
// This ensures the file exists immediately when the method returns
|
|
234
|
+
// Saves to BOTH .codeguardian/reports/ AND codeguardian-report.json (LLM-readable)
|
|
235
|
+
if (projectPath) {
|
|
236
|
+
try {
|
|
237
|
+
await this.saveReportToDisk(projectPath, storedReport);
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
logger.error(`Failed to save report to ${projectPath}:`, err);
|
|
241
|
+
// Don't throw - we still have the report in memory
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
logger.info(`Stored validation report for job ${jobId}`);
|
|
245
|
+
return this.getReportUri(jobId);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Get the resource URI for a report
|
|
249
|
+
*/
|
|
250
|
+
getReportUri(jobId) {
|
|
251
|
+
return `codeguardian://validation-report/${jobId}`;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Get a stored report
|
|
255
|
+
*/
|
|
256
|
+
get(jobId) {
|
|
257
|
+
return this.reports.get(jobId);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Check if a report exists
|
|
261
|
+
*/
|
|
262
|
+
has(jobId) {
|
|
263
|
+
return this.reports.has(jobId);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get report summary (lightweight)
|
|
267
|
+
*/
|
|
268
|
+
getSummary(jobId) {
|
|
269
|
+
const report = this.reports.get(jobId);
|
|
270
|
+
if (!report)
|
|
271
|
+
return undefined;
|
|
272
|
+
return {
|
|
273
|
+
jobId,
|
|
274
|
+
uri: this.getReportUri(jobId),
|
|
275
|
+
summary: report.summary,
|
|
276
|
+
stats: report.stats,
|
|
277
|
+
score: report.score,
|
|
278
|
+
recommendation: report.recommendation,
|
|
279
|
+
totalHallucinations: report.hallucinations.length,
|
|
280
|
+
totalDeadCode: report.deadCode.length,
|
|
281
|
+
availableChunks: {
|
|
282
|
+
hallucinations: Math.ceil(report.hallucinations.length / this.CHUNK_SIZE),
|
|
283
|
+
deadCode: Math.ceil(report.deadCode.length / this.CHUNK_SIZE),
|
|
284
|
+
},
|
|
285
|
+
createdAt: new Date(report.createdAt).toISOString(),
|
|
286
|
+
expiresAt: new Date(report.expiresAt).toISOString(),
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Get a chunk of hallucinations
|
|
291
|
+
*/
|
|
292
|
+
getHallucinationsChunk(jobId, chunkIndex) {
|
|
293
|
+
const report = this.reports.get(jobId);
|
|
294
|
+
if (!report)
|
|
295
|
+
return undefined;
|
|
296
|
+
const totalChunks = Math.ceil(report.hallucinations.length / this.CHUNK_SIZE);
|
|
297
|
+
const start = chunkIndex * this.CHUNK_SIZE;
|
|
298
|
+
const end = start + this.CHUNK_SIZE;
|
|
299
|
+
const data = report.hallucinations.slice(start, end);
|
|
300
|
+
return {
|
|
301
|
+
chunkIndex,
|
|
302
|
+
totalChunks,
|
|
303
|
+
type: 'hallucinations',
|
|
304
|
+
data,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get a chunk of dead code
|
|
309
|
+
*/
|
|
310
|
+
getDeadCodeChunk(jobId, chunkIndex) {
|
|
311
|
+
const report = this.reports.get(jobId);
|
|
312
|
+
if (!report)
|
|
313
|
+
return undefined;
|
|
314
|
+
const totalChunks = Math.ceil(report.deadCode.length / this.CHUNK_SIZE);
|
|
315
|
+
const start = chunkIndex * this.CHUNK_SIZE;
|
|
316
|
+
const end = start + this.CHUNK_SIZE;
|
|
317
|
+
const data = report.deadCode.slice(start, end);
|
|
318
|
+
return {
|
|
319
|
+
chunkIndex,
|
|
320
|
+
totalChunks,
|
|
321
|
+
type: 'dead_code',
|
|
322
|
+
data,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Get filtered issues (with severity, file, etc.)
|
|
327
|
+
*/
|
|
328
|
+
getFilteredIssues(jobId, options = {}) {
|
|
329
|
+
const report = this.reports.get(jobId);
|
|
330
|
+
if (!report)
|
|
331
|
+
return undefined;
|
|
332
|
+
const { type, severity, file, limit = 25, offset = 0 } = options;
|
|
333
|
+
let issues = [];
|
|
334
|
+
if (!type || type === 'hallucinations') {
|
|
335
|
+
issues = issues.concat(report.hallucinations.map(h => ({ ...h, _type: 'hallucination' })));
|
|
336
|
+
}
|
|
337
|
+
if (!type || type === 'dead_code') {
|
|
338
|
+
issues = issues.concat(report.deadCode.map(d => ({ ...d, _type: 'dead_code' })));
|
|
339
|
+
}
|
|
340
|
+
// Apply filters
|
|
341
|
+
if (severity) {
|
|
342
|
+
issues = issues.filter(i => i.severity === severity);
|
|
343
|
+
}
|
|
344
|
+
if (file) {
|
|
345
|
+
const fileLower = file.toLowerCase();
|
|
346
|
+
issues = issues.filter(i => i.file?.toLowerCase().includes(fileLower));
|
|
347
|
+
}
|
|
348
|
+
const total = issues.length;
|
|
349
|
+
const paged = issues.slice(offset, offset + limit);
|
|
350
|
+
return {
|
|
351
|
+
issues: paged,
|
|
352
|
+
total,
|
|
353
|
+
hasMore: offset + limit < total,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Get issues categorized by severity
|
|
358
|
+
* Returns: { critical: [...], high: [...], medium: [...], low: [...], warning: [...] }
|
|
359
|
+
*/
|
|
360
|
+
getBySeverity(jobId) {
|
|
361
|
+
const report = this.reports.get(jobId);
|
|
362
|
+
if (!report)
|
|
363
|
+
return undefined;
|
|
364
|
+
const allIssues = [
|
|
365
|
+
...report.hallucinations.map(h => ({ ...h, _category: 'hallucination' })),
|
|
366
|
+
...report.deadCode.map(d => ({ ...d, _category: 'dead_code' })),
|
|
367
|
+
];
|
|
368
|
+
const categories = {
|
|
369
|
+
critical: [],
|
|
370
|
+
high: [],
|
|
371
|
+
medium: [],
|
|
372
|
+
low: [],
|
|
373
|
+
warning: [],
|
|
374
|
+
};
|
|
375
|
+
for (const issue of allIssues) {
|
|
376
|
+
const severity = issue.severity || 'low';
|
|
377
|
+
if (categories[severity]) {
|
|
378
|
+
categories[severity].push(issue);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
categories.low.push(issue);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return categories;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Get issues categorized by type
|
|
388
|
+
* Returns: { dependencyHallucination: [...], nonExistentFunction: [...], deadCode: [...], etc. }
|
|
389
|
+
*/
|
|
390
|
+
getByType(jobId) {
|
|
391
|
+
const report = this.reports.get(jobId);
|
|
392
|
+
if (!report)
|
|
393
|
+
return undefined;
|
|
394
|
+
const categories = {};
|
|
395
|
+
for (const issue of report.hallucinations) {
|
|
396
|
+
const type = issue.type || 'unknown';
|
|
397
|
+
if (!categories[type])
|
|
398
|
+
categories[type] = [];
|
|
399
|
+
categories[type].push(issue);
|
|
400
|
+
}
|
|
401
|
+
// Dead code is its own category
|
|
402
|
+
if (report.deadCode.length > 0) {
|
|
403
|
+
categories['deadCode'] = report.deadCode;
|
|
404
|
+
}
|
|
405
|
+
return categories;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Get issues categorized by file
|
|
409
|
+
* Returns: { "src/foo.ts": [...], "src/bar.ts": [...], etc. }
|
|
410
|
+
*/
|
|
411
|
+
getByFile(jobId) {
|
|
412
|
+
const report = this.reports.get(jobId);
|
|
413
|
+
if (!report)
|
|
414
|
+
return undefined;
|
|
415
|
+
const categories = {};
|
|
416
|
+
const allIssues = [
|
|
417
|
+
...report.hallucinations,
|
|
418
|
+
...report.deadCode,
|
|
419
|
+
];
|
|
420
|
+
for (const issue of allIssues) {
|
|
421
|
+
const file = issue.file || 'unknown';
|
|
422
|
+
if (!categories[file])
|
|
423
|
+
categories[file] = [];
|
|
424
|
+
categories[file].push(issue);
|
|
425
|
+
}
|
|
426
|
+
return categories;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Get a categorized summary (counts only, no full issue data)
|
|
430
|
+
* Lightweight for LLM decision-making on what to fetch next.
|
|
431
|
+
*/
|
|
432
|
+
getCategorizedSummary(jobId) {
|
|
433
|
+
const report = this.reports.get(jobId);
|
|
434
|
+
if (!report)
|
|
435
|
+
return undefined;
|
|
436
|
+
const bySeverity = this.getBySeverity(jobId);
|
|
437
|
+
const byType = this.getByType(jobId);
|
|
438
|
+
const byFile = this.getByFile(jobId);
|
|
439
|
+
return {
|
|
440
|
+
jobId,
|
|
441
|
+
uri: this.getReportUri(jobId),
|
|
442
|
+
score: report.score,
|
|
443
|
+
recommendation: report.recommendation,
|
|
444
|
+
totalIssues: report.hallucinations.length + report.deadCode.length,
|
|
445
|
+
bySeverity: {
|
|
446
|
+
critical: bySeverity.critical.length,
|
|
447
|
+
high: bySeverity.high.length,
|
|
448
|
+
medium: bySeverity.medium.length,
|
|
449
|
+
low: bySeverity.low.length,
|
|
450
|
+
warning: bySeverity.warning.length,
|
|
451
|
+
},
|
|
452
|
+
byType: Object.fromEntries(Object.entries(byType).map(([type, issues]) => [type, issues.length])),
|
|
453
|
+
byFile: Object.fromEntries(Object.entries(byFile)
|
|
454
|
+
.sort((a, b) => b[1].length - a[1].length) // Most issues first
|
|
455
|
+
.slice(0, 10) // Top 10 files
|
|
456
|
+
.map(([file, issues]) => [file, issues.length])),
|
|
457
|
+
topAffectedFiles: Object.entries(byFile)
|
|
458
|
+
.sort((a, b) => b[1].length - a[1].length)
|
|
459
|
+
.slice(0, 5)
|
|
460
|
+
.map(([file, issues]) => ({ file, count: issues.length })),
|
|
461
|
+
availableCategories: {
|
|
462
|
+
severities: ['critical', 'high', 'medium', 'low', 'warning'],
|
|
463
|
+
types: Object.keys(byType),
|
|
464
|
+
files: Object.keys(byFile).slice(0, 20), // First 20 files
|
|
465
|
+
},
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* List all available reports
|
|
470
|
+
*/
|
|
471
|
+
list() {
|
|
472
|
+
return Array.from(this.reports.values())
|
|
473
|
+
.sort((a, b) => b.createdAt - a.createdAt)
|
|
474
|
+
.map(r => ({
|
|
475
|
+
jobId: r.jobId,
|
|
476
|
+
uri: this.getReportUri(r.jobId),
|
|
477
|
+
createdAt: new Date(r.createdAt).toISOString(),
|
|
478
|
+
totalIssues: r.hallucinations.length + r.deadCode.length,
|
|
479
|
+
}));
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Cleanup expired reports
|
|
483
|
+
*/
|
|
484
|
+
async cleanup() {
|
|
485
|
+
try {
|
|
486
|
+
const now = Date.now();
|
|
487
|
+
let cleaned = 0;
|
|
488
|
+
for (const [jobId, report] of this.reports.entries()) {
|
|
489
|
+
if (report.expiresAt < now) {
|
|
490
|
+
this.reports.delete(jobId);
|
|
491
|
+
await this.deleteReportFromDisk(jobId);
|
|
492
|
+
cleaned++;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (cleaned > 0) {
|
|
496
|
+
logger.info(`Cleaned up ${cleaned} expired validation reports`);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
catch (error) {
|
|
500
|
+
logger.error("Error during report cleanup:", error);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Shutdown
|
|
505
|
+
*/
|
|
506
|
+
shutdown() {
|
|
507
|
+
if (this.cleanupInterval) {
|
|
508
|
+
clearInterval(this.cleanupInterval);
|
|
509
|
+
this.cleanupInterval = undefined;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
// Singleton export
|
|
514
|
+
export const validationReportStore = new ValidationReportStore();
|
|
515
|
+
//# sourceMappingURL=validationReportStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validationReportStore.js","sourceRoot":"","sources":["../../src/resources/validationReportStore.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CodeGuardian MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Main entry point for the CodeGuardian Model Context Protocol server.
|
|
6
|
+
* Provides automated quality assurance tools for AI-generated code with
|
|
7
|
+
* hallucination prevention, security scanning, and production readiness checks.
|
|
8
|
+
*
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CodeGuardian MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Main entry point for the CodeGuardian Model Context Protocol server.
|
|
6
|
+
* Provides automated quality assurance tools for AI-generated code with
|
|
7
|
+
* hallucination prevention, security scanning, and production readiness checks.
|
|
8
|
+
*
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
12
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
13
|
+
import { logger } from "./utils/logger.js";
|
|
14
|
+
import { registerTools } from "./tools/index.js";
|
|
15
|
+
import { registerResources } from "./resources/index.js";
|
|
16
|
+
import { registerPrompts } from "./prompts/index.js";
|
|
17
|
+
import { registerValidationJob } from "./queue/validationJob.js";
|
|
18
|
+
import { setMCPServer } from "./agent/mcpNotifications.js";
|
|
19
|
+
import { restoreGuardians } from "./agent/agentTools.js";
|
|
20
|
+
// Server configuration
|
|
21
|
+
const SERVER_NAME = "codeguardian-mcp";
|
|
22
|
+
const SERVER_VERSION = "1.0.0";
|
|
23
|
+
/**
|
|
24
|
+
* Initialize and start the MCP server
|
|
25
|
+
*/
|
|
26
|
+
async function main() {
|
|
27
|
+
logger.info("Starting CodeGuardian MCP Server...");
|
|
28
|
+
// Initialize job queue and register handlers
|
|
29
|
+
registerValidationJob();
|
|
30
|
+
logger.info("Job queue initialized");
|
|
31
|
+
// Create MCP server instance
|
|
32
|
+
const server = new Server({
|
|
33
|
+
name: SERVER_NAME,
|
|
34
|
+
version: SERVER_VERSION,
|
|
35
|
+
}, {
|
|
36
|
+
capabilities: {
|
|
37
|
+
tools: {},
|
|
38
|
+
resources: {},
|
|
39
|
+
prompts: {},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
// Register all tools
|
|
43
|
+
registerTools(server);
|
|
44
|
+
logger.info("Tools registered successfully");
|
|
45
|
+
// Register MCP server for notification system
|
|
46
|
+
setMCPServer(server);
|
|
47
|
+
// Register all resources
|
|
48
|
+
registerResources(server);
|
|
49
|
+
logger.info("Resources registered successfully");
|
|
50
|
+
// Register all prompts
|
|
51
|
+
registerPrompts(server);
|
|
52
|
+
logger.info("Prompts registered successfully");
|
|
53
|
+
// Set up error handling
|
|
54
|
+
server.onerror = (error) => {
|
|
55
|
+
logger.error("Server error:", error);
|
|
56
|
+
};
|
|
57
|
+
const cleanup = async () => {
|
|
58
|
+
logger.info("Shutting down CodeGuardian MCP Server...");
|
|
59
|
+
// Gracefully stop guardian watchers but KEEP persisted configs on disk.
|
|
60
|
+
// This allows guardians to auto-restore when the server restarts
|
|
61
|
+
// (e.g., when the user starts a new LLM session).
|
|
62
|
+
try {
|
|
63
|
+
const { shutdownGuardiansGracefully } = await import("./agent/agentTools.js");
|
|
64
|
+
await shutdownGuardiansGracefully();
|
|
65
|
+
logger.info("All guardians stopped gracefully (configs preserved for next session).");
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
logger.error("Error stopping guardians during shutdown:", err);
|
|
69
|
+
}
|
|
70
|
+
// Shutdown report store
|
|
71
|
+
try {
|
|
72
|
+
const { validationReportStore } = await import("./resources/validationReportStore.js");
|
|
73
|
+
validationReportStore.shutdown();
|
|
74
|
+
logger.info("Validation report store cleaned up.");
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
logger.error("Error cleaning up report store:", err);
|
|
78
|
+
}
|
|
79
|
+
await server.close();
|
|
80
|
+
process.exit(0);
|
|
81
|
+
};
|
|
82
|
+
process.on("SIGINT", cleanup);
|
|
83
|
+
process.on("SIGTERM", cleanup);
|
|
84
|
+
// Connect using stdio transport
|
|
85
|
+
const transport = new StdioServerTransport();
|
|
86
|
+
await server.connect(transport);
|
|
87
|
+
logger.info(`${SERVER_NAME} v${SERVER_VERSION} is running`);
|
|
88
|
+
// Auto-restore guardians from previous session (non-blocking)
|
|
89
|
+
restoreGuardians().then((count) => {
|
|
90
|
+
if (count > 0) {
|
|
91
|
+
logger.info(`Restored ${count} guardian(s) from previous session`);
|
|
92
|
+
}
|
|
93
|
+
}).catch((err) => {
|
|
94
|
+
logger.error("Failed to restore guardians:", err);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// Start the server
|
|
98
|
+
main().catch((error) => {
|
|
99
|
+
logger.error("Fatal error:", error);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|