Skill: koonchaoso/agent-error-logger-new (version 1.0.0)

--- name: agent-error-logger description: | Agent 错误日志工具。记录、检索和分析 Agent 犯过的错误，避免重复踩坑。 支持自动记录任务失败、手动查询错误模式、生成修正建议。 metadata: trigger: 记录错误、查询错误、错误分析、避免踩坑 author: 苏冠超 version: 1.0.0 --- # Agent Error Logger 记录 Agent 犯过的错误，避免重复踩坑。 ## 功能 - **自动记录**: 任务失败时自动记录错误详情 - **模式识别**: 识别重复出现的错误模式 - **主动提醒**: 新任务前检索相似错误，提前预警 - **统计分析**: 按月/类型统计错误分布 ## 文件结构 ``` workspace/memory/ ├── error-patterns.md # 错误模式索引（长期） └── error-log-YYYY-MM.md # 月度详细日志 ``` ## 使用方式 ### 1. 记录错误 ```markdown 用户：记录一个错误，刚才发布小红书失败了 Agent: 好的，请告诉我： 1. 任务是什么？ 2. 具体错误是什么？ 3. 原因是什么？ 4. 怎么修正的？ 或者我帮你从对话中提取这些信息？ ``` ### 2. 查询错误 ```markdown 用户：查一下之前发布失败的错误 用户：有没有类似的文件校验错误？ 用户：显示所有 #网络超时 的错误 ``` ### 3. 主动提醒 ```markdown Agent: 等一下，我查一下错误日志... 上次发布小红书失败是因为图片文件不存在。 这次请确认： ✓ 图片文件路径是否正确 ✓ 如果是 URL，需要先下载 ✓ 文件权限是否可读 ``` ## 错误记录格式 ```markdown ### 错误 #XXX - 简短描述 - **时间**: YYYY-MM-DD HH:MM - **任务**: 任务描述 - **错误**: 具体错误信息 - **原因**: 根本原因分析 - **修正**: 修正方案 - **模式标签**: #标签 1 #标签 2 - **相似错误**: 关联的错误编号 ``` ## 模式标签 | 标签 | 描述 | 检查清单 | |------|------|----------| | #文件校验 | 文件/路径未校验 | 文件存在、路径正确、权限足够 | | #网络超时 | 网络请求超时 | 设置 timeout、重试机制、降级方案 | | #浏览器不可用 | 浏览器工具失败 | 替代方案、合理超时、降级逻辑 | | #权限不足 | API/文件权限问题 | 检查授权、权限范围 | | #参数缺失 | 必需参数未提供 | 参数清单、默认值、用户确认 | ## 脚本工具 ### record-error.sh 记录新错误： ```bash cd /path/to/agent-error-logger/scripts python record_error.py \ --task "发布内容失败" \ --error "图片文件不存在" \ --cause "用户只提供了 URL，未下载" \ --fix "发布前先下载 URL 图片" \ --tags "#文件校验 #图片处理" ``` ### search-errors.sh 查询错误： ```bash python search_errors.py --tag "#文件校验" --limit 5 python search_errors.py --keyword "关键词" --limit 10 ``` ### monthly-report.sh 生成月度报告： ```bash python monthly_report.py --month YYYY-MM --output markdown ``` ## 主动检查清单 在以下场景自动检索错误日志： | 场景 | 检查内容 | |------|----------| | 发布内容前 | 检查 #文件校验 #发布前检查 | | 网络请求前 | 检查 #网络超时 #降级方案 | | 浏览器操作前 | 检查 #浏览器不可用 | | 复杂任务前 | 检查相似任务的错误历史 | ## 最佳实践 1. **及时记录**: 错误发生后立即记录，细节更准确 2. **详细分析**: 不仅记录现象，还要分析根本原因 3. **标签规范**: 使用统一标签，便于检索 4. **定期回顾**: 每月回顾错误模式，更新检查清单 5. **主动提醒**: 新任务前主动检索，避免重复错误 ## 扩展建议 - [ ] 自动从对话中提取错误信息 - [ ] 错误相似度计算（向量检索） - [ ] 错误趋势分析（图表） - [ ] 集成到 HEARTBEAT 自检 - [ ] 多 Agent 共享错误库 ## 相关资源 - [Self-Refine: Iterative Refinement with Self-Feedback](https://arxiv.org/abs/2303.17651) - [CoVE: Chain of Verification](https://arxiv.org/abs/2309.11495) - [AgentDropoutV2: Dynamic Error Handling](https://github.com/)

