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,328 @@
1
+ /**
2
+ * Resource registration for CodeGuardian MCP
3
+ *
4
+ * Resources provide access to dynamic data and dashboards.
5
+ * Uses MCP Resources to expose large validation reports without
6
+ * overwhelming LLM context windows.
7
+ *
8
+ * @format
9
+ */
10
+ import { ListResourcesRequestSchema, ReadResourceRequestSchema, ListResourceTemplatesRequestSchema } from '@modelcontextprotocol/sdk/types.js';
11
+ import { logger } from '../utils/logger.js';
12
+ import { validationReportStore } from './validationReportStore.js';
13
+ /**
14
+ * Register all resources with the MCP server
15
+ */
16
+ export function registerResources(server) {
17
+ // =========================================================================
18
+ // List Resource Templates (for dynamic URIs)
19
+ // =========================================================================
20
+ server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
21
+ return {
22
+ resourceTemplates: [
23
+ {
24
+ uriTemplate: 'codeguardian://validation-report/{jobId}',
25
+ name: 'Validation Report Summary',
26
+ description: 'Summary of a validation job result. Use query params for chunks: ?type=hallucinations&chunk=0',
27
+ mimeType: 'application/json',
28
+ },
29
+ {
30
+ uriTemplate: 'codeguardian://validation-report/{jobId}/hallucinations/{chunk}',
31
+ name: 'Hallucination Details',
32
+ description: 'Paginated hallucination issues from a validation report',
33
+ mimeType: 'application/json',
34
+ },
35
+ {
36
+ uriTemplate: 'codeguardian://validation-report/{jobId}/dead-code/{chunk}',
37
+ name: 'Dead Code Details',
38
+ description: 'Paginated dead code issues from a validation report',
39
+ mimeType: 'application/json',
40
+ },
41
+ {
42
+ uriTemplate: 'codeguardian://validation-report/{jobId}/by-severity/{severity}',
43
+ name: 'Issues by Severity',
44
+ description: 'Issues filtered by severity (critical, high, medium, low, warning)',
45
+ mimeType: 'application/json',
46
+ },
47
+ {
48
+ uriTemplate: 'codeguardian://validation-report/{jobId}/by-type/{type}',
49
+ name: 'Issues by Type',
50
+ description: 'Issues filtered by type (e.g. dependencyHallucination)',
51
+ mimeType: 'application/json',
52
+ },
53
+ {
54
+ uriTemplate: 'codeguardian://validation-report/{jobId}/by-file/{filePath}',
55
+ name: 'Issues by File',
56
+ description: 'Issues filtered by file path',
57
+ mimeType: 'application/json',
58
+ },
59
+ ],
60
+ };
61
+ });
62
+ // =========================================================================
63
+ // List Available Resources
64
+ // =========================================================================
65
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
66
+ // Get dynamic validation reports
67
+ const validationReports = validationReportStore.list().map(report => ({
68
+ uri: report.uri,
69
+ name: `Validation Report: ${report.jobId}`,
70
+ description: `${report.totalIssues} issues found - Created ${report.createdAt}`,
71
+ mimeType: 'application/json',
72
+ }));
73
+ return {
74
+ resources: [
75
+ // Static resources
76
+ {
77
+ uri: 'codeguardian://quality-dashboard',
78
+ name: 'Quality Dashboard',
79
+ description: 'Real-time code quality metrics and trends',
80
+ mimeType: 'application/json',
81
+ },
82
+ {
83
+ uri: 'codeguardian://vulnerability-db',
84
+ name: 'Vulnerability Database',
85
+ description: 'Common AI-generated security vulnerabilities',
86
+ mimeType: 'application/json',
87
+ },
88
+ {
89
+ uri: 'codeguardian://best-practices',
90
+ name: 'Best Practices Library',
91
+ description: 'Context-aware coding best practices',
92
+ mimeType: 'application/json',
93
+ },
94
+ // Dynamic validation reports
95
+ ...validationReports,
96
+ ],
97
+ };
98
+ });
99
+ // =========================================================================
100
+ // Read Resource Content
101
+ // =========================================================================
102
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
103
+ const { uri } = request.params;
104
+ logger.info(`Reading resource: ${uri}`);
105
+ try {
106
+ // Parse validation report URIs
107
+ // Pattern: codeguardian://validation-report/{jobId}[/hallucinations|dead-code/{chunk}]
108
+ const validationMatch = uri.match(/^codeguardian:\/\/validation-report\/([^/]+)(\/(.+))?$/);
109
+ if (validationMatch) {
110
+ const jobId = validationMatch[1];
111
+ const subPath = validationMatch[3];
112
+ if (!validationReportStore.has(jobId)) {
113
+ throw new Error(`Validation report not found: ${jobId}`);
114
+ }
115
+ // Return summary if no subpath
116
+ if (!subPath) {
117
+ const summary = validationReportStore.getSummary(jobId);
118
+ return {
119
+ contents: [
120
+ {
121
+ uri,
122
+ mimeType: 'application/json',
123
+ text: JSON.stringify({
124
+ ...summary,
125
+ _help: {
126
+ message: 'This is a summary. Use the URIs below to fetch detailed issue chunks.',
127
+ hallucinations: `${uri}/hallucinations/0`,
128
+ deadCode: `${uri}/dead-code/0`,
129
+ filter: `Use get_validation_results with filters for specific queries`,
130
+ },
131
+ }, null, 2),
132
+ },
133
+ ],
134
+ };
135
+ }
136
+ // Parse chunk requests: hallucinations/{chunk} or dead-code/{chunk}
137
+ const hallucinationChunkMatch = subPath.match(/^hallucinations\/(\d+)$/);
138
+ if (hallucinationChunkMatch) {
139
+ const chunkIndex = parseInt(hallucinationChunkMatch[1], 10);
140
+ const chunk = validationReportStore.getHallucinationsChunk(jobId, chunkIndex);
141
+ if (!chunk) {
142
+ throw new Error(`Invalid chunk index: ${chunkIndex}`);
143
+ }
144
+ return {
145
+ contents: [
146
+ {
147
+ uri,
148
+ mimeType: 'application/json',
149
+ text: JSON.stringify({
150
+ jobId,
151
+ ...chunk,
152
+ nextChunk: chunk.chunkIndex < chunk.totalChunks - 1
153
+ ? `codeguardian://validation-report/${jobId}/hallucinations/${chunk.chunkIndex + 1}`
154
+ : null,
155
+ prevChunk: chunk.chunkIndex > 0
156
+ ? `codeguardian://validation-report/${jobId}/hallucinations/${chunk.chunkIndex - 1}`
157
+ : null,
158
+ }, null, 2),
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ const deadCodeChunkMatch = subPath.match(/^dead-code\/(\d+)$/);
164
+ if (deadCodeChunkMatch) {
165
+ const chunkIndex = parseInt(deadCodeChunkMatch[1], 10);
166
+ const chunk = validationReportStore.getDeadCodeChunk(jobId, chunkIndex);
167
+ if (!chunk) {
168
+ throw new Error(`Invalid chunk index: ${chunkIndex}`);
169
+ }
170
+ return {
171
+ contents: [
172
+ {
173
+ uri,
174
+ mimeType: 'application/json',
175
+ text: JSON.stringify({
176
+ jobId,
177
+ ...chunk,
178
+ nextChunk: chunk.chunkIndex < chunk.totalChunks - 1
179
+ ? `codeguardian://validation-report/${jobId}/dead-code/${chunk.chunkIndex + 1}`
180
+ : null,
181
+ prevChunk: chunk.chunkIndex > 0
182
+ ? `codeguardian://validation-report/${jobId}/dead-code/${chunk.chunkIndex - 1}`
183
+ : null,
184
+ }, null, 2),
185
+ },
186
+ ],
187
+ };
188
+ }
189
+ // Parse categorized requests
190
+ const severityMatch = subPath.match(/^by-severity\/([^/]+)$/);
191
+ if (severityMatch) {
192
+ const severity = severityMatch[1];
193
+ const categorized = validationReportStore.getBySeverity(jobId);
194
+ if (!categorized || !categorized[severity]) {
195
+ throw new Error(`Invalid severity category: ${severity}`);
196
+ }
197
+ return {
198
+ contents: [{
199
+ uri,
200
+ mimeType: 'application/json',
201
+ text: JSON.stringify({
202
+ jobId,
203
+ category: 'severity',
204
+ filter: severity,
205
+ count: categorized[severity].length,
206
+ issues: categorized[severity],
207
+ }, null, 2),
208
+ }],
209
+ };
210
+ }
211
+ const typeMatch = subPath.match(/^by-type\/([^/]+)$/);
212
+ if (typeMatch) {
213
+ const type = typeMatch[1];
214
+ const categorized = validationReportStore.getByType(jobId);
215
+ if (!categorized || !categorized[type]) {
216
+ throw new Error(`Invalid issue type: ${type}`);
217
+ }
218
+ return {
219
+ contents: [{
220
+ uri,
221
+ mimeType: 'application/json',
222
+ text: JSON.stringify({
223
+ jobId,
224
+ category: 'type',
225
+ filter: type,
226
+ count: categorized[type].length,
227
+ issues: categorized[type],
228
+ }, null, 2),
229
+ }],
230
+ };
231
+ }
232
+ const fileMatch = subPath.match(/^by-file\/(.+)$/);
233
+ if (fileMatch) {
234
+ // Decode generic URI component just in case, though usually handled by MCP
235
+ const filePath = decodeURIComponent(fileMatch[1]);
236
+ const categorized = validationReportStore.getByFile(jobId);
237
+ // Try exact match or partial match
238
+ let issues = categorized ? categorized[filePath] : undefined;
239
+ if (!issues && categorized) {
240
+ // Fallback: try finding by partial string if exact match fails
241
+ const key = Object.keys(categorized).find(k => k.includes(filePath));
242
+ if (key)
243
+ issues = categorized[key];
244
+ }
245
+ if (!issues) {
246
+ return {
247
+ contents: [{
248
+ uri,
249
+ mimeType: 'application/json',
250
+ text: JSON.stringify({
251
+ jobId,
252
+ category: 'file',
253
+ filter: filePath,
254
+ count: 0,
255
+ issues: [],
256
+ message: "No issues found for this file path."
257
+ }, null, 2),
258
+ }],
259
+ };
260
+ }
261
+ return {
262
+ contents: [{
263
+ uri,
264
+ mimeType: 'application/json',
265
+ text: JSON.stringify({
266
+ jobId,
267
+ category: 'file',
268
+ filter: filePath,
269
+ count: issues.length,
270
+ issues: issues,
271
+ }, null, 2),
272
+ }],
273
+ };
274
+ }
275
+ throw new Error(`Unknown validation report path: ${subPath}`);
276
+ }
277
+ // Static resources
278
+ switch (uri) {
279
+ case 'codeguardian://quality-dashboard':
280
+ return {
281
+ contents: [
282
+ {
283
+ uri,
284
+ mimeType: 'application/json',
285
+ text: JSON.stringify({
286
+ message: 'Quality dashboard - coming soon',
287
+ metrics: {},
288
+ }, null, 2),
289
+ },
290
+ ],
291
+ };
292
+ case 'codeguardian://vulnerability-db':
293
+ return {
294
+ contents: [
295
+ {
296
+ uri,
297
+ mimeType: 'application/json',
298
+ text: JSON.stringify({
299
+ message: 'Vulnerability database - coming soon',
300
+ vulnerabilities: [],
301
+ }, null, 2),
302
+ },
303
+ ],
304
+ };
305
+ case 'codeguardian://best-practices':
306
+ return {
307
+ contents: [
308
+ {
309
+ uri,
310
+ mimeType: 'application/json',
311
+ text: JSON.stringify({
312
+ message: 'Best practices library - coming soon',
313
+ practices: [],
314
+ }, null, 2),
315
+ },
316
+ ],
317
+ };
318
+ default:
319
+ throw new Error(`Unknown resource: ${uri}`);
320
+ }
321
+ }
322
+ catch (error) {
323
+ logger.error(`Error reading resource ${uri}:`, error);
324
+ throw error;
325
+ }
326
+ });
327
+ }
328
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
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
+ export interface ValidationReportChunk {
17
+ chunkIndex: number;
18
+ totalChunks: number;
19
+ type: 'hallucinations' | 'dead_code' | 'summary' | 'full';
20
+ data: any;
21
+ }
22
+ export interface StoredReport {
23
+ jobId: string;
24
+ createdAt: number;
25
+ expiresAt: number;
26
+ summary: any;
27
+ stats: any;
28
+ hallucinations: any[];
29
+ deadCode: any[];
30
+ score?: number;
31
+ recommendation?: any;
32
+ }
33
+ declare class ValidationReportStore {
34
+ private reports;
35
+ private readonly TTL;
36
+ private cleanupInterval?;
37
+ private readonly CHUNK_SIZE;
38
+ private reportsDir;
39
+ private jobProjectMap;
40
+ constructor(baseDir?: string);
41
+ /**
42
+ * Initialize persistence (create directories and load existing)
43
+ */
44
+ private initializePersistence;
45
+ /**
46
+ * Save report to disk in the project-specific directory.
47
+ *
48
+ * Saves to TWO locations:
49
+ * 1. `.codeguardian/reports/{jobId}.json` - internal cache (gitignored)
50
+ * 2. `codeguardian-report.json` - LLM-readable file at project root
51
+ *
52
+ * The LLM-readable file is placed OUTSIDE `.codeguardian/` so that
53
+ * AI assistants using file-reading tools (which often respect .gitignore)
54
+ * can still access the validation results.
55
+ */
56
+ private saveReportToDisk;
57
+ /**
58
+ * Save an LLM-readable report file at the project root.
59
+ *
60
+ * This file is NOT inside `.codeguardian/` so it can be read by
61
+ * LLM file-reading tools that respect `.gitignore`.
62
+ *
63
+ * The file is intentionally compact: it includes the summary, score,
64
+ * recommendation, and the full issues list. For very large reports,
65
+ * the LLM can use pagination via the MCP Resources API.
66
+ */
67
+ private saveLLMReadableReport;
68
+ /**
69
+ * Get the path to the LLM-readable report file for a project
70
+ */
71
+ getLLMReportPath(projectPath: string): string;
72
+ /**
73
+ * Get the project path associated with a job
74
+ */
75
+ getJobProjectPath(jobId: string): string | undefined;
76
+ /**
77
+ * Delete report from disk
78
+ */
79
+ private deleteReportFromDisk;
80
+ /**
81
+ * Load all reports from disk by scanning known project paths
82
+ * from guardian persistence configs.
83
+ */
84
+ private loadAllReports;
85
+ /**
86
+ * Store a validation report
87
+ *
88
+ * IMPORTANT: This method is async and waits for the report to be written to disk.
89
+ * This ensures the file exists immediately when the method resolves.
90
+ */
91
+ store(jobId: string, projectPath: string, report: Omit<StoredReport, 'jobId' | 'createdAt' | 'expiresAt'>): Promise<string>;
92
+ /**
93
+ * Get the resource URI for a report
94
+ */
95
+ getReportUri(jobId: string): string;
96
+ /**
97
+ * Get a stored report
98
+ */
99
+ get(jobId: string): StoredReport | undefined;
100
+ /**
101
+ * Check if a report exists
102
+ */
103
+ has(jobId: string): boolean;
104
+ /**
105
+ * Get report summary (lightweight)
106
+ */
107
+ getSummary(jobId: string): object | undefined;
108
+ /**
109
+ * Get a chunk of hallucinations
110
+ */
111
+ getHallucinationsChunk(jobId: string, chunkIndex: number): ValidationReportChunk | undefined;
112
+ /**
113
+ * Get a chunk of dead code
114
+ */
115
+ getDeadCodeChunk(jobId: string, chunkIndex: number): ValidationReportChunk | undefined;
116
+ /**
117
+ * Get filtered issues (with severity, file, etc.)
118
+ */
119
+ getFilteredIssues(jobId: string, options?: {
120
+ type?: 'hallucinations' | 'dead_code';
121
+ severity?: string;
122
+ file?: string;
123
+ limit?: number;
124
+ offset?: number;
125
+ }): {
126
+ issues: any[];
127
+ total: number;
128
+ hasMore: boolean;
129
+ } | undefined;
130
+ /**
131
+ * Get issues categorized by severity
132
+ * Returns: { critical: [...], high: [...], medium: [...], low: [...], warning: [...] }
133
+ */
134
+ getBySeverity(jobId: string): Record<string, any[]> | undefined;
135
+ /**
136
+ * Get issues categorized by type
137
+ * Returns: { dependencyHallucination: [...], nonExistentFunction: [...], deadCode: [...], etc. }
138
+ */
139
+ getByType(jobId: string): Record<string, any[]> | undefined;
140
+ /**
141
+ * Get issues categorized by file
142
+ * Returns: { "src/foo.ts": [...], "src/bar.ts": [...], etc. }
143
+ */
144
+ getByFile(jobId: string): Record<string, any[]> | undefined;
145
+ /**
146
+ * Get a categorized summary (counts only, no full issue data)
147
+ * Lightweight for LLM decision-making on what to fetch next.
148
+ */
149
+ getCategorizedSummary(jobId: string): object | undefined;
150
+ /**
151
+ * List all available reports
152
+ */
153
+ list(): Array<{
154
+ jobId: string;
155
+ uri: string;
156
+ createdAt: string;
157
+ totalIssues: number;
158
+ }>;
159
+ /**
160
+ * Cleanup expired reports
161
+ */
162
+ private cleanup;
163
+ /**
164
+ * Shutdown
165
+ */
166
+ shutdown(): void;
167
+ }
168
+ export declare const validationReportStore: ValidationReportStore;
169
+ export {};
170
+ //# sourceMappingURL=validationReportStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validationReportStore.d.ts","sourceRoot":"","sources":["../../src/resources/validationReportStore.ts"],"names":[],"mappings":"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"}