关于 THOR
THOR 是面向 Claude Code 等编码 Agent 的本地项目记忆工具,会在相关文件或命令出现时提供笔记,并可用实时校验证明阻止不当修改。记忆、学习和项目数据默认留在本机。
主要功能
- 01按项目隔离记忆
- 02在相关文件和命令处呈现笔记
- 03实时校验规则并阻止匹配修改
- 04检查过期或未使用的笔记
- 05本地保存记忆与学习记录
- 06保留笔记的历史版本
适用场景
- 01提醒新会话注意项目约束
- 02防止修改仍受规则保护的文件
- 03整理过时或无效的项目笔记
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm ghcr.io/nworks3d/thor-mcp:2.6.2本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/nworks3d/thor-mcp:2.6.2stdio工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍

THOR - 适用于 AI 编码助手的记忆
大多数记忆工具只能提醒你的助手。THOR 可以拒绝执行。
给它一条附带证明的笔记——一个现在就能运行的小检查,例如“这个文件仍然包含那一行”。从此,这条笔记就不再是建议。THOR 会在匹配的编辑或命令运行之前拒绝执行。它不是助手可以随意跳过的建议,而是一次强制拦截。
这项证明会在真正需要的那一刻,针对你的实际项目实时运行。如果一条笔记已经过时、不再描述实际情况,它就会悄然失去证明效力——因此绝不会误拦你。
其他本地记忆也可以拒绝写入。不同之处在于拦截的依据:它来自实时检查的证明,而不是盲目信任的一条规则。生成证明的整个流程,包括学习,都在同一个地方运行:这台机器。
大多数笔记只提供信息:固定后会在每次会话开始时交给你的助手,或者在助手首次访问相关文件或命令时显示。
对于一再被提供却从未接受评估的笔记,THOR 会一次性集中询问,而不是逐条询问:在会话结束时进行回顾(/thor-eval),THOR 大约每周会针对每个项目发起一次。THOR 不会打断普通操作,询问某条笔记是否有帮助或是否造成了干扰。回顾只会列出你自己的会话中实际触发过的笔记——绝不会列出只在其他无关工作中出现过的笔记。自上次改写以来,如果某条普通笔记两次被判定为“不适用”,它就不会再被提供,不过你仍然可以主动查找。改写笔记的文本、检查项或绑定关系后,计数会重新开始;而检查项可以拒绝执行的笔记绝不会以这种方式隐藏。
健康检查会明确指出已经失效的内容:现在检查结果为假的证明、指向空无一物的笔记,以及过于拥挤、从未有机会显示的笔记。
所有非代码内容——食谱、书籍、训练日志——都存放在各自独立的资料库中,彼此分开,因此不会与部署规则争抢空间。
默认情况下,所有内容都保留在你的机器上:无需账户、密钥或云服务——包括 THOR 学到的、哪些笔记值得保留的信息。只有两类内容可能离开你的机器,详见下方的“保留在你的机器上”。
开始使用。 将此仓库的链接发送给你的 AI 助手(Claude Code),并说“安装 THOR”。它会自行完成整个设置;唯一需要你做的是关闭 Claude Code,然后重新打开一次。 下文的入门指南介绍了完整的分步流程。如果你是助手,请阅读 AGENTS.md。
THOR 免费,并采用 GPLv3 许可证。如果它值得你支持,你可以为这项工作提供帮助: 请我喝杯 Ko-fi 或 成为 YouTube 会员—— 完全自愿,没有付费墙,无论如何一切都会保持开放。
你是正在为合作对象设置 THOR 的 AI 助手吗? 请直接阅读 AGENTS.md。它是专为你编写的。
更喜欢观看视频?上方的视频介绍了 THOR 是什么,以及它存在的原因。
它能做什么
记住你告诉它的事。 一条规则、一个坑、一项决定、项目的结构。用你自己的话说一次,就会一直保留,直到你修改它。
在恰当的时候把它交还给你。 它不是一个需要你记得去用的搜索框。当你正在编辑相关文件或运行相关命令时,这条笔记就会出现在一场从未听说过它的对话中。
阻止错误的更改,而不只是发出警告。 带有可验证内容的笔记可以直接拒绝写入。大多数笔记只是提供信息,这是有意为之:阻碍正当工作的规则,是这个系统能造成的最昂贵代价。
让不同项目彼此隔离。 每个项目都有自己的记忆。一个仓库的规则绝不会泄漏到另一个仓库。
告知你哪些内容已经过时。 它会统计自己的死路:指向已移动文件的笔记、从未被读取的笔记,以及被更醒目的笔记挤到一旁的笔记。它会用直白的语言明确告诉你,让你可以修复这些问题。
留在你的机器上。 不需要账户、密钥或服务。THOR 绝不会主动发送任何内容。只有两种内容可以离开你的机器,而且都需要你同意:关于 THOR 本身的错误报告,只有在你明确同意发送所显示的确切文本后,才会发送到其 GitHub 页面(会先移除文件路径、项目和计算机名称、地址、密钥和密码);以及备份到你指定位置的记忆(如果你选择备份)——保存在这台机器上的备份不会发送任何内容。近期命令和回复的简短记录会保存在记忆旁边,以便 THOR 测试自己的规则;它绝不会离开这台机器,并且可以关闭(install --set-recording off)。
实际使用时是什么样子
几个月前,你吃过一次苦头,发现这个项目锁定在较旧的 Node 版本上,任何更新的版本都会导致构建失败。你说过一次这件事,然后就继续做自己的事了。
今天,一场全新的对话打开 package.json 准备添加依赖,看到一个看起来已经过时的引擎版本范围,差一点就顺手把它升级了。就在它输入之前,你自己的那句话出现在它面前。
这就是全部理念。不需要你记得去用的搜索框,而是恰好及时出现的记忆。
“我已经有 CLAUDE.md 了”
大多数助手会在启动时读取规则文件——CLAUDE.md、AGENTS.md、
.cursorrules。这确实有帮助,但很快就会遇到瓶颈。
文件一旦长到一定程度,就会变成电话簿,而没人会从头到尾读电话簿。你的助手会扫一遍,抓住大意,然后继续往下做。规则明明写在里面,却被跳过了。事后看不出任何异常,因为那一行还好端端地留在文件里,于是你仍然相信自己已经做好了防护。
真正不同之处就在这里。想象一个全新的 Agent,它没有历史记录,不知道这个项目已经让你付出了什么代价,只差一次按键,就会执行去年春天导致生产环境出问题的那条写入操作。规则文件也许会在第四页的某处提到这件事。THOR 会拦住这次按键。写入不会发生——拦住它的,是你在问题发生那天写下的备注。
这就是全部承诺:不是更好的建议,而是让错误的改动无法落地。
要做到这一点并非毫不费力,而且最好在开始前就了解这一点。只有按要求写好的备注,才能发挥这种作用:它必须关联到真实的文件或命令,并包含可检查的信息,以证明它仍然适用。THOR 自带一组入门备注,正是为了教会你如何做到这一点,并会拒绝无法发挥作用的备注。AGENTS.md 完整说明了这些规则。
有三件事共同促成了这一点,它们都保存在你机器上的一个文件里:
1. 永不丢失。 每条备注都会永久保存。改变想法时,旧版本也会保留下来,因此你随时可以回看自己过去的想法,以及它们何时发生了变化。如果某条备注的两个版本发生冲突,THOR 会同时保留两者并告诉你,而不是悄悄选一个、丢掉另一个。这就像你对待源代码一样,认真保存自己的经验。
2. 在恰当的时刻出现。 你每发送一条消息,THOR 都会检查你的记忆。当助手第一次准备读取某个文件,或运行某条与你的规则相关的命令时,THOR 就会立即把那条规则呈现给它。在犯错之前,而不是之后。
3. 助手会维护它。 这不是一本需要你手动填写的笔记本。你的助手可以添加备注、修正备注、让不再适用的备注退役,还可以标记哪些备注真正发挥了作用。使用得当的 THOR,会由你的助手在你工作时默默整理维护。
它也会读取你的代码。将它指向一个项目后,它会读取源代码和文档,因此对于“这部分在这里是如何工作的”,它能根据你的实际项目作答,而不是猜测。
默认情况下,所有内容都保留在你的机器上。无需云服务、账号或订阅,也无需注册。如果缺少某个可选组件,THOR 会悄悄退回到更简单的工作方式,而不会因此出故障。
一条真正能拦住你的备注
在恰当的时机显示警告很有价值,而很长一段时间里,这就是 THOR 能做的全部。备注可以发声,却不能拒绝。
版本 2 让备注能够附带一份证明其时效性的凭据:一个小检查,THOR 可以立即运行,以确认这条备注是否仍然适用于你的项目。“这个文件仍包含那一行内容。”“那个文件仍然存在。”“我们写的任何内容中都不会出现这个字符。”或者,要查出遗漏而非错误时:“我生成的每个 Agent 都会注明要用哪个模型来完成工作。”
这改变了备注可以做的事:
- 证明现在运行成功且条件成立的备注,可以直接阻止错误更改。
- 仅有文字支持的备注只能警告,也只能警告。它可以告知你的助手,但绝不能禁止操作。
- 如果无法运行证明——文件已移动、路径已不存在——就不会阻止任何操作,只会报告需要检查。
第一种拦截也适用于通过助手自身工具进行的编辑以外的操作:删除受保护的文件、清空文件,或通过助手运行的命令覆盖文件,都算作同一种错误更改,并会以同样的方式被拦截。
这种区分的原因令人不安,但值得直说。备注会过时。你写下一条备注,项目继续演进,而备注悄然变得不再正确。如果一个工具允许任何旧备注阻止你的工作,它大部分时间都会因为几个月前就不再成立的原因而拦住你。因此,THOR 只会把这种权力交给那些能在此刻证明自己仍然描述着你的项目的备注。
所以,正如本页顶部已经说过的,你的大多数备注永远不会拦截任何操作。健康检查会打印有多少条备注可以拦截,你应该留意这个数字。根据作者自己的记忆,首次统计时,2999 条备注中只有 2 条能够自证;经过一天有意的工作后,这个数字升到了 256。这个数字是靠人工逐步提升的,因为判断一条备注如何证明自身,需要针对那条备注作出判断。
把这个数字打印出来本身就是关键:一个没有连接任何内容的安全网,看起来和一个真正起作用的安全网一模一样。
THOR 会主动处理,让你不必记得去做
把这件事交给想起它的人,结果就是永远不会发生。所以 THOR 会在两个地方自行处理。
写入笔记时。 系统不会询问你这条笔记是否可以检查,而是由 THOR 尝试检查。凡是明确写出命令、标志或文件名的规则,都会交由同一个保护机制检查;这个机制也负责监视你的文件和命令。如果根据笔记内容建立的检查确实能拒绝错误更改,同时放行普通更改,这条笔记就会作为可拒绝更改的规则保存。如果没有检查能做到这一点,它就会作为普通笔记保存:仍会在恰当的时机重新出现,只是无法拒绝任何更改。笔记被拒绝时,系统会说明应该改写成什么。
处理你已有的笔记时。 每次审查开始时,THOR 都会自行整理较早的笔记(见下文)。只有需要助手自行判断的内容才会被交给它,并且会集中在一个区块中,这样,在这些机制出现之前写下的记忆也会得到处理,而不是被判定为无可救药。
有一点值得明确说明:THOR 能证明笔记已被接入保护机制,使匹配的更改会被拦截。但它无法知道你输入的文本是否就是实际命令使用的文本。一个拼错的片段也能完美接入保护机制,却什么都防不住。因此,健康检查会分别报告两个数字——有多少笔记可以拒绝某些更改,以及实际拒绝过更改的笔记有多少。请相信第二个数字。
审查就是清扫:在会话结束时运行 /thor-eval。它会逐一处理已提供给记忆、但尚未判定的所有内容,修复悄然过时的内容,并一次性偿清积欠,而不是每次只处理一条笔记。如果会话从未运行审查,这些积欠就只能留给下一个会话继承。
你不必记得运行它。自上次审查以来,项目累计工作时间达到一小时,并且助手在该项目中至少投入了十分钟自己的工作后,THOR 就会暂停助手的回合结束,直到审查已提交并完成检查。审查开始时,THOR 会自行整理较早的笔记;助手只处理需要自行判断的内容;审查报告中说明判定内容和拒绝内容的部分,则由 THOR 根据自己的记录撰写,因此无法伪造。通过非 THOR 自有工具提交的审查不计入,THOR 也会说明原因。
审查频率取决于你的套餐。 审查会占用与你自己的工作相同的使用额度,因此 THOR 会将每个项目的审查频率限制为每周一次。较低套餐(Pro 及所有低于 Max 的套餐)限制严格:每周一次,无论发现什么,都不会改为每日审查。Max 套餐同样每周审查一次,但只要发现问题(缺陷、会拒绝实际工作的规则、未完成的检查、不计入的审查,或 THOR 自身的错误),就会改为每日审查;一旦审查未发现问题,就会恢复为每周一次。安装时,THOR 会从 Claude Code 自己的设置文件读取你的套餐,并在首次会话的问题中请你确认;install --set-plan max 或 install --set-plan small 会记录你的回答。审查请求会用一行说明适用的是哪种频率。
有脊梁的记忆
Version 1 记得很好,却从不质疑。它会在恰当的时机把笔记交给助手,然后寄希望于此。Version 2 则是有脊梁的同一份记忆。
- 笔记可以拒绝。 标题和本节其余内容说的就是这件事。 Version 1 只能发言。
- 不合格的笔记不再被收录。 无法触发、没有任何能证明其错误的依据、篇幅长达一整页,或只是重复已有笔记的笔记,都会被拒之门外,并告知原因和修复方法。Version 1 会存下收到的所有内容,几个月后你才发现其中一半根本不会被读取。
- 它会统计实际做过的事。 有多少笔记可以拒绝某些内容,有多少笔记曾经拒绝过,以及有多少记忆从未被重新读取。Version 1 没有统计它赖以实现的那项功能,这就是安全网会坏上一年的原因。
- 维护不再是可选项,也不会絮叨。 评估那些反复触发的笔记并清理旧规则,会在项目评估中询问一次(每个项目每周一次),而不是每轮结束时都问。只有会话自身做了某些事时,才会暂停这一轮:刚存入了一条永远不会被看到的笔记、留下了未完成的设置,或你明确说出的决定没有被存储。它不会用“稍后再做”的承诺来搪塞。
- 你可以选择把记忆副本保存在别处。 首次会话时由你决定是否备份;安装过程不会替你开启备份,所以在你做出选择前,不会备份任何内容。选择备份后,THOR 大约每天会将完整记忆写入一个私有 git 仓库。
install --set-backup local会将该仓库保存在本机、与记忆文件放在一起,不会向任何地方发送内容(这能防止记忆文件损坏,但无法防止磁盘故障)。install --set-backup <folder or address>还会将你指定的位置(你拥有的 NAS 或另一台电脑上的文件夹,或私有仓库)添加为名为nas的远程,并且副本只会发送到那里。install --set-backup off会停止备份。doctor会说明上次备份存放的位置和时间,或者说明备份为何一直失败。只需一条命令即可恢复。 - 携带它几乎不花成本。 每条笔记最多 300 个字符,每个区块最多包含四条笔记、共 1200 个字符,因此写入对话的内容只有几百个 token,而不是每轮都重新读取整份规则文件。一万条笔记的记忆,每轮成本与五十条笔记相同。没有任何东西会调用模型来决定要发送什么——这是一个读取本地文件的本地程序,因此不会在你敲下按键前产生网络往返。唯一的例外是置顶笔记:对话开始时会完整读取这些笔记(新记忆默认有 22 条,且该区块上限约为 9,500 字节),所以请谨慎置顶,其余交给上限处理。
- 回复也会经过检查。 新记忆附带一个包含六条回复规则的小文件,并与记忆放在一起:类似结果的回复要以直白的摘要开头;不要让你去检查助手自己就能检查的内容;不要条件反射式地添加免责声明;回答控制在约 1000 个字符以内;声称检查过某项内容时要提供依据;绝不要只说“全部已检查”而不说明检查了哪些内容。违反其中一条的回复会被退回并重写一次。你要求的摘要或概览可以更长,首次会话清单也不受长度规则限制。编辑文件、删除某条规则,或删除整个文件,即可修改或关闭这些规则。
- 过时笔记会被找出,而不是任其腐烂。 证明结果为假的笔记会被报告,而不是悄悄地继续传播错误信息。反复触发、却从未有人表示是否适用的笔记会被询问;自上次重写以来,如果某条笔记两次被判定为“不适用”,就会停止显示普通笔记,但仍可搜索到(重写其文本、检查条件或绑定会重新开始计数;检查条件可以拒绝的规则则绝不会以这种方式隐藏)。Version 1 中,出错的笔记只会原样保留。
- 拥挤情况一目了然,写入也会被拒绝。 一个区块只能容纳少量笔记,因此笔记之间会相互竞争。Version 2 会统计这种竞争,在你刚把内容存入一个拥挤到永远无法显示的位置时提醒你,指出占据位置的笔记,并在笔记所有可能占据的位置都已被更高权重的笔记占满时,直接拒绝写入。与某个文件、文件夹或命令绑定的笔记,只要该位置已经容纳了最多可显示的笔记,就会立即被拒绝——较轻的竞争笔记也会计入,因此较重的笔记不再会悄无声息地把较轻的笔记挤出视野。Version 1 会接受写入而不作任何提示,这就是记忆里塞满永远无人能看到的建议的原因。腾出空间是助手自己的工作:拒绝信息会列出该位置上的每条笔记、各自的权重,以及是否可以拒绝任何内容,并说明三种切实可行的处理方式——合并两条内容相同的笔记;将一条移到它实际对应的、更具体的文件或命令;或者说明原因后移除一条过时笔记。这件事绝不会变成需要你回答的问题,也绝不会为了绕过限制而丢弃有效检查条件。
- 同一时间只有一个助手负责维护项目。 两个会话在同一项目中工作时,只有一个会话会暂停,以评估笔记、修复规则或编写项目评估;另一个会话只会收到一行提示,说明哪个会话正在处理。如果负责处理的会话静默半小时,下一个被要求处理这些工作的会话就会接手。
- 助手不能替你输入“同意”。 规则可以规定某项命令需要你明确同意(例如发送电子邮件或操作正在运行的服务)。这时,只有你自己的消息才算数——无论是你在本轮还是上一轮亲自输入的内容。助手把这个词写进自己的命令、辅助程序的报告,或你粘贴的引文中,都不算。如果 THOR 无法读取对话来核实,就会拒绝执行,而不是猜测。
第二个记忆库,存放所有非代码内容
上面的记忆库是为工作设计的。它设有门槛,会用笔记打断你, 而且能进入对话的内容有严格上限——这些特点对食谱来说都 完全不合适。
因此,2.1 新增了一个资料库,而且它确实是独立的:有自己的文件、 自己的两条命令,并且完全无法访问第一个记忆库。放进去的任何内容都不会 打断你、与笔记争抢注意力,或占用区块空间。只有在你主动询问时, 你才会看到它。
它的运作方式就像一个书架。
- 所有内容都放在书架上,书架之间不能嵌套。书籍、食谱、 训练日志、开销记录都可以放上去。归档时如果没有指定书架,系统会拒绝, 并列出你已有的书架,这样助手就会从已有书架中选择,而不是凭空编造名称。
- 只有你能创建书架。 如果没有合适的书架,助手必须询问你新书架 应该叫什么——你回答后,它会在同一条回复中复述你给出的名称、创建书架, 并将条目归档到其中。它绝不会擅自编造名称或跳过提问。这条规则可以避免 整齐的八个书架扩展成杂乱的六十个。
- 书架内容增多时,会添加标签,而不是拆分书架。 一个书架上有两百道食谱, 可以按“烧烤”或“甜点”筛选,但仍然是同一个书架。这样书架列表才能 短到让你记得住。
- 你看到的是索引,而不是一大段文字。 打开书架后,每个条目显示一行。 按编号查看其中一条,即可阅读完整内容。
- 重复内容会被拒绝,并指向你已有的条目。
- 内容永远不会被删除。 助手可以将不再适用的条目标记为已归档——它会从 列表和搜索结果中移除,但只要资料库还存在,就始终可以通过编号完整阅读。
- 搜索绝不会只回答“没有结果”。 如果你使用的词没有匹配到——这很常见, 因为你搜索时使用的词往往与你写下的词不同——它会引导你查看对应的书架。 你写的是“ribben”时,搜索“ribbetjes”也能找到它。
THOR 可以整理的两个文件夹(可选)
这两个文件夹在你指定文件夹之前都处于关闭状态。THOR 只会读取这些文件夹: 绝不会删除、移动或编辑其中的任何内容。如果你从未指定文件夹, 本节中的操作就不会发生。
你不必亲自输入任何命令:告诉助手“将我的
temp-until-live 文件夹设置为 D:\Work\temp-until-live”(或“我的工具文件夹”),它就会
运行相应的命令。下面列出了命令,供你了解具体操作。
其中,install 是 THOR 文件夹中的程序(Windows 上为 $HOME\thor2\install.exe,
Linux 上为 ~/.thor2/install),--db 用于指定你的记忆文件
(Windows 上为 $env:LOCALAPPDATA\thor2\thor.db,Linux 上为 ~/.local/share/thor2/thor.db)。
用于存放尚未上线项目的文件夹
假设你为他人制作东西:横幅、传单、印刷品,或网站改动。项目尚未完成时,会放在临时文件夹中;上线后,这份副本就可以删除了。很容易弄不清哪些项目处于哪种状态。
文件夹需要采用以下结构(这部分由你自行设置):
- 每个项目一个子文件夹,名称包含日期、项目和简短主题:
2026-10-20_shop_banner。 - 每个子文件夹中都有一个名为
STATUS.txt的纯文本文件。第一行以STATUS:开头,说明项目当前状态,例如STATUS: waiting for the client。 - 项目完成并上线后,将第一行改为
STATUS: live。这表示可以删除该子文件夹。
然后告诉 THOR 文件夹的位置(也可以使用 \\nas\projects\temp-until-live 这样的网络文件夹):
& "$HOME\thor2\install.exe" --set-temp-folder "D:\Work\temp-until-live" --db "$env:LOCALAPPDATA\thor2\thor.db"
~/.thor2/install --set-temp-folder "/srv/work/temp-until-live" --db ~/.local/share/thor2/thor.db
它会先检查文件夹是否存在,然后才写入任何内容,并用通俗易懂的文字说明它设置了什么。从那以后,你每天首次启动会话时,助手都会收到类似这样的信息:“temp-until-live:有 2 个项目文件夹表示可以删除(……),有 1 个文件夹超过 30 天且未标记为上线(……)”,并告知你。由你决定,并自行删除文件夹。“超过 30 天”根据文件夹名称中的日期计算;要更改 30 天,请用文本编辑器打开 work-folders.json(它位于 thor.db 旁边),然后修改 temp_max_age_days 后面的数字。doctor 会显示相同的信息。要再次关闭此功能:使用相同的命令并加上 --set-temp-folder off。
用于存放辅助工具的文件夹
每次你让助手编写一个小脚本(重命名这些文件、合并这些 PDF)时,它都会写一个;到了下周,它又会写出同一个脚本,因为它不知道之前已经有了。工具文件夹可以解决这个问题。
文件夹需要采用以下结构:
- 每个工具一个子文件夹,名称体现其用途:
pdf-merge。 - 每个子文件夹中都有一个
README.txt(或README.md),第一行必须用一句话说明工具的用途:Merges several PDF files into one.。 - 工具的脚本放在同一个子文件夹中。
告诉 THOR 文件夹的位置:
& "$HOME\thor2\install.exe" --set-tools-folder "D:\Work\tools" --db "$env:LOCALAPPDATA\thor2\thor.db"
~/.thor2/install --set-tools-folder "/srv/work/tools" --db ~/.local/share/thor2/thor.db
你将获得:
- 每次会话开始时显示列表:“可用的辅助工具位于 D:\Work\tools:”,并根据各工具 README 的第一行,每个工具列出一行。无需任何人手动更新列表;列表会根据文件夹内容生成。THOR 会在记忆旁边保存一份副本,只有文件夹内容发生变化时才会重新生成,因此几乎不耗费资源。
- 每天最多检查一次:工具文件夹缺少 README、README 第一行为空,或脚本文件散落在工具文件夹中而非各自的子文件夹里。
- 询问是否处理遗留脚本,且只询问一次。 如果助手在非 git 项目、非工具文件夹且非 temp-until-live 文件夹中的某个位置写入了脚本文件(
.py、.ps1、.sh、.js等),并且 30 分钟后该文件仍然存在且未被改动,本轮对话结束时会暂停一次。助手会被要求将有用的脚本移入工具文件夹并添加 README,同时删除一次性脚本。每个文件每个会话只会被询问一次,因此绝不会陷入循环。只有使用 Claude Code 自带的文件工具写入的文件才会被发现;通过 shell 命令创建的脚本(echo ... > x.py)不会被发现。
如果文件夹位于已关闭的网络共享中,会话启动时不会等待它:THOR 大约等待 1.5 秒后就会放弃,显示上次保留的列表(并标注日期),或者不显示任何内容。要再次关闭此功能:使用相同的命令并加上 --set-tools-folder off。
开始使用
最快的方法——让你的助手来安装。 把此仓库的链接发给你的助手,并请它“安装 THOR”。它会阅读为它编写的 AGENTS.md,为你运行下面的一条命令,检查是否成功,然后只让你做一件事:重启一次。无需下载任何内容,无需输入路径,无需安装 Rust,也无需回答问题——重启后的第一次对话就会自动完成设置,你只需提出要求,就能更改默认设置。
第一次对话还会显示一份编号清单,逐项列出安装所做的一切,每项占一行。清单中的所有功能都已启用,只有两项会保持关闭,直到你选择启用:助手 Agent 模式(由你的主助手评估工作,再由更便宜的模型在辅助 Agent 中执行;install --set-helpers on 可启用此模式)和备份(在你选择 local 或指定位置之前,不会备份任何内容)。只有当你的项目中没有 CHANGELOG.md,且你没有拒绝时,变更日志项才会在项目中创建 CHANGELOG.md。按编号回答(“1 是,3 否,10 本地”),或说“使用默认设置”;你没有提到的项目会保留默认设置。
简易方式:五个步骤,无需编程工具
你需要安装并至少打开过一次 Claude Code。无需准备其他内容:不需要账号,也不需要密钥。下面的一行粘贴安装方式既不需要 git,也不需要 Python。改为让助手安装 THOR 时,它会检查你的电脑上是否有 git 和 Python(它自己的工具会用到),通过系统的包管理器安装缺少的程序,并且最多只会让你点击一次授权。
-
打开终端。 在 Windows 上,按 Windows 键,输入
PowerShell,然后按 Enter。在 Linux 上,打开终端。 -
粘贴一行命令并按 Enter。 它会从此项目的 GitHub 页面下载最新版本,根据旁边公布的校验和验证下载内容,将其解压到你的主文件夹中的
thor2文件夹,并完成所有设置。它会用通俗的文字打印所做的操作。它不需要管理员权限,也不会在你自己的用户文件夹之外安装任何内容。Windows 上,在 PowerShell 中运行:
irm https://raw.githubusercontent.com/nworks3d/THOR-for-claude-code/main/install.ps1 | iexLinux 上运行:
curl -fsSL https://raw.githubusercontent.com/nworks3d/THOR-for-claude-code/main/install.sh | sh(在 Windows 上,如果 THOR 程序无法启动,请安装 Microsoft 的“Visual C++ Redistributable”,然后再次粘贴命令。重复粘贴始终是安全的。)
-
完全退出 Claude Code,然后重新打开。 Claude Code 只会在启动时加载 THOR,因此在重启之前,THOR 不会生效。
-
为你的主题创建一个文件夹,并在其中打开 Claude Code。 例如,在“文档”中创建一个名为
Kitchen renovation的文件夹,将笔记、报价和 PDF 文件放进去。它不必是编程项目。然后告诉你的助手:“为此文件夹创建独立的 THOR 记忆,并将其设为一个主题。” -
照常工作。 只需告诉助手一次(“瓷砖来自 Tilehouse”“我们选了橡木台面”),之后在该文件夹中的任何对话里,它都会记得这些信息。每个主题文件夹都有自己的记忆,因此不同主题的信息不会相互泄漏。要检查是否一切正常,可以问你的助手:“THOR 正常工作吗?” 它回答的前几行会是一个简单明了的摘要。
设置会修改 Claude Code 自己的两个文件——其设置文件和可用工具列表——并会在修改前备份这两个文件。想先阅读脚本再运行?可以先在浏览器中打开此仓库里的 install.ps1 或 install.sh。目前还没有 macOS 版本,因此 Mac 用户请采用下面的方式。要使用其他助手?请参阅下方的在其他助手中使用。
故障排除:“THOR program missing”(杀毒软件删除了一个文件)
杀毒软件有时会误删像 THOR 的
sync.exe 这样未签名的小程序(即“误报”;Windows Defender 在
2026-10-11 就这样做过)。随后,THOR 会在对话开始时以及在
doctor 中提示你,提示行以 PROBLEM: THOR program missing 开头,并指出
缺失的文件。现在不会再有其他问题悄无声息地发生:每小时运行的任务会记录其
失败情况,而 doctor 会说明它是从未运行、运行后失败,还是程序已丢失。要恢复程序,请按以下步骤操作:
- 打开 Windows 安全中心(按 Windows 键,输入
Windows Security)。 - 选择 病毒和威胁防护,然后选择 保护历史记录。
- 找到一条提及 THOR 文件的记录,打开它,然后选择 操作 > 还原。
- 没有这样的记录?重新运行 THOR 的安装(与上面的简易方式使用相同的命令): 它会重新放回这些程序。
如果问题持续发生,你的助手可能会主动提出为 THOR 的程序文件夹添加 Windows Defender 排除项。只有你同意后,它才会这样做。这样做的影响是:Defender 会停止扫描该文件夹中的文件,因此放入其中的恶意文件将无法被检测到。Windows 会显示一次管理员权限提示。拒绝也没关系,而且 THOR 绝不会自行更改 Windows 安全设置。你可以随时在 Windows 安全中心 > 病毒和威胁防护 > 管理设置 > 排除项中移除该排除项。
面向开发者:自行构建
你需要 Rust 工具链。除此之外什么都不需要:不需要获取密钥,也不需要预先下载模型或注册账户。
cd thor2 && cargo build --release --features semantic
--features semantic不是可选项,省略它会导致静默失败。 不加这个选项,一切仍然可以构建、运行,也能正确回答每一个逐字搜索。失效的是按含义搜索:它会完全没有结果,也不会在任何地方报错。可靠地区分两者的方法是看文件大小。查看thor2/target/release/serve.exe——超过 20 MB 才是正确构建,只有几 MB 则是错误的构建。加上这个标志重新构建。
然后自行运行设置流程。这与单命令安装最后执行的步骤相同,通常情况下,你完全不需要输入路径:
thor2/target/release/install.exe
它会自动找到助手自己的两个配置文件,在你还没有记忆时为你创建记忆,将 THOR 接入助手,并注册助手写入内容的部分。它还会安装一组共享的 git 钩子,在这台机器上的每个仓库中运行(除非其他工具已经设置了 git 的全局钩子文件夹;这种情况下 THOR 会保留原样并告知你),以确保每次提交后代码阅读内容都是最新的;每个钩子都会将控制权交还给你自己的仓库钩子,因此现有功能不会停止工作。同一组钩子还会阻止提交视频文件或超大文件(见下文媒体拦截)。 它会在修改这两个文件之前先备份它们,绝不会删除任何非它创建的内容,而且第二次运行时不会做任何改动。
全新的记忆并非空白。它会包含 22 条简短的置顶笔记,内容包括如何写下日后还能重新调取的笔记,以及诚实和卫生习惯;从此以后,助手每次开始对话时都会收到这些笔记。这一点比听起来更重要:如果助手面前空无一物,它写下的笔记就会采用一种永远无法再次触发的格式,而你们双方可能好几周都不会察觉。这些都是普通笔记——你可以取消置顶、用自己的话改写,或直接删除。已有的记忆绝不会被预置笔记,因此升级绝不会向你自己的笔记中添加任何内容。
此外,还会附带一套使用助手进行编码的通用工作规则,这是作者吃过亏后总结出的习惯:每次面向用户的更改都要附上一条变更日志记录(如果项目有维护变更日志)、说“完成”之前先运行测试并引用真实结果、绝不提交密钥、不对共享分支强制推送、确认推送目标、公开任何内容前先检查、在副本上演练破坏性操作,还有其他几条(共 13 条)。每条规则都会在相关操作即将发生前出现——提交、推送、删除时——并且只起提醒作用,因此,为别人的项目编写的规则不会阻止你操作。Windows 上有一个例外:其中两条会阻止可能闪现控制台窗口的调用(一条是未隐藏的 Start-Process,另一条是使用 /it 创建的计划任务)。请助手移除你不想要的规则。带有辅助 Agent 模式的两条备注不在其中:新建记忆时,该模式处于关闭状态。
只有在设置较为特殊时才需要使用标志:--settings 和 --mcp-json 用于指定其他文件,--db 和 --serve-exe 用于覆盖查找位置,而 --no-mcp 会有意创建一份助手可读取但不可写入的记忆。如果缺少所需的程序,它会停止并说明情况,而不会安装一个之后会悄无声息地运行的程序。
然后重启助手。 它写入记忆的部分只有在重启后才会启用。在此之前,它已经可以读取记忆,但无法向其中添加内容。
第 3 步 - 检查。
thor2/target/release/doctor.exe --db "C:\Users\you\AppData\Local\thor2\thor.db"
每个部分各用一行通俗语言说明:你正在运行哪个构建版本、记忆是否正常、是否已启用按含义搜索、有多少条备注能够验证自身、有多少条指向已不存在的文件,以及有多少条绑定到了永远不会发生的事情。此操作不会更改任何内容。
若只想查看构建版本号——在报告问题并需要准确说明所用版本时很有用——可按上文所述运行 doctor 并查看第一行,或使用 --version 运行 thor2/target/release/ 中的任意程序,例如 thor2/target/release/serve.exe --version。
其中一行只有在有内容需要报告时才会显示:如果它提示记忆自身的日志文件比记忆本身还大,说明有某种情况导致保存无法完成——请关闭其他可能打开同一记忆的程序,然后重新运行检查。较新的构建版本还会限制日志文件的最大大小,因此这种情况应该很少发生。
第 4 步 - 为每个项目创建独立的记忆。 在该项目的文件夹中,使用安装程序的完整路径,并指定与第 3 步相同的记忆:
"<path to thor2>/target/release/install.exe" --db "C:\Users\you\AppData\Local\thor2\thor.db"
这一点的重要性超乎你的想象。如果跳过这一步,THOR 会随着使用越来越多而变差,因为每次搜索都会受到你并未询问的项目干扰。它会用项目文件夹的名称来登记项目——若要使用其他名称,可添加 --project "my-project";该名称会保存在名为
.thor-project 的小文件中。它会读取项目代码,并将此文件夹登记为项目的工作副本:THOR 会在此处尝试验证规则是否适用于某个文件。若该名称已存在,它会拒绝更改,因为重命名项目范围会导致按旧名称归档的所有备注失去归属。
非代码仓库的文件夹——其中有主题相关的备注和 PDF,但完全没有 git——也可以用同样的方式处理。在该文件夹中运行安装程序,并添加 --topic。文件夹名称会成为项目名称,文件夹中会添加一个小型隐藏文件(.thor-project),其他内容不会受到影响。由于没有代码可供读取,因此无法在其中搜索文件;助手会自行读取文件,而 THOR 会记住你告诉它的内容。系统会拒绝将你的主文件夹或整个驱动器设为主题,因为范围太广。
"<path to thor2>/target/release/install.exe" --topic --db "C:\Users\you\AppData\Local\thor2\thor.db"
若要为项目设置较早版本,请改为在该项目的文件夹中运行一次此命令:它会登记工作副本,不会更改其他内容。
"<path to thor2>/target/release/install.exe" --register-root --db "C:\Users\you\AppData\Local\thor2\thor.db"
如果你是负责设置的助手,请参阅 AGENTS.md,其中详细说明了上述步骤。
媒体防护:避免意外将视频或超大文件提交到 git
安装程序设置的共享 git 钩子(见上文“开始使用”)还会在你提交时进行一项安全检查。如果此次提交会添加视频文件或大于 25 MB 的文件,git 就会停止提交,不会提交任何内容,并提示是哪些文件导致了问题以及该怎么处理。你无需进行任何设置。
设置此检查的原因。 Git 会永久保留每个文件的每个版本。视频只要添加过一次,就会让仓库永远变得臃肿;而一旦推送出去,之后就很难再清除。该检查会查看实际即将提交的内容,因此也能拦截 git add -A、git add . 和 git commit -a,因为这些命令会添加你没有明确指定的文件。
默认会拦截的内容。
- 根据文件名后缀识别的视频:
mp4、mov、mkv、webm、avi或m4v(也会识别大写字母,因此HOLIDAY.MP4也会被拦截) - 任何大于 25 MB(26214400 字节)的文件
只删除的文件不会被拦截,也不会对你磁盘上的文件做任何更改。
被拦截时该怎么做。 提示信息会给出相同的说明,并替换为你的文件名:
- 将文件从此次提交中移除:
git restore --staged "the-file.mp4"(如果是尚无任何提交的全新仓库,请使用git rm --cached "the-file.mp4")。文件本身仍会保留在磁盘上的原位置。 - 将文件保留在仓库之外,例如放在一个单独的文件夹中。
- 重新执行提交。
如需特意允许某个文件(例如确实属于项目的演示视频):打开仓库顶层目录下名为 .gitattributes 的文件,或者创建该文件,然后添加一行,内容为路径、一个空格和 thor-media-ok:
docs/demo/intro.mp4 thor-media-ok
如果路径中包含空格,请用双引号括起来:"docs/my demo.mp4" thor-media-ok。然后运行 git add .gitattributes 并再次提交。如果你使用 Git LFS 存储视频,请将 thor-media-ok 放在与 filter=lfs 设置相同的一行中:该检查依据的是文件名后缀,而不是文件中存储的内容。
如需更改规则。 这些都是常规 git 设置。在仓库内运行命令只会更改该仓库的设置;在 git config 后紧跟 --global,则会更改这台电脑上所有仓库的设置。设置名称均使用小写字母。
| 设置 | 作用 | 默认值 |
|---|---|---|
thor.mediagate.enabled | 设为 false 可关闭检查(no、off 和 0 也有效) | 开启 |
thor.mediagate.extensions | 视频文件后缀,以空格分隔;空值("")表示不按文件类型拦截任何文件 | mp4 mov mkv webm avi m4v |
thor.mediagate.maxbytes | 允许的最大文件大小,以纯数字字节数表示(不能写成 50m) | 26214400 |
thor.mediagate.parkdir | 可选:提示信息建议存放被拒文件的文件夹,格式为 <folder>/<YYYY-MM-DD>_<repository>_<subject>/,其中包含简短的 STATUS.txt,说明文件内容 | 未设置 |
例如,要在这台电脑的所有仓库中允许最大 50 MB 的文件:
git config --global thor.mediagate.maxbytes 52428800
要还原某项设置,请使用 git config --unset thor.mediagate.maxbytes(如果设置时使用了 --global,此处也添加 --global)。
须知。
- 完成合并的提交不会被检查:它会列出另一方带来的所有内容,而这些内容已经属于你的历史记录。检查会通过一行说明这一点。
- 重命名仓库中已有的视频,也会被视为添加文件。
- THOR 自己的备份文件夹会被有意排除在这项检查之外:它在那里保存的记忆副本可能超过 25 MB,因此 THOR 会在该文件夹自己的 git 设置中将
thor.mediagate.enabled设为false(每次创建副本时都会如此),其他所有仓库仍会进行检查。 - 这项检查属于 THOR 的共享 git 钩子,因此只有在使用这些钩子的地方才会生效。如果你之前已有自己的全局 git 钩子文件夹,安装程序会保留不动,检查也不会生效。
- 如果你在这项检查推出之前就安装了 THOR,请再运行一次安装程序(与“开始使用”中的命令相同):它会更新钩子,不会更改其他内容。
在第二台设备上使用 THOR
你可以在第二台电脑(例如笔记本电脑)上使用同一份记忆,并选择这台电脑可以获取多少内容。第二台电脑会获得一份只读副本:那里的助手会收到你的规则提醒,规则仍可阻止错误操作,搜索也能正常工作,但副本中不会写入任何内容。你想保留的笔记会保存在主电脑上,并在下次刷新副本时显示在笔记本电脑上。副本会自动刷新。
由你决定副本包含哪些内容。 指定笔记本电脑需要的项目,并说明是否也要包含通用工作规则(即不属于任何项目的笔记)。其他所有项目和你的个人资料库都不会被复制:它们不会被隐藏,也根本不会出现在副本的文件中。因此,这种方式适用于公司笔记本电脑。如果什么都不选,就会获取完整记忆。
笔记本电脑上的内容是一份经过筛选且拥有自己检查链的副本,因此 doctor 可以像检查任何记忆一样验证它。有两个需要注意的限制:你复制的笔记可能会提到某个未复制项目的名称(那里只是文字,不会造成问题);而曾归档到未选项目下的笔记会完全排除,即使后来它已被设为通用笔记。
首先需要准备什么(在主电脑上)
副本是从你的备份创建的,因此笔记本电脑必须能够读取它。这是 THOR 无法替你完成的一步。
- 找到你的备份。 在主电脑上运行 THOR 的健康检查(向你的助手询问“THOR 是否正常工作?”)。找到以
backup:开头的那一行。它会说明上一次副本存放的位置,例如backup: last copy went to backup-repo (remote nas: //nas/backups/thor), 3h ago。remote nas:后面的地址就是备份地址。如果没有这一行,说明你还没有选择备份位置:告诉你的助手“设置备份到”,后面接 NAS 上的文件夹或私有仓库地址,然后再次运行健康检查。 - 确保笔记本电脑可以打开该位置。
- NAS 上的文件夹:在笔记本电脑上打开文件资源管理器(Windows)或文件管理器(Linux),在地址栏中输入文件夹路径并按 Enter。如果系统要求输入用户名和密码,请输入并勾选“记住我的凭据”。如果文件夹打开后,你能看到其中有一个名为
thor2的文件夹(或备份自身的仓库文件),就完成了。 - 网站上的私有仓库:在笔记本电脑上打开终端并运行
git ls-remote "<the address>" HEAD。如果输出一行以一串长代码开头的内容,就完成了。如果系统要求登录,请登录。如果提示“未找到”或“拒绝访问”,说明笔记本电脑上的账户尚无访问权限:在网站上添加该账户(进入 Settings,再进入 Collaborators),或询问该仓库的管理员。 - 公司配发的笔记本电脑:其网络或安全软件可能会阻止访问 NAS 或网站。如果上述检查失败,请联系公司 IT 人员,允许笔记本电脑读取该地址。告诉他们这是只读访问。
- NAS 上的文件夹:在笔记本电脑上打开文件资源管理器(Windows)或文件管理器(Linux),在地址栏中输入文件夹路径并按 Enter。如果系统要求输入用户名和密码,请输入并勾选“记住我的凭据”。如果文件夹打开后,你能看到其中有一个名为
- 只有当备份是仓库地址时,才在笔记本电脑上安装 git。 共享位置上的普通文件夹完全不需要 git。
一条命令
在笔记本电脑上打开终端,并进入项目文件夹(Windows 上:在文件资源管理器中打开该文件夹,点击地址栏,输入 powershell 并按 Enter)。然后粘贴以下其中一条命令,并替换大写字母表示的三个部分。YOUR-PROJECT 是主电脑识别该项目时使用的确切名称(即其文件夹名称,除非你修改过)。
Windows,使用 PowerShell:
$env:THOR_COPY_FROM = "THE-BACKUP-ADDRESS"; $env:THOR_COPY_SCOPES = "YOUR-PROJECT"; $env:THOR_COPY_GLOBAL = "1"; irm https://raw.githubusercontent.com/nworks3d/THOR-for-claude-code/main/install.ps1 | iex
Linux:
curl -fsSL https://raw.githubusercontent.com/nworks3d/THOR-for-claude-code/main/install.sh | THOR_COPY_FROM="THE-BACKUP-ADDRESS" THOR_COPY_SCOPES="YOUR-PROJECT" THOR_COPY_GLOBAL=1 sh
THE-BACKUP-ADDRESS是上面第 1 步中的位置,例如\\nas\backups\thor或/mnt/nas/thor。- 多个项目:用逗号分隔,例如
"project-one,project-two"。 - 不设置
THOR_COPY_SCOPES,就会复制你当前所在文件夹对应的项目。 - 不设置
THOR_COPY_GLOBAL,就不会复制通用工作规则。 - 在 Windows 上,
$env:值仅在当前窗口中有效。完成后请关闭窗口。
这台笔记本电脑上已经解压了 THOR(来自早先的安装)?那么直接运行安装程序,并使用相同的选项:
& "$HOME\thor2\install.exe" --copy-from "THE-BACKUP-ADDRESS" --scope YOUR-PROJECT --include-global
~/.thor2/install --copy-from "THE-BACKUP-ADDRESS" --scope YOUR-PROJECT --include-global
(多个项目时,重复使用 --scope。若要复制全部内容,则添加 --whole-memory,而不是这些选项。)
或复制整个记忆
只在你信任的电脑上执行此操作,例如自己的另一台笔记本电脑。完整副本包含你的全部笔记记忆:每个项目、通用工作规则,以及规则触发或拒绝执行的记录(包括触发的命令)。它不包含你的个人资料库(食谱、书籍、训练日志):这些内容存放在单独的文件中,而且这两种副本都不会读取该文件。完整副本包含每个项目的笔记,因此你写在笔记里的任何个人内容都会包含在内,所以不要把它放在工作或公司笔记本电脑上(在那里请使用上面的项目选项)。
你无需指定项目。在笔记本电脑上打开任意终端(在 Windows 上:按 Windows 键,输入 powershell,然后按 Enter),按上述说明替换 THE-BACKUP-ADDRESS,并粘贴以下其中一段:
Windows,在 PowerShell 中:
$env:THOR_COPY_FROM = "THE-BACKUP-ADDRESS"; $env:THOR_COPY_WHOLE = "1"; irm https://raw.githubusercontent.com/nworks3d/THOR-for-claude-code/main/install.ps1 | iex
Linux:
curl -fsSL https://raw.githubusercontent.com/nworks3d/THOR-for-claude-code/main/install.sh | THOR_COPY_FROM="THE-BACKUP-ADDRESS" THOR_COPY_WHOLE=1 sh
THOR_COPY_WHOLE 与 --whole-memory 的作用相同。如果你还提供了 THOR_COPY_SCOPES 或 THOR_COPY_GLOBAL,完整副本优先:不会遗漏任何内容,并且命令会告知你这两个选项并非必需。副本仍为只读,并且会像其他副本一样自动刷新。
它会下载 THOR、检查下载内容、将 THOR 连接到 Claude Code、创建副本,并告知你已完成的操作。最后你会看到如下内容(你自己的文件夹和数字会有所不同):
Setting THOR up as a read-only copy of another machine's memory.
= you did not name a project, so this copy holds the project of the folder you ran this in: 'acme-shop' (add --scope <name> to choose another)
+ made the copy from the backup: 3 notes in it, 3 records written (15 ms)
what it holds: project acme-shop, general rules (no project)
project 'acme-shop': 2 notes
general work rules: 1 notes
every other project, and your personal library, were left out of the copy file on purpose
+ connected THOR's 4 hooks to Claude Code (4 were new), so the memory speaks up by itself; a copy registers no local tool server, so lookups go through an existing remote connection to the main machine, if you have one
+ the file that keeps your assistant's replies tidy is in place (the main machine's, when its backup carried one)
What you have now
the copy: C:\Users\you\AppData\Local\thor2\thor.db
refreshed: by itself, in the background, at the start of a Claude Code session (at most once an hour)
What is read-only here
- nothing in this copy can be changed from this machine: your assistant reads it, and rules still fire and still refuse
- notes are saved on the main machine, and show up here after the next refresh
- the weekly check runs on the main machine, unless this machine is also connected to the replica connector (then it is asked here too)
Done. ONE THING LEFT FOR YOU: close Claude Code completely and open it again.
Claude Code only learns about THOR when it starts, so until you do this nothing above is active.
(开头几行“Downloading THOR”“Checksum matches.”和“Unpacked into ...”来自下载步骤。)! the project 'x' has no notes in the backup 这一行表示项目名称与主电脑上的拼写不同:请用正确的名称重新运行命令。你可以随时安全地再次运行该命令;第二次运行不会更改任何不需要更改的内容。
如果命令停止
命令要么成功完成,要么会明确说明未设置任何内容以及原因:
The copy could not be made, so nothing was set up. Reason: the backup at ... could not be reached——笔记本电脑无法读取备份。返回“开始前需要准备什么”的第 2 步。没有留下任何内容;等问题解决后重新运行相同的命令。... Git refuses to open the backup folder because it belongs to another user account——git 不信任属于其他用户的文件夹(在 NAS 共享目录或 USB 驱动器上很常见)。消息末尾会有一行以git config --global --add safe.directory开头。请在终端中原样运行该行一次,然后重新运行安装命令。This machine already has a memory of its own ... and it is not a copy, so I will not replace it——THOR 之前已在此处按常规方式安装,并创建了自己的空记忆。如果你从未在这里保存过笔记,请重命名消息中指出的文件(不要删除它),然后重新运行命令。如果其中包含你写的笔记,请保留该文件,并在继续前寻求帮助。
执行命令后
- 完全关闭 Claude Code,然后重新打开(不要只关闭对话)。首次启动会话时会显示:“这台机器运行的是记忆副本……其中只有:项目 acme-shop、通用规则(不属于任何项目)。出于设计考虑,其他项目的笔记不会放在这台机器上。”
- **检查一下。**询问助手“THOR 正常工作吗?”,或者自行运行以下命令(Windows:
& "$HOME\thor2\doctor.exe" --db "$env:LOCALAPPDATA\thor2\thor.db", Linux:~/.thor2/doctor --db ~/.local/share/thor2/thor.db)。顶部的简短摘要会显示以下内容,其中还包括其他行:OK: this is a copy, selection: project acme-shop, general rules (no project), last pull: 5 minutes ago, 3 items。你没有选择的项目笔记并非意外缺失,检查也绝不会将它们计为问题。如果副本超过三天未刷新,系统会发出警告。 - 可选:告知主电脑项目在笔记本电脑上的位置,这样就可以在这里检查需要查看文件的规则。在项目文件夹中运行安装程序,添加
--register-root --per-machine,并通过--db指定副本。此操作不会在笔记本电脑上写入任何内容,并会打印一行命令;在主电脑上运行该命令。
在副本上进行每周检查(仅当笔记本电脑连接到副本连接器时)
以上所有内容都不依赖此功能。它适用于也与记忆有远程连接的笔记本电脑(“副本连接器”,即 NAS 上 THOR 工具服务器的网址;Claude Code 自带的工具服务器列表中将其命名为 thor)。如果没有连接器,请跳过本节:每周检查仍会在主电脑上进行,与之前完全相同。
建立连接后会有以下变化:
- 笔记本电脑会在会话开始时用一句话说明这一点:在那里写下的笔记和更正会通过连接器队列传送,并在一小时内到达主电脑。
- 笔记本电脑上也会进行每周检查,节奏与主电脑相同:每个项目大约每周一次,仅在某次会话中实际工作十分钟后才进行,而且绝不会在第一轮就进行。系统会要求你的助手评估它用过的笔记、更正错误内容,并使用记忆工具写一份简短报告。你无需做任何事。
- 笔记本电脑会自行检查报告。 轮次结束时,THOR 会读取 Claude Code 在笔记本电脑上记录的该会话内容,确认报告确实由你的助手在该会话中提交,然后将报告的签名证明与报告一起发送到连接器。
- 主电脑会在下次收集队列时核对两者(即在一小时内执行
sync drain)。只有证明与报告逐字相符时,报告才会计入。如果证明不符(文本、会话或密封信息有更改),或一天内没有证明,就会将报告标记为“does not count”,并在报告中写明原因;下次发出检查请求时会提及这一点。 - 如果无法连接连接器,不会有任何内容被搁置。系统会提示一行消息,说明连接恢复后会再次发起检查。
笔记本电脑上进行的每周检查涵盖哪些内容,又不涵盖哪些内容:助手在那里作出的判断和更正,以及它自己的总结。其他会话中尚待评估的笔记列表、等待 THOR 试用的规则批次、待核实的争议,以及对阻碍实际工作的规则进行的清查,都保存在主电脑上,并由主电脑自己的每周检查处理。报告会在其机器部分说明这一点。笔记本电脑不会记录哪些笔记触发了检查,因此无法列出它们。证明表明报告是由笔记本电脑上的会话提交的;连接器本身没有密码(它前面的隧道才是门禁),因此无法证明是谁发送了报告。
如果 Claude Code 的工具服务器列表中没有连接器地址,可以为副本指定该地址:在副本的 thor-copy.json 中添加 "connector": "https://your-connector-address"(该小文件与副本的 thor.db 放在一起)。
更改副本包含的内容,或手动刷新
& "$HOME\thor2\sync.exe" pull --db "$env:LOCALAPPDATA\thor2\thor.db" --scope project-one --scope project-two --include-global
~/.thor2/sync pull --db ~/.local/share/thor2/thor.db --scope project-one --scope project-two --include-global
系统会记住此选择,因此之后不带选项执行 sync pull --db ... 时会重复使用它(自动刷新就是这么做的)。这也是手动刷新的方法:对于通过安装命令创建的副本,只需执行 sync pull --db <the copy>。副本会记住其备份和选择,因此无需再次指定。若主电脑的备份中有回复整理文件(guard-response-rulebook.json),同一次拉取也会将其带过来;如果目标位置已有该文件,则会将已有文件保留为 guard-response-rulebook.json.bak。缩小选择范围后,下次拉取时,副本中不再包含的内容会被移除。--whole 会恢复为完整记忆。刷新时会在旧副本旁创建一个新副本,只有在新副本完整且通过检查后才会替换旧副本;如果出现任何问题(没有网络、NAS 已关闭),旧副本会继续工作,并在下次会话启动时用一行提示说明情况。
关于公司笔记本,有一点需要注意:如果将命令指向笔记本上已有的存储库文件夹(即“克隆”),该文件夹会包含完整记忆,健康检查也会说明这一点。请改为指定备份的地址,或 NAS 上的普通文件夹;这样完整记忆只会在读取时短暂经过,不会留在笔记本上。
这里不涉及:从笔记本保存笔记(笔记会保存到主电脑;thor2/README.md 中“第二台设备(笔记本)”介绍的较长设置流程会为你排队处理,但该方式适用于完整记忆),以及按含义搜索。尚未完成的还有:在真实的第二台设备上运行。上述步骤已通过测试,并在一台设备上完整运行过。
另一台设备停止响应时
如果你在另一台保持开机的设备(NAS、小型服务器)上保存了一份记忆副本,以便手机和笔记本能够访问,THOR 现在会在该设备无响应时通知你。每次会话启动时,THOR 都会尝试连接每小时副本所发送到的地址一次,耗时不到一秒。如果没有设备响应,你会看到一行提示,说明 THOR 在那台设备上的副本无响应,因此其他设备无法连接记忆。健康检查(询问你的助手“THOR 正常工作吗?”)也会以 PROBLEM 行显示同样的信息。
逐步处理方法:那台设备可能刚刚重启过,例如自动更新后。如果它的数据文件夹已加密,请先解锁。然后重新启动 THOR 的程序(在 NAS 上:打开容器管理器并启动 THOR 容器)。设备恢复响应后,这行提示会自动消失。如果你从不将记忆复制到其他设备,就永远不会看到这行提示。
在其他助手中使用
上面的自动设置专为 Claude Code 设计。任何能够连接外部工具服务器的其他助手,仍可使用 THOR:使用每次发布时一同提供的容器,而非本地构建版本即可。
通用客户端配置,这是大多数可调用工具的助手所需的格式:
{
"mcpServers": {
"thor": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "thor-data:/data",
"ghcr.io/nworks3d/thor-mcp:2.6.2"
]
}
}
}
作为容器运行
docker run -i --rm -v thor-data:/data ghcr.io/nworks3d/thor-mcp:2.6.2
在空卷上,容器会创建记忆,并在开始响应前用 THOR 自带的一组初始笔记填充记忆——这与上述设置流程中的第一步相同。如果改为将 -v 指向一个已经包含 thor.db 的文件夹或命名卷(例如你自己的构建版本创建的副本),容器就会原样打开其中的文件。-i 会保持输入处于打开状态,这是通过 stdio 与其对话所需的;如果你希望保留已停止的容器,而不是让它自行清理,请移除 --rm。
持续使用同一段对话
过去的建议是经常开启新聊天,因为对话太长会变糟,而且反正什么都留不下来。有了 THOR,这条建议已经过时了。现在,保持一段长对话才是更好的习惯。
对话变长时,助手的工具会挤掉较早的内容来腾出空间。THOR 会处理这一刻:你的长期规则会重新出现,并提醒助手写下任何尚未保存的重要内容。开启新聊天也没问题——你的规则和项目背景会从一开始就加载进来。
因此,处理同一项工作时,就继续使用同一段对话。只有在你有意开启新对话时才这么做——比如你已经转去处理别的事情,或者当前对话已经陷入僵局,而不是因为对话变长了。
第一周的实际情况
开始之前值得了解这一点,因为刚开始时效果最不明显,很容易过早得出什么都没发生的结论。
第一天,它几乎不会阻止任何事情。 全新的记忆中有 22 条固定的起始备注(包括如何编写一条能再次出现的备注,以及适用于任何项目的诚实、Agent 和卫生习惯),还有 14 条通用工作规则,会在相关步骤开始前出现。THOR 中能够拒绝错误更改的部分,只对带有证明的备注起作用,而你还没有写下任何此类备注。因此,第一天你会在对话开始时看到这些备注,以及“入门指南”中所述的首次会话清单,但不会遇到任何拒绝,只有一个例外:在 Windows 上,两条工作规则会拒绝可能闪出控制台窗口的调用。这不是故障;只是目前还没有可供拒绝的内容。
你的第一条备注很可能会被退回。 它要求你补充两项大多数人都会漏掉的内容:备注何时应再次出现,以及什么情况能证明它已经失效。如果备注中提到了命令或文件名,THOR 还会尝试根据你的原话构建检查条件;如果没有任何条件适用,备注就会作为普通备注保存,只能提供参考而不能拒绝,这也没关系。拒绝说明会一次列出所有缺失内容,并告诉你应该怎么写,因此第二次尝试通常就能通过。这种严格要求是有意为之——一条永远无法证明错误的备注,迟早会在不知不觉中失效。
等你写下与实际场景相关的备注后,价值就会显现。 与文件、文件夹或命令关联的备注,会在你恰好操作相应内容时再次出现。几条这样的备注,胜过五十条通用备注;坚持一两周,随手记下这些内容后,助手就不会再反复问你同样的问题。
接着,用 doctor 检查你构建的内容。它会明确告诉你,有多少记忆内容真正能阻止错误更改、实际阻止过多少次,以及哪些部分从未被重新读取。
如果你已有一份记忆
以上内容描述的都是从空白开始的记忆。如果你从 version 1 升级而来,或手头有一堆在证明机制出现前写下的笔记,那么情况就不同了,值得把话说明白,因为显而易见的做法行不通。
THOR 的每周回顾每次只处理有限数量的旧笔记。这是刹车,不是扫帚。它能在你工作时阻止笔记堆继续增长,但从来就不是为了清空它:按这个速度,数千条积压笔记会比你活得更久。
真正的扫帚是针对项目实际所在文件夹运行的健康检查:
doctor --db <your thor.db> --checkouts <the folder holding your projects> --full
它会列出每一条锚点指向空处的笔记、每一条如今验证结果为假的证明,以及每一条存放位置过于拥挤、永远不可能被展示出来的笔记。留出一个下午,而不是一杯咖啡的时间,一次性处理完。清单很长,是因为记忆年代久远,并不是因为哪里出了问题。
有两点能让你放心地果断处理。修正笔记会保留旧版本,因此你写下的内容不会丢失,而且你随时可以回看它以前写的内容。移除笔记也不会将其删除:它不再提供给任何人,但仍可查找,而且你给出的理由也会继续附在上面。
有用吗?
用上一周,看看你的助手是否不再反复问你同样的问题。这是唯一能回答你真正关心的问题的测试。
THOR 曾与另一款记忆工具进行数月的正面对比测试,那些数字如今不再放在这里。不是因为成绩不好——成绩很好——而是因为用别人的笔记测出的分数说明的是他们的情况,不是你的情况。工具就在这里,结论由你来定。
这 16 个工具
你的助手实际调用的工具,按记忆本身拆分的两部分分组。
代码通道 - 项目、规则、工作方式:
remember- 存储新规则、笔记、报告或查询条目revise- 修正已有条目,而不是创建一个近似重复项;削弱一条已经能够阻止错误的规则——删除其检查、降低其严重级别,或缩小其适用范围——也需要说明理由,并将理由保存在其历史记录中retract- 移除一条后来证实有误的内容(必须说明理由;不会删除任何内容)resolve- 解决同一事实的两个版本分歧的问题pin- 将已有笔记设为长期规则,在每次会话开始时提供unpin- 取消其长期规则状态get- 按 ID 显示一条完整内容lookup- 搜索所有内容——所有项目,可按范围、键或自由文本搜索history- 按时间从早到晚查看一条内容的完整历史mark- 判断实际提供给你的内容是否有帮助status- 查看记忆中有多少内容确实能阻止错误,以及有多少已经过时search_code- 搜索项目自身已编入索引的源代码where_used- 查找某个函数、结构体或变量的所有定义和使用位置outline- 按行顺序查看某个文件声明的所有内容
资料库通道 - 配方、书籍、培训、开支,与代码通道分开保存:
library- 查看书架索引、单条内容,或跨书架搜索shelve- 收录新条目、修正已有条目,或归档条目
完全移除 THOR
此处列出了安装过程在你的计算机上放置的所有内容,以及如何撤销每一项。没有任何内容藏在其他地方。除第 9 步中的一个小文件外,你自己的项目及其代码都不会被更改。如果你提出请求,助手可以替你完成所有这些操作;以下是通俗易懂的步骤。
- 彻底关闭 Claude Code。 它只会在启动时读取一次设置。
- 如果之后可能还想要这些笔记,请先备份一份。 将第 7 步中的记忆文件夹复制到安全的位置。第 7 步删除后将无法恢复。
- 从 Claude Code 的设置中移除 THOR 的四条配置。 打开主文件夹中
.claude文件夹下的settings.json。在hooks下,删除SessionStart、PreToolUse、UserPromptSubmit和Stop对应的条目,这些条目的命令名称中包含 THOR 的serve程序,并以hook结尾。如果你选择了备份,还会多出一条SessionStart条目:它的命令会运行backup程序(Windows 上为backup.exe),并通过--db指定你的记忆,通过--repo指定backup-repo文件夹(或你选择的文件夹)。也请删除这一条。其他条目一律不要改动。 - 从工具列表中移除 THOR。 打开主文件夹中的
.claude.json,删除mcpServers下名为thor的条目。 - 删除
/thor-eval命令。 它是主文件夹中.claude文件夹下commands文件夹里的thor-eval.md文件。 - 撤销 THOR 的 git 设置,但仅限于该设置确实属于 THOR。 运行
git config --global --get core.hooksPath。如果输出的文件夹路径以thor2/githooks(或thor2\githooks)结尾,请运行git config --global --unset core.hooksPath。如果输出的是其他文件夹路径,或者没有输出,请保留原样:它不属于 THOR。媒体拦截功能(禁止在提交中包含视频或超大文件)就在同一个文件夹中,因此也会随之停止。如果你自行设置了任何thor.mediagate.设置,它们只是无害的残留;要移除其中一项,例如运行git config --global --unset thor.mediagate.maxbytes(如果是在某个仓库中仅为该仓库设置的,请省略--global)。 - 删除记忆文件夹。 Windows 上的路径是
%LOCALAPPDATA%\thor2,Linux 上是~/.local/share/thor2(安装程序会在memory:行中打印该路径)。 其中包含你的笔记、笔记旁的小文件(回复规则、模式、每周检查计时器和录制开关;开关位于thor-mode.json中)、真实调用记录(real-calls.jsonl和real-replies.jsonl)、THOR 对你代码的分析、它的 git 助手,以及你选择本地备份时创建的backup-repo文件夹。 - 删除程序。 Windows 上是主文件夹中的
thor2,Linux 上是~/.thor2。 - 删除每个使用
--topic或--project运行安装程序的文件夹中的隐藏.thor-project文件。 这是 THOR 放在你自己的文件夹中的唯一内容。 - 重新打开 Claude Code。 新对话应该不再有任何 THOR 区块,
/thor-eval也应该消失。settings.json.bak和.claude.json.bak副本保存的是 THOR 首次修改这两个文件之前的内容(之后再次运行安装程序不会替换这些副本)。你可以删除它们;不要用它们覆盖当前文件,因为它们早于你之后所做的其他更改。
文档
| 页面 | 解答的问题 |
|---|---|
| AGENTS.md | 为你的 AI 助手提供说明:如何设置 THOR |
| thor2/README.md | 第 2 版程序:如何构建,以及各部分的用途 |
| thor2/CONTRACT.md | 第 2 版所遵循的标准,以及用于强制执行每条规则的测试 |
| thor2/SPEC-ENFORCEMENT.md | 笔记如何证明自身符合要求,详尽说明 |
| CONTRIBUTING.md | 如何修改 THOR:拉取请求的标准 |
| CHANGELOG.md | 各版本的变更:每个版本开头的章节 |
致谢
- MakerViking - 感谢启发与精彩较量。没有这份火花,这个项目就不会存在;没有值得一较高下的对手,它也不会有如今这么出色。Skål!
- mimir (MakerViking/mimir) - THOR 得以存在的根本原因。在古诺斯故事中,Mimir 守护着知识之井;而在这里,它树立了 THOR 必须跨越的标杆,而且在很长一段时间里,它自己的表现也相当出色。本项目早期的每一次比较都以 mimir 为对象,胜负都如实记录,因为如此出色的对手值得诚实的数据(如今这里已不再发布这些数据;参见“它有效吗?”)。
- 相互借鉴的创意。 THOR 的两项功能源自 mimir 自己的工作,并在这里以 THOR 自己的方式重新实现;而 mimir 也反过来感谢 THOR 将代码读入记忆,并在每条消息中检查记忆——这正是开源的意义所在。谢谢你,MakerViking。
支持此项目
THOR 由 N-Works 3D 开发。如果它为你发挥了作用——省去了解释、在错误造成损失前发现问题,或者只是让你不必从头开始——有两种简单的方式可以帮助它继续发展:
- 请我喝杯 Ko-fi - 想支持时随时一次性捐助。
- 成为 YouTube 会员 - 按月支持,助它持续发展。
不必有压力,也没有付费墙——无论如何,项目都会保持开源。Skål,也感谢你读到这里。
贡献
欢迎提交错误报告和拉取请求。THOR 是助手应该信赖的记忆,因此标准在于准确,而不是功能更多。检查清单见 CONTRIBUTING.md。
许可证
GPLv3。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。
