geeto 0.6.6 → 0.9.1

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