@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.
@@ -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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAS3C,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAA8B;IAE9B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC;IAElE,IAAI,CAAC;QACH,eAAe;QACf,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;QAClF,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;QAEhF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,CAAC,aAAa;QAC5B,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAErD,+BAA+B;QAC/B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAEpD,0BAA0B;QAC1B,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEvD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,YAAoB;IAC/D,uBAAuB;IACvB,MAAM,aAAa,GAAG,KAAK,CAAC;IAC5B,MAAM,aAAa,GACjB,YAAY,CAAC,MAAM,GAAG,aAAa;QACjC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,mBAAmB;QAC5D,CAAC,CAAC,YAAY,CAAC;IAEnB,OAAO;;;;EAIP,QAAQ;;;;;EAKR,aAAa;;;;;;;;;;;;;;;;;;;EAmBb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,UAAkB;IAC1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,MAAM;YACZ,iBAAiB,EAAE,MAAM;YACzB,aAAa,EAAE,GAAG;SACnB,CAAC;QAEF,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEzB,2BAA2B;QAC3B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAC1D,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB,EAAE,SAAiB;IAC9D,2DAA2D;IAC3D,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAExC,OAAO;QACL,SAAS;QACT,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,sBAAsB;QACjD,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;QACrC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;QAC1C,eAAe,EAAE,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAoB,EAAE,EAAE,CAAC,CAAC;YAC7E,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,MAAM;YAClC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO;YAC7B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;YACpC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC,CAAC;QACH,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QACpC,WAAW,EAAE,IAAI,IAAI,EAAE;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,IAAc,EAAE,GAAW;IAC3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAE9D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { generateAIReviewSummary, type GenerateReviewOptions } from './AIReviewGenerator.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { generateAIReviewSummary } from './AIReviewGenerator.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -6,4 +6,5 @@ export * from './github/index.js';
6
6
  export * from './slack/index.js';
7
7
  export * from './logger/index.js';
8
8
  export * from './validation/index.js';
9
+ export * from './ai/index.js';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -6,4 +6,5 @@ export * from './github/index.js';
6
6
  export * from './slack/index.js';
7
7
  export * from './logger/index.js';
8
8
  export * from './validation/index.js';
9
+ export * from './ai/index.js';
9
10
  //# sourceMappingURL=index.js.map
@@ -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.2",
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.2"
30
+ "@claudetree/shared": "0.4.3"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/debug": "^4.1.12",