---
name: 代码注释
description: 为文件与函数生成规范注释：补全 L3 文件头与 JSDoc（含参数、返回值、异常、@since 时间）。当需要补全/规范注释或对接文档系统时调用。
---

# 代码注释规范与模板

本 Skill 用于在现有代码中系统性地补充与规范注释，覆盖文件级 L3 头部与函数/方法的 JSDoc，确保与项目规则一致并包含时间信息。

## 适用范围
- TS/JS 源码文件（.ts/.js/.d.ts）
- Vue 组件脚本（<script setup lang="ts"> 或普通 `<script lang="ts">`）
- API 模块、工具函数、Pinia Store、路由/指令等文件

## 总体要求
- 所有函数、箭头函数、类方法必须有 JSDoc，并包含：
  - @param（逐个参数说明）
  - @returns（返回值类型与语义）
  - @throws（可能抛出的异常类型/场景）
  - @since（创建/最近修改时间，使用当前本地时间，格式：YYYY-MM-DD HH:mm:ss）
- 变量需有说明性注释（单行 // 或上方块注释），解释用途或约束。
- 文件需包含 L3 头部注释，保持与实际代码一致，且补充时间信息。
- 严格遵循工作区规则：可选链/空值合并、类型显式声明、ElMessage/ElMessageBox 不手动 import。

## 文件头（L3）模板
将以下块置于每个源文件顶部，并按实际情况填写。请在最后一行追加当前时间。

```
/**
 * [INPUT]: 依赖 {哪些模块/文件} 的 {什么功能}
 * [OUTPUT]: 对外提供 {函数/组件/类型/变量}
 * [POS]: {属于哪个模块} 的 {角色}，{与其他文件的关系}
 * [PROTOCOL]: 变更时更新此头部，然后检查 CLAUDE.md
 * [TIME]: {YYYY-MM-DD HH:mm:ss}
 */
```

## 函数 JSDoc 模板（TypeScript）
在新增或修改函数时，统一使用如下样式，并据实完善说明。时间为当前本地时间。

```ts
/**
 * 计算订单价格（含折扣与税费）。
 * @param {number} subtotal - 小计金额，必须为非负数。
 * @param {number} discountRate - 折扣比例，范围 0~1。
 * @param {number} taxRate - 税率，范围 0~1。
 * @returns {number} 最终应付金额，向下取两位小数。
 * @throws {TypeError} 当参数为 NaN 或不在有效范围时抛出。
 * @since 2026-03-09 00:00:00
 */
export const calcTotal = (subtotal: number, discountRate: number, taxRate: number): number => {
    // 小计金额（非负）
    const base: number = Math.max(0, subtotal);
    // 折扣后金额
    const afterDiscount: number = base * (1 - Math.min(Math.max(discountRate, 0), 1));
    // 含税金额
    const withTax: number = afterDiscount * (1 + Math.min(Math.max(taxRate, 0), 1));
    // 两位小数
    return Math.floor(withTax * 100) / 100;
};
```

## Vue 组件方法 JSDoc 示例
```ts
/**
 * 提交表单，包含前置校验与错误捕获。
 * @param {HTMLFormElement | null} formEl - 表单实例引用。
 * @returns {Promise<void>} 无返回值，成功后触发提示。
 * @throws {Error} 提交失败时抛出原始错误。
 * @since 2026-03-09 00:00:00
 */
const submitForm = async (formEl: HTMLFormElement | null): Promise<void> => {
    if (!formEl) throw new Error('表单不存在');
    try {
        // ... 业务提交逻辑
        ElMessage.success('提交成功');
    } catch (err) {
        ElMessage.error('提交失败');
        throw err as Error;
    }
};
```

## 变量注释规范
- 使用清晰命名并补充注释解释用途、单位、取值范围或约束。
- 建议将关键变量的注释置于上一行；简单变量可使用行尾注释。

```ts
// 列表加载状态：用于禁用按钮与展示骨架屏
const loading: boolean = false;

const PAGE_SIZE_DEFAULT = 20; // 默认分页大小
```

## 执行步骤（生成策略）
1. 打开文件：若缺失 L3 头部则添加；若存在则对齐实际依赖与输出并补充 [TIME]。
2. 检查所有导出函数与内部复杂函数：
   - 无 JSDoc → 按模板创建并填写；
   - 已有 JSDoc → 校正缺失项（参数/返回/异常/时间）。
3. Vue 文件仅在 `<script>` 内处理函数注释，避免污染模板与样式段落。
4. 遵循 TypeScript 显式类型与异常处理最佳实践，新增 `@throws` 对应的 try-catch 或参数校验。
5. 变量逐一补充注释，优先关注导出常量、复杂对象、关键状态。

## 校验清单
- [ ] 文件顶端存在 L3 头部且包含 [TIME] 当前时间
- [ ] 所有函数/方法具备完整 JSDoc（@param/@returns/@throws/@since）
- [ ] 重要变量均有注释说明
- [ ] 不新增 `any`，类型定义明确
- [ ] 未手动导入 ElMessage/ElMessageBox

## 说明
- 时间字段统一使用本地时间“YYYY-MM-DD HH:mm:ss”，生成时以当前时刻为准。
- 若文件属于模块或被多处引用，需在 L3 中准确填写 POS 与 INPUT/OUTPUT，保持与 CLAUDE.md 同步。
