#!/usr/bin/env node import { execSync } from 'node:child_process' import fs from 'node:fs' const run = (cmd) => execSync(cmd, { stdio: 'inherit' }) const out = (cmd) => execSync(cmd).toString().trim() console.log('\n🚀 发布流程开始...\n') // 1) 检查 Git 工作区是否干净 if (out('git status --porcelain')) { console.error('❌ Git 工作区有未提交的改动,请先提交后再发版!\n') process.exit(1) } // 2) 动态导入 inquirer const inquirer = (await import('inquirer')).default // 3) 选择版本类型 const { releaseType } = await inquirer.prompt([ { type: 'list', name: 'releaseType', message: '请选择版本类型:', choices: [ { name: '补丁版本 (patch)', value: 'patch' }, { name: '次版本 (minor)', value: 'minor' }, { name: '主版本 (major)', value: 'major' }, ], }, ]) // 4) 是否全量生成 changelog const { changelogMode } = await inquirer.prompt([ { type: 'list', name: 'changelogMode', message: '生成 CHANGELOG 模式:', choices: [ { name: '只追加自上次发布以来的日志 (推荐)', value: 'append' }, { name: '重新生成完整历史日志 (谨慎)', value: 'full' }, ], default: 'append', }, ]) // 5) 升级版本号 run(`npm version ${releaseType} -m "new version published: v%s"`) // 6) 生成或更新 CHANGELOG try { let cmd if (changelogMode === 'full') { cmd = 'npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0' } else { if (!fs.existsSync('CHANGELOG.md')) { console.log('📄 未检测到 CHANGELOG.md,正在初始化...') cmd = 'npx conventional-changelog -p angular -i CHANGELOG.md -s -r 0' } else { cmd = 'npx conventional-changelog -p angular -i CHANGELOG.md -s' } } run(cmd) // 提交 CHANGELOG if (/CHANGELOG\.md/.test(out('git status --porcelain'))) { run('git add CHANGELOG.md') run('git commit -m "docs: update changelog"') } } catch { console.warn( '⚠ 生成 changelog 失败:请确认已安装 conventional-changelog-cli(devDependencies)。' ) } // 7) 推送代码与标签 run('git push --follow-tags') console.log('\n🎉 发布完成!\n')