|
1 | 1 | # Claude Code 已知问题与 VibeGuard 应对 |
2 | 2 |
|
3 | 3 | > 影响 VibeGuard 规则/hooks/skills 加载的 Claude Code 平台级 bug。 |
4 | | -> 最后更新:2026-03-02 |
| 4 | +> 最后更新:2026-03-28 |
5 | 5 |
|
6 | 6 | ## 规则系统 (Rules) |
7 | 7 |
|
@@ -80,6 +80,45 @@ paths: **/*.ts,**/*.tsx,**/*.js,**/*.jsx |
80 | 80 |
|
81 | 81 | --- |
82 | 82 |
|
| 83 | +### 8. paths 规则在 Write/Edit 时不触发 |
| 84 | + |
| 85 | +| 字段 | 值 | |
| 86 | +|------|------| |
| 87 | +| Issue | [#23478](https://github.com/anthropics/claude-code/issues/23478) | |
| 88 | +| 状态 | OPEN(未修复) | |
| 89 | +| 严重度 | **中** | |
| 90 | +| 影响 | `paths:` 过滤仅在 Claude 读取文件时生效,Write/Edit 操作不触发路径作用域规则 | |
| 91 | + |
| 92 | +**问题说明**:路径作用域规则只在 Read 工具调用时加载并评估,而非在 Write/Edit 时。这意味着路径限定的规则在最关键的操作(写入代码)时可能不生效。 |
| 93 | + |
| 94 | +**VibeGuard 影响**:中。语言特定规则(如 `typescript/*.md`)期望在 TS 文件被修改时生效,但 Write/Edit 会绕过路径过滤。 |
| 95 | + |
| 96 | +**VibeGuard 应对**:PreToolUse hook 在 Write/Edit 前强制执行 Read,间接触发规则加载。在 `scripts/compliance_check.sh` Layer 7 中检测此问题的根因(YAML array 和 quoted paths 语法)。 |
| 97 | + |
| 98 | +--- |
| 99 | + |
| 100 | +### 9. 带引号的 paths 值被原样保留 |
| 101 | + |
| 102 | +| 字段 | 值 | |
| 103 | +|------|------| |
| 104 | +| Issue | [#17204](https://github.com/anthropics/claude-code/issues/17204) | |
| 105 | +| 状态 | OPEN(未修复) | |
| 106 | +| 严重度 | 中 | |
| 107 | +| 影响 | `paths: "**/*.ts"` 中的引号被保留到 glob 字符串中,导致匹配失败 | |
| 108 | + |
| 109 | +**触发条件**: |
| 110 | + |
| 111 | +```yaml |
| 112 | +# ❌ 不生效 — 引号被保留,glob 无法匹配 |
| 113 | +--- |
| 114 | +paths: "**/*.ts,**/*.tsx" |
| 115 | +--- |
| 116 | +``` |
| 117 | + |
| 118 | +**VibeGuard 应对**:同 #1,CSV 格式不加任何引号。`compliance_check.sh` Layer 7 自动检测此问题。 |
| 119 | + |
| 120 | +--- |
| 121 | + |
83 | 122 | ## Hooks 系统 |
84 | 123 |
|
85 | 124 | ### 7. Stop Hook exit 2 导致无限循环 |
@@ -119,6 +158,29 @@ Claude 回复完成 |
119 | 158 |
|
120 | 159 | --- |
121 | 160 |
|
| 161 | +### 10. exit 2 在 UI 中显示为"Error"而非阻断提示 |
| 162 | + |
| 163 | +| 字段 | 值 | |
| 164 | +|------|------| |
| 165 | +| Issue | [#34600](https://github.com/anthropics/claude-code/issues/34600) | |
| 166 | +| 状态 | OPEN(未修复) | |
| 167 | +| 严重度 | 低 | |
| 168 | +| 影响 | Hook 返回 `exit 2` 时,Claude Code UI 将其显示为红色"Error",而非预期的阻断反馈提示 | |
| 169 | + |
| 170 | +**问题说明**:`exit 2` 的设计意图是将 stderr 作为反馈注入给 Claude 并阻断当前操作。但在 UI 层,这被渲染为错误状态,可能让用户误以为 hook 本身出错。 |
| 171 | + |
| 172 | +**VibeGuard 应对**:在 hook stderr 中添加 `[BLOCKED]` 前缀,让 UI 显示更清晰: |
| 173 | + |
| 174 | +```bash |
| 175 | +# 在 hook 脚本中 |
| 176 | +echo "[BLOCKED] 检测到危险操作: ${tool_name}" >&2 |
| 177 | +exit 2 |
| 178 | +``` |
| 179 | + |
| 180 | +**VibeGuard 影响**:低。功能正常,仅影响 UI 展示。PreToolUse hooks 已统一使用 `[BLOCKED]` 前缀。 |
| 181 | + |
| 182 | +--- |
| 183 | + |
122 | 184 | ## Skills 系统 |
123 | 185 |
|
124 | 186 | ### 5. SKILL.md 验证器拒绝扩展字段 |
@@ -154,13 +216,28 @@ Claude 回复完成 |
154 | 216 | | #16299 项目级 paths 全局加载 | 低 | — 不影响用户级 | |
155 | 217 | | #13905 YAML 语法无效 | 中 | ✅ CSV 格式 workaround | |
156 | 218 | | #23569 Worktree paths 忽略 | 低 | — 不依赖此机制 | |
| 219 | +| #23478 paths 在 Write/Edit 不触发 | **中** | ✅ PreToolUse hook 强制 Read 前置 | |
| 220 | +| #17204 带引号 paths 匹配失败 | 中 | ✅ CSV 不加引号 + Layer 7 检测 | |
157 | 221 | | #7 Stop hook exit 2 无限循环 | **高** | ✅ 改为 exit 0 仅记录 | |
| 222 | +| #34600 exit 2 UI 显示为 Error | 低 | ✅ [BLOCKED] 前缀 workaround | |
158 | 223 | | #25380 SKILL.md 验证器 | 低 | — 仅 VS Code 警告 | |
159 | 224 | | #17688 插件 hooks 不触发 | 无 | — 不使用此机制 | |
160 | 225 |
|
161 | 226 | ## 监控建议 |
162 | 227 |
|
163 | 228 | 定期检查以下 issue 的修复状态: |
164 | 229 | - **#21858** — 修复后可改回 YAML 数组格式(更易读) |
| 230 | +- **#23478** — 修复后 paths 规则将在 Write/Edit 时正确触发 |
165 | 231 | - **#16299** — 修复后项目级规则的上下文开销会降低 |
166 | 232 | - **#17688** — 若 VibeGuard 计划做插件分发需关注 |
| 233 | + |
| 234 | +## 自动化监控 |
| 235 | + |
| 236 | +`scripts/compliance_check.sh` Layer 7 自动检测常见的规则语法问题: |
| 237 | + |
| 238 | +```bash |
| 239 | +bash scripts/compliance_check.sh |
| 240 | +# 输出:--- Layer 7: Rule YAML Syntax --- |
| 241 | +# [PASS] No YAML array syntax in paths frontmatter |
| 242 | +# [PASS] No quoted paths in rules frontmatter |
| 243 | +``` |
0 commit comments