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.
- package/README.md +23 -9
- package/lib/api/copilot-adapter.d.ts +14 -5
- package/lib/api/copilot-adapter.d.ts.map +1 -1
- package/lib/api/copilot-adapter.js +15 -21
- package/lib/api/copilot-adapter.js.map +1 -1
- package/lib/api/copilot-sdk.d.ts +3 -16
- package/lib/api/copilot-sdk.d.ts.map +1 -1
- package/lib/api/copilot-sdk.js +166 -456
- package/lib/api/copilot-sdk.js.map +1 -1
- package/lib/api/copilot.d.ts +3 -4
- package/lib/api/copilot.d.ts.map +1 -1
- package/lib/api/copilot.js +28 -28
- package/lib/api/copilot.js.map +1 -1
- package/lib/api/gemini-sdk.d.ts.map +1 -1
- package/lib/api/gemini-sdk.js +11 -77
- package/lib/api/gemini-sdk.js.map +1 -1
- package/lib/api/gemini.d.ts +2 -2
- package/lib/api/gemini.d.ts.map +1 -1
- package/lib/api/gemini.js +24 -19
- package/lib/api/gemini.js.map +1 -1
- package/lib/api/gitlab.d.ts +80 -0
- package/lib/api/gitlab.d.ts.map +1 -0
- package/lib/api/gitlab.js +192 -0
- package/lib/api/gitlab.js.map +1 -0
- package/lib/api/openrouter-sdk.d.ts.map +1 -1
- package/lib/api/openrouter-sdk.js +11 -76
- package/lib/api/openrouter-sdk.js.map +1 -1
- package/lib/api/openrouter.d.ts.map +1 -1
- package/lib/api/openrouter.js +2 -16
- package/lib/api/openrouter.js.map +1 -1
- package/lib/api/platform.d.ts +78 -0
- package/lib/api/platform.d.ts.map +1 -0
- package/lib/api/platform.js +218 -0
- package/lib/api/platform.js.map +1 -0
- package/lib/cli/input.d.ts +2 -2
- package/lib/cli/input.d.ts.map +1 -1
- package/lib/cli/input.js +23 -27
- package/lib/cli/input.js.map +1 -1
- package/lib/cli/menu.d.ts +1 -1
- package/lib/cli/menu.d.ts.map +1 -1
- package/lib/cli/menu.js +123 -100
- package/lib/cli/menu.js.map +1 -1
- package/lib/core/copilot-setup.d.ts +8 -7
- package/lib/core/copilot-setup.d.ts.map +1 -1
- package/lib/core/copilot-setup.js +59 -230
- package/lib/core/copilot-setup.js.map +1 -1
- package/lib/core/gemini-setup.js +7 -7
- package/lib/core/gemini-setup.js.map +1 -1
- package/lib/core/gitlab-setup.d.ts +5 -0
- package/lib/core/gitlab-setup.d.ts.map +1 -0
- package/lib/core/gitlab-setup.js +85 -0
- package/lib/core/gitlab-setup.js.map +1 -0
- package/lib/core/openrouter-setup.d.ts.map +1 -1
- package/lib/core/openrouter-setup.js +17 -0
- package/lib/core/openrouter-setup.js.map +1 -1
- package/lib/index.js +501 -704
- package/lib/index.js.map +1 -1
- package/lib/types/index.d.ts +10 -6
- package/lib/types/index.d.ts.map +1 -1
- package/lib/utils/ai-provider-helpers.d.ts +5 -0
- package/lib/utils/ai-provider-helpers.d.ts.map +1 -0
- package/lib/utils/ai-provider-helpers.js +23 -0
- package/lib/utils/ai-provider-helpers.js.map +1 -0
- package/lib/utils/ai-text.d.ts +23 -0
- package/lib/utils/ai-text.d.ts.map +1 -0
- package/lib/utils/ai-text.js +57 -0
- package/lib/utils/ai-text.js.map +1 -0
- package/lib/utils/ai-workflow.d.ts +18 -0
- package/lib/utils/ai-workflow.d.ts.map +1 -0
- package/lib/utils/ai-workflow.js +66 -0
- package/lib/utils/ai-workflow.js.map +1 -0
- package/lib/utils/branch-naming.d.ts.map +1 -1
- package/lib/utils/branch-naming.js +1 -3
- package/lib/utils/branch-naming.js.map +1 -1
- package/lib/utils/config.d.ts +13 -1
- package/lib/utils/config.d.ts.map +1 -1
- package/lib/utils/config.js +38 -1
- package/lib/utils/config.js.map +1 -1
- package/lib/utils/display.d.ts.map +1 -1
- package/lib/utils/display.js +4 -3
- package/lib/utils/display.js.map +1 -1
- package/lib/utils/git-ai.js +13 -13
- package/lib/utils/git-ai.js.map +1 -1
- package/lib/utils/git-errors.d.ts.map +1 -1
- package/lib/utils/git-errors.js +2 -6
- package/lib/utils/git-errors.js.map +1 -1
- package/lib/utils/git.d.ts.map +1 -1
- package/lib/utils/git.js +5 -0
- package/lib/utils/git.js.map +1 -1
- package/lib/utils/github-helpers.d.ts +33 -0
- package/lib/utils/github-helpers.d.ts.map +1 -0
- package/lib/utils/github-helpers.js +101 -0
- package/lib/utils/github-helpers.js.map +1 -0
- package/lib/utils/prompt-loader.d.ts +9 -0
- package/lib/utils/prompt-loader.d.ts.map +1 -0
- package/lib/utils/prompt-loader.js +42 -0
- package/lib/utils/prompt-loader.js.map +1 -0
- package/lib/utils/prompts-embedded.d.ts +2 -0
- package/lib/utils/prompts-embedded.d.ts.map +1 -0
- package/lib/utils/prompts-embedded.js +255 -0
- package/lib/utils/prompts-embedded.js.map +1 -0
- package/lib/utils/scramble.d.ts +9 -86
- package/lib/utils/scramble.d.ts.map +1 -1
- package/lib/utils/scramble.js +27 -279
- package/lib/utils/scramble.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/workflows/alias.d.ts.map +1 -1
- package/lib/workflows/alias.js +1 -0
- package/lib/workflows/alias.js.map +1 -1
- package/lib/workflows/amend.d.ts.map +1 -1
- package/lib/workflows/amend.js +1 -5
- package/lib/workflows/amend.js.map +1 -1
- package/lib/workflows/branch-helpers.d.ts.map +1 -1
- package/lib/workflows/branch-helpers.js +0 -1
- package/lib/workflows/branch-helpers.js.map +1 -1
- package/lib/workflows/commit.d.ts.map +1 -1
- package/lib/workflows/commit.js +160 -187
- package/lib/workflows/commit.js.map +1 -1
- package/lib/workflows/doctor.d.ts +7 -0
- package/lib/workflows/doctor.d.ts.map +1 -0
- package/lib/workflows/doctor.js +284 -0
- package/lib/workflows/doctor.js.map +1 -0
- package/lib/workflows/issue.d.ts +1 -1
- package/lib/workflows/issue.d.ts.map +1 -1
- package/lib/workflows/issue.js +28 -115
- package/lib/workflows/issue.js.map +1 -1
- package/lib/workflows/main-helpers.d.ts +34 -0
- package/lib/workflows/main-helpers.d.ts.map +1 -0
- package/lib/workflows/main-helpers.js +346 -0
- package/lib/workflows/main-helpers.js.map +1 -0
- package/lib/workflows/main-steps.d.ts.map +1 -1
- package/lib/workflows/main-steps.js +9 -134
- package/lib/workflows/main-steps.js.map +1 -1
- package/lib/workflows/main.d.ts +2 -6
- package/lib/workflows/main.d.ts.map +1 -1
- package/lib/workflows/main.js +44 -381
- package/lib/workflows/main.js.map +1 -1
- package/lib/workflows/pr.d.ts +2 -2
- package/lib/workflows/pr.d.ts.map +1 -1
- package/lib/workflows/pr.js +49 -137
- package/lib/workflows/pr.js.map +1 -1
- package/lib/workflows/prune.d.ts.map +1 -1
- package/lib/workflows/prune.js +2 -10
- package/lib/workflows/prune.js.map +1 -1
- package/lib/workflows/pull.d.ts.map +1 -1
- package/lib/workflows/pull.js +2 -24
- package/lib/workflows/pull.js.map +1 -1
- package/lib/workflows/release-merge.d.ts +12 -0
- package/lib/workflows/release-merge.d.ts.map +1 -0
- package/lib/workflows/release-merge.js +569 -0
- package/lib/workflows/release-merge.js.map +1 -0
- package/lib/workflows/release-notes.d.ts +13 -0
- package/lib/workflows/release-notes.d.ts.map +1 -0
- package/lib/workflows/release-notes.js +141 -0
- package/lib/workflows/release-notes.js.map +1 -0
- package/lib/workflows/release-recover.d.ts +5 -0
- package/lib/workflows/release-recover.d.ts.map +1 -0
- package/lib/workflows/release-recover.js +137 -0
- package/lib/workflows/release-recover.js.map +1 -0
- package/lib/workflows/release-sync.d.ts +7 -0
- package/lib/workflows/release-sync.d.ts.map +1 -0
- package/lib/workflows/release-sync.js +321 -0
- package/lib/workflows/release-sync.js.map +1 -0
- package/lib/workflows/release-utils.d.ts +36 -0
- package/lib/workflows/release-utils.d.ts.map +1 -0
- package/lib/workflows/release-utils.js +150 -0
- package/lib/workflows/release-utils.js.map +1 -0
- package/lib/workflows/release.d.ts.map +1 -1
- package/lib/workflows/release.js +92 -719
- package/lib/workflows/release.js.map +1 -1
- package/lib/workflows/repo-settings.d.ts +2 -2
- package/lib/workflows/repo-settings.d.ts.map +1 -1
- package/lib/workflows/repo-settings.js +33 -24
- package/lib/workflows/repo-settings.js.map +1 -1
- package/lib/workflows/reword.d.ts.map +1 -1
- package/lib/workflows/reword.js +154 -151
- package/lib/workflows/reword.js.map +1 -1
- package/lib/workflows/security-gate.d.ts.map +1 -1
- package/lib/workflows/security-gate.js +15 -75
- package/lib/workflows/security-gate.js.map +1 -1
- package/lib/workflows/settings.d.ts +2 -1
- package/lib/workflows/settings.d.ts.map +1 -1
- package/lib/workflows/settings.js +289 -19
- package/lib/workflows/settings.js.map +1 -1
- package/lib/workflows/trello-menu.d.ts +2 -5
- package/lib/workflows/trello-menu.d.ts.map +1 -1
- package/lib/workflows/trello-menu.js +67 -228
- package/lib/workflows/trello-menu.js.map +1 -1
- package/package.json +3 -6
- package/prompts/branch-name-prompt.md +4 -0
- package/prompts/commit-message-prompt.md +12 -0
- package/prompts/issue-prompt.md +19 -0
- package/prompts/issue-review.with-context.prompt.yml +77 -0
- package/prompts/pr-prompt.md +14 -0
- package/prompts/release-notes-prompt.md +35 -0
- package/prompts/repo-description-prompt.md +1 -0
- 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"}
|