W
AI-Wiki
ENTITY

version-check.js

定义与身份

version-check.jsclaude-mem 在 Setup 阶段使用的版本检查脚本,定位是一个快速、非阻塞的安装新鲜度检测器

它对应的是 Hook 架构中的 Setup Hook,在每次会话开始前运行,但不负责安装运行时,也不直接修复环境。它的职责只是检查当前安装是否过期,并在发现问题时提示用户执行修复命令。

文档明确说明:真正的运行时安装工作由 npx claude-mem installnpx claude-mem repair 在 Hook 之外完成;version-check.js 本身只做一个 sub-100ms 的版本标记检查。

所属位置与调用方式

version-check.js 的源码位置是 scripts/version-check.js,在 Setup 阶段通过如下命令调用:

{
  "hooks": {
    "Setup": [{
      "hooks": [{
        "type": "command",
        "command": "node ${CLAUDE_PLUGIN_ROOT}/scripts/version-check.js",
        "timeout": 60
      }]
    }]
  }
}

这里的超时配置是 60,但文档对它的实际设计目标说得更严格:它应当在 100 毫秒以内完成。

角色职责

version-check.js 的核心职责只有一个:

  1. 检测当前插件加载版本与已安装运行时是否一致。
  2. 如果不一致,提醒用户执行修复。
  3. 无论结果如何,都不要阻塞 Claude Code 的主会话。

这与 Hooks architecture 摘要 中的总体原则一致:从外部观察主会话、在合适时机注入能力,但不打断、不修改 Claude Code 的正常行为

工作机制

根据文档,version-check.js 的工作流程是固定的四步:

  1. 读取由 npx 安装器写入的 .install-version 标记文件。
  2. 将该标记与当前加载的插件版本进行比较。
  3. 如果发现版本不匹配,则向 stderr 写入 run: npx claude-mem repair
  4. 始终以退出码 0 结束。

其中第 1 步里的 .install-version 不是临时信息,而是由 npx claude-mem installnpx claude-mem repair 在完成安装时写下的版本标记,用来代表“当前运行时是按哪个插件版本准备好的”。

第 2 步比较的对象是:

  • 安装器此前写入的 .install-version 标记;
  • 当前已经加载的插件版本。

如果两者不同,系统就认为这是一次陈旧安装(stale install),典型场景是插件被外部升级了,但插件缓存里的运行时环境没有同步更新。

检测到不匹配时的行为

version-check.js 发现 .install-version 与当前插件版本不一致时,它不会尝试自动安装,也不会中止会话,而是只做一件事:

  • 向标准错误输出写入:run: npx claude-mem repair

这条信息的作用是给出明确、可执行的修复指令。文档特别指出,这种不匹配通常发生在插件被外部升级后,例如执行了 claude plugin update,导致插件代码版本变了,但先前安装好的运行时依旧停留在旧版本状态。

非阻塞边界

version-check.js 的一个关键设计边界是:永远不能阻塞会话启动

因此它有两个非常明确的约束:

  • 始终退出码为 0
  • 只做 sub-100ms 的轻量检查。

“始终退出 0” 的含义是,即使检测出版本不匹配、即使安装已经过期,它也只是提示修复,而不会把 Setup 阶段变成失败状态。这满足 Hook 体系的非侵入式要求:Hook 失败不能破坏 Claude Code 主流程。

“sub-100ms” 的含义则是它不能执行重安装、不能拉取依赖、不能进行重型初始化。文档还明确强调,它除了读取版本标记外,没有额外的 I/O

它不做什么

为了避免与安装器职责混淆,version-check.js 的非职责范围也很重要:

  • 不安装 Bun;
  • 不安装 uv;
  • 不执行 bun install
  • 不写入 .install-version
  • 不在 Setup 阶段直接修复损坏或过期环境。

这些工作都属于 npx claude-mem installnpx claude-mem repair。文档指出,这两个命令会在插件缓存中准备运行时,包含全局安装 Bun 与 uv、执行 bun install,并写入 .install-version 标记;整个过程在可见的 clack spinner 后面完成。

在整体架构中的位置

claude-mem 的 Hook 生命周期里,version-check.js 属于 Setup 阶段的预检查脚本,而不是后续的业务 Hook 之一。

与其他脚本相比,它的角色非常特殊:

它更接近一种 Progressive Enhancement 式的保护层:在不干扰主流程的前提下,尽早发现环境陈旧问题,并把修复动作留给显式命令完成。

关键事实汇总

  • 读取由 npx 安装器写入的 .install-version 标记文件。
  • 将该标记与当前加载的插件版本进行比较。
  • 发现不匹配时向 stderr 写入 run: npx claude-mem repair
  • 始终以退出码 0 结束,以保持非阻塞。
  • 运行在 Setup 阶段,每次会话前执行。
  • 目标执行时间小于 100ms。
  • Setup Hook 自身不负责安装任何运行时。

相关条目