@radkode/neo 1.4.0 → 1.5.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/dist/commands/ai/index.d.ts +3 -0
- package/dist/commands/ai/index.d.ts.map +1 -0
- package/dist/commands/ai/index.js +21 -0
- package/dist/commands/ai/index.js.map +1 -0
- package/dist/commands/ai/pr/index.d.ts +19 -0
- package/dist/commands/ai/pr/index.d.ts.map +1 -0
- package/dist/commands/ai/pr/index.js +225 -0
- package/dist/commands/ai/pr/index.js.map +1 -0
- package/dist/commands/doctor/index.d.ts +16 -0
- package/dist/commands/doctor/index.d.ts.map +1 -0
- package/dist/commands/doctor/index.js +313 -0
- package/dist/commands/doctor/index.js.map +1 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/services/ai/index.d.ts +9 -1
- package/dist/services/ai/index.d.ts.map +1 -1
- package/dist/services/ai/index.js +23 -3
- package/dist/services/ai/index.js.map +1 -1
- package/dist/services/ai/pr-prompts.d.ts +17 -0
- package/dist/services/ai/pr-prompts.d.ts.map +1 -0
- package/dist/services/ai/pr-prompts.js +68 -0
- package/dist/services/ai/pr-prompts.js.map +1 -0
- package/dist/services/ai/prompts.d.ts +3 -2
- package/dist/services/ai/prompts.d.ts.map +1 -1
- package/dist/services/ai/prompts.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAGtD,wBAAgB,eAAe,IAAI,OAAO,CAuBzC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Command } from '@commander-js/extra-typings';
|
|
2
|
+
import { createAiPrCommand } from '../ai/pr/index.js';
|
|
3
|
+
export function createAiCommand() {
|
|
4
|
+
const command = new Command('ai');
|
|
5
|
+
command
|
|
6
|
+
.description('AI-powered helpers (pr description, review, etc.)')
|
|
7
|
+
.addHelpText('after', `
|
|
8
|
+
Subcommands:
|
|
9
|
+
pr Generate a PR title + body from the current branch
|
|
10
|
+
|
|
11
|
+
Examples:
|
|
12
|
+
Generate a PR description and open it:
|
|
13
|
+
$ neo ai pr
|
|
14
|
+
|
|
15
|
+
Agent-friendly (emits { title, body } on stdout):
|
|
16
|
+
$ neo ai pr --json --no-create
|
|
17
|
+
`);
|
|
18
|
+
command.addCommand(createAiPrCommand());
|
|
19
|
+
return command;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC,OAAO;SACJ,WAAW,CAAC,mDAAmD,CAAC;SAChE,WAAW,CACV,OAAO,EACP;;;;;;;;;;CAUL,CACI,CAAC;IAEJ,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAExC,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from '@commander-js/extra-typings';
|
|
2
|
+
interface AiPrOptions {
|
|
3
|
+
base?: string;
|
|
4
|
+
create?: boolean;
|
|
5
|
+
draft?: boolean;
|
|
6
|
+
}
|
|
7
|
+
interface AiPrResult {
|
|
8
|
+
title: string;
|
|
9
|
+
body: string;
|
|
10
|
+
base: string;
|
|
11
|
+
branch: string;
|
|
12
|
+
commits: number;
|
|
13
|
+
prUrl?: string;
|
|
14
|
+
created: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function executeAiPr(options: AiPrOptions): Promise<AiPrResult>;
|
|
17
|
+
export declare function createAiPrCommand(): Command;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/ai/pr/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAStD,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAmED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA2G3E;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CA6E3C"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { Command } from '@commander-js/extra-typings';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { ui } from '../../../utils/ui.js';
|
|
5
|
+
import { emitJson } from '../../../utils/output.js';
|
|
6
|
+
import { runAction } from '../../../utils/run-action.js';
|
|
7
|
+
import { NonInteractiveError, mayPrompt } from '../../../utils/prompt.js';
|
|
8
|
+
import { generatePrDescription } from '../../../services/ai/index.js';
|
|
9
|
+
async function detectDefaultBranch() {
|
|
10
|
+
try {
|
|
11
|
+
const { stdout } = await execa('git', ['symbolic-ref', 'refs/remotes/origin/HEAD']);
|
|
12
|
+
return stdout.replace('refs/remotes/origin/', '').trim();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
for (const name of ['main', 'master']) {
|
|
16
|
+
try {
|
|
17
|
+
await execa('git', ['show-ref', '--verify', '--quiet', `refs/remotes/origin/${name}`]);
|
|
18
|
+
return name;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
throw new Error('Could not detect default branch. Pass --base <name> or run `git remote set-head origin --auto`.');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function getCurrentBranch() {
|
|
28
|
+
const { stdout } = await execa('git', ['branch', '--show-current']);
|
|
29
|
+
return stdout.trim();
|
|
30
|
+
}
|
|
31
|
+
async function getCommits(base) {
|
|
32
|
+
const { stdout } = await execa('git', [
|
|
33
|
+
'log',
|
|
34
|
+
`origin/${base}..HEAD`,
|
|
35
|
+
'--pretty=format:%h %s%n%b',
|
|
36
|
+
'--reverse',
|
|
37
|
+
]);
|
|
38
|
+
return stdout.split('\n').filter((line) => line.trim().length > 0);
|
|
39
|
+
}
|
|
40
|
+
async function getDiffStat(base) {
|
|
41
|
+
const { stdout } = await execa('git', ['diff', `origin/${base}...HEAD`, '--stat']);
|
|
42
|
+
return stdout.trim();
|
|
43
|
+
}
|
|
44
|
+
async function getDiff(base) {
|
|
45
|
+
const { stdout } = await execa('git', ['diff', `origin/${base}...HEAD`]);
|
|
46
|
+
return stdout;
|
|
47
|
+
}
|
|
48
|
+
async function existingPrUrl() {
|
|
49
|
+
try {
|
|
50
|
+
const { stdout } = await execa('gh', ['pr', 'view', '--json', 'url', '-q', '.url'], {
|
|
51
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
52
|
+
});
|
|
53
|
+
const url = stdout.trim();
|
|
54
|
+
return url.length > 0 ? url : null;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function ghInstalled() {
|
|
61
|
+
try {
|
|
62
|
+
await execa('gh', ['--version'], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function executeAiPr(options) {
|
|
70
|
+
const branch = await getCurrentBranch();
|
|
71
|
+
if (!branch) {
|
|
72
|
+
throw new Error('Detached HEAD — check out a branch before running `neo ai pr`.');
|
|
73
|
+
}
|
|
74
|
+
const base = options.base ?? (await detectDefaultBranch());
|
|
75
|
+
if (branch === base) {
|
|
76
|
+
throw new Error(`Already on base branch "${base}" — nothing to describe.`);
|
|
77
|
+
}
|
|
78
|
+
const [commits, diffStat, diff] = await Promise.all([
|
|
79
|
+
getCommits(base),
|
|
80
|
+
getDiffStat(base),
|
|
81
|
+
getDiff(base),
|
|
82
|
+
]);
|
|
83
|
+
if (commits.length === 0) {
|
|
84
|
+
throw new Error(`No commits on ${branch} that aren't already on origin/${base}. Commit and push first.`);
|
|
85
|
+
}
|
|
86
|
+
const request = {
|
|
87
|
+
branchName: branch,
|
|
88
|
+
baseBranch: base,
|
|
89
|
+
commits,
|
|
90
|
+
diffStat,
|
|
91
|
+
diff,
|
|
92
|
+
};
|
|
93
|
+
const generateSpinner = ui.spinner('Generating PR description');
|
|
94
|
+
generateSpinner.start();
|
|
95
|
+
const result = await generatePrDescription(request);
|
|
96
|
+
if (!result.success) {
|
|
97
|
+
generateSpinner.fail('PR description generation failed');
|
|
98
|
+
throw result.error;
|
|
99
|
+
}
|
|
100
|
+
generateSpinner.succeed('Generated PR description');
|
|
101
|
+
const { title, body } = result.data;
|
|
102
|
+
const commitCount = commits.filter((c) => /^[0-9a-f]{7,}\s/.test(c)).length;
|
|
103
|
+
const shouldCreate = options.create !== false;
|
|
104
|
+
const created = {
|
|
105
|
+
title,
|
|
106
|
+
body,
|
|
107
|
+
base,
|
|
108
|
+
branch,
|
|
109
|
+
commits: commitCount,
|
|
110
|
+
created: false,
|
|
111
|
+
};
|
|
112
|
+
if (!shouldCreate)
|
|
113
|
+
return created;
|
|
114
|
+
if (!(await ghInstalled())) {
|
|
115
|
+
ui.warn('gh CLI not found — skipping PR creation. Install from https://cli.github.com.');
|
|
116
|
+
return created;
|
|
117
|
+
}
|
|
118
|
+
const existing = await existingPrUrl();
|
|
119
|
+
if (existing) {
|
|
120
|
+
ui.warn(`PR already exists for this branch: ${existing}`);
|
|
121
|
+
ui.muted('Use `gh pr edit` to update title/body.');
|
|
122
|
+
return { ...created, prUrl: existing };
|
|
123
|
+
}
|
|
124
|
+
if (mayPrompt('Create PR with this title + body?', '--yes')) {
|
|
125
|
+
ui.newline();
|
|
126
|
+
ui.section('Preview');
|
|
127
|
+
ui.muted(`Title: ${title}`);
|
|
128
|
+
ui.muted('Body:');
|
|
129
|
+
ui.muted(body);
|
|
130
|
+
ui.newline();
|
|
131
|
+
const { confirm } = await inquirer.prompt([
|
|
132
|
+
{
|
|
133
|
+
type: 'confirm',
|
|
134
|
+
name: 'confirm',
|
|
135
|
+
message: 'Create PR?',
|
|
136
|
+
default: true,
|
|
137
|
+
},
|
|
138
|
+
]);
|
|
139
|
+
if (!confirm) {
|
|
140
|
+
ui.muted('Skipped PR creation.');
|
|
141
|
+
return created;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const createSpinner = ui.spinner('Creating PR');
|
|
145
|
+
createSpinner.start();
|
|
146
|
+
try {
|
|
147
|
+
const args = ['pr', 'create', '--base', base, '--title', title, '--body', body];
|
|
148
|
+
if (options.draft)
|
|
149
|
+
args.push('--draft');
|
|
150
|
+
const { stdout } = await execa('gh', args);
|
|
151
|
+
const url = stdout.trim().split('\n').pop() ?? '';
|
|
152
|
+
createSpinner.succeed(`Created PR: ${url}`);
|
|
153
|
+
return { ...created, prUrl: url, created: true };
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
createSpinner.fail('Failed to create PR');
|
|
157
|
+
const stderr = error.stderr ?? '';
|
|
158
|
+
if (stderr)
|
|
159
|
+
ui.muted(stderr.trim().split('\n').slice(-10).join('\n'));
|
|
160
|
+
throw new Error('gh pr create failed. Run with --json to inspect the generated title/body.');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export function createAiPrCommand() {
|
|
164
|
+
const command = new Command('pr');
|
|
165
|
+
command
|
|
166
|
+
.description('Generate a PR title + body from the current branch and (optionally) create it via gh')
|
|
167
|
+
.option('--base <branch>', 'base branch to diff against (default: origin HEAD)')
|
|
168
|
+
.option('--draft', 'open the PR as a draft')
|
|
169
|
+
.option('--no-create', 'generate the description only — do not call gh pr create')
|
|
170
|
+
.addHelpText('after', `
|
|
171
|
+
Examples:
|
|
172
|
+
Generate + preview + create (interactive):
|
|
173
|
+
$ neo ai pr
|
|
174
|
+
|
|
175
|
+
Generate only, no PR created (print title/body):
|
|
176
|
+
$ neo ai pr --no-create
|
|
177
|
+
|
|
178
|
+
Agent-friendly (emits { ok, title, body } on stdout, no PR side-effect):
|
|
179
|
+
$ neo ai pr --json --no-create
|
|
180
|
+
|
|
181
|
+
Skip confirmation, open as draft:
|
|
182
|
+
$ neo ai pr --yes --draft
|
|
183
|
+
`)
|
|
184
|
+
.action(runAction(async (options) => {
|
|
185
|
+
const { getRuntimeContext } = await import('../../../utils/runtime-context.js');
|
|
186
|
+
const ctx = getRuntimeContext();
|
|
187
|
+
const effectiveOptions = { ...options };
|
|
188
|
+
if (ctx.format === 'json' && !ctx.yes && effectiveOptions.create !== false) {
|
|
189
|
+
effectiveOptions.create = false;
|
|
190
|
+
}
|
|
191
|
+
if (ctx.nonInteractive && !ctx.yes && effectiveOptions.create !== false) {
|
|
192
|
+
throw new NonInteractiveError('PR creation confirmation', '--yes (or --no-create to skip)');
|
|
193
|
+
}
|
|
194
|
+
const result = await executeAiPr(effectiveOptions);
|
|
195
|
+
emitJson({
|
|
196
|
+
ok: true,
|
|
197
|
+
command: 'ai pr',
|
|
198
|
+
branch: result.branch,
|
|
199
|
+
base: result.base,
|
|
200
|
+
commits: result.commits,
|
|
201
|
+
title: result.title,
|
|
202
|
+
body: result.body,
|
|
203
|
+
created: result.created,
|
|
204
|
+
prUrl: result.prUrl,
|
|
205
|
+
}, {
|
|
206
|
+
text: () => {
|
|
207
|
+
if (result.created && result.prUrl) {
|
|
208
|
+
ui.success(`PR opened: ${result.prUrl}`);
|
|
209
|
+
}
|
|
210
|
+
else if (result.prUrl) {
|
|
211
|
+
ui.muted(`Existing PR: ${result.prUrl}`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
ui.newline();
|
|
215
|
+
ui.section('Generated PR');
|
|
216
|
+
ui.muted(`Title: ${result.title}`);
|
|
217
|
+
ui.muted('Body:');
|
|
218
|
+
ui.muted(result.body);
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
}));
|
|
223
|
+
return command;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/ai/pr/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Command } from '@commander-js/extra-typings';
|
|
2
|
+
type CheckStatus = 'ok' | 'warn' | 'fail';
|
|
3
|
+
interface CheckResult {
|
|
4
|
+
name: string;
|
|
5
|
+
status: CheckStatus;
|
|
6
|
+
message: string;
|
|
7
|
+
suggestion?: string;
|
|
8
|
+
}
|
|
9
|
+
interface DoctorResult {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
checks: CheckResult[];
|
|
12
|
+
}
|
|
13
|
+
export declare function executeDoctor(cwd: string): Promise<DoctorResult>;
|
|
14
|
+
export declare function createDoctorCommand(): Command;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AActD,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1C,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAkQD,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAatE;AAwBD,wBAAgB,mBAAmB,IAAI,OAAO,CAqC7C"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { Command } from '@commander-js/extra-typings';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import which from 'which';
|
|
4
|
+
import { access, readFile } from 'node:fs/promises';
|
|
5
|
+
import { constants } from 'node:fs';
|
|
6
|
+
import { findUp } from 'find-up';
|
|
7
|
+
import { ui } from '../../utils/ui.js';
|
|
8
|
+
import { emitJson } from '../../utils/output.js';
|
|
9
|
+
import { runAction } from '../../utils/run-action.js';
|
|
10
|
+
import { configManager } from '../../utils/config.js';
|
|
11
|
+
import { secretsManager } from '../../utils/secrets.js';
|
|
12
|
+
const FALLBACK_MIN_NODE = '20.0.0';
|
|
13
|
+
function parseSemver(version) {
|
|
14
|
+
const cleaned = version.replace(/^[=v]/, '').split(/[-+]/)[0] ?? '';
|
|
15
|
+
const parts = cleaned.split('.').map((n) => Number.parseInt(n, 10));
|
|
16
|
+
return [parts[0] || 0, parts[1] || 0, parts[2] || 0];
|
|
17
|
+
}
|
|
18
|
+
function compareSemver(a, b) {
|
|
19
|
+
const [a1, a2, a3] = parseSemver(a);
|
|
20
|
+
const [b1, b2, b3] = parseSemver(b);
|
|
21
|
+
if (a1 !== b1)
|
|
22
|
+
return a1 < b1 ? -1 : 1;
|
|
23
|
+
if (a2 !== b2)
|
|
24
|
+
return a2 < b2 ? -1 : 1;
|
|
25
|
+
if (a3 !== b3)
|
|
26
|
+
return a3 < b3 ? -1 : 1;
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
function extractMinNodeVersion(range) {
|
|
30
|
+
const match = range.match(/(\d+(?:\.\d+){0,2})/);
|
|
31
|
+
return match?.[1] ?? null;
|
|
32
|
+
}
|
|
33
|
+
async function readRepoEnginesNode(cwd) {
|
|
34
|
+
const pkgPath = await findUp('package.json', { cwd });
|
|
35
|
+
if (!pkgPath)
|
|
36
|
+
return null;
|
|
37
|
+
try {
|
|
38
|
+
const raw = await readFile(pkgPath, 'utf-8');
|
|
39
|
+
const pkg = JSON.parse(raw);
|
|
40
|
+
return pkg.engines?.node ?? null;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function checkNodeVersion(cwd) {
|
|
47
|
+
const current = process.versions.node;
|
|
48
|
+
const enginesRange = await readRepoEnginesNode(cwd);
|
|
49
|
+
const minVersion = enginesRange
|
|
50
|
+
? (extractMinNodeVersion(enginesRange) ?? FALLBACK_MIN_NODE)
|
|
51
|
+
: FALLBACK_MIN_NODE;
|
|
52
|
+
const source = enginesRange ? `engines.node "${enginesRange}"` : `default >=${FALLBACK_MIN_NODE}`;
|
|
53
|
+
if (compareSemver(current, minVersion) >= 0) {
|
|
54
|
+
return {
|
|
55
|
+
name: 'node',
|
|
56
|
+
status: 'ok',
|
|
57
|
+
message: `Node ${current} satisfies ${source}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
name: 'node',
|
|
62
|
+
status: 'fail',
|
|
63
|
+
message: `Node ${current} is older than ${minVersion} required by ${source}`,
|
|
64
|
+
suggestion: `Upgrade Node to >=${minVersion} (e.g., via nvm, fnm, or volta).`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async function binaryExists(name) {
|
|
68
|
+
try {
|
|
69
|
+
await which(name);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function checkPackageManagers() {
|
|
77
|
+
const managers = ['pnpm', 'npm', 'yarn', 'bun'];
|
|
78
|
+
const found = [];
|
|
79
|
+
for (const pm of managers) {
|
|
80
|
+
if (await binaryExists(pm))
|
|
81
|
+
found.push(pm);
|
|
82
|
+
}
|
|
83
|
+
if (found.length === 0) {
|
|
84
|
+
return {
|
|
85
|
+
name: 'packageManager',
|
|
86
|
+
status: 'fail',
|
|
87
|
+
message: 'No package manager found on PATH (pnpm/npm/yarn/bun).',
|
|
88
|
+
suggestion: 'Install at least one package manager — pnpm is recommended.',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
name: 'packageManager',
|
|
93
|
+
status: 'ok',
|
|
94
|
+
message: `Found: ${found.join(', ')}`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async function checkGitIdentity() {
|
|
98
|
+
if (!(await binaryExists('git'))) {
|
|
99
|
+
return {
|
|
100
|
+
name: 'gitIdentity',
|
|
101
|
+
status: 'fail',
|
|
102
|
+
message: 'git is not installed.',
|
|
103
|
+
suggestion: 'Install git from https://git-scm.com/downloads.',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const read = async (key) => {
|
|
107
|
+
try {
|
|
108
|
+
const { stdout } = await execa('git', ['config', '--get', key]);
|
|
109
|
+
return stdout.trim();
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return '';
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const [name, email] = await Promise.all([read('user.name'), read('user.email')]);
|
|
116
|
+
const missing = [];
|
|
117
|
+
if (!name)
|
|
118
|
+
missing.push('user.name');
|
|
119
|
+
if (!email)
|
|
120
|
+
missing.push('user.email');
|
|
121
|
+
if (missing.length > 0) {
|
|
122
|
+
return {
|
|
123
|
+
name: 'gitIdentity',
|
|
124
|
+
status: 'warn',
|
|
125
|
+
message: `git is missing ${missing.join(', ')}.`,
|
|
126
|
+
suggestion: `Set with \`git config --global user.name "..."\` and \`git config --global user.email "..."\`.`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
name: 'gitIdentity',
|
|
131
|
+
status: 'ok',
|
|
132
|
+
message: `${name} <${email}>`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async function checkGhAuth() {
|
|
136
|
+
if (!(await binaryExists('gh'))) {
|
|
137
|
+
return {
|
|
138
|
+
name: 'gh',
|
|
139
|
+
status: 'warn',
|
|
140
|
+
message: 'GitHub CLI (gh) is not installed.',
|
|
141
|
+
suggestion: 'Install from https://cli.github.com — needed for `neo gh` and PR flows.',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
await execa('gh', ['auth', 'status'], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
146
|
+
return {
|
|
147
|
+
name: 'gh',
|
|
148
|
+
status: 'ok',
|
|
149
|
+
message: 'gh is installed and authenticated.',
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return {
|
|
154
|
+
name: 'gh',
|
|
155
|
+
status: 'warn',
|
|
156
|
+
message: 'gh is installed but not authenticated.',
|
|
157
|
+
suggestion: 'Run `gh auth login` to authenticate.',
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function checkNeoConfig() {
|
|
162
|
+
const configFile = configManager.getConfigFile();
|
|
163
|
+
try {
|
|
164
|
+
await access(configFile, constants.F_OK);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return {
|
|
168
|
+
name: 'neoConfig',
|
|
169
|
+
status: 'warn',
|
|
170
|
+
message: `No config file at ${configFile}.`,
|
|
171
|
+
suggestion: 'Run `neo init` to create one.',
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const raw = await readFile(configFile, 'utf-8');
|
|
176
|
+
JSON.parse(raw);
|
|
177
|
+
return {
|
|
178
|
+
name: 'neoConfig',
|
|
179
|
+
status: 'ok',
|
|
180
|
+
message: `Config file is valid JSON (${configFile}).`,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
185
|
+
return {
|
|
186
|
+
name: 'neoConfig',
|
|
187
|
+
status: 'fail',
|
|
188
|
+
message: `Config file is unreadable: ${msg}`,
|
|
189
|
+
suggestion: `Inspect or remove ${configFile} and re-run \`neo init\`.`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async function checkConfigDirWritable() {
|
|
194
|
+
const dir = configManager.getConfigDir();
|
|
195
|
+
try {
|
|
196
|
+
await access(dir, constants.W_OK);
|
|
197
|
+
return {
|
|
198
|
+
name: 'configDirWritable',
|
|
199
|
+
status: 'ok',
|
|
200
|
+
message: `${dir} is writable.`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
try {
|
|
205
|
+
await access(dir, constants.F_OK);
|
|
206
|
+
return {
|
|
207
|
+
name: 'configDirWritable',
|
|
208
|
+
status: 'fail',
|
|
209
|
+
message: `${dir} exists but isn't writable by the current user.`,
|
|
210
|
+
suggestion: `Check permissions on ${dir}.`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return {
|
|
215
|
+
name: 'configDirWritable',
|
|
216
|
+
status: 'ok',
|
|
217
|
+
message: `${dir} does not exist yet — will be created by \`neo init\`.`,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async function checkAnthropicKey() {
|
|
223
|
+
if (process.env['ANTHROPIC_API_KEY']) {
|
|
224
|
+
return {
|
|
225
|
+
name: 'anthropicKey',
|
|
226
|
+
status: 'ok',
|
|
227
|
+
message: 'ANTHROPIC_API_KEY is set in the environment.',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
const configured = await secretsManager.isConfigured('ai.apiKey');
|
|
232
|
+
if (configured) {
|
|
233
|
+
return {
|
|
234
|
+
name: 'anthropicKey',
|
|
235
|
+
status: 'ok',
|
|
236
|
+
message: 'API key found in secrets store.',
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
name: 'anthropicKey',
|
|
244
|
+
status: 'warn',
|
|
245
|
+
message: 'No Anthropic API key configured.',
|
|
246
|
+
suggestion: 'Set $ANTHROPIC_API_KEY or run `neo config set ai.apiKey <key>` — required for `neo git commit --ai`.',
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
export async function executeDoctor(cwd) {
|
|
250
|
+
const checks = await Promise.all([
|
|
251
|
+
checkNodeVersion(cwd),
|
|
252
|
+
checkPackageManagers(),
|
|
253
|
+
checkGitIdentity(),
|
|
254
|
+
checkGhAuth(),
|
|
255
|
+
checkNeoConfig(),
|
|
256
|
+
checkConfigDirWritable(),
|
|
257
|
+
checkAnthropicKey(),
|
|
258
|
+
]);
|
|
259
|
+
const ok = checks.every((c) => c.status !== 'fail');
|
|
260
|
+
return { ok, checks };
|
|
261
|
+
}
|
|
262
|
+
function renderText(result) {
|
|
263
|
+
ui.newline();
|
|
264
|
+
for (const check of result.checks) {
|
|
265
|
+
const line = `${check.name}: ${check.message}`;
|
|
266
|
+
if (check.status === 'ok')
|
|
267
|
+
ui.success(line);
|
|
268
|
+
else if (check.status === 'warn')
|
|
269
|
+
ui.warn(line);
|
|
270
|
+
else
|
|
271
|
+
ui.error(line);
|
|
272
|
+
if (check.suggestion)
|
|
273
|
+
ui.muted(` → ${check.suggestion}`);
|
|
274
|
+
}
|
|
275
|
+
ui.newline();
|
|
276
|
+
const failed = result.checks.filter((c) => c.status === 'fail').length;
|
|
277
|
+
const warned = result.checks.filter((c) => c.status === 'warn').length;
|
|
278
|
+
if (failed === 0 && warned === 0) {
|
|
279
|
+
ui.success('All checks passed.');
|
|
280
|
+
}
|
|
281
|
+
else if (failed === 0) {
|
|
282
|
+
ui.warn(`${warned} warning(s) — nothing broken, but you may want to address them.`);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
ui.error(`${failed} check(s) failed${warned > 0 ? `, ${warned} warning(s)` : ''}.`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
export function createDoctorCommand() {
|
|
289
|
+
const command = new Command('doctor');
|
|
290
|
+
command
|
|
291
|
+
.description('Diagnose the local Neo setup — node version, package managers, git/gh, config, and API keys')
|
|
292
|
+
.addHelpText('after', `
|
|
293
|
+
Examples:
|
|
294
|
+
Run all checks (default):
|
|
295
|
+
$ neo doctor
|
|
296
|
+
|
|
297
|
+
Agent-friendly (structured checks + exit code):
|
|
298
|
+
$ neo doctor --json
|
|
299
|
+
`)
|
|
300
|
+
.action(runAction(async () => {
|
|
301
|
+
const result = await executeDoctor(process.cwd());
|
|
302
|
+
emitJson({
|
|
303
|
+
ok: result.ok,
|
|
304
|
+
command: 'doctor',
|
|
305
|
+
checks: result.checks,
|
|
306
|
+
}, { text: () => renderText(result) });
|
|
307
|
+
if (!result.ok) {
|
|
308
|
+
process.exitCode = 1;
|
|
309
|
+
}
|
|
310
|
+
}));
|
|
311
|
+
return command;
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -13,4 +13,6 @@ export { createSchemaCommand } from './schema/index.js';
|
|
|
13
13
|
export { createSyncCommand } from './sync/index.js';
|
|
14
14
|
export { createVerifyCommand } from './verify/index.js';
|
|
15
15
|
export { createChangesetCommand } from './changeset/index.js';
|
|
16
|
+
export { createDoctorCommand } from './doctor/index.js';
|
|
17
|
+
export { createAiCommand } from './ai/index.js';
|
|
16
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAiBtD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgBvD;AAED,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/commands/index.js
CHANGED
|
@@ -11,6 +11,8 @@ import { createSchemaCommand } from './schema/index.js';
|
|
|
11
11
|
import { createSyncCommand } from './sync/index.js';
|
|
12
12
|
import { createVerifyCommand } from './verify/index.js';
|
|
13
13
|
import { createChangesetCommand } from './changeset/index.js';
|
|
14
|
+
import { createDoctorCommand } from './doctor/index.js';
|
|
15
|
+
import { createAiCommand } from './ai/index.js';
|
|
14
16
|
export function registerCommands(program) {
|
|
15
17
|
program.addCommand(createInitCommand());
|
|
16
18
|
program.addCommand(createConfigCommand());
|
|
@@ -25,6 +27,8 @@ export function registerCommands(program) {
|
|
|
25
27
|
program.addCommand(createSyncCommand());
|
|
26
28
|
program.addCommand(createVerifyCommand());
|
|
27
29
|
program.addCommand(createChangesetCommand());
|
|
30
|
+
program.addCommand(createDoctorCommand());
|
|
31
|
+
program.addCommand(createAiCommand());
|
|
28
32
|
}
|
|
29
33
|
export { createInitCommand } from './init/index.js';
|
|
30
34
|
export { createConfigCommand } from './config/index.js';
|
|
@@ -39,4 +43,6 @@ export { createSchemaCommand } from './schema/index.js';
|
|
|
39
43
|
export { createSyncCommand } from './sync/index.js';
|
|
40
44
|
export { createVerifyCommand } from './verify/index.js';
|
|
41
45
|
export { createChangesetCommand } from './changeset/index.js';
|
|
46
|
+
export { createDoctorCommand } from './doctor/index.js';
|
|
47
|
+
export { createAiCommand } from './ai/index.js';
|
|
42
48
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { type Result } from '../../core/errors/index.js';
|
|
2
|
-
import { type AICommitRequest, type AICommitResponse } from './prompts.js';
|
|
2
|
+
import { type AICommitRequest, type AICommitResponse, type StructuredPrompt } from './prompts.js';
|
|
3
|
+
import { type AIPrRequest, type AIPrResponse } from './pr-prompts.js';
|
|
3
4
|
export type { AICommitRequest, AICommitResponse } from './prompts.js';
|
|
5
|
+
export type { StructuredPrompt } from './prompts.js';
|
|
6
|
+
export type { AIPrRequest, AIPrResponse } from './pr-prompts.js';
|
|
4
7
|
export { AIError, AIErrors } from './errors.js';
|
|
8
|
+
export declare function callAnthropicAPI(prompt: StructuredPrompt, options?: {
|
|
9
|
+
maxTokens?: number;
|
|
10
|
+
retries?: number;
|
|
11
|
+
}): Promise<Result<string>>;
|
|
5
12
|
export declare function generateCommitMessage(request: AICommitRequest): Promise<Result<AICommitResponse>>;
|
|
6
13
|
export declare function isAICommitAvailable(): Promise<boolean>;
|
|
14
|
+
export declare function generatePrDescription(request: AIPrRequest): Promise<Result<AIPrResponse>>;
|
|
7
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/ai/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAoB,MAAM,wBAAwB,CAAC;AAIvE,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/ai/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAoB,MAAM,wBAAwB,CAAC;AAIvE,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACtE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAqEhD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAoFzB;AA4BD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAsBvG;AAKD,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG5D;AASD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAgB/B"}
|
|
@@ -3,10 +3,11 @@ import { secretsManager } from '../../utils/secrets.js';
|
|
|
3
3
|
import { configManager } from '../../utils/config.js';
|
|
4
4
|
import { AIErrors } from './errors.js';
|
|
5
5
|
import { buildCommitPrompt, parseCommitResponse, isDiffTooLarge, getDiffSize, } from './prompts.js';
|
|
6
|
+
import { buildPrPrompt, parsePrResponse, isCommitListTooLarge, } from './pr-prompts.js';
|
|
6
7
|
export { AIError, AIErrors } from './errors.js';
|
|
7
8
|
const ANTHROPIC_API_URL = 'https://api.anthropic.com/v1/messages';
|
|
8
9
|
const ANTHROPIC_VERSION = '2023-06-01';
|
|
9
|
-
const
|
|
10
|
+
const DEFAULT_MAX_TOKENS = 500;
|
|
10
11
|
async function getApiKey() {
|
|
11
12
|
const secretKey = await secretsManager.getSecret('ai.apiKey');
|
|
12
13
|
if (secretKey) {
|
|
@@ -18,7 +19,9 @@ async function getModel() {
|
|
|
18
19
|
const config = await configManager.read();
|
|
19
20
|
return config.ai.model || 'claude-haiku-4-5-20251001';
|
|
20
21
|
}
|
|
21
|
-
async function callAnthropicAPI(prompt,
|
|
22
|
+
export async function callAnthropicAPI(prompt, options = {}) {
|
|
23
|
+
const retries = options.retries ?? 3;
|
|
24
|
+
const maxTokens = options.maxTokens ?? DEFAULT_MAX_TOKENS;
|
|
22
25
|
const apiKey = await getApiKey();
|
|
23
26
|
if (!apiKey) {
|
|
24
27
|
return failure(AIErrors.missingApiKey());
|
|
@@ -36,7 +39,7 @@ async function callAnthropicAPI(prompt, retries = 3) {
|
|
|
36
39
|
},
|
|
37
40
|
body: JSON.stringify({
|
|
38
41
|
model,
|
|
39
|
-
max_tokens:
|
|
42
|
+
max_tokens: maxTokens,
|
|
40
43
|
system: [
|
|
41
44
|
{
|
|
42
45
|
type: 'text',
|
|
@@ -120,4 +123,21 @@ export async function isAICommitAvailable() {
|
|
|
120
123
|
const apiKey = await getApiKey();
|
|
121
124
|
return Boolean(apiKey);
|
|
122
125
|
}
|
|
126
|
+
const PR_MAX_TOKENS = 2000;
|
|
127
|
+
export async function generatePrDescription(request) {
|
|
128
|
+
if (isCommitListTooLarge(request.commits, request.diff)) {
|
|
129
|
+
return failure(AIErrors.tokenLimitExceeded(request.diff.length));
|
|
130
|
+
}
|
|
131
|
+
const prompt = buildPrPrompt(request);
|
|
132
|
+
const apiResult = await callAnthropicAPI(prompt, { maxTokens: PR_MAX_TOKENS });
|
|
133
|
+
if (!apiResult.success) {
|
|
134
|
+
return apiResult;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
return success(parsePrResponse(apiResult.data));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return failure(AIErrors.invalidResponse(apiResult.data));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
123
143
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/ai/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,GAIZ,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/ai/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { StructuredPrompt } from './prompts.js';
|
|
2
|
+
export interface AIPrRequest {
|
|
3
|
+
branchName: string;
|
|
4
|
+
baseBranch: string;
|
|
5
|
+
commits: string[];
|
|
6
|
+
diffStat: string;
|
|
7
|
+
diff: string;
|
|
8
|
+
}
|
|
9
|
+
export interface AIPrResponse {
|
|
10
|
+
title: string;
|
|
11
|
+
body: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function getPrSystemPrompt(): string;
|
|
14
|
+
export declare function buildPrPrompt(request: AIPrRequest): StructuredPrompt;
|
|
15
|
+
export declare function parsePrResponse(raw: string): AIPrResponse;
|
|
16
|
+
export declare function isCommitListTooLarge(commits: string[], diff: string): boolean;
|
|
17
|
+
//# sourceMappingURL=pr-prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-prompts.d.ts","sourceRoot":"","sources":["../../../src/services/ai/pr-prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AA2BD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,gBAAgB,CAsBpE;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAmBzD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
const MAX_DIFF_SIZE = 40000;
|
|
2
|
+
function truncateDiff(diff) {
|
|
3
|
+
if (diff.length <= MAX_DIFF_SIZE)
|
|
4
|
+
return diff;
|
|
5
|
+
return `${diff.slice(0, MAX_DIFF_SIZE)}\n\n... (diff truncated for length — ${diff.length - MAX_DIFF_SIZE} chars omitted)`;
|
|
6
|
+
}
|
|
7
|
+
const PR_SYSTEM_PROMPT = `You are a pull request description generator. Read the branch's commits and diff, then produce a PR title and body.
|
|
8
|
+
|
|
9
|
+
Rules for the title:
|
|
10
|
+
- Under 70 characters
|
|
11
|
+
- Imperative mood ("add X", "fix Y", not "adds X" or "fixed Y")
|
|
12
|
+
- No trailing period, no emojis, no issue numbers, no attribution
|
|
13
|
+
- If the repo uses conventional-commit prefixes in its history, mirror that style (e.g. "feat(cli): ..."); otherwise write a plain sentence
|
|
14
|
+
|
|
15
|
+
Rules for the body:
|
|
16
|
+
- Two sections: "## Summary" (1-3 bullets covering WHAT changed and WHY) and "## Test plan" (markdown checklist of concrete verification steps a reviewer could run)
|
|
17
|
+
- Focus on "why" — the diff already shows "what"
|
|
18
|
+
- Do not invent context that the commits don't support
|
|
19
|
+
- NEVER include attribution, co-authors, emojis, "Generated with" footers, or links back to any tool
|
|
20
|
+
- Use fenced backticks for inline code (commands, file names, symbols)
|
|
21
|
+
|
|
22
|
+
Respond with ONLY a JSON object in this exact format (no markdown fence, no prose):
|
|
23
|
+
{"title":"...","body":"## Summary\\n- ...\\n\\n## Test plan\\n- [ ] ..."}`;
|
|
24
|
+
export function getPrSystemPrompt() {
|
|
25
|
+
return PR_SYSTEM_PROMPT;
|
|
26
|
+
}
|
|
27
|
+
export function buildPrPrompt(request) {
|
|
28
|
+
const parts = [];
|
|
29
|
+
parts.push(`Branch: ${request.branchName}`);
|
|
30
|
+
parts.push(`Base: ${request.baseBranch}`);
|
|
31
|
+
if (request.commits.length > 0) {
|
|
32
|
+
parts.push(`\nCommits (${request.commits.length}):\n${request.commits.join('\n')}`);
|
|
33
|
+
}
|
|
34
|
+
if (request.diffStat) {
|
|
35
|
+
parts.push(`\nFiles changed:\n${request.diffStat}`);
|
|
36
|
+
}
|
|
37
|
+
if (request.diff) {
|
|
38
|
+
parts.push(`\nDiff:\n\`\`\`\n${truncateDiff(request.diff)}\n\`\`\``);
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
system: PR_SYSTEM_PROMPT,
|
|
42
|
+
user: parts.join('\n'),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function parsePrResponse(raw) {
|
|
46
|
+
let jsonStr = raw.trim();
|
|
47
|
+
const fence = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
48
|
+
if (fence?.[1])
|
|
49
|
+
jsonStr = fence[1].trim();
|
|
50
|
+
const object = jsonStr.match(/\{[\s\S]*\}/);
|
|
51
|
+
if (object)
|
|
52
|
+
jsonStr = object[0];
|
|
53
|
+
const parsed = JSON.parse(jsonStr);
|
|
54
|
+
if (!parsed.title || typeof parsed.title !== 'string') {
|
|
55
|
+
throw new Error('AI response missing "title"');
|
|
56
|
+
}
|
|
57
|
+
if (!parsed.body || typeof parsed.body !== 'string') {
|
|
58
|
+
throw new Error('AI response missing "body"');
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
title: parsed.title.trim(),
|
|
62
|
+
body: parsed.body.trim(),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function isCommitListTooLarge(commits, diff) {
|
|
66
|
+
return diff.length > MAX_DIFF_SIZE * 2 || commits.length > 200;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=pr-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-prompts.js","sourceRoot":"","sources":["../../../src/services/ai/pr-prompts.ts"],"names":[],"mappings":"AAeA,MAAM,aAAa,GAAG,KAAK,CAAC;AAE5B,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,CAAC,MAAM,IAAI,aAAa;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,wCAAwC,IAAI,CAAC,MAAM,GAAG,aAAa,iBAAiB,CAAC;AAC7H,CAAC;AAED,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;0EAgBiD,CAAC;AAE3E,MAAM,UAAU,iBAAiB;IAC/B,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAoB;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAE1C,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,OAAO,CAAC,MAAM,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,oBAAoB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACL,MAAM,EAAE,gBAAgB;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC5D,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA0B,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;QAC1B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAiB,EAAE,IAAY;IAClE,OAAO,IAAI,CAAC,MAAM,GAAG,aAAa,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;AACjE,CAAC"}
|
|
@@ -12,12 +12,13 @@ export interface AICommitResponse {
|
|
|
12
12
|
body?: string;
|
|
13
13
|
breaking: boolean;
|
|
14
14
|
}
|
|
15
|
-
export interface
|
|
15
|
+
export interface StructuredPrompt {
|
|
16
16
|
system: string;
|
|
17
17
|
user: string;
|
|
18
18
|
}
|
|
19
|
+
export type StructuredCommitPrompt = StructuredPrompt;
|
|
19
20
|
export declare function getCommitSystemPrompt(): string;
|
|
20
|
-
export declare function buildCommitPrompt(request: AICommitRequest):
|
|
21
|
+
export declare function buildCommitPrompt(request: AICommitRequest): StructuredPrompt;
|
|
21
22
|
export declare function parseCommitResponse(response: string): AICommitResponse;
|
|
22
23
|
export declare function isDiffTooLarge(diff: string): boolean;
|
|
23
24
|
export declare function getDiffSize(diff: string): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/services/ai/prompts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAKD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AA+CD,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/services/ai/prompts.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAKD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AA+CD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAsBtD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAKD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,gBAAgB,CAuB5E;AAKD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAqCtE;AAKD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIpD;AAKD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/services/ai/prompts.ts"],"names":[],"mappings":"AA+BA,MAAM,aAAa,GAAG,KAAK,CAAC;AAK5B,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,CAAC,MAAM,IAAI,aAAa,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAGD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtF,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;QAED,IAAI,YAAY,IAAI,WAAW,GAAG,aAAa,GAAG,GAAG,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,WAAW,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/services/ai/prompts.ts"],"names":[],"mappings":"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"}
|