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.
Files changed (335) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +348 -0
  3. package/dist/agent/agentTools.d.ts +26 -0
  4. package/dist/agent/agentTools.d.ts.map +1 -0
  5. package/dist/agent/agentTools.js +699 -0
  6. package/dist/agent/agentTools.js.map +1 -0
  7. package/dist/agent/autoValidator.d.ts +110 -0
  8. package/dist/agent/autoValidator.d.ts.map +1 -0
  9. package/dist/agent/autoValidator.js +964 -0
  10. package/dist/agent/autoValidator.js.map +1 -0
  11. package/dist/agent/fileWatcher.d.ts +28 -0
  12. package/dist/agent/fileWatcher.d.ts.map +1 -0
  13. package/dist/agent/fileWatcher.js +88 -0
  14. package/dist/agent/fileWatcher.js.map +1 -0
  15. package/dist/agent/guardianPersistence.d.ts +98 -0
  16. package/dist/agent/guardianPersistence.d.ts.map +1 -0
  17. package/dist/agent/guardianPersistence.js +296 -0
  18. package/dist/agent/guardianPersistence.js.map +1 -0
  19. package/dist/agent/mcpNotifications.d.ts +38 -0
  20. package/dist/agent/mcpNotifications.d.ts.map +1 -0
  21. package/dist/agent/mcpNotifications.js +81 -0
  22. package/dist/agent/mcpNotifications.js.map +1 -0
  23. package/dist/analyzers/aiPatterns.d.ts +16 -0
  24. package/dist/analyzers/aiPatterns.d.ts.map +1 -0
  25. package/dist/analyzers/aiPatterns.js +103 -0
  26. package/dist/analyzers/aiPatterns.js.map +1 -0
  27. package/dist/analyzers/antiPatterns.d.ts +60 -0
  28. package/dist/analyzers/antiPatterns.d.ts.map +1 -0
  29. package/dist/analyzers/antiPatterns.js +198 -0
  30. package/dist/analyzers/antiPatterns.js.map +1 -0
  31. package/dist/analyzers/builtinTypes.d.ts +18 -0
  32. package/dist/analyzers/builtinTypes.d.ts.map +1 -0
  33. package/dist/analyzers/builtinTypes.js +1275 -0
  34. package/dist/analyzers/builtinTypes.js.map +1 -0
  35. package/dist/analyzers/complexity.d.ts +14 -0
  36. package/dist/analyzers/complexity.d.ts.map +1 -0
  37. package/dist/analyzers/complexity.js +610 -0
  38. package/dist/analyzers/complexity.js.map +1 -0
  39. package/dist/analyzers/findingVerifier.d.ts +59 -0
  40. package/dist/analyzers/findingVerifier.d.ts.map +1 -0
  41. package/dist/analyzers/findingVerifier.js +1169 -0
  42. package/dist/analyzers/findingVerifier.js.map +1 -0
  43. package/dist/analyzers/impactAnalyzer.d.ts +53 -0
  44. package/dist/analyzers/impactAnalyzer.d.ts.map +1 -0
  45. package/dist/analyzers/impactAnalyzer.js +152 -0
  46. package/dist/analyzers/impactAnalyzer.js.map +1 -0
  47. package/dist/analyzers/languageDetector.d.ts +48 -0
  48. package/dist/analyzers/languageDetector.d.ts.map +1 -0
  49. package/dist/analyzers/languageDetector.js +404 -0
  50. package/dist/analyzers/languageDetector.js.map +1 -0
  51. package/dist/analyzers/parsers/incrementalParser.d.ts +53 -0
  52. package/dist/analyzers/parsers/incrementalParser.d.ts.map +1 -0
  53. package/dist/analyzers/parsers/incrementalParser.js +193 -0
  54. package/dist/analyzers/parsers/incrementalParser.js.map +1 -0
  55. package/dist/analyzers/parsers/scopeResolver.d.ts +92 -0
  56. package/dist/analyzers/parsers/scopeResolver.d.ts.map +1 -0
  57. package/dist/analyzers/parsers/scopeResolver.js +324 -0
  58. package/dist/analyzers/parsers/scopeResolver.js.map +1 -0
  59. package/dist/analyzers/parsers/semanticIndex.d.ts +127 -0
  60. package/dist/analyzers/parsers/semanticIndex.d.ts.map +1 -0
  61. package/dist/analyzers/parsers/semanticIndex.js +429 -0
  62. package/dist/analyzers/parsers/semanticIndex.js.map +1 -0
  63. package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts +42 -0
  64. package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts.map +1 -0
  65. package/dist/analyzers/parsers/sessionDiffAnalyzer.js +233 -0
  66. package/dist/analyzers/parsers/sessionDiffAnalyzer.js.map +1 -0
  67. package/dist/analyzers/parsers/treeSitterParser.d.ts +76 -0
  68. package/dist/analyzers/parsers/treeSitterParser.d.ts.map +1 -0
  69. package/dist/analyzers/parsers/treeSitterParser.js +709 -0
  70. package/dist/analyzers/parsers/treeSitterParser.js.map +1 -0
  71. package/dist/analyzers/relevanceScorer.d.ts +43 -0
  72. package/dist/analyzers/relevanceScorer.d.ts.map +1 -0
  73. package/dist/analyzers/relevanceScorer.js +200 -0
  74. package/dist/analyzers/relevanceScorer.js.map +1 -0
  75. package/dist/analyzers/standardLibrary.d.ts +22 -0
  76. package/dist/analyzers/standardLibrary.d.ts.map +1 -0
  77. package/dist/analyzers/standardLibrary.js +211 -0
  78. package/dist/analyzers/standardLibrary.js.map +1 -0
  79. package/dist/analyzers/symbolGraph.d.ts +30 -0
  80. package/dist/analyzers/symbolGraph.d.ts.map +1 -0
  81. package/dist/analyzers/symbolGraph.js +380 -0
  82. package/dist/analyzers/symbolGraph.js.map +1 -0
  83. package/dist/analyzers/symbolTable.d.ts +18 -0
  84. package/dist/analyzers/symbolTable.d.ts.map +1 -0
  85. package/dist/analyzers/symbolTable.js +176 -0
  86. package/dist/analyzers/symbolTable.js.map +1 -0
  87. package/dist/analyzers/typeChecker.d.ts +13 -0
  88. package/dist/analyzers/typeChecker.d.ts.map +1 -0
  89. package/dist/analyzers/typeChecker.js +580 -0
  90. package/dist/analyzers/typeChecker.js.map +1 -0
  91. package/dist/analyzers/usagePatterns.d.ts +42 -0
  92. package/dist/analyzers/usagePatterns.d.ts.map +1 -0
  93. package/dist/analyzers/usagePatterns.js +75 -0
  94. package/dist/analyzers/usagePatterns.js.map +1 -0
  95. package/dist/api-contract/context/backend.d.ts +19 -0
  96. package/dist/api-contract/context/backend.d.ts.map +1 -0
  97. package/dist/api-contract/context/backend.js +64 -0
  98. package/dist/api-contract/context/backend.js.map +1 -0
  99. package/dist/api-contract/context/contract.d.ts +34 -0
  100. package/dist/api-contract/context/contract.d.ts.map +1 -0
  101. package/dist/api-contract/context/contract.js +306 -0
  102. package/dist/api-contract/context/contract.js.map +1 -0
  103. package/dist/api-contract/context/frontend.d.ts +19 -0
  104. package/dist/api-contract/context/frontend.d.ts.map +1 -0
  105. package/dist/api-contract/context/frontend.js +64 -0
  106. package/dist/api-contract/context/frontend.js.map +1 -0
  107. package/dist/api-contract/detector.d.ts +28 -0
  108. package/dist/api-contract/detector.d.ts.map +1 -0
  109. package/dist/api-contract/detector.js +393 -0
  110. package/dist/api-contract/detector.js.map +1 -0
  111. package/dist/api-contract/extractors/python.d.ts +32 -0
  112. package/dist/api-contract/extractors/python.d.ts.map +1 -0
  113. package/dist/api-contract/extractors/python.js +521 -0
  114. package/dist/api-contract/extractors/python.js.map +1 -0
  115. package/dist/api-contract/extractors/pythonAstUtils.d.ts +44 -0
  116. package/dist/api-contract/extractors/pythonAstUtils.d.ts.map +1 -0
  117. package/dist/api-contract/extractors/pythonAstUtils.js +489 -0
  118. package/dist/api-contract/extractors/pythonAstUtils.js.map +1 -0
  119. package/dist/api-contract/extractors/tsAstUtils.d.ts +47 -0
  120. package/dist/api-contract/extractors/tsAstUtils.d.ts.map +1 -0
  121. package/dist/api-contract/extractors/tsAstUtils.js +173 -0
  122. package/dist/api-contract/extractors/tsAstUtils.js.map +1 -0
  123. package/dist/api-contract/extractors/typescript.d.ts +32 -0
  124. package/dist/api-contract/extractors/typescript.d.ts.map +1 -0
  125. package/dist/api-contract/extractors/typescript.js +666 -0
  126. package/dist/api-contract/extractors/typescript.js.map +1 -0
  127. package/dist/api-contract/index.d.ts +104 -0
  128. package/dist/api-contract/index.d.ts.map +1 -0
  129. package/dist/api-contract/index.js +232 -0
  130. package/dist/api-contract/index.js.map +1 -0
  131. package/dist/api-contract/types.d.ts +151 -0
  132. package/dist/api-contract/types.d.ts.map +1 -0
  133. package/dist/api-contract/types.js +19 -0
  134. package/dist/api-contract/types.js.map +1 -0
  135. package/dist/api-contract/validators/endpoint.d.ts +21 -0
  136. package/dist/api-contract/validators/endpoint.d.ts.map +1 -0
  137. package/dist/api-contract/validators/endpoint.js +224 -0
  138. package/dist/api-contract/validators/endpoint.js.map +1 -0
  139. package/dist/api-contract/validators/index.d.ts +40 -0
  140. package/dist/api-contract/validators/index.d.ts.map +1 -0
  141. package/dist/api-contract/validators/index.js +875 -0
  142. package/dist/api-contract/validators/index.js.map +1 -0
  143. package/dist/api-contract/validators/parameter.d.ts +17 -0
  144. package/dist/api-contract/validators/parameter.d.ts.map +1 -0
  145. package/dist/api-contract/validators/parameter.js +250 -0
  146. package/dist/api-contract/validators/parameter.js.map +1 -0
  147. package/dist/api-contract/validators/type.d.ts +38 -0
  148. package/dist/api-contract/validators/type.d.ts.map +1 -0
  149. package/dist/api-contract/validators/type.js +244 -0
  150. package/dist/api-contract/validators/type.js.map +1 -0
  151. package/dist/context/apiContract/complexTypeSupport.d.ts +83 -0
  152. package/dist/context/apiContract/complexTypeSupport.d.ts.map +1 -0
  153. package/dist/context/apiContract/complexTypeSupport.js +665 -0
  154. package/dist/context/apiContract/complexTypeSupport.js.map +1 -0
  155. package/dist/context/apiContract/graphqlSupport.d.ts +105 -0
  156. package/dist/context/apiContract/graphqlSupport.d.ts.map +1 -0
  157. package/dist/context/apiContract/graphqlSupport.js +671 -0
  158. package/dist/context/apiContract/graphqlSupport.js.map +1 -0
  159. package/dist/context/apiContract/index.d.ts +14 -0
  160. package/dist/context/apiContract/index.d.ts.map +1 -0
  161. package/dist/context/apiContract/index.js +17 -0
  162. package/dist/context/apiContract/index.js.map +1 -0
  163. package/dist/context/apiContract/webSocketSupport.d.ts +104 -0
  164. package/dist/context/apiContract/webSocketSupport.d.ts.map +1 -0
  165. package/dist/context/apiContract/webSocketSupport.js +465 -0
  166. package/dist/context/apiContract/webSocketSupport.js.map +1 -0
  167. package/dist/context/apiContractContext.d.ts +15 -0
  168. package/dist/context/apiContractContext.d.ts.map +1 -0
  169. package/dist/context/apiContractContext.js +979 -0
  170. package/dist/context/apiContractContext.js.map +1 -0
  171. package/dist/context/apiContractExtraction.d.ts +52 -0
  172. package/dist/context/apiContractExtraction.d.ts.map +1 -0
  173. package/dist/context/apiContractExtraction.js +438 -0
  174. package/dist/context/apiContractExtraction.js.map +1 -0
  175. package/dist/context/contextLineage.d.ts +79 -0
  176. package/dist/context/contextLineage.d.ts.map +1 -0
  177. package/dist/context/contextLineage.js +259 -0
  178. package/dist/context/contextLineage.js.map +1 -0
  179. package/dist/context/contextOrchestrator.d.ts +57 -0
  180. package/dist/context/contextOrchestrator.d.ts.map +1 -0
  181. package/dist/context/contextOrchestrator.js +162 -0
  182. package/dist/context/contextOrchestrator.js.map +1 -0
  183. package/dist/context/intentTracker.d.ts +73 -0
  184. package/dist/context/intentTracker.d.ts.map +1 -0
  185. package/dist/context/intentTracker.js +168 -0
  186. package/dist/context/intentTracker.js.map +1 -0
  187. package/dist/context/projectContext.d.ts +219 -0
  188. package/dist/context/projectContext.d.ts.map +1 -0
  189. package/dist/context/projectContext.js +1984 -0
  190. package/dist/context/projectContext.js.map +1 -0
  191. package/dist/prompts/index.d.ts +17 -0
  192. package/dist/prompts/index.d.ts.map +1 -0
  193. package/dist/prompts/index.js +260 -0
  194. package/dist/prompts/index.js.map +1 -0
  195. package/dist/prompts/library.d.ts +51 -0
  196. package/dist/prompts/library.d.ts.map +1 -0
  197. package/dist/prompts/library.js +65 -0
  198. package/dist/prompts/library.js.map +1 -0
  199. package/dist/prompts/templates.d.ts +44 -0
  200. package/dist/prompts/templates.d.ts.map +1 -0
  201. package/dist/prompts/templates.js +97 -0
  202. package/dist/prompts/templates.js.map +1 -0
  203. package/dist/queue/jobPersistence.d.ts +46 -0
  204. package/dist/queue/jobPersistence.d.ts.map +1 -0
  205. package/dist/queue/jobPersistence.js +158 -0
  206. package/dist/queue/jobPersistence.js.map +1 -0
  207. package/dist/queue/jobQueue.d.ts +116 -0
  208. package/dist/queue/jobQueue.d.ts.map +1 -0
  209. package/dist/queue/jobQueue.js +275 -0
  210. package/dist/queue/jobQueue.js.map +1 -0
  211. package/dist/queue/validationJob.d.ts +69 -0
  212. package/dist/queue/validationJob.d.ts.map +1 -0
  213. package/dist/queue/validationJob.js +435 -0
  214. package/dist/queue/validationJob.js.map +1 -0
  215. package/dist/resources/index.d.ts +15 -0
  216. package/dist/resources/index.d.ts.map +1 -0
  217. package/dist/resources/index.js +328 -0
  218. package/dist/resources/index.js.map +1 -0
  219. package/dist/resources/validationReportStore.d.ts +170 -0
  220. package/dist/resources/validationReportStore.d.ts.map +1 -0
  221. package/dist/resources/validationReportStore.js +515 -0
  222. package/dist/resources/validationReportStore.js.map +1 -0
  223. package/dist/server.d.ts +12 -0
  224. package/dist/server.d.ts.map +1 -0
  225. package/dist/server.js +102 -0
  226. package/dist/server.js.map +1 -0
  227. package/dist/tools/asyncValidation.d.ts +19 -0
  228. package/dist/tools/asyncValidation.d.ts.map +1 -0
  229. package/dist/tools/asyncValidation.js +346 -0
  230. package/dist/tools/asyncValidation.js.map +1 -0
  231. package/dist/tools/buildContext.d.ts +17 -0
  232. package/dist/tools/buildContext.d.ts.map +1 -0
  233. package/dist/tools/buildContext.js +188 -0
  234. package/dist/tools/buildContext.js.map +1 -0
  235. package/dist/tools/getDependencyGraph.d.ts +16 -0
  236. package/dist/tools/getDependencyGraph.d.ts.map +1 -0
  237. package/dist/tools/getDependencyGraph.js +436 -0
  238. package/dist/tools/getDependencyGraph.js.map +1 -0
  239. package/dist/tools/incrementalValidation.d.ts +71 -0
  240. package/dist/tools/incrementalValidation.d.ts.map +1 -0
  241. package/dist/tools/incrementalValidation.js +203 -0
  242. package/dist/tools/incrementalValidation.js.map +1 -0
  243. package/dist/tools/index.d.ts +24 -0
  244. package/dist/tools/index.d.ts.map +1 -0
  245. package/dist/tools/index.js +106 -0
  246. package/dist/tools/index.js.map +1 -0
  247. package/dist/tools/validateCode.d.ts +17 -0
  248. package/dist/tools/validateCode.d.ts.map +1 -0
  249. package/dist/tools/validateCode.js +368 -0
  250. package/dist/tools/validateCode.js.map +1 -0
  251. package/dist/tools/validateCodeLite.d.ts +2 -0
  252. package/dist/tools/validateCodeLite.d.ts.map +1 -0
  253. package/dist/tools/validateCodeLite.js +2 -0
  254. package/dist/tools/validateCodeLite.js.map +1 -0
  255. package/dist/tools/validation/builtins.d.ts +92 -0
  256. package/dist/tools/validation/builtins.d.ts.map +1 -0
  257. package/dist/tools/validation/builtins.js +2184 -0
  258. package/dist/tools/validation/builtins.js.map +1 -0
  259. package/dist/tools/validation/contextualNaming.d.ts +99 -0
  260. package/dist/tools/validation/contextualNaming.d.ts.map +1 -0
  261. package/dist/tools/validation/contextualNaming.js +959 -0
  262. package/dist/tools/validation/contextualNaming.js.map +1 -0
  263. package/dist/tools/validation/deadCode.d.ts +115 -0
  264. package/dist/tools/validation/deadCode.d.ts.map +1 -0
  265. package/dist/tools/validation/deadCode.js +861 -0
  266. package/dist/tools/validation/deadCode.js.map +1 -0
  267. package/dist/tools/validation/extractors/index.d.ts +131 -0
  268. package/dist/tools/validation/extractors/index.d.ts.map +1 -0
  269. package/dist/tools/validation/extractors/index.js +233 -0
  270. package/dist/tools/validation/extractors/index.js.map +1 -0
  271. package/dist/tools/validation/extractors/javascript.d.ts +73 -0
  272. package/dist/tools/validation/extractors/javascript.d.ts.map +1 -0
  273. package/dist/tools/validation/extractors/javascript.js +1841 -0
  274. package/dist/tools/validation/extractors/javascript.js.map +1 -0
  275. package/dist/tools/validation/extractors/python.d.ts +93 -0
  276. package/dist/tools/validation/extractors/python.d.ts.map +1 -0
  277. package/dist/tools/validation/extractors/python.js +799 -0
  278. package/dist/tools/validation/extractors/python.js.map +1 -0
  279. package/dist/tools/validation/manifest.d.ts +45 -0
  280. package/dist/tools/validation/manifest.d.ts.map +1 -0
  281. package/dist/tools/validation/manifest.js +719 -0
  282. package/dist/tools/validation/manifest.js.map +1 -0
  283. package/dist/tools/validation/parser.d.ts +58 -0
  284. package/dist/tools/validation/parser.d.ts.map +1 -0
  285. package/dist/tools/validation/parser.js +232 -0
  286. package/dist/tools/validation/parser.js.map +1 -0
  287. package/dist/tools/validation/registry.d.ts +15 -0
  288. package/dist/tools/validation/registry.d.ts.map +1 -0
  289. package/dist/tools/validation/registry.js +169 -0
  290. package/dist/tools/validation/registry.js.map +1 -0
  291. package/dist/tools/validation/scoring.d.ts +54 -0
  292. package/dist/tools/validation/scoring.d.ts.map +1 -0
  293. package/dist/tools/validation/scoring.js +242 -0
  294. package/dist/tools/validation/scoring.js.map +1 -0
  295. package/dist/tools/validation/types.d.ts +120 -0
  296. package/dist/tools/validation/types.d.ts.map +1 -0
  297. package/dist/tools/validation/types.js +11 -0
  298. package/dist/tools/validation/types.js.map +1 -0
  299. package/dist/tools/validation/unusedLocals.d.ts +36 -0
  300. package/dist/tools/validation/unusedLocals.d.ts.map +1 -0
  301. package/dist/tools/validation/unusedLocals.js +333 -0
  302. package/dist/tools/validation/unusedLocals.js.map +1 -0
  303. package/dist/tools/validation/validation.d.ts +98 -0
  304. package/dist/tools/validation/validation.d.ts.map +1 -0
  305. package/dist/tools/validation/validation.js +1837 -0
  306. package/dist/tools/validation/validation.js.map +1 -0
  307. package/dist/types/codeGraph.d.ts +163 -0
  308. package/dist/types/codeGraph.d.ts.map +1 -0
  309. package/dist/types/codeGraph.js +9 -0
  310. package/dist/types/codeGraph.js.map +1 -0
  311. package/dist/types/symbolGraph.d.ts +68 -0
  312. package/dist/types/symbolGraph.d.ts.map +1 -0
  313. package/dist/types/symbolGraph.js +10 -0
  314. package/dist/types/symbolGraph.js.map +1 -0
  315. package/dist/types/tools.d.ts +43 -0
  316. package/dist/types/tools.d.ts.map +1 -0
  317. package/dist/types/tools.js +7 -0
  318. package/dist/types/tools.js.map +1 -0
  319. package/dist/utils/fileFilter.d.ts +37 -0
  320. package/dist/utils/fileFilter.d.ts.map +1 -0
  321. package/dist/utils/fileFilter.js +91 -0
  322. package/dist/utils/fileFilter.js.map +1 -0
  323. package/dist/utils/gitUtils.d.ts +28 -0
  324. package/dist/utils/gitUtils.d.ts.map +1 -0
  325. package/dist/utils/gitUtils.js +81 -0
  326. package/dist/utils/gitUtils.js.map +1 -0
  327. package/dist/utils/logger.d.ts +15 -0
  328. package/dist/utils/logger.d.ts.map +1 -0
  329. package/dist/utils/logger.js +38 -0
  330. package/dist/utils/logger.js.map +1 -0
  331. package/dist/utils/serialization.d.ts +25 -0
  332. package/dist/utils/serialization.d.ts.map +1 -0
  333. package/dist/utils/serialization.js +53 -0
  334. package/dist/utils/serialization.js.map +1 -0
  335. 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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"}
@@ -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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"}