--- name: release-changelog-update description: >- 依据目标库/模块既有 CHANGELOG.md 版式,从上一版日期到当前用 git 收集该库根路径下 提交(含完整 commit message 正文),去重合并后撰写专业变更条目;与项目发版版本 配置对齐。在用户要求更新 CHANGELOG、发版说明、模块变更记录或同步某子库 Change Log 时使用。 disable-model-invocation: true --- # 发版 CHANGELOG 更新 ## 适用范围 - 目标为**库根目录**(或子模块根目录)下的 `CHANGELOG.md`;若源码分布在多个子目录但共用同一份 CHANGELOG,则以**该 CHANGELOG 所在目录为库根**,git 范围覆盖所有属于该库的源码路径。 - **不得臆造版式**:先 Read 目标文件顶部若干版本块,**严格沿用**该文件既有「Change Log」标题、下划线、`Version` 行、分隔线长度、条目前缀与历史语气。 ## 文件版式(与现有一致) ```markdown Change Log ========== Version <版本字符串> *(yyyy-MM-dd)* ---------------------------- * `[标签]` 中文说明(可含英文类名、方法名,与同文件历史条目一致) ``` - **标签**:只使用**该文件或同仓库其它 CHANGELOG 中已出现过的**标签,例如 `` `[Add]` ``、`` `[Delete]` ``、`` `[Update]` ``、`` `[Refactor]` ``、`` `[Move]` ``、`` `[Feature]` ``、`` `[Build]` ``、`` `[Chore]` ``、`` `[Upgrade]` ``、`` `[Fix]` ``、`` `[Merge]` ``、`` `[Remove]` ``、`` `[Perf]` ``、`` `[Style]` ``、`` `[sync]` `` 等;**禁止**自造未在仓库中出现过的标签缩写。 - **一条一事**:同类改动合并为一条;**禁止**把每个 commit 机械抄成一条;语义重复的条目合并后只保留一条表述。 ## 新版本号 1. **默认以发版为准**:新版本字符串以**项目约定的发版版本源**为准(如 Gradle/Maven/npm 等模块版本字段,与对外发布号一致)。用户或发版流程**另有指定**时以指定为准。 2. **CHANGELOG 与发版配置不同步**(例如 CHANGELOG 仍为 `2.5.1-2` 而版本配置已为 `2.5.2`):写入 CHANGELOG 的 `Version` 必须与**本次对外发布版本**一致;若仅文档滞后,应**对齐当前发版配置中的值**并在同次提交中避免长期分叉。 3. **带连字符后缀的版本**(如 `2.5.1-2`):下一版以维护者与发版版本源为准,**不臆造** semver;常见情况是下一正式补丁版为 `2.5.2`、`2.5.3` 等,以发版配置为准。 4. **日期**:`*(yyyy-MM-dd)*` 使用**写入当天**(对话中 authoritative date)或用户指定的**发版日**。 ## 变更时间窗与 git 范围 1. **时间基准**:读取 CHANGELOG **最上方已发布版本**的 `Version … *(yyyy-MM-dd)*`,取其中日期作为「上一版发布日」。 2. **收集区间**:从该日期的 **00:00** 起至**当前**(以归纳时的仓库 `HEAD` 与对话日期为准),落在该**库根目录**下的改动;以 **git 事实** 为准,禁止写入未触及该路径的条目。 3. **当日边界**:若上一版当日仍有后续提交、或与「更新 CHANGELOG 的 commit」重复,可改用 `--after="yyyy-MM-dd"` 或定位「写入上一版 CHANGELOG 的 commit」之后继续 `git log`,减少重复;默认 `--since="yyyy-MM-dd"` 与用户约定一致即可。 ## 必须使用「完整」commit message(勿只看第一行) **禁止**仅用 `git log` 的 subject(`%s`)作为唯一依据;正文(body)、多段落说明、列表同样参与归纳。 推荐在库根路径下执行(将日期、路径替换为实际值;`PATH` 为库目录,如 `<库根>/`): ```bash # 完整提交说明:%B = subject + body(含空行与多段) git log --since="yyyy-MM-dd" --pretty=format:"%h%n%B%n----COMMIT----" -- PATH # 需要作者日期辅助核对时(仍含完整 %B) git log --since="yyyy-MM-dd" --pretty=format:"%h %ad%n%B%n----COMMIT----" --date=short -- PATH ``` - **Merge commit**:若 `--no-merges` 后信息量足够,可忽略 merge 噪声;若重要合并说明仅在 merge message 中,则保留并去重其与子提交的重复表述。 - **多路径库**:`--` 后写多个路径,或分路径 `git log` 后**合并同一主题的 commit**,条目仍按「一条一事」归纳。 ## 归纳、去重与文案 1. **通读**:按时间或逆序阅读每个 commit 的**完整 `%B`**(含 body、续行、列表)。 2. **去重**:同一问题多次提交、revert 再修、相同类名/方法名反复出现 → 合并为**一条**用户向说明;**忽略**完全重复的句子或同一改动的 cherry-pick 副本。 3. **映射标签**:按真实语义选 `[Fix]`/`[Add]`/`[Refactor]` 等,与同文件历史用法一致;不确定时优先与同库近期条目风格一致。 4. **专业准确**:技术事实与类/方法/模块名与仓库一致;说明用**简短中文**,必要时保留英文标识符。 5. **插入位置**:新版本块插在 `==========` **之后**、**上一版 `Version` 块之前**(全文从新到旧)。 ## 变更很少或几乎无实质改动时 - **不得编造**未发生的 API/功能说明。 - **参照该库 CHANGELOG 历史**:许多子库在仅依赖升级或同步发版时会写 `` `[Chore]` 依赖 xxx 库同步升级 ``(或对应依赖库名),句式与同文件历史**保持一致**。 - 若区间内**确无**落在该路径的提交:向用户说明「无新 commit 可记」;若发版流程仍需新版本号与日期,可仅更新 `Version` 行与一条与历史一致的 `[Chore]`(须与发版配置/实际依赖变更一致,**不得**虚构依赖升级)。 ## 版本号来源(与库根对应) 1. 优先使用用户指定的版本字符串或**发版版本配置文件**中的对应模块字段(Gradle `versionName`/`version`、Maven `version`、npm `version` 等)。 2. 若用户未指明路径,在工作区内检索与目标模块/库名相关的版本声明(模块构建脚本、根版本清单、CI 发版变量等),**不得臆造**版本键名或版本号。 3. 写入 CHANGELOG 的 `Version` 必须与**本次对外发布版本**一致;多子模块各自 CHANGELOG 时,每条记录对**其库根**的版本源,勿混用其它模块版本。 ## 执行清单 - [ ] Read 目标 `CHANGELOG.md` 顶部 **2~3 个版本块**,确认标题、标签、句式。 - [ ] 解析上一版 `Version … *(yyyy-MM-dd)*` 与即将写入的新版本(对照发版版本源或用户指定)。 - [ ] 对该库路径执行 `git log`,**格式含完整 `%B`**,必要时配合 `git diff`/`git show` 核对事实。 - [ ] 合并去重后撰写条目;少变更时对齐历史 `[Chore]` 等写法。 - [ ] 在文件顶部插入新版本块,不破坏下方历史结构。