$ cat ~/map/motus.md
motus
把 API key 挡在 pi 会话之外:替换工具输出中的精确密钥值,封锁会打印密钥的命令与文件,fail closed。
extensions✓ 10月30日
事实速查
- GitHub Stars
- ★ 0
- Forks
- 0
- 许可证
- MIT
- npm / 月
- —
- 最后推送
- 2026年11月2日
安装
pi install npm:@espadat/motus(必须全局,不要 --local),然后把它在 ~/.pi/agent/settings.json 的 packages 里移到首位——pi install 只会追加到末尾,而处理器按加载顺序运行——再创建 ~/.config/motus/config.toml,否则每个会话都以降级状态启动。Claude Code 侧:npm install --global @espadat/motus,并把 motus-cc-hook 注册为 PreToolUse 钩子。## 速览
一个把 API key 挡在模型之外的 pi 扩展:会话启动时从 env、命令输出、mise、pa 或 1Password 装载密钥,在工具结果、消息、提示与供应商请求中把每个精确值替换为 [REDACTED:NAME] 标记,并封锁凭据路径与打印密钥的命令。Claude Code 侧由钩子提供封锁;整体 fail closed。
## 要点
- $在 pi 中既替换又封锁:工具结果、保存的消息、提示、! shell 命令与供应商请求都做精确值替换;Claude Code 只有封锁,通过作用于 Read 与 Bash 的 PreToolUse 钩子实现。
- $五种来源:env、command、mise、pa 与 1password;每个来源都有默认为 true 的 required 标志,必需来源失败即让会话以降级状态启动——fail closed。
- $厂商前缀(sk-ant-、ghp_、github_pat_、AKIA、xox[bp]-)即使没有任何来源装载过该密钥也会被替换;minValueLength(默认 8)忽略更短的值,并发出指名密钥的警告。
- $blockPaths 与 blockCommands 封锁读取和会打印密钥的命令;支持通配符与 ${VAR:-fallback} 展开,配置文件本身不保存任何密钥值。
- $在 pi 中顺序很重要:subagent 进程只加载全局扩展,处理器按加载顺序运行,因此 motus 必须位于 packages 首位——更早加载的扩展看到的是原始工具输出。
- $Claude Code 的 ! shell 模式会绕过钩子,因为 ! 命令不是工具调用;pi 没有这个缺口——它的 user_bash 处理器同样替换 ! 输出。
- $Web3 安全:不做熵值或十六进制规则,交易哈希、地址与存储槽原样通过。
- $README 标明项目尚处早期:1.0 还未发布到 npm,pi 内的端到端冒烟测试仍然开放。
## 常见问题
Q motus 需要配置文件吗?
需要。没有 ~/.config/motus/config.toml 时,每个 pi 会话都以降级状态启动,Claude Code 钩子则拒绝所有 Read 与 Bash 调用。若你不自行列出 sources,默认会加入一个 env 来源。
Q 为什么 motus 必须放在 packages 首位?
处理器按加载顺序运行,更早加载的扩展会在 motus 改写之前看到原始工具输出与消息;pi 无法上报处理器顺序,motus 也不检查这条规则。
Q 它能拦住被提示注入的 agent 泄露密钥吗?
不能——README 明确说它只防意外泄露;恶意或被注入的 agent 可以在任何输出被替换之前把密钥带出去,建议的缓解手段是沙箱。
Q Claude Code 侧有什么不同?
只有封锁:PreToolUse 钩子拒绝匹配 blockPaths、blockCommands 或 claudeCode.blockCommands 的 Read 路径与 Bash 命令;配置非法、输入异常或崩溃时同样拒绝。
Q 支持哪些密钥来源?
五种:env、输出 JSON 对象的命令、带 Age 加密列表文件的 mise、pa 存储条目,以及用一次 op inject 调用解析的 1Password op:// 引用。
## 参考链接
## 相关条目
## 教程
最后更新: 2026年11月2日