@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.
@@ -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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"}