@routerhub/agent-rules 1.5.51 → 1.5.52
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 +50 -1
- package/package.json +1 -1
- package/rules/frontend.md +49 -0
- package/rules/global.md +1 -1
package/AGENTS.base.md
CHANGED
|
@@ -108,7 +108,7 @@ Closes #456
|
|
|
108
108
|
1. 打开 PR 页面,逐一查看 Copilot review 提出的每一条问题。
|
|
109
109
|
2. 逐条判断问题是否有道理:确实存在的代码缺陷、逻辑错误、安全风险、性能问题等 → 必须修复;误报、与需求不符、风格偏好无实质影响等 → 在评论中回复解释为何不改,然后 Resolve。
|
|
110
110
|
3. 对于有道理的问题,直接修改代码、提交并推送到该 PR 分支。
|
|
111
|
-
4.
|
|
111
|
+
4. ⚠️ **强制步骤:修改代码并推送后,必须在 GitHub PR 页面上逐条点击 Resolve conversation。** 此步骤不可跳过——即使已回复评论、已推送修复代码,只要未点 Resolve,该条评论仍处于”未解决”状态,reviewer 无法判断是否已处理完毕。每修复一条,立即 Resolve 一条,不要等所有问题修完再批量操作。
|
|
112
112
|
5. 所有问题处理完毕后,重新请求 Copilot review。
|
|
113
113
|
6. 重复以上步骤,直到 Copilot review 不再提出新问题为止。
|
|
114
114
|
- 每一条 Copilot review 评论处理完毕后,必须点击 **Resolve conversation**,不能只回复不 Resolve。不点 Resolve 会导致该评论一直处于未解决状态,无法判断是否已完成处理。
|
|
@@ -240,6 +240,55 @@ Closes #456
|
|
|
240
240
|
- 用 `console.error` 记录错误(含函数名/模块名上下文),禁止 `console.log` 输出错误。
|
|
241
241
|
- 提交前移除调试日志和临时代码。
|
|
242
242
|
|
|
243
|
+
## Modal 内 Tooltip 规范
|
|
244
|
+
|
|
245
|
+
在 Modal/弹窗内实现 tooltip 时,必须遵守以下规则,避免被 Modal 容器裁剪和消失太快两个问题。
|
|
246
|
+
|
|
247
|
+
### 1. Tooltip 必须用 Portal 渲染到 document.body
|
|
248
|
+
|
|
249
|
+
**问题**:Modal 容器通常有 `overflow: hidden` 或 `overflow-y: auto`,用 CSS `position: absolute/fixed` 的 tooltip 会被裁掉。
|
|
250
|
+
|
|
251
|
+
**解决**:用 React Portal(`createPortal`)把 tooltip 气泡渲染到 `document.body`,完全绕开 Modal 的 overflow 裁剪。
|
|
252
|
+
|
|
253
|
+
- 用 `getBoundingClientRect()` 获取触发元素(`?` 图标)的屏幕坐标
|
|
254
|
+
- 气泡用 `position: fixed` + `transform: translate(...)` 精确定位在触发元素上方
|
|
255
|
+
- `z-index` 至少 10000,确保在所有弹窗层之上
|
|
256
|
+
|
|
257
|
+
### 2. 延迟隐藏 + 气泡可 hover
|
|
258
|
+
|
|
259
|
+
**问题**:鼠标离开触发元素时 tooltip 立即消失,用户来不及把鼠标移到气泡上阅读内容。
|
|
260
|
+
|
|
261
|
+
**解决**:
|
|
262
|
+
- 隐藏加 200ms 延迟(`setTimeout`),给用户反应时间
|
|
263
|
+
- 气泡本身绑定 `onMouseEnter`(取消隐藏定时器)和 `onMouseLeave`(触发同样的延迟隐藏)
|
|
264
|
+
- CSS 上气泡容器必须 `pointer-events: auto`(不能是 `none`),否则鼠标事件不触发
|
|
265
|
+
|
|
266
|
+
### 3. 参考实现
|
|
267
|
+
|
|
268
|
+
实现一个可复用的 `FieldTooltip` 组件,核心结构:
|
|
269
|
+
|
|
270
|
+
```tsx
|
|
271
|
+
import { createPortal } from 'react-dom';
|
|
272
|
+
|
|
273
|
+
function FieldTooltip({ text }: { text: string }) {
|
|
274
|
+
const iconRef = useRef<HTMLSpanElement>(null);
|
|
275
|
+
const hideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
276
|
+
const [visible, setVisible] = useState(false);
|
|
277
|
+
const [pos, setPos] = useState({ top: 0, left: 0 });
|
|
278
|
+
|
|
279
|
+
// show() → 取消定时器 → getBoundingClientRect 更新坐标 → setVisible(true)
|
|
280
|
+
// hide() → 200ms setTimeout → setVisible(false)
|
|
281
|
+
// clearHideTimer() → clearTimeout
|
|
282
|
+
|
|
283
|
+
// ? 图标: onMouseEnter={show} onMouseLeave={hide}
|
|
284
|
+
// Portal 气泡: onMouseEnter={clearHideTimer} onMouseLeave={hide}
|
|
285
|
+
// position: fixed, z-index: 10000, pointer-events: auto
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
- 禁止在 Modal 内用纯 CSS `position: absolute` 的 hover tooltip
|
|
290
|
+
- 写完 tooltip 后必须实际验证:弹窗内滚动时气泡不被裁剪,鼠标能从图标移到气泡上阅读
|
|
291
|
+
|
|
243
292
|
<!-- @domain: go-backend -->
|
|
244
293
|
|
|
245
294
|
## Go 语言规则
|
package/package.json
CHANGED
package/rules/frontend.md
CHANGED
|
@@ -64,3 +64,52 @@ outputName: "frontend"
|
|
|
64
64
|
|
|
65
65
|
- 用 `console.error` 记录错误(含函数名/模块名上下文),禁止 `console.log` 输出错误。
|
|
66
66
|
- 提交前移除调试日志和临时代码。
|
|
67
|
+
|
|
68
|
+
## Modal 内 Tooltip 规范
|
|
69
|
+
|
|
70
|
+
在 Modal/弹窗内实现 tooltip 时,必须遵守以下规则,避免被 Modal 容器裁剪和消失太快两个问题。
|
|
71
|
+
|
|
72
|
+
### 1. Tooltip 必须用 Portal 渲染到 document.body
|
|
73
|
+
|
|
74
|
+
**问题**:Modal 容器通常有 `overflow: hidden` 或 `overflow-y: auto`,用 CSS `position: absolute/fixed` 的 tooltip 会被裁掉。
|
|
75
|
+
|
|
76
|
+
**解决**:用 React Portal(`createPortal`)把 tooltip 气泡渲染到 `document.body`,完全绕开 Modal 的 overflow 裁剪。
|
|
77
|
+
|
|
78
|
+
- 用 `getBoundingClientRect()` 获取触发元素(`?` 图标)的屏幕坐标
|
|
79
|
+
- 气泡用 `position: fixed` + `transform: translate(...)` 精确定位在触发元素上方
|
|
80
|
+
- `z-index` 至少 10000,确保在所有弹窗层之上
|
|
81
|
+
|
|
82
|
+
### 2. 延迟隐藏 + 气泡可 hover
|
|
83
|
+
|
|
84
|
+
**问题**:鼠标离开触发元素时 tooltip 立即消失,用户来不及把鼠标移到气泡上阅读内容。
|
|
85
|
+
|
|
86
|
+
**解决**:
|
|
87
|
+
- 隐藏加 200ms 延迟(`setTimeout`),给用户反应时间
|
|
88
|
+
- 气泡本身绑定 `onMouseEnter`(取消隐藏定时器)和 `onMouseLeave`(触发同样的延迟隐藏)
|
|
89
|
+
- CSS 上气泡容器必须 `pointer-events: auto`(不能是 `none`),否则鼠标事件不触发
|
|
90
|
+
|
|
91
|
+
### 3. 参考实现
|
|
92
|
+
|
|
93
|
+
实现一个可复用的 `FieldTooltip` 组件,核心结构:
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
import { createPortal } from 'react-dom';
|
|
97
|
+
|
|
98
|
+
function FieldTooltip({ text }: { text: string }) {
|
|
99
|
+
const iconRef = useRef<HTMLSpanElement>(null);
|
|
100
|
+
const hideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
101
|
+
const [visible, setVisible] = useState(false);
|
|
102
|
+
const [pos, setPos] = useState({ top: 0, left: 0 });
|
|
103
|
+
|
|
104
|
+
// show() → 取消定时器 → getBoundingClientRect 更新坐标 → setVisible(true)
|
|
105
|
+
// hide() → 200ms setTimeout → setVisible(false)
|
|
106
|
+
// clearHideTimer() → clearTimeout
|
|
107
|
+
|
|
108
|
+
// ? 图标: onMouseEnter={show} onMouseLeave={hide}
|
|
109
|
+
// Portal 气泡: onMouseEnter={clearHideTimer} onMouseLeave={hide}
|
|
110
|
+
// position: fixed, z-index: 10000, pointer-events: auto
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- 禁止在 Modal 内用纯 CSS `position: absolute` 的 hover tooltip
|
|
115
|
+
- 写完 tooltip 后必须实际验证:弹窗内滚动时气泡不被裁剪,鼠标能从图标移到气泡上阅读
|
package/rules/global.md
CHANGED
|
@@ -108,7 +108,7 @@ Closes #456
|
|
|
108
108
|
1. 打开 PR 页面,逐一查看 Copilot review 提出的每一条问题。
|
|
109
109
|
2. 逐条判断问题是否有道理:确实存在的代码缺陷、逻辑错误、安全风险、性能问题等 → 必须修复;误报、与需求不符、风格偏好无实质影响等 → 在评论中回复解释为何不改,然后 Resolve。
|
|
110
110
|
3. 对于有道理的问题,直接修改代码、提交并推送到该 PR 分支。
|
|
111
|
-
4.
|
|
111
|
+
4. ⚠️ **强制步骤:修改代码并推送后,必须在 GitHub PR 页面上逐条点击 Resolve conversation。** 此步骤不可跳过——即使已回复评论、已推送修复代码,只要未点 Resolve,该条评论仍处于”未解决”状态,reviewer 无法判断是否已处理完毕。每修复一条,立即 Resolve 一条,不要等所有问题修完再批量操作。
|
|
112
112
|
5. 所有问题处理完毕后,重新请求 Copilot review。
|
|
113
113
|
6. 重复以上步骤,直到 Copilot review 不再提出新问题为止。
|
|
114
114
|
- 每一条 Copilot review 评论处理完毕后,必须点击 **Resolve conversation**,不能只回复不 Resolve。不点 Resolve 会导致该评论一直处于未解决状态,无法判断是否已完成处理。
|