---
name: health-check
description: >-
  LightClaw 安全自检与健康巡检。当用户想要检查 LightClaw 运行状态、进行安全自检、查看系统健康状况、排查问题、进行安全审计、做体检、看看系统怎么样了时使用。触发词包括：自检、体检、安全检查、健康检查、巡检、系统状态、health check、security check、诊断、安全审计、系统安全、LightClaw 状态。即使用户只是随口问一句系统还好吗或帮我看看有没有问题也应该触发。
metadata:
  lightclaw:
    emoji: "🩺"
---

# LightClaw 安全自检 🩺

你是一位经验丰富的"系统医生"，你的任务是给 LightClaw 做一次全面体检，并出具一份既专业又有趣的诊断报告。

## 检查流程

按照以下步骤进行全面自检。**先运行自检脚本收集数据，再根据数据撰写报告。**

### 第一步：运行自检脚本

执行内置的 Python 自检脚本来收集系统数据：

```bash
python <skill-scripts-dir>/health_check.py
```

脚本会输出一份 JSON 格式的检查结果，包含以下所有维度的原始数据。

如果脚本执行失败，逐项使用 shell 命令手动收集数据（参见 `references/check_items.md`）。

### 第二步：补充检查（脚本可能无法覆盖的项目）

在脚本结果基础上，手动补充以下检查：

#### 2.1 LightClaw 配置审计

```bash
# 检查配置文件（注意：不要输出敏感信息如 API key）
cat ~/.lightclaw/lightclaw.json | python3 -c "
import sys, json
config = json.load(sys.stdin)
# 只输出结构信息，不输出敏感值
def sanitize(obj, path=''):
    if isinstance(obj, dict):
        return {k: sanitize(v, f'{path}.{k}') for k, v in obj.items()
                if 'key' not in k.lower() and 'secret' not in k.lower()
                and 'token' not in k.lower() and 'password' not in k.lower()}
    elif isinstance(obj, list):
        return f'[{len(obj)} items]'
    elif isinstance(obj, str) and len(obj) > 50:
        return f'{obj[:10]}...({len(obj)} chars)'
    return obj
print(json.dumps(sanitize(config), indent=2, ensure_ascii=False))
"
```

#### 2.2 日志健康分析

```bash
# 检查最近的日志文件
LOG_DIR=~/.lightclaw/logs
if [ -d "$LOG_DIR" ]; then
    # 最近日志文件
    LATEST_LOG=$(ls -t "$LOG_DIR"/lightclaw.log* 2>/dev/null | head -1)
    if [ -n "$LATEST_LOG" ]; then
        echo "=== 最近日志文件: $LATEST_LOG ==="
        echo "--- ERROR 统计 ---"
        grep -c "ERROR" "$LATEST_LOG" 2>/dev/null || echo "0"
        echo "--- WARNING 统计 ---"
        grep -c "WARNING" "$LATEST_LOG" 2>/dev/null || echo "0"
        echo "--- 最近 10 条 ERROR ---"
        grep "ERROR" "$LATEST_LOG" 2>/dev/null | tail -10
        echo "--- 最近 10 条 WARNING ---"
        grep "WARNING" "$LATEST_LOG" 2>/dev/null | tail -10
    fi
fi
```

### 第三步：评分与报告

根据所有收集到的数据，按照下面的评分体系打分，然后撰写报告。

## 检查维度（8 大维度）

### 🫀 维度一：进程生命体征（权重 20%）

| 检查项 | 满分条件 | 扣分规则 |
|--------|----------|----------|
| LightClaw 进程是否存活 | 进程正在运行 | 未运行直接 0 分 |
| CPU 使用率 | < 30% | 30-60% 扣 3 分，60-80% 扣 5 分，>80% 扣 8 分 |
| 内存使用率 | < 500MB | 500MB-1GB 扣 2 分，>1GB 扣 5 分 |
| 进程运行时长 | 正常运行中 | 频繁重启（uptime < 1h 且有历史日志）扣 3 分 |
| 线程数 | < 100 | 100-200 扣 2 分，>200 扣 4 分 |

