feat(role): PreCompact/PostCompact 保全壓縮邊界的上下文
補上最後一個記憶缺口:對話被壓縮時,尚未寫入記憶的內容會永久蒸發。 Stop hook 每輪記錄有部分覆蓋,但短回合會被 ROLE_CAPTURE_MIN_CHARS 門檻濾掉, 那些正是壓縮後再也補不回來的內容。 可行性查證(先確認再實作,不憑推測): 自 CLI binary 取出文件字串確認 harness 確實支援,並非猜測 —— | PreCompact | "manual"/"auto" | Before compaction | | PostCompact | "manual"/"auto" | After compaction (receives summary) | 另有 executePreCompactHooks/executePostCompactHooks 等實作符號, 以及 compactSummary/isCompactSummary 欄位名線索。 role_capture.sh: - 新增 --precompact:壓縮前強制記錄一次,**刻意跳過長度門檻**(門檻的用意是省額度, 但壓縮後內容永久消失,此時寧可多記) - 新增 --postcompact:把 harness 產生的摘要存成 daily 記憶,不再呼叫模型, 等於免費取得一份濃縮備份;寫入前一律經 redact 遮蔽 - 摘要欄位容錯讀取 compactSummary/compact_summary/summary/compaction_summary; **取不到時在 log 印出 hook 實際提供的欄位名**,避免 harness 改版後靜默失效 - 一併取用 trigger 欄位以分辨 manual/auto(自動壓縮才是使用者不知情的那種) - stop_hook_active 的迴圈防護只套用於一般每輪模式 hooks/hooks.json 註冊兩個新事件,指令沿用既有的「先試 CLAUDE_PLUGIN_ROOT → 再依擁有者 marketplace → 全 cache 後援」解析方式,並帶上對應參數。 兩個 hook 一律 exit 0,絕不阻擋壓縮 —— harness 具備 blocked by PreCompact hook 的能力,記憶系統不該用到它。 驗證:一般模式短對話仍被門檻正確濾掉;--precompact 對同一段短對話強制記錄; --postcompact 正確寫入摘要記憶;欄位名不符時印出實際欄位(session_id,transcript_path, cwd,trigger,unknownField)而非靜默結束;四條 hook 指令語法正確,且在 CLAUDE_PLUGIN_ROOT 與純後援搜尋兩種情境下都解析到正確腳本與參數。 版號沿用 0.0.5(master 為 0.0.4,同一 PR 不再累加) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -21,6 +21,28 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"PreCompact": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "rel='scripts/role/role_capture.sh'; own='generic'; plug='jsc-generic'; root=\"${CLAUDE_PLUGIN_ROOT:-}\"; if [ -n \"$root\" ] && [ -f \"$root/$rel\" ]; then exec \"$root/$rel\" --precompact; fi; for base in \"$HOME/.claude/plugins/cache\" \"$HOME/.codex/plugins/cache\"; do for dir in \"$base/$own/$plug\" \"$base\"; do s=$(find \"$dir\" -path \"*/$plug/*/$rel\" -type f 2>/dev/null | sort -V | tail -n 1); if [ -n \"$s\" ]; then exec \"$s\" --precompact; fi; done; done; exit 0",
|
||||
"timeout": 60
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"PostCompact": [
|
||||
{
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "rel='scripts/role/role_capture.sh'; own='generic'; plug='jsc-generic'; root=\"${CLAUDE_PLUGIN_ROOT:-}\"; if [ -n \"$root\" ] && [ -f \"$root/$rel\" ]; then exec \"$root/$rel\" --postcompact; fi; for base in \"$HOME/.claude/plugins/cache\" \"$HOME/.codex/plugins/cache\"; do for dir in \"$base/$own/$plug\" \"$base\"; do s=$(find \"$dir\" -path \"*/$plug/*/$rel\" -type f 2>/dev/null | sort -V | tail -n 1); if [ -n \"$s\" ]; then exec \"$s\" --postcompact; fi; done; done; exit 0",
|
||||
"timeout": 30
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user