@routerhub/agent-rules 1.5.90 → 1.5.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.base.md CHANGED
@@ -52,6 +52,30 @@
52
52
  - 值传递优先,软删除用 `gorm.DeletedAt`(禁止 `*time.Time`)。
53
53
  - 禁止无条件执行 GORM AutoMigrate,必须由开关控制,默认关闭。
54
54
 
55
+ ## ⚠️ 数据库 DELETE 铁律(最高级别,所有写操作前必检)
56
+
57
+ - ⚠️ **DELETE 是数据库中唯一不可逆的写操作**(INSERT 可以删、UPDATE 可以回改,DELETE 执行后数据消失,只有备份能救)。因此 DELETE 的每一条都必须经过严格的「副作用范围检查」:
58
+
59
+ **副作用范围必须 ≤ 用户显式意图范围。**
60
+
61
+ 也就是说:如果用户删了 A,代码只能删 A,绝不能顺便把 B、C、D 也删了。
62
+
63
+ - ⚠️ **每写一条 DELETE 语句,必须能在注释中回答以下三个问题**:
64
+ 1. **删什么?** 精确到表名和筛选条件
65
+ 2. **为什么在这里删?** 业务场景是什么(用户点了哪个按钮/执行了什么操作)
66
+ 3. **最多影响多少行?** 如果用户操作 1 条记录,这条 DELETE 最多删几行?答案 ≠ 1 时,逻辑大概率有缺陷
67
+
68
+ - ⚠️ **写路径禁止「全量同步」语义**。典型的错误模式:
69
+ ```sql
70
+ -- ❌ 危险:用「当前这次操作的数据」作为基准去删掉所有其他数据
71
+ DELETE FROM t WHERE id NOT IN (本次操作涉及的一条/几条id)
72
+
73
+ -- ✅ 安全:删除用户显式标记为「已删除」的记录
74
+ DELETE FROM t WHERE status = 'deleted' AND deleted_by = 当前用户
75
+ ```
76
+
77
+ - ⚠️ **清理过期数据/元数据时,DELETE 条件必须精确到「过期标记」字段**(如 `expired_at < NOW()`),不能依赖「不在某个列表中」这种间接条件。
78
+
55
79
  ## 禁止项
56
80
 
57
81
  - ⚠️ AI 禁止自动执行格式化命令(`npm run format`、`prettier` 等)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@routerhub/agent-rules",
3
- "version": "1.5.90",
3
+ "version": "1.5.91",
4
4
  "description": "Shared Copilot agent rules and guidelines for RouterHub projects",
5
5
  "main": "AGENTS.base.md",
6
6
  "bin": {
package/rules/global.md CHANGED
@@ -52,6 +52,30 @@ name: "通用规则"
52
52
  - 值传递优先,软删除用 `gorm.DeletedAt`(禁止 `*time.Time`)。
53
53
  - 禁止无条件执行 GORM AutoMigrate,必须由开关控制,默认关闭。
54
54
 
55
+ ## ⚠️ 数据库 DELETE 铁律(最高级别,所有写操作前必检)
56
+
57
+ - ⚠️ **DELETE 是数据库中唯一不可逆的写操作**(INSERT 可以删、UPDATE 可以回改,DELETE 执行后数据消失,只有备份能救)。因此 DELETE 的每一条都必须经过严格的「副作用范围检查」:
58
+
59
+ **副作用范围必须 ≤ 用户显式意图范围。**
60
+
61
+ 也就是说:如果用户删了 A,代码只能删 A,绝不能顺便把 B、C、D 也删了。
62
+
63
+ - ⚠️ **每写一条 DELETE 语句,必须能在注释中回答以下三个问题**:
64
+ 1. **删什么?** 精确到表名和筛选条件
65
+ 2. **为什么在这里删?** 业务场景是什么(用户点了哪个按钮/执行了什么操作)
66
+ 3. **最多影响多少行?** 如果用户操作 1 条记录,这条 DELETE 最多删几行?答案 ≠ 1 时,逻辑大概率有缺陷
67
+
68
+ - ⚠️ **写路径禁止「全量同步」语义**。典型的错误模式:
69
+ ```sql
70
+ -- ❌ 危险:用「当前这次操作的数据」作为基准去删掉所有其他数据
71
+ DELETE FROM t WHERE id NOT IN (本次操作涉及的一条/几条id)
72
+
73
+ -- ✅ 安全:删除用户显式标记为「已删除」的记录
74
+ DELETE FROM t WHERE status = 'deleted' AND deleted_by = 当前用户
75
+ ```
76
+
77
+ - ⚠️ **清理过期数据/元数据时,DELETE 条件必须精确到「过期标记」字段**(如 `expired_at < NOW()`),不能依赖「不在某个列表中」这种间接条件。
78
+
55
79
  ## 禁止项
56
80
 
57
81
  - ⚠️ AI 禁止自动执行格式化命令(`npm run format`、`prettier` 等)。