diff --git a/AGENTS.md b/AGENTS.md index e8a8c01f..a1690745 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ - 文档:开始开发前,请先查看公开开发指南 `docs/cn/contributing/development.md`。如果工作区存在 `.docs/`,再查看 `./.docs/README.md` 并阅读与当前需求相关的文档;`.docs/` 是可选的个人或团队私有开发上下文,可用于维护任务、决策、AI 协作记忆和临时规划,公开文档与公开 PR 不应依赖 `.docs/` 才能理解。 - 目标:用最小改动快速交付正确、可维护、可回归的业务结果 -- 每次完成任务后,对产生修改的文件进行类型检查、lint检查和format格式化,指定修改的文件路径去执行,确保代码质量 +- 每次完成任务后,按修改文件的类型和改动范围执行适用的类型检查、lint 和 format;lint 和 format 优先指定修改文件,类型检查按相关项目执行。具体命令见“命令与验证”。 - 在执行检查时,如果有其他与本次修改无关的报错,也需要一并修复 ## 实现原则 @@ -17,7 +17,7 @@ - 处理外部 review、bug 报告或架构建议时,必须先核对代码事实,再决定接受或反驳;不要因为 reviewer 表达确定就直接改代码 - 判断问题是否成立时,至少阅读相关函数、调用方、被调用方、相邻测试和现有文档;不能只看 diff 或单行评论 - 如果涉及依赖、框架、OpenAI/LLM SDK、数据库、打包发布等外部行为,应优先查官方文档、源码或类型定义,不凭记忆判断 -- 结论必须包含证据:涉及的文件/函数、当前行为、风险、建议修复方式,以及已运行或应运行的验证 +- 审查结论必须说明涉及的文件/函数、当前行为和判断依据;问题成立时,补充用户影响、建议修复方式,以及已运行或应运行的验证。 - 评估异步、并发、缓存、性能、外部依赖或资源异常问题时,必须证明完整因果链和现实可达性;不能只凭 Promise 理论上可永久 pending、竞态在抽象状态中存在或极端环境可能失败,就判定为严重 Bug - 严重度应同时考虑触发概率、用户影响和可恢复性,高影响后果不能单独替代可达性证据;如果前置异常与后续有害操作共享同一故障域,必须解释为什么前者失败或阻塞时后者仍能成功 - 多轮 AI review 应按根因和关键假设聚合;若新评论只是把同一未证实假设传播到另一个下游,且没有新的独立代码或运行时证据,默认降低优先级并停止无限追深 @@ -44,7 +44,7 @@ - 必须新增:修复真实的行为 Bug,或修改用户数据、数据库迁移、导入解析、去重、权限认证、配置/API Key 迁移、公开 API、跨端共享 service 等高风险逻辑时,应优先补充能在修改前失败的回归测试。已有测试完整覆盖时不重复新增。 - 通常不新增:文案、样式、类型、日志、注释、文档、常量、简单 getter、文件列表和无行为变化的重构。只运行相关类型检查、lint、format、构建或现有测试。 - 避免机械测试:不要通过扫描源码字符串、匹配完整 SQL、断言私有函数调用顺序、锁定日志文案或枚举每个常量来证明功能正确。Mock 调用次数只用于 adapter 的参数传递或权限边界,不用于锁定内部实现。 -- 提高信息密度:同一规则的多个输入优先使用表驱动测试或通用断言;下层已覆盖算法时,上层只验证调用链和返回契约。修改相关模块时,应搜索并合并或删除重复、过期和低价值测试。 +- 提高信息密度:同一规则的多个输入优先使用表驱动测试或通用断言;下层已覆盖算法时,上层只验证调用链和返回契约。修改相关模块时,检查受影响的测试;发现与本次变更直接相关的重复、过期或低价值用例时,再合并或删除。 - 测试分层:纯函数和参数规范化使用单元测试;SQL、迁移、导入写库、Fastify route 和跨包 service 优先使用轻量真实依赖或临时数据库;真实 Electron、浏览器、LLM 和网络只用于少量显式启用的 Smoke/E2E。 - 测试位置:模块单元测试放在被测文件附近;跨模块、集成、E2E 和测试工具放在根目录 `tests/` 或对应 app/package 的既有测试目录。 - Review 判断:缺少测试本身通常不是严重 Bug。Reviewer 必须指出具体未覆盖的用户风险;只有数据安全、迁移、权限、公开契约等高风险行为缺少必要验证时,才应阻塞当前 PR。 @@ -53,8 +53,8 @@ - 类型检查:Node/CLI/Electron 主进程相关改动运行 `pnpm run type-check:node`;前端/Vue 相关改动运行 `pnpm run type-check:web`;跨端或发布前改动运行 `pnpm run type-check:all` - Lint:优先对修改文件运行 `pnpm exec eslint `;需要全量修复时再运行 `pnpm lint` -- Format:优先对修改文件运行 `pnpm exec prettier --write `;大范围格式化才运行 `pnpm format` -- 单元/集成测试:日常默认运行 `pnpm test` 或 `pnpm run test:unit`;优先运行相关测试文件时用 `pnpm test -- path/to/file.test.ts` +- Format:优先对修改文件运行 `pnpm exec prettier --write `;大范围格式化才运行 `pnpm format`。`docs/**/*.md` 被 Prettier 默认忽略,格式化这些文件时使用 `pnpm exec prettier --write --ignore-path .gitignore `。 +- 单元/集成测试:按改动范围优先运行相关测试,使用 `pnpm test -- path/to/file.test.ts`;需要全量回归时运行 `pnpm test` 或 `pnpm run test:unit`。相关测试通过后,仅在新增改动、失败或具体未解决风险需要时,扩大或重复测试。 - 文档:修改公开文档或 VitePress 配置后运行 `pnpm docs:build`;只改 `.docs/` 私有任务文档时不需要构建公开文档站 - E2E/Smoke:`pnpm run test:e2e:launcher`、`pnpm run test:e2e:smoke` 和真实 LLM/真实 Electron/真实网络测试只在相关功能需要时运行,不加入默认 `pnpm test` - 最后检查:提交前运行 `git diff --check`,确认没有空白错误 @@ -87,7 +87,7 @@ ## 安全与发布 - 不得提交真实 API Key、token、用户聊天数据库、个人数据目录、日志、截图或包含隐私的导出文件 -- 修改依赖、lockfile、构建产物、发布脚本、版本号、changelog、npm publish、release 流程时,必须先获得明确确认 +- 修改依赖、lockfile、构建产物、发布脚本、版本号、changelog、npm publish、release 流程时,必须先获得明确确认。用户已在当前对话明确授权相应操作时,无需重复确认。 - 涉及 API Key、auth profile、配置迁移、数据目录迁移和数据库迁移时,必须优先保护已有用户数据,并提供回滚或失败中断策略 ## 提交规范