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.
- package/README.md +703 -0
- package/config.yaml.example +227 -0
- package/dist/action/src/index.d.ts +2 -0
- package/dist/action/src/index.d.ts.map +1 -0
- package/dist/action/src/index.js +349 -0
- package/dist/action/src/prComment.d.ts +34 -0
- package/dist/action/src/prComment.d.ts.map +1 -0
- package/dist/action/src/prComment.js +146 -0
- package/dist/src/ast/astAnalysisOrchestrator.d.ts +36 -0
- package/dist/src/ast/astAnalysisOrchestrator.d.ts.map +1 -0
- package/dist/src/ast/astAnalysisOrchestrator.js +123 -0
- package/dist/src/ast/astTypes.d.ts +105 -0
- package/dist/src/ast/astTypes.d.ts.map +1 -0
- package/dist/src/ast/astTypes.js +9 -0
- package/dist/src/ast/languageAnalyzer.d.ts +46 -0
- package/dist/src/ast/languageAnalyzer.d.ts.map +1 -0
- package/dist/src/ast/languageAnalyzer.js +9 -0
- package/dist/src/ast/languageCapabilities.d.ts +24 -0
- package/dist/src/ast/languageCapabilities.d.ts.map +1 -0
- package/dist/src/ast/languageCapabilities.js +92 -0
- package/dist/src/ast/parseFile.d.ts +16 -0
- package/dist/src/ast/parseFile.d.ts.map +1 -0
- package/dist/src/ast/parseFile.js +65 -0
- package/dist/src/ast/parserRegistry.d.ts +39 -0
- package/dist/src/ast/parserRegistry.d.ts.map +1 -0
- package/dist/src/ast/parserRegistry.js +66 -0
- package/dist/src/buildSummary.d.ts +26 -0
- package/dist/src/buildSummary.d.ts.map +1 -0
- package/dist/src/buildSummary.js +193 -0
- package/dist/src/businessCoverage.d.ts +68 -0
- package/dist/src/businessCoverage.d.ts.map +1 -0
- package/dist/src/businessCoverage.js +290 -0
- package/dist/src/compatibilityCoverage.d.ts +83 -0
- package/dist/src/compatibilityCoverage.d.ts.map +1 -0
- package/dist/src/compatibilityCoverage.js +501 -0
- package/dist/src/config/defaultConfig.d.ts +9 -0
- package/dist/src/config/defaultConfig.d.ts.map +1 -0
- package/dist/src/config/defaultConfig.js +97 -0
- package/dist/src/config/index.d.ts +12 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +37 -0
- package/dist/src/config/loadConfig.d.ts +29 -0
- package/dist/src/config/loadConfig.d.ts.map +1 -0
- package/dist/src/config/loadConfig.js +135 -0
- package/dist/src/config/mergeConfig.d.ts +15 -0
- package/dist/src/config/mergeConfig.d.ts.map +1 -0
- package/dist/src/config/mergeConfig.js +57 -0
- package/dist/src/config/schema.d.ts +15 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +30 -0
- package/dist/src/config/types.d.ts +175 -0
- package/dist/src/config/types.d.ts.map +1 -0
- package/dist/src/config/types.js +9 -0
- package/dist/src/config/validateConfig.d.ts +22 -0
- package/dist/src/config/validateConfig.d.ts.map +1 -0
- package/dist/src/config/validateConfig.js +171 -0
- package/dist/src/config.d.ts +168 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +204 -0
- package/dist/src/coverage/deep-analysis/callGraph.d.ts +67 -0
- package/dist/src/coverage/deep-analysis/callGraph.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/callGraph.js +275 -0
- package/dist/src/coverage/deep-analysis/deepEndpointResolver.d.ts +23 -0
- package/dist/src/coverage/deep-analysis/deepEndpointResolver.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/deepEndpointResolver.js +394 -0
- package/dist/src/coverage/deep-analysis/index.d.ts +17 -0
- package/dist/src/coverage/deep-analysis/index.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/index.js +63 -0
- package/dist/src/coverage/deep-analysis/resolveAssertions.d.ts +60 -0
- package/dist/src/coverage/deep-analysis/resolveAssertions.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolveAssertions.js +121 -0
- package/dist/src/coverage/deep-analysis/resolveConstants.d.ts +36 -0
- package/dist/src/coverage/deep-analysis/resolveConstants.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolveConstants.js +92 -0
- package/dist/src/coverage/deep-analysis/resolveEnums.d.ts +55 -0
- package/dist/src/coverage/deep-analysis/resolveEnums.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolveEnums.js +152 -0
- package/dist/src/coverage/deep-analysis/resolveMethodChains.d.ts +70 -0
- package/dist/src/coverage/deep-analysis/resolveMethodChains.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolveMethodChains.js +152 -0
- package/dist/src/coverage/deep-analysis/resolvePaths.d.ts +80 -0
- package/dist/src/coverage/deep-analysis/resolvePaths.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolvePaths.js +216 -0
- package/dist/src/coverage/deep-analysis/resolveRequestWrappers.d.ts +71 -0
- package/dist/src/coverage/deep-analysis/resolveRequestWrappers.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolveRequestWrappers.js +226 -0
- package/dist/src/coverage/deep-analysis/symbolTable.d.ts +58 -0
- package/dist/src/coverage/deep-analysis/symbolTable.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/symbolTable.js +230 -0
- package/dist/src/coverage/deep-analysis/types.d.ts +122 -0
- package/dist/src/coverage/deep-analysis/types.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/types.js +21 -0
- package/dist/src/discovery/fileClassifier.d.ts +50 -0
- package/dist/src/discovery/fileClassifier.d.ts.map +1 -0
- package/dist/src/discovery/fileClassifier.js +238 -0
- package/dist/src/discovery/projectDiscovery.d.ts +66 -0
- package/dist/src/discovery/projectDiscovery.d.ts.map +1 -0
- package/dist/src/discovery/projectDiscovery.js +287 -0
- package/dist/src/endpointCoverage.d.ts +70 -0
- package/dist/src/endpointCoverage.d.ts.map +1 -0
- package/dist/src/endpointCoverage.js +381 -0
- package/dist/src/errorCoverage.d.ts +93 -0
- package/dist/src/errorCoverage.d.ts.map +1 -0
- package/dist/src/errorCoverage.js +698 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +1441 -0
- package/dist/src/inference/businessRuleInference.d.ts +63 -0
- package/dist/src/inference/businessRuleInference.d.ts.map +1 -0
- package/dist/src/inference/businessRuleInference.js +268 -0
- package/dist/src/inference/integrationFlowInference.d.ts +56 -0
- package/dist/src/inference/integrationFlowInference.d.ts.map +1 -0
- package/dist/src/inference/integrationFlowInference.js +266 -0
- package/dist/src/integrationCoverage.d.ts +72 -0
- package/dist/src/integrationCoverage.d.ts.map +1 -0
- package/dist/src/integrationCoverage.js +317 -0
- package/dist/src/intelligence/index.d.ts +20 -0
- package/dist/src/intelligence/index.d.ts.map +1 -0
- package/dist/src/intelligence/index.js +105 -0
- package/dist/src/intelligence/linkageEngine.d.ts +20 -0
- package/dist/src/intelligence/linkageEngine.d.ts.map +1 -0
- package/dist/src/intelligence/linkageEngine.js +522 -0
- package/dist/src/intelligence/markdownReporter.d.ts +12 -0
- package/dist/src/intelligence/markdownReporter.d.ts.map +1 -0
- package/dist/src/intelligence/markdownReporter.js +265 -0
- package/dist/src/intelligence/riskScoring.d.ts +53 -0
- package/dist/src/intelligence/riskScoring.d.ts.map +1 -0
- package/dist/src/intelligence/riskScoring.js +181 -0
- package/dist/src/intelligence/types.d.ts +121 -0
- package/dist/src/intelligence/types.d.ts.map +1 -0
- package/dist/src/intelligence/types.js +8 -0
- package/dist/src/languageDetection.d.ts +100 -0
- package/dist/src/languageDetection.d.ts.map +1 -0
- package/dist/src/languageDetection.js +349 -0
- package/dist/src/languages/java/index.d.ts +16 -0
- package/dist/src/languages/java/index.d.ts.map +1 -0
- package/dist/src/languages/java/index.js +103 -0
- package/dist/src/languages/java/parser.d.ts +7 -0
- package/dist/src/languages/java/parser.d.ts.map +1 -0
- package/dist/src/languages/java/parser.js +50 -0
- package/dist/src/languages/java/semanticBuilder.d.ts +21 -0
- package/dist/src/languages/java/semanticBuilder.d.ts.map +1 -0
- package/dist/src/languages/java/semanticBuilder.js +358 -0
- package/dist/src/languages/javascript/annotationExtractor.d.ts +20 -0
- package/dist/src/languages/javascript/annotationExtractor.d.ts.map +1 -0
- package/dist/src/languages/javascript/annotationExtractor.js +94 -0
- package/dist/src/languages/javascript/assertionResolver.d.ts +18 -0
- package/dist/src/languages/javascript/assertionResolver.d.ts.map +1 -0
- package/dist/src/languages/javascript/assertionResolver.js +150 -0
- package/dist/src/languages/javascript/callResolver.d.ts +23 -0
- package/dist/src/languages/javascript/callResolver.d.ts.map +1 -0
- package/dist/src/languages/javascript/callResolver.js +236 -0
- package/dist/src/languages/javascript/httpInteractionExtractor.d.ts +23 -0
- package/dist/src/languages/javascript/httpInteractionExtractor.d.ts.map +1 -0
- package/dist/src/languages/javascript/httpInteractionExtractor.js +205 -0
- package/dist/src/languages/javascript/index.d.ts +20 -0
- package/dist/src/languages/javascript/index.d.ts.map +1 -0
- package/dist/src/languages/javascript/index.js +136 -0
- package/dist/src/languages/javascript/parser.d.ts +14 -0
- package/dist/src/languages/javascript/parser.d.ts.map +1 -0
- package/dist/src/languages/javascript/parser.js +38 -0
- package/dist/src/languages/javascript/symbolResolver.d.ts +31 -0
- package/dist/src/languages/javascript/symbolResolver.d.ts.map +1 -0
- package/dist/src/languages/javascript/symbolResolver.js +183 -0
- package/dist/src/languages/kotlin/index.d.ts +16 -0
- package/dist/src/languages/kotlin/index.d.ts.map +1 -0
- package/dist/src/languages/kotlin/index.js +151 -0
- package/dist/src/languages/kotlin/parser.d.ts +11 -0
- package/dist/src/languages/kotlin/parser.d.ts.map +1 -0
- package/dist/src/languages/kotlin/parser.js +74 -0
- package/dist/src/languages/python/index.d.ts +15 -0
- package/dist/src/languages/python/index.d.ts.map +1 -0
- package/dist/src/languages/python/index.js +293 -0
- package/dist/src/languages/ruby/index.d.ts +15 -0
- package/dist/src/languages/ruby/index.d.ts.map +1 -0
- package/dist/src/languages/ruby/index.js +274 -0
- package/dist/src/languages/shared/treeSitterUtils.d.ts +43 -0
- package/dist/src/languages/shared/treeSitterUtils.d.ts.map +1 -0
- package/dist/src/languages/shared/treeSitterUtils.js +100 -0
- package/dist/src/languages/typescript/index.d.ts +14 -0
- package/dist/src/languages/typescript/index.d.ts.map +1 -0
- package/dist/src/languages/typescript/index.js +25 -0
- package/dist/src/lib/index.d.ts +228 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +486 -0
- package/dist/src/mcp/client/index.d.ts +37 -0
- package/dist/src/mcp/client/index.d.ts.map +1 -0
- package/dist/src/mcp/client/index.js +235 -0
- package/dist/src/mcp/config.d.ts +50 -0
- package/dist/src/mcp/config.d.ts.map +1 -0
- package/dist/src/mcp/config.js +125 -0
- package/dist/src/mcp/events.d.ts +24 -0
- package/dist/src/mcp/events.d.ts.map +1 -0
- package/dist/src/mcp/events.js +48 -0
- package/dist/src/mcp/fallback/index.d.ts +50 -0
- package/dist/src/mcp/fallback/index.d.ts.map +1 -0
- package/dist/src/mcp/fallback/index.js +216 -0
- package/dist/src/mcp/index.d.ts +67 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +212 -0
- package/dist/src/mcp/normalizer.d.ts +21 -0
- package/dist/src/mcp/normalizer.d.ts.map +1 -0
- package/dist/src/mcp/normalizer.js +99 -0
- package/dist/src/mcp/prompts/index.d.ts +86 -0
- package/dist/src/mcp/prompts/index.d.ts.map +1 -0
- package/dist/src/mcp/prompts/index.js +304 -0
- package/dist/src/mcp/templates/index.d.ts +35 -0
- package/dist/src/mcp/templates/index.d.ts.map +1 -0
- package/dist/src/mcp/templates/index.js +143 -0
- package/dist/src/mcp/testing/mock-server/index.d.ts +47 -0
- package/dist/src/mcp/testing/mock-server/index.d.ts.map +1 -0
- package/dist/src/mcp/testing/mock-server/index.js +157 -0
- package/dist/src/mcp/types.d.ts +127 -0
- package/dist/src/mcp/types.d.ts.map +1 -0
- package/dist/src/mcp/types.js +8 -0
- package/dist/src/observability.d.ts +138 -0
- package/dist/src/observability.d.ts.map +1 -0
- package/dist/src/observability.js +519 -0
- package/dist/src/parameterCoverage.d.ts +75 -0
- package/dist/src/parameterCoverage.d.ts.map +1 -0
- package/dist/src/parameterCoverage.js +629 -0
- package/dist/src/perfResilienceCoverage.d.ts +155 -0
- package/dist/src/perfResilienceCoverage.d.ts.map +1 -0
- package/dist/src/perfResilienceCoverage.js +670 -0
- package/dist/src/pluginLoader.d.ts +51 -0
- package/dist/src/pluginLoader.d.ts.map +1 -0
- package/dist/src/pluginLoader.js +72 -0
- package/dist/src/publishing.d.ts +63 -0
- package/dist/src/publishing.d.ts.map +1 -0
- package/dist/src/publishing.js +379 -0
- package/dist/src/qualityGate.d.ts +58 -0
- package/dist/src/qualityGate.d.ts.map +1 -0
- package/dist/src/qualityGate.js +118 -0
- package/dist/src/reporting.d.ts +41 -0
- package/dist/src/reporting.d.ts.map +1 -0
- package/dist/src/reporting.js +278 -0
- package/dist/src/screenshots.d.ts +71 -0
- package/dist/src/screenshots.d.ts.map +1 -0
- package/dist/src/screenshots.js +141 -0
- package/dist/src/security/gate/index.d.ts +11 -0
- package/dist/src/security/gate/index.d.ts.map +1 -0
- package/dist/src/security/gate/index.js +65 -0
- package/dist/src/security/index.d.ts +30 -0
- package/dist/src/security/index.d.ts.map +1 -0
- package/dist/src/security/index.js +342 -0
- package/dist/src/security/normalizers/semgrep.d.ts +10 -0
- package/dist/src/security/normalizers/semgrep.d.ts.map +1 -0
- package/dist/src/security/normalizers/semgrep.js +104 -0
- package/dist/src/security/normalizers/trivy.d.ts +10 -0
- package/dist/src/security/normalizers/trivy.d.ts.map +1 -0
- package/dist/src/security/normalizers/trivy.js +78 -0
- package/dist/src/security/normalizers/zap.d.ts +10 -0
- package/dist/src/security/normalizers/zap.d.ts.map +1 -0
- package/dist/src/security/normalizers/zap.js +104 -0
- package/dist/src/security/scanners/semgrep.d.ts +6 -0
- package/dist/src/security/scanners/semgrep.d.ts.map +1 -0
- package/dist/src/security/scanners/semgrep.js +125 -0
- package/dist/src/security/scanners/trivy.d.ts +6 -0
- package/dist/src/security/scanners/trivy.d.ts.map +1 -0
- package/dist/src/security/scanners/trivy.js +115 -0
- package/dist/src/security/scanners/zap.d.ts +6 -0
- package/dist/src/security/scanners/zap.d.ts.map +1 -0
- package/dist/src/security/scanners/zap.js +135 -0
- package/dist/src/security/types.d.ts +146 -0
- package/dist/src/security/types.d.ts.map +1 -0
- package/dist/src/security/types.js +6 -0
- package/dist/src/securityCoverage.d.ts +116 -0
- package/dist/src/securityCoverage.d.ts.map +1 -0
- package/dist/src/securityCoverage.js +725 -0
- package/dist/src/summary/buildSummary.d.ts +28 -0
- package/dist/src/summary/buildSummary.d.ts.map +1 -0
- package/dist/src/summary/buildSummary.js +257 -0
- package/dist/src/summary/evaluateMetrics.d.ts +31 -0
- package/dist/src/summary/evaluateMetrics.d.ts.map +1 -0
- package/dist/src/summary/evaluateMetrics.js +118 -0
- package/dist/src/summary/index.d.ts +10 -0
- package/dist/src/summary/index.d.ts.map +1 -0
- package/dist/src/summary/index.js +22 -0
- package/dist/src/summary/markdownRenderer.d.ts +139 -0
- package/dist/src/summary/markdownRenderer.d.ts.map +1 -0
- package/dist/src/summary/markdownRenderer.js +459 -0
- package/dist/src/summary/prSummary.d.ts +24 -0
- package/dist/src/summary/prSummary.d.ts.map +1 -0
- package/dist/src/summary/prSummary.js +233 -0
- package/dist/src/summary/summaryTypes.d.ts +35 -0
- package/dist/src/summary/summaryTypes.d.ts.map +1 -0
- package/dist/src/summary/summaryTypes.js +27 -0
- package/package.json +84 -0
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Summary engine – low-level markdown rendering utilities and shared types.
|
|
4
|
+
*
|
|
5
|
+
* This module owns the SummaryResult type and the building blocks used by
|
|
6
|
+
* both generateBuildSummary and generatePrSummary.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.coverageTypeTitle = coverageTypeTitle;
|
|
10
|
+
exports.tableRow = tableRow;
|
|
11
|
+
exports.statusBadge = statusBadge;
|
|
12
|
+
exports.pct = pct;
|
|
13
|
+
exports.extractGaps = extractGaps;
|
|
14
|
+
exports.renderCoverageSection = renderCoverageSection;
|
|
15
|
+
exports.renderSecurityScanSection = renderSecurityScanSection;
|
|
16
|
+
exports.metricStatusCell = metricStatusCell;
|
|
17
|
+
exports.renderInterpretationSection = renderInterpretationSection;
|
|
18
|
+
exports.renderAiSummary = renderAiSummary;
|
|
19
|
+
exports.renderIntelligenceSection = renderIntelligenceSection;
|
|
20
|
+
// ─── Internal helpers ─────────────────────────────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* Map a coverage-type string to a human-readable title.
|
|
23
|
+
*/
|
|
24
|
+
function coverageTypeTitle(type) {
|
|
25
|
+
var _a;
|
|
26
|
+
const titles = {
|
|
27
|
+
endpoint: 'Endpoint Coverage',
|
|
28
|
+
parameter: 'Parameter Coverage',
|
|
29
|
+
business: 'Business Rule Coverage',
|
|
30
|
+
integration: 'Integration Flow Coverage',
|
|
31
|
+
error: 'Error Handling Coverage',
|
|
32
|
+
security: 'Security Control Coverage',
|
|
33
|
+
performance: 'Performance Coverage',
|
|
34
|
+
resilience: 'Resilience Coverage',
|
|
35
|
+
compatibility: 'Compatibility & Contract Coverage',
|
|
36
|
+
};
|
|
37
|
+
return (_a = titles[type]) !== null && _a !== void 0 ? _a : `${type.charAt(0).toUpperCase()}${type.slice(1)} Coverage`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Render a two-column Markdown table row.
|
|
41
|
+
*/
|
|
42
|
+
function tableRow(label, value) {
|
|
43
|
+
return `| **${label}** | ${value} |`;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Render a status badge string.
|
|
47
|
+
* "PASS" or "FAIL" – explicit wording, no ambiguous icons.
|
|
48
|
+
*/
|
|
49
|
+
function statusBadge(passed) {
|
|
50
|
+
return passed ? '✅ PASS' : '❌ FAIL';
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Render the coverage percentage with two decimal places.
|
|
54
|
+
*/
|
|
55
|
+
function pct(value) {
|
|
56
|
+
return `${value.toFixed(2)}%`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Render the gap list items from a CoverageResult's details field.
|
|
60
|
+
* Returns up to `limit` bullet items.
|
|
61
|
+
*/
|
|
62
|
+
function extractGaps(result, limit = 10) {
|
|
63
|
+
var _a, _b, _c;
|
|
64
|
+
const uncovered = result.totalItems - result.coveredItems;
|
|
65
|
+
if (uncovered <= 0)
|
|
66
|
+
return [];
|
|
67
|
+
const details = result.details;
|
|
68
|
+
if (!details)
|
|
69
|
+
return [`${uncovered} item(s) not covered`];
|
|
70
|
+
// Try common detail shapes used by the various coverage modules
|
|
71
|
+
const gapCandidates = [];
|
|
72
|
+
// endpointCoverage: details.uncoveredEndpoints = [{method, path}]
|
|
73
|
+
const uncoveredEndpoints = details['uncoveredEndpoints'];
|
|
74
|
+
if (Array.isArray(uncoveredEndpoints)) {
|
|
75
|
+
for (const ep of uncoveredEndpoints.slice(0, limit)) {
|
|
76
|
+
if (typeof ep === 'object' && ep !== null) {
|
|
77
|
+
const obj = ep;
|
|
78
|
+
const method = String((_a = obj['method']) !== null && _a !== void 0 ? _a : '').toUpperCase();
|
|
79
|
+
const path = String((_c = (_b = obj['path']) !== null && _b !== void 0 ? _b : obj['endpoint']) !== null && _c !== void 0 ? _c : '');
|
|
80
|
+
if (method && path) {
|
|
81
|
+
gapCandidates.push(`\`${method} ${path}\``);
|
|
82
|
+
}
|
|
83
|
+
else if (path) {
|
|
84
|
+
gapCandidates.push(`\`${path}\``);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// parameterCoverage / others: details.uncovered = string[]
|
|
90
|
+
const uncoveredList = details['uncovered'];
|
|
91
|
+
if (Array.isArray(uncoveredList) && gapCandidates.length === 0) {
|
|
92
|
+
for (const item of uncoveredList.slice(0, limit)) {
|
|
93
|
+
gapCandidates.push(`\`${String(item)}\``);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// integrationCoverage: details.uncoveredFlows = string[]
|
|
97
|
+
const uncoveredFlows = details['uncoveredFlows'];
|
|
98
|
+
if (Array.isArray(uncoveredFlows) && gapCandidates.length === 0) {
|
|
99
|
+
for (const flow of uncoveredFlows.slice(0, limit)) {
|
|
100
|
+
gapCandidates.push(`\`${String(flow)}\``);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (gapCandidates.length === 0) {
|
|
104
|
+
gapCandidates.push(`${uncovered} item(s) not covered`);
|
|
105
|
+
}
|
|
106
|
+
return gapCandidates.slice(0, limit);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Render a full coverage section in the structured Markdown format required by
|
|
110
|
+
* the problem spec (§2).
|
|
111
|
+
*
|
|
112
|
+
* @param result Coverage result for this category.
|
|
113
|
+
* @param threshold Configured threshold for this category (may be undefined).
|
|
114
|
+
* @param gateFailure Whether the gate failed for this category.
|
|
115
|
+
*/
|
|
116
|
+
function renderCoverageSection(result, threshold, gateFailure) {
|
|
117
|
+
const title = coverageTypeTitle(result.type);
|
|
118
|
+
const gateEvaluated = threshold !== undefined;
|
|
119
|
+
const passed = gateEvaluated ? !gateFailure : undefined;
|
|
120
|
+
const lines = [];
|
|
121
|
+
lines.push(`## ${title}`);
|
|
122
|
+
lines.push('');
|
|
123
|
+
if (gateEvaluated && passed !== undefined) {
|
|
124
|
+
lines.push(`**Status:** ${statusBadge(passed)}`);
|
|
125
|
+
}
|
|
126
|
+
lines.push(`**Gate:** ${gateEvaluated ? 'enabled' : 'not configured'}`);
|
|
127
|
+
if (gateEvaluated) {
|
|
128
|
+
lines.push(`**Threshold:** ${pct(threshold)}`);
|
|
129
|
+
}
|
|
130
|
+
lines.push(`**Actual Coverage:** ${pct(result.coveragePercent)}`);
|
|
131
|
+
lines.push('');
|
|
132
|
+
lines.push('### Results');
|
|
133
|
+
lines.push('');
|
|
134
|
+
lines.push(`| | |`);
|
|
135
|
+
lines.push(`|---|---|`);
|
|
136
|
+
lines.push(tableRow('Total items', String(result.totalItems)));
|
|
137
|
+
lines.push(tableRow('Covered items', String(result.coveredItems)));
|
|
138
|
+
lines.push(tableRow('Uncovered items', String(result.totalItems - result.coveredItems)));
|
|
139
|
+
lines.push(tableRow('Coverage', pct(result.coveragePercent)));
|
|
140
|
+
if (gateEvaluated) {
|
|
141
|
+
lines.push(tableRow('Threshold', pct(threshold)));
|
|
142
|
+
lines.push(tableRow('Gate result', gateEvaluated && passed !== undefined ? statusBadge(passed) : 'N/A'));
|
|
143
|
+
}
|
|
144
|
+
lines.push('');
|
|
145
|
+
const gaps = extractGaps(result);
|
|
146
|
+
if (gaps.length > 0) {
|
|
147
|
+
lines.push('### Main Gaps');
|
|
148
|
+
lines.push('');
|
|
149
|
+
for (const gap of gaps) {
|
|
150
|
+
lines.push(`- ${gap}`);
|
|
151
|
+
}
|
|
152
|
+
lines.push('');
|
|
153
|
+
}
|
|
154
|
+
lines.push('### Recommended Next Work');
|
|
155
|
+
lines.push('');
|
|
156
|
+
if (passed === false && gateEvaluated) {
|
|
157
|
+
const needed = threshold - result.coveragePercent;
|
|
158
|
+
lines.push(`Increase **${result.type}** coverage by at least ${needed.toFixed(2)}% ` +
|
|
159
|
+
`(currently ${pct(result.coveragePercent)}, required ${pct(threshold)}).`);
|
|
160
|
+
}
|
|
161
|
+
else if (result.coveragePercent < 100) {
|
|
162
|
+
lines.push(`Increase **${result.type}** coverage toward 100% by covering the gaps listed above.`);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
lines.push(`All ${result.type} items covered. Consider raising the threshold if it is below 100%.`);
|
|
166
|
+
}
|
|
167
|
+
lines.push('');
|
|
168
|
+
return lines.join('\n');
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Render the security scanning section.
|
|
172
|
+
*/
|
|
173
|
+
function renderSecurityScanSection(securityScan, scannerResults, gateEvaluated, gatePassed) {
|
|
174
|
+
var _a;
|
|
175
|
+
const lines = [];
|
|
176
|
+
lines.push('## Security Scanning');
|
|
177
|
+
lines.push('');
|
|
178
|
+
if (gateEvaluated && gatePassed !== undefined) {
|
|
179
|
+
lines.push(`**Status:** ${statusBadge(gatePassed)}`);
|
|
180
|
+
}
|
|
181
|
+
lines.push(`**Gate:** ${gateEvaluated ? 'enabled' : 'not configured'}`);
|
|
182
|
+
lines.push('');
|
|
183
|
+
for (const sr of scannerResults) {
|
|
184
|
+
lines.push(`### ${sr.scanner.charAt(0).toUpperCase()}${sr.scanner.slice(1)}`);
|
|
185
|
+
lines.push('');
|
|
186
|
+
const bySev = { LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0, ...countBySeverity(sr.findings) };
|
|
187
|
+
lines.push(`| | |`);
|
|
188
|
+
lines.push(`|---|---|`);
|
|
189
|
+
lines.push(tableRow('Status', sr.success ? 'Ran successfully' : `Failed: ${(_a = sr.error) !== null && _a !== void 0 ? _a : 'unknown error'}`));
|
|
190
|
+
lines.push(tableRow('Findings', String(sr.findings.length)));
|
|
191
|
+
lines.push(tableRow('Critical', String(bySev.CRITICAL)));
|
|
192
|
+
lines.push(tableRow('High', String(bySev.HIGH)));
|
|
193
|
+
lines.push(tableRow('Medium', String(bySev.MEDIUM)));
|
|
194
|
+
lines.push(tableRow('Low', String(bySev.LOW)));
|
|
195
|
+
lines.push('');
|
|
196
|
+
}
|
|
197
|
+
// Overall totals
|
|
198
|
+
lines.push('### Overall Findings');
|
|
199
|
+
lines.push('');
|
|
200
|
+
lines.push(`| | |`);
|
|
201
|
+
lines.push(`|---|---|`);
|
|
202
|
+
lines.push(tableRow('Total findings', String(securityScan.totalFindings)));
|
|
203
|
+
lines.push(tableRow('Critical', String(securityScan.bySeverity.CRITICAL)));
|
|
204
|
+
lines.push(tableRow('High', String(securityScan.bySeverity.HIGH)));
|
|
205
|
+
lines.push(tableRow('Medium', String(securityScan.bySeverity.MEDIUM)));
|
|
206
|
+
lines.push(tableRow('Low', String(securityScan.bySeverity.LOW)));
|
|
207
|
+
lines.push('');
|
|
208
|
+
// Main blocking findings (high/critical)
|
|
209
|
+
const blocking = securityScan.findings.filter((f) => f.severity === 'HIGH' || f.severity === 'CRITICAL').slice(0, 5);
|
|
210
|
+
if (blocking.length > 0) {
|
|
211
|
+
lines.push('### Main Blocking Findings');
|
|
212
|
+
lines.push('');
|
|
213
|
+
for (const f of blocking) {
|
|
214
|
+
const loc = f.filePath ? ` in \`${f.filePath}\`` : '';
|
|
215
|
+
lines.push(`- **${f.severity}** ${f.title}${loc}`);
|
|
216
|
+
}
|
|
217
|
+
lines.push('');
|
|
218
|
+
}
|
|
219
|
+
return lines.join('\n');
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Count findings by severity from a findings array.
|
|
223
|
+
*/
|
|
224
|
+
function countBySeverity(findings) {
|
|
225
|
+
var _a;
|
|
226
|
+
const counts = {};
|
|
227
|
+
for (const f of findings) {
|
|
228
|
+
counts[f.severity] = ((_a = counts[f.severity]) !== null && _a !== void 0 ? _a : 0) + 1;
|
|
229
|
+
}
|
|
230
|
+
return counts;
|
|
231
|
+
}
|
|
232
|
+
// ─── Evaluated-metric helpers (PASS / FAIL / SKIPPED / N/A) ──────────────────
|
|
233
|
+
/**
|
|
234
|
+
* Render the status cell for a metric row in the coverage summary table.
|
|
235
|
+
* These are the only four valid statuses — ⚠️ PASS does not exist.
|
|
236
|
+
*/
|
|
237
|
+
function metricStatusCell(status) {
|
|
238
|
+
switch (status) {
|
|
239
|
+
case 'PASS': return '✅ PASS';
|
|
240
|
+
case 'FAIL': return '❌ FAIL';
|
|
241
|
+
case 'SKIPPED': return '⏭ SKIPPED';
|
|
242
|
+
case 'N/A': return '— N/A';
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Render the "Summary Interpretation" section that explains what each metric
|
|
247
|
+
* status means in plain language. Suitable for AI agents and humans alike.
|
|
248
|
+
*/
|
|
249
|
+
function renderInterpretationSection(metrics) {
|
|
250
|
+
const passed = metrics.filter((m) => m.status === 'PASS');
|
|
251
|
+
const failed = metrics.filter((m) => m.status === 'FAIL');
|
|
252
|
+
const skipped = metrics.filter((m) => m.status === 'SKIPPED');
|
|
253
|
+
const na = metrics.filter((m) => m.status === 'N/A');
|
|
254
|
+
const executed = metrics.filter((m) => m.executed);
|
|
255
|
+
const lines = [];
|
|
256
|
+
lines.push('## Summary Interpretation');
|
|
257
|
+
lines.push('');
|
|
258
|
+
if (executed.length > 0) {
|
|
259
|
+
lines.push(`**Analyzed:** ${executed.map((m) => m.category).join(', ')}`);
|
|
260
|
+
}
|
|
261
|
+
if (passed.length > 0) {
|
|
262
|
+
lines.push(`**Passed:** ${passed.map((m) => m.category).join(', ')}`);
|
|
263
|
+
}
|
|
264
|
+
if (failed.length > 0) {
|
|
265
|
+
lines.push(`**Failed:** ${failed.map((m) => m.category).join(', ')}`);
|
|
266
|
+
}
|
|
267
|
+
if (na.length > 0) {
|
|
268
|
+
lines.push(`**Not applicable:** ${na.map((m) => m.category).join(', ')}`);
|
|
269
|
+
}
|
|
270
|
+
if (skipped.length > 0) {
|
|
271
|
+
lines.push(`**Skipped (did not run):** ${skipped.map((m) => m.category).join(', ')}`);
|
|
272
|
+
}
|
|
273
|
+
lines.push('');
|
|
274
|
+
// Top gaps from failed metrics
|
|
275
|
+
const allGaps = failed.flatMap((m) => m.topGaps);
|
|
276
|
+
if (allGaps.length > 0) {
|
|
277
|
+
lines.push('### Top Gaps');
|
|
278
|
+
lines.push('');
|
|
279
|
+
for (const gap of allGaps.slice(0, 5)) {
|
|
280
|
+
lines.push(`- ${gap}`);
|
|
281
|
+
}
|
|
282
|
+
lines.push('');
|
|
283
|
+
}
|
|
284
|
+
// Recommended next actions
|
|
285
|
+
lines.push('### Recommended Next Actions');
|
|
286
|
+
lines.push('');
|
|
287
|
+
if (failed.length > 0) {
|
|
288
|
+
for (const m of failed) {
|
|
289
|
+
const gap = (m.threshold - m.coveragePercent).toFixed(2);
|
|
290
|
+
lines.push(`- Increase **${m.category}** coverage by ${gap}% ` +
|
|
291
|
+
`(currently ${m.coveragePercent.toFixed(2)}%, required ${m.threshold.toFixed(2)}%)`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else if (executed.length > 0) {
|
|
295
|
+
lines.push('- All configured gates passed. Consider raising thresholds toward 100%.');
|
|
296
|
+
}
|
|
297
|
+
if (skipped.length > 0) {
|
|
298
|
+
lines.push(`- Consider running: ${skipped.map((m) => m.category).join(', ')} analyzers to expand coverage visibility.`);
|
|
299
|
+
}
|
|
300
|
+
lines.push('');
|
|
301
|
+
return lines.join('\n');
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Render the AI-friendly summary markdown.
|
|
305
|
+
* Optimized for consumption by AI agents (test generators, fixers, etc.)
|
|
306
|
+
*/
|
|
307
|
+
function renderAiSummary(input, sections) {
|
|
308
|
+
var _a, _b, _c, _d;
|
|
309
|
+
const lines = [];
|
|
310
|
+
lines.push('# AI-Friendly Coverage Summary');
|
|
311
|
+
lines.push('');
|
|
312
|
+
lines.push('## Analyzed Inputs');
|
|
313
|
+
lines.push('');
|
|
314
|
+
lines.push(`| | |`);
|
|
315
|
+
lines.push(`|---|---|`);
|
|
316
|
+
if (input.projectName)
|
|
317
|
+
lines.push(tableRow('Project', input.projectName));
|
|
318
|
+
if (input.branch)
|
|
319
|
+
lines.push(tableRow('Branch', input.branch));
|
|
320
|
+
if (input.commitSha)
|
|
321
|
+
lines.push(tableRow('Commit', `\`${input.commitSha}\``));
|
|
322
|
+
if (input.buildId)
|
|
323
|
+
lines.push(tableRow('Build ID', `\`${input.buildId}\``));
|
|
324
|
+
lines.push(tableRow('Categories analyzed', String(input.results.length)));
|
|
325
|
+
lines.push('');
|
|
326
|
+
const failedSections = sections.filter((s) => s.included && s.gateEvaluated && s.passed === false);
|
|
327
|
+
const passedSections = sections.filter((s) => s.included && s.gateEvaluated && s.passed === true);
|
|
328
|
+
if (failedSections.length > 0) {
|
|
329
|
+
lines.push('## Failed Gates');
|
|
330
|
+
lines.push('');
|
|
331
|
+
for (const s of failedSections) {
|
|
332
|
+
lines.push(`- **${s.title}** — gate FAILED`);
|
|
333
|
+
}
|
|
334
|
+
lines.push('');
|
|
335
|
+
}
|
|
336
|
+
if (passedSections.length > 0) {
|
|
337
|
+
lines.push('## Passed Gates');
|
|
338
|
+
lines.push('');
|
|
339
|
+
for (const s of passedSections) {
|
|
340
|
+
lines.push(`- **${s.title}** — gate PASSED`);
|
|
341
|
+
}
|
|
342
|
+
lines.push('');
|
|
343
|
+
}
|
|
344
|
+
lines.push('## Coverage Details');
|
|
345
|
+
lines.push('');
|
|
346
|
+
for (const result of input.results) {
|
|
347
|
+
const threshold = (_a = input.thresholds) === null || _a === void 0 ? void 0 : _a[result.type];
|
|
348
|
+
const failure = (_b = input.qualityGate) === null || _b === void 0 ? void 0 : _b.failures.find((f) => f.category === result.type);
|
|
349
|
+
const uncovered = result.totalItems - result.coveredItems;
|
|
350
|
+
lines.push(`### ${coverageTypeTitle(result.type)}`);
|
|
351
|
+
lines.push('');
|
|
352
|
+
lines.push(`- Coverage: ${pct(result.coveragePercent)}`);
|
|
353
|
+
lines.push(`- Covered: ${result.coveredItems} / ${result.totalItems}`);
|
|
354
|
+
lines.push(`- Uncovered items: ${uncovered}`);
|
|
355
|
+
if (threshold !== undefined) {
|
|
356
|
+
lines.push(`- Threshold: ${pct(threshold)}`);
|
|
357
|
+
lines.push(`- Gate result: ${failure ? 'FAIL' : 'PASS'}`);
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
lines.push(`- Gate: not configured`);
|
|
361
|
+
}
|
|
362
|
+
const gaps = extractGaps(result, 5);
|
|
363
|
+
if (gaps.length > 0) {
|
|
364
|
+
lines.push(`- Top gaps: ${gaps.join(', ')}`);
|
|
365
|
+
}
|
|
366
|
+
lines.push('');
|
|
367
|
+
}
|
|
368
|
+
if (failedSections.length > 0) {
|
|
369
|
+
lines.push('## Highest Priority Remediation Items');
|
|
370
|
+
lines.push('');
|
|
371
|
+
const sorted = [...input.results]
|
|
372
|
+
.filter((r) => {
|
|
373
|
+
var _a;
|
|
374
|
+
const t = (_a = input.thresholds) === null || _a === void 0 ? void 0 : _a[r.type];
|
|
375
|
+
return t !== undefined && r.coveragePercent < t;
|
|
376
|
+
})
|
|
377
|
+
.sort((a, b) => {
|
|
378
|
+
var _a, _b, _c, _d;
|
|
379
|
+
const ta = (_b = (_a = input.thresholds) === null || _a === void 0 ? void 0 : _a[a.type]) !== null && _b !== void 0 ? _b : 100;
|
|
380
|
+
const tb = (_d = (_c = input.thresholds) === null || _c === void 0 ? void 0 : _c[b.type]) !== null && _d !== void 0 ? _d : 100;
|
|
381
|
+
return (ta - a.coveragePercent) - (tb - b.coveragePercent);
|
|
382
|
+
})
|
|
383
|
+
.reverse();
|
|
384
|
+
for (const r of sorted) {
|
|
385
|
+
const t = (_d = (_c = input.thresholds) === null || _c === void 0 ? void 0 : _c[r.type]) !== null && _d !== void 0 ? _d : 100;
|
|
386
|
+
const gap = (t - r.coveragePercent).toFixed(2);
|
|
387
|
+
lines.push(`1. Increase **${r.type}** coverage by ${gap}% (from ${pct(r.coveragePercent)} to ${pct(t)})`);
|
|
388
|
+
}
|
|
389
|
+
lines.push('');
|
|
390
|
+
}
|
|
391
|
+
lines.push('## Recommended Next Steps');
|
|
392
|
+
lines.push('');
|
|
393
|
+
if (failedSections.length > 0) {
|
|
394
|
+
lines.push('- Add tests to cover the gaps listed above in each failed category.');
|
|
395
|
+
lines.push('- Re-run the coverage analysis after adding tests.');
|
|
396
|
+
lines.push('- Consider raising thresholds once gaps are closed.');
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
lines.push('- All configured gates passed.');
|
|
400
|
+
lines.push('- Consider raising thresholds to enforce higher coverage standards.');
|
|
401
|
+
lines.push('- Review uncovered items and add tests to reach 100% where possible.');
|
|
402
|
+
}
|
|
403
|
+
lines.push('');
|
|
404
|
+
// Intelligence summary section (if available)
|
|
405
|
+
if (input.intelligenceSummary) {
|
|
406
|
+
lines.push(renderIntelligenceSection(input.intelligenceSummary));
|
|
407
|
+
}
|
|
408
|
+
return lines.join('\n');
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Render a Coverage Intelligence section for inclusion in build/PR summaries.
|
|
412
|
+
*/
|
|
413
|
+
function renderIntelligenceSection(intel) {
|
|
414
|
+
var _a, _b, _c, _d;
|
|
415
|
+
const lines = [];
|
|
416
|
+
const p0 = (_a = intel.recommendationsByPriority['P0']) !== null && _a !== void 0 ? _a : 0;
|
|
417
|
+
const p1 = (_b = intel.recommendationsByPriority['P1']) !== null && _b !== void 0 ? _b : 0;
|
|
418
|
+
const p2 = (_c = intel.recommendationsByPriority['P2']) !== null && _c !== void 0 ? _c : 0;
|
|
419
|
+
const p3 = (_d = intel.recommendationsByPriority['P3']) !== null && _d !== void 0 ? _d : 0;
|
|
420
|
+
lines.push('## Coverage Intelligence');
|
|
421
|
+
lines.push('');
|
|
422
|
+
lines.push('| | |');
|
|
423
|
+
lines.push('|---|---|');
|
|
424
|
+
lines.push(tableRow('Functional findings', String(intel.totalFindings)));
|
|
425
|
+
lines.push(tableRow('Missing test recommendations', String(intel.totalRecommendations)));
|
|
426
|
+
lines.push(tableRow('Max risk score', String(intel.maxRiskScore)));
|
|
427
|
+
lines.push(tableRow('Avg risk score', String(intel.avgRiskScore)));
|
|
428
|
+
lines.push(tableRow('Critical uncovered items', String(intel.criticalUncoveredItems)));
|
|
429
|
+
lines.push(tableRow('Unprotected security findings', String(intel.unprotectedSecurityFindings)));
|
|
430
|
+
lines.push('');
|
|
431
|
+
if (intel.totalRecommendations > 0) {
|
|
432
|
+
lines.push('### Recommendations by Priority');
|
|
433
|
+
lines.push('');
|
|
434
|
+
lines.push('| Priority | Count |');
|
|
435
|
+
lines.push('|---|---|');
|
|
436
|
+
if (p0 > 0)
|
|
437
|
+
lines.push(`| **P0** (Immediate) | ${p0} |`);
|
|
438
|
+
if (p1 > 0)
|
|
439
|
+
lines.push(`| **P1** (High) | ${p1} |`);
|
|
440
|
+
if (p2 > 0)
|
|
441
|
+
lines.push(`| **P2** (Medium) | ${p2} |`);
|
|
442
|
+
if (p3 > 0)
|
|
443
|
+
lines.push(`| **P3** (Low) | ${p3} |`);
|
|
444
|
+
lines.push('');
|
|
445
|
+
}
|
|
446
|
+
if (intel.topRiskAreas.length > 0) {
|
|
447
|
+
lines.push('### Top Risk Areas');
|
|
448
|
+
lines.push('');
|
|
449
|
+
for (const area of intel.topRiskAreas.slice(0, 5)) {
|
|
450
|
+
lines.push(`- ${area}`);
|
|
451
|
+
}
|
|
452
|
+
lines.push('');
|
|
453
|
+
}
|
|
454
|
+
if (p0 > 0) {
|
|
455
|
+
lines.push(`> ⚠️ **${p0} P0 recommendation(s) require immediate attention** before merging.`);
|
|
456
|
+
lines.push('');
|
|
457
|
+
}
|
|
458
|
+
return lines.join('\n');
|
|
459
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Summary engine – PR comment summary generator.
|
|
3
|
+
*
|
|
4
|
+
* Generates concise PR comment markdown from analysis results.
|
|
5
|
+
* Uses the same gate-aware inclusion logic as generateBuildSummary
|
|
6
|
+
* but produces a shorter format suitable for PR comments.
|
|
7
|
+
*
|
|
8
|
+
* Public API:
|
|
9
|
+
* generatePrSummary(input): Promise<SummaryResult>
|
|
10
|
+
*/
|
|
11
|
+
import { SummaryInput, SummaryResult } from './markdownRenderer';
|
|
12
|
+
/**
|
|
13
|
+
* Generate a concise PR comment summary from analysis results.
|
|
14
|
+
*
|
|
15
|
+
* The PR summary is shorter than the build summary – it shows the key status
|
|
16
|
+
* table and links to the full report, while still honouring gate-aware
|
|
17
|
+
* inclusion rules.
|
|
18
|
+
*
|
|
19
|
+
* @param input All analysis results and configuration.
|
|
20
|
+
* @param outDir Optional directory to write pr-summary.md to.
|
|
21
|
+
*/
|
|
22
|
+
export declare function generatePrSummary(input: SummaryInput, outDir?: string): Promise<SummaryResult>;
|
|
23
|
+
export type { SummaryInput, SummaryResult, SummarySection, SummaryConfig } from './markdownRenderer';
|
|
24
|
+
//# sourceMappingURL=prSummary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prSummary.d.ts","sourceRoot":"","sources":["../../../src/summary/prSummary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EACL,YAAY,EACZ,aAAa,EAWd,MAAM,oBAAoB,CAAC;AAK5B;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,YAAY,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CAuFxB;AAuHD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|