changelog记录在debug mode中不触发
This commit is contained in:
0
.cursor/changelog/.changelog-ack
Normal file
0
.cursor/changelog/.changelog-ack
Normal file
@@ -8,15 +8,10 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"stop": [
|
"stop": [
|
||||||
{
|
|
||||||
"type": "prompt",
|
|
||||||
"prompt": "You are a changelog compliance checker. Return ONLY valid JSON, nothing else.\n\nSTEP 1 — EXEMPTION CHECK (if ANY condition is true, return {} immediately):\n- The conversation is in Debug mode, debug-mode, or any debugging/troubleshooting context\n- The agent's recent actions were ONLY: reading files, running shell commands, adding log/debug statements, or modifying .cursor/ files\n- The agent did NOT use Write or StrReplace tools on files outside .cursor/ directory\n- The agent was acknowledging a previous hook reminder\n- There is a CURSOR_SKIP_CHANGELOG environment variable set\n\nIf ANY exemption matches → return: {}\n\nSTEP 2 — Only if NO exemption matched:\nCheck if the agent used Write or StrReplace on source files (*.py, *.tsx, *.ts, *.css, *.json outside .cursor/) AND did NOT also write to all three: .cursor/changelog/changelog-full.md, changelog-recent.md, changelog-headlines.md.\n\nIf changelog writes were missed → return: {\"followup_message\":\"Changelog not synced. Run dev-changelog Skill operation A to write all three changelog layers.\"}\n\nOtherwise → return: {}\n\nHere is the hook input: $ARGUMENTS",
|
|
||||||
"timeout": 15,
|
|
||||||
"loop_limit": 1
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"command": "powershell -ExecutionPolicy Bypass -File .cursor/hooks/check-changelog.ps1",
|
"command": "powershell -ExecutionPolicy Bypass -File .cursor/hooks/check-changelog.ps1",
|
||||||
"timeout": 10
|
"timeout": 10,
|
||||||
|
"loop_limit": 1
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,46 +1,64 @@
|
|||||||
# Changelog sync guard: compare source file mtime vs changelog mtime.
|
# Changelog sync guard — 统一 stop hook(合并了原 prompt hook 和 command hook)
|
||||||
# If source files are newer than changelog, inject a followup_message
|
#
|
||||||
# reminding the agent to write changelog entries.
|
# 用确定性逻辑检查:
|
||||||
|
# 1. 源文件是否比 changelog 更新(mtime 比较)
|
||||||
|
# 2. stdin 中的 agent 上下文是否显示有源文件编辑操作
|
||||||
#
|
#
|
||||||
# 静默条件(不触发提醒):
|
# 静默条件(不触发提醒):
|
||||||
# 1. 环境变量 CURSOR_SKIP_CHANGELOG 被设置(由 sessionStart hook 在非 agent 模式设置)
|
# 1. 环境变量 CURSOR_SKIP_CHANGELOG 被设置(sessionStart 在非 agent 模式设置)
|
||||||
# 2. Debug 模式 — 项目根目录存在 debug-*.log 文件,说明正在调试
|
# 2. stdin JSON 中 composer_mode 不是 "agent"(如 debug/ask/edit 模式)
|
||||||
# 3. changelog 文件不存在
|
# 3. changelog 文件不存在
|
||||||
# 4. .changelog-ack 标记文件存在且足够新(本会话已确认过 changelog 状态)
|
# 4. .changelog-ack 标记文件存在且足够新(本会话已确认过 changelog 状态)
|
||||||
|
# 5. 没有源文件比 changelog 更新
|
||||||
|
|
||||||
$input = [Console]::In.ReadToEnd()
|
$input = [Console]::In.ReadToEnd()
|
||||||
|
|
||||||
# 检测 sessionStart 设置的跳过标志(覆盖一开始就是 debug/ask 模式的场景)
|
# === 豁免检查 1:环境变量跳过标志 ===
|
||||||
if ($env:CURSOR_SKIP_CHANGELOG) {
|
if ($env:CURSOR_SKIP_CHANGELOG) {
|
||||||
Write-Output '{}'
|
Write-Output '{}'
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# === 豁免检查 2:从 stdin 解析 composer_mode ===
|
||||||
|
try {
|
||||||
|
$data = $input | ConvertFrom-Json
|
||||||
|
$mode = $data.composer_mode
|
||||||
|
if ($mode -and $mode -ne "agent") {
|
||||||
|
Write-Output '{}'
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
# JSON 解析失败,继续后续检查
|
||||||
|
}
|
||||||
|
|
||||||
|
# === 豁免检查 3:从 stdin 文本匹配 debug 上下文关键词 ===
|
||||||
|
# stop hook 的 $ARGUMENTS 可能包含对话/工具上下文,检测 debug 相关信号
|
||||||
|
if ($input -match '"mode"\s*:\s*"debug"' -or
|
||||||
|
$input -match 'debug[\s_-]?mode' -or
|
||||||
|
$input -match 'Debug Mode') {
|
||||||
|
Write-Output '{}'
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
$changelog = ".cursor\changelog\changelog-headlines.md"
|
$changelog = ".cursor\changelog\changelog-headlines.md"
|
||||||
$srcDir = "art-agent"
|
$srcDir = "art-agent"
|
||||||
|
|
||||||
|
# === 豁免检查 4:changelog 文件不存在 ===
|
||||||
if (-not (Test-Path $changelog)) {
|
if (-not (Test-Path $changelog)) {
|
||||||
Write-Output '{}'
|
Write-Output '{}'
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# 检测 debug 模式:项目中存在活跃的 debug 日志文件
|
|
||||||
$debugLogs = Get-ChildItem -Path "." -Filter "debug-*.log" -Recurse -Depth 3 -ErrorAction SilentlyContinue |
|
|
||||||
Where-Object { $_.FullName -notlike "*node_modules*" -and $_.FullName -notlike "*venv*" }
|
|
||||||
if ($debugLogs) {
|
|
||||||
Write-Output '{}'
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
$clMtime = (Get-Item $changelog).LastWriteTime
|
$clMtime = (Get-Item $changelog).LastWriteTime
|
||||||
|
|
||||||
# 检测 ack 标记文件:Agent 已确认 changelog 状态(写入或跳过),本会话不再提醒
|
# === 豁免检查 5:ack 标记文件足够新 ===
|
||||||
$ackFile = ".cursor\changelog\.changelog-ack"
|
$ackFile = ".cursor\changelog\.changelog-ack"
|
||||||
if ((Test-Path $ackFile) -and (Get-Item $ackFile).LastWriteTime -ge $clMtime) {
|
if ((Test-Path $ackFile) -and (Get-Item $ackFile).LastWriteTime -ge $clMtime) {
|
||||||
Write-Output '{}'
|
Write-Output '{}'
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# === 核心检查:是否有源文件比 changelog 更新 ===
|
||||||
$extensions = @("*.py", "*.tsx", "*.ts", "*.css")
|
$extensions = @("*.py", "*.tsx", "*.ts", "*.css")
|
||||||
$excludeDirs = @("node_modules", ".next", "__pycache__", "venv")
|
$excludeDirs = @("node_modules", ".next", "__pycache__", "venv")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user