@radkode/neo 1.3.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/changeset/index.d.ts +17 -0
- package/dist/commands/changeset/index.d.ts.map +1 -0
- package/dist/commands/changeset/index.js +251 -0
- package/dist/commands/changeset/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 +5 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +15 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/sync/index.d.ts +18 -0
- package/dist/commands/sync/index.d.ts.map +1 -0
- package/dist/commands/sync/index.js +193 -0
- package/dist/commands/sync/index.js.map +1 -0
- package/dist/commands/verify/index.d.ts +23 -0
- package/dist/commands/verify/index.d.ts.map +1 -0
- package/dist/commands/verify/index.js +155 -0
- package/dist/commands/verify/index.js.map +1 -0
- 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,155 @@
|
|
|
1
|
+
import { Command } from '@commander-js/extra-typings';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import { access, readFile } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { ui } from '../../utils/ui.js';
|
|
6
|
+
import { emitJson } from '../../utils/output.js';
|
|
7
|
+
import { runAction } from '../../utils/run-action.js';
|
|
8
|
+
const LOCKFILES = [
|
|
9
|
+
{ file: 'pnpm-lock.yaml', pm: 'pnpm' },
|
|
10
|
+
{ file: 'yarn.lock', pm: 'yarn' },
|
|
11
|
+
{ file: 'bun.lock', pm: 'bun' },
|
|
12
|
+
{ file: 'bun.lockb', pm: 'bun' },
|
|
13
|
+
{ file: 'package-lock.json', pm: 'npm' },
|
|
14
|
+
];
|
|
15
|
+
const DEFAULT_SCRIPTS = ['build', 'test', 'lint', 'typecheck'];
|
|
16
|
+
async function pathExists(p) {
|
|
17
|
+
try {
|
|
18
|
+
await access(p);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function detectPackageManager(cwd) {
|
|
26
|
+
const present = await Promise.all(LOCKFILES.map(async ({ file, pm }) => ((await pathExists(join(cwd, file))) ? pm : null)));
|
|
27
|
+
const found = [...new Set(present.filter((x) => x !== null))];
|
|
28
|
+
if (found.length === 0) {
|
|
29
|
+
throw new Error('No lockfile found. Expected one of: pnpm-lock.yaml, yarn.lock, bun.lock, package-lock.json. Pass --pm <name> to override.');
|
|
30
|
+
}
|
|
31
|
+
if (found.length > 1) {
|
|
32
|
+
ui.warn(`Multiple lockfiles detected (${found.join(', ')}). Using ${found[0]}. Pass --pm to disambiguate.`);
|
|
33
|
+
}
|
|
34
|
+
return found[0];
|
|
35
|
+
}
|
|
36
|
+
async function readScripts(cwd) {
|
|
37
|
+
const pkgPath = join(cwd, 'package.json');
|
|
38
|
+
if (!(await pathExists(pkgPath))) {
|
|
39
|
+
throw new Error('No package.json in current directory.');
|
|
40
|
+
}
|
|
41
|
+
const raw = await readFile(pkgPath, 'utf-8');
|
|
42
|
+
const pkg = JSON.parse(raw);
|
|
43
|
+
return pkg.scripts ?? {};
|
|
44
|
+
}
|
|
45
|
+
function parseFilter(value) {
|
|
46
|
+
if (!value)
|
|
47
|
+
return null;
|
|
48
|
+
return value
|
|
49
|
+
.split(',')
|
|
50
|
+
.map((s) => s.trim())
|
|
51
|
+
.filter(Boolean);
|
|
52
|
+
}
|
|
53
|
+
function pickScripts(scripts, only, skip) {
|
|
54
|
+
const base = only ?? DEFAULT_SCRIPTS;
|
|
55
|
+
const skipSet = new Set(skip ?? []);
|
|
56
|
+
return base.filter((s) => s in scripts && !skipSet.has(s));
|
|
57
|
+
}
|
|
58
|
+
function pmArgs(pm, script) {
|
|
59
|
+
if (pm === 'npm')
|
|
60
|
+
return ['run', script];
|
|
61
|
+
return ['run', script];
|
|
62
|
+
}
|
|
63
|
+
export async function executeVerify(cwd, options) {
|
|
64
|
+
const only = parseFilter(options.only);
|
|
65
|
+
const skip = parseFilter(options.skip);
|
|
66
|
+
const pm = options.pm
|
|
67
|
+
? options.pm
|
|
68
|
+
: await detectPackageManager(cwd);
|
|
69
|
+
const scripts = await readScripts(cwd);
|
|
70
|
+
const toRun = pickScripts(scripts, only, skip);
|
|
71
|
+
if (toRun.length === 0) {
|
|
72
|
+
throw new Error(`No matching scripts found in package.json. Looked for: ${(only ?? DEFAULT_SCRIPTS).join(', ')}.`);
|
|
73
|
+
}
|
|
74
|
+
const results = [];
|
|
75
|
+
const startedAt = Date.now();
|
|
76
|
+
for (const script of toRun) {
|
|
77
|
+
const scriptSpinner = ui.spinner(`${pm} run ${script}`);
|
|
78
|
+
scriptSpinner.start();
|
|
79
|
+
const t0 = Date.now();
|
|
80
|
+
try {
|
|
81
|
+
await execa(pm, pmArgs(pm, script), {
|
|
82
|
+
cwd,
|
|
83
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
84
|
+
});
|
|
85
|
+
const durationMs = Date.now() - t0;
|
|
86
|
+
scriptSpinner.succeed(`${script} passed (${Math.round(durationMs / 100) / 10}s)`);
|
|
87
|
+
results.push({ script, status: 'passed', durationMs });
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const durationMs = Date.now() - t0;
|
|
91
|
+
const exitCode = typeof error.exitCode === 'number'
|
|
92
|
+
? error.exitCode
|
|
93
|
+
: 1;
|
|
94
|
+
scriptSpinner.fail(`${script} failed (${Math.round(durationMs / 100) / 10}s)`);
|
|
95
|
+
const stderr = error.stderr ?? '';
|
|
96
|
+
const stdout = error.stdout ?? '';
|
|
97
|
+
const tail = (stderr || stdout).trim().split('\n').slice(-20).join('\n');
|
|
98
|
+
if (tail)
|
|
99
|
+
ui.muted(tail);
|
|
100
|
+
results.push({ script, status: 'failed', durationMs, exitCode });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const totalDurationMs = Date.now() - startedAt;
|
|
104
|
+
const ok = results.every((r) => r.status !== 'failed');
|
|
105
|
+
return { packageManager: pm, results, ok, totalDurationMs };
|
|
106
|
+
}
|
|
107
|
+
export function createVerifyCommand() {
|
|
108
|
+
const command = new Command('verify');
|
|
109
|
+
command
|
|
110
|
+
.description('Run build, test, lint, and typecheck scripts and summarize results')
|
|
111
|
+
.option('--pm <name>', 'force a specific package manager (pnpm|npm|yarn|bun)')
|
|
112
|
+
.option('--only <scripts>', 'comma-separated subset to run (e.g. build,test)')
|
|
113
|
+
.option('--skip <scripts>', 'comma-separated scripts to skip')
|
|
114
|
+
.addHelpText('after', `
|
|
115
|
+
Examples:
|
|
116
|
+
Run every verify step the repo defines:
|
|
117
|
+
$ neo verify
|
|
118
|
+
|
|
119
|
+
Just build and test:
|
|
120
|
+
$ neo verify --only build,test
|
|
121
|
+
|
|
122
|
+
Skip lint (useful while iterating):
|
|
123
|
+
$ neo verify --skip lint
|
|
124
|
+
|
|
125
|
+
Agent-friendly (structured pass/fail):
|
|
126
|
+
$ neo verify --json
|
|
127
|
+
`)
|
|
128
|
+
.action(runAction(async (options) => {
|
|
129
|
+
const result = await executeVerify(process.cwd(), options);
|
|
130
|
+
emitJson({
|
|
131
|
+
ok: result.ok,
|
|
132
|
+
command: 'verify',
|
|
133
|
+
packageManager: result.packageManager,
|
|
134
|
+
results: result.results,
|
|
135
|
+
totalDurationMs: result.totalDurationMs,
|
|
136
|
+
}, {
|
|
137
|
+
text: () => {
|
|
138
|
+
ui.newline();
|
|
139
|
+
const passed = result.results.filter((r) => r.status === 'passed').length;
|
|
140
|
+
const failed = result.results.filter((r) => r.status === 'failed').length;
|
|
141
|
+
if (result.ok) {
|
|
142
|
+
ui.success(`All ${passed} script(s) passed in ${Math.round(result.totalDurationMs / 100) / 10}s`);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
ui.error(`${failed} of ${result.results.length} script(s) failed`);
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
if (!result.ok) {
|
|
150
|
+
process.exitCode = 1;
|
|
151
|
+
}
|
|
152
|
+
}));
|
|
153
|
+
return command;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/verify/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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"}
|