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 @@
1
+ {"version":3,"file":"mcpNotifications.d.ts","sourceRoot":"","sources":["../../src/agent/mcpNotifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGjD;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,qBAAqB,GAAG,aAAa,GAAG,cAAc,GAAG,gBAAgB,GAAG,mBAAmB,EACrG,IAAI,EAAE,GAAG,GACR,OAAO,CAAC,OAAO,CAAC,CA8BlB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnB;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,GAAG,GACX,OAAO,CAAC,OAAO,CAAC,CAQlB"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * MCP Notification System
3
+ *
4
+ * Provides UI notifications to the MCP client (Claude Desktop, Cline, VS Code, etc.)
5
+ *
6
+ * IMPORTANT: MCP servers CANNOT directly push data to LLMs. These notifications
7
+ * only appear in the client's UI as hints. The LLM must still call tools like
8
+ * get_guardian_alerts to retrieve the actual alert data.
9
+ *
10
+ * @format
11
+ */
12
+ import { logger } from "../utils/logger.js";
13
+ let mcpServer = null;
14
+ /**
15
+ * Register the MCP server instance for notifications
16
+ */
17
+ export function setMCPServer(server) {
18
+ mcpServer = server;
19
+ logger.info("MCP notification system initialized");
20
+ }
21
+ /**
22
+ * Send a notification to the MCP client (system UI)
23
+ * This uses MCP's standard logging notification API
24
+ */
25
+ export async function sendNotification(type, data) {
26
+ if (!mcpServer) {
27
+ logger.warn("MCP server not registered, cannot send notification");
28
+ return false;
29
+ }
30
+ try {
31
+ // Use MCP's standard logging/message notification
32
+ // This routes to the client UI (Claude Desktop, Cline, VS Code, etc.)
33
+ const level = type === "agent_alert" ? "warning" : "info";
34
+ await mcpServer.notification({
35
+ method: "notifications/message",
36
+ params: {
37
+ level,
38
+ logger: "CodeGuardian",
39
+ data: {
40
+ type,
41
+ message: data.message || `CodeGuardian ${type}`,
42
+ ...data,
43
+ },
44
+ },
45
+ });
46
+ logger.info(`Sent notification to system: ${type}`);
47
+ return true;
48
+ }
49
+ catch (error) {
50
+ logger.error("Failed to send notification:", error);
51
+ return false;
52
+ }
53
+ }
54
+ /**
55
+ * Send a validation alert notification to the UI
56
+ *
57
+ * NOTE: This only shows a notification in the client UI. The LLM must
58
+ * call get_guardian_alerts to retrieve the actual alert data.
59
+ */
60
+ export async function pushValidationAlert(alert) {
61
+ const type = alert.isInitialScan ? "initial_scan" : "agent_alert";
62
+ return sendNotification(type, {
63
+ file: alert.file,
64
+ issueCount: alert.issues.length,
65
+ message: alert.llmMessage,
66
+ timestamp: Date.now(),
67
+ });
68
+ }
69
+ /**
70
+ * Send async validation results when complete
71
+ */
72
+ export async function pushAsyncValidationComplete(jobId, results) {
73
+ return sendNotification("validation_complete", {
74
+ jobId,
75
+ success: results.success,
76
+ issueCount: results.issues?.length || 0,
77
+ message: results.recommendation?.message || "Validation complete",
78
+ timestamp: Date.now(),
79
+ });
80
+ }
81
+ //# sourceMappingURL=mcpNotifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpNotifications.js","sourceRoot":"","sources":["../../src/agent/mcpNotifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,IAAI,SAAS,GAAkB,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,SAAS,GAAG,MAAM,CAAC;IACnB,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAqG,EACrG,IAAS;IAET,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,kDAAkD;QAClD,sEAAsE;QACtE,MAAM,KAAK,GAAG,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAE1D,MAAM,SAAS,CAAC,YAAY,CAAC;YAC3B,MAAM,EAAE,uBAAuB;YAC/B,MAAM,EAAE;gBACN,KAAK;gBACL,MAAM,EAAE,cAAc;gBACtB,IAAI,EAAE;oBACJ,IAAI;oBACJ,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,gBAAgB,IAAI,EAAE;oBAC/C,GAAG,IAAI;iBACR;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAKzC;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;IAClE,OAAO,gBAAgB,CAAC,IAAI,EAAE;QAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QAC/B,OAAO,EAAE,KAAK,CAAC,UAAU;QACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,KAAa,EACb,OAAY;IAEZ,OAAO,gBAAgB,CAAC,qBAAqB,EAAE;QAC7C,KAAK;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;QACvC,OAAO,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,IAAI,qBAAqB;QACjE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * AI Anti-Pattern Detector
3
+ *
4
+ * Lightweight heuristic detector used by unit tests and optional enrichment.
5
+ *
6
+ * NOTE: This intentionally avoids heavy parsing to keep runtime low.
7
+ */
8
+ export type AIAntiPatternSeverity = "low" | "medium" | "high" | "critical";
9
+ export interface AIAntiPatternIssue {
10
+ type: "genericErrorHandling" | "unnecessaryAbstraction" | "missingValidation";
11
+ severity: AIAntiPatternSeverity;
12
+ message: string;
13
+ line?: number;
14
+ }
15
+ export declare function detectAIAntiPatterns(code: string, language: string): Promise<AIAntiPatternIssue[]>;
16
+ //# sourceMappingURL=aiPatterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiPatterns.d.ts","sourceRoot":"","sources":["../../src/analyzers/aiPatterns.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EACA,sBAAsB,GACtB,wBAAwB,GACxB,mBAAmB,CAAC;IACxB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA+FD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAY/B"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * AI Anti-Pattern Detector
3
+ *
4
+ * Lightweight heuristic detector used by unit tests and optional enrichment.
5
+ *
6
+ * NOTE: This intentionally avoids heavy parsing to keep runtime low.
7
+ */
8
+ function getLineNumberFromIndex(source, index) {
9
+ if (index <= 0)
10
+ return 1;
11
+ // Count '\n' up to index (1-based lines)
12
+ let lines = 1;
13
+ for (let i = 0; i < index && i < source.length; i++) {
14
+ if (source.charCodeAt(i) === 10)
15
+ lines++;
16
+ }
17
+ return lines;
18
+ }
19
+ function detectGenericErrorHandling(code) {
20
+ // Heuristic:
21
+ // - find catch blocks
22
+ // - flag those that only log the error (console.log/error/warn) without rethrow/handling
23
+ // - do NOT flag if we see a throw inside the catch, or explicit logging via a structured logger
24
+ const issues = [];
25
+ // Match `catch (e) { ... }` including multiline body (non-greedy)
26
+ const catchRe = /catch\s*\(([^)]*)\)\s*\{([\s\S]*?)\}/g;
27
+ for (const match of code.matchAll(catchRe)) {
28
+ const full = match[0];
29
+ const catchParam = (match[1] ?? "").trim();
30
+ const body = match[2] ?? "";
31
+ const matchIndex = match.index ?? 0;
32
+ // If they rethrow or wrap, assume good.
33
+ if (/\bthrow\b/.test(body))
34
+ continue;
35
+ if (/\breturn\b\s+new\s+/.test(body))
36
+ continue;
37
+ // If a structured logger is used, assume intentional handling.
38
+ if (/\blogger\.(error|warn|info)\s*\(/.test(body))
39
+ continue;
40
+ // Flag console logging of the caught error.
41
+ const consoleLogRe = /\bconsole\.(log|error|warn)\s*\(([^)]*)\)\s*;?/;
42
+ const consoleLog = body.match(consoleLogRe);
43
+ if (!consoleLog)
44
+ continue;
45
+ const argText = consoleLog[2] ?? "";
46
+ // Prefer to only flag when they log the caught error directly.
47
+ // If param is empty, still flag (generic catch-all) when console logging is present.
48
+ const logsCaughtError = !catchParam || new RegExp(`\\b${catchParam}\\b`).test(argText);
49
+ if (!logsCaughtError)
50
+ continue;
51
+ issues.push({
52
+ type: "genericErrorHandling",
53
+ severity: "medium",
54
+ message: "Catch block appears to only log the error (generic error handling); consider handling or rethrowing.",
55
+ line: getLineNumberFromIndex(code, matchIndex + full.indexOf("catch")),
56
+ });
57
+ }
58
+ return issues;
59
+ }
60
+ function detectUnnecessaryAbstractionsTS(code) {
61
+ // Heuristic:
62
+ // - find `interface X { ... }`
63
+ // - count occurrences of word X in the whole file
64
+ // - if it only occurs in its declaration + one usage, flag as unnecessary
65
+ const issues = [];
66
+ const interfaceRe = /\binterface\s+([A-Za-z_$][\w$]*)\b/g;
67
+ for (const match of code.matchAll(interfaceRe)) {
68
+ const name = match[1];
69
+ if (!name)
70
+ continue;
71
+ const nameRe = new RegExp(`\\b${name}\\b`, "g");
72
+ const occurrences = [...code.matchAll(nameRe)].length;
73
+ // Occurrence counting includes the declaration itself.
74
+ // Typical "used once" pattern: `interface X` + `implements X` => 2.
75
+ // Consider up to 2 as unnecessary; 3+ indicates multi-use.
76
+ if (occurrences <= 2) {
77
+ issues.push({
78
+ type: "unnecessaryAbstraction",
79
+ severity: "low",
80
+ message: `Interface '${name}' appears to be used only once; consider simplifying unless needed for extensibility.`,
81
+ line: getLineNumberFromIndex(code, match.index ?? 0),
82
+ });
83
+ }
84
+ }
85
+ return issues;
86
+ }
87
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
88
+ function detectMissingValidation(_code) {
89
+ // Intentionally conservative; current unit tests accept 0 findings.
90
+ return [];
91
+ }
92
+ export async function detectAIAntiPatterns(code, language) {
93
+ if (!code || !code.trim())
94
+ return [];
95
+ const issues = [];
96
+ issues.push(...detectGenericErrorHandling(code));
97
+ if (language === "typescript" || language === "ts") {
98
+ issues.push(...detectUnnecessaryAbstractionsTS(code));
99
+ }
100
+ issues.push(...detectMissingValidation(code));
101
+ return issues;
102
+ }
103
+ //# sourceMappingURL=aiPatterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiPatterns.js","sourceRoot":"","sources":["../../src/analyzers/aiPatterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Anti-Patterns Analyzer
3
+ *
4
+ * Loads and provides AI anti-patterns for enriching validation results.
5
+ * Used for LLM context and educational purposes - NOT for regex validation.
6
+ *
7
+ * @format
8
+ */
9
+ export interface AntiPattern {
10
+ id: string;
11
+ name: string;
12
+ category: string;
13
+ severity: "low" | "medium" | "high";
14
+ description: string;
15
+ pattern: string;
16
+ languages: string[];
17
+ fix: string;
18
+ example: string;
19
+ aiGenerated: boolean;
20
+ }
21
+ /**
22
+ * Load anti-patterns from JSON file
23
+ * Caches result for performance
24
+ */
25
+ export declare function loadAntiPatterns(): Promise<AntiPattern[]>;
26
+ /**
27
+ * Get anti-patterns synchronously (from cache)
28
+ * Returns empty array if not yet loaded
29
+ */
30
+ export declare function getAntiPatternsSync(): AntiPattern[];
31
+ /**
32
+ * Find anti-patterns relevant to a specific issue type
33
+ */
34
+ export declare function getRelevantAntiPatterns(issueType: string, language?: string): Promise<AntiPattern[]>;
35
+ /**
36
+ * Get anti-patterns by category
37
+ */
38
+ export declare function getAntiPatternsByCategory(category: string): Promise<AntiPattern[]>;
39
+ /**
40
+ * Get AI-specific anti-patterns (common AI mistakes)
41
+ */
42
+ export declare function getAIAntiPatterns(): Promise<AntiPattern[]>;
43
+ /**
44
+ * Enrich a validation issue with relevant anti-pattern context
45
+ * Returns the enriched issue (non-destructive)
46
+ */
47
+ export declare function enrichIssueWithAntiPattern(issue: any, language?: string): Promise<any>;
48
+ /**
49
+ * Batch enrich multiple issues
50
+ */
51
+ export declare function enrichIssuesWithAntiPatterns(issues: any[], language?: string): Promise<any[]>;
52
+ /**
53
+ * Generate LLM context from anti-patterns relevant to the issues
54
+ */
55
+ export declare function generateAntiPatternContext(issues: any[], language?: string): Promise<string>;
56
+ /**
57
+ * Get educational summary for a specific anti-pattern ID
58
+ */
59
+ export declare function getAntiPatternById(id: string): Promise<AntiPattern | null>;
60
+ //# sourceMappingURL=antiPatterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antiPatterns.d.ts","sourceRoot":"","sources":["../../src/analyzers/antiPatterns.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAgBD;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAwB/D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,EAAE,CAEnD;AAMD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC,CAgCxB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CAGxB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAGhE;AAMD;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,GAAG,EACV,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,CAAC,CA0Bd;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,GAAG,EAAE,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,EAAE,CAAC,CAEhB;AAMD;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,GAAG,EAAE,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAqDjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAGhF"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Anti-Patterns Analyzer
3
+ *
4
+ * Loads and provides AI anti-patterns for enriching validation results.
5
+ * Used for LLM context and educational purposes - NOT for regex validation.
6
+ *
7
+ * @format
8
+ */
9
+ import * as fs from "fs/promises";
10
+ import * as path from "path";
11
+ import { fileURLToPath } from "url";
12
+ import { logger } from "../utils/logger.js";
13
+ // ============================================================================
14
+ // Cache
15
+ // ============================================================================
16
+ let antiPatternsCache = null;
17
+ // ============================================================================
18
+ // Loader
19
+ // ============================================================================
20
+ /**
21
+ * Load anti-patterns from JSON file
22
+ * Caches result for performance
23
+ */
24
+ export async function loadAntiPatterns() {
25
+ if (antiPatternsCache) {
26
+ return antiPatternsCache;
27
+ }
28
+ try {
29
+ // Get the directory of the current module
30
+ const __filename = fileURLToPath(import.meta.url);
31
+ const __dirname = path.dirname(__filename);
32
+ // Path to anti-patterns JSON (relative to src/)
33
+ const patternsPath = path.resolve(__dirname, "../../rules/anti-patterns/ai-anti-patterns.json");
34
+ const data = await fs.readFile(patternsPath, "utf-8");
35
+ const db = JSON.parse(data);
36
+ antiPatternsCache = db.patterns;
37
+ logger.info(`Loaded ${antiPatternsCache.length} anti-patterns`);
38
+ return antiPatternsCache;
39
+ }
40
+ catch (error) {
41
+ logger.error("Failed to load anti-patterns:", error);
42
+ return [];
43
+ }
44
+ }
45
+ /**
46
+ * Get anti-patterns synchronously (from cache)
47
+ * Returns empty array if not yet loaded
48
+ */
49
+ export function getAntiPatternsSync() {
50
+ return antiPatternsCache || [];
51
+ }
52
+ // ============================================================================
53
+ // Lookup Functions
54
+ // ============================================================================
55
+ /**
56
+ * Find anti-patterns relevant to a specific issue type
57
+ */
58
+ export async function getRelevantAntiPatterns(issueType, language) {
59
+ const patterns = await loadAntiPatterns();
60
+ // Map validation issue types to anti-pattern categories
61
+ const categoryMap = {
62
+ undefinedVariable: ["maintainability", "bugs"],
63
+ nonExistentMethod: ["maintainability"],
64
+ nonExistentFunction: ["maintainability"],
65
+ nonExistentImport: ["maintainability"],
66
+ nonExistentClass: ["maintainability"],
67
+ unusedImport: ["dead-code"],
68
+ // dependencyHallucination intentionally excluded - no relevant anti-pattern exists
69
+ deadCode: ["dead-code"],
70
+ highComplexity: ["complexity"],
71
+ longFunction: ["complexity"],
72
+ deepNesting: ["complexity"],
73
+ architecturalDeviation: ["maintainability"],
74
+ };
75
+ const relevantCategories = categoryMap[issueType] || [];
76
+ return patterns.filter((pattern) => {
77
+ // Match by category
78
+ const categoryMatch = relevantCategories.includes(pattern.category);
79
+ // Filter by language if specified
80
+ const languageMatch = language
81
+ ? pattern.languages.includes(language) || pattern.languages.includes("javascript")
82
+ : true;
83
+ return categoryMatch && languageMatch;
84
+ });
85
+ }
86
+ /**
87
+ * Get anti-patterns by category
88
+ */
89
+ export async function getAntiPatternsByCategory(category) {
90
+ const patterns = await loadAntiPatterns();
91
+ return patterns.filter((p) => p.category === category);
92
+ }
93
+ /**
94
+ * Get AI-specific anti-patterns (common AI mistakes)
95
+ */
96
+ export async function getAIAntiPatterns() {
97
+ const patterns = await loadAntiPatterns();
98
+ return patterns.filter((p) => p.aiGenerated);
99
+ }
100
+ // ============================================================================
101
+ // Enrichment Functions
102
+ // ============================================================================
103
+ /**
104
+ * Enrich a validation issue with relevant anti-pattern context
105
+ * Returns the enriched issue (non-destructive)
106
+ */
107
+ export async function enrichIssueWithAntiPattern(issue, language) {
108
+ try {
109
+ const relevantPatterns = await getRelevantAntiPatterns(issue.type, language);
110
+ if (relevantPatterns.length === 0) {
111
+ return issue;
112
+ }
113
+ // Find the most relevant pattern (first match for now)
114
+ const primaryPattern = relevantPatterns[0];
115
+ return {
116
+ ...issue,
117
+ antiPattern: {
118
+ id: primaryPattern.id,
119
+ name: primaryPattern.name,
120
+ category: primaryPattern.category,
121
+ description: primaryPattern.description,
122
+ fix: primaryPattern.fix,
123
+ example: primaryPattern.example,
124
+ },
125
+ };
126
+ }
127
+ catch (error) {
128
+ logger.warn("Failed to enrich issue with anti-pattern:", error);
129
+ return issue;
130
+ }
131
+ }
132
+ /**
133
+ * Batch enrich multiple issues
134
+ */
135
+ export async function enrichIssuesWithAntiPatterns(issues, language) {
136
+ return Promise.all(issues.map((issue) => enrichIssueWithAntiPattern(issue, language)));
137
+ }
138
+ // ============================================================================
139
+ // LLM Context Generation
140
+ // ============================================================================
141
+ /**
142
+ * Generate LLM context from anti-patterns relevant to the issues
143
+ */
144
+ export async function generateAntiPatternContext(issues, language) {
145
+ try {
146
+ // Get unique categories from issues
147
+ const categories = new Set();
148
+ const categoryMap = {
149
+ undefinedVariable: ["maintainability"],
150
+ nonExistentMethod: ["maintainability"],
151
+ nonExistentFunction: ["maintainability"],
152
+ unusedImport: ["dead-code"],
153
+ deadCode: ["dead-code"],
154
+ highComplexity: ["complexity"],
155
+ longFunction: ["complexity"],
156
+ deepNesting: ["complexity"],
157
+ };
158
+ issues.forEach((issue) => {
159
+ const cats = categoryMap[issue.type] || [];
160
+ cats.forEach((c) => categories.add(c));
161
+ });
162
+ if (categories.size === 0) {
163
+ return "";
164
+ }
165
+ // Load relevant anti-patterns
166
+ const patterns = await loadAntiPatterns();
167
+ const relevantPatterns = patterns.filter((p) => categories.has(p.category) && (!language || p.languages.includes(language)));
168
+ if (relevantPatterns.length === 0) {
169
+ return "";
170
+ }
171
+ // Format for LLM
172
+ const sections = relevantPatterns.map((p) => {
173
+ return `### ${p.id}: ${p.name}
174
+ - **Category:** ${p.category}
175
+ - **Severity:** ${p.severity}
176
+ - **Problem:** ${p.description}
177
+ - **Fix:** ${p.fix}
178
+ ${p.aiGenerated ? "- **Note:** Common in AI-generated code" : ""}`;
179
+ });
180
+ return `## Relevant Anti-Patterns to Avoid
181
+
182
+ ${sections.join("\n\n")}
183
+
184
+ When suggesting fixes, ensure you don't introduce these anti-patterns.`;
185
+ }
186
+ catch (error) {
187
+ logger.warn("Failed to generate anti-pattern context:", error);
188
+ return "";
189
+ }
190
+ }
191
+ /**
192
+ * Get educational summary for a specific anti-pattern ID
193
+ */
194
+ export async function getAntiPatternById(id) {
195
+ const patterns = await loadAntiPatterns();
196
+ return patterns.find((p) => p.id === id) || null;
197
+ }
198
+ //# sourceMappingURL=antiPatterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antiPatterns.js","sourceRoot":"","sources":["../../src/analyzers/antiPatterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Built-in Types and Methods
3
+ *
4
+ * Comprehensive registry of built-in types, methods, and globals
5
+ * for each supported language. Used for type-aware validation.
6
+ *
7
+ * @format
8
+ */
9
+ export interface LanguageBuiltins {
10
+ globals: string[];
11
+ functions: string[];
12
+ classes: string[];
13
+ keywords: string[];
14
+ methods: Record<string, string[]>;
15
+ properties: Record<string, string[]>;
16
+ }
17
+ export declare const BUILTIN_TYPES: Record<string, LanguageBuiltins>;
18
+ //# sourceMappingURL=builtinTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtinTypes.d.ts","sourceRoot":"","sources":["../../src/analyzers/builtinTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACtC;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAovC1D,CAAC"}