用途
create-changeset 用于在 monorepo 中自动分析分支变更,并为包发布创建合适的 changeset 文件。它会检查 git 历史、根据 Conventional Commits 判断版本号升级类型,并生成格式正确的 changeset 文件。
主要能力
- 检查当前分支状态:执行
git log main..HEAD(或origin/main..HEAD)查看已提交的变更;若无提交则提前退出。 - 分析变更:使用
git diff main...HEAD(或origin/main...HEAD)分析已提交的变更,检查packages/*/下受影响的包,并通过git log main..HEAD --oneline(或origin/main..HEAD)查看提交信息。 - 判断版本升级类型:按 Conventional Commits 1.0.0 格式分析提交信息。
- major:提交正文包含 BREAKING CHANGE,或代码中发现破坏性变更(API 签名变更、移除导出或功能、不兼容的行为变更)。
- minor:以
feat:或feat(scope):开头的新功能(向后兼容),如新组件或功能、带默认值的新 props 或选项、新导出。 - patch:以
fix:或fix(scope):开头的缺陷修复与小幅改进,如 bug 修复、性能改进、小幅样式更新。 - skip:其他类型(
chore:、docs:、ci:、test:)通常不需要 changeset,除非它们影响包功能。 - 在 minor 与 patch 之间拿不准时,出于安全优先选择 patch。若版本升级类型含糊不清,则向用户询问澄清、解释建议理由,并允许用户覆盖建议。
- 生成 changeset:在
.changeset/目录创建具有描述性文件名的 changeset 文件(kebab-case 加.md扩展名,例如.changeset/add-new-button.md、.changeset/fix-layout-bug.md、.changeset/update-icon-props.md)。文件内容格式包括 frontmatter 中的包名与升级类型,以及变更的清晰描述。描述应对用户友好,因为它将出现在 CHANGELOG 中。使用与提交信息相同的语言(日语或英语);若提交信息混杂,优先使用日语。当同一个包存在不同目的的变更(例如新功能加 bug 修复、破坏性变更加内部重构)时,拆分为多个独立的 changeset 文件,以便在发布说明中生成独立的顶层条目。 - 校验 changeset:执行
pnpm textlint .changeset/<filename>.md验证文件。若出现 lint 错误,尝试自动修复常见问题(空格与标点、常见语法错误),修复后重新运行 textlint。若错误持续存在,向用户显示错误详情并请求指导;在 lint 通过之前不要提交。 - 验证并提交:展示生成的文件路径与内容,确认其准确反映变更后,执行
git add .changeset/<filename>.md与git commit -m "chore: add changeset"。
使用方式
在以下情况自动调用该技能:用户准备创建 pull request;用户提到 "PR"、"pull request" 或 "ready for review";分支有提交可供审查;用户明确提到 "changeset" 或 "version bump"。
在以下情况不要调用:用户只是推送变更而未创建 PR;仅文档文件(README、.md 文件)发生变更;仅 CI/CD 配置(.github/workflows/)发生变更;仅开发工具配置(eslint、prettier 等)发生变更;提交仅为 docs:、chore:、ci: 或 test: 类型且不影响包。
执行前校验:在创建 changeset 之前,检查当前变更是否已存在 changeset 文件。查找 .changeset/*.md 文件(排除 README.md)。若已存在,询问用户:"A changeset already exists. Create another one?"
适用场景
适用于该 monorepo 中准备 Pull Request、分支有提交待审查、需要进行包版本发布时。
限制
- 仅在检测到符合条件的提交时创建 changeset;无提交、或提交均为不影响包的类型时提前退出。
- 需要遵循 Conventional Commits 提交规范才能准确判断版本升级类型。
- 需要 textlint 校验通过才能提交。