@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,273 @@
1
+ /**
2
+ * @nahisaho/musubix-codegraph - PR Template Generator
3
+ *
4
+ * Generates PR body content from refactoring suggestions
5
+ *
6
+ * @packageDocumentation
7
+ * @module @nahisaho/musubix-codegraph/pr
8
+ *
9
+ * @see REQ-CG-PR-006 - PR Body Generation
10
+ * @see DES-CG-PR-006 - PR Body Template
11
+ */
12
+ /**
13
+ * Severity emoji mapping
14
+ */
15
+ const SEVERITY_EMOJI = {
16
+ critical: '🔴',
17
+ high: '🟠',
18
+ medium: '🟡',
19
+ low: '🟢',
20
+ info: '🔵',
21
+ };
22
+ /**
23
+ * Refactoring type labels
24
+ */
25
+ const TYPE_LABELS = {
26
+ extract_interface: 'Interface Extraction',
27
+ extract_method: 'Method Extraction',
28
+ extract_class: 'Class Extraction',
29
+ inline: 'Inline Refactoring',
30
+ rename: 'Rename',
31
+ move: 'Move',
32
+ security_fix: 'Security Fix',
33
+ performance: 'Performance Improvement',
34
+ simplify: 'Code Simplification',
35
+ };
36
+ /**
37
+ * PR Template Generator
38
+ *
39
+ * Generates well-formatted PR bodies from refactoring suggestions.
40
+ *
41
+ * @see DES-CG-PR-006
42
+ * @example
43
+ * ```typescript
44
+ * const generator = new PRTemplateGenerator();
45
+ * const body = generator.generate(suggestion, diffs);
46
+ * ```
47
+ */
48
+ export class PRTemplateGenerator {
49
+ options;
50
+ /**
51
+ * Create a new PRTemplateGenerator
52
+ * @param options - Template options
53
+ */
54
+ constructor(options = {}) {
55
+ this.options = {
56
+ includeDiffs: options.includeDiffs ?? true,
57
+ maxDiffLines: options.maxDiffLines ?? 50,
58
+ includeChecklist: options.includeChecklist ?? true,
59
+ checklistItems: options.checklistItems,
60
+ includeRelatedIssues: options.includeRelatedIssues ?? false,
61
+ relatedIssues: options.relatedIssues ?? [],
62
+ footer: options.footer,
63
+ };
64
+ }
65
+ /**
66
+ * Generate PR body
67
+ * @see REQ-CG-PR-006
68
+ */
69
+ generate(suggestion, diffs) {
70
+ const sections = [];
71
+ // Header
72
+ sections.push(this.generateHeader(suggestion));
73
+ // Summary
74
+ sections.push(this.generateSummary(suggestion));
75
+ // Changes
76
+ sections.push(this.generateChangesSection(suggestion));
77
+ // Diffs
78
+ if (this.options.includeDiffs && diffs && diffs.length > 0) {
79
+ sections.push(this.generateDiffsSection(diffs));
80
+ }
81
+ // Impact Analysis
82
+ sections.push(this.generateImpactSection(suggestion));
83
+ // Checklist
84
+ if (this.options.includeChecklist) {
85
+ sections.push(this.generateChecklist(suggestion));
86
+ }
87
+ // Related Issues
88
+ if (this.options.includeRelatedIssues && this.options.relatedIssues && this.options.relatedIssues.length > 0) {
89
+ sections.push(this.generateRelatedIssues());
90
+ }
91
+ // Footer
92
+ sections.push(this.generateFooter(suggestion));
93
+ return sections.filter(s => s.length > 0).join('\n\n');
94
+ }
95
+ /**
96
+ * Generate PR title
97
+ */
98
+ generateTitle(suggestion) {
99
+ const typeLabel = TYPE_LABELS[suggestion.type] || suggestion.type;
100
+ return `${typeLabel}: ${suggestion.title}`;
101
+ }
102
+ // ============================================================================
103
+ // Section Generators
104
+ // ============================================================================
105
+ /**
106
+ * Generate header section
107
+ */
108
+ generateHeader(suggestion) {
109
+ const severity = SEVERITY_EMOJI[suggestion.severity];
110
+ const typeLabel = TYPE_LABELS[suggestion.type] || suggestion.type;
111
+ return `## ${severity} ${typeLabel}
112
+
113
+ > 🤖 This PR was automatically generated by **MUSUBIX CodeGraph v2.3.3**`;
114
+ }
115
+ /**
116
+ * Generate summary section
117
+ */
118
+ generateSummary(suggestion) {
119
+ const lines = ['### Summary', ''];
120
+ lines.push(suggestion.description);
121
+ lines.push('');
122
+ lines.push(`**Target Entity:** \`${suggestion.entityId}\``);
123
+ lines.push(`**Confidence:** ${Math.round(suggestion.confidence * 100)}%`);
124
+ if (suggestion.cwe) {
125
+ lines.push(`**Security Reference:** [${suggestion.cwe}](https://cwe.mitre.org/data/definitions/${suggestion.cwe.replace('CWE-', '')}.html)`);
126
+ }
127
+ return lines.join('\n');
128
+ }
129
+ /**
130
+ * Generate reason section
131
+ */
132
+ generateChangesSection(suggestion) {
133
+ const lines = ['### Reason for Change', ''];
134
+ lines.push(suggestion.reason);
135
+ lines.push('');
136
+ lines.push('### Files Changed');
137
+ lines.push('');
138
+ // Group by file
139
+ const fileChanges = new Map();
140
+ for (const change of suggestion.changes) {
141
+ const existing = fileChanges.get(change.filePath) ?? [];
142
+ existing.push(change);
143
+ fileChanges.set(change.filePath, existing);
144
+ }
145
+ for (const [filePath, changes] of fileChanges) {
146
+ lines.push(`- \`${filePath}\``);
147
+ for (const change of changes) {
148
+ lines.push(` - Lines ${change.startLine}-${change.endLine}: ${change.description}`);
149
+ }
150
+ }
151
+ return lines.join('\n');
152
+ }
153
+ /**
154
+ * Generate diffs section
155
+ */
156
+ generateDiffsSection(diffs) {
157
+ const lines = ['### Code Changes', ''];
158
+ for (const diff of diffs) {
159
+ const icon = diff.changeType === 'added' ? '➕' :
160
+ diff.changeType === 'deleted' ? '➖' : '📝';
161
+ lines.push(`<details>`);
162
+ lines.push(`<summary>${icon} <code>${diff.filePath}</code> (+${diff.additions}/-${diff.deletions})</summary>`);
163
+ lines.push('');
164
+ // Truncate long diffs
165
+ const diffLines = diff.diff.split('\n');
166
+ if (diffLines.length > this.options.maxDiffLines) {
167
+ const truncated = diffLines.slice(0, this.options.maxDiffLines).join('\n');
168
+ lines.push('```diff');
169
+ lines.push(truncated);
170
+ lines.push(`... (${diffLines.length - this.options.maxDiffLines} more lines)`);
171
+ lines.push('```');
172
+ }
173
+ else {
174
+ lines.push('```diff');
175
+ lines.push(diff.diff);
176
+ lines.push('```');
177
+ }
178
+ lines.push('</details>');
179
+ lines.push('');
180
+ }
181
+ return lines.join('\n');
182
+ }
183
+ /**
184
+ * Generate impact analysis section
185
+ */
186
+ generateImpactSection(suggestion) {
187
+ const lines = ['### Impact Analysis', ''];
188
+ lines.push(`| Metric | Value |`);
189
+ lines.push(`|--------|-------|`);
190
+ lines.push(`| Files Affected | ${suggestion.impact.filesAffected} |`);
191
+ lines.push(`| Lines Changed | ${suggestion.impact.linesChanged} |`);
192
+ lines.push(`| Dependencies | ${suggestion.impact.dependencies.length} |`);
193
+ if (suggestion.impact.dependencies.length > 0) {
194
+ lines.push('');
195
+ lines.push('**Affected Dependencies:**');
196
+ for (const dep of suggestion.impact.dependencies.slice(0, 10)) {
197
+ lines.push(`- \`${dep}\``);
198
+ }
199
+ if (suggestion.impact.dependencies.length > 10) {
200
+ lines.push(`- ... and ${suggestion.impact.dependencies.length - 10} more`);
201
+ }
202
+ }
203
+ return lines.join('\n');
204
+ }
205
+ /**
206
+ * Generate checklist section
207
+ */
208
+ generateChecklist(suggestion) {
209
+ const lines = ['### Checklist', ''];
210
+ const defaultItems = [
211
+ 'Code compiles without errors',
212
+ 'All existing tests pass',
213
+ 'New tests added for changed functionality',
214
+ 'Documentation updated if necessary',
215
+ 'No breaking changes introduced',
216
+ ];
217
+ // Add security-specific items
218
+ if (suggestion.type === 'security_fix') {
219
+ defaultItems.push('Security vulnerability is fully addressed');
220
+ defaultItems.push('No new security issues introduced');
221
+ }
222
+ const items = this.options.checklistItems ?? defaultItems;
223
+ for (const item of items) {
224
+ lines.push(`- [ ] ${item}`);
225
+ }
226
+ return lines.join('\n');
227
+ }
228
+ /**
229
+ * Generate related issues section
230
+ */
231
+ generateRelatedIssues() {
232
+ const lines = ['### Related Issues', ''];
233
+ for (const issue of this.options.relatedIssues) {
234
+ lines.push(`- Closes #${issue}`);
235
+ }
236
+ return lines.join('\n');
237
+ }
238
+ /**
239
+ * Generate footer section
240
+ */
241
+ generateFooter(suggestion) {
242
+ const lines = ['---', ''];
243
+ if (this.options.footer) {
244
+ lines.push(this.options.footer);
245
+ lines.push('');
246
+ }
247
+ lines.push(`📋 **Suggestion ID:** \`${suggestion.id}\``);
248
+ lines.push(`🕐 **Generated:** ${new Date().toISOString()}`);
249
+ lines.push(`🔧 **Tool:** MUSUBIX CodeGraph v2.3.3`);
250
+ return lines.join('\n');
251
+ }
252
+ }
253
+ /**
254
+ * Create a PR template generator
255
+ */
256
+ export function createPRTemplateGenerator(options) {
257
+ return new PRTemplateGenerator(options);
258
+ }
259
+ /**
260
+ * Generate a simple PR body without advanced options
261
+ */
262
+ export function generateSimplePRBody(suggestion) {
263
+ const generator = new PRTemplateGenerator({ includeDiffs: false });
264
+ return generator.generate(suggestion);
265
+ }
266
+ /**
267
+ * Generate PR title from suggestion
268
+ */
269
+ export function generatePRTitle(suggestion) {
270
+ const generator = new PRTemplateGenerator();
271
+ return generator.generateTitle(suggestion);
272
+ }
273
+ //# sourceMappingURL=pr-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-template.js","sourceRoot":"","sources":["../../src/pr/pr-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
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 type { RefactoringSuggestion, CodeChange, FileDiff } from './types.js';
13
+ /**
14
+ * Result of applying a single change
15
+ */
16
+ export interface ApplyChangeResult {
17
+ /** Whether the change was applied successfully */
18
+ success: boolean;
19
+ /** File path */
20
+ filePath: string;
21
+ /** Error message if failed */
22
+ error?: string;
23
+ /** Backup path if backup was created */
24
+ backupPath?: string;
25
+ }
26
+ /**
27
+ * Result of applying all changes in a suggestion
28
+ */
29
+ export interface ApplyResult {
30
+ /** Overall success status */
31
+ success: boolean;
32
+ /** Files modified */
33
+ filesModified: string[];
34
+ /** Files created */
35
+ filesCreated: string[];
36
+ /** Files deleted */
37
+ filesDeleted: string[];
38
+ /** Individual change results */
39
+ changeResults: ApplyChangeResult[];
40
+ /** Overall error if failed */
41
+ error?: string;
42
+ }
43
+ /**
44
+ * Options for applying refactoring
45
+ */
46
+ export interface ApplyOptions {
47
+ /** Repository root path */
48
+ repoPath: string;
49
+ /** Create backups before modifying */
50
+ createBackups?: boolean;
51
+ /** Backup directory (default: .musubix-backup) */
52
+ backupDir?: string;
53
+ /** Validate changes before applying */
54
+ validate?: boolean;
55
+ /** Dry run - don't actually modify files */
56
+ dryRun?: boolean;
57
+ }
58
+ /**
59
+ * Refactoring Applier
60
+ *
61
+ * Applies code changes from refactoring suggestions to source files.
62
+ * Supports validation, backup, and rollback.
63
+ *
64
+ * @see DES-CG-PR-004
65
+ * @example
66
+ * ```typescript
67
+ * const applier = new RefactoringApplier({ repoPath: '/path/to/repo' });
68
+ * const result = await applier.apply(suggestion);
69
+ * if (!result.success) {
70
+ * await applier.rollback();
71
+ * }
72
+ * ```
73
+ */
74
+ export declare class RefactoringApplier {
75
+ private readonly repoPath;
76
+ private readonly createBackups;
77
+ private readonly backupDir;
78
+ private readonly validate;
79
+ private appliedChanges;
80
+ /**
81
+ * Create a new RefactoringApplier
82
+ * @param options - Apply options
83
+ */
84
+ constructor(options: ApplyOptions);
85
+ /**
86
+ * Apply a refactoring suggestion
87
+ * @see REQ-CG-PR-002
88
+ */
89
+ apply(suggestion: RefactoringSuggestion): ApplyResult;
90
+ /**
91
+ * Preview changes without applying
92
+ * @see REQ-CG-PR-007
93
+ */
94
+ preview(suggestion: RefactoringSuggestion): FileDiff[];
95
+ /**
96
+ * Rollback applied changes
97
+ */
98
+ rollback(): void;
99
+ /**
100
+ * Validate changes can be applied
101
+ */
102
+ validateChanges(changes: CodeChange[]): string | null;
103
+ /**
104
+ * Check if a suggestion can be applied
105
+ */
106
+ canApply(suggestion: RefactoringSuggestion): {
107
+ canApply: boolean;
108
+ reason?: string;
109
+ };
110
+ /**
111
+ * Group changes by file
112
+ */
113
+ private groupChangesByFile;
114
+ /**
115
+ * Apply changes to a single file
116
+ */
117
+ private applyChangesToFile;
118
+ /**
119
+ * Apply changes to content string
120
+ */
121
+ private applyChangesToContent;
122
+ /**
123
+ * Create a backup of a file
124
+ */
125
+ private createBackup;
126
+ /**
127
+ * Normalize whitespace for comparison
128
+ */
129
+ private normalizeWhitespace;
130
+ /**
131
+ * Generate unified diff format
132
+ */
133
+ private generateUnifiedDiff;
134
+ /**
135
+ * Calculate diff statistics
136
+ */
137
+ private calculateDiffStats;
138
+ }
139
+ /**
140
+ * Create a RefactoringApplier instance
141
+ */
142
+ export declare function createRefactoringApplier(repoPath: string, options?: Partial<ApplyOptions>): RefactoringApplier;
143
+ //# sourceMappingURL=refactoring-applier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refactoring-applier.d.ts","sourceRoot":"","sources":["../../src/pr/refactoring-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EACV,qBAAqB,EACrB,UAAU,EACV,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,oBAAoB;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gCAAgC;IAChC,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,cAAc,CAAkC;IAExD;;;OAGG;gBACS,OAAO,EAAE,YAAY;IAWjC;;;OAGG;IACH,KAAK,CAAC,UAAU,EAAE,qBAAqB,GAAG,WAAW;IAsErD;;;OAGG;IACH,OAAO,CAAC,UAAU,EAAE,qBAAqB,GAAG,QAAQ,EAAE;IAqCtD;;OAEG;IACH,QAAQ,IAAI,IAAI;IAiBhB;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,GAAG,IAAI;IA2CrD;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAYnF;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiD1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;OAEG;IACH,OAAO,CAAC,YAAY;IAgBpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2D3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAqB3B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,kBAAkB,CAK9G"}