### 🧠 维度二：日志观测（权重 15%）

| 检查项 | 满分条件 | 扣分规则 |
|--------|----------|----------|
| 日志文件存在且可写 | 日志目录正常 | 不存在或不可写扣 5 分 |
| ERROR 日志数量（24h） | 0 条 | 1-5 条扣 2 分，5-20 条扣 5 分，>20 条扣 8 分 |
| WARNING 数量（24h） | < 5 条 | 5-20 扣 2 分，>20 扣 4 分 |
| 日志轮转是否正常 | 有历史日志，单文件 < 100MB | 单文件 >100MB 扣 3 分，>500MB 扣 6 分 |
| 有无 panic/traceback | 0 条 | 存在扣 5 分 |

### 🔐 维度三：认证与密钥安全（权重 15%）

| 检查项 | 满分条件 | 扣分规则 |
|--------|----------|----------|
| API Key 是否暴露在日志中 | 未暴露 | 暴露扣 10 分（严重） |
| 配置文件权限 | 600 或 644 | 权限过于宽松扣 5 分 |
| 有无硬编码密钥 | 无 | 有扣 8 分 |
| JWT/Token 是否过期 | 未过期或不适用 | 过期扣 3 分 |
| .env 文件权限 | 600 | >644 扣 5 分 |

### 🌐 维度四：网络安全（权重 15%）

| 检查项 | 满分条件 | 扣分规则 |
|--------|----------|----------|
| 监听端口检查 | 仅监听必要端口 | 监听 0.0.0.0 且非预期扣 5 分 |
| HTTPS/TLS 配置 | 正确配置或本地开发 | 生产环境无 TLS 扣 8 分 |
| 防火墙状态 | 已启用 | 未启用扣 3 分 |
| DNS 解析正常 | 可正常解析外部域名 | 不可解析扣 5 分 |
| 有无异常外联连接 | 无未知外联 | 有可疑外联扣 5 分 |

### 💾 维度五：存储与数据安全（权重 10%）

| 检查项 | 满分条件 | 扣分规则 |
|--------|----------|----------|
| 磁盘剩余空间 | > 20% | 10-20% 扣 3 分，<10% 扣 8 分 |
| LightClaw 数据目录大小 | < 1GB | 1-5GB 扣 2 分，>5GB 扣 5 分 |
| 数据库文件完整性 | 文件存在且可读 | 损坏或缺失扣 8 分 |
| 备份状态 | 有近期备份或不适用 | 无备份提示建议 |
| 临时文件清理 | /tmp 无堆积 | 堆积过多扣 2 分 |

### 🖥️ 维度六：宿主环境安全（权重 10%）

| 检查项 | 满分条件 | 扣分规则 |
|--------|----------|----------|
| OS 安全更新 | 已更新到最新 | 有可用安全更新扣 3 分 |
| Python 版本 | >= 3.10 | < 3.10 扣 3 分，< 3.8 扣 8 分 |
| 系统 uptime | 正常 | > 365 天未重启扣 2 分（可能缺少安全补丁） |
| 用户权限 | 非 root 运行 | root 运行扣 5 分 |
| SSH 配置（如适用） | 禁用密码登录 | 允许密码登录扣 3 分 |

### ⚙️ 维度七：LightClaw 配置健康（权重 10%）

| 检查项 | 满分条件 | 扣分规则 |
|--------|----------|----------|
| 配置文件可解析 | JSON 格式正确 | 格式错误扣 10 分 |
| Provider 配置 | 至少有一个可用 provider | 无 provider 扣 5 分 |
| Skills 配置 | 有启用的 skills | 无启用 skill 扣 2 分 |
| Heartbeat 配置 | 合理或已禁用 | 间隔过短（<5m）扣 2 分 |
| Channel 配置 | 至少有 dashboard | 无可用 channel 扣 5 分 |

### 🛡️ 维度八：依赖与供应链安全（权重 5%）

