# Changelog sync guard: compare source file mtime vs changelog mtime. # If source files are newer than changelog, inject a followup_message # reminding the agent to write changelog entries. # # 静默条件(不触发提醒): # 1. 环境变量 CURSOR_SKIP_CHANGELOG 被设置(由 sessionStart hook 在非 agent 模式设置) # 2. Debug 模式 — 项目根目录存在 debug-*.log 文件,说明正在调试 # 3. changelog 文件不存在 # 4. .changelog-ack 标记文件存在且足够新(本会话已确认过 changelog 状态) $input = [Console]::In.ReadToEnd() # 检测 sessionStart 设置的跳过标志(覆盖一开始就是 debug/ask 模式的场景) if ($env:CURSOR_SKIP_CHANGELOG) { Write-Output '{}' exit 0 } $changelog = ".cursor\changelog\changelog-headlines.md" $srcDir = "art-agent" if (-not (Test-Path $changelog)) { Write-Output '{}' 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 # 检测 ack 标记文件:Agent 已确认 changelog 状态(写入或跳过),本会话不再提醒 $ackFile = ".cursor\changelog\.changelog-ack" if ((Test-Path $ackFile) -and (Get-Item $ackFile).LastWriteTime -ge $clMtime) { Write-Output '{}' exit 0 } $extensions = @("*.py", "*.tsx", "*.ts", "*.css") $excludeDirs = @("node_modules", ".next", "__pycache__", "venv") $newerFile = $null foreach ($ext in $extensions) { $files = Get-ChildItem -Path $srcDir -Filter $ext -Recurse -ErrorAction SilentlyContinue | Where-Object { $skip = $false foreach ($ex in $excludeDirs) { if ($_.FullName -like "*\$ex\*") { $skip = $true; break } } -not $skip -and $_.LastWriteTime -gt $clMtime } | Select-Object -First 1 if ($files) { $newerFile = $files.Name break } } if ($newerFile) { $msg = "[Hook] Source file updated (e.g. $newerFile) but changelog not synced. Run dev-changelog Skill operation A NOW to write all three changelog layers." $json = '{"followup_message":"' + $msg.Replace('"','\"') + '"}' Write-Output $json } else { Write-Output '{}' } exit 0