@releasehub/cli 1.0.1 → 1.1.1
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/dist/__tests__/ai.test.d.ts +2 -0
- package/dist/__tests__/ai.test.d.ts.map +1 -0
- package/dist/__tests__/ai.test.js +160 -0
- package/dist/__tests__/ai.test.js.map +1 -0
- package/dist/__tests__/cost.test.d.ts +2 -0
- package/dist/__tests__/cost.test.d.ts.map +1 -0
- package/dist/__tests__/cost.test.js +49 -0
- package/dist/__tests__/cost.test.js.map +1 -0
- package/dist/__tests__/formatters.test.d.ts +2 -0
- package/dist/__tests__/formatters.test.d.ts.map +1 -0
- package/dist/__tests__/formatters.test.js +133 -0
- package/dist/__tests__/formatters.test.js.map +1 -0
- package/dist/__tests__/generate.integration.test.d.ts +2 -0
- package/dist/__tests__/generate.integration.test.d.ts.map +1 -0
- package/dist/__tests__/generate.integration.test.js +162 -0
- package/dist/__tests__/generate.integration.test.js.map +1 -0
- package/dist/__tests__/github.test.d.ts +2 -0
- package/dist/__tests__/github.test.d.ts.map +1 -0
- package/dist/__tests__/github.test.js +44 -0
- package/dist/__tests__/github.test.js.map +1 -0
- package/dist/__tests__/prefilter.test.d.ts +2 -0
- package/dist/__tests__/prefilter.test.d.ts.map +1 -0
- package/dist/__tests__/prefilter.test.js +58 -0
- package/dist/__tests__/prefilter.test.js.map +1 -0
- package/dist/commands/ai.d.ts.map +1 -1
- package/dist/commands/ai.js +8 -3
- package/dist/commands/ai.js.map +1 -1
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +60 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/generate.d.ts +2 -0
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +35 -9
- package/dist/commands/generate.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/ai.d.ts +3 -1
- package/dist/lib/ai.d.ts.map +1 -1
- package/dist/lib/ai.js +85 -31
- package/dist/lib/ai.js.map +1 -1
- package/dist/lib/config.d.ts +3 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +11 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/cost.d.ts +13 -0
- package/dist/lib/cost.d.ts.map +1 -0
- package/dist/lib/cost.js +29 -0
- package/dist/lib/cost.js.map +1 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +0 -1
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/github.d.ts.map +1 -1
- package/dist/lib/github.js +3 -2
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/prefilter.d.ts +8 -0
- package/dist/lib/prefilter.d.ts.map +1 -0
- package/dist/lib/prefilter.js +34 -0
- package/dist/lib/prefilter.js.map +1 -0
- package/package.json +11 -3
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
// extractLinkedIssues is not exported — replicate the logic to test it
|
|
3
|
+
function extractLinkedIssues(body) {
|
|
4
|
+
if (!body)
|
|
5
|
+
return [];
|
|
6
|
+
const matches = body.matchAll(/(?:closes?|fixe?s?|resolves?)\s+#(\d+)/gi);
|
|
7
|
+
return [...matches].map(m => `#${m[1]}`);
|
|
8
|
+
}
|
|
9
|
+
describe('extractLinkedIssues', () => {
|
|
10
|
+
it('returns empty array for null body', () => {
|
|
11
|
+
expect(extractLinkedIssues(null)).toEqual([]);
|
|
12
|
+
});
|
|
13
|
+
it('returns empty array for body with no issue references', () => {
|
|
14
|
+
expect(extractLinkedIssues('This PR improves performance.')).toEqual([]);
|
|
15
|
+
});
|
|
16
|
+
it('extracts "Closes #123"', () => {
|
|
17
|
+
expect(extractLinkedIssues('Closes #123')).toEqual(['#123']);
|
|
18
|
+
});
|
|
19
|
+
it('extracts "Fixes #456"', () => {
|
|
20
|
+
expect(extractLinkedIssues('Fixes #456')).toEqual(['#456']);
|
|
21
|
+
});
|
|
22
|
+
it('extracts "Resolves #789"', () => {
|
|
23
|
+
expect(extractLinkedIssues('Resolves #789')).toEqual(['#789']);
|
|
24
|
+
});
|
|
25
|
+
it('is case-insensitive', () => {
|
|
26
|
+
expect(extractLinkedIssues('CLOSES #1\nFIXES #2\nRESOLVES #3')).toEqual(['#1', '#2', '#3']);
|
|
27
|
+
});
|
|
28
|
+
it('handles plural forms: close, fix, resolve', () => {
|
|
29
|
+
expect(extractLinkedIssues('close #10')).toEqual(['#10']);
|
|
30
|
+
expect(extractLinkedIssues('fix #11')).toEqual(['#11']);
|
|
31
|
+
expect(extractLinkedIssues('resolve #12')).toEqual(['#12']);
|
|
32
|
+
});
|
|
33
|
+
it('extracts multiple issues from one body', () => {
|
|
34
|
+
const body = 'This fixes #10 and closes #20.\nAlso resolves #30.';
|
|
35
|
+
expect(extractLinkedIssues(body)).toEqual(['#10', '#20', '#30']);
|
|
36
|
+
});
|
|
37
|
+
it('ignores bare issue numbers without keyword', () => {
|
|
38
|
+
expect(extractLinkedIssues('See #123 for context')).toEqual([]);
|
|
39
|
+
});
|
|
40
|
+
it('handles extra whitespace between keyword and number', () => {
|
|
41
|
+
expect(extractLinkedIssues('Closes #99')).toEqual(['#99']);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=github.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.test.js","sourceRoot":"","sources":["../../src/__tests__/github.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,uEAAuE;AACvE,SAAS,mBAAmB,CAAC,IAAmB;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,0CAA0C,CAAC,CAAA;IACzE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,mBAAmB,CAAC,+BAA+B,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,mBAAmB,CAAC,kCAAkC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QACzD,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;QACvD,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,oDAAoD,CAAA;QACjE,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefilter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/prefilter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { prefilterPRs } from '../lib/prefilter.js';
|
|
3
|
+
function pr(title, labels = []) {
|
|
4
|
+
return { number: 1, title, body: null, labels, author: 'a', merged_at: '', url: '', linked_issues: [] };
|
|
5
|
+
}
|
|
6
|
+
describe('prefilterPRs', () => {
|
|
7
|
+
it('passes user-facing PRs through to toAnalyze', () => {
|
|
8
|
+
const { toAnalyze, prefiltered } = prefilterPRs([pr('Add dark mode support')]);
|
|
9
|
+
expect(toAnalyze).toHaveLength(1);
|
|
10
|
+
expect(prefiltered).toHaveLength(0);
|
|
11
|
+
});
|
|
12
|
+
it('pre-filters conventional commit chore prefix', () => {
|
|
13
|
+
const { toAnalyze, prefiltered } = prefilterPRs([pr('chore: update eslint config')]);
|
|
14
|
+
expect(toAnalyze).toHaveLength(0);
|
|
15
|
+
expect(prefiltered[0].category).toBe('internal');
|
|
16
|
+
});
|
|
17
|
+
it('pre-filters ci prefix', () => {
|
|
18
|
+
const { prefiltered } = prefilterPRs([pr('ci: add node 20 to matrix')]);
|
|
19
|
+
expect(prefiltered).toHaveLength(1);
|
|
20
|
+
});
|
|
21
|
+
it('pre-filters bump commits', () => {
|
|
22
|
+
const { prefiltered } = prefilterPRs([pr('bump lodash from 4.17.20 to 4.17.21')]);
|
|
23
|
+
expect(prefiltered).toHaveLength(1);
|
|
24
|
+
});
|
|
25
|
+
it('pre-filters dependabot PRs', () => {
|
|
26
|
+
const { prefiltered } = prefilterPRs([pr('Bump axios from 1.0.0 to 1.1.0', ['dependabot'])]);
|
|
27
|
+
expect(prefiltered).toHaveLength(1);
|
|
28
|
+
});
|
|
29
|
+
it('pre-filters by dependencies label', () => {
|
|
30
|
+
const { prefiltered } = prefilterPRs([pr('Update packages', ['dependencies'])]);
|
|
31
|
+
expect(prefiltered).toHaveLength(1);
|
|
32
|
+
});
|
|
33
|
+
it('pre-filtered items have visible: false', () => {
|
|
34
|
+
const { prefiltered } = prefilterPRs([pr('chore: cleanup')]);
|
|
35
|
+
expect(prefiltered[0].visible).toBe(false);
|
|
36
|
+
expect(prefiltered[0].confidence).toBe(1);
|
|
37
|
+
});
|
|
38
|
+
it('pre-filters refactor prefix', () => {
|
|
39
|
+
const { prefiltered } = prefilterPRs([pr('refactor: extract auth middleware')]);
|
|
40
|
+
expect(prefiltered).toHaveLength(1);
|
|
41
|
+
});
|
|
42
|
+
it('does not pre-filter a real feature even with chore-like words', () => {
|
|
43
|
+
const { toAnalyze } = prefilterPRs([pr('Add CI status badge to README')]);
|
|
44
|
+
expect(toAnalyze).toHaveLength(1);
|
|
45
|
+
});
|
|
46
|
+
it('handles mixed batch correctly', () => {
|
|
47
|
+
const prs = [
|
|
48
|
+
pr('Add search functionality'),
|
|
49
|
+
pr('chore: bump node version'),
|
|
50
|
+
pr('Fix login timeout bug'),
|
|
51
|
+
pr('ci: update GitHub Actions workflow'),
|
|
52
|
+
];
|
|
53
|
+
const { toAnalyze, prefiltered } = prefilterPRs(prs);
|
|
54
|
+
expect(toAnalyze).toHaveLength(2);
|
|
55
|
+
expect(prefiltered).toHaveLength(2);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=prefilter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefilter.test.js","sourceRoot":"","sources":["../../src/__tests__/prefilter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA6FnC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkJzD"}
|
package/dist/commands/ai.js
CHANGED
|
@@ -40,6 +40,10 @@ async function validateKey(provider, key) {
|
|
|
40
40
|
});
|
|
41
41
|
return res.ok;
|
|
42
42
|
}
|
|
43
|
+
if (provider === 'gemini') {
|
|
44
|
+
const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models?key=${key}`);
|
|
45
|
+
return res.ok;
|
|
46
|
+
}
|
|
43
47
|
return false;
|
|
44
48
|
}
|
|
45
49
|
catch {
|
|
@@ -61,7 +65,7 @@ async function addKeyForProvider(provider) {
|
|
|
61
65
|
spinner.fail(chalk.red('Key validation failed. Check your key and try again.'));
|
|
62
66
|
process.exit(1);
|
|
63
67
|
}
|
|
64
|
-
const configKey = provider === 'anthropic' ? 'anthropic_key' : 'openai_key';
|
|
68
|
+
const configKey = provider === 'anthropic' ? 'anthropic_key' : provider === 'openai' ? 'openai_key' : 'gemini_key';
|
|
65
69
|
updateConfig({ [configKey]: key, ai_provider: provider });
|
|
66
70
|
spinner.succeed(`${AI_PROVIDER_LABELS[provider]} key saved and set as active provider.`);
|
|
67
71
|
console.log('');
|
|
@@ -158,7 +162,7 @@ ${chalk.bold('Commands:')}
|
|
|
158
162
|
console.log(chalk.red(' ✖ Invalid selection.'));
|
|
159
163
|
process.exit(1);
|
|
160
164
|
}
|
|
161
|
-
const configKey = provider === 'anthropic' ? 'anthropic_key' : 'openai_key';
|
|
165
|
+
const configKey = provider === 'anthropic' ? 'anthropic_key' : provider === 'openai' ? 'openai_key' : 'gemini_key';
|
|
162
166
|
delete config[configKey];
|
|
163
167
|
if (config.ai_provider === provider) {
|
|
164
168
|
const other = AI_PROVIDERS.find(p => p !== provider && !!getKeyForProvider(p));
|
|
@@ -190,7 +194,8 @@ ${chalk.bold('Commands:')}
|
|
|
190
194
|
const spinner = ora({ text: `Checking ${AI_PROVIDER_LABELS[provider]}...` }).start();
|
|
191
195
|
const valid = await validateKey(provider, key);
|
|
192
196
|
const source = ((provider === 'anthropic' && process.env['RELEASEHUB_ANTHROPIC_KEY']) ||
|
|
193
|
-
(provider === 'openai' && process.env['RELEASEHUB_OPENAI_KEY'])
|
|
197
|
+
(provider === 'openai' && process.env['RELEASEHUB_OPENAI_KEY']) ||
|
|
198
|
+
(provider === 'gemini' && process.env['RELEASEHUB_GEMINI_KEY'])) ? 'env var' : 'config';
|
|
194
199
|
if (valid) {
|
|
195
200
|
spinner.succeed(`${activeTag}${chalk.green(AI_PROVIDER_LABELS[provider])} — valid ${chalk.dim(`(${source}, ${key.slice(0, 10)}...)`)}`);
|
|
196
201
|
}
|
package/dist/commands/ai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmBnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C5D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { existsSync, unlinkSync } from 'fs';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { readConfig, getActiveProvider, AI_PROVIDER_LABELS } from '../lib/config.js';
|
|
6
|
+
const CONFIG_PATH = join(homedir(), '.releasehub', 'config.json');
|
|
7
|
+
function mask(value) {
|
|
8
|
+
if (value.length <= 8)
|
|
9
|
+
return '••••••••';
|
|
10
|
+
return value.slice(0, 4) + '••••••••' + value.slice(-4);
|
|
11
|
+
}
|
|
12
|
+
function status(value, label) {
|
|
13
|
+
if (!value)
|
|
14
|
+
return chalk.dim(` ${label.padEnd(18)} ${chalk.red('not set')}`);
|
|
15
|
+
return ` ${label.padEnd(18)} ${chalk.green('set')} ${chalk.dim(mask(value))}`;
|
|
16
|
+
}
|
|
17
|
+
export function registerConfigCommand(program) {
|
|
18
|
+
const config = program
|
|
19
|
+
.command('config')
|
|
20
|
+
.description('Show or reset your local ReleaseHub configuration')
|
|
21
|
+
.option('--reset', 'Delete the config file and start fresh')
|
|
22
|
+
.action((options) => {
|
|
23
|
+
if (options.reset) {
|
|
24
|
+
if (existsSync(CONFIG_PATH)) {
|
|
25
|
+
unlinkSync(CONFIG_PATH);
|
|
26
|
+
console.log('');
|
|
27
|
+
console.log(chalk.green(' ✓ Config reset.'));
|
|
28
|
+
console.log(chalk.dim(` Deleted: ${CONFIG_PATH}`));
|
|
29
|
+
console.log(chalk.dim(' Run releasehub auth login and releasehub ai add-key to set up again.'));
|
|
30
|
+
console.log('');
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log(chalk.dim(' No config file found — nothing to reset.'));
|
|
35
|
+
console.log('');
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const cfg = readConfig();
|
|
40
|
+
const provider = getActiveProvider();
|
|
41
|
+
console.log('');
|
|
42
|
+
console.log(chalk.bold(' Configuration'));
|
|
43
|
+
console.log(chalk.dim(` ${CONFIG_PATH}`));
|
|
44
|
+
console.log('');
|
|
45
|
+
console.log(status(cfg.github_token, 'GitHub token'));
|
|
46
|
+
console.log('');
|
|
47
|
+
console.log(` ${'AI provider'.padEnd(18)} ${chalk.cyan(AI_PROVIDER_LABELS[provider])}`);
|
|
48
|
+
console.log(status(cfg.anthropic_key, 'Anthropic key'));
|
|
49
|
+
console.log(status(cfg.openai_key, 'OpenAI key'));
|
|
50
|
+
console.log('');
|
|
51
|
+
if (cfg.default_format) {
|
|
52
|
+
console.log(` ${'Default format'.padEnd(18)} ${chalk.cyan(cfg.default_format)}`);
|
|
53
|
+
console.log('');
|
|
54
|
+
}
|
|
55
|
+
console.log(chalk.dim(' releasehub config --reset Delete config and start fresh'));
|
|
56
|
+
console.log('');
|
|
57
|
+
});
|
|
58
|
+
return config;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYnC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoI9D"}
|
|
@@ -7,6 +7,7 @@ import { analyzePullRequests } from '../lib/ai.js';
|
|
|
7
7
|
import { getActiveAIKey, getActiveProvider, AI_PROVIDER_LABELS } from '../lib/config.js';
|
|
8
8
|
import { handleError, AuthError } from '../lib/errors.js';
|
|
9
9
|
import { formatOutput } from '../lib/formatters.js';
|
|
10
|
+
import { estimateCostForPRs, formatCostEstimate } from '../lib/cost.js';
|
|
10
11
|
export function registerGenerateCommand(program) {
|
|
11
12
|
program
|
|
12
13
|
.command('generate')
|
|
@@ -31,6 +32,8 @@ ${chalk.bold('Examples:')}
|
|
|
31
32
|
.option('--output <file>', 'Write output to a file instead of printing to stdout')
|
|
32
33
|
.option('--publish', 'Publish directly as a GitHub Release via the API')
|
|
33
34
|
.option('--quiet', 'Suppress progress output — prints only the final result (useful in CI)')
|
|
35
|
+
.option('--dry-run', 'Fetch PRs and show what would be analyzed — no AI call, no output written')
|
|
36
|
+
.option('--show-cost', 'Show estimated token usage and cost before generating')
|
|
34
37
|
.action(async (options) => {
|
|
35
38
|
try {
|
|
36
39
|
const log = (msg) => { if (!options.quiet)
|
|
@@ -43,8 +46,8 @@ ${chalk.bold('Examples:')}
|
|
|
43
46
|
log(chalk.dim(` format : ${options.format}`));
|
|
44
47
|
log(chalk.dim(` provider : ${AI_PROVIDER_LABELS[getActiveProvider()]}`));
|
|
45
48
|
log('');
|
|
46
|
-
// 2. Check AI key
|
|
47
|
-
if (!getActiveAIKey()) {
|
|
49
|
+
// 2. Check AI key (skip in dry-run)
|
|
50
|
+
if (!options.dryRun && !getActiveAIKey()) {
|
|
48
51
|
throw new AuthError('No AI key found. Run: releasehub ai add-key');
|
|
49
52
|
}
|
|
50
53
|
// 3. Fetch PRs
|
|
@@ -57,13 +60,36 @@ ${chalk.bold('Examples:')}
|
|
|
57
60
|
log('');
|
|
58
61
|
process.exit(0);
|
|
59
62
|
}
|
|
60
|
-
prSpinner.succeed(`
|
|
61
|
-
// 4. AI
|
|
63
|
+
prSpinner.succeed(`Found ${chalk.bold(prs.length)} pull requests between ${chalk.cyan(options.from)} and ${chalk.cyan(options.to)}`);
|
|
64
|
+
// 4. Dry run — show PR list and cost estimate, skip AI
|
|
65
|
+
if (options.dryRun) {
|
|
66
|
+
log('');
|
|
67
|
+
log(chalk.bold(' Dry run — no AI call will be made'));
|
|
68
|
+
log('');
|
|
69
|
+
prs.forEach((pr, i) => {
|
|
70
|
+
const labels = pr.labels?.join(', ');
|
|
71
|
+
const labelStr = labels ? chalk.dim(` [${labels}]`) : '';
|
|
72
|
+
log(` ${chalk.dim(`${i + 1}.`)} ${pr.title}${labelStr}`);
|
|
73
|
+
});
|
|
74
|
+
log('');
|
|
75
|
+
const estimate = estimateCostForPRs(prs, getActiveProvider());
|
|
76
|
+
log(chalk.dim(` ${prs.length} PRs → ${formatCostEstimate(estimate)}`));
|
|
77
|
+
log(chalk.dim(' Remove --dry-run to generate release notes.'));
|
|
78
|
+
log('');
|
|
79
|
+
process.exit(0);
|
|
80
|
+
}
|
|
81
|
+
// 5. Show cost estimate before AI call (--show-cost flag)
|
|
82
|
+
if (options.showCost) {
|
|
83
|
+
const estimate = estimateCostForPRs(prs, getActiveProvider());
|
|
84
|
+
log(chalk.dim(` cost est. : ${formatCostEstimate(estimate)}`));
|
|
85
|
+
log('');
|
|
86
|
+
}
|
|
62
87
|
const aiSpinner = ora({ text: 'Analyzing with AI...', isSilent: options.quiet }).start();
|
|
63
|
-
const { changes } = await analyzePullRequests(prs);
|
|
88
|
+
const { changes, prefilteredCount } = await analyzePullRequests(prs);
|
|
64
89
|
const visible = changes.filter(c => c.visible);
|
|
65
90
|
const hidden = changes.filter(c => !c.visible);
|
|
66
|
-
|
|
91
|
+
const prefilteredNote = prefilteredCount > 0 ? chalk.dim(`, ${prefilteredCount} pre-filtered`) : '';
|
|
92
|
+
aiSpinner.succeed(`Analyzed — ${chalk.bold(visible.length)} user-facing, ${chalk.dim(`${hidden.length} hidden`)}${prefilteredNote}`);
|
|
67
93
|
if (visible.length === 0) {
|
|
68
94
|
log('');
|
|
69
95
|
log(chalk.yellow(' No user-facing changes found.'));
|
|
@@ -72,9 +98,9 @@ ${chalk.bold('Examples:')}
|
|
|
72
98
|
log('');
|
|
73
99
|
process.exit(0);
|
|
74
100
|
}
|
|
75
|
-
//
|
|
101
|
+
// 7. Format output
|
|
76
102
|
const output = formatOutput(options.format, { version: options.to, changes });
|
|
77
|
-
//
|
|
103
|
+
// 8. Write or print
|
|
78
104
|
if (options.output) {
|
|
79
105
|
writeFileSync(options.output, output, 'utf8');
|
|
80
106
|
log('');
|
|
@@ -85,7 +111,7 @@ ${chalk.bold('Examples:')}
|
|
|
85
111
|
// Only print to stdout if not publishing (publish prints the URL instead)
|
|
86
112
|
process.stdout.write(output);
|
|
87
113
|
}
|
|
88
|
-
//
|
|
114
|
+
// 9. Publish as GitHub Release
|
|
89
115
|
if (options.publish) {
|
|
90
116
|
const publishSpinner = ora({ text: 'Publishing GitHub Release...', isSilent: options.quiet }).start();
|
|
91
117
|
// --publish only makes sense with github-release format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACxF,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import { createRequire } from 'module';
|
|
|
5
5
|
import { registerAuthCommands } from './commands/auth.js';
|
|
6
6
|
import { registerAICommands } from './commands/ai.js';
|
|
7
7
|
import { registerGenerateCommand } from './commands/generate.js';
|
|
8
|
+
import { registerConfigCommand } from './commands/config.js';
|
|
8
9
|
const require = createRequire(import.meta.url);
|
|
9
10
|
const { version } = require('../package.json');
|
|
10
11
|
const program = new Command();
|
|
@@ -29,5 +30,6 @@ ${chalk.dim('Docs: https://berat.app/releasehub/docs')}
|
|
|
29
30
|
registerAuthCommands(program);
|
|
30
31
|
registerAICommands(program);
|
|
31
32
|
registerGenerateCommand(program);
|
|
33
|
+
registerConfigCommand(program);
|
|
32
34
|
program.parse();
|
|
33
35
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAA;AAErE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC;KAClD,WAAW,CAAC,OAAO,EAAE;EACtB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC;IACvG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC;IACpG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC;;EAEpG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;IACrB,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC;;EAEvE,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC;GACnD,CAAC,CAAA;AAEJ,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC7B,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC3B,uBAAuB,CAAC,OAAO,CAAC,CAAA;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAE9B,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
package/dist/lib/ai.d.ts
CHANGED
|
@@ -11,5 +11,7 @@ export interface AnalyzedChange {
|
|
|
11
11
|
export interface AnalysisResult {
|
|
12
12
|
changes: AnalyzedChange[];
|
|
13
13
|
}
|
|
14
|
-
export declare function analyzePullRequests(prs: PullRequest[]): Promise<AnalysisResult
|
|
14
|
+
export declare function analyzePullRequests(prs: PullRequest[]): Promise<AnalysisResult & {
|
|
15
|
+
prefilteredCount: number;
|
|
16
|
+
}>;
|
|
15
17
|
//# sourceMappingURL=ai.d.ts.map
|
package/dist/lib/ai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAI9C,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAA;AAE3F,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,cAAc,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,EAAE,CAAA;CAC1B;AAkKD,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,cAAc,GAAG;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBpH"}
|
package/dist/lib/ai.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import Anthropic from '@anthropic-ai/sdk';
|
|
2
2
|
import OpenAI from 'openai';
|
|
3
|
+
import { GoogleGenerativeAI } from '@google/generative-ai';
|
|
3
4
|
import { getActiveProvider, getActiveAIKey } from './config.js';
|
|
4
5
|
import { AuthError, ApiError } from './errors.js';
|
|
6
|
+
import { prefilterPRs } from './prefilter.js';
|
|
5
7
|
// ─── Prompt ───────────────────────────────────────────────────────────────────
|
|
6
8
|
const SYSTEM_PROMPT = `You are a release communication assistant for software teams.
|
|
7
9
|
|
|
@@ -62,6 +64,7 @@ function parseResponse(raw) {
|
|
|
62
64
|
// ─── Providers ────────────────────────────────────────────────────────────────
|
|
63
65
|
const ANTHROPIC_MODEL = 'claude-sonnet-4-5';
|
|
64
66
|
const OPENAI_MODEL = 'gpt-4o';
|
|
67
|
+
const GEMINI_MODEL = 'gemini-1.5-flash';
|
|
65
68
|
const BATCH_SIZE = 20;
|
|
66
69
|
async function analyzeWithAnthropic(prs) {
|
|
67
70
|
const key = getActiveAIKey();
|
|
@@ -71,16 +74,24 @@ async function analyzeWithAnthropic(prs) {
|
|
|
71
74
|
const results = [];
|
|
72
75
|
for (let i = 0; i < prs.length; i += BATCH_SIZE) {
|
|
73
76
|
const batch = prs.slice(i, i + BATCH_SIZE);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
77
|
+
try {
|
|
78
|
+
const message = await client.messages.create({
|
|
79
|
+
model: ANTHROPIC_MODEL,
|
|
80
|
+
max_tokens: 4096,
|
|
81
|
+
system: SYSTEM_PROMPT,
|
|
82
|
+
messages: [{ role: 'user', content: buildUserPrompt(batch) }],
|
|
83
|
+
});
|
|
84
|
+
const content = message.content[0];
|
|
85
|
+
if (!content || content.type !== 'text')
|
|
86
|
+
throw new ApiError('Unexpected response from Anthropic API');
|
|
87
|
+
results.push(...parseResponse(content.text));
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
if (err instanceof Anthropic.AuthenticationError) {
|
|
91
|
+
throw new AuthError('Anthropic API key is invalid or expired. Run: releasehub ai add-key');
|
|
92
|
+
}
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
84
95
|
}
|
|
85
96
|
return results;
|
|
86
97
|
}
|
|
@@ -92,37 +103,80 @@ async function analyzeWithOpenAI(prs) {
|
|
|
92
103
|
const results = [];
|
|
93
104
|
for (let i = 0; i < prs.length; i += BATCH_SIZE) {
|
|
94
105
|
const batch = prs.slice(i, i + BATCH_SIZE);
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
+
try {
|
|
107
|
+
const completion = await client.chat.completions.create({
|
|
108
|
+
model: OPENAI_MODEL,
|
|
109
|
+
messages: [
|
|
110
|
+
{ role: 'system', content: SYSTEM_PROMPT },
|
|
111
|
+
{ role: 'user', content: buildUserPrompt(batch) },
|
|
112
|
+
],
|
|
113
|
+
});
|
|
114
|
+
const content = completion.choices[0]?.message?.content;
|
|
115
|
+
if (!content)
|
|
116
|
+
throw new ApiError('Unexpected response from OpenAI API');
|
|
117
|
+
results.push(...parseResponse(content));
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
if (err instanceof OpenAI.AuthenticationError) {
|
|
121
|
+
throw new AuthError('OpenAI API key is invalid or expired. Run: releasehub ai add-key');
|
|
122
|
+
}
|
|
123
|
+
throw err;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return results;
|
|
127
|
+
}
|
|
128
|
+
async function analyzeWithGemini(prs) {
|
|
129
|
+
const key = getActiveAIKey();
|
|
130
|
+
if (!key)
|
|
131
|
+
throw new AuthError('No Gemini key found. Run: releasehub ai add-key');
|
|
132
|
+
const client = new GoogleGenerativeAI(key);
|
|
133
|
+
const model = client.getGenerativeModel({
|
|
134
|
+
model: GEMINI_MODEL,
|
|
135
|
+
systemInstruction: SYSTEM_PROMPT,
|
|
136
|
+
});
|
|
137
|
+
const results = [];
|
|
138
|
+
for (let i = 0; i < prs.length; i += BATCH_SIZE) {
|
|
139
|
+
const batch = prs.slice(i, i + BATCH_SIZE);
|
|
140
|
+
try {
|
|
141
|
+
const result = await model.generateContent(buildUserPrompt(batch));
|
|
142
|
+
const content = result.response.text();
|
|
143
|
+
if (!content)
|
|
144
|
+
throw new ApiError('Unexpected response from Gemini API');
|
|
145
|
+
results.push(...parseResponse(content));
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
if (err instanceof Error && /api.key.not.valid|api_key_invalid|401|403/i.test(err.message)) {
|
|
149
|
+
throw new AuthError('Gemini API key is invalid or expired. Run: releasehub ai add-key');
|
|
150
|
+
}
|
|
151
|
+
throw err;
|
|
152
|
+
}
|
|
106
153
|
}
|
|
107
154
|
return results;
|
|
108
155
|
}
|
|
109
156
|
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
110
157
|
export async function analyzePullRequests(prs) {
|
|
158
|
+
const { toAnalyze, prefiltered } = prefilterPRs(prs);
|
|
111
159
|
const provider = getActiveProvider();
|
|
112
|
-
let
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
160
|
+
let aiChanges = [];
|
|
161
|
+
if (toAnalyze.length > 0) {
|
|
162
|
+
switch (provider) {
|
|
163
|
+
case 'anthropic':
|
|
164
|
+
aiChanges = await analyzeWithAnthropic(toAnalyze);
|
|
165
|
+
break;
|
|
166
|
+
case 'openai':
|
|
167
|
+
aiChanges = await analyzeWithOpenAI(toAnalyze);
|
|
168
|
+
break;
|
|
169
|
+
case 'gemini':
|
|
170
|
+
aiChanges = await analyzeWithGemini(toAnalyze);
|
|
171
|
+
break;
|
|
172
|
+
default: throw new ApiError(`Unsupported AI provider: ${provider}`);
|
|
173
|
+
}
|
|
121
174
|
}
|
|
175
|
+
const changes = [...aiChanges, ...prefiltered];
|
|
122
176
|
const order = {
|
|
123
177
|
breaking: 0, feature: 1, improvement: 2, bugfix: 3, internal: 4,
|
|
124
178
|
};
|
|
125
179
|
changes.sort((a, b) => (order[a.category] ?? 5) - (order[b.category] ?? 5));
|
|
126
|
-
return { changes };
|
|
180
|
+
return { changes, prefilteredCount: prefiltered.length };
|
|
127
181
|
}
|
|
128
182
|
//# sourceMappingURL=ai.js.map
|