api-tests-coverage 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 (288) hide show
  1. package/README.md +703 -0
  2. package/config.yaml.example +227 -0
  3. package/dist/action/src/index.d.ts +2 -0
  4. package/dist/action/src/index.d.ts.map +1 -0
  5. package/dist/action/src/index.js +349 -0
  6. package/dist/action/src/prComment.d.ts +34 -0
  7. package/dist/action/src/prComment.d.ts.map +1 -0
  8. package/dist/action/src/prComment.js +146 -0
  9. package/dist/src/ast/astAnalysisOrchestrator.d.ts +36 -0
  10. package/dist/src/ast/astAnalysisOrchestrator.d.ts.map +1 -0
  11. package/dist/src/ast/astAnalysisOrchestrator.js +123 -0
  12. package/dist/src/ast/astTypes.d.ts +105 -0
  13. package/dist/src/ast/astTypes.d.ts.map +1 -0
  14. package/dist/src/ast/astTypes.js +9 -0
  15. package/dist/src/ast/languageAnalyzer.d.ts +46 -0
  16. package/dist/src/ast/languageAnalyzer.d.ts.map +1 -0
  17. package/dist/src/ast/languageAnalyzer.js +9 -0
  18. package/dist/src/ast/languageCapabilities.d.ts +24 -0
  19. package/dist/src/ast/languageCapabilities.d.ts.map +1 -0
  20. package/dist/src/ast/languageCapabilities.js +92 -0
  21. package/dist/src/ast/parseFile.d.ts +16 -0
  22. package/dist/src/ast/parseFile.d.ts.map +1 -0
  23. package/dist/src/ast/parseFile.js +65 -0
  24. package/dist/src/ast/parserRegistry.d.ts +39 -0
  25. package/dist/src/ast/parserRegistry.d.ts.map +1 -0
  26. package/dist/src/ast/parserRegistry.js +66 -0
  27. package/dist/src/buildSummary.d.ts +26 -0
  28. package/dist/src/buildSummary.d.ts.map +1 -0
  29. package/dist/src/buildSummary.js +193 -0
  30. package/dist/src/businessCoverage.d.ts +68 -0
  31. package/dist/src/businessCoverage.d.ts.map +1 -0
  32. package/dist/src/businessCoverage.js +290 -0
  33. package/dist/src/compatibilityCoverage.d.ts +83 -0
  34. package/dist/src/compatibilityCoverage.d.ts.map +1 -0
  35. package/dist/src/compatibilityCoverage.js +501 -0
  36. package/dist/src/config/defaultConfig.d.ts +9 -0
  37. package/dist/src/config/defaultConfig.d.ts.map +1 -0
  38. package/dist/src/config/defaultConfig.js +97 -0
  39. package/dist/src/config/index.d.ts +12 -0
  40. package/dist/src/config/index.d.ts.map +1 -0
  41. package/dist/src/config/index.js +37 -0
  42. package/dist/src/config/loadConfig.d.ts +29 -0
  43. package/dist/src/config/loadConfig.d.ts.map +1 -0
  44. package/dist/src/config/loadConfig.js +135 -0
  45. package/dist/src/config/mergeConfig.d.ts +15 -0
  46. package/dist/src/config/mergeConfig.d.ts.map +1 -0
  47. package/dist/src/config/mergeConfig.js +57 -0
  48. package/dist/src/config/schema.d.ts +15 -0
  49. package/dist/src/config/schema.d.ts.map +1 -0
  50. package/dist/src/config/schema.js +30 -0
  51. package/dist/src/config/types.d.ts +175 -0
  52. package/dist/src/config/types.d.ts.map +1 -0
  53. package/dist/src/config/types.js +9 -0
  54. package/dist/src/config/validateConfig.d.ts +22 -0
  55. package/dist/src/config/validateConfig.d.ts.map +1 -0
  56. package/dist/src/config/validateConfig.js +171 -0
  57. package/dist/src/config.d.ts +168 -0
  58. package/dist/src/config.d.ts.map +1 -0
  59. package/dist/src/config.js +204 -0
  60. package/dist/src/coverage/deep-analysis/callGraph.d.ts +67 -0
  61. package/dist/src/coverage/deep-analysis/callGraph.d.ts.map +1 -0
  62. package/dist/src/coverage/deep-analysis/callGraph.js +275 -0
  63. package/dist/src/coverage/deep-analysis/deepEndpointResolver.d.ts +23 -0
  64. package/dist/src/coverage/deep-analysis/deepEndpointResolver.d.ts.map +1 -0
  65. package/dist/src/coverage/deep-analysis/deepEndpointResolver.js +394 -0
  66. package/dist/src/coverage/deep-analysis/index.d.ts +17 -0
  67. package/dist/src/coverage/deep-analysis/index.d.ts.map +1 -0
  68. package/dist/src/coverage/deep-analysis/index.js +63 -0
  69. package/dist/src/coverage/deep-analysis/resolveAssertions.d.ts +60 -0
  70. package/dist/src/coverage/deep-analysis/resolveAssertions.d.ts.map +1 -0
  71. package/dist/src/coverage/deep-analysis/resolveAssertions.js +121 -0
  72. package/dist/src/coverage/deep-analysis/resolveConstants.d.ts +36 -0
  73. package/dist/src/coverage/deep-analysis/resolveConstants.d.ts.map +1 -0
  74. package/dist/src/coverage/deep-analysis/resolveConstants.js +92 -0
  75. package/dist/src/coverage/deep-analysis/resolveEnums.d.ts +55 -0
  76. package/dist/src/coverage/deep-analysis/resolveEnums.d.ts.map +1 -0
  77. package/dist/src/coverage/deep-analysis/resolveEnums.js +152 -0
  78. package/dist/src/coverage/deep-analysis/resolveMethodChains.d.ts +70 -0
  79. package/dist/src/coverage/deep-analysis/resolveMethodChains.d.ts.map +1 -0
  80. package/dist/src/coverage/deep-analysis/resolveMethodChains.js +152 -0
  81. package/dist/src/coverage/deep-analysis/resolvePaths.d.ts +80 -0
  82. package/dist/src/coverage/deep-analysis/resolvePaths.d.ts.map +1 -0
  83. package/dist/src/coverage/deep-analysis/resolvePaths.js +216 -0
  84. package/dist/src/coverage/deep-analysis/resolveRequestWrappers.d.ts +71 -0
  85. package/dist/src/coverage/deep-analysis/resolveRequestWrappers.d.ts.map +1 -0
  86. package/dist/src/coverage/deep-analysis/resolveRequestWrappers.js +226 -0
  87. package/dist/src/coverage/deep-analysis/symbolTable.d.ts +58 -0
  88. package/dist/src/coverage/deep-analysis/symbolTable.d.ts.map +1 -0
  89. package/dist/src/coverage/deep-analysis/symbolTable.js +230 -0
  90. package/dist/src/coverage/deep-analysis/types.d.ts +122 -0
  91. package/dist/src/coverage/deep-analysis/types.d.ts.map +1 -0
  92. package/dist/src/coverage/deep-analysis/types.js +21 -0
  93. package/dist/src/discovery/fileClassifier.d.ts +50 -0
  94. package/dist/src/discovery/fileClassifier.d.ts.map +1 -0
  95. package/dist/src/discovery/fileClassifier.js +238 -0
  96. package/dist/src/discovery/projectDiscovery.d.ts +66 -0
  97. package/dist/src/discovery/projectDiscovery.d.ts.map +1 -0
  98. package/dist/src/discovery/projectDiscovery.js +287 -0
  99. package/dist/src/endpointCoverage.d.ts +70 -0
  100. package/dist/src/endpointCoverage.d.ts.map +1 -0
  101. package/dist/src/endpointCoverage.js +381 -0
  102. package/dist/src/errorCoverage.d.ts +93 -0
  103. package/dist/src/errorCoverage.d.ts.map +1 -0
  104. package/dist/src/errorCoverage.js +698 -0
  105. package/dist/src/index.d.ts +3 -0
  106. package/dist/src/index.d.ts.map +1 -0
  107. package/dist/src/index.js +1441 -0
  108. package/dist/src/inference/businessRuleInference.d.ts +63 -0
  109. package/dist/src/inference/businessRuleInference.d.ts.map +1 -0
  110. package/dist/src/inference/businessRuleInference.js +268 -0
  111. package/dist/src/inference/integrationFlowInference.d.ts +56 -0
  112. package/dist/src/inference/integrationFlowInference.d.ts.map +1 -0
  113. package/dist/src/inference/integrationFlowInference.js +266 -0
  114. package/dist/src/integrationCoverage.d.ts +72 -0
  115. package/dist/src/integrationCoverage.d.ts.map +1 -0
  116. package/dist/src/integrationCoverage.js +317 -0
  117. package/dist/src/intelligence/index.d.ts +20 -0
  118. package/dist/src/intelligence/index.d.ts.map +1 -0
  119. package/dist/src/intelligence/index.js +105 -0
  120. package/dist/src/intelligence/linkageEngine.d.ts +20 -0
  121. package/dist/src/intelligence/linkageEngine.d.ts.map +1 -0
  122. package/dist/src/intelligence/linkageEngine.js +522 -0
  123. package/dist/src/intelligence/markdownReporter.d.ts +12 -0
  124. package/dist/src/intelligence/markdownReporter.d.ts.map +1 -0
  125. package/dist/src/intelligence/markdownReporter.js +265 -0
  126. package/dist/src/intelligence/riskScoring.d.ts +53 -0
  127. package/dist/src/intelligence/riskScoring.d.ts.map +1 -0
  128. package/dist/src/intelligence/riskScoring.js +181 -0
  129. package/dist/src/intelligence/types.d.ts +121 -0
  130. package/dist/src/intelligence/types.d.ts.map +1 -0
  131. package/dist/src/intelligence/types.js +8 -0
  132. package/dist/src/languageDetection.d.ts +100 -0
  133. package/dist/src/languageDetection.d.ts.map +1 -0
  134. package/dist/src/languageDetection.js +349 -0
  135. package/dist/src/languages/java/index.d.ts +16 -0
  136. package/dist/src/languages/java/index.d.ts.map +1 -0
  137. package/dist/src/languages/java/index.js +103 -0
  138. package/dist/src/languages/java/parser.d.ts +7 -0
  139. package/dist/src/languages/java/parser.d.ts.map +1 -0
  140. package/dist/src/languages/java/parser.js +50 -0
  141. package/dist/src/languages/java/semanticBuilder.d.ts +21 -0
  142. package/dist/src/languages/java/semanticBuilder.d.ts.map +1 -0
  143. package/dist/src/languages/java/semanticBuilder.js +358 -0
  144. package/dist/src/languages/javascript/annotationExtractor.d.ts +20 -0
  145. package/dist/src/languages/javascript/annotationExtractor.d.ts.map +1 -0
  146. package/dist/src/languages/javascript/annotationExtractor.js +94 -0
  147. package/dist/src/languages/javascript/assertionResolver.d.ts +18 -0
  148. package/dist/src/languages/javascript/assertionResolver.d.ts.map +1 -0
  149. package/dist/src/languages/javascript/assertionResolver.js +150 -0
  150. package/dist/src/languages/javascript/callResolver.d.ts +23 -0
  151. package/dist/src/languages/javascript/callResolver.d.ts.map +1 -0
  152. package/dist/src/languages/javascript/callResolver.js +236 -0
  153. package/dist/src/languages/javascript/httpInteractionExtractor.d.ts +23 -0
  154. package/dist/src/languages/javascript/httpInteractionExtractor.d.ts.map +1 -0
  155. package/dist/src/languages/javascript/httpInteractionExtractor.js +205 -0
  156. package/dist/src/languages/javascript/index.d.ts +20 -0
  157. package/dist/src/languages/javascript/index.d.ts.map +1 -0
  158. package/dist/src/languages/javascript/index.js +136 -0
  159. package/dist/src/languages/javascript/parser.d.ts +14 -0
  160. package/dist/src/languages/javascript/parser.d.ts.map +1 -0
  161. package/dist/src/languages/javascript/parser.js +38 -0
  162. package/dist/src/languages/javascript/symbolResolver.d.ts +31 -0
  163. package/dist/src/languages/javascript/symbolResolver.d.ts.map +1 -0
  164. package/dist/src/languages/javascript/symbolResolver.js +183 -0
  165. package/dist/src/languages/kotlin/index.d.ts +16 -0
  166. package/dist/src/languages/kotlin/index.d.ts.map +1 -0
  167. package/dist/src/languages/kotlin/index.js +151 -0
  168. package/dist/src/languages/kotlin/parser.d.ts +11 -0
  169. package/dist/src/languages/kotlin/parser.d.ts.map +1 -0
  170. package/dist/src/languages/kotlin/parser.js +74 -0
  171. package/dist/src/languages/python/index.d.ts +15 -0
  172. package/dist/src/languages/python/index.d.ts.map +1 -0
  173. package/dist/src/languages/python/index.js +293 -0
  174. package/dist/src/languages/ruby/index.d.ts +15 -0
  175. package/dist/src/languages/ruby/index.d.ts.map +1 -0
  176. package/dist/src/languages/ruby/index.js +274 -0
  177. package/dist/src/languages/shared/treeSitterUtils.d.ts +43 -0
  178. package/dist/src/languages/shared/treeSitterUtils.d.ts.map +1 -0
  179. package/dist/src/languages/shared/treeSitterUtils.js +100 -0
  180. package/dist/src/languages/typescript/index.d.ts +14 -0
  181. package/dist/src/languages/typescript/index.d.ts.map +1 -0
  182. package/dist/src/languages/typescript/index.js +25 -0
  183. package/dist/src/lib/index.d.ts +228 -0
  184. package/dist/src/lib/index.d.ts.map +1 -0
  185. package/dist/src/lib/index.js +486 -0
  186. package/dist/src/mcp/client/index.d.ts +37 -0
  187. package/dist/src/mcp/client/index.d.ts.map +1 -0
  188. package/dist/src/mcp/client/index.js +235 -0
  189. package/dist/src/mcp/config.d.ts +50 -0
  190. package/dist/src/mcp/config.d.ts.map +1 -0
  191. package/dist/src/mcp/config.js +125 -0
  192. package/dist/src/mcp/events.d.ts +24 -0
  193. package/dist/src/mcp/events.d.ts.map +1 -0
  194. package/dist/src/mcp/events.js +48 -0
  195. package/dist/src/mcp/fallback/index.d.ts +50 -0
  196. package/dist/src/mcp/fallback/index.d.ts.map +1 -0
  197. package/dist/src/mcp/fallback/index.js +216 -0
  198. package/dist/src/mcp/index.d.ts +67 -0
  199. package/dist/src/mcp/index.d.ts.map +1 -0
  200. package/dist/src/mcp/index.js +212 -0
  201. package/dist/src/mcp/normalizer.d.ts +21 -0
  202. package/dist/src/mcp/normalizer.d.ts.map +1 -0
  203. package/dist/src/mcp/normalizer.js +99 -0
  204. package/dist/src/mcp/prompts/index.d.ts +86 -0
  205. package/dist/src/mcp/prompts/index.d.ts.map +1 -0
  206. package/dist/src/mcp/prompts/index.js +304 -0
  207. package/dist/src/mcp/templates/index.d.ts +35 -0
  208. package/dist/src/mcp/templates/index.d.ts.map +1 -0
  209. package/dist/src/mcp/templates/index.js +143 -0
  210. package/dist/src/mcp/testing/mock-server/index.d.ts +47 -0
  211. package/dist/src/mcp/testing/mock-server/index.d.ts.map +1 -0
  212. package/dist/src/mcp/testing/mock-server/index.js +157 -0
  213. package/dist/src/mcp/types.d.ts +127 -0
  214. package/dist/src/mcp/types.d.ts.map +1 -0
  215. package/dist/src/mcp/types.js +8 -0
  216. package/dist/src/observability.d.ts +138 -0
  217. package/dist/src/observability.d.ts.map +1 -0
  218. package/dist/src/observability.js +519 -0
  219. package/dist/src/parameterCoverage.d.ts +75 -0
  220. package/dist/src/parameterCoverage.d.ts.map +1 -0
  221. package/dist/src/parameterCoverage.js +629 -0
  222. package/dist/src/perfResilienceCoverage.d.ts +155 -0
  223. package/dist/src/perfResilienceCoverage.d.ts.map +1 -0
  224. package/dist/src/perfResilienceCoverage.js +670 -0
  225. package/dist/src/pluginLoader.d.ts +51 -0
  226. package/dist/src/pluginLoader.d.ts.map +1 -0
  227. package/dist/src/pluginLoader.js +72 -0
  228. package/dist/src/publishing.d.ts +63 -0
  229. package/dist/src/publishing.d.ts.map +1 -0
  230. package/dist/src/publishing.js +379 -0
  231. package/dist/src/qualityGate.d.ts +58 -0
  232. package/dist/src/qualityGate.d.ts.map +1 -0
  233. package/dist/src/qualityGate.js +118 -0
  234. package/dist/src/reporting.d.ts +41 -0
  235. package/dist/src/reporting.d.ts.map +1 -0
  236. package/dist/src/reporting.js +278 -0
  237. package/dist/src/screenshots.d.ts +71 -0
  238. package/dist/src/screenshots.d.ts.map +1 -0
  239. package/dist/src/screenshots.js +141 -0
  240. package/dist/src/security/gate/index.d.ts +11 -0
  241. package/dist/src/security/gate/index.d.ts.map +1 -0
  242. package/dist/src/security/gate/index.js +65 -0
  243. package/dist/src/security/index.d.ts +30 -0
  244. package/dist/src/security/index.d.ts.map +1 -0
  245. package/dist/src/security/index.js +342 -0
  246. package/dist/src/security/normalizers/semgrep.d.ts +10 -0
  247. package/dist/src/security/normalizers/semgrep.d.ts.map +1 -0
  248. package/dist/src/security/normalizers/semgrep.js +104 -0
  249. package/dist/src/security/normalizers/trivy.d.ts +10 -0
  250. package/dist/src/security/normalizers/trivy.d.ts.map +1 -0
  251. package/dist/src/security/normalizers/trivy.js +78 -0
  252. package/dist/src/security/normalizers/zap.d.ts +10 -0
  253. package/dist/src/security/normalizers/zap.d.ts.map +1 -0
  254. package/dist/src/security/normalizers/zap.js +104 -0
  255. package/dist/src/security/scanners/semgrep.d.ts +6 -0
  256. package/dist/src/security/scanners/semgrep.d.ts.map +1 -0
  257. package/dist/src/security/scanners/semgrep.js +125 -0
  258. package/dist/src/security/scanners/trivy.d.ts +6 -0
  259. package/dist/src/security/scanners/trivy.d.ts.map +1 -0
  260. package/dist/src/security/scanners/trivy.js +115 -0
  261. package/dist/src/security/scanners/zap.d.ts +6 -0
  262. package/dist/src/security/scanners/zap.d.ts.map +1 -0
  263. package/dist/src/security/scanners/zap.js +135 -0
  264. package/dist/src/security/types.d.ts +146 -0
  265. package/dist/src/security/types.d.ts.map +1 -0
  266. package/dist/src/security/types.js +6 -0
  267. package/dist/src/securityCoverage.d.ts +116 -0
  268. package/dist/src/securityCoverage.d.ts.map +1 -0
  269. package/dist/src/securityCoverage.js +725 -0
  270. package/dist/src/summary/buildSummary.d.ts +28 -0
  271. package/dist/src/summary/buildSummary.d.ts.map +1 -0
  272. package/dist/src/summary/buildSummary.js +257 -0
  273. package/dist/src/summary/evaluateMetrics.d.ts +31 -0
  274. package/dist/src/summary/evaluateMetrics.d.ts.map +1 -0
  275. package/dist/src/summary/evaluateMetrics.js +118 -0
  276. package/dist/src/summary/index.d.ts +10 -0
  277. package/dist/src/summary/index.d.ts.map +1 -0
  278. package/dist/src/summary/index.js +22 -0
  279. package/dist/src/summary/markdownRenderer.d.ts +139 -0
  280. package/dist/src/summary/markdownRenderer.d.ts.map +1 -0
  281. package/dist/src/summary/markdownRenderer.js +459 -0
  282. package/dist/src/summary/prSummary.d.ts +24 -0
  283. package/dist/src/summary/prSummary.d.ts.map +1 -0
  284. package/dist/src/summary/prSummary.js +233 -0
  285. package/dist/src/summary/summaryTypes.d.ts +35 -0
  286. package/dist/src/summary/summaryTypes.d.ts.map +1 -0
  287. package/dist/src/summary/summaryTypes.js +27 -0
  288. package/package.json +84 -0
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ /**
3
+ * MCP integration – fallback AI interpreter.
4
+ *
5
+ * When MCP is disabled or unavailable this module generates a deterministic,
6
+ * rule-based NormalizedAiAnalysis so that pipelines never break.
7
+ *
8
+ * Outputs are fully deterministic given the same inputs, making them suitable
9
+ * for snapshot testing.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.generateFallbackCoverageAnalysis = generateFallbackCoverageAnalysis;
13
+ exports.generateFallbackSecurityAnalysis = generateFallbackSecurityAnalysis;
14
+ exports.generateFallbackIntelligenceAnalysis = generateFallbackIntelligenceAnalysis;
15
+ exports.generateFallbackAnalysis = generateFallbackAnalysis;
16
+ /**
17
+ * Generate a deterministic AI-style coverage summary without MCP.
18
+ */
19
+ function generateFallbackCoverageAnalysis(input) {
20
+ var _a;
21
+ const failed = (_a = input.failedCategories) !== null && _a !== void 0 ? _a : [];
22
+ const allPass = failed.length === 0;
23
+ const summary = allPass
24
+ ? `All ${input.results.length} coverage categories meet or exceed their configured thresholds. ` +
25
+ `The overall quality gate has passed.`
26
+ : `${failed.length} of ${input.results.length} coverage categories failed their quality gate. ` +
27
+ `Immediate attention is required for: ${failed.join(', ')}.`;
28
+ const keyFindings = input.results.map((r) => {
29
+ var _a;
30
+ const threshold = (_a = input.thresholds) === null || _a === void 0 ? void 0 : _a[r.type];
31
+ const status = threshold !== undefined
32
+ ? r.coveragePercent >= threshold ? 'meets threshold' : 'below threshold'
33
+ : 'no threshold configured';
34
+ return `${r.type}: ${r.coveragePercent.toFixed(1)}% (${status})`;
35
+ });
36
+ const topRisks = failed.map((cat) => {
37
+ var _a, _b;
38
+ const r = input.results.find((x) => x.type === cat);
39
+ const threshold = (_b = (_a = input.thresholds) === null || _a === void 0 ? void 0 : _a[cat]) !== null && _b !== void 0 ? _b : 0;
40
+ if (!r)
41
+ return `${cat}: gate failed`;
42
+ const gap = threshold - r.coveragePercent;
43
+ return `${cat} coverage is ${gap.toFixed(1)}% below the required threshold`;
44
+ });
45
+ const missingCoverageAreas = input.results
46
+ .filter((r) => r.totalItems > r.coveredItems)
47
+ .map((r) => `${r.type}: ${r.totalItems - r.coveredItems} uncovered item(s)`);
48
+ const recommendedActions = allPass
49
+ ? [
50
+ 'All gates passed — consider raising thresholds to enforce stricter coverage.',
51
+ 'Review uncovered items and add targeted tests to reach 100%.',
52
+ ]
53
+ : [
54
+ ...failed.map((cat) => `Add tests to improve ${cat} coverage above the configured threshold.`),
55
+ 'Re-run the coverage analysis after adding tests.',
56
+ 'Consider adding coverage for critical paths first.',
57
+ ];
58
+ return {
59
+ summary,
60
+ keyFindings,
61
+ topRisks,
62
+ recommendedActions,
63
+ missingCoverageAreas,
64
+ confidence: 'high',
65
+ isFallback: true,
66
+ category: 'coverage',
67
+ };
68
+ }
69
+ /**
70
+ * Generate a deterministic AI-style security analysis without MCP.
71
+ */
72
+ function generateFallbackSecurityAnalysis(input) {
73
+ var _a, _b, _c;
74
+ const s = input.scanSummary;
75
+ const criticalHigh = s.bySeverity.CRITICAL + s.bySeverity.HIGH;
76
+ const gatePassed = (_b = (_a = s.gateResult) === null || _a === void 0 ? void 0 : _a.passed) !== null && _b !== void 0 ? _b : true;
77
+ const summary = gatePassed
78
+ ? `Security scan completed with ${s.totalFindings} finding(s). ` +
79
+ `No critical or high findings exceed gate thresholds.`
80
+ : `Security gate FAILED. ${criticalHigh} critical/high severity finding(s) require ` +
81
+ `immediate remediation before this change can be merged.`;
82
+ const keyFindings = [
83
+ `Total findings: ${s.totalFindings}`,
84
+ `Critical: ${s.bySeverity.CRITICAL}`,
85
+ `High: ${s.bySeverity.HIGH}`,
86
+ `Medium: ${s.bySeverity.MEDIUM}`,
87
+ `Low: ${s.bySeverity.LOW}`,
88
+ `Scanners run: ${s.scannersRun.join(', ')}`,
89
+ ];
90
+ const topRisks = [];
91
+ if (s.bySeverity.CRITICAL > 0) {
92
+ topRisks.push(`${s.bySeverity.CRITICAL} CRITICAL finding(s) must be fixed immediately`);
93
+ }
94
+ if (s.bySeverity.HIGH > 0) {
95
+ topRisks.push(`${s.bySeverity.HIGH} HIGH finding(s) pose significant risk`);
96
+ }
97
+ if (s.bySeverity.MEDIUM > 0) {
98
+ topRisks.push(`${s.bySeverity.MEDIUM} MEDIUM finding(s) should be addressed soon`);
99
+ }
100
+ const likelyRootCauses = [];
101
+ const cats = Object.entries((_c = s.byCategory) !== null && _c !== void 0 ? _c : {})
102
+ .filter(([, count]) => count > 0)
103
+ .map(([cat]) => cat);
104
+ if (cats.length > 0) {
105
+ likelyRootCauses.push(`Findings span categories: ${cats.join(', ')}`);
106
+ }
107
+ const recommendedActions = gatePassed
108
+ ? [
109
+ 'Review all remaining findings and assign remediation owners.',
110
+ 'Consider tightening gate thresholds to catch more issues.',
111
+ ]
112
+ : [
113
+ 'Fix all CRITICAL and HIGH findings before merging.',
114
+ 'Re-run security scan to confirm fixes.',
115
+ 'Review scanner configurations to reduce false positives.',
116
+ ];
117
+ return {
118
+ summary,
119
+ keyFindings,
120
+ topRisks,
121
+ recommendedActions,
122
+ likelyRootCauses,
123
+ confidence: 'high',
124
+ isFallback: true,
125
+ category: 'security',
126
+ };
127
+ }
128
+ /**
129
+ * Generate a deterministic AI-style intelligence analysis without MCP.
130
+ */
131
+ function generateFallbackIntelligenceAnalysis(input) {
132
+ var _a, _b, _c;
133
+ const hasIssues = input.totalFindings > 0 || input.criticalUncoveredItems > 0;
134
+ const p0Count = (_a = input.recommendationsByPriority['P0']) !== null && _a !== void 0 ? _a : 0;
135
+ const p1Count = (_b = input.recommendationsByPriority['P1']) !== null && _b !== void 0 ? _b : 0;
136
+ const summary = hasIssues
137
+ ? `Coverage Intelligence identified ${input.totalFindings} functional finding(s) and ` +
138
+ `${input.totalRecommendations} missing test recommendation(s). ` +
139
+ `Maximum risk score: ${input.maxRiskScore}. ` +
140
+ (p0Count > 0 ? `${p0Count} P0 action(s) require immediate attention.` : '')
141
+ : `No functional findings detected. All analyzed coverage areas appear to be adequately tested.`;
142
+ const keyFindings = [
143
+ `Functional findings: ${input.totalFindings}`,
144
+ `Missing test recommendations: ${input.totalRecommendations}`,
145
+ `Max risk score: ${input.maxRiskScore} (avg: ${input.avgRiskScore})`,
146
+ `Critical uncovered items: ${input.criticalUncoveredItems}`,
147
+ `Unprotected security findings: ${input.unprotectedSecurityFindings}`,
148
+ ];
149
+ const topRisks = [];
150
+ if (p0Count > 0)
151
+ topRisks.push(`${p0Count} P0 recommendation(s) require urgent action`);
152
+ if (p1Count > 0)
153
+ topRisks.push(`${p1Count} P1 recommendation(s) should be addressed soon`);
154
+ if (input.unprotectedSecurityFindings > 0) {
155
+ topRisks.push(`${input.unprotectedSecurityFindings} security finding(s) lack test protection`);
156
+ }
157
+ if (input.criticalUncoveredItems > 0) {
158
+ topRisks.push(`${input.criticalUncoveredItems} critical flow(s) have zero test coverage`);
159
+ }
160
+ if (input.topRiskAreas && input.topRiskAreas.length > 0) {
161
+ topRisks.push(...input.topRiskAreas.slice(0, 3).map((a) => `High-risk area: ${a}`));
162
+ }
163
+ const missingCoverageAreas = [];
164
+ if (input.criticalUncoveredItems > 0) {
165
+ missingCoverageAreas.push(`${input.criticalUncoveredItems} critical endpoint(s)/flow(s) with no test coverage`);
166
+ }
167
+ if (input.unprotectedSecurityFindings > 0) {
168
+ missingCoverageAreas.push(`${input.unprotectedSecurityFindings} security finding(s) unprotected by tests`);
169
+ }
170
+ const frameworkHint = ((_c = input.frameworks) !== null && _c !== void 0 ? _c : []).length > 0
171
+ ? ` using ${(input.frameworks).slice(0, 2).join(' or ')}`
172
+ : '';
173
+ const recommendedActions = [];
174
+ if (p0Count > 0)
175
+ recommendedActions.push(`Address ${p0Count} P0 recommendation(s) immediately${frameworkHint}`);
176
+ if (p1Count > 0)
177
+ recommendedActions.push(`Schedule ${p1Count} P1 recommendation(s) for next sprint${frameworkHint}`);
178
+ if (input.unprotectedSecurityFindings > 0) {
179
+ recommendedActions.push('Add security-focused tests to cover unprotected scanner findings');
180
+ }
181
+ if (recommendedActions.length === 0) {
182
+ recommendedActions.push('Review intelligence report and schedule remaining recommendations');
183
+ }
184
+ recommendedActions.push('Re-run intelligence analysis after adding recommended tests');
185
+ return {
186
+ summary,
187
+ keyFindings,
188
+ topRisks,
189
+ recommendedActions,
190
+ missingCoverageAreas,
191
+ confidence: 'high',
192
+ isFallback: true,
193
+ category: 'intelligence',
194
+ };
195
+ }
196
+ // ─── Generic fallback ─────────────────────────────────────────────────────────
197
+ /**
198
+ * Generate a minimal deterministic AI analysis for any coverage category.
199
+ */
200
+ function generateFallbackAnalysis(category, coveragePercent, threshold) {
201
+ const gatePassed = threshold === undefined || coveragePercent >= threshold;
202
+ const summary = gatePassed
203
+ ? `${category} analysis passed with ${coveragePercent.toFixed(1)}% coverage.`
204
+ : `${category} coverage is ${coveragePercent.toFixed(1)}%, below the required ${threshold.toFixed(1)}%.`;
205
+ return {
206
+ summary,
207
+ keyFindings: [`Coverage: ${coveragePercent.toFixed(1)}%`],
208
+ topRisks: gatePassed ? [] : [`Coverage gap of ${(threshold - coveragePercent).toFixed(1)}%`],
209
+ recommendedActions: gatePassed
210
+ ? ['Maintain current coverage level.']
211
+ : ['Add tests to close the coverage gap.'],
212
+ confidence: 'high',
213
+ isFallback: true,
214
+ category,
215
+ };
216
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * MCP integration – public API.
3
+ *
4
+ * This is the single entry point for all MCP features. Consumers import from
5
+ * here rather than from individual sub-modules.
6
+ *
7
+ * Usage example:
8
+ *
9
+ * import { McpIntegration } from './mcp';
10
+ *
11
+ * const mcp = new McpIntegration(config.mcp ?? {});
12
+ * const analysis = await mcp.analyzeCoverage({ results, thresholds, gatePassed });
13
+ * const md = mcp.renderMarkdown(analysis, 'coverage');
14
+ */
15
+ import type { McpConfig, NormalizedAiAnalysis, AnalysisEvent } from './types';
16
+ import { type CoverageSummaryPromptInput, type SecurityScanPromptInput, type PerformancePromptInput, type CompatibilityPromptInput, type CiSummaryPromptInput, type IntelligencePromptInput } from './prompts';
17
+ import { type AiPanelData } from './templates';
18
+ import { AnalysisEventStream } from './events';
19
+ export type { McpConfig, McpServerConfig, McpServersConfig, McpRetryPolicy, McpTransport, AnalysisEvent, AnalysisEventType, McpPromptRequest, McpRawResponse, NormalizedAiAnalysis, AiConfidence, TemplateContext, } from './types';
20
+ export type { CoverageSummaryPromptInput, SecurityScanPromptInput, PerformancePromptInput, CompatibilityPromptInput, CiSummaryPromptInput, IntelligencePromptInput, } from './prompts';
21
+ export type { AiPanelData } from './templates';
22
+ export { buildCoverageSummaryPrompt, buildSecurityScanPrompt, buildPerformancePrompt, buildCompatibilityPrompt, buildCiSummaryPrompt, buildIntelligencePrompt, } from './prompts';
23
+ export { normalizeMcpResponse } from './normalizer';
24
+ export { renderAiAnalysisMarkdown, renderAiAnalysisHtml, buildAiPanelData, } from './templates';
25
+ export { generateFallbackCoverageAnalysis, generateFallbackSecurityAnalysis, generateFallbackAnalysis, generateFallbackIntelligenceAnalysis, } from './fallback';
26
+ export { AnalysisEventStream, createNoOpStream } from './events';
27
+ export { isMcpEnabledFor, resolveServerConfig, validateTransport, validateServerUrl, validatePayloadSize, redactSecrets, REDACTED_KEYS, MCP_DEFAULT_TIMEOUT_MS, MCP_DEFAULT_MAX_PAYLOAD_BYTES, MCP_DEFAULT_TRANSPORT, MCP_ALLOWED_TRANSPORTS, } from './config';
28
+ export { McpClient } from './client';
29
+ /**
30
+ * High-level facade that wires together the MCP client, prompts, normalizer,
31
+ * templates, and fallback interpreter.
32
+ *
33
+ * Instantiate with the `mcp` block from `coverage.config.json`.
34
+ */
35
+ export declare class McpIntegration {
36
+ private readonly config;
37
+ private readonly client;
38
+ private readonly eventStream;
39
+ constructor(config: McpConfig);
40
+ /** Access the real-time event stream */
41
+ get events(): AnalysisEventStream;
42
+ /** Analyze coverage results via MCP (or fallback if unavailable) */
43
+ analyzeCoverage(input: CoverageSummaryPromptInput): Promise<NormalizedAiAnalysis>;
44
+ /** Analyze security scan results via MCP (or fallback if unavailable) */
45
+ analyzeSecurity(input: SecurityScanPromptInput): Promise<NormalizedAiAnalysis>;
46
+ /** Analyze performance / resilience coverage via MCP (or fallback) */
47
+ analyzePerformance(input: PerformancePromptInput): Promise<NormalizedAiAnalysis>;
48
+ /** Analyze compatibility / contract coverage via MCP (or fallback) */
49
+ analyzeCompatibility(input: CompatibilityPromptInput): Promise<NormalizedAiAnalysis>;
50
+ /** Generate a CI/PR summary via MCP (or fallback) */
51
+ analyzeCiSummary(input: CiSummaryPromptInput): Promise<NormalizedAiAnalysis>;
52
+ /** Analyze coverage intelligence results via MCP (or fallback if unavailable) */
53
+ analyzeIntelligence(input: IntelligencePromptInput): Promise<NormalizedAiAnalysis>;
54
+ /** Render a NormalizedAiAnalysis as Markdown */
55
+ renderMarkdown(analysis: NormalizedAiAnalysis, category: string, categoryTitle?: string): string;
56
+ /** Render a NormalizedAiAnalysis as HTML */
57
+ renderHtml(analysis: NormalizedAiAnalysis, category: string, categoryTitle?: string): string;
58
+ /** Build dashboard panel data from a NormalizedAiAnalysis */
59
+ buildPanelData(analysis: NormalizedAiAnalysis): AiPanelData;
60
+ /** Whether MCP is globally enabled */
61
+ isEnabled(): boolean;
62
+ /** Whether MCP is enabled for a specific server/category */
63
+ isEnabledFor(serverName: string): boolean;
64
+ /** Collect all buffered events */
65
+ getEvents(): ReadonlyArray<AnalysisEvent>;
66
+ }
67
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG9E,OAAO,EAOL,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC7B,MAAM,WAAW,CAAC;AAEnB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAOrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAI/C,YAAY,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gCAAgC,EAChC,gCAAgC,EAChC,wBAAwB,EACxB,oCAAoC,GACrC,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,6BAA6B,EAC7B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAIrC;;;;;GAKG;AACH,qBAAa,cAAc;IAIb,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;gBAErB,MAAM,EAAE,SAAS;IAO9C,wCAAwC;IACxC,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IAID,oEAAoE;IAC9D,eAAe,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAoBvF,yEAAyE;IACnE,eAAe,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAcpF,sEAAsE;IAChE,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgBtF,sEAAsE;IAChE,oBAAoB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAgB1F,qDAAqD;IAC/C,gBAAgB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiBlF,iFAAiF;IAC3E,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0BxF,gDAAgD;IAChD,cAAc,CACZ,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM;IAST,4CAA4C;IAC5C,UAAU,CACR,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM;IAST,6DAA6D;IAC7D,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,WAAW;IAM3D,sCAAsC;IACtC,SAAS,IAAI,OAAO;IAIpB,4DAA4D;IAC5D,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIzC,kCAAkC;IAClC,SAAS,IAAI,aAAa,CAAC,aAAa,CAAC;CAG1C"}
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ /**
3
+ * MCP integration – public API.
4
+ *
5
+ * This is the single entry point for all MCP features. Consumers import from
6
+ * here rather than from individual sub-modules.
7
+ *
8
+ * Usage example:
9
+ *
10
+ * import { McpIntegration } from './mcp';
11
+ *
12
+ * const mcp = new McpIntegration(config.mcp ?? {});
13
+ * const analysis = await mcp.analyzeCoverage({ results, thresholds, gatePassed });
14
+ * const md = mcp.renderMarkdown(analysis, 'coverage');
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.McpIntegration = exports.McpClient = exports.MCP_ALLOWED_TRANSPORTS = exports.MCP_DEFAULT_TRANSPORT = exports.MCP_DEFAULT_MAX_PAYLOAD_BYTES = exports.MCP_DEFAULT_TIMEOUT_MS = exports.REDACTED_KEYS = exports.redactSecrets = exports.validatePayloadSize = exports.validateServerUrl = exports.validateTransport = exports.resolveServerConfig = exports.isMcpEnabledFor = exports.createNoOpStream = exports.AnalysisEventStream = exports.generateFallbackIntelligenceAnalysis = exports.generateFallbackAnalysis = exports.generateFallbackSecurityAnalysis = exports.generateFallbackCoverageAnalysis = exports.buildAiPanelData = exports.renderAiAnalysisHtml = exports.renderAiAnalysisMarkdown = exports.normalizeMcpResponse = exports.buildIntelligencePrompt = exports.buildCiSummaryPrompt = exports.buildCompatibilityPrompt = exports.buildPerformancePrompt = exports.buildSecurityScanPrompt = exports.buildCoverageSummaryPrompt = void 0;
18
+ const config_1 = require("./config");
19
+ const client_1 = require("./client");
20
+ const prompts_1 = require("./prompts");
21
+ const normalizer_1 = require("./normalizer");
22
+ const templates_1 = require("./templates");
23
+ const fallback_1 = require("./fallback");
24
+ const events_1 = require("./events");
25
+ var prompts_2 = require("./prompts");
26
+ Object.defineProperty(exports, "buildCoverageSummaryPrompt", { enumerable: true, get: function () { return prompts_2.buildCoverageSummaryPrompt; } });
27
+ Object.defineProperty(exports, "buildSecurityScanPrompt", { enumerable: true, get: function () { return prompts_2.buildSecurityScanPrompt; } });
28
+ Object.defineProperty(exports, "buildPerformancePrompt", { enumerable: true, get: function () { return prompts_2.buildPerformancePrompt; } });
29
+ Object.defineProperty(exports, "buildCompatibilityPrompt", { enumerable: true, get: function () { return prompts_2.buildCompatibilityPrompt; } });
30
+ Object.defineProperty(exports, "buildCiSummaryPrompt", { enumerable: true, get: function () { return prompts_2.buildCiSummaryPrompt; } });
31
+ Object.defineProperty(exports, "buildIntelligencePrompt", { enumerable: true, get: function () { return prompts_2.buildIntelligencePrompt; } });
32
+ var normalizer_2 = require("./normalizer");
33
+ Object.defineProperty(exports, "normalizeMcpResponse", { enumerable: true, get: function () { return normalizer_2.normalizeMcpResponse; } });
34
+ var templates_2 = require("./templates");
35
+ Object.defineProperty(exports, "renderAiAnalysisMarkdown", { enumerable: true, get: function () { return templates_2.renderAiAnalysisMarkdown; } });
36
+ Object.defineProperty(exports, "renderAiAnalysisHtml", { enumerable: true, get: function () { return templates_2.renderAiAnalysisHtml; } });
37
+ Object.defineProperty(exports, "buildAiPanelData", { enumerable: true, get: function () { return templates_2.buildAiPanelData; } });
38
+ var fallback_2 = require("./fallback");
39
+ Object.defineProperty(exports, "generateFallbackCoverageAnalysis", { enumerable: true, get: function () { return fallback_2.generateFallbackCoverageAnalysis; } });
40
+ Object.defineProperty(exports, "generateFallbackSecurityAnalysis", { enumerable: true, get: function () { return fallback_2.generateFallbackSecurityAnalysis; } });
41
+ Object.defineProperty(exports, "generateFallbackAnalysis", { enumerable: true, get: function () { return fallback_2.generateFallbackAnalysis; } });
42
+ Object.defineProperty(exports, "generateFallbackIntelligenceAnalysis", { enumerable: true, get: function () { return fallback_2.generateFallbackIntelligenceAnalysis; } });
43
+ var events_2 = require("./events");
44
+ Object.defineProperty(exports, "AnalysisEventStream", { enumerable: true, get: function () { return events_2.AnalysisEventStream; } });
45
+ Object.defineProperty(exports, "createNoOpStream", { enumerable: true, get: function () { return events_2.createNoOpStream; } });
46
+ var config_2 = require("./config");
47
+ Object.defineProperty(exports, "isMcpEnabledFor", { enumerable: true, get: function () { return config_2.isMcpEnabledFor; } });
48
+ Object.defineProperty(exports, "resolveServerConfig", { enumerable: true, get: function () { return config_2.resolveServerConfig; } });
49
+ Object.defineProperty(exports, "validateTransport", { enumerable: true, get: function () { return config_2.validateTransport; } });
50
+ Object.defineProperty(exports, "validateServerUrl", { enumerable: true, get: function () { return config_2.validateServerUrl; } });
51
+ Object.defineProperty(exports, "validatePayloadSize", { enumerable: true, get: function () { return config_2.validatePayloadSize; } });
52
+ Object.defineProperty(exports, "redactSecrets", { enumerable: true, get: function () { return config_2.redactSecrets; } });
53
+ Object.defineProperty(exports, "REDACTED_KEYS", { enumerable: true, get: function () { return config_2.REDACTED_KEYS; } });
54
+ Object.defineProperty(exports, "MCP_DEFAULT_TIMEOUT_MS", { enumerable: true, get: function () { return config_2.MCP_DEFAULT_TIMEOUT_MS; } });
55
+ Object.defineProperty(exports, "MCP_DEFAULT_MAX_PAYLOAD_BYTES", { enumerable: true, get: function () { return config_2.MCP_DEFAULT_MAX_PAYLOAD_BYTES; } });
56
+ Object.defineProperty(exports, "MCP_DEFAULT_TRANSPORT", { enumerable: true, get: function () { return config_2.MCP_DEFAULT_TRANSPORT; } });
57
+ Object.defineProperty(exports, "MCP_ALLOWED_TRANSPORTS", { enumerable: true, get: function () { return config_2.MCP_ALLOWED_TRANSPORTS; } });
58
+ var client_2 = require("./client");
59
+ Object.defineProperty(exports, "McpClient", { enumerable: true, get: function () { return client_2.McpClient; } });
60
+ // ─── McpIntegration facade ────────────────────────────────────────────────────
61
+ /**
62
+ * High-level facade that wires together the MCP client, prompts, normalizer,
63
+ * templates, and fallback interpreter.
64
+ *
65
+ * Instantiate with the `mcp` block from `coverage.config.json`.
66
+ */
67
+ class McpIntegration {
68
+ constructor(config) {
69
+ this.config = config;
70
+ this.client = new client_1.McpClient(config);
71
+ this.eventStream = new events_1.AnalysisEventStream();
72
+ }
73
+ // ─── Event stream ───────────────────────────────────────────────────────────
74
+ /** Access the real-time event stream */
75
+ get events() {
76
+ return this.eventStream;
77
+ }
78
+ // ─── Analysis methods ───────────────────────────────────────────────────────
79
+ /** Analyze coverage results via MCP (or fallback if unavailable) */
80
+ async analyzeCoverage(input) {
81
+ if (!(0, config_1.isMcpEnabledFor)(this.config, 'coverageSummary')) {
82
+ const result = (0, fallback_1.generateFallbackCoverageAnalysis)({
83
+ results: input.results,
84
+ thresholds: input.thresholds,
85
+ gatePassed: input.gatePassed,
86
+ failedCategories: input.failedCategories,
87
+ });
88
+ return result;
89
+ }
90
+ const request = (0, prompts_1.buildCoverageSummaryPrompt)(input);
91
+ request.events = [...this.eventStream.getEvents()];
92
+ const raw = await this.client.send('coverageSummary', request);
93
+ const normalized = (0, normalizer_1.normalizeMcpResponse)(raw, 'coverage');
94
+ if (!raw.ok)
95
+ normalized.isFallback = true;
96
+ return normalized;
97
+ }
98
+ /** Analyze security scan results via MCP (or fallback if unavailable) */
99
+ async analyzeSecurity(input) {
100
+ if (!(0, config_1.isMcpEnabledFor)(this.config, 'securityScan')) {
101
+ return (0, fallback_1.generateFallbackSecurityAnalysis)({ scanSummary: input.scanSummary });
102
+ }
103
+ const request = (0, prompts_1.buildSecurityScanPrompt)(input);
104
+ request.events = [...this.eventStream.getEvents()];
105
+ const raw = await this.client.send('securityScan', request);
106
+ const normalized = (0, normalizer_1.normalizeMcpResponse)(raw, 'security');
107
+ if (!raw.ok)
108
+ normalized.isFallback = true;
109
+ return normalized;
110
+ }
111
+ /** Analyze performance / resilience coverage via MCP (or fallback) */
112
+ async analyzePerformance(input) {
113
+ if (!(0, config_1.isMcpEnabledFor)(this.config, 'performanceAnalysis')) {
114
+ return (0, fallback_1.generateFallbackAnalysis)('performance', input.coveragePercent, undefined);
115
+ }
116
+ const request = (0, prompts_1.buildPerformancePrompt)(input);
117
+ const raw = await this.client.send('performanceAnalysis', request);
118
+ const normalized = (0, normalizer_1.normalizeMcpResponse)(raw, 'performance');
119
+ if (!raw.ok)
120
+ normalized.isFallback = true;
121
+ return normalized;
122
+ }
123
+ /** Analyze compatibility / contract coverage via MCP (or fallback) */
124
+ async analyzeCompatibility(input) {
125
+ if (!(0, config_1.isMcpEnabledFor)(this.config, 'compatibilityAnalysis')) {
126
+ return (0, fallback_1.generateFallbackAnalysis)('compatibility', input.compatibilityPercent, undefined);
127
+ }
128
+ const request = (0, prompts_1.buildCompatibilityPrompt)(input);
129
+ const raw = await this.client.send('compatibilityAnalysis', request);
130
+ const normalized = (0, normalizer_1.normalizeMcpResponse)(raw, 'compatibility');
131
+ if (!raw.ok)
132
+ normalized.isFallback = true;
133
+ return normalized;
134
+ }
135
+ /** Generate a CI/PR summary via MCP (or fallback) */
136
+ async analyzeCiSummary(input) {
137
+ if (!(0, config_1.isMcpEnabledFor)(this.config, 'coverageSummary')) {
138
+ const gatePassed = input.overallPassed;
139
+ return (0, fallback_1.generateFallbackCoverageAnalysis)({
140
+ results: input.coverageResults,
141
+ gatePassed,
142
+ failedCategories: input.failedGates,
143
+ });
144
+ }
145
+ const request = (0, prompts_1.buildCiSummaryPrompt)(input);
146
+ const raw = await this.client.send('coverageSummary', request);
147
+ const normalized = (0, normalizer_1.normalizeMcpResponse)(raw, 'ci-summary');
148
+ if (!raw.ok)
149
+ normalized.isFallback = true;
150
+ return normalized;
151
+ }
152
+ /** Analyze coverage intelligence results via MCP (or fallback if unavailable) */
153
+ async analyzeIntelligence(input) {
154
+ if (!(0, config_1.isMcpEnabledFor)(this.config, 'intelligenceAnalysis')) {
155
+ return (0, fallback_1.generateFallbackIntelligenceAnalysis)({
156
+ totalFindings: input.totalFindings,
157
+ totalRecommendations: input.totalRecommendations,
158
+ maxRiskScore: input.maxRiskScore,
159
+ avgRiskScore: input.avgRiskScore,
160
+ criticalUncoveredItems: input.criticalUncoveredItems,
161
+ unprotectedSecurityFindings: input.unprotectedSecurityFindings,
162
+ recommendationsByPriority: input.recommendationsByPriority,
163
+ languages: input.languages,
164
+ frameworks: input.frameworks,
165
+ });
166
+ }
167
+ const request = (0, prompts_1.buildIntelligencePrompt)(input);
168
+ request.events = [...this.eventStream.getEvents()];
169
+ const raw = await this.client.send('intelligenceAnalysis', request);
170
+ const normalized = (0, normalizer_1.normalizeMcpResponse)(raw, 'intelligence');
171
+ if (!raw.ok)
172
+ normalized.isFallback = true;
173
+ return normalized;
174
+ }
175
+ // ─── Rendering helpers ──────────────────────────────────────────────────────
176
+ /** Render a NormalizedAiAnalysis as Markdown */
177
+ renderMarkdown(analysis, category, categoryTitle) {
178
+ return (0, templates_1.renderAiAnalysisMarkdown)({
179
+ analysis,
180
+ category,
181
+ categoryTitle,
182
+ mcpEnabled: this.config.enabled,
183
+ });
184
+ }
185
+ /** Render a NormalizedAiAnalysis as HTML */
186
+ renderHtml(analysis, category, categoryTitle) {
187
+ return (0, templates_1.renderAiAnalysisHtml)({
188
+ analysis,
189
+ category,
190
+ categoryTitle,
191
+ mcpEnabled: this.config.enabled,
192
+ });
193
+ }
194
+ /** Build dashboard panel data from a NormalizedAiAnalysis */
195
+ buildPanelData(analysis) {
196
+ return (0, templates_1.buildAiPanelData)(analysis);
197
+ }
198
+ // ─── Accessors ──────────────────────────────────────────────────────────────
199
+ /** Whether MCP is globally enabled */
200
+ isEnabled() {
201
+ return this.config.enabled === true;
202
+ }
203
+ /** Whether MCP is enabled for a specific server/category */
204
+ isEnabledFor(serverName) {
205
+ return (0, config_1.isMcpEnabledFor)(this.config, serverName);
206
+ }
207
+ /** Collect all buffered events */
208
+ getEvents() {
209
+ return this.eventStream.getEvents();
210
+ }
211
+ }
212
+ exports.McpIntegration = McpIntegration;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MCP integration – response normalizer.
3
+ *
4
+ * Converts raw MCP server responses into the deterministic NormalizedAiAnalysis
5
+ * schema. The analyzer NEVER renders raw MCP output directly.
6
+ *
7
+ * Handles:
8
+ * - Well-formed JSON responses
9
+ * - Partial/malformed JSON (graceful degradation)
10
+ * - Non-JSON plain text
11
+ * - Empty / error responses
12
+ */
13
+ import type { McpRawResponse, NormalizedAiAnalysis } from './types';
14
+ /**
15
+ * Normalize a raw MCP response into a NormalizedAiAnalysis object.
16
+ *
17
+ * When the response cannot be parsed the function returns a best-effort object
18
+ * rather than throwing, so callers can always render something useful.
19
+ */
20
+ export declare function normalizeMcpResponse(raw: McpRawResponse, category: string): NormalizedAiAnalysis;
21
+ //# sourceMappingURL=normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../../../src/mcp/normalizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAgB,MAAM,SAAS,CAAC;AAIlF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,GACf,oBAAoB,CAmBtB"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ /**
3
+ * MCP integration – response normalizer.
4
+ *
5
+ * Converts raw MCP server responses into the deterministic NormalizedAiAnalysis
6
+ * schema. The analyzer NEVER renders raw MCP output directly.
7
+ *
8
+ * Handles:
9
+ * - Well-formed JSON responses
10
+ * - Partial/malformed JSON (graceful degradation)
11
+ * - Non-JSON plain text
12
+ * - Empty / error responses
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.normalizeMcpResponse = normalizeMcpResponse;
16
+ // ─── Main normalizer ──────────────────────────────────────────────────────────
17
+ /**
18
+ * Normalize a raw MCP response into a NormalizedAiAnalysis object.
19
+ *
20
+ * When the response cannot be parsed the function returns a best-effort object
21
+ * rather than throwing, so callers can always render something useful.
22
+ */
23
+ function normalizeMcpResponse(raw, category) {
24
+ var _a;
25
+ if (!raw.ok || !raw.content) {
26
+ return errorFallback(category, (_a = raw.error) !== null && _a !== void 0 ? _a : 'MCP server returned no content');
27
+ }
28
+ const parsed = tryParseJson(raw.content.trim());
29
+ if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
30
+ return normalizeObject(parsed, category);
31
+ }
32
+ // Plain-text response – wrap into a minimal schema
33
+ return {
34
+ summary: raw.content.slice(0, 500),
35
+ keyFindings: [],
36
+ topRisks: [],
37
+ recommendedActions: [],
38
+ confidence: 'low',
39
+ category,
40
+ };
41
+ }
42
+ // ─── Internal helpers ─────────────────────────────────────────────────────────
43
+ function normalizeObject(obj, category) {
44
+ var _a, _b, _c, _d, _e, _f;
45
+ return {
46
+ summary: asString(obj['summary'], 'No summary provided.'),
47
+ keyFindings: asStringArray((_a = obj['keyFindings']) !== null && _a !== void 0 ? _a : obj['key_findings']),
48
+ topRisks: asStringArray((_b = obj['topRisks']) !== null && _b !== void 0 ? _b : obj['top_risks']),
49
+ recommendedActions: asStringArray((_d = (_c = obj['recommendedActions']) !== null && _c !== void 0 ? _c : obj['recommended_actions']) !== null && _d !== void 0 ? _d : obj['actions']),
50
+ missingCoverageAreas: asStringArray((_e = obj['missingCoverageAreas']) !== null && _e !== void 0 ? _e : obj['missing_coverage_areas'], true),
51
+ likelyRootCauses: asStringArray((_f = obj['likelyRootCauses']) !== null && _f !== void 0 ? _f : obj['likely_root_causes'], true),
52
+ confidence: asConfidence(obj['confidence']),
53
+ category,
54
+ };
55
+ }
56
+ function errorFallback(category, errorMsg) {
57
+ return {
58
+ summary: `MCP analysis unavailable: ${errorMsg}`,
59
+ keyFindings: [],
60
+ topRisks: [],
61
+ recommendedActions: [],
62
+ confidence: 'low',
63
+ category,
64
+ };
65
+ }
66
+ function tryParseJson(text) {
67
+ // Strip markdown code fences if present
68
+ const fenced = text.match(/```(?:json)?\s*([\s\S]*?)```/);
69
+ const source = fenced ? fenced[1].trim() : text;
70
+ // Find the first JSON object or array in the text
71
+ const jsonStart = source.search(/[{[]/);
72
+ if (jsonStart === -1)
73
+ return null;
74
+ try {
75
+ return JSON.parse(source.slice(jsonStart));
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ function asString(val, fallback) {
82
+ if (typeof val === 'string' && val.length > 0)
83
+ return val;
84
+ return fallback;
85
+ }
86
+ function asStringArray(val, allowUndefined) {
87
+ if (allowUndefined && (val === undefined || val === null))
88
+ return [];
89
+ if (!Array.isArray(val))
90
+ return [];
91
+ return val
92
+ .filter((v) => typeof v === 'string' && v.length > 0)
93
+ .map((v) => v);
94
+ }
95
+ function asConfidence(val) {
96
+ if (val === 'low' || val === 'medium' || val === 'high')
97
+ return val;
98
+ return 'medium';
99
+ }