← Back to Plugins
Integration

Guardian

irideas By irideas 👁 4 views ▲ 0 votes

Issue-centric guardrails for OpenClaw: detect, mitigate, and repair auth, proxy, plugin, and local runtime failures.

GitHub

Configuration Example

{
  "enabledIssues": [],
  "disabledIssues": []
}

README

# `openclaw-guardian`

`openclaw-guardian` 是一个面向 `OpenClaw` 的本地问题治理仓库。
它不替代上游,不重打包 `OpenClaw`,而是围绕真实环境里的运行时异常、配置冲突与可复现故障,
提供一套可本地接入、可逐步下线、可独立维护的问题发现与修复机制。

当前版本:`1.2.0`

## 这是什么

这个项目关注的不是“怎么扩展 `OpenClaw` 功能”,而是:

- 当 `OpenClaw` 在某些网络、代理、插件或系统环境里出现异常时,如何更早发现问题
- 当问题已经出现时,如何用最小侵入的方式临时缓解或修复
- 当上游还没有合适修复时,如何把本地经验沉淀成可共享、可维护的方案

项目以 **issue** 为中心组织内容。  
一个 issue 表示一种明确的问题现象,例如:

- 某条 OAuth 登录链路在 HTTP 代理环境下失败
- 某个插件因为本地状态冲突而重复注册
- 某类命令在特定环境变量或本地配置下会稳定触发告警

围绕一个 issue,可以逐步补齐三种能力:

- `preflight`
  在命令真正执行前检查风险,并输出提示
- `mitigation`
  在命中场景下做进程内窄缓解
- `repair`
  以显式、可审计的方式执行本地修复动作

## 当前内置 issue

当前仓库已经内置两个 issue:

### 1. [openai-codex-oauth-proxy-failure](./issues/openai-codex-oauth-proxy-failure/README.md)

对应现象:

- `openclaw models auth login --provider openai-codex`
- 浏览器授权成功
- 但最终没有把认证信息写入本地

常见报错:

- `API Error: Status Code 403`
- `unsupported_country_region_territory`
- `fetch failed`

当前处理手段:

- `mitigation`

也就是在命中的执行链路里,对最终 token 交换阶段做非常窄的网络缓解。

### 2. [plugins-feishu-duplicate-id](./issues/plugins-feishu-duplicate-id/README.md)

对应现象:

- `openclaw gateway restart`
- `openclaw plugins list`
- `openclaw plugins doctor`

常见告警:

- `plugin feishu: duplicate plugin id detected`
- `plugins.allow is empty; discovered non-bundled plugins may auto-load`

当前处理手段:

- `preflight`
- `repair`

也就是先在命令执行前检测本地冲突状态,再由用户显式执行修复。

## 为什么需要它

这类问题如果直接去改全局安装包,通常会有几个问题:

- 升级后容易被覆盖
- 本地改动不易审计
- 不方便分享给其他使用者
- 难以沉淀成一套长期维护的经验库

而把方案沉淀到独立仓库,有几个直接好处:

- 不修改上游安装包
- 本地接入与撤销都很轻
- 每个 issue 可以独立演进
- 可以逐步从单一修复脚本收敛为问题现象库

## 核心思路

`openclaw-guardian` 的中心不是“运行时模块”,而是“问题现象”。

也就是说,项目思路是:

1. 先识别一个真实问题现象
2. 给它分配稳定的 issue id
3. 为这个 issue 补充:
   - 现象描述
   - 触发条件
   - 适用的 `OpenClaw` 版本范围
   - 用户可见提示
   - `preflight` / `mitigation` / `repair` 中合适的能力
4. 再把可重复的执行套路沉淀到公共 `core/`

这让项目可以同时承载:

- 运行时链路修复
- 命令前置检查
- 显式本地修复

而不会把所有能力都挤进一种技术手段里。

## 目录结构

