infra-kit 0.1.98 → 0.1.99

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.
@@ -1 +0,0 @@
1
- export { releaseCreateBatch, releaseCreateBatchMcpTool } from './release-create-batch'
@@ -1,222 +0,0 @@
1
- import confirm from '@inquirer/confirm'
2
- import select from '@inquirer/select'
3
- import process from 'node:process'
4
- import { z } from 'zod/v4'
5
- import { question } from 'zx'
6
-
7
- import { loadJiraConfig } from 'src/integrations/jira'
8
- import { commandEcho } from 'src/lib/command-echo'
9
- import { logger } from 'src/lib/logger'
10
- import { createSingleRelease, prepareGitForRelease } from 'src/lib/release-utils'
11
- import type { ReleaseCreationResult, ReleaseType } from 'src/lib/release-utils'
12
- import {
13
- NEXT_TOKEN,
14
- NoPriorVersionsError,
15
- loadExistingVersions,
16
- resolveVersionTokens,
17
- splitVersionInput,
18
- } from 'src/lib/version-utils'
19
- import type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'
20
-
21
- interface ReleaseCreateBatchArgs extends RequiredConfirmedOptionArg {
22
- versions: string
23
- type?: ReleaseType
24
- }
25
-
26
- const VERSIONS_PROMPT_HINT = '"1.2.5, 1.2.6", "next,next", or "next,next,1.2.7"'
27
-
28
- /**
29
- * Gather and validate batch release inputs interactively if needed
30
- */
31
- const resolveInputs = async (args: ReleaseCreateBatchArgs): Promise<{ versionsList: string[]; type: ReleaseType }> => {
32
- const { versions: inputVersions, type: inputType, confirmedCommand } = args
33
-
34
- let versionInput = inputVersions
35
- let type: ReleaseType = inputType || 'regular'
36
-
37
- if (!inputType) {
38
- commandEcho.setInteractive()
39
-
40
- type = await select<ReleaseType>({
41
- message: 'Select release type:',
42
- choices: [
43
- { name: 'regular', value: 'regular' },
44
- { name: 'hotfix', value: 'hotfix' },
45
- ],
46
- default: 'regular',
47
- })
48
- }
49
-
50
- commandEcho.addOption('--type', type)
51
-
52
- if (!versionInput) {
53
- commandEcho.setInteractive()
54
- versionInput = await question(`Enter versions by comma (e.g. ${VERSIONS_PROMPT_HINT}): `)
55
- }
56
-
57
- const rawTokens = splitVersionInput(versionInput)
58
-
59
- if (rawTokens.length === 0) {
60
- logger.error('No versions provided. Exiting...')
61
- process.exit(1)
62
- }
63
-
64
- const needsKnown = rawTokens.some((t) => {
65
- return t.toLowerCase() === NEXT_TOKEN
66
- })
67
- const known = needsKnown ? await loadExistingVersions() : []
68
-
69
- let versionsList: string[]
70
-
71
- try {
72
- versionsList = resolveVersionTokens(rawTokens, type, known)
73
- } catch (err) {
74
- if (err instanceof NoPriorVersionsError) {
75
- logger.error(err.message)
76
- process.exit(1)
77
- }
78
-
79
- throw err
80
- }
81
-
82
- commandEcho.addOption('--versions', versionsList.join(', '))
83
-
84
- if (versionsList.length === 1) {
85
- logger.warn('💡 You are creating only one release. Consider using "create-release" command for single releases.')
86
- }
87
-
88
- const answer = confirmedCommand
89
- ? true
90
- : await confirm({
91
- message: `Are you sure you want to create release branches for these versions: ${versionsList.join(', ')}?`,
92
- })
93
-
94
- if (!confirmedCommand) {
95
- commandEcho.setInteractive()
96
- }
97
-
98
- if (!answer) {
99
- logger.info('Operation cancelled. Exiting...')
100
- process.exit(0)
101
- }
102
-
103
- commandEcho.addOption('--yes', true)
104
-
105
- return { versionsList, type }
106
- }
107
-
108
- /**
109
- * Create multiple release branches for the specified versions
110
- * Includes Jira version creation and GitHub release branch creation for each version
111
- */
112
- export const releaseCreateBatch = async (args: ReleaseCreateBatchArgs): Promise<ToolsExecutionResult> => {
113
- commandEcho.start('release-create-batch')
114
-
115
- const jiraConfig = await loadJiraConfig()
116
-
117
- const { versionsList, type } = await resolveInputs(args)
118
-
119
- await prepareGitForRelease(type)
120
-
121
- const releases: ReleaseCreationResult[] = []
122
- const failedReleases: Array<{ version: string; error: string }> = []
123
-
124
- for (const version of versionsList) {
125
- try {
126
- // Create each release
127
- const release = await createSingleRelease({ version, jiraConfig, type })
128
-
129
- releases.push(release)
130
-
131
- logger.info(`✅ Successfully created release: v${version}`)
132
- logger.info(`🔗 GitHub PR: ${release.prUrl}`)
133
- logger.info(`🔗 Jira Version: ${release.jiraVersionUrl}\n`)
134
- } catch (error) {
135
- const errorMessage = error instanceof Error ? error.message : String(error)
136
-
137
- failedReleases.push({ version, error: errorMessage })
138
-
139
- logger.error(`❌ Failed to create release: v${version}`)
140
- logger.error(` Error: ${errorMessage}\n`)
141
- }
142
- }
143
-
144
- // Final summary
145
- const successCount = releases.length
146
- const failureCount = failedReleases.length
147
-
148
- if (successCount === versionsList.length) {
149
- logger.info(`✅ All ${versionsList.length} release branches were created successfully.`)
150
- } else if (successCount > 0) {
151
- logger.warn(`⚠️ ${successCount} of ${versionsList.length} release branches were created successfully.`)
152
- logger.warn(`❌ ${failureCount} release(s) failed.`)
153
- } else {
154
- logger.error(`❌ All ${versionsList.length} release branches failed to create.`)
155
- }
156
-
157
- commandEcho.print()
158
-
159
- const structuredContent = {
160
- createdBranches: releases.map((r) => {
161
- return r.branchName
162
- }),
163
- successCount,
164
- failureCount,
165
- releases,
166
- failedReleases,
167
- }
168
-
169
- return {
170
- content: [
171
- {
172
- type: 'text',
173
- text: JSON.stringify(structuredContent, null, 2),
174
- },
175
- ],
176
- structuredContent,
177
- }
178
- }
179
-
180
- // MCP Tool Registration
181
- export const releaseCreateBatchMcpTool = {
182
- name: 'release-create-batch',
183
- description:
184
- 'Create several releases in one pass: for each comma-separated version in "versions", cuts the release branch off the appropriate base (dev for regular releases, main for hotfixes), opens a GitHub PR, and creates the Jira fix version. The literal token "next" auto-increments from the latest known version (regular bumps minor + resets patch; hotfix bumps patch on the highest minor); multiple "next" tokens advance sequentially. Existing versions are unioned from remote release branches and Jira fix versions. Continues on per-version failure and reports which versions succeeded and which failed. Confirmation is auto-skipped for MCP calls, so the caller is responsible for gating. "versions" is required when invoked via MCP (the interactive input prompt is unreachable without a TTY). Use release-create for a single version with optional checkout.',
185
- inputSchema: {
186
- versions: z
187
- .string()
188
- .describe(
189
- 'Comma-separated versions to create (e.g., "1.2.5, 1.2.6", "next,next", or "next,next,1.2.7"). Required for MCP calls.',
190
- ),
191
- type: z
192
- .enum(['regular', 'hotfix'])
193
- .optional()
194
- .default('regular')
195
- .describe('Release type: "regular" or "hotfix" (default: "regular")'),
196
- },
197
- outputSchema: {
198
- createdBranches: z.array(z.string()).describe('List of created release branches'),
199
- successCount: z.number().describe('Number of releases created successfully'),
200
- failureCount: z.number().describe('Number of releases that failed'),
201
- releases: z
202
- .array(
203
- z.object({
204
- version: z.string().describe('Version number'),
205
- type: z.enum(['regular', 'hotfix']).describe('Release type'),
206
- branchName: z.string().describe('Release branch name'),
207
- prUrl: z.string().describe('GitHub PR URL'),
208
- jiraVersionUrl: z.string().describe('Jira version URL'),
209
- }),
210
- )
211
- .describe('Detailed information for each created release with URLs'),
212
- failedReleases: z
213
- .array(
214
- z.object({
215
- version: z.string().describe('Version number that failed'),
216
- error: z.string().describe('Error message'),
217
- }),
218
- )
219
- .describe('List of releases that failed with error messages'),
220
- },
221
- handler: releaseCreateBatch,
222
- }