geeto 0.6.6 → 0.9.0

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.
Files changed (198) hide show
  1. package/README.md +23 -9
  2. package/lib/api/copilot-adapter.d.ts +14 -5
  3. package/lib/api/copilot-adapter.d.ts.map +1 -1
  4. package/lib/api/copilot-adapter.js +15 -21
  5. package/lib/api/copilot-adapter.js.map +1 -1
  6. package/lib/api/copilot-sdk.d.ts +3 -16
  7. package/lib/api/copilot-sdk.d.ts.map +1 -1
  8. package/lib/api/copilot-sdk.js +166 -456
  9. package/lib/api/copilot-sdk.js.map +1 -1
  10. package/lib/api/copilot.d.ts +3 -4
  11. package/lib/api/copilot.d.ts.map +1 -1
  12. package/lib/api/copilot.js +28 -28
  13. package/lib/api/copilot.js.map +1 -1
  14. package/lib/api/gemini-sdk.d.ts.map +1 -1
  15. package/lib/api/gemini-sdk.js +11 -77
  16. package/lib/api/gemini-sdk.js.map +1 -1
  17. package/lib/api/gemini.d.ts +2 -2
  18. package/lib/api/gemini.d.ts.map +1 -1
  19. package/lib/api/gemini.js +24 -19
  20. package/lib/api/gemini.js.map +1 -1
  21. package/lib/api/gitlab.d.ts +80 -0
  22. package/lib/api/gitlab.d.ts.map +1 -0
  23. package/lib/api/gitlab.js +192 -0
  24. package/lib/api/gitlab.js.map +1 -0
  25. package/lib/api/openrouter-sdk.d.ts.map +1 -1
  26. package/lib/api/openrouter-sdk.js +11 -76
  27. package/lib/api/openrouter-sdk.js.map +1 -1
  28. package/lib/api/openrouter.d.ts.map +1 -1
  29. package/lib/api/openrouter.js +2 -16
  30. package/lib/api/openrouter.js.map +1 -1
  31. package/lib/api/platform.d.ts +78 -0
  32. package/lib/api/platform.d.ts.map +1 -0
  33. package/lib/api/platform.js +218 -0
  34. package/lib/api/platform.js.map +1 -0
  35. package/lib/cli/input.d.ts +2 -2
  36. package/lib/cli/input.d.ts.map +1 -1
  37. package/lib/cli/input.js +23 -27
  38. package/lib/cli/input.js.map +1 -1
  39. package/lib/cli/menu.d.ts +1 -1
  40. package/lib/cli/menu.d.ts.map +1 -1
  41. package/lib/cli/menu.js +123 -100
  42. package/lib/cli/menu.js.map +1 -1
  43. package/lib/core/copilot-setup.d.ts +8 -7
  44. package/lib/core/copilot-setup.d.ts.map +1 -1
  45. package/lib/core/copilot-setup.js +59 -230
  46. package/lib/core/copilot-setup.js.map +1 -1
  47. package/lib/core/gemini-setup.js +7 -7
  48. package/lib/core/gemini-setup.js.map +1 -1
  49. package/lib/core/gitlab-setup.d.ts +5 -0
  50. package/lib/core/gitlab-setup.d.ts.map +1 -0
  51. package/lib/core/gitlab-setup.js +85 -0
  52. package/lib/core/gitlab-setup.js.map +1 -0
  53. package/lib/core/openrouter-setup.d.ts.map +1 -1
  54. package/lib/core/openrouter-setup.js +17 -0
  55. package/lib/core/openrouter-setup.js.map +1 -1
  56. package/lib/index.js +501 -704
  57. package/lib/index.js.map +1 -1
  58. package/lib/types/index.d.ts +10 -6
  59. package/lib/types/index.d.ts.map +1 -1
  60. package/lib/utils/ai-provider-helpers.d.ts +5 -0
  61. package/lib/utils/ai-provider-helpers.d.ts.map +1 -0
  62. package/lib/utils/ai-provider-helpers.js +23 -0
  63. package/lib/utils/ai-provider-helpers.js.map +1 -0
  64. package/lib/utils/ai-text.d.ts +23 -0
  65. package/lib/utils/ai-text.d.ts.map +1 -0
  66. package/lib/utils/ai-text.js +57 -0
  67. package/lib/utils/ai-text.js.map +1 -0
  68. package/lib/utils/ai-workflow.d.ts +18 -0
  69. package/lib/utils/ai-workflow.d.ts.map +1 -0
  70. package/lib/utils/ai-workflow.js +66 -0
  71. package/lib/utils/ai-workflow.js.map +1 -0
  72. package/lib/utils/branch-naming.d.ts.map +1 -1
  73. package/lib/utils/branch-naming.js +1 -3
  74. package/lib/utils/branch-naming.js.map +1 -1
  75. package/lib/utils/config.d.ts +13 -1
  76. package/lib/utils/config.d.ts.map +1 -1
  77. package/lib/utils/config.js +38 -1
  78. package/lib/utils/config.js.map +1 -1
  79. package/lib/utils/display.d.ts.map +1 -1
  80. package/lib/utils/display.js +4 -3
  81. package/lib/utils/display.js.map +1 -1
  82. package/lib/utils/git-ai.js +13 -13
  83. package/lib/utils/git-ai.js.map +1 -1
  84. package/lib/utils/git-errors.d.ts.map +1 -1
  85. package/lib/utils/git-errors.js +2 -6
  86. package/lib/utils/git-errors.js.map +1 -1
  87. package/lib/utils/git.d.ts.map +1 -1
  88. package/lib/utils/git.js +5 -0
  89. package/lib/utils/git.js.map +1 -1
  90. package/lib/utils/github-helpers.d.ts +33 -0
  91. package/lib/utils/github-helpers.d.ts.map +1 -0
  92. package/lib/utils/github-helpers.js +101 -0
  93. package/lib/utils/github-helpers.js.map +1 -0
  94. package/lib/utils/prompt-loader.d.ts +9 -0
  95. package/lib/utils/prompt-loader.d.ts.map +1 -0
  96. package/lib/utils/prompt-loader.js +42 -0
  97. package/lib/utils/prompt-loader.js.map +1 -0
  98. package/lib/utils/prompts-embedded.d.ts +2 -0
  99. package/lib/utils/prompts-embedded.d.ts.map +1 -0
  100. package/lib/utils/prompts-embedded.js +255 -0
  101. package/lib/utils/prompts-embedded.js.map +1 -0
  102. package/lib/utils/scramble.d.ts +9 -86
  103. package/lib/utils/scramble.d.ts.map +1 -1
  104. package/lib/utils/scramble.js +27 -279
  105. package/lib/utils/scramble.js.map +1 -1
  106. package/lib/version.d.ts +1 -1
  107. package/lib/version.js +1 -1
  108. package/lib/workflows/alias.d.ts.map +1 -1
  109. package/lib/workflows/alias.js +1 -0
  110. package/lib/workflows/alias.js.map +1 -1
  111. package/lib/workflows/amend.d.ts.map +1 -1
  112. package/lib/workflows/amend.js +1 -5
  113. package/lib/workflows/amend.js.map +1 -1
  114. package/lib/workflows/branch-helpers.d.ts.map +1 -1
  115. package/lib/workflows/branch-helpers.js +0 -1
  116. package/lib/workflows/branch-helpers.js.map +1 -1
  117. package/lib/workflows/commit.d.ts.map +1 -1
  118. package/lib/workflows/commit.js +160 -187
  119. package/lib/workflows/commit.js.map +1 -1
  120. package/lib/workflows/doctor.d.ts +7 -0
  121. package/lib/workflows/doctor.d.ts.map +1 -0
  122. package/lib/workflows/doctor.js +284 -0
  123. package/lib/workflows/doctor.js.map +1 -0
  124. package/lib/workflows/issue.d.ts +1 -1
  125. package/lib/workflows/issue.d.ts.map +1 -1
  126. package/lib/workflows/issue.js +28 -115
  127. package/lib/workflows/issue.js.map +1 -1
  128. package/lib/workflows/main-helpers.d.ts +34 -0
  129. package/lib/workflows/main-helpers.d.ts.map +1 -0
  130. package/lib/workflows/main-helpers.js +346 -0
  131. package/lib/workflows/main-helpers.js.map +1 -0
  132. package/lib/workflows/main-steps.d.ts.map +1 -1
  133. package/lib/workflows/main-steps.js +9 -134
  134. package/lib/workflows/main-steps.js.map +1 -1
  135. package/lib/workflows/main.d.ts +2 -6
  136. package/lib/workflows/main.d.ts.map +1 -1
  137. package/lib/workflows/main.js +44 -381
  138. package/lib/workflows/main.js.map +1 -1
  139. package/lib/workflows/pr.d.ts +2 -2
  140. package/lib/workflows/pr.d.ts.map +1 -1
  141. package/lib/workflows/pr.js +49 -137
  142. package/lib/workflows/pr.js.map +1 -1
  143. package/lib/workflows/prune.d.ts.map +1 -1
  144. package/lib/workflows/prune.js +2 -10
  145. package/lib/workflows/prune.js.map +1 -1
  146. package/lib/workflows/pull.d.ts.map +1 -1
  147. package/lib/workflows/pull.js +2 -24
  148. package/lib/workflows/pull.js.map +1 -1
  149. package/lib/workflows/release-merge.d.ts +12 -0
  150. package/lib/workflows/release-merge.d.ts.map +1 -0
  151. package/lib/workflows/release-merge.js +569 -0
  152. package/lib/workflows/release-merge.js.map +1 -0
  153. package/lib/workflows/release-notes.d.ts +13 -0
  154. package/lib/workflows/release-notes.d.ts.map +1 -0
  155. package/lib/workflows/release-notes.js +141 -0
  156. package/lib/workflows/release-notes.js.map +1 -0
  157. package/lib/workflows/release-recover.d.ts +5 -0
  158. package/lib/workflows/release-recover.d.ts.map +1 -0
  159. package/lib/workflows/release-recover.js +137 -0
  160. package/lib/workflows/release-recover.js.map +1 -0
  161. package/lib/workflows/release-sync.d.ts +7 -0
  162. package/lib/workflows/release-sync.d.ts.map +1 -0
  163. package/lib/workflows/release-sync.js +321 -0
  164. package/lib/workflows/release-sync.js.map +1 -0
  165. package/lib/workflows/release-utils.d.ts +36 -0
  166. package/lib/workflows/release-utils.d.ts.map +1 -0
  167. package/lib/workflows/release-utils.js +150 -0
  168. package/lib/workflows/release-utils.js.map +1 -0
  169. package/lib/workflows/release.d.ts.map +1 -1
  170. package/lib/workflows/release.js +92 -719
  171. package/lib/workflows/release.js.map +1 -1
  172. package/lib/workflows/repo-settings.d.ts +2 -2
  173. package/lib/workflows/repo-settings.d.ts.map +1 -1
  174. package/lib/workflows/repo-settings.js +33 -24
  175. package/lib/workflows/repo-settings.js.map +1 -1
  176. package/lib/workflows/reword.d.ts.map +1 -1
  177. package/lib/workflows/reword.js +154 -151
  178. package/lib/workflows/reword.js.map +1 -1
  179. package/lib/workflows/security-gate.d.ts.map +1 -1
  180. package/lib/workflows/security-gate.js +15 -75
  181. package/lib/workflows/security-gate.js.map +1 -1
  182. package/lib/workflows/settings.d.ts +2 -1
  183. package/lib/workflows/settings.d.ts.map +1 -1
  184. package/lib/workflows/settings.js +289 -19
  185. package/lib/workflows/settings.js.map +1 -1
  186. package/lib/workflows/trello-menu.d.ts +2 -5
  187. package/lib/workflows/trello-menu.d.ts.map +1 -1
  188. package/lib/workflows/trello-menu.js +67 -228
  189. package/lib/workflows/trello-menu.js.map +1 -1
  190. package/package.json +3 -6
  191. package/prompts/branch-name-prompt.md +4 -0
  192. package/prompts/commit-message-prompt.md +12 -0
  193. package/prompts/issue-prompt.md +19 -0
  194. package/prompts/issue-review.with-context.prompt.yml +77 -0
  195. package/prompts/pr-prompt.md +14 -0
  196. package/prompts/release-notes-prompt.md +35 -0
  197. package/prompts/repo-description-prompt.md +1 -0
  198. package/prompts/security-gate-prompt.md +80 -0
