@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,387 @@
1
+ /**
2
+ * @nahisaho/musubix-codegraph - PR Creator
3
+ *
4
+ * Main orchestrator for creating PRs from refactoring suggestions
5
+ *
6
+ * @packageDocumentation
7
+ * @module @nahisaho/musubix-codegraph/pr
8
+ *
9
+ * @see REQ-CG-PR-001 - GitHub Authentication
10
+ * @see REQ-CG-PR-002 - Auto Apply Refactoring
11
+ * @see REQ-CG-PR-003 - Git Branch Creation
12
+ * @see REQ-CG-PR-004 - Auto Commit
13
+ * @see REQ-CG-PR-005 - GitHub PR Creation
14
+ * @see DES-CG-PR-001 - Component Design
15
+ * @see DES-CG-PR-005 - Sequence Diagram
16
+ */
17
+ import { EventEmitter } from 'node:events';
18
+ import { GitOperations } from './git-operations.js';
19
+ import { GitHubAdapter } from './github-adapter.js';
20
+ import { RefactoringApplier } from './refactoring-applier.js';
21
+ import { PRTemplateGenerator } from './pr-template.js';
22
+ import { generateBranchName, generateCommitMessage, } from './types.js';
23
+ /**
24
+ * PR Creator
25
+ *
26
+ * Orchestrates the entire PR creation workflow:
27
+ * 1. Authenticate with GitHub
28
+ * 2. Create a new branch
29
+ * 3. Apply refactoring changes
30
+ * 4. Commit changes
31
+ * 5. Push to remote
32
+ * 6. Create PR on GitHub
33
+ *
34
+ * @see DES-CG-PR-001
35
+ * @see DES-CG-PR-005
36
+ * @example
37
+ * ```typescript
38
+ * const creator = new PRCreator({ repoPath: '/path/to/repo' });
39
+ * await creator.initialize();
40
+ *
41
+ * const result = await creator.create({
42
+ * suggestion: refactoringSuggestion,
43
+ * baseBranch: 'main',
44
+ * labels: ['refactoring', 'auto-generated'],
45
+ * });
46
+ *
47
+ * console.log(`PR created: ${result.pr?.url}`);
48
+ * ```
49
+ */
50
+ export class PRCreator extends EventEmitter {
51
+ config;
52
+ git = null;
53
+ github = null;
54
+ applier = null;
55
+ templateGenerator;
56
+ initialized = false;
57
+ originalBranch = null;
58
+ /**
59
+ * Create a new PRCreator
60
+ * @param config - Configuration options
61
+ */
62
+ constructor(config) {
63
+ super();
64
+ this.config = {
65
+ remote: 'origin',
66
+ createBackups: true,
67
+ ...config,
68
+ };
69
+ this.templateGenerator = new PRTemplateGenerator();
70
+ }
71
+ // ============================================================================
72
+ // Initialization
73
+ // ============================================================================
74
+ /**
75
+ * Initialize the PR creator
76
+ * Sets up Git operations and authenticates with GitHub
77
+ */
78
+ async initialize() {
79
+ try {
80
+ // Initialize Git operations
81
+ this.git = new GitOperations({
82
+ repoPath: this.config.repoPath,
83
+ remote: this.config.remote,
84
+ });
85
+ // Parse GitHub owner/repo from remote
86
+ const remoteInfo = this.git.parseRemoteUrl();
87
+ if (!remoteInfo) {
88
+ return {
89
+ success: false,
90
+ error: 'Could not parse GitHub owner/repo from remote URL',
91
+ };
92
+ }
93
+ // Initialize GitHub adapter
94
+ this.github = new GitHubAdapter({
95
+ owner: remoteInfo.owner,
96
+ repo: remoteInfo.repo,
97
+ token: this.config.githubToken,
98
+ });
99
+ // Authenticate with GitHub
100
+ const authResult = await this.github.authenticate();
101
+ if (!authResult.authenticated) {
102
+ return {
103
+ success: false,
104
+ error: `GitHub authentication failed: ${authResult.error}`,
105
+ };
106
+ }
107
+ // Initialize refactoring applier
108
+ this.applier = new RefactoringApplier({
109
+ repoPath: this.config.repoPath,
110
+ createBackups: this.config.createBackups,
111
+ });
112
+ // Store current branch for potential rollback
113
+ this.originalBranch = this.git.getCurrentBranch();
114
+ this.initialized = true;
115
+ return { success: true };
116
+ }
117
+ catch (error) {
118
+ return {
119
+ success: false,
120
+ error: error instanceof Error ? error.message : String(error),
121
+ };
122
+ }
123
+ }
124
+ /**
125
+ * Check if initialized
126
+ */
127
+ isInitialized() {
128
+ return this.initialized;
129
+ }
130
+ // ============================================================================
131
+ // Main Operations
132
+ // ============================================================================
133
+ /**
134
+ * Create a PR from a refactoring suggestion
135
+ * @see REQ-CG-PR-002, REQ-CG-PR-003, REQ-CG-PR-004, REQ-CG-PR-005
136
+ */
137
+ async create(options) {
138
+ this.ensureInitialized();
139
+ const { suggestion, dryRun } = options;
140
+ const warnings = [];
141
+ try {
142
+ this.emit('pr:start', { suggestion });
143
+ // Generate branch name
144
+ const branchName = options.branchName ?? generateBranchName(suggestion);
145
+ // Check for uncommitted changes
146
+ if (this.git.hasUncommittedChanges()) {
147
+ warnings.push('Repository has uncommitted changes. They will be stashed.');
148
+ this.git.stash('musubix-pr-creator-auto-stash');
149
+ }
150
+ // Dry run mode - just preview
151
+ if (dryRun) {
152
+ return this.dryRun(options, branchName);
153
+ }
154
+ // Determine base branch
155
+ const baseBranch = options.baseBranch ?? this.git.getDefaultBranch();
156
+ // Create and checkout new branch
157
+ this.emit('pr:branch', { name: branchName });
158
+ this.git.createBranch(branchName, baseBranch);
159
+ // Apply refactoring changes
160
+ const diffs = this.applier.preview(suggestion);
161
+ for (const diff of diffs) {
162
+ this.emit('pr:applying', { file: diff.filePath, changes: 1 });
163
+ }
164
+ const applyResult = this.applier.apply(suggestion);
165
+ if (!applyResult.success) {
166
+ // Rollback branch
167
+ this.git.checkout(this.originalBranch);
168
+ this.git.deleteBranch(branchName, true);
169
+ return {
170
+ success: false,
171
+ branchName,
172
+ filesChanged: [],
173
+ linesAdded: 0,
174
+ linesDeleted: 0,
175
+ error: `Failed to apply changes: ${applyResult.error}`,
176
+ warnings,
177
+ };
178
+ }
179
+ // Stage all changes
180
+ this.git.stageAll();
181
+ // Generate commit message
182
+ const commitMessage = generateCommitMessage(suggestion);
183
+ // Commit
184
+ const commitInfo = this.git.commit(commitMessage);
185
+ this.emit('pr:commit', { hash: commitInfo.hash, message: commitMessage });
186
+ // Push to remote
187
+ this.emit('pr:push', { branch: branchName, remote: this.config.remote });
188
+ this.git.push({ setUpstream: true });
189
+ // Generate PR body
190
+ const prTitle = options.title ?? this.templateGenerator.generateTitle(suggestion);
191
+ const prBody = options.body ?? this.templateGenerator.generate(suggestion, diffs);
192
+ // Create PR
193
+ const pr = await this.github.createPullRequest({
194
+ title: prTitle,
195
+ body: prBody,
196
+ head: branchName,
197
+ base: baseBranch,
198
+ draft: options.draft,
199
+ });
200
+ this.emit('pr:created', { pr });
201
+ // Add labels, assignees, reviewers
202
+ if (options.labels && options.labels.length > 0) {
203
+ await this.github.addLabels(pr.number, options.labels);
204
+ }
205
+ if (options.assignees && options.assignees.length > 0) {
206
+ await this.github.addAssignees(pr.number, options.assignees);
207
+ }
208
+ if (options.reviewers && options.reviewers.length > 0) {
209
+ await this.github.addReviewers(pr.number, options.reviewers);
210
+ }
211
+ // Calculate stats
212
+ const stats = this.git.getDiffStats(baseBranch);
213
+ const result = {
214
+ success: true,
215
+ pr,
216
+ branchName,
217
+ commitHash: commitInfo.hash,
218
+ filesChanged: applyResult.filesModified,
219
+ linesAdded: stats.additions,
220
+ linesDeleted: stats.deletions,
221
+ warnings: warnings.length > 0 ? warnings : undefined,
222
+ };
223
+ this.emit('pr:complete', { result });
224
+ // Switch back to original branch
225
+ this.git.checkout(this.originalBranch);
226
+ return result;
227
+ }
228
+ catch (error) {
229
+ const errorMessage = error instanceof Error ? error.message : String(error);
230
+ this.emit('pr:error', { error: error, stage: 'create' });
231
+ // Attempt cleanup
232
+ try {
233
+ if (this.git && this.originalBranch) {
234
+ const currentBranch = this.git.getCurrentBranch();
235
+ if (currentBranch !== this.originalBranch) {
236
+ this.git.checkout(this.originalBranch);
237
+ }
238
+ }
239
+ }
240
+ catch {
241
+ // Ignore cleanup errors
242
+ }
243
+ return {
244
+ success: false,
245
+ branchName: options.branchName ?? generateBranchName(suggestion),
246
+ filesChanged: [],
247
+ linesAdded: 0,
248
+ linesDeleted: 0,
249
+ error: errorMessage,
250
+ warnings: warnings.length > 0 ? warnings : undefined,
251
+ };
252
+ }
253
+ }
254
+ /**
255
+ * Preview PR creation without actually creating
256
+ * @see REQ-CG-PR-007
257
+ */
258
+ async preview(options) {
259
+ this.ensureInitialized();
260
+ const { suggestion } = options;
261
+ const branchName = options.branchName ?? generateBranchName(suggestion);
262
+ const baseBranch = options.baseBranch ?? this.git.getDefaultBranch();
263
+ // Generate preview
264
+ const diffs = this.applier.preview(suggestion);
265
+ const title = options.title ?? this.templateGenerator.generateTitle(suggestion);
266
+ const body = options.body ?? this.templateGenerator.generate(suggestion, diffs);
267
+ const commitMessage = generateCommitMessage(suggestion);
268
+ return {
269
+ branchName,
270
+ baseBranch,
271
+ title,
272
+ body,
273
+ diffs,
274
+ commitMessage,
275
+ };
276
+ }
277
+ /**
278
+ * Validate a suggestion can be applied
279
+ */
280
+ validate(suggestion) {
281
+ this.ensureInitialized();
282
+ const result = this.applier.canApply(suggestion);
283
+ return { valid: result.canApply, reason: result.reason };
284
+ }
285
+ // ============================================================================
286
+ // Private Helpers
287
+ // ============================================================================
288
+ /**
289
+ * Dry run implementation
290
+ */
291
+ dryRun(options, branchName) {
292
+ const { suggestion } = options;
293
+ const baseBranch = options.baseBranch ?? this.git.getDefaultBranch();
294
+ // Generate preview
295
+ const diffs = this.applier.preview(suggestion);
296
+ const title = options.title ?? this.templateGenerator.generateTitle(suggestion);
297
+ const body = options.body ?? this.templateGenerator.generate(suggestion, diffs);
298
+ const commitMessage = generateCommitMessage(suggestion);
299
+ // Calculate stats from diffs
300
+ let linesAdded = 0;
301
+ let linesDeleted = 0;
302
+ for (const diff of diffs) {
303
+ linesAdded += diff.additions;
304
+ linesDeleted += diff.deletions;
305
+ }
306
+ return {
307
+ success: true,
308
+ branchName,
309
+ filesChanged: diffs.map(d => d.filePath),
310
+ linesAdded,
311
+ linesDeleted,
312
+ preview: {
313
+ branchName,
314
+ baseBranch,
315
+ title,
316
+ body,
317
+ diffs,
318
+ commitMessage,
319
+ },
320
+ };
321
+ }
322
+ /**
323
+ * Ensure initialized before operations
324
+ */
325
+ ensureInitialized() {
326
+ if (!this.initialized) {
327
+ throw new Error('PRCreator not initialized. Call initialize() first.');
328
+ }
329
+ }
330
+ // ============================================================================
331
+ // Event Typing
332
+ // ============================================================================
333
+ /**
334
+ * Typed event emitter methods
335
+ */
336
+ emit(event, data) {
337
+ return super.emit(event, data);
338
+ }
339
+ on(event, listener) {
340
+ return super.on(event, listener);
341
+ }
342
+ once(event, listener) {
343
+ return super.once(event, listener);
344
+ }
345
+ }
346
+ /**
347
+ * Create a PRCreator instance
348
+ */
349
+ export function createPRCreator(repoPath, options) {
350
+ return new PRCreator({
351
+ repoPath,
352
+ ...options,
353
+ });
354
+ }
355
+ /**
356
+ * Quick PR creation helper
357
+ *
358
+ * One-shot function to create a PR from a suggestion.
359
+ *
360
+ * @example
361
+ * ```typescript
362
+ * const result = await createRefactoringPR(
363
+ * '/path/to/repo',
364
+ * suggestion,
365
+ * { labels: ['refactoring'] }
366
+ * );
367
+ * ```
368
+ */
369
+ export async function createRefactoringPR(repoPath, suggestion, options) {
370
+ const creator = createPRCreator(repoPath);
371
+ const initResult = await creator.initialize();
372
+ if (!initResult.success) {
373
+ return {
374
+ success: false,
375
+ branchName: generateBranchName(suggestion),
376
+ filesChanged: [],
377
+ linesAdded: 0,
378
+ linesDeleted: 0,
379
+ error: initResult.error,
380
+ };
381
+ }
382
+ return creator.create({
383
+ suggestion,
384
+ ...options,
385
+ });
386
+ }
387
+ //# sourceMappingURL=pr-creator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-creator.js","sourceRoot":"","sources":["../../src/pr/pr-creator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAQvD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAgBpB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,SAAU,SAAQ,YAAY;IACxB,MAAM,CAAkB;IACjC,GAAG,GAAyB,IAAI,CAAC;IACjC,MAAM,GAAyB,IAAI,CAAC;IACpC,OAAO,GAA8B,IAAI,CAAC;IAC1C,iBAAiB,CAAsB;IACvC,WAAW,GAAG,KAAK,CAAC;IACpB,cAAc,GAAkB,IAAI,CAAC;IAE7C;;;OAGG;IACH,YAAY,MAAuB;QACjC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,QAAQ;YAChB,aAAa,EAAE,IAAI;YACnB,GAAG,MAAM;SACV,CAAC;QACF,IAAI,CAAC,iBAAiB,GAAG,IAAI,mBAAmB,EAAE,CAAC;IACrD,CAAC;IAED,+EAA+E;IAC/E,iBAAiB;IACjB,+EAA+E;IAE/E;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,4BAA4B;YAC5B,IAAI,CAAC,GAAG,GAAG,IAAI,aAAa,CAAC;gBAC3B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;aAC3B,CAAC,CAAC;YAEH,sCAAsC;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,mDAAmD;iBAC3D,CAAC;YACJ,CAAC;YAED,4BAA4B;YAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC;gBAC9B,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;aAC/B,CAAC,CAAC;YAEH,2BAA2B;YAC3B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACpD,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;gBAC9B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,iCAAiC,UAAU,CAAC,KAAK,EAAE;iBAC3D,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAC;gBACpC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;aACzC,CAAC,CAAC;YAEH,8CAA8C;YAC9C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAElD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,+EAA+E;IAC/E,kBAAkB;IAClB,+EAA+E;IAE/E;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,OAAwB;QACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACvC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAEtC,uBAAuB;YACvB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAExE,gCAAgC;YAChC,IAAI,IAAI,CAAC,GAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;gBACtC,QAAQ,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;gBAC3E,IAAI,CAAC,GAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,8BAA8B;YAC9B,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAC1C,CAAC;YAED,wBAAwB;YACxB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,GAAI,CAAC,gBAAgB,EAAE,CAAC;YAEtE,iCAAiC;YACjC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,GAAI,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAE/C,4BAA4B;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzB,kBAAkB;gBAClB,IAAI,CAAC,GAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAe,CAAC,CAAC;gBACzC,IAAI,CAAC,GAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBACzC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,UAAU;oBACV,YAAY,EAAE,EAAE;oBAChB,UAAU,EAAE,CAAC;oBACb,YAAY,EAAE,CAAC;oBACf,KAAK,EAAE,4BAA4B,WAAW,CAAC,KAAK,EAAE;oBACtD,QAAQ;iBACT,CAAC;YACJ,CAAC;YAED,oBAAoB;YACpB,IAAI,CAAC,GAAI,CAAC,QAAQ,EAAE,CAAC;YAErB,0BAA0B;YAC1B,MAAM,aAAa,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAExD,SAAS;YACT,MAAM,UAAU,GAAG,IAAI,CAAC,GAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;YAE1E,iBAAiB;YACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAO,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,GAAI,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtC,mBAAmB;YACnB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAElF,YAAY;YACZ,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAO,CAAC,iBAAiB,CAAC;gBAC9C,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAEhC,mCAAmC;YACnC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,IAAI,CAAC,MAAO,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,CAAC,MAAO,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,CAAC,MAAO,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAChE,CAAC;YAED,kBAAkB;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAEjD,MAAM,MAAM,GAAmB;gBAC7B,OAAO,EAAE,IAAI;gBACb,EAAE;gBACF,UAAU;gBACV,UAAU,EAAE,UAAU,CAAC,IAAI;gBAC3B,YAAY,EAAE,WAAW,CAAC,aAAa;gBACvC,UAAU,EAAE,KAAK,CAAC,SAAS;gBAC3B,YAAY,EAAE,KAAK,CAAC,SAAS;gBAC7B,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;aACrD,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAErC,iCAAiC;YACjC,IAAI,CAAC,GAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAe,CAAC,CAAC;YAEzC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAElE,kBAAkB;YAClB,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;oBAClD,IAAI,aAAa,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;wBAC1C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC,UAAU,CAAC;gBAChE,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,KAAK,EAAE,YAAY;gBACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;aACrD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,GAAI,CAAC,gBAAgB,EAAE,CAAC;QAEtE,mBAAmB;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChF,MAAM,aAAa,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAExD,OAAO;YACL,UAAU;YACV,UAAU;YACV,KAAK;YACL,IAAI;YACJ,KAAK;YACL,aAAa;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,UAAiC;QACxC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC3D,CAAC;IAED,+EAA+E;IAC/E,kBAAkB;IAClB,+EAA+E;IAE/E;;OAEG;IACK,MAAM,CAAC,OAAwB,EAAE,UAAkB;QACzD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,GAAI,CAAC,gBAAgB,EAAE,CAAC;QAEtE,mBAAmB;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChF,MAAM,aAAa,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAExD,6BAA6B;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC;YAC7B,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC;QACjC,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU;YACV,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;YACxC,UAAU;YACV,YAAY;YACZ,OAAO,EAAE;gBACP,UAAU;gBACV,UAAU;gBACV,KAAK;gBACL,IAAI;gBACJ,KAAK;gBACL,aAAa;aACd;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,eAAe;IACf,+EAA+E;IAE/E;;OAEG;IACM,IAAI,CACX,KAAQ,EACR,IAAwB;QAExB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;IAEQ,EAAE,CACT,KAAQ,EACR,QAA4C;QAE5C,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAEQ,IAAI,CACX,KAAQ,EACR,QAA4C;QAE5C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAkC;IAClF,OAAO,IAAI,SAAS,CAAC;QACnB,QAAQ;QACR,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,UAAiC,EACjC,OAAkC;IAElC,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE9C,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,kBAAkB,CAAC,UAAU,CAAC;YAC1C,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;QACpB,UAAU;QACV,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,105 @@
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
+ import type { RefactoringSuggestion, FileDiff } from './types.js';
13
+ /**
14
+ * PR Template options
15
+ */
16
+ export interface PRTemplateOptions {
17
+ /** Include file diffs in PR body */
18
+ includeDiffs?: boolean;
19
+ /** Maximum diff lines to include (default: 50) */
20
+ maxDiffLines?: number;
21
+ /** Include checklist */
22
+ includeChecklist?: boolean;
23
+ /** Custom checklist items */
24
+ checklistItems?: string[];
25
+ /** Include related issues section */
26
+ includeRelatedIssues?: boolean;
27
+ /** Related issue numbers */
28
+ relatedIssues?: number[];
29
+ /** Custom footer text */
30
+ footer?: string;
31
+ }
32
+ /**
33
+ * PR Template Generator
34
+ *
35
+ * Generates well-formatted PR bodies from refactoring suggestions.
36
+ *
37
+ * @see DES-CG-PR-006
38
+ * @example
39
+ * ```typescript
40
+ * const generator = new PRTemplateGenerator();
41
+ * const body = generator.generate(suggestion, diffs);
42
+ * ```
43
+ */
44
+ export declare class PRTemplateGenerator {
45
+ private readonly options;
46
+ /**
47
+ * Create a new PRTemplateGenerator
48
+ * @param options - Template options
49
+ */
50
+ constructor(options?: PRTemplateOptions);
51
+ /**
52
+ * Generate PR body
53
+ * @see REQ-CG-PR-006
54
+ */
55
+ generate(suggestion: RefactoringSuggestion, diffs?: FileDiff[]): string;
56
+ /**
57
+ * Generate PR title
58
+ */
59
+ generateTitle(suggestion: RefactoringSuggestion): string;
60
+ /**
61
+ * Generate header section
62
+ */
63
+ private generateHeader;
64
+ /**
65
+ * Generate summary section
66
+ */
67
+ private generateSummary;
68
+ /**
69
+ * Generate reason section
70
+ */
71
+ private generateChangesSection;
72
+ /**
73
+ * Generate diffs section
74
+ */
75
+ private generateDiffsSection;
76
+ /**
77
+ * Generate impact analysis section
78
+ */
79
+ private generateImpactSection;
80
+ /**
81
+ * Generate checklist section
82
+ */
83
+ private generateChecklist;
84
+ /**
85
+ * Generate related issues section
86
+ */
87
+ private generateRelatedIssues;
88
+ /**
89
+ * Generate footer section
90
+ */
91
+ private generateFooter;
92
+ }
93
+ /**
94
+ * Create a PR template generator
95
+ */
96
+ export declare function createPRTemplateGenerator(options?: PRTemplateOptions): PRTemplateGenerator;
97
+ /**
98
+ * Generate a simple PR body without advanced options
99
+ */
100
+ export declare function generateSimplePRBody(suggestion: RefactoringSuggestion): string;
101
+ /**
102
+ * Generate PR title from suggestion
103
+ */
104
+ export declare function generatePRTitle(suggestion: RefactoringSuggestion): string;
105
+ //# sourceMappingURL=pr-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-template.d.ts","sourceRoot":"","sources":["../../src/pr/pr-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,QAAQ,EAIT,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,qCAAqC;IACrC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4BD;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAE5C;;;OAGG;gBACS,OAAO,GAAE,iBAAsB;IAY3C;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,qBAAqB,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM;IAoCvE;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,qBAAqB,GAAG,MAAM;IASxD;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyB9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+B5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAsB7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0BzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;OAEG;IACH,OAAO,CAAC,cAAc;CAcvB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,mBAAmB,CAE1F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,qBAAqB,GAAG,MAAM,CAG9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,qBAAqB,GAAG,MAAM,CAGzE"}