@claudetree/core 0.4.2 → 0.4.3
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/infra/ai/AIReviewGenerator.d.ts +8 -0
- package/dist/infra/ai/AIReviewGenerator.d.ts.map +1 -0
- package/dist/infra/ai/AIReviewGenerator.js +137 -0
- package/dist/infra/ai/AIReviewGenerator.js.map +1 -0
- package/dist/infra/ai/index.d.ts +2 -0
- package/dist/infra/ai/index.d.ts.map +1 -0
- package/dist/infra/ai/index.js +2 -0
- package/dist/infra/ai/index.js.map +1 -0
- package/dist/infra/index.d.ts +1 -0
- package/dist/infra/index.d.ts.map +1 -1
- package/dist/infra/index.js +1 -0
- package/dist/infra/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AIReviewSummary } from '@claudetree/shared';
|
|
2
|
+
export interface GenerateReviewOptions {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
workingDir: string;
|
|
5
|
+
baseBranch?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function generateAIReviewSummary(options: GenerateReviewOptions): Promise<AIReviewSummary | null>;
|
|
8
|
+
//# sourceMappingURL=AIReviewGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIReviewGenerator.d.ts","sourceRoot":"","sources":["../../../src/infra/ai/AIReviewGenerator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,oBAAoB,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA0BjC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
export async function generateAIReviewSummary(options) {
|
|
3
|
+
const { sessionId, workingDir, baseBranch = 'develop' } = options;
|
|
4
|
+
try {
|
|
5
|
+
// Get git diff
|
|
6
|
+
const diff = await execCommand('git', ['diff', baseBranch, '--stat'], workingDir);
|
|
7
|
+
const detailedDiff = await execCommand('git', ['diff', baseBranch], workingDir);
|
|
8
|
+
if (!diff.trim()) {
|
|
9
|
+
return null; // No changes
|
|
10
|
+
}
|
|
11
|
+
// Build prompt for Claude
|
|
12
|
+
const prompt = buildReviewPrompt(diff, detailedDiff);
|
|
13
|
+
// Call Claude CLI for analysis
|
|
14
|
+
const result = await callClaude(prompt, workingDir);
|
|
15
|
+
// Parse Claude's response
|
|
16
|
+
const summary = parseClaudeResponse(result, sessionId);
|
|
17
|
+
return summary;
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
console.error('Failed to generate AI review summary:', error);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function buildReviewPrompt(diffStat, detailedDiff) {
|
|
25
|
+
// Truncate if too long
|
|
26
|
+
const maxDiffLength = 15000;
|
|
27
|
+
const truncatedDiff = detailedDiff.length > maxDiffLength
|
|
28
|
+
? detailedDiff.slice(0, maxDiffLength) + '\n... (truncated)'
|
|
29
|
+
: detailedDiff;
|
|
30
|
+
return `Analyze this code change and provide a structured review summary.
|
|
31
|
+
|
|
32
|
+
## Git Diff Stats
|
|
33
|
+
\`\`\`
|
|
34
|
+
${diffStat}
|
|
35
|
+
\`\`\`
|
|
36
|
+
|
|
37
|
+
## Detailed Diff
|
|
38
|
+
\`\`\`diff
|
|
39
|
+
${truncatedDiff}
|
|
40
|
+
\`\`\`
|
|
41
|
+
|
|
42
|
+
Respond ONLY in this exact JSON format (no markdown, no extra text):
|
|
43
|
+
{
|
|
44
|
+
"summary": "A concise 1-2 sentence summary of all changes",
|
|
45
|
+
"whatChanged": ["List of specific changes made", "Each item is a brief description"],
|
|
46
|
+
"whyChanged": "Inferred reasoning for why these changes were made",
|
|
47
|
+
"potentialIssues": [
|
|
48
|
+
{
|
|
49
|
+
"severity": "info|warning|critical",
|
|
50
|
+
"title": "Issue title",
|
|
51
|
+
"description": "Detailed description of the issue",
|
|
52
|
+
"file": "optional/path/to/file.ts",
|
|
53
|
+
"line": 42
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"suggestions": ["Actionable suggestions for improvement"],
|
|
57
|
+
"riskLevel": "low|medium|high"
|
|
58
|
+
}`;
|
|
59
|
+
}
|
|
60
|
+
async function callClaude(prompt, workingDir) {
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
const args = [
|
|
63
|
+
'-p', prompt,
|
|
64
|
+
'--output-format', 'text',
|
|
65
|
+
'--max-turns', '1',
|
|
66
|
+
];
|
|
67
|
+
const proc = spawn('claude', args, {
|
|
68
|
+
cwd: workingDir,
|
|
69
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
70
|
+
});
|
|
71
|
+
let stdout = '';
|
|
72
|
+
let stderr = '';
|
|
73
|
+
proc.stdout.on('data', (data) => {
|
|
74
|
+
stdout += data.toString();
|
|
75
|
+
});
|
|
76
|
+
proc.stderr.on('data', (data) => {
|
|
77
|
+
stderr += data.toString();
|
|
78
|
+
});
|
|
79
|
+
proc.on('close', (code) => {
|
|
80
|
+
if (code === 0) {
|
|
81
|
+
resolve(stdout);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
reject(new Error(`Claude exited with code ${code}: ${stderr}`));
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
proc.on('error', reject);
|
|
88
|
+
// Timeout after 60 seconds
|
|
89
|
+
setTimeout(() => {
|
|
90
|
+
proc.kill();
|
|
91
|
+
reject(new Error('Claude review generation timed out'));
|
|
92
|
+
}, 60000);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function parseClaudeResponse(response, sessionId) {
|
|
96
|
+
// Extract JSON from response (Claude might add extra text)
|
|
97
|
+
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
98
|
+
if (!jsonMatch) {
|
|
99
|
+
throw new Error('No JSON found in Claude response');
|
|
100
|
+
}
|
|
101
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
102
|
+
return {
|
|
103
|
+
sessionId,
|
|
104
|
+
summary: parsed.summary || 'No summary available',
|
|
105
|
+
whatChanged: parsed.whatChanged || [],
|
|
106
|
+
whyChanged: parsed.whyChanged || 'Unknown',
|
|
107
|
+
potentialIssues: (parsed.potentialIssues || []).map((issue) => ({
|
|
108
|
+
severity: issue.severity || 'info',
|
|
109
|
+
title: issue.title || 'Issue',
|
|
110
|
+
description: issue.description || '',
|
|
111
|
+
file: issue.file,
|
|
112
|
+
line: issue.line,
|
|
113
|
+
})),
|
|
114
|
+
suggestions: parsed.suggestions || [],
|
|
115
|
+
riskLevel: parsed.riskLevel || 'low',
|
|
116
|
+
generatedAt: new Date(),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function execCommand(cmd, args, cwd) {
|
|
120
|
+
return new Promise((resolve, reject) => {
|
|
121
|
+
const proc = spawn(cmd, args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
122
|
+
let stdout = '';
|
|
123
|
+
let stderr = '';
|
|
124
|
+
proc.stdout.on('data', (data) => (stdout += data.toString()));
|
|
125
|
+
proc.stderr.on('data', (data) => (stderr += data.toString()));
|
|
126
|
+
proc.on('close', (code) => {
|
|
127
|
+
if (code === 0) {
|
|
128
|
+
resolve(stdout);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
reject(new Error(`${cmd} failed: ${stderr}`));
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
proc.on('error', reject);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=AIReviewGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AIReviewGenerator.js","sourceRoot":"","sources":["../../../src/infra/ai/AIReviewGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infra/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infra/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA8B,MAAM,wBAAwB,CAAC"}
|
package/dist/infra/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC"}
|
package/dist/infra/index.js
CHANGED
package/dist/infra/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claudetree/core",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"description": "Core domain and infrastructure for claudetree",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"execa": "^9.5.0",
|
|
28
28
|
"octokit": "^4.1.0",
|
|
29
29
|
"ws": "^8.18.0",
|
|
30
|
-
"@claudetree/shared": "0.4.
|
|
30
|
+
"@claudetree/shared": "0.4.3"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/debug": "^4.1.12",
|