@nahisaho/musubix-codegraph 2.3.2 → 2.3.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/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +200 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/pr/git-operations.d.ts +186 -0
- package/dist/pr/git-operations.d.ts.map +1 -0
- package/dist/pr/git-operations.js +441 -0
- package/dist/pr/git-operations.js.map +1 -0
- package/dist/pr/github-adapter.d.ts +163 -0
- package/dist/pr/github-adapter.d.ts.map +1 -0
- package/dist/pr/github-adapter.js +467 -0
- package/dist/pr/github-adapter.js.map +1 -0
- package/dist/pr/index.d.ts +19 -0
- package/dist/pr/index.d.ts.map +1 -0
- package/dist/pr/index.js +24 -0
- package/dist/pr/index.js.map +1 -0
- package/dist/pr/pr-creator.d.ts +135 -0
- package/dist/pr/pr-creator.d.ts.map +1 -0
- package/dist/pr/pr-creator.js +387 -0
- package/dist/pr/pr-creator.js.map +1 -0
- package/dist/pr/pr-template.d.ts +105 -0
- package/dist/pr/pr-template.d.ts.map +1 -0
- package/dist/pr/pr-template.js +273 -0
- package/dist/pr/pr-template.js.map +1 -0
- package/dist/pr/refactoring-applier.d.ts +143 -0
- package/dist/pr/refactoring-applier.d.ts.map +1 -0
- package/dist/pr/refactoring-applier.js +412 -0
- package/dist/pr/refactoring-applier.js.map +1 -0
- package/dist/pr/types.d.ts +362 -0
- package/dist/pr/types.d.ts.map +1 -0
- package/dist/pr/types.js +63 -0
- package/dist/pr/types.js.map +1 -0
- package/package.json +11 -2
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @nahisaho/musubix-codegraph - Refactoring Applier
|
|
3
|
+
*
|
|
4
|
+
* Applies refactoring suggestions to source files
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module @nahisaho/musubix-codegraph/pr
|
|
8
|
+
*
|
|
9
|
+
* @see REQ-CG-PR-002 - Auto Apply Refactoring
|
|
10
|
+
* @see DES-CG-PR-004 - Class Design
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
13
|
+
import { join, dirname } from 'node:path';
|
|
14
|
+
/**
|
|
15
|
+
* Refactoring Applier
|
|
16
|
+
*
|
|
17
|
+
* Applies code changes from refactoring suggestions to source files.
|
|
18
|
+
* Supports validation, backup, and rollback.
|
|
19
|
+
*
|
|
20
|
+
* @see DES-CG-PR-004
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const applier = new RefactoringApplier({ repoPath: '/path/to/repo' });
|
|
24
|
+
* const result = await applier.apply(suggestion);
|
|
25
|
+
* if (!result.success) {
|
|
26
|
+
* await applier.rollback();
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class RefactoringApplier {
|
|
31
|
+
repoPath;
|
|
32
|
+
createBackups;
|
|
33
|
+
backupDir;
|
|
34
|
+
validate;
|
|
35
|
+
appliedChanges = new Map(); // filePath -> originalContent
|
|
36
|
+
/**
|
|
37
|
+
* Create a new RefactoringApplier
|
|
38
|
+
* @param options - Apply options
|
|
39
|
+
*/
|
|
40
|
+
constructor(options) {
|
|
41
|
+
this.repoPath = options.repoPath;
|
|
42
|
+
this.createBackups = options.createBackups ?? true;
|
|
43
|
+
this.backupDir = options.backupDir ?? '.musubix-backup';
|
|
44
|
+
this.validate = options.validate ?? true;
|
|
45
|
+
}
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Main Operations
|
|
48
|
+
// ============================================================================
|
|
49
|
+
/**
|
|
50
|
+
* Apply a refactoring suggestion
|
|
51
|
+
* @see REQ-CG-PR-002
|
|
52
|
+
*/
|
|
53
|
+
apply(suggestion) {
|
|
54
|
+
const changeResults = [];
|
|
55
|
+
const filesModified = [];
|
|
56
|
+
const filesCreated = [];
|
|
57
|
+
const filesDeleted = [];
|
|
58
|
+
// Clear previous applied changes tracking
|
|
59
|
+
this.appliedChanges.clear();
|
|
60
|
+
try {
|
|
61
|
+
// Validate all changes first
|
|
62
|
+
if (this.validate) {
|
|
63
|
+
const validationError = this.validateChanges(suggestion.changes);
|
|
64
|
+
if (validationError) {
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
filesModified: [],
|
|
68
|
+
filesCreated: [],
|
|
69
|
+
filesDeleted: [],
|
|
70
|
+
changeResults: [],
|
|
71
|
+
error: validationError,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Group changes by file for efficient processing
|
|
76
|
+
const changesByFile = this.groupChangesByFile(suggestion.changes);
|
|
77
|
+
// Apply changes to each file
|
|
78
|
+
for (const [filePath, changes] of changesByFile) {
|
|
79
|
+
const result = this.applyChangesToFile(filePath, changes);
|
|
80
|
+
changeResults.push(result);
|
|
81
|
+
if (result.success) {
|
|
82
|
+
filesModified.push(filePath);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Rollback on failure
|
|
86
|
+
this.rollback();
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
filesModified: [],
|
|
90
|
+
filesCreated: [],
|
|
91
|
+
filesDeleted: [],
|
|
92
|
+
changeResults,
|
|
93
|
+
error: `Failed to apply changes to ${filePath}: ${result.error}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
success: true,
|
|
99
|
+
filesModified,
|
|
100
|
+
filesCreated,
|
|
101
|
+
filesDeleted,
|
|
102
|
+
changeResults,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
// Rollback on any error
|
|
107
|
+
this.rollback();
|
|
108
|
+
return {
|
|
109
|
+
success: false,
|
|
110
|
+
filesModified: [],
|
|
111
|
+
filesCreated: [],
|
|
112
|
+
filesDeleted: [],
|
|
113
|
+
changeResults,
|
|
114
|
+
error: error instanceof Error ? error.message : String(error),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Preview changes without applying
|
|
120
|
+
* @see REQ-CG-PR-007
|
|
121
|
+
*/
|
|
122
|
+
preview(suggestion) {
|
|
123
|
+
const diffs = [];
|
|
124
|
+
const changesByFile = this.groupChangesByFile(suggestion.changes);
|
|
125
|
+
for (const [filePath, changes] of changesByFile) {
|
|
126
|
+
const fullPath = join(this.repoPath, filePath);
|
|
127
|
+
if (!existsSync(fullPath)) {
|
|
128
|
+
// New file
|
|
129
|
+
const newContent = changes.map(c => c.newCode).join('\n');
|
|
130
|
+
diffs.push({
|
|
131
|
+
filePath,
|
|
132
|
+
changeType: 'added',
|
|
133
|
+
diff: this.generateUnifiedDiff('', newContent, filePath),
|
|
134
|
+
additions: newContent.split('\n').length,
|
|
135
|
+
deletions: 0,
|
|
136
|
+
});
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
const originalContent = readFileSync(fullPath, 'utf-8');
|
|
140
|
+
const newContent = this.applyChangesToContent(originalContent, changes);
|
|
141
|
+
const diff = this.generateUnifiedDiff(originalContent, newContent, filePath);
|
|
142
|
+
const stats = this.calculateDiffStats(originalContent, newContent);
|
|
143
|
+
diffs.push({
|
|
144
|
+
filePath,
|
|
145
|
+
changeType: 'modified',
|
|
146
|
+
diff,
|
|
147
|
+
additions: stats.additions,
|
|
148
|
+
deletions: stats.deletions,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return diffs;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Rollback applied changes
|
|
155
|
+
*/
|
|
156
|
+
rollback() {
|
|
157
|
+
for (const [filePath, originalContent] of this.appliedChanges) {
|
|
158
|
+
const fullPath = join(this.repoPath, filePath);
|
|
159
|
+
try {
|
|
160
|
+
writeFileSync(fullPath, originalContent, 'utf-8');
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Best effort rollback
|
|
164
|
+
console.error(`Failed to rollback ${filePath}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
this.appliedChanges.clear();
|
|
168
|
+
}
|
|
169
|
+
// ============================================================================
|
|
170
|
+
// Validation
|
|
171
|
+
// ============================================================================
|
|
172
|
+
/**
|
|
173
|
+
* Validate changes can be applied
|
|
174
|
+
*/
|
|
175
|
+
validateChanges(changes) {
|
|
176
|
+
for (const change of changes) {
|
|
177
|
+
const fullPath = join(this.repoPath, change.filePath);
|
|
178
|
+
// Check file exists (for modifications)
|
|
179
|
+
if (!existsSync(fullPath)) {
|
|
180
|
+
// Allow if this is a new file (originalCode is empty)
|
|
181
|
+
if (change.originalCode.trim() !== '') {
|
|
182
|
+
return `File not found: ${change.filePath}`;
|
|
183
|
+
}
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// Validate line numbers
|
|
187
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
188
|
+
const lines = content.split('\n');
|
|
189
|
+
if (change.startLine < 1) {
|
|
190
|
+
return `Invalid start line ${change.startLine} in ${change.filePath}`;
|
|
191
|
+
}
|
|
192
|
+
if (change.endLine > lines.length) {
|
|
193
|
+
return `End line ${change.endLine} exceeds file length ${lines.length} in ${change.filePath}`;
|
|
194
|
+
}
|
|
195
|
+
if (change.startLine > change.endLine) {
|
|
196
|
+
return `Start line ${change.startLine} is after end line ${change.endLine} in ${change.filePath}`;
|
|
197
|
+
}
|
|
198
|
+
// Validate original code matches
|
|
199
|
+
const actualLines = lines.slice(change.startLine - 1, change.endLine);
|
|
200
|
+
const actualCode = actualLines.join('\n');
|
|
201
|
+
const expectedCode = change.originalCode;
|
|
202
|
+
if (this.normalizeWhitespace(actualCode) !== this.normalizeWhitespace(expectedCode)) {
|
|
203
|
+
return `Original code mismatch in ${change.filePath}:${change.startLine}-${change.endLine}. ` +
|
|
204
|
+
`Expected:\n${expectedCode}\n\nActual:\n${actualCode}`;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Check if a suggestion can be applied
|
|
211
|
+
*/
|
|
212
|
+
canApply(suggestion) {
|
|
213
|
+
const error = this.validateChanges(suggestion.changes);
|
|
214
|
+
if (error) {
|
|
215
|
+
return { canApply: false, reason: error };
|
|
216
|
+
}
|
|
217
|
+
return { canApply: true };
|
|
218
|
+
}
|
|
219
|
+
// ============================================================================
|
|
220
|
+
// Private Helpers
|
|
221
|
+
// ============================================================================
|
|
222
|
+
/**
|
|
223
|
+
* Group changes by file
|
|
224
|
+
*/
|
|
225
|
+
groupChangesByFile(changes) {
|
|
226
|
+
const byFile = new Map();
|
|
227
|
+
for (const change of changes) {
|
|
228
|
+
const existing = byFile.get(change.filePath) ?? [];
|
|
229
|
+
existing.push(change);
|
|
230
|
+
byFile.set(change.filePath, existing);
|
|
231
|
+
}
|
|
232
|
+
// Sort changes within each file by line number (descending)
|
|
233
|
+
// This allows applying changes from bottom to top without line number shifts
|
|
234
|
+
for (const [_filePath, fileChanges] of byFile) {
|
|
235
|
+
fileChanges.sort((a, b) => (b.startLine ?? 0) - (a.startLine ?? 0));
|
|
236
|
+
}
|
|
237
|
+
return byFile;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Apply changes to a single file
|
|
241
|
+
*/
|
|
242
|
+
applyChangesToFile(filePath, changes) {
|
|
243
|
+
const fullPath = join(this.repoPath, filePath);
|
|
244
|
+
try {
|
|
245
|
+
// Read original content
|
|
246
|
+
let content = '';
|
|
247
|
+
if (existsSync(fullPath)) {
|
|
248
|
+
content = readFileSync(fullPath, 'utf-8');
|
|
249
|
+
// Store for potential rollback
|
|
250
|
+
this.appliedChanges.set(filePath, content);
|
|
251
|
+
}
|
|
252
|
+
// Create backup if enabled
|
|
253
|
+
if (this.createBackups && content) {
|
|
254
|
+
const backupPath = this.createBackup(filePath, content);
|
|
255
|
+
if (!backupPath) {
|
|
256
|
+
return {
|
|
257
|
+
success: false,
|
|
258
|
+
filePath,
|
|
259
|
+
error: 'Failed to create backup',
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Apply changes
|
|
264
|
+
const newContent = this.applyChangesToContent(content, changes);
|
|
265
|
+
// Ensure directory exists
|
|
266
|
+
const dir = dirname(fullPath);
|
|
267
|
+
if (!existsSync(dir)) {
|
|
268
|
+
mkdirSync(dir, { recursive: true });
|
|
269
|
+
}
|
|
270
|
+
// Write new content
|
|
271
|
+
writeFileSync(fullPath, newContent, 'utf-8');
|
|
272
|
+
return {
|
|
273
|
+
success: true,
|
|
274
|
+
filePath,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
return {
|
|
279
|
+
success: false,
|
|
280
|
+
filePath,
|
|
281
|
+
error: error instanceof Error ? error.message : String(error),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Apply changes to content string
|
|
287
|
+
*/
|
|
288
|
+
applyChangesToContent(content, changes) {
|
|
289
|
+
const lines = content.split('\n');
|
|
290
|
+
// Changes should already be sorted by line number descending
|
|
291
|
+
for (const change of changes) {
|
|
292
|
+
const beforeLines = lines.slice(0, change.startLine - 1);
|
|
293
|
+
const afterLines = lines.slice(change.endLine);
|
|
294
|
+
const newLines = change.newCode.split('\n');
|
|
295
|
+
lines.length = 0;
|
|
296
|
+
lines.push(...beforeLines, ...newLines, ...afterLines);
|
|
297
|
+
}
|
|
298
|
+
return lines.join('\n');
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Create a backup of a file
|
|
302
|
+
*/
|
|
303
|
+
createBackup(filePath, content) {
|
|
304
|
+
try {
|
|
305
|
+
const backupPath = join(this.repoPath, this.backupDir, filePath);
|
|
306
|
+
const backupDir = dirname(backupPath);
|
|
307
|
+
if (!existsSync(backupDir)) {
|
|
308
|
+
mkdirSync(backupDir, { recursive: true });
|
|
309
|
+
}
|
|
310
|
+
writeFileSync(backupPath, content, 'utf-8');
|
|
311
|
+
return backupPath;
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Normalize whitespace for comparison
|
|
319
|
+
*/
|
|
320
|
+
normalizeWhitespace(str) {
|
|
321
|
+
return str
|
|
322
|
+
.split('\n')
|
|
323
|
+
.map(line => line.trimEnd())
|
|
324
|
+
.join('\n')
|
|
325
|
+
.trim();
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Generate unified diff format
|
|
329
|
+
*/
|
|
330
|
+
generateUnifiedDiff(original, modified, filePath) {
|
|
331
|
+
const originalLines = original.split('\n');
|
|
332
|
+
const modifiedLines = modified.split('\n');
|
|
333
|
+
const diff = [];
|
|
334
|
+
diff.push(`--- a/${filePath}`);
|
|
335
|
+
diff.push(`+++ b/${filePath}`);
|
|
336
|
+
// Simple line-by-line diff
|
|
337
|
+
const maxLen = Math.max(originalLines.length, modifiedLines.length);
|
|
338
|
+
let contextStart = -1;
|
|
339
|
+
const hunks = [];
|
|
340
|
+
let currentHunk = [];
|
|
341
|
+
for (let i = 0; i < maxLen; i++) {
|
|
342
|
+
const origLine = originalLines[i] ?? '';
|
|
343
|
+
const modLine = modifiedLines[i] ?? '';
|
|
344
|
+
if (origLine !== modLine) {
|
|
345
|
+
if (contextStart === -1) {
|
|
346
|
+
contextStart = Math.max(0, i - 3);
|
|
347
|
+
// Add context before
|
|
348
|
+
for (let j = contextStart; j < i; j++) {
|
|
349
|
+
currentHunk.push(` ${originalLines[j] ?? ''}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
if (i < originalLines.length) {
|
|
353
|
+
currentHunk.push(`-${origLine}`);
|
|
354
|
+
}
|
|
355
|
+
if (i < modifiedLines.length) {
|
|
356
|
+
currentHunk.push(`+${modLine}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
else if (contextStart !== -1) {
|
|
360
|
+
currentHunk.push(` ${origLine}`);
|
|
361
|
+
// Check if we should end the hunk (3 lines of context after changes)
|
|
362
|
+
const recentChanges = currentHunk.slice(-4).some(l => l.startsWith('+') || l.startsWith('-'));
|
|
363
|
+
if (!recentChanges) {
|
|
364
|
+
hunks.push({ start: contextStart, lines: currentHunk });
|
|
365
|
+
currentHunk = [];
|
|
366
|
+
contextStart = -1;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (currentHunk.length > 0) {
|
|
371
|
+
hunks.push({ start: contextStart, lines: currentHunk });
|
|
372
|
+
}
|
|
373
|
+
// Format hunks
|
|
374
|
+
for (const hunk of hunks) {
|
|
375
|
+
const origCount = hunk.lines.filter(l => l.startsWith(' ') || l.startsWith('-')).length;
|
|
376
|
+
const modCount = hunk.lines.filter(l => l.startsWith(' ') || l.startsWith('+')).length;
|
|
377
|
+
diff.push(`@@ -${hunk.start + 1},${origCount} +${hunk.start + 1},${modCount} @@`);
|
|
378
|
+
diff.push(...hunk.lines);
|
|
379
|
+
}
|
|
380
|
+
return diff.join('\n');
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Calculate diff statistics
|
|
384
|
+
*/
|
|
385
|
+
calculateDiffStats(original, modified) {
|
|
386
|
+
const origLines = new Set(original.split('\n'));
|
|
387
|
+
const modLines = new Set(modified.split('\n'));
|
|
388
|
+
let additions = 0;
|
|
389
|
+
let deletions = 0;
|
|
390
|
+
for (const line of modLines) {
|
|
391
|
+
if (!origLines.has(line)) {
|
|
392
|
+
additions++;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
for (const line of origLines) {
|
|
396
|
+
if (!modLines.has(line)) {
|
|
397
|
+
deletions++;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return { additions, deletions };
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Create a RefactoringApplier instance
|
|
405
|
+
*/
|
|
406
|
+
export function createRefactoringApplier(repoPath, options) {
|
|
407
|
+
return new RefactoringApplier({
|
|
408
|
+
repoPath,
|
|
409
|
+
...options,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=refactoring-applier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refactoring-applier.js","sourceRoot":"","sources":["../../src/pr/refactoring-applier.ts"],"names":[],"mappings":"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"}
|