关于 bagisto-code-review
用于审查 Bagisto 代码变更的技能,重点关注自动检查可能遗漏的问题。它按正确性、安全性和架构问题排序,并提供验证及报告发现的流程。
主要功能
- 01按优先级检查正确性
- 02安全审查指引
- 03架构问题检查清单
- 04端到端追踪变更
- 05具体问题报告格式
适用场景
- 01审查 Bagisto 拉取请求
- 02查找自动化测试遗漏的问题
- 03撰写可执行的审查发现
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ bagisto/ agent-skills --skill bagisto-code-review安装后在 Claude Code 中输入/bagisto-code-review确认已加载。
详细介绍
代码审查
审查 Bagisto 变更时需要关注的事项,按重要程度排序,让最重要的问题先浮现。Pint 和测试套件已经能判断机械性问题——把审查精力放在它们看不到的地方。
工具已经覆盖的内容
不要花审查精力检查以下内容;运行相应工具即可。
| 检查工具 | 覆盖内容 |
|---|---|
vendor/bin/pint --test | 格式、空格、导入顺序、尾随逗号 |
vendor/bin/pest | 测试套件断言的行为 |
php artisan bagisto:translations:check | 23 种语言环境中缺失的键 |
| Playwright | 浏览器层 |
如果一条审查意见本可以由退出码给出,解决方法就是运行工具,而不是写下这条意见。
阻塞合并的问题
以下问题未解决时,不应合并变更。
正确性
- 在循环中执行查询,或因缺少预加载而产生 N+1 查询。在种子数据上看不出成本,到了真实商品目录中就会显现。
- 对持续增长的表执行不受限制的
->get(),例如商品、订单、客户表。请分页或分块处理。 - 仓储方法访问卖家或客户拥有的行,却没有按所有者限定范围。
- 通过插入请求值构建原始 SQL 片段(
whereRaw、selectRaw、DB::raw、orderByRaw)。
安全性
安全性由 bagisto-coding-standards 技能负责——如果差异涉及授权、渲染输出、输入、上传、原始 SQL、密钥或付款,请加载该技能,并按其检查清单逐项核查,而不是依赖记忆。以下两项涵盖了大多数实际问题:
- 店面查询使用请求中的 id 进行筛选,却没有限定为已通过身份验证的客户。
- DataGrid 闭包将值插入 HTML 属性,却没有使用
e()——标签会为你剥除,但引号不会。
架构
- 在仓储之外使用
DB::或模型查询。唯一获准的例外是 DataGrid 的prepareQueryBuilder()。 - 新建模型却没有对应的 Contract、Model、Proxy 和 Repository。
- 在
bootstrap/providers.php中注册了程序包,却未在config/concord.php中注册,或反之。 - 为扩展功能而编辑核心文件。Marketplace 和 B2B Suite 都绝不允许修改核心文件——这类变更应放在绑定的子类、
view_render_event监听器或 Concord 模型替换中。 - 面向用户的字符串没有通过
trans()处理。
值得提出,但不阻塞合并的问题
- 第三次出现时才算重复。 两次只是巧合;三次就该抽成辅助方法。
- 方法体需要注释才能看懂。 代码库禁止在方法体内添加注释,因此这说明应提取一个命名明确的方法,而不是添加文字说明。
- 变更涉及的文件违反了文档块或成员顺序规范。 触及文件中原本就存在的违规,由作者负责修复。
- 测试断言数量或列表位置。 随着共享数据库增长,两者都会变化;应改为断言指定记录。
- 单条记录路径会触发事件,但批量操作路径不会触发,或反之。
如何审查
- 先阅读测试。 测试说明作者认为变更实现了什么。若修复的 bug 没有对应测试,这是首先要提出的问题。
- 思考什么会让它出错。 对每个断言,寻找能推翻它的输入——空集合、第二种语言环境、访客、非默认渠道。
- 检查反向情况。 撤销修复后仍能通过的回归测试毫无保护作用。若修复不易察觉,请作者展示测试失败的情况。
- 端到端地跟踪一条路径——请求、表单请求、控制器、仓储、模型、视图——而不是逐块阅读差异。大多数实际缺陷都出现在两个各自看似正常的文件之间的衔接处。
- 确认各项检查都已运行,并了解哪些被跳过。
编写问题描述
先说明缺陷,再说明触发缺陷的输入,最后说明修复方法。没有具体故障的问题只是偏好,应标记为偏好。
CategoryRepository::saveMediaAltText()会写入translateOrNew($locale),其中$locale可能是字面值all—— 分类创建表单会提交locale=all。在 MySQL 上,这会静默地创建一条name和slug为空的记录;在 PostgreSQL 上,则会违反 NOT NULL 约束。写入前应将此哨兵值扩展为所有语言区域。
将已验证的内容与推测分开。“这是 N+1”与“这可能是 N+1,我没有检查关联关系”是不同的说法;将两者混为一谈,比如实说明情况更耽误作者时间。
必需的子技能: 在认定任何更改已完成之前,使用 bagisto-change-verification。