|
| 1 | +--- |
| 2 | +name: openclaw-diagnostic-export |
| 3 | +description: 帮助用户导出 OpenClaw + memory-tencentdb(原 memory-tdai)记忆插件的现场诊断数据,用于排查问题。当用户提到"导出诊断数据""export diagnostic""现场数据""排查问题""导出日志""收集现场""打包现场数据"时应触发。 |
| 4 | +version: 1.0.0 |
| 5 | +--- |
| 6 | + |
| 7 | +## 目的 |
| 8 | + |
| 9 | +将 OpenClaw 日志、记忆插件数据(L0~L3)、脱敏后的配置打包为本地压缩包,由用户确认后手动发送给研发团队排查问题。 |
| 10 | + |
| 11 | +> **名称说明**:插件已从 `@tdai/memory-tdai` 更名为 `@tencentdb-agent-memory/memory-tencentdb`,但数据目录始终为 `~/.openclaw/memory-tdai/`(代码中硬编码)。本 skill 中所有对 `memory-tdai` 目录的引用均指实际数据目录路径,与插件 ID 无关。 |
| 12 | +
|
| 13 | +## 导出工作流 |
| 14 | + |
| 15 | +### Step 1: 确认环境 |
| 16 | + |
| 17 | +在导出前,先确认 OpenClaw 工作目录存在且可访问: |
| 18 | + |
| 19 | +```bash |
| 20 | +# 探测工作目录(优先级:环境变量 > ~/.openclaw > ~/.clawdbot) |
| 21 | +OPENCLAW_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}" |
| 22 | +[ -d "$OPENCLAW_DIR" ] || OPENCLAW_DIR="$HOME/.clawdbot" |
| 23 | +ls -la "$OPENCLAW_DIR/" 2>/dev/null && echo "✅ 找到: $OPENCLAW_DIR" || echo "❌ 未找到 OpenClaw 工作目录" |
| 24 | +``` |
| 25 | + |
| 26 | +确认 memory-tdai 子目录存在: |
| 27 | + |
| 28 | +```bash |
| 29 | +ls -la "$OPENCLAW_DIR/memory-tdai/" 2>/dev/null |
| 30 | +``` |
| 31 | + |
| 32 | +### Step 2: 执行导出脚本 |
| 33 | + |
| 34 | +运行项目 `scripts/` 目录下的导出脚本: |
| 35 | + |
| 36 | +```bash |
| 37 | +bash scripts/export-diagnostic.sh |
| 38 | +``` |
| 39 | + |
| 40 | +> 脚本位于本项目的 `scripts/export-diagnostic.sh`,如果通过 `pnpm` 或其他方式运行,需确保工作目录在项目根目录下。 |
| 41 | +
|
| 42 | +脚本默认将压缩包输出到 `~/Downloads/openclaw-diagnostic-<timestamp>.tar.gz`。 |
| 43 | + |
| 44 | +如需指定其他输出目录: |
| 45 | + |
| 46 | +```bash |
| 47 | +bash scripts/export-diagnostic.sh /tmp |
| 48 | +``` |
| 49 | + |
| 50 | +### Step 3: 确认导出结果 |
| 51 | + |
| 52 | +脚本执行完成后,检查输出: |
| 53 | + |
| 54 | +1. **确认压缩包已生成** — 脚本末尾会打印压缩包路径和大小 |
| 55 | +2. **向用户说明包含内容**: |
| 56 | + |
| 57 | +| 文件/目录 | 内容 | 隐私风险 | |
| 58 | +|-----------|------|---------| |
| 59 | +| `env-info.txt` | 系统版本、OpenClaw 版本、目录结构、磁盘占用 | 低 | |
| 60 | +| `logs/` | OpenClaw 网关日志 + 滚动日志(最近 3 天,每文件最多 5000 行) | 低 | |
| 61 | +| `memory-tdai/` | 记忆插件全量数据:L0 对话、L1 记忆、L2 场景、L3 画像、SQLite 数据库、checkpoint | **高** — 包含用户对话原文 | |
| 62 | +| `openclaw-config-redacted.json` | 脱敏后的配置(已移除 API Key/Token/Password/Secret,models/channels/env 整体替换) | 低 | |
| 63 | +| `plugins-info.txt` | 已安装插件列表和版本 | 低 | |
| 64 | + |
| 65 | +3. **提醒用户**: |
| 66 | + - 配置文件已自动脱敏,API Key、Token 等敏感信息已被替换为 `***REDACTED***` |
| 67 | + - **记忆数据(memory-tdai/)包含用户对话原文**,请确认可以分享后再发送 |
| 68 | + - 压缩包存放在本地,**不会自动上传**,需要用户手动发送给研发团队 |
| 69 | + |
| 70 | +### Step 4: 告知用户后续操作 |
| 71 | + |
| 72 | +导出完成后,告知用户: |
| 73 | + |
| 74 | +1. 压缩包已保存在本地(打印具体路径) |
| 75 | +2. 请检查内容后,通过企微/邮件等方式手动发送给研发团队 |
| 76 | +3. 如只需部分数据(如仅日志或仅配置),可解压后选择性发送 |
| 77 | + |
| 78 | +## 导出内容详解 |
| 79 | + |
| 80 | +### OpenClaw 日志位置 |
| 81 | + |
| 82 | +| 日志类型 | 路径 | 说明 | |
| 83 | +|---------|------|------| |
| 84 | +| 网关 stdout | `~/.openclaw/logs/gateway.log` | 网关守护进程标准输出 | |
| 85 | +| 网关 stderr | `~/.openclaw/logs/gateway.err.log` | 网关守护进程错误输出 | |
| 86 | +| 滚动日志 | `/tmp/openclaw/openclaw-YYYY-MM-DD.log` | 按日期滚动,JSON Lines 格式,24h 自动清理 | |
| 87 | +| 配置审计 | `~/.openclaw/logs/config-audit.jsonl` | 配置写入审计记录 | |
| 88 | +| 命令日志 | `~/.openclaw/logs/commands.log` | 命令事件日志(hook 可选) | |
| 89 | + |
| 90 | +### 记忆插件数据结构 |
| 91 | + |
| 92 | +``` |
| 93 | +~/.openclaw/memory-tdai/ |
| 94 | +├── conversations/ — L0 原始对话(每日 JSONL 分片) |
| 95 | +├── records/ — L1 结构化记忆(每日 JSONL 分片) |
| 96 | +├── scene_blocks/ — L2 场景 Markdown 文件 |
| 97 | +├── persona.md — L3 用户画像 |
| 98 | +├── vectors.db — SQLite 数据库(向量 + 全文索引) |
| 99 | +├── .metadata/ — checkpoint、scene_index.json |
| 100 | +└── .backup/ — 滚动备份 |
| 101 | +``` |
| 102 | + |
| 103 | +### 配置脱敏规则 |
| 104 | + |
| 105 | +导出脚本对 `openclaw.json` 执行以下脱敏: |
| 106 | + |
| 107 | +| 规则 | 处理方式 | |
| 108 | +|------|---------| |
| 109 | +| 字段名匹配 `apiKey/token/password/secret/credential` 且值为字符串 | 替换为 `***REDACTED(Nchars)***` | |
| 110 | +| SecretRef 对象(含 source/provider/id) | id 替换为 `***REDACTED***` | |
| 111 | +| 顶层 `models`、`secrets`、`channels`、`env` 块 | 整体替换为 `***REDACTED_SECTION***` | |
| 112 | +| `gateway.auth` 下的 token/password | 替换为 `***REDACTED***` | |
| 113 | +| 其余字段(含 `plugins` 完整配置) | **保留原样**(插件配置是排查重点) | |
| 114 | + |
| 115 | +## 手动导出(脚本不可用时的备选方案) |
| 116 | + |
| 117 | +如果导出脚本无法执行(如 Node.js 不可用),按以下步骤手动收集: |
| 118 | + |
| 119 | +```bash |
| 120 | +# 1. 创建导出目录 |
| 121 | +EXPORT_DIR=~/Downloads/openclaw-diagnostic-$(date +%Y%m%d-%H%M%S) |
| 122 | +mkdir -p "$EXPORT_DIR" |
| 123 | + |
| 124 | +# 2. 复制日志 |
| 125 | +cp -r ~/.openclaw/logs/ "$EXPORT_DIR/logs/" 2>/dev/null |
| 126 | +cp /tmp/openclaw/openclaw-$(date +%Y-%m-%d).log "$EXPORT_DIR/" 2>/dev/null |
| 127 | + |
| 128 | +# 3. 复制记忆插件数据 |
| 129 | +cp -r ~/.openclaw/memory-tdai/ "$EXPORT_DIR/memory-tdai/" 2>/dev/null |
| 130 | + |
| 131 | +# 4. 手动脱敏配置(⚠️ 必须手动删除敏感字段!) |
| 132 | +# 复制配置并用编辑器删除 models/secrets/channels 块和所有 apiKey/token 值 |
| 133 | +cp ~/.openclaw/openclaw.json "$EXPORT_DIR/openclaw-config-NEEDS-MANUAL-REDACTION.json" |
| 134 | + |
| 135 | +# 5. 打包 |
| 136 | +cd ~/Downloads && tar -czf "$EXPORT_DIR.tar.gz" "$(basename $EXPORT_DIR)" |
| 137 | + |
| 138 | +echo "⚠️ 请务必在发送前手动检查并删除配置中的敏感信息!" |
| 139 | +``` |
| 140 | + |
| 141 | +## 常见问题排查线索 |
| 142 | + |
| 143 | +导出数据后,研发团队通常关注以下方面: |
| 144 | + |
| 145 | +| 排查方向 | 查看文件 | 关键信息 | |
| 146 | +|---------|---------|---------| |
| 147 | +| 插件是否加载 | `logs/` 中搜索 `[memory-tdai]` | 插件注册、配置解析日志(注:日志标签仍为 `[memory-tdai]`,与插件 ID 无关) | |
| 148 | +| 记忆召回是否工作 | `logs/` 中搜索 `[recall]` | 搜索策略、耗时、命中数 | |
| 149 | +| L1 提取是否触发 | `logs/` 中搜索 `[pipeline]` | 调度触发、L1/L2/L3 执行状态 | |
| 150 | +| 向量搜索是否可用 | `openclaw-config-redacted.json` 的 `plugins.entries` | embedding 配置是否正确 | |
| 151 | +| 数据量/磁盘占用 | `env-info.txt` | du 输出、文件数量 | |
| 152 | +| checkpoint 状态 | `memory-tdai/.metadata/recall_checkpoint.json` | 进度、游标、计数器 | |
0 commit comments