2.2 KiB
2.2 KiB
Pitfall Journal
开发过程中踩过的坑,按时间倒序排列。Agent 进入调试或遇到运行时错误时可检索本文件。
[PF-20260727-1322] WindowsApps bash 别名会让可用性探测挂起
- 症状: Hook 跨平台测试在
bash --version阶段长期无输出,整套测试超过超时仍不结束。 - 根因:
shutil.which("bash")优先命中了 WindowsApps 的 WSL 应用执行别名;该占位bash.exe存在但不会像 Git Bash 一样快速返回版本,原探测也没有 subprocess timeout。 - 解法: 给候选 bash 的版本探测增加短超时,捕获
subprocess.TimeoutExpired后继续尝试 Git 安装目录中的bin/bash.exe;Hook 子进程本身也设置超时,避免再次无限等待。 - 防御: Windows 上不能仅凭
which和文件存在判断 CLI 可用;外部工具探测必须执行带超时的无副作用命令,并把单个候选超时视为“不可用”而不是全局失败。 - 关联:
.cursor/hooks/tests/test_check_changelog.py、WindowsApps、WSL alias、Git Bash、subprocess timeout
[PF-20260727-1129] Changelog Hook 仅凭 mtime 产生无改动误报
- 症状: Git 工作区没有任何内容差异,
stopHook 却因.vscode/settings.json时间戳较新而要求创建 changelog fragment。 - 根因:
.session-start缺失时 Hook 回退到旧 changelog 时间,并且只比较宽泛扫描范围内文件的 mtime,没有验证候选文件是否存在真实 Git 内容差异。 - 解法:
.session-start缺失或 Git 状态不可用时 fail-open;工作区干净时立即退出;候选文件还必须被git status --porcelain判定为未提交改动。PowerShell 与 Bash 实现同步修复并添加回归测试。 - 防御: 文件时间只能限定“本会话之后”,不能作为内容改动证据;Hook 提示写日志前必须同时满足会话时间与版本控制状态,并覆盖“仅 touch、无内容变化”的测试。
- 关联:
.cursor/hooks/check-changelog.ps1、.cursor/hooks/check-changelog.sh、.cursor/hooks/tests/test_check_changelog.py、Cursor stop Hook、Windows/Bash