3.9 KiB
3.9 KiB
环节钩子(Hooks)设计
一、目标
Hooks 用于在特定环节触发特定行为,常见用途:
- 环节离开时做强校验(阻止流程跳转)
- 自动生成/更新辅助产物(如 PlantUML PNG)
- 给出必要提醒(如进入 docs 提示更新 CHANGELOG)
二、触发点与顺序(必须统一)
2.1 触发点
Hooks 只在以下场景触发:
start:视为“进入某个 phase”next-part/back-part:同时发生“离开旧 phase”与“进入新 phase”
next-step/back-step/issue/error 默认不触发 phase hooks(除非后续明确新增需求)。
2.2 顺序(影响提交内容)
为保证“生成物进入同一次提交”,推荐顺序:
- 流程校验(见
validation.md) - 离开旧 phase 的 pre-commit hooks(可能生成/修改文件,失败则阻止跳转)
- Git add/commit(见
git.md) - 写入状态文件(包含本次
git_commit) - 进入新 phase 的 post-commit hooks(提醒类/信息类为主)
若团队选择“先落盘再提交”,必须重新评估:失败边界、生成物提交时机、以及
git_commit的写入方式。
三、Hook 接口约定(伪代码原型)
HookContext:
root: Path
phases: list[str]
from_phase: str | None
to_phase: str
action: str # start/next-part/back-part
summary: str
HookResult:
ok: bool
level: "info" | "warn" | "error"
message: str
约定:
- pre-commit hook 失败(ok=false 且 level=error)必须阻止流程跳转
- warn/info 只允许在“需要用户可见”时输出,且保持简短
四、内置 Hooks 规格
4.1 离开 flow-design:PlantUML 校验与 PNG 生成(pre-commit)
触发:
next-part且from_phase == "flow-design"
目标:
- 校验 PlantUML 语法
- 生成 PNG(若配置启用)
输入约定(建议可配置):
| 配置项(建议) | 默认值(建议) | 说明 |
|---|---|---|
flow.hooks.plantuml.enabled |
true | 是否启用该 hook |
flow.hooks.plantuml.glob |
docs/**/*.puml;docs/**/*.plantuml;discuss/**/*.puml;discuss/**/*.plantuml |
待处理文件范围(分号分隔或列表) |
flow.hooks.plantuml.on_missing_tool |
"warn" |
未安装 plantuml 的处理:warn/error |
flow.hooks.plantuml.generate_png |
true | 是否生成 PNG |
行为约定:
- 若未匹配到任何 PlantUML 文件:静默通过
- 若 plantuml 工具缺失:
on_missing_tool=warn:输出一次⚠提示并通过on_missing_tool=error:失败并阻止跳转
- 若语法校验失败:失败并阻止跳转(输出指出具体文件)
4.2 进入 docs:提醒更新 CHANGELOG(post-commit)
触发:
next-part且to_phase == "docs"
行为约定:
- 输出一次
→ 请更新 CHANGELOG.md(保持一句话) - 不影响状态推进与提交
4.3 离开 docs:校验 CHANGELOG 已更新(pre-commit)
触发:
next-part且from_phase == "docs"
校验目标:
- 确保在 docs 阶段,至少有一次提交包含
CHANGELOG.md的改动
推荐实现判定(不引入额外状态字段):
- 从状态历史中找出
phase == "docs"且git_commit非空的条目集合 - 遍历这些提交,判断是否有任意一次提交包含
CHANGELOG.md
降级处理:
- 若 Git 集成未启用/不可用:至少校验
CHANGELOG.md文件存在,否则失败或警告(建议可配置)
配置项(建议):
| 配置项(建议) | 默认值(建议) | 说明 |
|---|---|---|
flow.hooks.changelog.path |
CHANGELOG.md |
changelog 路径 |
flow.hooks.changelog.required |
true | 离开 docs 时是否硬失败 |
五、Hook 失败的对外表现
- 校验类 hook 失败:输出
✗+ 简短原因 + 下一步建议(例如“请先修复 PlantUML 语法”) - 返回退出码 1
- 不推进环节,不产生提交(保持原子性)