尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Claude Subconscious退出码规范解读:0、1、2三种语义如何决定Hook是否阻塞

Claude Subconscious退出码规范解读:0、1、2三种语义如何决定Hook是否阻塞 Claude Subconscious退出码规范解读0、1、2三种语义如何决定Hook是否阻塞【免费下载链接】claude-subconsciousGive Claude Code a subconscious项目地址: https://gitcode.com/GitHub_Trending/cl/claude-subconsciousClaude Subconscious 是一个给 Claude Code 装潜意识的背景插件它在后台观察你的会话、读取代码、积累记忆并在你下次提问前耳语提示。整个插件完全靠 4 个 Hook 脚本驱动而这些脚本正是用0、1、2 三种退出码Exit Code语义来告诉 Claude Code成功了、失败了但别管我还是停下来这次操作不能继续。读懂这套退出码规范你就理解了它永不出错、永不阻塞的设计精髓。Hook 退出码规范Claude Code 的三档交通灯在 Claude Code 的 Hook 机制中脚本的退出码就是与主流程对话的唯一信号语义如下退出码语义Claude Code 的行为0成功或无需操作一切正常继续执行stdout 内容可被注入上下文1非阻塞错误Non-blocking error错误只记录到 stderr不中断当前操作2阻塞错误Blocking error阻止当前操作继续如阻断工具调用、拦截 prompt 处理本项目的 4 个 Hook 在 hooks/hooks.json 中统一注册并各自配置了超时5s / 10s / 120s确保任何脚本都不会无限卡住主流程Hook 事件脚本超时实际使用的退出码SessionStartsession_start.ts5s0、1UserPromptSubmitsync_letta_memory.ts10s0、12 保留PreToolUsepretool_sync.ts5s0、1Stopsend_messages_to_letta.ts120s异步0、1每个脚本的文件头部注释都明确写了自己的退出码契约例如 sync_letta_memory.ts 开篇即声明0 - Success / 1 - Non-blocking error (logged to stderr) / 2 - Blocking error (prevents prompt processing)0 号语义成功也包括无事发生的沉默process.exit(0)在这个项目里出现频率最高它覆盖两类场景真正成功记忆同步完成、会话通知发出、后台 worker 已启动。合法的空操作比如LETTA_MODEoff时直接静默退出pretool_sync.ts 在检查发现没有新消息、没有记忆变更时也返回 0——对高频触发的PreToolUse钩子来说沉默就是正确的回答。这里有个值得学习的细节pretool_sync.ts 的catch分支捕获异常后依然返回 0注释写着 Non-blocking - just exit silently。即使出错它也选择不打扰你——这与 1 号语义形成了鲜明对比。1 号语义非阻塞错误我失败了但你可以继续当脚本遇到LETTA_API_KEY未设置、网络请求失败等错误时会process.exit(1)并把错误信息写入 stderr。按 Claude Code 的规范退出码 1只会在界面上记录一条钩子错误绝不会中断你的会话或工具调用。典型代码见 sync_letta_memory.ts 的catch块} catch (error) { console.error(Error syncing Letta memory: ${errorMessage}); // Exit with code 1 for non-blocking error // Change to exit(2) if you want to block prompt processing on sync failures process.exit(1); }注意这行关键注释如果你想让同步失败时阻断 prompt 处理就把这里改成 exit(2)——作者把 1 和 2 的抉择权直接留在了源码里。2 号语义阻塞错误项目保留但默认不启用退出码 2 在 Claude Code 中的力量是一票否决PreToolUse钩子返回 2 会阻止该次工具执行UserPromptSubmit返回 2 则拦截整条 prompt。但在 Claude Subconscious 的设计哲学中README 称之为Never blocks默认所有错误都走 1 号通道。原因很直白它只是个背景意识后台服务抖动不该绑架你正在写的前台代码配合 5s~10s 的短超时最坏情况也只是多等几秒真正耗时的大任务Stop钩子发送完整转录被设为async: true异步执行见 hooks/hooks.json根本不占用退出码通道。也就是说0 和 1 是日常用语2 是保险丝——文档化的保留开关供想强制记忆同步失败就停止的用户自行改造使用。 新手调试清单如何验证 Hook 是否被阻塞看日志所有钩子的运行记录都在$TMPDIR/letta-claude-sync-$UID/下如session_start.log、send_messages.log开调试设置LETTA_DEBUG1脚本会把细节写到 stderr不影响退出码查退出码若界面上频繁出现钩子报错多半是退出码 1 的非阻塞错误优先检查LETTA_API_KEY是否设置改阻塞行为若你确实希望某个失败卡住流程只需把对应脚本的process.exit(1)改为process.exit(2)这正是 sync_letta_memory.ts 注释指出的路径。总结Claude Subconscious 用一套极简的退出码契约实现了背景代理的可靠边界0 继续含正常沉默1 报错但不打扰2 阻断默认不启用留给进阶用户。理解这 3 个数字你就理解了所有 Claude Code 插件开发中最核心的接口约定退出码即策略语义即行为。想动手研究可通读 README.md 的 Hooks 章节与 scripts/ 目录下的 4 个钩子脚本源码。【免费下载链接】claude-subconsciousGive Claude Code a subconscious项目地址: https://gitcode.com/GitHub_Trending/cl/claude-subconscious创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表