要实现用 Stop hook 自动将对话记录到 Obsidian vault,核心思路是:Stop 事件在每次
Claude 响应结束时触发,hook 脚本可以获取当前日期和会话信息,自动追加记录到 vault
文件。
在这里插入图片描述

不过有一个限制:Stop hook 通过 stdin 接收的 JSON 不包含对话内容本身,只包含
session_id、cwd 等元数据。所以方案需要分两层:

  • CLAUDE.md 指令(已有)— 让 Claude 在每次响应结束时用中文输出总结
  • Stop hook(新增)— 自动创建日期文件 + 记录会话元数据

以下是完整实现步骤:


  1. 创建 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

  1. 配置 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 数组就会触发。

  1. 防循环机制

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
在这里插入图片描述

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