path: PUSH_TO_GITHUB.md
content: # 推送到 GitHub 指南

由于当前环境网络限制，需要手动推送到 GitHub。

## 方法 1：在本地电脑推送（推荐）

### 1. 克隆空仓库

```bash
# 在你的本地电脑执行
cd /path/to/your/workspace
git clone https://github.com/KoonChaoSo/agent-error-logger.git
cd agent-error-logger
```

### 2. 复制文件

将以下文件从服务器复制到本地：

```
/home/gem/workspace/agent/skills/agent-error-logger/
├── .gitignore
├── README.md
├── SKILL.md
├── USAGE.md
├── clawhub.json
├── create-repo.sh
├── example-error-log.md
└── scripts/
    ├── record_error.py
    └── search_errors.py
```

可以用 scp：
```bash
scp -r gem@your-server:/home/gem/workspace/agent/skills/agent-error-logger/* .
```

### 3. 推送

```bash
git add .
git commit -m "Initial commit: Agent Error Logger v1.0.0"
git branch -M main
git push -u origin main
```

---

## 方法 2：下载 ZIP 上传

### 1. 在服务器打包

```bash
cd /home/gem/workspace/agent/skills/agent-error-logger
tar -czvf agent-error-logger.tar.gz \
  .gitignore README.md SKILL.md USAGE.md \
  clawhub.json create-repo.sh example-error-log.md scripts/
```

### 2. 下载到本地

```bash
scp gem@your-server:/home/gem/workspace/agent/skills/agent-error-logger/agent-error-logger.tar.gz .
```

### 3. 解压并推送

```bash
tar -xzvf agent-error-logger.tar.gz -C agent-error-logger/
cd agent-error-logger
git add .
git commit -m "Initial commit: Agent Error Logger v1.0.0"
git push -u origin main
```

---

## 方法 3：使用 GitHub Desktop

1. 下载 https://desktop.github.com/
2. 登录 GitHub
3. File → Add Local Repository → 选择解压后的文件夹
4. 点击 "Push origin"

---

## 推送后检查

访问 https://github.com/KoonChaoSo/agent-error-logger

确认所有文件都已上传：
- ✅ .gitignore
- ✅ README.md
- ✅ SKILL.md
- ✅ USAGE.md
- ✅ clawhub.json
- ✅ scripts/record_error.py
- ✅ scripts/search_errors.py

---

## 下一步：发布到 ClawHub

1. 访问 https://clawhub.com
2. 登录 GitHub 账号
3. 选择 "Publish Skill"
4. 填写信息：
   - Name: `agent-error-logger`
   - Repository: `https://github.com/KoonChaoSo/agent-error-logger`
   - Branch: `main`
   - Skill File: `SKILL.md`
5. 提交审核

---

## 需要帮助？

如果遇到问题，可以：
1. 检查 GitHub 仓库权限
2. 确认网络连接
3. 尝试使用 Personal Access Token 代替密码

```bash
# 使用 PAT 推送
git push https://YOUR_USERNAME:[REDACTED_SECRET]/KoonChaoSo/agent-error-logger.git main
```


path: README.md
content: # Agent Error Logger 🦞

记录 Agent 犯过的错误，避免重复踩坑。

## 安装

```bash
# 克隆到 skills 目录
cd /home/gem/workspace/agent/skills
git clone https://github.com/YOUR_USERNAME/agent-error-logger.git

# 在配置文件启用
# skills.entries 添加:
# "agent-error-logger": { "enabled": true }

# 重启服务
sh scripts/restart.sh
```

## 使用

### 记录错误

```bash
python scripts/record_error.py \
  --task "发布小红书" \
  --error "图片文件不存在" \
  --cause "用户只提供了 URL，未下载" \
  --fix "发布前先下载 URL 图片" \
  --tags "#文件校验 #图片处理"
```