@@ -0,0 +1,569 @@
1
+ /**
2
+ * Merge Releases workflow — consolidate multiple GitHub/GitLab releases into one.
3
+ *
4
+ * Flow:
5
+ * 1. Fetch all releases (with body/notes) via platform API
6
+ * 2. User multiSelects which releases to merge
7
+ * 3. Choose merge mode: raw concat or AI rewrite
8
+ * 4. Preview combined release notes
9
+ * 5. Update the newest selected release, delete older ones
10
+ */
11
+ import { unlinkSync, writeFileSync } from 'node:fs';
12
+ import { tmpdir } from 'node:os';
13
+ import path from 'node:path';
14
+ import { askQuestion, confirm, editInline } from '../cli/input.js';
15
+ import { select } from '../cli/menu.js';
16
+ import { colors } from '../utils/colors.js';
17
+ import { BOX_W } from '../utils/display.js';
18
+ import { execAsync } from '../utils/exec.js';
19
+ import { chooseModelForProvider, generateTextWithProvider, getAIProviderShortName, getModelValue, } from '../utils/git-ai.js';
20
+ import { detectPlatformFromRemote, getPlatformCLI } from '../utils/github-helpers.js';
21
+ import { log } from '../utils/logging.js';
22
+ import { ScrambleProgress } from '../utils/scramble.js';
23
+ import { loadState } from '../utils/state.js';
24
+ // ─── Helpers ───
25
+ /**
26
+ * Fetch all releases with body content from the platform API.
27
+ * Uses `gh api` since `gh release list` doesn't include body field.
28
+ */
29
+ const fetchReleasesWithBody = async (cli) => {
30
+ try {
31
+ if (cli === 'gh') {
32
+ // GitHub: use REST API which includes body
33
+ const result = await execAsync(`gh api repos/{owner}/{repo}/releases --paginate --jq '[.[] | {tagName: .tag_name, name: .name, body: .body, publishedAt: .published_at, isPrerelease: .prerelease, isDraft: .draft}]'`, true);
34
+ const data = JSON.parse(result.stdout.trim());
35
+ return Array.isArray(data) ? data : [];
36
+ }
37
+ // GitLab: glab release list supports body via --json
38
+ const result = await execAsync(`${cli} release list --per-page 100 --json tag_name,name,description,released_at`, true);
39
+ const raw = JSON.parse(result.stdout.trim());
40
+ return (raw ?? []).map((r) => ({
41
+ tagName: r.tag_name,
42
+ name: r.name ?? r.tag_name,
43
+ body: r.description ?? '',
44
+ publishedAt: r.released_at ?? '',
45
+ isPrerelease: false,
46
+ isDraft: false,
47
+ }));
48
+ }
49
+ catch {
50
+ return [];
51
+ }
52
+ };
53
+ /**
54
+ * Parse release notes body into categorized bullet items.
55
+ * Handles standard "### What's New?" / "#### Section" format.
56
+ */
57
+ const parseNotesIntoSections = (body) => {
58
+ const sections = {};
59
+ let currentSection = 'Other Improvements';
60
+ for (const line of body.split('\n')) {
61
+ const trimmed = line.trim();
62
+ // Skip top-level "### What's New?" heading
63
+ if (/^###\s+What['']s New/i.test(trimmed))
64
+ continue;
65
+ // Detect subsection heading (#### Breaking Changes, #### New Features, etc.)
66
+ const sectionMatch = /^####\s+(.+)/.exec(trimmed);
67
+ if (sectionMatch?.[1]) {
68
+ currentSection = sectionMatch[1].trim();
69
+ continue;
70
+ }
71
+ // Detect bullet items
72
+ if (/^[-*]\s/.test(trimmed)) {
73
+ const arr = sections[currentSection] ?? [];
74
+ sections[currentSection] = arr;
75
+ arr.push(trimmed);
76
+ }
77
+ }
78
+ return sections;
79
+ };
80
+ /**
81
+ * Merge multiple release bodies into one unified release note.
82
+ * Combines same-named sections and deduplicates items.
83
+ */
84
+ const rawMergeNotes = (releases) => {
85
+ const merged = {};
86
+ for (const r of releases) {
87
+ const body = r.body?.trim();
88
+ if (!body)
89
+ continue;
90
+ const sections = parseNotesIntoSections(body);
91
+ for (const [section, items] of Object.entries(sections)) {
92
+ merged[section] ??= [];
93
+ for (const item of items) {
94
+ // Deduplicate by normalized text
95
+ const norm = item
96
+ .replace(/^[-*]\s+/, '')
97
+ .toLowerCase()
98
+ .trim();
99
+ const exists = merged[section].some((existing) => existing
100
+ .replace(/^[-*]\s+/, '')
101
+ .toLowerCase()
102
+ .trim() === norm);
103
+ if (!exists)
104
+ merged[section].push(item);
105
+ }
106
+ }
107
+ }
108
+ // Build output in standard order
109
+ const sectionOrder = ['Breaking Changes', 'New Features', 'Bug Fixes', 'Other Improvements'];
110
+ const lines = ["### What's New?", ''];
111
+ // Known sections first (in order), then any remaining
112
+ const rendered = new Set();
113
+ for (const name of sectionOrder) {
114
+ const items = merged[name];
115
+ if (!items || items.length === 0)
116
+ continue;
117
+ lines.push(`#### ${name}`, '');
118
+ for (const item of items)
119
+ lines.push(item);
120
+ lines.push('');
121
+ rendered.add(name);
122
+ }
123
+ // Any extra sections not in the standard order
124
+ for (const [name, items] of Object.entries(merged)) {
125
+ if (rendered.has(name) || items.length === 0)
126
+ continue;
127
+ lines.push(`#### ${name}`, '');
128
+ for (const item of items)
129
+ lines.push(item);
130
+ lines.push('');
131
+ }
132
+ return lines.join('\n').trim();
133
+ };
134
+ /**
135
+ * Build AI prompt for merging release notes.
136
+ */
137
+ const buildMergePrompt = (releases, language) => {
138
+ const langLabel = language === 'id' ? 'Indonesian (Bahasa Indonesia)' : 'English';
139
+ const releaseBlocks = releases
140
+ .map((r) => {
141
+ const body = r.body?.trim() || '(no release notes)';
142
+ return `### ${r.tagName}\n${body}`;
143
+ })
144
+ .join('\n\n');
145
+ return `You are a release notes writer. You are given multiple release notes from prerelease/beta/rc versions that need to be merged into a single, clean release note in ${langLabel}.
146
+
147
+ Rules:
148
+ - Combine all changes into one unified release note
149
+ - Remove duplicate entries (same change mentioned in multiple releases)
150
+ - Group changes into subsections: "#### New Features", "#### Bug Fixes", "#### Other Improvements"
151
+ - Only include subsections that have items (skip empty ones)
152
+ - Use simple, non-technical language that end users can understand
153
+ - Each item should be a bullet point starting with "-"
154
+ - Keep it concise but informative
155
+ - If there are breaking changes, add a "#### Breaking Changes" subsection at the top
156
+ - Start with "### What's New?" as the top-level section
157
+ - Do NOT include version numbers, dates, or the original release tags in the output
158
+ - Output ONLY the merged release notes content
159
+
160
+ Here are the release notes to merge:
161
+
162
+ ${releaseBlocks}`;
163
+ };
164
+ /**
165
+ * Preview release notes in a formatted box.
166
+ */
167
+ const previewNotes = (notes) => {
168
+ console.log(`${colors.cyan}┌${'─'.repeat(BOX_W)}┐${colors.reset}`);
169
+ console.log(`${colors.cyan}│${colors.reset} ${colors.bright}Merged Release Notes Preview${colors.reset}`);
170
+ console.log(`${colors.cyan}├${'─'.repeat(BOX_W)}┤${colors.reset}`);
171
+ for (const line of notes.split('\n')) {
172
+ console.log(`${colors.cyan}│${colors.reset} ${line}`);
173
+ }
174
+ console.log(`${colors.cyan}└${'─'.repeat(BOX_W)}┘${colors.reset}`);
175
+ };
176
+ /**
177
+ * Update a GitHub/GitLab release's body (notes).
178
+ */
179
+ const updateReleaseNotes = async (cli, tagName, notes) => {
180
+ const tmpFile = path.join(tmpdir(), `geeto-merge-${Date.now()}.md`);
181
+ try {
182
+ writeFileSync(tmpFile, notes, 'utf8');
183
+ await execAsync(`${cli} release edit ${tagName} --notes-file "${tmpFile}"`, true);
184
+ return true;
185
+ }
186
+ catch (error) {
187
+ const stderr = error.stderr?.trim();
188
+ log.error(`Failed to update release ${tagName}`);
189
+ if (stderr)
190
+ log.error(` ${stderr.split('\n')[0]}`);
191
+ return false;
192
+ }
193
+ finally {
194
+ try {
195
+ unlinkSync(tmpFile);
196
+ }
197
+ catch {
198
+ /* ignore */
199
+ }
200
+ }
201
+ };
202
+ /**
203
+ * Create a new GitHub/GitLab release with notes.
204
+ */
205
+ const createRelease = async (cli, tagName, notes) => {
206
+ const tmpFile = path.join(tmpdir(), `geeto-merge-${Date.now()}.md`);
207
+ try {
208
+ writeFileSync(tmpFile, notes, 'utf8');
209
+ await execAsync(`${cli} release create ${tagName} --title "${tagName}" --notes-file "${tmpFile}"`, true);
210
+ return true;
211
+ }
212
+ catch (error) {
213
+ const stderr = error.stderr?.trim();
214
+ log.error(`Failed to create release ${tagName}`);
215
+ if (stderr)
216
+ log.error(` ${stderr.split('\n')[0]}`);
217
+ return false;
218
+ }
219
+ finally {
220
+ try {
221
+ unlinkSync(tmpFile);
222
+ }
223
+ catch {
224
+ /* ignore */
225
+ }
226
+ }
227
+ };
228
+ /**
229
+ * Delete a GitHub/GitLab release (keeps the git tag).
230
+ */
231
+ const deleteRelease = async (cli, tagName) => {
232
+ try {
233
+ await execAsync(`${cli} release delete ${tagName} --yes`, true);
234
+ return true;
235
+ }
236
+ catch (error) {
237
+ const stderr = error.stderr?.trim();
238
+ log.error(`Failed to delete release ${tagName}`);
239
+ if (stderr)
240
+ log.error(` ${stderr.split('\n')[0]}`);
241
+ return false;
242
+ }
243
+ };
244
+ // ─── AI rewrite flow ───
245
+ const aiRewriteMergedNotes = async (releases, language) => {
246
+ const savedState = loadState();
247
+ let aiProvider = 'copilot';
248
+ let copilotModel;
249
+ let openrouterModel;
250
+ let geminiModel;
251
+ // Use saved provider/model if available
252
+ if (savedState?.aiProvider &&
253
+ savedState.aiProvider !== 'manual' &&
254
+ (savedState.copilotModel || savedState.openrouterModel || savedState.geminiModel)) {
255
+ aiProvider = savedState.aiProvider;
256
+ copilotModel = savedState.copilotModel;
257
+ openrouterModel = savedState.openrouterModel;
258
+ geminiModel = savedState.geminiModel;
259
+ }
260
+ else {
261
+ let providerChosen = false;
262
+ while (!providerChosen) {
263
+ aiProvider = (await select('Choose AI Provider:', [
264
+ { label: 'GitHub (Recommended)', value: 'copilot' },
265
+ { label: 'Gemini', value: 'gemini' },
266
+ { label: 'OpenRouter', value: 'openrouter' },
267
+ ]));
268
+ const chosen = await chooseModelForProvider(aiProvider, undefined, 'Back to AI provider menu');
269
+ if (!chosen || chosen === 'back')
270
+ continue;
271
+ switch (aiProvider) {
272
+ case 'gemini': {
273
+ geminiModel = chosen;
274
+ break;
275
+ }
276
+ case 'copilot': {
277
+ copilotModel = chosen;
278
+ break;
279
+ }
280
+ case 'openrouter': {
281
+ openrouterModel = chosen;
282
+ break;
283
+ }
284
+ }
285
+ providerChosen = true;
286
+ }
287
+ }
288
+ // Generate/review loop
289
+ let correction;
290
+ let finalNotes = null;
291
+ while (true) {
292
+ const prompt = buildMergePrompt(releases, language);
293
+ const fullPrompt = correction ? `${prompt}\n\nUser feedback: ${correction}` : prompt;
294
+ const spinner = new ScrambleProgress();
295
+ const modelDisplay = getModelValue(copilotModel ?? openrouterModel ?? geminiModel ?? '');
296
+ spinner.start([
297
+ `Merging release notes with ${getAIProviderShortName(aiProvider)}${modelDisplay ? ` (${modelDisplay})` : ''}`,
298
+ ]);
299
+ const result = await generateTextWithProvider(aiProvider, fullPrompt, copilotModel, openrouterModel, geminiModel);
300
+ spinner.succeed('Merged release notes generated');
301
+ console.log('');
302
+ if (!result) {
303
+ log.warn('AI returned no result.');
304
+ return null;
305
+ }
306
+ finalNotes = result;
307
+ previewNotes(finalNotes);
308
+ console.log('');
309
+ const action = await select('Accept these merged release notes?', [
310
+ { label: 'Yes, use it', value: 'accept' },
311
+ { label: 'Regenerate', value: 'regenerate' },
312
+ { label: 'Edit inline', value: 'edit' },
313
+ { label: 'Correct AI (give feedback)', value: 'correct' },
314
+ { label: 'Change model', value: 'change-model' },
315
+ { label: 'Change AI provider', value: 'change-provider' },
316
+ { label: 'Use raw merge instead', value: 'raw' },
317
+ ]);
318
+ switch (action) {
319
+ case 'accept': {
320
+ return finalNotes;
321
+ }
322
+ case 'regenerate': {
323
+ correction = undefined;
324
+ continue;
325
+ }
326
+ case 'edit': {
327
+ const edited = await editInline(finalNotes, 'Merged Release Notes', '.md');
328
+ return edited;
329
+ }
330
+ case 'correct': {
331
+ if (process.stdin.isTTY)
332
+ process.stdin.setRawMode(false);
333
+ const feedback = askQuestion('Feedback for AI: ').trim();
334
+ if (feedback)
335
+ correction = feedback;
336
+ continue;
337
+ }
338
+ case 'change-model': {
339
+ const newModel = await chooseModelForProvider(aiProvider, undefined, 'Back');
340
+ if (newModel && newModel !== 'back') {
341
+ switch (aiProvider) {
342
+ case 'gemini': {
343
+ geminiModel = newModel;
344
+ break;
345
+ }
346
+ case 'copilot': {
347
+ copilotModel = newModel;
348
+ break;
349
+ }
350
+ case 'openrouter': {
351
+ openrouterModel = newModel;
352
+ break;
353
+ }
354
+ }
355
+ }
356
+ correction = undefined;
357
+ continue;
358
+ }
359
+ case 'change-provider': {
360
+ const prov = (await select('Choose AI provider:', [
361
+ { label: 'Copilot', value: 'copilot' },
362
+ { label: 'Gemini', value: 'gemini' },
363
+ { label: 'OpenRouter', value: 'openrouter' },
364
+ ]));
365
+ aiProvider = prov;
366
+ copilotModel = undefined;
367
+ openrouterModel = undefined;
368
+ geminiModel = undefined;
369
+ const provModel = await chooseModelForProvider(aiProvider, undefined, 'Back');
370
+ if (provModel && provModel !== 'back') {
371
+ switch (aiProvider) {
372
+ case 'gemini': {
373
+ geminiModel = provModel;
374
+ break;
375
+ }
376
+ case 'copilot': {
377
+ copilotModel = provModel;
378
+ break;
379
+ }
380
+ case 'openrouter': {
381
+ openrouterModel = provModel;
382
+ break;
383
+ }
384
+ }
385
+ }
386
+ correction = undefined;
387
+ continue;
388
+ }
389
+ case 'raw': {
390
+ return null;
391
+ } // caller falls back to raw merge
392
+ }
393
+ }
394
+ };
395
+ /**
396
+ * Extract base version from a tag (strip prerelease suffix).
397
+ * e.g. "v0.7.0-alpha.3" → "0.7.0", "v1.2.0" → "1.2.0"
398
+ */
399
+ const getBaseVersion = (tag) => {
400
+ const cleaned = tag.replace(/^v/, '');
401
+ const dashIdx = cleaned.indexOf('-');
402
+ return dashIdx === -1 ? cleaned : cleaned.slice(0, dashIdx);
403
+ };
404
+ /**
405
+ * Check if a tag is a prerelease (has alpha, beta, rc, etc.).
406
+ */
407
+ const isPrerelease = (tag) => {
408
+ return /-(alpha|beta|rc|pre|dev|canary|next)\b/i.test(tag);
409
+ };
410
+ /**
411
+ * Group releases by base version, separating prereleases from stable.
412
+ */
413
+ const groupPrereleases = (releases) => {
414
+ const groups = new Map();
415
+ for (const r of releases) {
416
+ const base = getBaseVersion(r.tagName);
417
+ let group = groups.get(base);
418
+ if (!group) {
419
+ group = { baseVersion: base, releases: [], stableRelease: null };
420
+ groups.set(base, group);
421
+ }
422
+ if (isPrerelease(r.tagName)) {
423
+ group.releases.push(r);
424
+ }
425
+ else {
426
+ group.stableRelease = r;
427
+ }
428
+ }
429
+ // Only return groups that have prereleases
430
+ return [...groups.values()].filter((g) => g.releases.length > 0);
431
+ };
432
+ // ─── Main handler ───
433
+ export const handleMergeReleases = async () => {
434
+ const platform = detectPlatformFromRemote();
435
+ const cli = platform ? getPlatformCLI(platform) : 'gh';
436
+ const platformName = platform === 'gitlab' ? 'GitLab' : 'GitHub';
437
+ // Check CLI availability
438
+ try {
439
+ await execAsync(`${cli} --version`, true);
440
+ }
441
+ catch {
442
+ log.error(`${platformName} CLI (${cli}) is not installed.${cli === 'gh' ? ' Install it: https://cli.github.com' : ' Install it: https://gitlab.com/gitlab-org/cli'}`);
443
+ return;
444
+ }
445
+ // Fetch releases
446
+ console.log('');
447
+ const spinner = new ScrambleProgress();
448
+ spinner.start([`Fetching ${platformName} releases`]);
449
+ const releases = await fetchReleasesWithBody(cli);
450
+ spinner.succeed(`Found ${releases.length} ${platformName} releases`);
451
+ // Group prereleases by base version
452
+ const groups = groupPrereleases(releases);
453
+ if (groups.length === 0) {
454
+ console.log('');
455
+ log.info('No prerelease groups found to merge.');
456
+ return;
457
+ }
458
+ // Show prerelease groups for selection
459
+ console.log('');
460
+ const { multiSelect } = await import('../cli/menu.js');
461
+ const groupChoices = groups.map((g) => {
462
+ const tags = g.releases.map((r) => r.tagName.replace(/^v/, '')).join(', ');
463
+ const targetLabel = g.stableRelease
464
+ ? `→ ${g.stableRelease.tagName}`
465
+ : `→ v${g.baseVersion} (newest prerelease)`;
466
+ return {
467
+ label: `v${g.baseVersion} — ${g.releases.length} prerelease(s) [${tags}] ${targetLabel}`,
468
+ value: g.baseVersion,
469
+ };
470
+ });
471
+ const selectedGroups = await multiSelect('Select version group(s) to merge prereleases:', groupChoices);
472
+ if (selectedGroups.length === 0) {
473
+ log.info('No groups selected.');
474
+ return;
475
+ }
476
+ // Process each selected group
477
+ for (const baseVer of selectedGroups) {
478
+ const group = groups.find((g) => g.baseVersion === baseVer);
479
+ if (!group)
480
+ continue;
481
+ const stableTag = `v${baseVer}`;
482
+ const hasStableRelease = Boolean(group.stableRelease);
483
+ // All prereleases to merge and delete
484
+ const allPrereleases = group.releases;
485
+ const allReleases = hasStableRelease
486
+ ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
487
+ [group.stableRelease, ...allPrereleases]
488
+ : allPrereleases;
489
+ console.log('');
490
+ if (hasStableRelease) {
491
+ log.step(`${colors.bright}v${baseVer}${colors.reset} — merging ${allPrereleases.length} prerelease(s) into ${colors.bright}${stableTag}${colors.reset}`);
492
+ }
493
+ else {
494
+ log.step(`${colors.bright}v${baseVer}${colors.reset} — merging ${allPrereleases.length} prerelease(s) → creating ${colors.bright}${stableTag}${colors.reset}`);
495
+ }
496
+ for (const r of allPrereleases) {
497
+ log.info(` ${r.tagName}`);
498
+ }
499
+ // Choose merge mode (once per group)
500
+ console.log('');
501
+ const mergeMode = await select('How to merge the release notes?', [
502
+ { label: 'Raw merge (combine sections, deduplicate)', value: 'raw' },
503
+ { label: 'AI rewrite (unified clean notes)', value: 'ai' },
504
+ ]);
505
+ let mergedNotes;
506
+ if (mergeMode === 'ai') {
507
+ const language = (await select('Release notes language:', [
508
+ { label: 'English', value: 'en' },
509
+ { label: 'Indonesian (Bahasa Indonesia)', value: 'id' },
510
+ ]));
511
+ const aiResult = await aiRewriteMergedNotes(allReleases, language);
512
+ if (aiResult) {
513
+ mergedNotes = aiResult;
514
+ }
515
+ else {
516
+ log.info('Falling back to raw merge.');
517
+ mergedNotes = rawMergeNotes(allReleases);
518
+ }
519
+ }
520
+ else {
521
+ mergedNotes = rawMergeNotes(allReleases);
522
+ }
523
+ // Preview
524
+ if (mergeMode !== 'ai') {
525
+ console.log('');
526
+ previewNotes(mergedNotes);
527
+ }
528
+ // Confirm
529
+ console.log('');
530
+ const actionDesc = hasStableRelease
531
+ ? `Update ${stableTag} and delete ${allPrereleases.length} prerelease(s)?`
532
+ : `Create ${stableTag} and delete ${allPrereleases.length} prerelease(s)?`;
533
+ const proceed = confirm(actionDesc);
534
+ if (!proceed) {
535
+ log.info('Skipped.');
536
+ continue;
537
+ }
538
+ // Execute all operations under a single spinner
539
+ console.log('');
540
+ const mergeSpinner = new ScrambleProgress();
541
+ mergeSpinner.start([`Merging ${allPrereleases.length} prerelease(s) into ${stableTag}`]);
542
+ // Step 1: update or create stable release
543
+ let createOk;
544
+ if (hasStableRelease) {
545
+ createOk = await updateReleaseNotes(cli, stableTag, mergedNotes);
546
+ }
547
+ else {
548
+ createOk = await createRelease(cli, stableTag, mergedNotes);
549
+ }
550
+ if (!createOk) {
551
+ mergeSpinner.fail(`Failed to ${hasStableRelease ? 'update' : 'create'} ${stableTag}`);
552
+ continue;
553
+ }
554
+ // Step 2: delete all prereleases
555
+ let deleteCount = 0;
556
+ for (const rel of allPrereleases) {
557
+ const deleted = await deleteRelease(cli, rel.tagName);
558
+ if (deleted)
559
+ deleteCount++;
560
+ }
561
+ if (deleteCount === allPrereleases.length) {
562
+ mergeSpinner.succeed(`Merged ${allReleases.length} releases into ${stableTag} ✓`);
563
+ }
564
+ else {
565
+ mergeSpinner.succeed(`Merged into ${stableTag}, but ${allPrereleases.length - deleteCount}/${allPrereleases.length} deletions failed`);
566
+ }
567
+ }
568
+ };
569
+ //# sourceMappingURL=release-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-merge.js","sourceRoot":"","sources":["../../src/workflows/release-merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Release notes generation — markdown formatting, RELEASE.MD and CHANGELOG.md generators
3
+ */
4
+ import type { CommitEntry } from './release-utils.js';
5
+ /**
6
+ * Normalize markdown spacing for consistent markdownlint-friendly output.
7
+ * Ensures: one blank line after ### and #### headings, one blank line between sections,
8
+ * no double blank lines, trailing newline.
9
+ */
10
+ export declare const normalizeReleaseMarkdown: (md: string) => string;
11
+ export declare const generateReleaseMd: (version: string, commits: CommitEntry[], prevVersion: string) => string;
12
+ export declare const generateChangelogEntry: (version: string, commits: CommitEntry[], prevVersion: string) => string;
13
+ //# sourceMappingURL=release-notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-notes.d.ts","sourceRoot":"","sources":["../../src/workflows/release-notes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAMrD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAAI,IAAI,MAAM,KAAG,MA0BrD,CAAA;AA8BD,eAAO,MAAM,iBAAiB,GAC5B,SAAS,MAAM,EACf,SAAS,WAAW,EAAE,EACtB,aAAa,MAAM,KAClB,MA+DF,CAAA;AAID,eAAO,MAAM,sBAAsB,GACjC,SAAS,MAAM,EACf,SAAS,WAAW,EAAE,EACtB,aAAa,MAAM,KAClB,MA0CF,CAAA"}