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.
- package/.eslintcache +1 -1
- package/.turbo/turbo-eslint-check.log +5 -4
- package/.turbo/turbo-prettier-check.log +5 -4
- package/.turbo/turbo-test.log +18 -191
- package/.turbo/turbo-ts-check.log +5 -9
- package/dist/cli.js +59 -43
- package/dist/cli.js.map +4 -4
- package/dist/mcp.js +34 -31
- package/dist/mcp.js.map +4 -4
- package/package.json +1 -1
- package/src/commands/config/config.ts +1 -1
- package/src/commands/init/init.ts +17 -6
- package/src/commands/release-create/release-create.ts +210 -130
- package/src/commands/worktrees-add/worktrees-add.ts +16 -12
- package/src/entry/cli.ts +15 -28
- package/src/lib/__tests__/infra-kit-config.test.ts +50 -0
- package/src/lib/infra-kit-config/infra-kit-config.ts +7 -0
- package/src/lib/version-utils/__tests__/next-version.test.ts +128 -23
- package/src/lib/version-utils/index.ts +4 -2
- package/src/lib/version-utils/next-version.ts +64 -25
- package/src/mcp/tools/index.ts +0 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/src/commands/release-create-batch/index.ts +0 -1
- package/src/commands/release-create-batch/release-create-batch.ts +0 -222
|
@@ -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
|
-
}
|