插件钩子脚本用 PLUGIN_ROOT,不要写相对路径

PLUGIN_ROOT 指向安装后的缓存根,不是你正在改的源码目录。可变数据写 PLUGIN_DATA。装完仍要 /hooks 信任。

插件自带的钩子和用户 ~/.codex/hooks.json 会叠在一起跑,但脚本路径规则不同。默认找插件根下的 hooks/hooks.json。命令里用 PLUGIN_ROOT,不要写 ./hooks/...(cwd 会漂,也找不到缓存里的安装副本):

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 ${PLUGIN_ROOT}/hooks/session_start.py",
            "statusMessage": "Loading plugin context"
          }
        ]
      }
    ]
  }
}

Codex 会注入环境变量,并做行内替换(PowerShell 吃不到普通环境变量展开):

  • PLUGIN_ROOT:这份插件已经安装的根,通常在 ~/.codex/plugins/cache/...
  • PLUGIN_DATA:可写数据目录,状态文件放这里,不要写进缓存根
  • CLAUDE_PLUGIN_ROOT / CLAUDE_PLUGIN_DATA:同一套路径的兼容名

改源码目录里的 hooks/session_start.py 不会立刻进正在跑的会话。要先让 marketplace 重新安装,再看 /hooks。0.154 起当前会话通常会在外部升级后刷新钩子;没有就新开。

清单里如果写了 hooks(路径、路径数组或内联对象),只走清单,不再读默认 hooks/hooks.json。路径必须以 ./ 开头,并留在插件根内。

装上或打开插件 不会自动信任这些钩子。插件钩子算非托管来源,/hooks 里审查并信任当前定义之前会被跳过。网页上安装插件也不会把脚本部署到本机。企业开了 allow_managed_hooks_only 时,插件钩子整层不跑。

来源