实现用 Stop hook 自动将对话记录到 Obsidian vault
要实现用 Stop hook 自动将对话记录到 Obsidian vault,核心思路是:Stop 事件在每次
Claude 响应结束时触发,hook 脚本可以获取当前日期和会话信息,自动追加记录到 vault
文件。
不过有一个限制:Stop hook 通过 stdin 接收的 JSON 不包含对话内容本身,只包含
session_id、cwd 等元数据。所以方案需要分两层:
- CLAUDE.md 指令(已有)— 让 Claude 在每次响应结束时用中文输出总结
- Stop hook(新增)— 自动创建日期文件 + 记录会话元数据
以下是完整实现步骤:
- 创建 hook 脚本
在 C:\Users\bk.claude\hooks\ 下新建 obsidian-log.bat:
@echo off
setlocal enabledelayedexpansion
:: 读取 stdin JSON
set “stdin=”
for /f “delims=” %%i in (‘more’) do set “stdin=%%i”
:: 不要处理 Stop hook 自身的触发(防循环)
echo %stdin% | findstr “stop_hook_active” >nul && exit /b 0
:: 获取当前日期(格式 YYYY-MM-DD)
for /f “tokens=1-3 delims=-/” %%a in (‘echo %date%’) do (
set “year=%%c”
set “month=%%a”
set “day=%%b”
)
if “%year%”“” (
for /f "tokens=1-3 delims=/-. " %%a in (‘echo %date%’) do (
set “year=%%c”
set “month=%%a”
set “day=%%b”
)
)
:: 补零
if “%month:~1%”“” set “month=0%month%”
if “%day:~1%”==“” set “day=0%day%”
set “today=%year%-%month%-%day%”
set “vault_path=D:\dong_valut\dong_valut\sources%today%.md”
:: 如果文件不存在,创建并写入头部
if not exist “%vault_path%” (
echo ## Claude 对话记录 - %today%>>“%vault_path%”
echo.>>“%vault_path%”
echo ### 会话信息>>“%vault_path%”
echo.>>“%vault_path%”
echo - 时间: %time%>>“%vault_path%”
echo - 工作目录: %cd%>>“%vault_path%”
echo.>>“%vault_path%”
echo —>>“%vault_path%”
echo.>>“%vault_path%”
)
exit /b 0
- 配置 hook 到 settings.json
在 C:\Users\bk.claude\settings.json 中添加 Stop hook:
{
“hooks”: {
“PreToolUse”: [
{
“matcher”: “Bash”,
“hooks”: [{
“type”: “command”,
“command”: “C:\Users\bk\.claude\hooks\pre-command.bat”,
“timeout”: 5
}]
}
],
“PostToolUse”: [
{
“matcher”: “Bash”,
“hooks”: [{
“type”: “command”,
“command”: “C:\Users\bk\.claude\hooks\post-command.bat”,
“timeout”: 5
}]
}
],
“Stop”: [
{
“hooks”: [{
“type”: “command”,
“command”: “C:\Users\bk\.claude\hooks\obsidian-log.bat”,
“timeout”: 10
}]
}
]
}
}
关键点:Stop 事件不支持 matcher,只要有 hooks 数组就会触发。
- 防循环机制
Stop hook 执行时,如果 hook 脚本本身再触发 Stop 事件就会死循环。hook 的 stdin JSON
里有 stop_hook_active 字段:
- 第一次 Stop:stop_hook_active = false
- hook 脚本执行期间触发的 Stop:stop_hook_active = true
所以脚本里必须检查这个字段,为 true 时直接 exit /b 0。
如果还想记录对话内容
由于 Stop hook 拿不到对话文本,有两个补充方案:
方案 A:结合 UserPromptSubmit hook 记录用户输入
@echo off
setlocal enabledelayedexpansion
:: 从 stdin 提取用户提示词
more | python -c "
import sys, json
data = json.load(sys.stdin)
prompt = data.get(‘tool_input’, {}).get(‘prompt’, ‘’)
print(prompt[:500])
" >> D:\dong_valut\dong_valut\sources%date:-4%-%date:4,2%-%date:~7,2%.md 2>nul
更多推荐


所有评论(0)