| name | ddev-comment-gen |
| description | C 项目注释生成与审查节点。在 ddev-c-pro 编码规范审查通过后,对 .c/.h 文件逐项检查注释完整性并补齐缺失注释。由 ddev-gate 调度,作为 c-pro 之后的独立审查步骤。 |
DDev Comment Gen — C 项目注释审查与生成
在 ddev-c-pro 编码规范审查通过后,由 ddev-gate 拉起独立 subagent 加载本 skill,对代码注释做系统性审查和补全。
定位
- 触发时机:ddev-c-pro 审查
pass 后,ddev-gate 拉起
- 输入:通过 ddev-c-pro 审查的最终代码(
.c / .h)
- 输出:
pass(注释齐全)或 blocked(附缺失项清单 + 补全建议)
- 审查范围:与 ddev-c-pro 审查范围一致的文件集合
审查维度
审查 agent 必须逐文件、逐函数、逐结构体/枚举核验,不得仅凭印象判断。
1. 文件头注释
- 每个
.h 和 .c 文件必须包含 @file + @brief 头注释
@brief 须说明本文件的主要职责,不能仅重复文件名
@brief 只写当前职责,禁止迁移背景、阶段/演进标注("阶段 N""已迁移""已释放""占位/恢复")、方案/验证过程等说明,一律进 commit message
2. 公开 API 函数注释
每个在 .h 中声明的公开函数必须包含完整 Doxygen 注释:
@brief:一句话说明函数做什么
@param:每个参数一个,说明含义、约束(是否可为 NULL、取值范围)
@return:返回值含义(无返回值写"无"或"void")
@note / @warning / @see:按需添加
module_status_t module_init(const module_cfg_t *cfg);
3. 结构体与枚举注释
- 每个
struct / union 定义必须有 @brief 说明用途
- 每个结构体成员必须有
/**< 说明 */ 行内注释
- 每个
enum 必须有 @brief 说明枚举用途
- 枚举值有非直观含义时必须加
/**< 说明 */ 行内注释
typedef struct {
uint32_t baud;
volatile bool running;
uint8_t rx_buf[256];
} module_t;
typedef enum {
MODULE_OK = 0,
MODULE_ERR_INVALID_ARG,
MODULE_ERR_TIMEOUT,
} module_status_t;
4. 私有函数注释
static 函数不强制 Doxygen 格式,但复杂逻辑必须说明意图
- 超过 30 行的
static 函数建议添加简要块注释说明职责
5. 关键逻辑注释
- 非直观算法、状态机切换、边界条件处理须有少量行内注释
- 注释解释"为什么这样做",不重复代码本身
- 中断回调、错误恢复路径、硬件 workaround 必须有注释说明
6. 注释一致性
- 注释内容必须与实际代码行为一致
- 修改函数签名时必须同步更新注释
- 修改函数行为时必须同步更新注释
7. 注释语言
- 注释必须使用中文。本项目注释以中文为准,禁止英文注释(除专用术语、寄存器名、宏名、结构体/函数名等代码标识符外)
- Doxygen 标签(
@brief / @param / @return 等)保持英文标签本身,描述内容用中文
- 行内注释
/**< */ 内容用中文
- 若文件历史中有英文注释,本次改动范围内必须改为中文
8. 注释简洁性(Anti-Verbosity)
注释补充代码不可见的信息(为什么 / 约束 / 并发语义),不是复述代码本身。缺失注释与注释过密同为缺陷,双向核验:
- 名可自释不注释:字段、函数名已充分表达语义时,允许无注释或单行注释,不强制"每个成员必须有注释"
- 单条注释 ≤ 1 行:字段、宏、枚举值的行内注释超过 1 行视为冗余(复杂并发协议、硬件 workaround 除外,说明放函数文档)
- 逻辑块注释 ≤ 2 行:行内
/* */ 逻辑注释最多 2 行(What + 必要一句 Why);方案背景、验证过程、替代方案、历史原因等说明写 commit message,不进代码注释;超过 2 行即冗余
- 不复述代码:注释不得复述可见信息——"锁内提交""跨线程""读取并清零"等若在函数名、lock/unlock 调用、变量名中可见,不写入注释
- 同一语义只写一次:在唯一权威位置说明(函数文档),调用点 / 字段用指针引用(如"见 ble_request_*()"),不重复展开
- static 函数不贴 Doxygen:
static 辅助函数不强制 @brief/@param/@return;仅复杂逻辑加 2~3 行块注释说明意图
- 调试/追溯标签不进注释:
[P1_XXX] 等打点日志标签、迭代追溯标签不得进入注释正文(仓库统一约定除外)
- 背景/演进内容不进注释(全注释类型):迁移背景、阶段/演进标注("阶段 N""已迁移""已释放""占位/恢复")、方案/实验/验证过程、历史原因等说明一律写 commit message,任何代码注释都不得包含——含文件头
@brief、常量移除处、字段/成员注释、逻辑块注释。反例:文件头 @brief 只写当前职责,不写迁移史;常量移除处不写背景说明(直接删除即可,必要时只写"见 commit XXXX")
- 冗余判据:单处冗余计 1 项;累计 ≥ 3 处 →
blocked,1~2 处列为建议项
注释规范
- 使用简洁中文描述"做了什么 + 为什么/约束",宁缺毋滥:名可自释者不注释,同一语义只写一次
- 使用项目统一的 Doxygen 风格(
/** */ 或 ///)
- 常用 Doxygen 标签:
@brief / @param / @return / @note / @warning / @see / @todo / @retval
审查流程
- 遍历所有目标
.h 文件,逐一检查文件头、公开函数、结构体、枚举的注释完整性
- 遍历所有目标
.c 文件,逐一检查文件头、私有函数的注释完整性
- 检查关键逻辑(中断 ISR、错误恢复、状态机、复杂算法)的注释覆盖
- 检查注释语言是否使用中文(专有术语、标识符除外)
- 检查注释简洁性(维度 8):名可自释却硬补注释、单条超 1 行、逻辑块注释超 2 行、复述代码、static 贴 Doxygen、调试标签进注释,以及文件头
@brief/常量移除处/字段成员处的迁移背景与阶段/演进标注("阶段 N""已迁移""已释放""占位/恢复")和方案/验证过程说明等
- 缺失项与冗余项分别记录(文件:行号 + 类型 + 描述 + 处理建议文本)
- 全部通过 →
pass;任一缺失,或冗余项累计 ≥ 3 → blocked + 附清单
审查结论格式
ddev-comment-gen 审查结论:[pass | blocked]
若 blocked,清单:
- module.h:42 — [缺失] module_init 缺少 @param cfg 注释
- module.c:10 — [缺失] 缺少 @file 头注释
- module.h:25 — [缺失] module_cfg_t 结构体缺少 @brief,成员 baud 缺少行内注释
- module.c:88 — [缺失] ISR 回调缺少说明注释
- module.c:60 — [冗余] 字段注释 3 行复述锁逻辑,字段名已自释,压到 ≤1 行
- module.c:120 — [冗余] static 辅助函数贴完整 Doxygen,应降为 2~3 行块注释
- module.c:88 — [冗余] 逻辑块注释 5 行含方案背景与验证过程,压到 ≤2 行,背景进 commit message
- prt_z5_cfg.h:432 — [冗余] 常量移除处写"补光灯控制权已迁移小核"迁移背景,应删除该注释,背景进 commit message
- prt_light.c:1 — [冗余] 文件头 @brief 含"阶段 2:torch 恢复真实下发""控制权已迁移"演进标注,@brief 只保留当前职责,迁移史进 commit message
审查模式
当本 skill 被 ddev-gate 作为注释审查子代理加载时,必须使用 reviewer-prompt.md 作为任务模板执行审查。该模板定义了审查输入、审查维度优先级、CodeGraph 辅助查询方法和输出格式。
进度记录
审查完成后将结果写入项目根目录的 progress.md:
- 通过:记录"comment-gen 审查通过",附检查项通过数/总项数
- 阻塞:记录"comment-gen 审查发现 N 个阻塞项",逐项列出文件:行号 + 问题描述
- 追加时间戳和审查结论到最近一次执行日志后