### 搜索错误

```bash
# 按关键词搜索
python scripts/search_errors.py --keyword "小红书"

# 按标签搜索
python scripts/search_errors.py --tag "#文件校验"

# 限制结果数
python scripts/search_errors.py --tag "#网络超时" --limit 5
```

## 文件结构

```
workspace/memory/
├── error-patterns.md       # 错误模式索引（长期）
└── error-log-YYYY-MM.md    # 月度详细日志
```

## 功能

- ✅ 自动记录任务失败
- ✅ 识别重复错误模式
- ✅ 主动提醒相似错误
- ✅ 月度统计报告

## 示例输出

```
✓ 错误 #003 已记录到 error-log-2026-03.md
  标签：#文件校验 #图片处理

✓ 找到 2 个匹配的错误:

--- 错误 1 ---
文件：error-log-2026-03.md
编号：003
标题：浏览器工具超时
内容:
- **时间**: 2026-03-11 12:00
- **任务**: 访问 GitHub
- **错误**: browser.snapshot 超时
...
```

## License

MIT


path: USAGE.md
content: # Agent Error Logger - 使用指南

## 🚀 快速开始

### 1. 安装

```bash
# 方法 1: 直接克隆（本地开发）
cd /path/to/your/agent/skills
git clone https://github.com/YOUR_USERNAME/agent-error-logger.git

# 方法 2: 通过 Skill 市场（发布后）
agent-cli skills install agent-error-logger
```

### 2. 配置

编辑配置文件，在 `skills.entries` 中添加：

```json
{
  "skills": {
    "entries": {
      "agent-error-logger": {
        "enabled": true
      }
    }
  }
}
```

### 3. 重启

```bash
sh scripts/restart.sh
```

---

## 📝 记录错误

### 命令行方式

```bash
cd /path/to/agent-error-logger/scripts

python record_error.py \
  --task "发布小红书" \
  --error "图片文件不存在" \
  --cause "用户只提供了 URL，未下载" \
  --fix "发布前先下载 URL 图片" \
  --tags "#文件校验 #图片处理"
```

### 对话方式（推荐）

直接跟 Agent 说：

```
用户：记录一个错误，刚才发布失败了
Agent: 好的，我来记录。请确认以下信息：
- 任务：发布小红书
- 错误：图片文件不存在
- 原因：未提前检查图片
- 修正：发布前验证文件
- 标签：#文件校验

确认记录吗？
用户：确认
Agent: ✓ 错误 #004 已记录
```

---

## 🔍 搜索错误

### 按关键词

```bash
python search_errors.py --keyword "关键词"
python search_errors.py --keyword "发布失败"
python search_errors.py --keyword "网络超时"
```

### 按标签

```bash
python search_errors.py --tag "#文件校验"
python search_errors.py --tag "#网络超时"
python search_errors.py --tag "#浏览器不可用"
```

### 限制结果数

```bash
python search_errors.py --tag "#文件校验" --limit 3
```

---

## 📊 查看模式索引

```bash
cat /home/gem/workspace/agent/workspace/memory/error-patterns.md
```

查看所有错误模式分类和检查清单。

---

## 🔄 主动检查

在以下场景，Agent 会自动检索错误日志：

| 场景 | 自动检查内容 |
|------|-------------|
| 发布内容前 | 检查 #文件校验 #发布前检查 |
| 网络请求前 | 检查 #网络超时 #降级方案 |
| 浏览器操作前 | 检查 #浏览器不可用 |
| 复杂任务前 | 检查相似任务历史 |

### 示例

```
用户：帮我发布这个小红书

Agent: 等一下，我查一下错误日志...
⚠️ 上次发布失败是因为图片文件不存在。

这次请确认：
✓ 图片文件路径：/home/user/pic.jpg (存在)
✓ 文件权限：可读
✓ 视频文件：不需要

确认发布吗？
```

---

## 📈 月度报告

每月初可以生成上月报告：

```bash
# 手动生成（未来功能）
python monthly_report.py --month YYYY-MM
```

报告包含：
- 错误总数
- 错误类型分布
- 高频错误模式
- 改进建议

---

