AI笔记008. token优化, RTK安装, hook指向exe

发布时间:2026/7/26 8:54:40
AI笔记008. token优化, RTK安装, hook指向exe
知识点:节省了token的同时, 也让上下文不那么容易爆, 以后不用频繁开新session了, 相当于长任务能力暴涨N倍cc 的 hook command 可以指向任何可执行文件(不一定是hook目录的脚本)Why RTK,官方Readme描述:rtk 在命令输出到达 LLM 上下文之前进行过滤和压缩。单一 Rust 二进制文件零依赖10ms 开销。Token 节省30 分钟 Claude Code 会话操作频率标准rtk节省ls/tree10x2,000400-80%cat/read20x40,00012,000-70%grep/rg8x16,0003,200-80%git status10x3,000600-80%git diff5x10,0002,500-75%cargo test/npm test5x25,0002,500-90%总计~118,000~23,900-80%测试环境Windows 11 Claude Code Bash/PowerShell 双 shell1. 安装 RTKRTK 应已安装到E:\__work\BaseTools\rtk\rtk.exe加到path或在C:\Users\yg\.local\bin\建立符号链接rtk.exe验证rtk--version# 期望输出rtk 0.42.42. 初始化 RTK 配置运行全局初始化rtk init-g--auto-patch这会做三件事创建C:\Users\yg\.claude\RTK.md在C:\Users\yg\.claude\CLAUDE.md添加RTK.md引用在C:\Users\yg\.claude\settings.json注入PreToolUsehook3. 检查 settings.json确认出现以下段落{hooks:{PreToolUse:[{matcher:Bash|PowerShell,hooks:[{type:command,command:rtk hook claude}]}]}}注意matcher必须包含你实际使用的工具类型Bash|PowerShell4. 重启 Claude Code必须重启。Hook 在 Claude Code 启动时加载当前 session 不生效。5. 验证是否生效重启后发一个 Bash 命令gitstatus如果输出变成紧凑格式类似git status --short --branch说明 hook 已生效* master...origin/master ?? __docs/debug_notes/再验证 token 节省rtk gain-p-H6. 常见问题Q1:rtk init -g后没生效rtk init -g在非交互模式下默认不 patchsettings.json。改用rtk init-g--auto-patchQ2: Bash 里提示rtk: command not foundPowerShell 能找rtk.cmd但 Git Bash 的 PATH 可能不包含C:\Users\yg\.local\bin。两种修复方案 Asettings.json 用完整路径command:E:/__work/BaseTools/rtk/rtk.exe hook claude方案 B把C:\Users\yg\.local\bin加入 Windows 用户 PATH需重启 Claude CodeQ3:~/.claude/hooks/下没有 RTK 脚本正常现象。RTK 的 hook 不是独立脚本而是rtk hook claude这个内置子命令。rtk从 stdin 读取 Claude Code 传入的工具参数把git status改写成rtk git status后通过 stdout 返回。Q4: 哪些命令会被 rewrite常见命令如git、ls、rg、npm、pnpm、tsc、eslint、vitest、pytest、cargo、go test、docker ps等。未知命令会透传不变。7. 快速诊断手动测试 hook 是否能正常 rewriteecho{session_id:test,cwd:/test,hook_event_name:PreToolUse,tool_name:Bash,tool_input:{command:git status,description:test}}|rtk hook claude期望输出包含updatedInput.command: rtk git status。8. 卸载rtk init-g--uninstall然后手动从settings.json删除 RTK 的PreToolUse段落。探索过程记录: User再用rtk 节省token的方式跑一遍cg 技能 ,看节省多少token Assistant用 RTK 重跑 cg 技能的 token 节省结果Token 节省数据rtk gain -p -H当前项目统计指标数值命令数11原始输出 tokens10.3KRTK 压缩后 tokens1.1K节省 tokens9.2K节省比例89.0%按命令类型命令节省比例典型节省rtk read99%读文件时几乎只保留有效行rtk rg86–88%去空白、截断、按文件分组rtk cg ...0%cg 不是 RTK 子命令透传无过滤最近命令明细07-14 16:54 • rtk read -0% (0) 07-14 16:54 • rtk fallback: cg kb pi... -0% (0) 07-14 16:54 ▲ rtk rg -87% (525) 07-14 16:53 ▲ rtk read -99% (8.0K) 07-14 16:53 ▲ rtk rg -87% (225) 07-14 16:53 ▲ rtk rg -88% (112) 07-14 16:53 ▲ rtk rg -86% (56) 07-14 16:53 ▲ rtk rg -86% (75) 07-14 16:53 ▲ rtk rg -88% (112)关键观察最大收益来自rtk read读SCH-MM32F0140.md这种 60 行文件原始输出约 8K tokensRTK 过滤后接近 0.1K省 99%。rtk rg稳定在 86–88%网表 grep 结果去掉了大量空白和上下文噪音。cg无节省cg kb pinout被 RTK 标记为fallback: cg kb p...输出 JSON 直接被透传无压缩。当前限制手动加rtk前缀才能生效。rtk init -g已注册全局 hook但尚未 patchsettings.json并重启 Claude Code所以仍提示[rtk] /!\ No hook installed — run rtk init -g for automatic token savings如需自动生效需把以下内容加入C:\Users\yg\.claude\settings.json后重启{hooks:{PreToolUse:[{matcher:Bash,hooks:[{type:command,command:rtk hook claude}]}]}}总结本次 cg 技能用 RTK 手动跑省 9.2K tokens89%如果cg也有 RTK 子命令或 hook 自动重写节省还能更高。 Userrtk read 为什么能节省token,如果read出来不是原文,那能用吗 Assistantrtk read为什么能省 token读出来的还是原文吗省 token 的三层机制rtk read的节省来自截断 过滤 格式压缩机制选项作用风险行数截断-m N只读前 N 行其余显示[X more lines]可能漏掉需要的中间内容内容过滤-l minimal/aggressive去掉空行、注释、分隔线等aggressive 可能误删有效内容格式压缩--ultra-compact行内紧凑显示可读性下降实测对比1. 默认none级别 原文只截断行数rtk read-n-m 10SCH-MM32F0140.md输出1 │ # MM32F0140 (U2) 板上信号名 ... 2 │ 3 │ 网表: FX-T268-V6-10米-5065.NET ... 4 │ 5 │ 6 │ [52 more lines]✅文字是原文只是只读了前 10 行剩下 52 行被折叠。2.aggressive级别可能过度过滤rtk read-n-l aggressive-m 20FX-T268-V6-10米-5065.NET输出rtk: warning: filter produced empty output ..., showing raw content⚠️ aggressive 过滤把网表内容当成无意义文本全删了被迫回退到原文。对 cg 技能来说能不能用✅ 适合用rtk read的场景读小文件全文如SCH-MM32F0140.md只有 57 行读配置文件开头确认格式配合-m N快速预览不需要精确中间行❌ 不适合/有风险的场景cg 技能的核心是精确网表定位例如R101 的定义在网表第 1514 行R101-1 的网络在第 2492 行U7 的器件定义在第 1634 行rtk read没有--offset参数无法直接读第 1500 行附近。如果硬用-m 1500从头读到 1500 行虽然内容是原文但 token 节省意义不大读了大半文件不如直接用Read工具的offset/limit精确读取推荐组合任务推荐工具原因精确读文件中间段Read原生工具有offsetlimit内容 100% 原文快速 grep 定位rtk rg省 86%输出足够精确读小文件/开头预览rtk read -m N省 99%内容是原文关键网表/配置文件 别用aggressive可能过滤掉有效节点名结论rtk read默认读出来的是原文token 主要靠少读行数来省但如果用-l aggressive或-l minimal内容可能被改写做 cg 技能这种依赖精确网表和引脚映射的工作时不建议用。对于你的场景 safest 的做法是定位用rtk rg省 token 且精确精确读取用Read原生工具带 offset原文保证 User我运行了rtk init -g, claude.md多了一个RTK.md,但C:\Users\yg.claude\hooks没有发现hook,所以All other commands are automatically rewritten by the Claude Code hook.只是依据空话 User我运行了rtk init -g, claude.md多了一个RTK.md,但C:\Users\yg.claude\hooks没有发现hook,所以All other commands are automatically rewritten by the Claude Code hook.只是一句空话 Assistant你说得对。rtk init -g目前只是空话它并没有真正启用自动 rewrite。现状核查1.~/.claude/hooks/下确实没有 RTK 文件ls-laC:/Users/yg/.claude/hooks/只有auto-approve-claude-filescbmm-auto-indexcbmm-code-discovery-gatecbmm-session-reminder2.settings.json里也没有 RTK hook当前PreToolUse只配置了 cbmmhooks:{PreToolUse:[{hooks:[{command:~/.claude/hooks/cbmm-code-discovery-gate,type:command}],matcher:Grep|Glob|Read|Search}]}3.rtk init -g实际做了什么它只是创建了C:\Users\yg\.claude\RTK.md在CLAUDE.md里加了RTK.md引用在非交互模式下跳过了settings.jsonpatch默认 N所以 RTK.md 里 “All other commands are automatically rewritten by the Claude Code hook” 这句前提条件没满足。RTK hook 的真实形态RTK 的 “hook”不是~/.claude/hooks/目录里的独立文件而是rtk二进制的一个子命令rtk hook claudeClaude Code 的PreToolUsehook 可以调用任意命令。正确配置后每次 Bash 工具调用前Claude Code 会把工具参数通过 stdin 传给rtk hook claude由它决定是否把git status重写成rtk git status。修复方法需要手动把 RTK hook 合并进settings.json并重启 Claude Code。合并后的hooks段应该是hooks:{PreToolUse:[{hooks:[{command:~/.claude/hooks/cbmm-code-discovery-gate,type:command}],matcher:Grep|Glob|Read|Search},{hooks:[{command:rtk hook claude,type:command}],matcher:Bash}],SessionStart:[{hooks:[{command:~/.claude/hooks/cbmm-auto-index,timeout:300000,type:command},{command:~/.claude/hooks/cbmm-session-reminder,type:command}],matcher:startup},{hooks:[{command:~/.claude/hooks/cbmm-session-reminder,type:command}],matcher:resume|clear|compact}]}关键新增部分{hooks:[{command:rtk hook claude,type:command}],matcher:Bash}要不要我现在帮你 patch我可以直接编辑C:\Users\yg\.claude\settings.json加上这段配置。加完后必须重启 Claude Code才能生效。另外rtk init其实有--auto-patch选项rtk init-g--auto-patch你现在运行它应该能自动完成同样的修改。需要我帮你运行/编辑吗 User我已经运行了rtk init -g --auto-patch,看是不是有了 Assistant有了。settings.json第 43-51 行现在已经正确加入了 RTK hook{matcher:Bash,hooks:[{type:command,command:rtk hook claude}]}两个注意点1. 必须重启 Claude Code 才生效Hook 是在 Claude Code 启动时加载的。当前这个 session 还没重启所以现在你运行git status仍然不会被自动改写成rtk git status。重启后Bash 工具的命令会先经过rtk hook claude处理然后才会执行。2. 当前只 hook 了 Bash没 hook PowerShell你的环境主 shell 是pwshClaude Code 有独立的PowerShell工具。当前 matcher 是Bash所以工具是否自动 rewriteBash✅ 重启后生效PowerShell❌ 不生效如果你希望 PowerShell 也自动 rewrite把 matcher 改成matcher:Bash|PowerShell需要我现在帮你改吗验证是否生效的方法重启 Claude Code 后你可以发一个简单命令测试gitstatus如果 hook 生效实际执行的应该是rtk git status输出开头会带[rtk] /!\ No hook installed — run rtk init -g for automatic token savings如果生效了那个 “No hook installed” 的警告反而会消失因为 hook 已经装好了。要我帮你把 PowerShell 也加进 matcher 吗 User改matcher: “Bash|PowerShell” Assistant已改。settings.json里 RTK hook 的 matcher 现在是matcher:Bash|PowerShell下一步重启 Claude Code后生效。验证方法重启后随便发一个 Bash 或 PowerShell 命令例如gitstatus如果 hook 工作正常它会被自动改写成rtk git status你应该能看到 RTK 的紧凑输出而不是普通的git status输出。如果还是普通输出说明 hook 没加载成功。 User已重启,你试一下 Assistant找到原因了Bash 里找不到rtk。rtk只在 PowerShell PATH 里C:\Users\yg\.local\bin\rtk.cmd但 Claude Code 的 Bash 工具运行的是 Git BashPATH 不同。所以rtk hook claude这个 hook 命令在 Bash 里执行失败导致命令没被 rewrite。已修复我把settings.json里的 hook command 改成了rtk.exe的完整路径{matcher:Bash|PowerShell,hooks:[{type:command,command:E:/__work/BaseTools/rtk/rtk.exe hook claude}]}已验证这个路径在 Bash 和 PowerShell 都能运行E:/__work/BaseTools/rtk/rtk.exe--version# rtk 0.42.4还需要一次重启settings.json 修改后需要再重启一次 Claude Code才能加载新的 hook 命令。重启后再试git status如果输出变成 RTK 格式紧凑、带[rtk]标记就说明自动 rewrite 生效了。 User我改成了hooks: [{“type”: “command”,“command”: “rtk hook claude”}]已重启,你试试 Assistant生效了。Hook 已经工作。测试证据1.git status被改写了我发的命令是git status实际输出是 RTK 紧凑格式* master...origin/master ?? __docs/debug_notes/普通git status应该是长格式带On branch master...那段现在被压缩成短格式了。2.ls -la被改写了输出变成755 .claude/ 755 .codegraph/ 755 .git/ ...普通ls -la会带权限串、所有者、大小、日期现在只剩权限数字和文件名。3.rtk gain -p -H确认Total commands: 22 Input tokens: 31.5K Output tokens: 3.6K Tokens saved: 27.9K (88.6%)最近命令列表已经出现了自动 rewrite 的记录命令节省rtk git status-81%rtk ls -la ...-67%rtk git log --oneline -5-0%为什么rtk hook claude现在能用了之前 Bash 找不到rtk重启后环境变量/PATH 刷新现在 Claude Code 的 Bash 工具能解析到rtk了。可能是你加了 PATH也可能是重启后 pyenv/shim 路径被正确继承。总之自动 rewrite 已生效以后 Bash 和 PowerShell 的常用命令都会走 RTK 过滤。 UserC:\Users\yg.claude\hooks 没有hook脚本,rtk 的hook是怎么实现的 Assistant你说得对C:\Users\yg\.claude\hooks目录下确实没有 RTK 脚本。RTK 的 hook 不是放在那里的独立脚本而是rtk可执行文件本身的一个子命令。RTK hook 的实现机制Claude Code 的settings.json支持PreToolUsehook。每次工具调用前Claude Code 会把工具参数打成 JSON通过stdin传给 hook 命令hook 命令处理完后通过stdout返回 JSON如果返回的 JSON 里有updatedInputClaude Code 就用更新后的参数执行工具实测rtk hook claude做了什么我用正确的 Claude Code hook JSON 格式手动喂给它echo{session_id:test,cwd:/test,hook_event_name:PreToolUse,tool_name:Bash,tool_input:{command:git status,description:test}}|rtk hook claude输出{hookSpecificOutput:{hookEventName:PreToolUse,permissionDecisionReason:RTK auto-rewrite,updatedInput:{command:rtk git status,description:test}}}看到了吗它把git status改成了rtk git status通过updatedInput.command回传给 Claude Code。同样ls -la会变成rtk ls -la{hookSpecificOutput:{hookEventName:PreToolUse,permissionDecisionReason:RTK auto-rewrite,updatedInput:{command:rtk ls -la}}}为什么~/.claude/hooks/里没有 RTK 文件~/.claude/hooks/只是一个常见的脚本存放位置不是唯一位置。Claude Code 的 hookcommand可以指向任何可执行文件包括~/.claude/hooks/cbmm-code-discovery-gatecbmm 放的脚本rtk hook claudertk 的子命令任何路径的.exe、.cmd、.sh当前你的settings.json里 RTK hook 配置是{matcher:Bash|PowerShell,hooks:[{type:command,command:rtk hook claude}]}rtk hook claude直接调用 rtk 二进制内部的 hook 处理器不需要额外的脚本文件。总结RTK hook 的实现方式项目说明Hook 位置settings.json的hooks.PreToolUseHook 命令rtk hook claudertk 内置子命令输入Claude Code 通过 stdin 传入工具参数 JSON输出rtk 通过 stdout 返回updatedInputJSON效果git status→rtk git status~/.claude/hooks/文件不需要因为 hook 逻辑在 rtk 二进制里所以~/.claude/hooks/里没有 RTK 文件是正常的它不是靠脚本文件实现的而是靠 rtk 自己的子命令。Sources:Claude Code Docs – Hooks referenceClaude Code Docs – Automate actions with hooksGitHub / luongnv89 – Claude howto hooks READMEdev.to / bfxavier – PreToolUse sandboxing hook User写一个简洁的rtk安装指南.md Assistant已写好保存在E:/__work/__longMem/rtk-install-guide-2026-07-14.md内容覆盖了我们今天踩过的全部关键点安装验证—rtk --version正确初始化— 必须用--auto-patch否则settings.json不会被改配置检查—matcher要包含Bash|PowerShellBash 找不到 rtk 的修复— 用完整路径E:/__work/BaseTools/rtk/rtk.exe hook claude必须重启 Claude Code验证方法—git status输出变紧凑、rtk gain -p -H手动诊断 hook— 用正确 JSON 喂给rtk hook claude解释为什么~/.claude/hooks/里没有 RTK 文件可以直接当速查手册用。