```text
openclaw-guardian/
  cli/
    guardian.mjs
  .github/
    workflows/
      test.yml
  AGENTS.md
  CHANGELOG.md
  LICENSE
  docs/
    ARCHITECTURE.md
    MANUAL-E2E.md
    TESTING.md
  core/
    i18n-renderer.mjs
    issue-loader.mjs
    locale.mjs
    logger.mjs
    preflight-runner.mjs
    repair-runner.mjs
    mitigation-runner.mjs
  issues/
    openai-codex-oauth-proxy-failure/
      issue.json
      mitigation.mjs
      README.md
      i18n/
        en.json
        zh-CN.json
    plugins-feishu-duplicate-id/
      issue.json
      preflight.mjs
      repair.mjs
      README.md
      i18n/
        en.json
        zh-CN.json
  bridge/
    bootstrap/
      bash-init.bash
      logger.mjs
      node-entry.mjs
    config/
      enabled-issues.json
  test/
    issue-loader.test.mjs
    preflight-runner.test.mjs
    repair-runner.test.mjs
    openai-codex-oauth-proxy-failure.integration.test.mjs
    test-helpers.mjs
  package.json
```

其中:

- `issues/`
  负责承载具体问题现象
- `core/`
  负责承载公共执行机制
- `bridge/`
  负责导出真正接入 `OpenClaw` 的薄入口

## 多语言输出

所有用户可见输出都应尽量跟随当前运行时语言。

当前约定是:

- 至少支持 `zh-CN` 与 `en`
- 当无法识别当前语言时,兜底为 `en`
- issue 自己维护各自的 `i18n/` 文案
- 公共层只负责语言解析与文案渲染

这样后续新增 issue 时,就可以在不改公共框架的前提下补齐对应语言。

接入 `bash-init.bash` 后,当前 shell 还会提供一个显式命令:

```bash
guardian
```

它可用于:

- `guardian issue list`
- `guardian issue show <issue-id-or-alias>`
- `guardian repair <issue-id-or-alias> --dry-run`
- `guardian repair <issue-id-or-alias> --apply`

## 安装

下面示例中的:

- `<repo-url>`
  表示你自己的仓库地址
- `<repo-dir>`
  表示你自己选择的本地工程目录

### 1. 克隆仓库

```bash
git clone "<repo-url>" "<repo-dir>"
```

### 2. 建立运行时软链接

接入目录固定使用:

```text
$HOME/.openclaw/guardian
```

但这个目录不直接承载整个仓库,而是软链接到仓库内的 `bridge/`:

```bash
ln -sfn "<repo-dir>/bridge" "$HOME/.openclaw/guardian"
```

### 3. 在 `~/.bash_profile` 中接入统一入口

```bash
[ -f "$HOME/.openclaw/guardian/bootstrap/bash-init.bash" ] && \
  source "$HOME/.openclaw/guardian/bootstrap/bash-init.bash"
```

### 4. 重新加载 shell

```bash
source ~/.bash_profile
```

### 5. 配置 issue 启停覆盖

编辑:

```text
$HOME/.openclaw/guardian/config/enabled-issues.json
```

示例:

```json
{
  "enabledIssues": [],
  "disabledIssues": []
}
```

求值顺序是:

1. 先发现 `issues/` 下所有 issue
2. 先取所有 `enabledByDefault: true` 的 issue
3. 再合并 `enabledIssues`
4. 最后减去 `disabledIssues`

### 6. 验证接入

```bash
type -a openclaw
```

如果接入成功,输出中通常会先看到:

```text
openclaw is a function
```

然后可继续查看日志:

```bash
tail -n 20 "$HOME/.openclaw/logs/guardian/guardian.log"
```

也可以验证 `guardian` 是否已接入:

```bash
type -a guardian
```

## 发生问题时怎么用

可以先列出当前 issue:

```bash
guardian issue list
```

查看某个 issue:

```bash
guardian issue show codex-auth
guardian issue show feishu-dup
```

对支持显式修复的 issue,先看 dry-run:

```bash
guardian repair feishu-dup --dry-run
```

## 测试

默认自动化门禁:

```bash
npm test
```

本地完整自动化测试:

```bash
npm run test:all
```

需要真实 HTTP 代理的集成测试:

```bash
export HTTP_PROXY=http://<your-http-proxy-host>:<port>
export HTTPS_PROXY=http://<your-http-proxy-host>:<port>
unset ALL_PROXY
unset all_proxy
npm run test:integration
```

更多说明见:

- [TESTING.md](./docs/TESTING.md)
- [MANUAL-E2E.md](./docs/MANUAL-E2E.md)

## 相关文档

- [CHANGELOG.md](./CHANGELOG.md)
- [AGENTS.md](./AGENTS.md)
- [ARCHITECTURE.md](./docs/ARCHITECTURE.md)

仓库采用 [MIT License](./LICENSE)。
integration

Comments

Sign in to leave a comment

Loading comments...