## 💡 最佳实践

### 1. 及时记录

错误发生后立即记录，细节更准确。

```
❌ 错误：发布失败
✅ 错误：图片文件不存在，路径 /tmp/pic.jpg 无此文件
```

### 2. 详细分析

不仅记录现象，还要分析根本原因。

```
❌ 原因：文件不存在
✅ 原因：用户提供了 URL，但脚本未先下载到本地
```

### 3. 标签规范

使用统一标签，便于检索：

- `#文件校验` - 文件/路径问题
- `#网络超时` - 网络请求超时
- `#浏览器不可用` - 浏览器工具失败
- `#权限不足` - API/文件权限问题
- `#参数缺失` - 必需参数未提供

### 4. 定期回顾

每月回顾错误模式：

```bash
# 查看本月所有错误
python search_errors.py --tag "#" --limit 100

# 查看高频模式
cat memory/error-patterns.md
```

### 5. 主动提醒

新任务前主动检索：

```
Agent: 这个任务我之前做过，查一下有没有踩过坑...
```

---

## 🔧 故障排除

### 问题：脚本执行失败

```bash
# 检查 Python 版本
python --version  # 需要 3.10+

# 检查文件权限
chmod +x scripts/*.py

# 检查路径
ls -la /path/to/workspace/memory/
```

### 问题：日志文件不存在

```bash
# 手动创建目录
mkdir -p /path/to/workspace/memory

# 运行一次记录命令会自动创建
python record_error.py --task "测试" --error "测试" --cause "测试" --fix "测试" --tags "#测试"
```

---

## 📚 相关资源

