feat: cache-bust CSS/JS with version query + improve MCP search description
- src/web_header.php: phpman.css?v=PHPMAN_VERSION
- src/web_footer.php: phpman.js?v=PHPMAN_VERSION
- src/mcp_server.php: cli_search description — mention FTS5 full-text,
cross-source search (man/perldoc/info/pydoc/ri), Perl module support
- src/mcp_server.php: instructions — search examples with :: modules
Server-side .htaccess (manual):
<FilesMatch '\.(css|js)$'>
Header set Cache-Control 'public, max-age=31536000, immutable'
</FilesMatch>
Co-Authored-By: Claude Code deepseek-v4-pro <noreply@taotoken.net>
OpenClaw 2026.8.1 升级后 Gateway 反复重启,
openclaw doctor报invalid persisted session row requires repair,Telegram bot 一直没反应。排查到最后发现:Telegram 无响应的真正原因和doctor --fix卡住的其实是同一个东西——未迁移的 legacyexec-approvals.json触发了ExecApprovalsMigrationRequiredError门卫,所有 exec-approvals 消费者(含 telegram 通道)拒绝启动。本文记录完整排查与修复过程。
session_nodes 表里残留了 2 条窗口缺失的 :run: 别名行(entry_json='{}'),openclaw doctor --fix 会先触发自己的校验守卫报 invalid persisted session row,没法自助修复。手动删掉这 2 条即可。~/.openclaw/agents/main/sessions/sessions.json 需要迁移,跑 openclaw doctor --session-sqlite import 导入。~/.openclaw/exec-approvals.json 没迁移到 SQLite。assertNoPendingLegacyExecApprovals 门卫在启动时检查这个文件,存在就抛 ExecApprovalsMigrationRequiredError,Telegram 通道起不来,日志里只看到 auto-restart attempt N/10 无限循环——底层错误被 LaunchAgent 的 StandardErrorPath=/dev/null 吞掉了。把 legacy 文件导入 state DB 的 exec_approvals_config 表并改名为 .migrated 后,Gateway 健康监控自动拉起 Telegram,恢复响应。升级到 OpenClaw 2026.8.1 后,openclaw doctor 报错:
docs: CLAUDE.md 分支约定 — 明确 master 为主干,勿 push 其他分支名
docs: CLAUDE.md 分支约定 — default 计划统一为 main(过渡期仍 push master)
fix: showForm 传入 markdown/json URL 修复 not-found 兜底链接失效
Codex 里给 GitHub MCP server 配好 bearer_token_env_var 后,仍报 Environment variable CODEX_GITHUB_PERSONAL_ACCESS_TOKEN ... is not set。根因:bearer_token_env_var 读的是 codex 自身进程 的环境变量,而把 token 塞进 ~/.codex/config.toml 的 [shell_environment_policy.set] 只注入它派生的 shell,到不了自身进程。正确做法是把环境变量 export 到 ~/.zshrc,在启动 codex 前就位。
按 GitHub MCP server 官方指南配好 [mcp_servers.github],codex 启动时仍报:
⚠ MCP client for `github` failed to start: MCP startup failed: Environment variable CODEX_GITHUB_PERSONAL_ACCESS_TOKEN for MCP server 'github' is not set
两个事实叠加:
| 事实 | 说明 |
|---|---|
Codex 不支持 inline bearer_token |
MCP server 配置只认 bearer_token_env_var,官方 schema 已把 inline bearer_token 字段隐藏(openai/codex #19294) |
bearer_token_env_var 读的是自身进程环境 |
它存的是「去哪个环境变量取 token」的名字,codex 连接时从自身进程读,不是从它派生的 bash 读 |
打个比方(仅为帮助理解):bearer_token_env_var 是一块「钥匙放在 X 口袋里」的告示牌,codex 只会翻自己的口袋(自身进程环境)。而 [shell_environment_policy.set] 是把钥匙塞进它派生的子进程口袋——塞错了地方。
接上一篇《Claude Code + Codex 多机配置对齐排错》:当时用
api_key修好了 401,升级到 Codex 0.151 后这个方案失效了。
Codex CLI 升级到 0.151.0 后,~/.codex/config.toml 的 [model_providers.taotoken] 里写的 api_key = "sk-***" 被静默忽略,请求不带 Authorization 头,taotoken 网关返回 invalid_request_error: You didn't provide an API key。
修复:删掉 provider 里的 api_key,改为 requires_openai_auth = true,让 Codex 从 ~/.codex/auth.json 的 OPENAI_API_KEY 读密钥(taotoken CLI 本来就把 key 写在那里)。
升级 codex 后(本机 Homebrew cask 更新到 0.151.0),codex 一调用就报:
{"error":{"message":"You didn't provide an API key. You need to provide your API key in an Authorization header using Bearer auth...","type":"invalid_request_error"}}
请求到达了网关,但没带密钥头 → 配置里的 key 没生效。
tools: 迁移 Tailscale mesh 工具至 chedong.com 仓库 tailscale-mesh-bench.sh 移至 https://github.com/chedong/chedong.com (cli/tools/tailscale/),phpman 不再维护该脚本。 git 历史保留本文件全部提交记录。 Co-Authored-By: Claude Code / deepseek-v4-flash / auto
tools: 发现阶段自动跳过跨 tailnet 共享节点 - 用 tailscale status --json 的 DNSName 后缀识别跨网节点(如 mbprolia.tail2bbe8a.ts.net 与同网 tail8433bf 不同) - 跨网共享节点无法用本网 IP 主动建链(mesh 测试必 UNREACH), 发现时自动排除 - ID_STATUS 获取上移到发现循环前, 一次 python 解析同时产出跨网集合与 StableID 映射 - 消除 mbprolia 5 条 UNREACH 链路拖慢测速的问题 Co-Authored-By: Claude Code / deepseek-v4-flash / auto
tools: mesh 带宽统一使用 Mb/s 单位(含 code-review 缺陷修复) - iperf3 解析支持 G/M/K bits/sec,统一归一为 Mb/s 紧凑 token(如 96.5Mb/s、0.262Mb/s、1120Mb/s) - 修复报表与 JSON 之前丢失单位的问题(matrix token 无空格,awk $3 仍可解析) - 修复 Gbits/sec 链路被误判为 ERR 的问题 - --skip/--only 改为词边界匹配,避免短 token(如 "mb")误命中多个节点 - ID_STATUS 增加 SSH 回退,与 STATUS 发现逻辑一致 - ExitNodeID 解析只捕获引号值(NULL/缺失视为无 exit node) - 移除死代码 LABELS 数组;EXITUSAGE 改逗号分隔保持空元素语义 Co-Authored-By: Claude Code / deepseek-v4-flash / auto