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,378 @@
1
+ /**
2
+ * Release sync workflows — sync GitHub/GitLab Releases for existing tags, delete releases
3
+ */
4
+ import { writeFileSync } from 'node:fs';
5
+ import { generateReleaseMd, normalizeReleaseMarkdown } from './release-notes.js';
6
+ import { getCommitsSinceTag, getExistingTags } from './release-utils.js';
7
+ import { confirm } from '../cli/input.js';
8
+ import { select } from '../cli/menu.js';
9
+ import { colors } from '../utils/colors.js';
10
+ import { BOX_W } from '../utils/display.js';
11
+ import { execAsync, execSilent } from '../utils/exec.js';
12
+ import { chooseModelForProvider, generateReleaseNotesWithProvider, getAIProviderShortName, getModelValue, } from '../utils/git-ai.js';
13
+ import { detectPlatformFromRemote, getPlatformCLI } from '../utils/github-helpers.js';
14
+ import { log } from '../utils/logging.js';
15
+ import { ScrambleProgress } from '../utils/scramble.js';
16
+ import { loadState } from '../utils/state.js';
17
+ // ─── Release helpers ───
18
+ export const getExistingGithubReleases = async (cli = 'gh') => {
19
+ try {
20
+ const result = await execAsync(`${cli} release list --limit 100 --json tagName --jq ".[].tagName"`, true);
21
+ const output = result.stdout.trim();
22
+ const tags = output ? output.split('\n').filter(Boolean) : [];
23
+ // eslint-disable-next-line unicorn/no-array-sort -- toSorted needs ES2023
24
+ return [...tags].sort((a, b) => {
25
+ const pa = a.replace(/^v/, '').split(/[-.]/);
26
+ const pb = b.replace(/^v/, '').split(/[-.]/);
27
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
28
+ const na = Number(pa[i]) || 0;
29
+ const nb = Number(pb[i]) || 0;
30
+ if (na !== nb)
31
+ return nb - na;
32
+ if (pa[i] !== pb[i])
33
+ return (pb[i] ?? '').localeCompare(pa[i] ?? '');
34
+ }
35
+ return 0;
36
+ });
37
+ }
38
+ catch {
39
+ return [];
40
+ }
41
+ };
42
+ // ─── Sync Releases for existing tags ───
43
+ export const handleSyncReleases = async () => {
44
+ const line = '─'.repeat(BOX_W);
45
+ // Detect platform (GitHub or GitLab)
46
+ const platform = detectPlatformFromRemote();
47
+ const cli = platform ? getPlatformCLI(platform) : 'gh';
48
+ const platformName = platform === 'gitlab' ? 'GitLab' : 'GitHub';
49
+ // Check if platform CLI is available
50
+ try {
51
+ execSilent(`${cli} --version`);
52
+ }
53
+ catch {
54
+ log.error(`${platformName} CLI (${cli}) is not installed.${cli === 'gh' ? ' Install it: https://cli.github.com' : ' Install it: https://gitlab.com/gitlab-org/cli'}`);
55
+ return;
56
+ }
57
+ console.log('');
58
+ const spinner = new ScrambleProgress();
59
+ spinner.start([`Fetching tags and ${platformName} releases`]);
60
+ const localTags = getExistingTags();
61
+ const ghReleases = await getExistingGithubReleases(cli);
62
+ const missingTags = localTags.filter((t) => !ghReleases.includes(t));
63
+ spinner.succeed(`Found ${localTags.length} tags, ${ghReleases.length} ${platformName} releases`);
64
+ if (missingTags.length === 0) {
65
+ console.log('');
66
+ log.success(`All tags have ${platformName} Releases! Nothing to sync.`);
67
+ return;
68
+ }
69
+ console.log('');
70
+ log.info(`${colors.bright}${missingTags.length}${colors.reset} tags missing ${platformName} Releases:`);
71
+ for (const tag of missingTags) {
72
+ console.log(` ${colors.yellow}${tag}${colors.reset}`);
73
+ }
74
+ console.log('');
75
+ const action = await select('What do you want to do?', [
76
+ { label: 'Create releases for all missing tags', value: 'all' },
77
+ { label: 'Select which tags to release', value: 'select' },
78
+ { label: 'Cancel', value: 'cancel' },
79
+ ]);
80
+ if (action === 'cancel')
81
+ return;
82
+ let tagsToRelease = missingTags;
83
+ if (action === 'select') {
84
+ const { multiSelect } = await import('../cli/menu.js');
85
+ const choices = missingTags.map((t) => ({ label: t, value: t }));
86
+ const selected = await multiSelect('Select tags to create releases for:', choices);
87
+ if (selected.length === 0) {
88
+ log.info('No tags selected.');
89
+ return;
90
+ }
91
+ tagsToRelease = selected;
92
+ }
93
+ // Choose release notes mode: AI or template
94
+ console.log('');
95
+ const notesMode = await select('How should release notes be generated?', [
96
+ { label: 'AI-generated (recommended)', value: 'ai' },
97
+ { label: 'Auto-generate (template-based)', value: 'auto' },
98
+ ]);
99
+ // AI setup if needed
100
+ let useAI = notesMode === 'ai';
101
+ let language = 'en';
102
+ let aiProvider = 'copilot';
103
+ let copilotModel;
104
+ let openrouterModel;
105
+ let geminiModel;
106
+ if (useAI) {
107
+ language = (await select('Release notes language:', [
108
+ { label: 'English', value: 'en' },
109
+ { label: 'Indonesian (Bahasa Indonesia)', value: 'id' },
110
+ ]));
111
+ // Check saved config
112
+ const savedState = loadState();
113
+ if (savedState?.aiProvider &&
114
+ savedState.aiProvider !== 'manual' &&
115
+ (savedState.copilotModel || savedState.openrouterModel || savedState.geminiModel)) {
116
+ aiProvider = savedState.aiProvider;
117
+ copilotModel = savedState.copilotModel;
118
+ openrouterModel = savedState.openrouterModel;
119
+ geminiModel = savedState.geminiModel;
120
+ }
121
+ else {
122
+ let providerChosen = false;
123
+ while (!providerChosen) {
124
+ aiProvider = (await select('Choose AI Provider:', [
125
+ { label: 'GitHub (Recommended)', value: 'copilot' },
126
+ { label: 'Gemini', value: 'gemini' },
127
+ { label: 'OpenRouter', value: 'openrouter' },
128
+ ]));
129
+ const chosen = await chooseModelForProvider(aiProvider, undefined, 'Back to AI provider menu');
130
+ if (!chosen || chosen === 'back')
131
+ continue;
132
+ switch (aiProvider) {
133
+ case 'gemini': {
134
+ geminiModel = chosen;
135
+ break;
136
+ }
137
+ case 'copilot': {
138
+ copilotModel = chosen;
139
+ break;
140
+ }
141
+ case 'openrouter': {
142
+ openrouterModel = chosen;
143
+ break;
144
+ }
145
+ }
146
+ providerChosen = true;
147
+ }
148
+ }
149
+ }
150
+ // Preview and confirm
151
+ console.log('');
152
+ console.log(`${colors.cyan}┌${line}┐${colors.reset}`);
153
+ console.log(`${colors.cyan}│${colors.reset} ${colors.bright}Sync Plan${colors.reset}`);
154
+ console.log(`${colors.cyan}├${line}┤${colors.reset}`);
155
+ for (const tag of tagsToRelease) {
156
+ const ver = tag.replace(/^v/, '');
157
+ console.log(`${colors.cyan}│${colors.reset} ${colors.green}+${colors.reset} Create release for ${colors.yellow}${ver}${colors.reset}`);
158
+ }
159
+ console.log(`${colors.cyan}│${colors.reset} ${colors.gray}Mode: ${useAI ? 'AI-generated' : 'Template-based'}${colors.reset}`);
160
+ console.log(`${colors.cyan}└${line}┘${colors.reset}`);
161
+ console.log('');
162
+ const proceed = confirm(`Create ${tagsToRelease.length} ${platformName} Releases?`);
163
+ if (!proceed)
164
+ return;
165
+ // Create releases one by one
166
+ const allTags = getExistingTags();
167
+ let successCount = 0;
168
+ for (const tag of tagsToRelease) {
169
+ const ver = tag.replace(/^v/, '');
170
+ const tagIdx = allTags.indexOf(tag);
171
+ const prevTag = allTags[tagIdx + 1];
172
+ const commits = getCommitsSinceTag(prevTag);
173
+ const commitList = commits.map((c) => c.subject).join('\n');
174
+ let releaseBody;
175
+ if (useAI && commits.length > 0) {
176
+ console.log('');
177
+ const aiSpinner = new ScrambleProgress();
178
+ const modelDisplay = getModelValue(copilotModel ?? openrouterModel ?? geminiModel ?? '');
179
+ aiSpinner.start([
180
+ `Generating release notes with ${getAIProviderShortName(aiProvider)}${modelDisplay ? ` (${modelDisplay})` : ''}`,
181
+ ]);
182
+ const aiResult = await generateReleaseNotesWithProvider(aiProvider, commitList, language, undefined, copilotModel, openrouterModel, geminiModel);
183
+ if (aiResult) {
184
+ aiSpinner.succeed(`Notes generated for ${tag}`);
185
+ releaseBody = normalizeReleaseMarkdown(aiResult);
186
+ // Preview notes for user review
187
+ console.log('');
188
+ console.log(`${colors.cyan}┌${'─'.repeat(BOX_W)}┐${colors.reset}`);
189
+ console.log(`${colors.cyan}│${colors.reset} ${colors.bright}Release Notes — ${tag}${colors.reset}`);
190
+ console.log(`${colors.cyan}├${'─'.repeat(BOX_W)}┤${colors.reset}`);
191
+ for (const noteLine of releaseBody.split('\n')) {
192
+ console.log(`${colors.cyan}│${colors.reset} ${noteLine}`);
193
+ }
194
+ console.log(`${colors.cyan}└${'─'.repeat(BOX_W)}┘${colors.reset}`);
195
+ console.log('');
196
+ const reviewAction = await select(`Publish release for ${tag}?`, [
197
+ { label: 'Yes, publish', value: 'accept' },
198
+ { label: 'Skip this tag', value: 'skip' },
199
+ ]);
200
+ if (reviewAction === 'skip')
201
+ continue;
202
+ }
203
+ else {
204
+ aiSpinner.fail(`AI failed for ${tag}, using template`);
205
+ useAI = false;
206
+ releaseBody = generateReleaseMd(ver, commits, prevTag?.replace(/^v/, '') ?? '0.0.0')
207
+ .replace(/^## .*\n+/, '')
208
+ .replace(/\n---\n*$/, '')
209
+ .trim();
210
+ }
211
+ }
212
+ else {
213
+ releaseBody = generateReleaseMd(ver, commits, prevTag?.replace(/^v/, '') ?? '0.0.0')
214
+ .replace(/^## .*\n+/, '')
215
+ .replace(/\n---\n*$/, '')
216
+ .trim();
217
+ }
218
+ console.log('');
219
+ const releaseSpinner = new ScrambleProgress();
220
+ // Ensure tag exists on remote before creating GitHub Release
221
+ releaseSpinner.start([`Pushing tag ${tag} to remote`]);
222
+ try {
223
+ await execAsync(`git push origin ${tag} --no-verify`, true);
224
+ releaseSpinner.succeed(`Tag ${tag} pushed to remote`);
225
+ }
226
+ catch {
227
+ // Tag might already exist on remote — that's fine, continue
228
+ }
229
+ console.log('');
230
+ const createSpinner = new ScrambleProgress();
231
+ createSpinner.start([`Creating ${platformName} release`]);
232
+ const os = await import('node:os');
233
+ const tempFile = `${os.tmpdir()}/geeto-sync-${Date.now()}.md`;
234
+ writeFileSync(tempFile, releaseBody, 'utf8');
235
+ try {
236
+ await execAsync(`${cli} release create ${tag} --title "${tag}" --notes-file "${tempFile}"`, true);
237
+ createSpinner.succeed(`Release ${tag} created`);
238
+ successCount++;
239
+ }
240
+ catch (error) {
241
+ const stderr = error.stderr?.trim();
242
+ createSpinner.fail(`Failed to create release for ${tag}`);
243
+ if (stderr)
244
+ log.error(` ${stderr.split('\n')[0]}`);
245
+ }
246
+ // Cleanup temp file
247
+ try {
248
+ const { unlinkSync } = await import('node:fs');
249
+ unlinkSync(tempFile);
250
+ }
251
+ catch {
252
+ /* ignore */
253
+ }
254
+ }
255
+ console.log('');
256
+ if (successCount === tagsToRelease.length) {
257
+ log.success(`All ${successCount} ${platformName} Releases created!`);
258
+ }
259
+ else {
260
+ log.warn(`${successCount}/${tagsToRelease.length} releases created`);
261
+ }
262
+ };
263
+ // ─── Delete Releases ───
264
+ export const handleDeleteReleases = async () => {
265
+ // Detect platform (GitHub or GitLab)
266
+ const platform = detectPlatformFromRemote();
267
+ const cli = platform ? getPlatformCLI(platform) : 'gh';
268
+ const platformName = platform === 'gitlab' ? 'GitLab' : 'GitHub';
269
+ // Check if platform CLI is available
270
+ try {
271
+ execSilent(`${cli} --version`);
272
+ }
273
+ catch {
274
+ log.error(`${platformName} CLI (${cli}) is not installed.${cli === 'gh' ? ' Install it: https://cli.github.com' : ' Install it: https://gitlab.com/gitlab-org/cli'}`);
275
+ return;
276
+ }
277
+ console.log('');
278
+ const spinner = new ScrambleProgress();
279
+ spinner.start([`Fetching ${platformName} releases`, 'Fetching local tags']);
280
+ const ghReleases = await getExistingGithubReleases(cli);
281
+ const localTags = getExistingTags();
282
+ const ghSet = new Set(ghReleases);
283
+ const localOnlyTags = localTags.filter((t) => !ghSet.has(t));
284
+ const allTags = [...ghReleases, ...localOnlyTags];
285
+ // eslint-disable-next-line unicorn/no-array-sort -- toSorted needs ES2023
286
+ const sorted = [...allTags].sort((a, b) => {
287
+ const pa = a.replace(/^v/, '').split(/[-.]/);
288
+ const pb = b.replace(/^v/, '').split(/[-.]/);
289
+ for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
290
+ const na = Number(pa[i]) || 0;
291
+ const nb = Number(pb[i]) || 0;
292
+ if (na !== nb)
293
+ return nb - na;
294
+ if (pa[i] !== pb[i])
295
+ return (pb[i] ?? '').localeCompare(pa[i] ?? '');
296
+ }
297
+ return 0;
298
+ });
299
+ const total = sorted.length;
300
+ const localCount = localOnlyTags.length;
301
+ spinner.succeed(`Found ${total} releases${localCount > 0 ? ` (${localCount} local only)` : ''}`);
302
+ if (total === 0) {
303
+ console.log('');
304
+ log.info(`No ${platformName} Releases to delete.`);
305
+ return;
306
+ }
307
+ console.log('');
308
+ const { multiSelect } = await import('../cli/menu.js');
309
+ const choices = sorted.map((t) => {
310
+ const isLocal = !ghSet.has(t);
311
+ const label = isLocal ? `${t} ${colors.yellow}(local)${colors.reset}` : t;
312
+ return { label, value: t };
313
+ });
314
+ const selected = await multiSelect('Select releases to delete:', choices);
315
+ if (selected.length === 0) {
316
+ log.info('No releases selected.');
317
+ return;
318
+ }
319
+ console.log('');
320
+ const alsoDeleteTag = confirm('Also delete the associated git tags?');
321
+ console.log('');
322
+ const proceed = confirm(`Delete ${selected.length} ${platformName} Release(s)${alsoDeleteTag ? ' + tags' : ''}?`);
323
+ if (!proceed)
324
+ return;
325
+ let successCount = 0;
326
+ for (const release of selected) {
327
+ console.log('');
328
+ const releaseSpinner = new ScrambleProgress();
329
+ const isLocalOnly = !ghSet.has(release);
330
+ if (isLocalOnly) {
331
+ releaseSpinner.start([`Deleting local tag ${release}`]);
332
+ try {
333
+ await execAsync(`git tag -d ${release}`, true);
334
+ try {
335
+ await execAsync(`git push origin --delete ${release} --no-verify`, true);
336
+ }
337
+ catch {
338
+ /* Remote tag may not exist */
339
+ }
340
+ releaseSpinner.succeed(`Local tag ${release} deleted`);
341
+ successCount++;
342
+ }
343
+ catch {
344
+ releaseSpinner.fail(`Failed to delete tag ${release}`);
345
+ }
346
+ continue;
347
+ }
348
+ releaseSpinner.start([`Deleting release ${release}`]);
349
+ try {
350
+ await execAsync(`${cli} release delete ${release} --yes`, true);
351
+ if (alsoDeleteTag) {
352
+ try {
353
+ await execAsync(`git tag -d ${release}`, true);
354
+ await execAsync(`git push origin --delete ${release} --no-verify`, true);
355
+ }
356
+ catch {
357
+ /* Tag deletion is best-effort */
358
+ }
359
+ }
360
+ releaseSpinner.succeed(`Release ${release} deleted${alsoDeleteTag ? ' + tag' : ''}`);
361
+ successCount++;
362
+ }
363
+ catch (error) {
364
+ const stderr = error.stderr?.trim();
365
+ releaseSpinner.fail(`Failed to delete ${release}`);
366
+ if (stderr)
367
+ log.error(` ${stderr.split('\n')[0]}`);
368
+ }
369
+ }
370
+ console.log('');
371
+ if (successCount === selected.length) {
372
+ log.success(`All ${successCount} releases deleted!`);
373
+ }
374
+ else {
375
+ log.warn(`${successCount}/${selected.length} releases deleted`);
376
+ }
377
+ };
378
+ //# sourceMappingURL=release-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-sync.js","sourceRoot":"","sources":["../../src/workflows/release-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Release utilities — types, semver helpers, git helpers
3
+ */
4
+ export interface SemVer {
5
+ major: number;
6
+ minor: number;
7
+ patch: number;
8
+ prerelease?: string;
9
+ }
10
+ export interface CommitEntry {
11
+ hash: string;
12
+ short: string;
13
+ subject: string;
14
+ author: string;
15
+ date: string;
16
+ }
17
+ export interface CategorizedCommits {
18
+ features: CommitEntry[];
19
+ fixes: CommitEntry[];
20
+ breaking: CommitEntry[];
21
+ other: CommitEntry[];
22
+ }
23
+ export declare const parseSemver: (version: string) => SemVer | null;
24
+ export declare const formatSemver: (sv: SemVer) => string;
25
+ export declare const isPrerelease: (version: string) => boolean;
26
+ /** Bump prerelease number: beta.1 → beta.2. If no prerelease, start at label.1 */
27
+ export declare const bumpPrerelease: (sv: SemVer, label?: string) => SemVer;
28
+ /** Promote prerelease to stable: 1.0.0-beta.3 → 1.0.0 */
29
+ export declare const promoteToStable: (sv: SemVer) => SemVer;
30
+ export declare const getCurrentVersion: () => string;
31
+ export declare const getExistingTags: () => string[];
32
+ export declare const getCommitsSinceTag: (tag?: string) => CommitEntry[];
33
+ export declare const categorizeCommits: (commits: CommitEntry[]) => CategorizedCommits;
34
+ export declare const getRepoUrl: () => string;
35
+ export declare const updatePackageVersion: (newVersion: string) => void;
36
+ //# sourceMappingURL=release-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-utils.d.ts","sourceRoot":"","sources":["../../src/workflows/release-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,KAAK,EAAE,WAAW,EAAE,CAAA;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,KAAK,EAAE,WAAW,EAAE,CAAA;CACrB;AAID,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,KAAG,MAAM,GAAG,IAStD,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,IAAI,MAAM,KAAG,MAGC,CAAA;AAE3C,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,OAG9C,CAAA;AAWD,kFAAkF;AAClF,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,EAAE,QAAQ,MAAM,KAAG,MAe3D,CAAA;AAED,yDAAyD;AACzD,eAAO,MAAM,eAAe,GAAI,IAAI,MAAM,KAAG,MAI3C,CAAA;AAEF,eAAO,MAAM,iBAAiB,QAAO,MASpC,CAAA;AAED,eAAO,MAAM,eAAe,QAAO,MAAM,EASxC,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,WAAW,EAwB5D,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,SAAS,WAAW,EAAE,KAAG,kBAqB1D,CAAA;AAED,eAAO,MAAM,UAAU,QAAO,MAS7B,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,YAAY,MAAM,KAAG,IAiBzD,CAAA"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Release utilities — types, semver helpers, git helpers
3
+ */
4
+ import { readFileSync, writeFileSync } from 'node:fs';
5
+ import { execSilent } from '../utils/exec.js';
6
+ // ─── Helpers ───
7
+ export const parseSemver = (version) => {
8
+ const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.]+))?/);
9
+ if (!match)
10
+ return null;
11
+ return {
12
+ major: Number.parseInt(match[1] ?? '0', 10),
13
+ minor: Number.parseInt(match[2] ?? '0', 10),
14
+ patch: Number.parseInt(match[3] ?? '0', 10),
15
+ prerelease: match[4] ?? undefined,
16
+ };
17
+ };
18
+ export const formatSemver = (sv) => sv.prerelease
19
+ ? `${sv.major}.${sv.minor}.${sv.patch}-${sv.prerelease}`
20
+ : `${sv.major}.${sv.minor}.${sv.patch}`;
21
+ export const isPrerelease = (version) => {
22
+ const sv = parseSemver(version);
23
+ return sv?.prerelease != null;
24
+ };
25
+ /** Parse prerelease tag into [label, number]. e.g. "beta.3" → ["beta", 3] */
26
+ const parsePreTag = (pre) => {
27
+ const dot = pre.lastIndexOf('.');
28
+ if (dot === -1)
29
+ return [pre, 0];
30
+ const label = pre.slice(0, dot);
31
+ const num = Number.parseInt(pre.slice(dot + 1), 10);
32
+ return [label, Number.isNaN(num) ? 0 : num];
33
+ };
34
+ /** Bump prerelease number: beta.1 → beta.2. If no prerelease, start at label.1 */
35
+ export const bumpPrerelease = (sv, label) => {
36
+ if (sv.prerelease) {
37
+ const [curLabel, curNum] = parsePreTag(sv.prerelease);
38
+ if (!label || label === curLabel) {
39
+ return { ...sv, prerelease: `${curLabel}.${curNum + 1}` };
40
+ }
41
+ // Different label — start at 1 (e.g. beta.3 → rc.1)
42
+ return { ...sv, prerelease: `${label}.1` };
43
+ }
44
+ // Stable → prerelease: use next patch as base
45
+ return {
46
+ ...sv,
47
+ patch: sv.patch + 1,
48
+ prerelease: `${label ?? 'beta'}.1`,
49
+ };
50
+ };
51
+ /** Promote prerelease to stable: 1.0.0-beta.3 → 1.0.0 */
52
+ export const promoteToStable = (sv) => ({
53
+ major: sv.major,
54
+ minor: sv.minor,
55
+ patch: sv.patch,
56
+ });
57
+ export const getCurrentVersion = () => {
58
+ try {
59
+ const pkg = JSON.parse(readFileSync('package.json', 'utf8'));
60
+ return pkg.version ?? '0.0.0';
61
+ }
62
+ catch {
63
+ return '0.0.0';
64
+ }
65
+ };
66
+ export const getExistingTags = () => {
67
+ try {
68
+ // Sort by creation date (newest first), NOT version number.
69
+ // Version sort breaks when older dummy/test tags have higher semver (e.g. v2.0.0 before v0.3.x).
70
+ const output = execSilent('git tag --list --sort=-creatordate').trim();
71
+ return output ? output.split('\n').filter(Boolean) : [];
72
+ }
73
+ catch {
74
+ return [];
75
+ }
76
+ };
77
+ export const getCommitsSinceTag = (tag) => {
78
+ try {
79
+ const sep = '<<GTO>>';
80
+ const range = tag ? `${tag}..HEAD` : 'HEAD';
81
+ const output = execSilent(`git log ${range} --format="%H${sep}%h${sep}%s${sep}%an${sep}%ci" --no-merges`).trim();
82
+ if (!output)
83
+ return [];
84
+ return output
85
+ .split('\n')
86
+ .filter(Boolean)
87
+ .map((line) => {
88
+ const parts = line.split(sep);
89
+ return {
90
+ hash: parts[0] ?? '',
91
+ short: parts[1] ?? '',
92
+ subject: parts[2] ?? '',
93
+ author: parts[3] ?? '',
94
+ date: parts[4] ?? '',
95
+ };
96
+ });
97
+ }
98
+ catch {
99
+ return [];
100
+ }
101
+ };
102
+ export const categorizeCommits = (commits) => {
103
+ const result = {
104
+ features: [],
105
+ fixes: [],
106
+ breaking: [],
107
+ other: [],
108
+ };
109
+ for (const c of commits) {
110
+ if (c.subject.includes('BREAKING CHANGE') || c.subject.includes('!:')) {
111
+ result.breaking = [...result.breaking, c];
112
+ }
113
+ else if (c.subject.startsWith('feat')) {
114
+ result.features = [...result.features, c];
115
+ }
116
+ else if (c.subject.startsWith('fix')) {
117
+ result.fixes = [...result.fixes, c];
118
+ }
119
+ else {
120
+ result.other = [...result.other, c];
121
+ }
122
+ }
123
+ return result;
124
+ };
125
+ export const getRepoUrl = () => {
126
+ try {
127
+ return execSilent('git config --get remote.origin.url')
128
+ .trim()
129
+ .replace(/\.git$/, '')
130
+ .replace(/^git@github\.com:/, 'https://github.com/');
131
+ }
132
+ catch {
133
+ return '';
134
+ }
135
+ };
136
+ export const updatePackageVersion = (newVersion) => {
137
+ const content = readFileSync('package.json', 'utf8');
138
+ const pkg = JSON.parse(content);
139
+ pkg.version = newVersion;
140
+ writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n', 'utf8');
141
+ // Also update the compiled-binary-safe version constant
142
+ try {
143
+ const versionTs = readFileSync('src/version.ts', 'utf8');
144
+ writeFileSync('src/version.ts', versionTs.replace(/VERSION = '[^']*'/, `VERSION = '${newVersion}'`), 'utf8');
145
+ }
146
+ catch {
147
+ /* version.ts update is best-effort */
148
+ }
149
+ };
150
+ //# sourceMappingURL=release-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-utils.js","sourceRoot":"","sources":["../../src/workflows/release-utils.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/workflows/release.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAy0BH,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CAglBlD,CAAA"}
1
+ {"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/workflows/release.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4CH,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CAooBlD,CAAA"}