lhci-ai-assistant 0.1.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/LICENSE +21 -0
- package/README.md +228 -0
- package/dist/ai/copilot.d.ts +40 -0
- package/dist/ai/copilot.d.ts.map +1 -0
- package/dist/ai/copilot.js +176 -0
- package/dist/ai/copilot.js.map +1 -0
- package/dist/ai/local.d.ts +11 -0
- package/dist/ai/local.d.ts.map +1 -0
- package/dist/ai/local.js +199 -0
- package/dist/ai/local.js.map +1 -0
- package/dist/ai/openai.d.ts +39 -0
- package/dist/ai/openai.d.ts.map +1 -0
- package/dist/ai/openai.js +113 -0
- package/dist/ai/openai.js.map +1 -0
- package/dist/ai/prompt.d.ts +36 -0
- package/dist/ai/prompt.d.ts.map +1 -0
- package/dist/ai/prompt.js +190 -0
- package/dist/ai/prompt.js.map +1 -0
- package/dist/analyzer.d.ts +19 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +264 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/autofix/generator.d.ts +27 -0
- package/dist/autofix/generator.d.ts.map +1 -0
- package/dist/autofix/generator.js +153 -0
- package/dist/autofix/generator.js.map +1 -0
- package/dist/autofix/patterns.d.ts +34 -0
- package/dist/autofix/patterns.d.ts.map +1 -0
- package/dist/autofix/patterns.js +247 -0
- package/dist/autofix/patterns.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +159 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +109 -0
- package/dist/config.js.map +1 -0
- package/dist/github/diff-fetcher.d.ts +43 -0
- package/dist/github/diff-fetcher.d.ts.map +1 -0
- package/dist/github/diff-fetcher.js +183 -0
- package/dist/github/diff-fetcher.js.map +1 -0
- package/dist/github/pr-commenter.d.ts +18 -0
- package/dist/github/pr-commenter.d.ts.map +1 -0
- package/dist/github/pr-commenter.js +229 -0
- package/dist/github/pr-commenter.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/comparator.d.ts +10 -0
- package/dist/metrics/comparator.d.ts.map +1 -0
- package/dist/metrics/comparator.js +228 -0
- package/dist/metrics/comparator.js.map +1 -0
- package/dist/metrics/extractor.d.ts +26 -0
- package/dist/metrics/extractor.d.ts.map +1 -0
- package/dist/metrics/extractor.js +174 -0
- package/dist/metrics/extractor.js.map +1 -0
- package/dist/metrics/loader.d.ts +35 -0
- package/dist/metrics/loader.d.ts.map +1 -0
- package/dist/metrics/loader.js +94 -0
- package/dist/metrics/loader.js.map +1 -0
- package/dist/output/json.d.ts +23 -0
- package/dist/output/json.d.ts.map +1 -0
- package/dist/output/json.js +144 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/markdown.d.ts +10 -0
- package/dist/output/markdown.d.ts.map +1 -0
- package/dist/output/markdown.js +226 -0
- package/dist/output/markdown.js.map +1 -0
- package/dist/output/terminal.d.ts +22 -0
- package/dist/output/terminal.d.ts.map +1 -0
- package/dist/output/terminal.js +238 -0
- package/dist/output/terminal.js.map +1 -0
- package/dist/types.d.ts +156 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchPRDiff = fetchPRDiff;
|
|
4
|
+
exports.fetchCommitDiff = fetchCommitDiff;
|
|
5
|
+
exports.getRepoFromEnv = getRepoFromEnv;
|
|
6
|
+
exports.getPRNumberFromEnv = getPRNumberFromEnv;
|
|
7
|
+
exports.getBaseHashFromEnv = getBaseHashFromEnv;
|
|
8
|
+
exports.getCurrentHashFromEnv = getCurrentHashFromEnv;
|
|
9
|
+
exports.filterPerformanceRelevantFiles = filterPerformanceRelevantFiles;
|
|
10
|
+
exports.summarizeCodeChanges = summarizeCodeChanges;
|
|
11
|
+
const GITHUB_API_BASE = 'https://api.github.com';
|
|
12
|
+
/**
|
|
13
|
+
* Fetch the diff for a pull request
|
|
14
|
+
*/
|
|
15
|
+
async function fetchPRDiff(options) {
|
|
16
|
+
const url = `${GITHUB_API_BASE}/repos/${options.repo}/pulls/${options.prNumber}/files`;
|
|
17
|
+
const response = await fetch(url, {
|
|
18
|
+
headers: {
|
|
19
|
+
Authorization: `Bearer ${options.token}`,
|
|
20
|
+
Accept: 'application/vnd.github.v3+json',
|
|
21
|
+
'User-Agent': 'lhci-ai-assistant',
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
const error = await response.text();
|
|
26
|
+
throw new Error(`GitHub API error (${response.status}): ${error}`);
|
|
27
|
+
}
|
|
28
|
+
const files = (await response.json());
|
|
29
|
+
return {
|
|
30
|
+
files,
|
|
31
|
+
additions: files.reduce((sum, f) => sum + f.additions, 0),
|
|
32
|
+
deletions: files.reduce((sum, f) => sum + f.deletions, 0),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Fetch the diff between two commits
|
|
37
|
+
*/
|
|
38
|
+
async function fetchCommitDiff(options) {
|
|
39
|
+
const url = `${GITHUB_API_BASE}/repos/${options.repo}/compare/${options.base}...${options.head}`;
|
|
40
|
+
const response = await fetch(url, {
|
|
41
|
+
headers: {
|
|
42
|
+
Authorization: `Bearer ${options.token}`,
|
|
43
|
+
Accept: 'application/vnd.github.v3+json',
|
|
44
|
+
'User-Agent': 'lhci-ai-assistant',
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
const error = await response.text();
|
|
49
|
+
throw new Error(`GitHub API error (${response.status}): ${error}`);
|
|
50
|
+
}
|
|
51
|
+
const data = await response.json();
|
|
52
|
+
const files = (data.files || []);
|
|
53
|
+
return {
|
|
54
|
+
files,
|
|
55
|
+
additions: files.reduce((sum, f) => sum + f.additions, 0),
|
|
56
|
+
deletions: files.reduce((sum, f) => sum + f.deletions, 0),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get repository name from environment variables
|
|
61
|
+
*/
|
|
62
|
+
function getRepoFromEnv() {
|
|
63
|
+
return process.env.GITHUB_REPOSITORY;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get PR number from environment variables (GitHub Actions)
|
|
67
|
+
*/
|
|
68
|
+
function getPRNumberFromEnv() {
|
|
69
|
+
// GitHub Actions sets GITHUB_REF for pull requests
|
|
70
|
+
const ref = process.env.GITHUB_REF;
|
|
71
|
+
if (ref) {
|
|
72
|
+
const match = ref.match(/refs\/pull\/(\d+)/);
|
|
73
|
+
if (match) {
|
|
74
|
+
return parseInt(match[1], 10);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Also check GITHUB_EVENT_PATH for PR events
|
|
78
|
+
const eventPath = process.env.GITHUB_EVENT_PATH;
|
|
79
|
+
if (eventPath) {
|
|
80
|
+
try {
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
82
|
+
const event = require(eventPath);
|
|
83
|
+
if (event.pull_request?.number) {
|
|
84
|
+
return event.pull_request.number;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Ignore errors reading event file
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the base commit hash from environment
|
|
95
|
+
*/
|
|
96
|
+
function getBaseHashFromEnv() {
|
|
97
|
+
// GitHub Actions sets GITHUB_BASE_REF for pull requests
|
|
98
|
+
return process.env.GITHUB_BASE_REF || process.env.LHCI_BUILD_CONTEXT__BASE_HASH;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the current commit hash from environment
|
|
102
|
+
*/
|
|
103
|
+
function getCurrentHashFromEnv() {
|
|
104
|
+
return process.env.GITHUB_SHA || process.env.LHCI_BUILD_CONTEXT__CURRENT_HASH;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Filter files to only performance-relevant ones
|
|
108
|
+
*/
|
|
109
|
+
function filterPerformanceRelevantFiles(files) {
|
|
110
|
+
const relevantExtensions = [
|
|
111
|
+
'.js',
|
|
112
|
+
'.ts',
|
|
113
|
+
'.jsx',
|
|
114
|
+
'.tsx',
|
|
115
|
+
'.css',
|
|
116
|
+
'.scss',
|
|
117
|
+
'.less',
|
|
118
|
+
'.html',
|
|
119
|
+
'.vue',
|
|
120
|
+
'.svelte',
|
|
121
|
+
'.png',
|
|
122
|
+
'.jpg',
|
|
123
|
+
'.jpeg',
|
|
124
|
+
'.gif',
|
|
125
|
+
'.webp',
|
|
126
|
+
'.avif',
|
|
127
|
+
'.svg',
|
|
128
|
+
'.woff',
|
|
129
|
+
'.woff2',
|
|
130
|
+
'.ttf',
|
|
131
|
+
'.eot',
|
|
132
|
+
];
|
|
133
|
+
const relevantPatterns = [
|
|
134
|
+
/webpack/i,
|
|
135
|
+
/vite/i,
|
|
136
|
+
/rollup/i,
|
|
137
|
+
/package\.json$/,
|
|
138
|
+
/tsconfig\.json$/,
|
|
139
|
+
];
|
|
140
|
+
return files.filter((file) => {
|
|
141
|
+
const ext = file.filename.substring(file.filename.lastIndexOf('.'));
|
|
142
|
+
if (relevantExtensions.includes(ext.toLowerCase())) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
return relevantPatterns.some((pattern) => pattern.test(file.filename));
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Summarize code changes for AI analysis
|
|
150
|
+
*/
|
|
151
|
+
function summarizeCodeChanges(diff) {
|
|
152
|
+
if (!diff.files || diff.files.length === 0) {
|
|
153
|
+
return 'No code changes available.';
|
|
154
|
+
}
|
|
155
|
+
const relevantFiles = filterPerformanceRelevantFiles(diff.files);
|
|
156
|
+
if (relevantFiles.length === 0) {
|
|
157
|
+
return 'No performance-relevant code changes detected.';
|
|
158
|
+
}
|
|
159
|
+
const lines = [
|
|
160
|
+
`${relevantFiles.length} performance-relevant files changed:`,
|
|
161
|
+
];
|
|
162
|
+
// Group by type
|
|
163
|
+
const byType = {};
|
|
164
|
+
for (const file of relevantFiles) {
|
|
165
|
+
const ext = file.filename.substring(file.filename.lastIndexOf('.'));
|
|
166
|
+
if (!byType[ext]) {
|
|
167
|
+
byType[ext] = [];
|
|
168
|
+
}
|
|
169
|
+
byType[ext].push(file);
|
|
170
|
+
}
|
|
171
|
+
for (const [ext, files] of Object.entries(byType)) {
|
|
172
|
+
lines.push(`\n${ext} files (${files.length}):`);
|
|
173
|
+
for (const file of files.slice(0, 5)) {
|
|
174
|
+
lines.push(` • ${file.filename} (+${file.additions}/-${file.deletions})`);
|
|
175
|
+
}
|
|
176
|
+
if (files.length > 5) {
|
|
177
|
+
lines.push(` ... and ${files.length - 5} more`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
lines.push(`\nTotal: +${diff.additions}/-${diff.deletions} lines`);
|
|
181
|
+
return lines.join('\n');
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=diff-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-fetcher.js","sourceRoot":"","sources":["../../src/github/diff-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AnalysisResult } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Post or update a comment on a pull request
|
|
4
|
+
*/
|
|
5
|
+
export declare function postPRComment(options: {
|
|
6
|
+
token: string;
|
|
7
|
+
repo: string;
|
|
8
|
+
prNumber: number;
|
|
9
|
+
body: string;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
id: number;
|
|
12
|
+
url: string;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* Format analysis result as a PR comment
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatPRComment(result: AnalysisResult): string;
|
|
18
|
+
//# sourceMappingURL=pr-commenter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-commenter.d.ts","sourceRoot":"","sources":["../../src/github/pr-commenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAK1C;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBvC;AA8GD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAuF9D"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.postPRComment = postPRComment;
|
|
4
|
+
exports.formatPRComment = formatPRComment;
|
|
5
|
+
const GITHUB_API_BASE = 'https://api.github.com';
|
|
6
|
+
const COMMENT_MARKER = '<!-- lhci-ai-assistant -->';
|
|
7
|
+
/**
|
|
8
|
+
* Post or update a comment on a pull request
|
|
9
|
+
*/
|
|
10
|
+
async function postPRComment(options) {
|
|
11
|
+
// First, try to find an existing comment from this tool
|
|
12
|
+
const existingComment = await findExistingComment(options);
|
|
13
|
+
if (existingComment) {
|
|
14
|
+
// Update existing comment
|
|
15
|
+
return updateComment({
|
|
16
|
+
token: options.token,
|
|
17
|
+
repo: options.repo,
|
|
18
|
+
commentId: existingComment.id,
|
|
19
|
+
body: options.body,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
// Create new comment
|
|
23
|
+
return createComment(options);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Find an existing comment from this tool
|
|
27
|
+
*/
|
|
28
|
+
async function findExistingComment(options) {
|
|
29
|
+
const url = `${GITHUB_API_BASE}/repos/${options.repo}/issues/${options.prNumber}/comments`;
|
|
30
|
+
const response = await fetch(url, {
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Bearer ${options.token}`,
|
|
33
|
+
Accept: 'application/vnd.github.v3+json',
|
|
34
|
+
'User-Agent': 'lhci-ai-assistant',
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const comments = await response.json();
|
|
41
|
+
for (const comment of comments) {
|
|
42
|
+
if (comment.body?.includes(COMMENT_MARKER)) {
|
|
43
|
+
return {
|
|
44
|
+
id: comment.id,
|
|
45
|
+
url: comment.html_url,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create a new comment
|
|
53
|
+
*/
|
|
54
|
+
async function createComment(options) {
|
|
55
|
+
const url = `${GITHUB_API_BASE}/repos/${options.repo}/issues/${options.prNumber}/comments`;
|
|
56
|
+
const response = await fetch(url, {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: {
|
|
59
|
+
Authorization: `Bearer ${options.token}`,
|
|
60
|
+
Accept: 'application/vnd.github.v3+json',
|
|
61
|
+
'Content-Type': 'application/json',
|
|
62
|
+
'User-Agent': 'lhci-ai-assistant',
|
|
63
|
+
},
|
|
64
|
+
body: JSON.stringify({
|
|
65
|
+
body: `${COMMENT_MARKER}\n${options.body}`,
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
const error = await response.text();
|
|
70
|
+
throw new Error(`Failed to create comment (${response.status}): ${error}`);
|
|
71
|
+
}
|
|
72
|
+
const data = await response.json();
|
|
73
|
+
return {
|
|
74
|
+
id: data.id,
|
|
75
|
+
url: data.html_url,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Update an existing comment
|
|
80
|
+
*/
|
|
81
|
+
async function updateComment(options) {
|
|
82
|
+
const url = `${GITHUB_API_BASE}/repos/${options.repo}/issues/comments/${options.commentId}`;
|
|
83
|
+
const response = await fetch(url, {
|
|
84
|
+
method: 'PATCH',
|
|
85
|
+
headers: {
|
|
86
|
+
Authorization: `Bearer ${options.token}`,
|
|
87
|
+
Accept: 'application/vnd.github.v3+json',
|
|
88
|
+
'Content-Type': 'application/json',
|
|
89
|
+
'User-Agent': 'lhci-ai-assistant',
|
|
90
|
+
},
|
|
91
|
+
body: JSON.stringify({
|
|
92
|
+
body: `${COMMENT_MARKER}\n${options.body}`,
|
|
93
|
+
}),
|
|
94
|
+
});
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
const error = await response.text();
|
|
97
|
+
throw new Error(`Failed to update comment (${response.status}): ${error}`);
|
|
98
|
+
}
|
|
99
|
+
const data = await response.json();
|
|
100
|
+
return {
|
|
101
|
+
id: data.id,
|
|
102
|
+
url: data.html_url,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Format analysis result as a PR comment
|
|
107
|
+
*/
|
|
108
|
+
function formatPRComment(result) {
|
|
109
|
+
const lines = [
|
|
110
|
+
'## 🔍 LHCI AI Analysis',
|
|
111
|
+
'',
|
|
112
|
+
result.summary,
|
|
113
|
+
'',
|
|
114
|
+
];
|
|
115
|
+
// Regressions
|
|
116
|
+
if (result.regressions.length > 0) {
|
|
117
|
+
lines.push('### ⚠️ Performance Regressions');
|
|
118
|
+
lines.push('');
|
|
119
|
+
lines.push('| Metric | Before | After | Change | Severity |');
|
|
120
|
+
lines.push('|--------|--------|-------|--------|----------|');
|
|
121
|
+
for (const r of result.regressions) {
|
|
122
|
+
const before = formatMetricValue(r.metric, r.base);
|
|
123
|
+
const after = formatMetricValue(r.metric, r.current);
|
|
124
|
+
const change = formatChange(r.metric, r.diff);
|
|
125
|
+
const severity = getSeverityEmoji(r.severity);
|
|
126
|
+
lines.push(`| ${r.metric} | ${before} | ${after} | ${change} | ${severity} |`);
|
|
127
|
+
}
|
|
128
|
+
lines.push('');
|
|
129
|
+
}
|
|
130
|
+
// Improvements
|
|
131
|
+
if (result.improvements.length > 0) {
|
|
132
|
+
lines.push('### ✅ Improvements');
|
|
133
|
+
lines.push('');
|
|
134
|
+
for (const i of result.improvements) {
|
|
135
|
+
const change = formatChange(i.metric, i.diff);
|
|
136
|
+
lines.push(`- **${i.metric}**: ${change}`);
|
|
137
|
+
}
|
|
138
|
+
lines.push('');
|
|
139
|
+
}
|
|
140
|
+
// Root causes
|
|
141
|
+
if (result.rootCauses.length > 0) {
|
|
142
|
+
lines.push('### 🔎 Root Cause Analysis');
|
|
143
|
+
lines.push('');
|
|
144
|
+
for (const cause of result.rootCauses) {
|
|
145
|
+
lines.push(`**${cause.metric}**: ${cause.cause}`);
|
|
146
|
+
if (cause.relatedFiles && cause.relatedFiles.length > 0) {
|
|
147
|
+
lines.push(` - Related files: ${cause.relatedFiles.join(', ')}`);
|
|
148
|
+
}
|
|
149
|
+
lines.push('');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Recommendations
|
|
153
|
+
if (result.recommendations.length > 0) {
|
|
154
|
+
lines.push('### 💡 Recommendations');
|
|
155
|
+
lines.push('');
|
|
156
|
+
for (const rec of result.recommendations) {
|
|
157
|
+
const priority = getPriorityEmoji(rec.priority);
|
|
158
|
+
lines.push(`${priority} **${rec.title}**`);
|
|
159
|
+
lines.push(` ${rec.description}`);
|
|
160
|
+
lines.push('');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Auto-fixes
|
|
164
|
+
if (result.autoFixes && result.autoFixes.length > 0) {
|
|
165
|
+
lines.push('### 🔧 Suggested Fixes');
|
|
166
|
+
lines.push('');
|
|
167
|
+
for (const fix of result.autoFixes) {
|
|
168
|
+
lines.push(`<details>`);
|
|
169
|
+
lines.push(`<summary><strong>${fix.title}</strong></summary>`);
|
|
170
|
+
lines.push('');
|
|
171
|
+
lines.push(fix.description);
|
|
172
|
+
lines.push('');
|
|
173
|
+
lines.push('```diff');
|
|
174
|
+
lines.push(fix.diff);
|
|
175
|
+
lines.push('```');
|
|
176
|
+
lines.push('</details>');
|
|
177
|
+
lines.push('');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
lines.push('---');
|
|
181
|
+
lines.push('*Generated by [lhci-ai-assistant](https://github.com/example/lhci-ai-assistant)*');
|
|
182
|
+
return lines.join('\n');
|
|
183
|
+
}
|
|
184
|
+
function formatMetricValue(metric, value) {
|
|
185
|
+
if (metric.includes('Score')) {
|
|
186
|
+
return `${(value * 100).toFixed(0)}%`;
|
|
187
|
+
}
|
|
188
|
+
if (metric === 'CLS') {
|
|
189
|
+
return value.toFixed(3);
|
|
190
|
+
}
|
|
191
|
+
return `${value.toFixed(0)}ms`;
|
|
192
|
+
}
|
|
193
|
+
function formatChange(metric, diff) {
|
|
194
|
+
const sign = diff >= 0 ? '+' : '';
|
|
195
|
+
if (metric.includes('Score')) {
|
|
196
|
+
return `${sign}${(diff * 100).toFixed(1)}%`;
|
|
197
|
+
}
|
|
198
|
+
if (metric === 'CLS') {
|
|
199
|
+
return `${sign}${diff.toFixed(3)}`;
|
|
200
|
+
}
|
|
201
|
+
return `${sign}${diff.toFixed(0)}ms`;
|
|
202
|
+
}
|
|
203
|
+
function getSeverityEmoji(severity) {
|
|
204
|
+
switch (severity) {
|
|
205
|
+
case 'critical':
|
|
206
|
+
return '🔴 Critical';
|
|
207
|
+
case 'high':
|
|
208
|
+
return '🟠 High';
|
|
209
|
+
case 'medium':
|
|
210
|
+
return '🟡 Medium';
|
|
211
|
+
case 'low':
|
|
212
|
+
return '🟢 Low';
|
|
213
|
+
default:
|
|
214
|
+
return severity;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function getPriorityEmoji(priority) {
|
|
218
|
+
switch (priority) {
|
|
219
|
+
case 'high':
|
|
220
|
+
return '🔴';
|
|
221
|
+
case 'medium':
|
|
222
|
+
return '🟡';
|
|
223
|
+
case 'low':
|
|
224
|
+
return '🟢';
|
|
225
|
+
default:
|
|
226
|
+
return '•';
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=pr-commenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-commenter.js","sourceRoot":"","sources":["../../src/github/pr-commenter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LHCI AI Assistant - Programmatic API
|
|
3
|
+
*
|
|
4
|
+
* This module exports the public API for using lhci-ai-assistant programmatically.
|
|
5
|
+
*/
|
|
6
|
+
export { analyze, quickCheck } from './analyzer';
|
|
7
|
+
export type { AIProvider, OutputFormat, AnalyzeOptions, AnalysisResult, Metrics, MetricComparison, ComparisonResult, Recommendation, RootCause, AutoFix, Config, LHReport, Opportunity, PRDiff, GitHubFile, } from './types';
|
|
8
|
+
export { loadConfig, mergeOptions, getGitHubToken, getOpenAIKey } from './config';
|
|
9
|
+
export { loadLighthouseReports, loadManifest, getRepresentativeRuns } from './metrics/loader';
|
|
10
|
+
export { extractMetrics, getMetricsSummary, formatScore, formatMs, formatBytes } from './metrics/extractor';
|
|
11
|
+
export { compareMetrics, getComparisonSummary } from './metrics/comparator';
|
|
12
|
+
export { fetchPRDiff, fetchCommitDiff, getRepoFromEnv, getPRNumberFromEnv, filterPerformanceRelevantFiles, } from './github/diff-fetcher';
|
|
13
|
+
export { postPRComment, formatPRComment } from './github/pr-commenter';
|
|
14
|
+
export { generateAnalysisPrompt, generateAutoFixPrompt, parseAnalysisResponse } from './ai/prompt';
|
|
15
|
+
export { analyzeWithCopilot, checkCopilotAccess, stopCopilotClient, listCopilotModels, CopilotError } from './ai/copilot';
|
|
16
|
+
export { analyzeWithOpenAI, checkOpenAIAccess, OpenAIError } from './ai/openai';
|
|
17
|
+
export { analyzeLocally } from './ai/local';
|
|
18
|
+
export { generateAutoFixes, scanForOptimizations, generateFixForRegression } from './autofix/generator';
|
|
19
|
+
export { fixPatterns, findApplicablePatterns, findPatternsForMetric } from './autofix/patterns';
|
|
20
|
+
export { outputToTerminal, outputProgress, outputSuccess, outputError, outputWarning } from './output/terminal';
|
|
21
|
+
export { formatAsMarkdown, formatQuickSummary } from './output/markdown';
|
|
22
|
+
export { formatAsJSON, parseFromJSON, formatMinimalJSON, formatAsSARIF } from './output/json';
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGjD,YAAY,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,EACR,WAAW,EACX,MAAM,EACN,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGlF,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5E,OAAO,EACL,WAAW,EACX,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,8BAA8B,GAC/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGvE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1H,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACxG,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAGhG,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LHCI AI Assistant - Programmatic API
|
|
4
|
+
*
|
|
5
|
+
* This module exports the public API for using lhci-ai-assistant programmatically.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.parseFromJSON = exports.formatAsJSON = exports.formatQuickSummary = exports.formatAsMarkdown = exports.outputWarning = exports.outputError = exports.outputSuccess = exports.outputProgress = exports.outputToTerminal = exports.findPatternsForMetric = exports.findApplicablePatterns = exports.fixPatterns = exports.generateFixForRegression = exports.scanForOptimizations = exports.generateAutoFixes = exports.analyzeLocally = exports.OpenAIError = exports.checkOpenAIAccess = exports.analyzeWithOpenAI = exports.CopilotError = exports.listCopilotModels = exports.stopCopilotClient = exports.checkCopilotAccess = exports.analyzeWithCopilot = exports.parseAnalysisResponse = exports.generateAutoFixPrompt = exports.generateAnalysisPrompt = exports.formatPRComment = exports.postPRComment = exports.filterPerformanceRelevantFiles = exports.getPRNumberFromEnv = exports.getRepoFromEnv = exports.fetchCommitDiff = exports.fetchPRDiff = exports.getComparisonSummary = exports.compareMetrics = exports.formatBytes = exports.formatMs = exports.formatScore = exports.getMetricsSummary = exports.extractMetrics = exports.getRepresentativeRuns = exports.loadManifest = exports.loadLighthouseReports = exports.getOpenAIKey = exports.getGitHubToken = exports.mergeOptions = exports.loadConfig = exports.quickCheck = exports.analyze = void 0;
|
|
9
|
+
exports.formatAsSARIF = exports.formatMinimalJSON = void 0;
|
|
10
|
+
// Main analyzer
|
|
11
|
+
var analyzer_1 = require("./analyzer");
|
|
12
|
+
Object.defineProperty(exports, "analyze", { enumerable: true, get: function () { return analyzer_1.analyze; } });
|
|
13
|
+
Object.defineProperty(exports, "quickCheck", { enumerable: true, get: function () { return analyzer_1.quickCheck; } });
|
|
14
|
+
// Configuration
|
|
15
|
+
var config_1 = require("./config");
|
|
16
|
+
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
|
|
17
|
+
Object.defineProperty(exports, "mergeOptions", { enumerable: true, get: function () { return config_1.mergeOptions; } });
|
|
18
|
+
Object.defineProperty(exports, "getGitHubToken", { enumerable: true, get: function () { return config_1.getGitHubToken; } });
|
|
19
|
+
Object.defineProperty(exports, "getOpenAIKey", { enumerable: true, get: function () { return config_1.getOpenAIKey; } });
|
|
20
|
+
// Metrics
|
|
21
|
+
var loader_1 = require("./metrics/loader");
|
|
22
|
+
Object.defineProperty(exports, "loadLighthouseReports", { enumerable: true, get: function () { return loader_1.loadLighthouseReports; } });
|
|
23
|
+
Object.defineProperty(exports, "loadManifest", { enumerable: true, get: function () { return loader_1.loadManifest; } });
|
|
24
|
+
Object.defineProperty(exports, "getRepresentativeRuns", { enumerable: true, get: function () { return loader_1.getRepresentativeRuns; } });
|
|
25
|
+
var extractor_1 = require("./metrics/extractor");
|
|
26
|
+
Object.defineProperty(exports, "extractMetrics", { enumerable: true, get: function () { return extractor_1.extractMetrics; } });
|
|
27
|
+
Object.defineProperty(exports, "getMetricsSummary", { enumerable: true, get: function () { return extractor_1.getMetricsSummary; } });
|
|
28
|
+
Object.defineProperty(exports, "formatScore", { enumerable: true, get: function () { return extractor_1.formatScore; } });
|
|
29
|
+
Object.defineProperty(exports, "formatMs", { enumerable: true, get: function () { return extractor_1.formatMs; } });
|
|
30
|
+
Object.defineProperty(exports, "formatBytes", { enumerable: true, get: function () { return extractor_1.formatBytes; } });
|
|
31
|
+
var comparator_1 = require("./metrics/comparator");
|
|
32
|
+
Object.defineProperty(exports, "compareMetrics", { enumerable: true, get: function () { return comparator_1.compareMetrics; } });
|
|
33
|
+
Object.defineProperty(exports, "getComparisonSummary", { enumerable: true, get: function () { return comparator_1.getComparisonSummary; } });
|
|
34
|
+
// GitHub
|
|
35
|
+
var diff_fetcher_1 = require("./github/diff-fetcher");
|
|
36
|
+
Object.defineProperty(exports, "fetchPRDiff", { enumerable: true, get: function () { return diff_fetcher_1.fetchPRDiff; } });
|
|
37
|
+
Object.defineProperty(exports, "fetchCommitDiff", { enumerable: true, get: function () { return diff_fetcher_1.fetchCommitDiff; } });
|
|
38
|
+
Object.defineProperty(exports, "getRepoFromEnv", { enumerable: true, get: function () { return diff_fetcher_1.getRepoFromEnv; } });
|
|
39
|
+
Object.defineProperty(exports, "getPRNumberFromEnv", { enumerable: true, get: function () { return diff_fetcher_1.getPRNumberFromEnv; } });
|
|
40
|
+
Object.defineProperty(exports, "filterPerformanceRelevantFiles", { enumerable: true, get: function () { return diff_fetcher_1.filterPerformanceRelevantFiles; } });
|
|
41
|
+
var pr_commenter_1 = require("./github/pr-commenter");
|
|
42
|
+
Object.defineProperty(exports, "postPRComment", { enumerable: true, get: function () { return pr_commenter_1.postPRComment; } });
|
|
43
|
+
Object.defineProperty(exports, "formatPRComment", { enumerable: true, get: function () { return pr_commenter_1.formatPRComment; } });
|
|
44
|
+
// AI
|
|
45
|
+
var prompt_1 = require("./ai/prompt");
|
|
46
|
+
Object.defineProperty(exports, "generateAnalysisPrompt", { enumerable: true, get: function () { return prompt_1.generateAnalysisPrompt; } });
|
|
47
|
+
Object.defineProperty(exports, "generateAutoFixPrompt", { enumerable: true, get: function () { return prompt_1.generateAutoFixPrompt; } });
|
|
48
|
+
Object.defineProperty(exports, "parseAnalysisResponse", { enumerable: true, get: function () { return prompt_1.parseAnalysisResponse; } });
|
|
49
|
+
var copilot_1 = require("./ai/copilot");
|
|
50
|
+
Object.defineProperty(exports, "analyzeWithCopilot", { enumerable: true, get: function () { return copilot_1.analyzeWithCopilot; } });
|
|
51
|
+
Object.defineProperty(exports, "checkCopilotAccess", { enumerable: true, get: function () { return copilot_1.checkCopilotAccess; } });
|
|
52
|
+
Object.defineProperty(exports, "stopCopilotClient", { enumerable: true, get: function () { return copilot_1.stopCopilotClient; } });
|
|
53
|
+
Object.defineProperty(exports, "listCopilotModels", { enumerable: true, get: function () { return copilot_1.listCopilotModels; } });
|
|
54
|
+
Object.defineProperty(exports, "CopilotError", { enumerable: true, get: function () { return copilot_1.CopilotError; } });
|
|
55
|
+
var openai_1 = require("./ai/openai");
|
|
56
|
+
Object.defineProperty(exports, "analyzeWithOpenAI", { enumerable: true, get: function () { return openai_1.analyzeWithOpenAI; } });
|
|
57
|
+
Object.defineProperty(exports, "checkOpenAIAccess", { enumerable: true, get: function () { return openai_1.checkOpenAIAccess; } });
|
|
58
|
+
Object.defineProperty(exports, "OpenAIError", { enumerable: true, get: function () { return openai_1.OpenAIError; } });
|
|
59
|
+
var local_1 = require("./ai/local");
|
|
60
|
+
Object.defineProperty(exports, "analyzeLocally", { enumerable: true, get: function () { return local_1.analyzeLocally; } });
|
|
61
|
+
// Auto-fix
|
|
62
|
+
var generator_1 = require("./autofix/generator");
|
|
63
|
+
Object.defineProperty(exports, "generateAutoFixes", { enumerable: true, get: function () { return generator_1.generateAutoFixes; } });
|
|
64
|
+
Object.defineProperty(exports, "scanForOptimizations", { enumerable: true, get: function () { return generator_1.scanForOptimizations; } });
|
|
65
|
+
Object.defineProperty(exports, "generateFixForRegression", { enumerable: true, get: function () { return generator_1.generateFixForRegression; } });
|
|
66
|
+
var patterns_1 = require("./autofix/patterns");
|
|
67
|
+
Object.defineProperty(exports, "fixPatterns", { enumerable: true, get: function () { return patterns_1.fixPatterns; } });
|
|
68
|
+
Object.defineProperty(exports, "findApplicablePatterns", { enumerable: true, get: function () { return patterns_1.findApplicablePatterns; } });
|
|
69
|
+
Object.defineProperty(exports, "findPatternsForMetric", { enumerable: true, get: function () { return patterns_1.findPatternsForMetric; } });
|
|
70
|
+
// Output
|
|
71
|
+
var terminal_1 = require("./output/terminal");
|
|
72
|
+
Object.defineProperty(exports, "outputToTerminal", { enumerable: true, get: function () { return terminal_1.outputToTerminal; } });
|
|
73
|
+
Object.defineProperty(exports, "outputProgress", { enumerable: true, get: function () { return terminal_1.outputProgress; } });
|
|
74
|
+
Object.defineProperty(exports, "outputSuccess", { enumerable: true, get: function () { return terminal_1.outputSuccess; } });
|
|
75
|
+
Object.defineProperty(exports, "outputError", { enumerable: true, get: function () { return terminal_1.outputError; } });
|
|
76
|
+
Object.defineProperty(exports, "outputWarning", { enumerable: true, get: function () { return terminal_1.outputWarning; } });
|
|
77
|
+
var markdown_1 = require("./output/markdown");
|
|
78
|
+
Object.defineProperty(exports, "formatAsMarkdown", { enumerable: true, get: function () { return markdown_1.formatAsMarkdown; } });
|
|
79
|
+
Object.defineProperty(exports, "formatQuickSummary", { enumerable: true, get: function () { return markdown_1.formatQuickSummary; } });
|
|
80
|
+
var json_1 = require("./output/json");
|
|
81
|
+
Object.defineProperty(exports, "formatAsJSON", { enumerable: true, get: function () { return json_1.formatAsJSON; } });
|
|
82
|
+
Object.defineProperty(exports, "parseFromJSON", { enumerable: true, get: function () { return json_1.parseFromJSON; } });
|
|
83
|
+
Object.defineProperty(exports, "formatMinimalJSON", { enumerable: true, get: function () { return json_1.formatMinimalJSON; } });
|
|
84
|
+
Object.defineProperty(exports, "formatAsSARIF", { enumerable: true, get: function () { return json_1.formatAsSARIF; } });
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;AAEH,gBAAgB;AAChB,uCAAiD;AAAxC,mGAAA,OAAO,OAAA;AAAE,sGAAA,UAAU,OAAA;AAqB5B,gBAAgB;AAChB,mCAAkF;AAAzE,oGAAA,UAAU,OAAA;AAAE,sGAAA,YAAY,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,sGAAA,YAAY,OAAA;AAE/D,UAAU;AACV,2CAA8F;AAArF,+GAAA,qBAAqB,OAAA;AAAE,sGAAA,YAAY,OAAA;AAAE,+GAAA,qBAAqB,OAAA;AACnE,iDAA4G;AAAnG,2GAAA,cAAc,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAAE,wGAAA,WAAW,OAAA;AAC9E,mDAA4E;AAAnE,4GAAA,cAAc,OAAA;AAAE,kHAAA,oBAAoB,OAAA;AAE7C,SAAS;AACT,sDAM+B;AAL7B,2GAAA,WAAW,OAAA;AACX,+GAAA,eAAe,OAAA;AACf,8GAAA,cAAc,OAAA;AACd,kHAAA,kBAAkB,OAAA;AAClB,8HAAA,8BAA8B,OAAA;AAEhC,sDAAuE;AAA9D,6GAAA,aAAa,OAAA;AAAE,+GAAA,eAAe,OAAA;AAEvC,KAAK;AACL,sCAAmG;AAA1F,gHAAA,sBAAsB,OAAA;AAAE,+GAAA,qBAAqB,OAAA;AAAE,+GAAA,qBAAqB,OAAA;AAC7E,wCAA0H;AAAjH,6GAAA,kBAAkB,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AAAE,uGAAA,YAAY,OAAA;AACnG,sCAAgF;AAAvE,2GAAA,iBAAiB,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAAE,qGAAA,WAAW,OAAA;AAC1D,oCAA4C;AAAnC,uGAAA,cAAc,OAAA;AAEvB,WAAW;AACX,iDAAwG;AAA/F,8GAAA,iBAAiB,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAAE,qHAAA,wBAAwB,OAAA;AAC1E,+CAAgG;AAAvF,uGAAA,WAAW,OAAA;AAAE,kHAAA,sBAAsB,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAEnE,SAAS;AACT,8CAAgH;AAAvG,4GAAA,gBAAgB,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,yGAAA,aAAa,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,yGAAA,aAAa,OAAA;AACpF,8CAAyE;AAAhE,4GAAA,gBAAgB,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAC7C,sCAA8F;AAArF,oGAAA,YAAY,OAAA;AAAE,qGAAA,aAAa,OAAA;AAAE,yGAAA,iBAAiB,OAAA;AAAE,qGAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Metrics, ComparisonResult } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Compare current metrics against baseline metrics
|
|
4
|
+
*/
|
|
5
|
+
export declare function compareMetrics(current: Metrics, baseline: Metrics): ComparisonResult;
|
|
6
|
+
/**
|
|
7
|
+
* Get a summary of the comparison result
|
|
8
|
+
*/
|
|
9
|
+
export declare function getComparisonSummary(result: ComparisonResult): string;
|
|
10
|
+
//# sourceMappingURL=comparator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparator.d.ts","sourceRoot":"","sources":["../../src/metrics/comparator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAoB,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEvE;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,GAChB,gBAAgB,CA+BlB;AA0MD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAuBrE"}
|