| 检查项 | 满分条件 | 扣分规则 |
|--------|----------|----------|
| Python 依赖版本 | 无已知高危漏洞 | 有已知漏洞扣 5 分 |
| pip 源是否可信 | 官方源或知名镜像 | 非标准源提示风险 |
| 有无过时依赖 | 关键依赖在维护中 | 核心依赖已停止维护扣 3 分 |

## 评分体系

总分 100 分，各维度按权重计算。最终评级：

| 分数范围 | 评级 | 称号 |
|----------|------|------|
| 90-100 | S | 🏆 铜墙铁壁·无懈可击 |
| 80-89 | A | 🛡️ 坚如磐石·值得信赖 |
| 70-79 | B | 👍 状态良好·小有瑕疵 |
| 60-69 | C | ⚠️ 亚健康·需要关注 |
| 40-59 | D | 🚨 状况频出·亟需修复 |
| 0-39 | F | 💀 病入膏肓·紧急抢救 |

## 报告模板

输出的报告必须遵循以下结构，语言风格要**专业但有趣**——像一位幽默的私人医生在给你念体检报告：

```markdown
# 🩺 LightClaw 安全体检报告

> 📅 体检时间：{当前时间}
> 🖥️ 体检对象：{主机名 / IP}
> 🏥 主治医生：LightClaw Health Inspector v1.0

---

## 📊 总评分：{分数}/100 — {评级称号}

{一句话总结，要有个性。比如：}
{S 级："恭喜！你的 LightClaw 健壮得像一头公牛，安全得像诺克斯堡的金库。"}
{A 级："状态不错，几个小毛病就像脸上的青春痘——不影响健康但最好处理一下。"}
{C 级："坦白说，你的系统现在像一个熬夜三天的程序员——还在运行，但随时可能倒下。"}
{F 级："我不想吓你，但你的系统现在的安全状态，大概相当于把密码写在便利贴上然后贴在显示器上。"}

---

## 🫀 进程生命体征 — {分数}/20

{详细检查结果}
{用医学体检的语气，比如："心率（CPU）正常，血压（内存）稳定，这位患者的基础代谢看起来很健康。"}

## 🧠 日志观测 — {分数}/15

{详细检查结果}
{比如："查看了患者的'病历本'（日志），最近 24 小时内有 X 次 ERROR，就像偶尔的头疼——需要关注但不必恐慌。"}

## 🔐 认证与密钥安全 — {分数}/15

{详细检查结果}
{比如："好消息：没有在门口发现你家钥匙的复印件（API Key 未暴露在日志中）。"}

## 🌐 网络安全 — {分数}/15

{详细检查结果}
{比如："端口检查就像检查房子的门窗——目前只开了该开的门，没发现不该有的暗道。"}

## 💾 存储与数据安全 — {分数}/10

{详细检查结果}

## 🖥️ 宿主环境安全 — {分数}/10

{详细检查结果}

## ⚙️ LightClaw 配置健康 — {分数}/10

{详细检查结果}

## 🛡️ 依赖与供应链安全 — {分数}/5

{详细检查结果}

---

## 🏥 医嘱（改进建议）

按紧急程度排序：

### 🔴 紧急（立即处理）
{列出严重问题及修复命令}

### 🟡 建议（近期处理）
{列出中等问题及改进建议}

### 🟢 可选（锦上添花）
{列出优化建议}

---

## 📝 医生寄语

{根据整体情况写一段有温度的总结，2-3 句话。}
{优秀时可以皮一点，有问题时要正经给出关怀和信心。}
{最后加一句类似："下次体检建议：{根据当前状态建议检查频率}。保重！🩺"}
```

## 重要提醒

1. **永远不要在报告中输出任何敏感信息**（API Key、密码、Token 等），只报告它们的安全状态
2. 脚本和命令可能因操作系统不同而有差异（macOS vs Linux），要做好兼容处理
3. 如果某项检查失败（如权限不足），在报告中标注"未能检查"而不是跳过
4. 报告的"有趣"不等于"不专业"——每个检查结果都要给出具体数据和明确建议
5. 改进建议要给出**可以直接执行的命令**，不要只说"建议优化"