- [Self-Refine 论文](https://arxiv.org/abs/2303.17651)
- [CoVE: Chain of Verification](https://arxiv.org/abs/2309.11495)
- [ClawHub Skill 开发指南](https://clawhub.com/docs)

---

## 🤝 贡献

欢迎提交 Issue 和 Pull Request！

GitHub: https://github.com/YOUR_USERNAME/agent-error-logger


path: clawhub.json
content: {
  "name": "agent-error-logger",
  "version": "1.0.0",
  "description": "Agent 错误日志工具。记录、检索和分析 Agent 犯过的错误，避免重复踩坑。",
  "author": "苏冠超",
  "license": "MIT",
  "keywords": [
    "error",
    "logger",
    "debug",
    "self-improvement",
    "agent"
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/YOUR_USERNAME/agent-error-logger"
  },
  "skills": [
    {
      "name": "agent-error-logger",
      "file": "SKILL.md",
      "enabled": true
    }
  ],
  "scripts": [
    {
      "name": "record-error",
      "command": "python scripts/record_error.py",
      "description": "记录新错误"
    },
    {
      "name": "search-errors",
      "command": "python scripts/search_errors.py",
      "description": "搜索错误日志"
    }
  ],
  "files": [
    "SKILL.md",
    "README.md",
    "scripts/*.py"
  ]
}


path: create-repo.sh
content: #!/bin/bash

# Agent Error Logger - GitHub 仓库创建脚本

set -e

REPO_NAME="agent-error-logger"
REPO_DESC="Agent 错误日志工具。记录、检索和分析 Agent 犯过的错误，避免重复踩坑。"

echo "🦞 创建 GitHub 仓库：$REPO_NAME"
echo ""

# 检查 gh 是否安装
if ! command -v gh &> /dev/null; then
    echo "❌ GitHub CLI (gh) 未安装"
    echo "请先安装：https://cli.github.com/"
    exit 1
fi

# 检查是否已认证
if ! gh auth status &> /dev/null; then
    echo "❌ 未认证 GitHub"
    echo "请先运行：gh auth login"
    exit 1
fi

# 创建仓库
echo "📦 创建 GitHub 仓库..."
gh repo create "$REPO_NAME" \
  --description "$REPO_DESC" \
  --public \
  --source=. \
  --remote=origin \
  --push

echo ""
echo "✅ 仓库创建成功！"
echo "🔗 访问：https://github.com/$(gh api user | jq -r '.login')/$REPO_NAME"
echo ""
echo "下一步："
echo "1. 更新 clawhub.json 中的 repository.url"
echo "2. 提交到 ClawHub: https://clawhub.com"


path: example-error-log.md
content: # 错误日志示例

> 这是去敏后的示例，展示如何记录错误。

---

## 2026-03-11

### 错误 #003 - 浏览器工具超时
- **时间**: 12:00-12:03
- **任务**: 访问 GitHub 查看开源项目
- **错误**: `browser.snapshot` 超时，多次重试失败
- **原因**: 服务器环境浏览器可能未正确配置或网络问题
- **修正**: 改用 `curl` + GitHub API 获取项目信息
- **模式标签**: #浏览器不可用 #降级方案
- **相似错误**: 无

---

### 错误 #002 - git clone 超时
- **时间**: 11:51-11:58
- **任务**: 克隆开源项目仓库
- **错误**: `git clone` 命令多次超时被 SIGTERM
- **原因**: 网络慢，默认超时时间不足
- **修正**: 改用 `curl` 下载单个文件，或增加 `yieldMs` 到 60s+
- **模式标签**: #网络超时 #大文件下载
- **相似错误**: 无

---

### 错误 #001 - 内容发布缺少图片
- **时间**: 11:58
- **任务**: 帮用户发布图文内容
- **错误**: 用户未提供图片，无法发布
- **原因**: 平台发图文必须有图片，但未提前检查
- **修正**: 发布前必须验证图片/视频是否存在
- **模式标签**: #文件校验 #发布前检查
- **相似错误**: 无

---

## 统计

| 错误类型 | 次数 |
|----------|------|
| #文件校验 | 1 |
| #网络超时 | 2 |
| #浏览器不可用 | 1 |

**本月总错误数**: 3


path: scripts/record_error.py
content: #!/usr/bin/env python3
"""
记录错误到 Agent Error Logger
"""

import argparse
import sys
from datetime import datetime
from pathlib import Path

def get_next_error_number(log_file: Path) -> int:
    """获取下一个错误编号"""
    if not log_file.exists():
        return 1
    
    content = log_file.read_text()
    numbers = []
    for line in content.split('\n'):
        if '### 错误 #' in line:
            try:
                num = int(line.split('#')[1].split(' ')[0])
                numbers.append(num)
            except:
                pass
    
    return max(numbers, default=0) + 1

def record_error(task: str, error: str, cause: str, fix: str, tags: str):
    """记录错误到日志文件"""
    memory_dir = Path(__file__).parent.parent.parent.parent / 'workspace' / 'memory'
    memory_dir.mkdir(parents=True, exist_ok=True)
    
    # 当前月份日志文件
    now = datetime.now()
    log_file = memory_dir / f'error-log-{now.year}-{now.month:02d}.md'
    
    # 获取下一个错误编号
    error_num = get_next_error_number(log_file)
    
    # 生成错误记录
    timestamp = now.strftime('%Y-%m-%d %H:%M')
    record = f"""
### 错误 #{error_num:03d} - {task[:50]}
- **时间**: {timestamp}
- **任务**: {task}
- **错误**: {error}
- **原因**: {cause}
- **修正**: {fix}
- **模式标签**: {tags}
- **相似错误**: 无

"""
    
    # 写入日志文件
    if log_file.exists():
        content = log_file.read_text()
        # 插入到 "## YYYY-MM-DD" 之前
        header = f"## {now.year}-{now.month:02d}\n"
        if header in content:
            # 找到 header 位置，插入到其后
            parts = content.split(header, 1)
            content = parts[0] + header + record + parts[1]
        else:
            # 没有本月 header，添加到开头
            content = f"{header}{record}\n{content}"
        log_file.write_text(content)
    else:
        # 创建新文件
        content = f"""# Error Log - {now.year}年{now.month}月

> 详细错误日志，按时间倒序记录。

---

{header}{record}
"""
        log_file.write_text(content)
    
    # 更新模式索引
    update_patterns_index(memory_dir, tags)
    
    print(f"✓ 错误 #{error_num:03d} 已记录到 {log_file}")
    print(f"  标签：{tags}")

def update_patterns_index(memory_dir: Path, tags: str):
    """更新错误模式索引"""
    patterns_file = memory_dir / 'error-patterns.md'
    
    # 解析标签
    tag_list = [t.strip() for t in tags.split() if t.startswith('#')]
    
    if not patterns_file.exists():
        print(f"  提示：{patterns_file} 不存在，请先创建模式索引文件")
        return
    
    content = patterns_file.read_text()
    
    # 简单实现：只更新出现次数（实际应该更智能）
    for tag in tag_list:
        if tag in content:
            # 找到表格中的行，增加计数
            lines = content.split('\n')
            for i, line in enumerate(lines):
                if tag in line and '|' in line:
                    parts = line.split('|')
                    if len(parts) >= 3:
                        try:
                            count = int(parts[2].strip())
                            parts[2] = f" {count + 1} "
                            lines[i] = '|'.join(parts)
                        except:
                            pass
            content = '\n'.join(lines)
    
    patterns_file.write_text(content)

def main():
    parser = argparse.ArgumentParser(description='记录 Agent 错误')
    parser.add_argument('--task', required=True, help='任务描述')
    parser.add_argument('--error', required=True, help='错误信息')
    parser.add_argument('--cause', required=True, help='原因分析')
    parser.add_argument('--fix', required=True, help='修正方案')
    parser.add_argument('--tags', required=True, help='模式标签，如 "#文件校验 #图片处理"')
    
    args = parser.parse_args()
    record_error(args.task, args.error, args.cause, args.fix, args.tags)

if __name__ == '__main__':
    main()


path: scripts/search_errors.py
content: #!/usr/bin/env python3
"""
搜索错误日志
"""

import argparse
import sys
from pathlib import Path
from datetime import datetime

def search_errors(keyword: str = None, tag: str = None, limit: int = 10):
    """搜索错误日志"""
    memory_dir = Path(__file__).parent.parent.parent.parent / 'workspace' / 'memory'
    
    # 获取所有日志文件
    log_files = sorted(memory_dir.glob('error-log-*.md'), reverse=True)
    
    if not log_files:
        print("❌ 未找到错误日志文件")
        return
    
    results = []
    
    for log_file in log_files:
        content = log_file.read_text()
        
        # 按错误分割
        errors = content.split('### 错误 #')
        
        for error in errors[1:]:  # 跳过第一个空块
            lines = error.split('\n')
            error_text = '\n'.join(lines[:10])  # 取前 10 行
            
            # 搜索关键词或标签
            match = False
            if keyword and keyword.lower() in error.lower():
                match = True
            if tag and tag in error:
                match = True
            
            if match:
                # 提取错误编号和标题
                first_line = lines[0].strip()
                error_num = first_line.split(' - ')[0] if ' - ' in first_line else first_line
                title = first_line.split(' - ')[1] if ' - ' in first_line else '无标题'
                
                results.append({
                    'file': log_file.name,
                    'number': error_num,
                    'title': title,
                    'content': error_text
                })
            
            if len(results) >= limit:
                break
        
        if len(results) >= limit:
            break
    
    # 输出结果
    if not results:
        print(f"❌ 未找到匹配的错误")
        if keyword:
            print(f"  关键词：{keyword}")
        if tag:
            print(f"  标签：{tag}")
        return
    
    print(f"✓ 找到 {len(results)} 个匹配的错误:\n")
    
    for i, result in enumerate(results, 1):
        print(f"--- 错误 {i} ---")
        print(f"文件：{result['file']}")
        print(f"编号：{result['number']}")
        print(f"标题：{result['title']}")
        print(f"内容:\n{result['content']}")
        print()

def main():
    parser = argparse.ArgumentParser(description='搜索错误日志')
    parser.add_argument('--keyword', '-k', help='搜索关键词')
    parser.add_argument('--tag', '-t', help='搜索标签，如 #文件校验')
    parser.add_argument('--limit', '-l', type=int, default=10, help='最多返回结果数')
    
    args = parser.parse_args()
    
    if not args.keyword and not args.tag:
        parser.print_help()
        print("\n❌ 请提供 --keyword 或 --tag 参数")
        sys.exit(1)
    
    search_errors(args.keyword, args.tag, args.limit)

if __name__ == '__main__':
    main()


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)