Skill: willin/agent-status-monitor (version 1.0.0)

--- name: agent-status-monitor description: 检查本地开发 Agent（Claude Code、OpenCode、OpenClaw、Cursor 等）的运行状态、进程、会话和活动状态。触发词："agents_monitor"、"检查 Claude Code 状态"、"查看 opencode 是否在运行"、"监控开发工具"、"agent 监控"。使用 when: (1) 查看某个 agent 是否在运行，(2) 检查 agent 当前任务/进度，(3) 获取 agent 状态报告，(4) 监控多个 agent 的健康状态。 --- # Agent Status Monitor 检查本地开发工具 Agent 的运行状态和活动状态。 --- ## 触发条件 **核心意图**：快速了解本地运行的 AI 开发工具（Agent）是否在运行、是否在工作、是否有会话活动。 **典型场景**： - 同时运行多个 Agent（Claude Code、OpenCode、OpenClaw），想确认各自状态 - 不确定某个 Agent 是否还在工作，还是已经卡住/闲置 - 想查看哪个 Agent 正在活跃使用，哪个只是后台运行 - 定期检查多个 Agent 的健康状态 **触发示例**： - "检查 agent 状态" - "Claude Code 还在工作吗" - "看看有哪些 agent 在运行" - "opencode 是不是闲置了" - "运行 agents_monitor" --- ## 具体成果 **一句话目标**：运行 `agents_monitor` 命令，输出所有本地 Agent 的运行状态（运行中/工作中/闲置/未运行）和会话数量。 **预期输出**： ``` ● Claude Code: 🔥 工作中 (2 分钟内有更新) · 13 个会话 ● OpenClaw: 🔥 工作中 (2 分钟内有更新) · 1 个会话 ● OpenCode: 💤 闲置 (未使用) · 1 个会话 ○ Cursor IDE: 未运行 ``` **状态说明**： | 状态 | 含义 | |------|------| | 🔥 工作中 | 2 分钟内有会话文件更新 | | ⏳ 等待中 | 10 分钟内有更新（可能在思考/等待 API） | | 💤 闲置 | 超过 10 分钟无更新，或未使用 | | ○ 未运行 | 进程不存在 | --- ## 步骤逻辑 ### 执行步骤 1. **运行检测脚本** ```bash ~/.openclaw/workspace/skills/agent-status-monitor/scripts/check-agents.sh ``` 2. **进程检测** - 对每个 Agent 执行： - `ps aux | grep <agent>` 检查进程是否存在 - 排除系统误报进程（如 CursorUIViewService） 3. **活动状态判断** - 检查会话目录文件修改时间： - 2 分钟内有更新 → 🔥 工作中 - 10 分钟内有更新 → ⏳ 等待中 - 超过 10 分钟无更新 → 💤 闲置 - 只有 1 个文件且超过 5 分钟 → 💤 未使用（初始配置） 4. **输出报告** - 包含： - 状态图标 + 文字说明 - 会话文件数量 - 详细配置信息（版本、配置路径等） ### 各 Agent 会话目录 | Agent | 会话目录 | |-------|----------| | Claude Code | `~/.claude/projects/` | | OpenClaw | `~/.openclaw/agents/` | | OpenCode | `~/.local/state/opencode/` | | Cursor IDE | 进程检测（无统一会话目录） | ### 约束 - 只检测本地运行的 Agent，不涉及云端/远程服务 - 基于文件系统修改时间，不依赖 Agent API - 仅读取公开目录，不访问私有数据 --- ## 正反样例 ### ✅ 正例 **输入**： ``` 检查 agent 状态 ``` **输出**： ``` ======================================== Agent Status Monitor ======================================== --- 进程状态 --- ● Claude Code: 🔥 工作中 (2 分钟内有更新) · 13 个会话 ● OpenClaw: 🔥 工作中 (2 分钟内有更新) · 1 个会话 ● OpenCode: 💤 闲置 (未使用) · 1 个会话 ○ Cursor IDE: 未运行 --- OpenCode 详情 --- 版本：1.2.15 └─ 配置：~/.config/opencode/opencode.json └─ 会话日志：1 个文件 --- OpenClaw 状态 --- [OpenClaw status 输出...] ``` **输入**： ``` Claude Code 还在工作吗 ``` **输出**： ``` Claude Code: 🔥 工作中 (2 分钟内有更新) · 13 个会话 ``` ### ❌ 反例 **输入**： ``` 检查 agent 状态 ``` **错误输出**： ``` Claude Code: 运行中 OpenCode: 运行中 ``` > ❌ 问题：没有显示活动状态（工作中/闲置），信息不完整 **错误输出**： ``` CPU 使用率：Claude Code 3.7%, OpenCode 0.3% ``` > ❌ 问题：CPU 使用率不可靠，Agent 等待 API 时 CPU 低但仍在工作中 **错误输出**： ``` Claude Code 进程 ID: 12345, 12346, 12347 ``` > ❌ 问题：用户不关心进程 ID，关心的是"是否在工作" --- ## 明确限制 ### 不做什么 - ❌ **不监控云端 Agent** - 只检测本地进程和文件 - ❌ **不统计 Token 使用量** - 各 Agent 日志格式不统一，暂不支持 - ❌ **不显示进程 ID/内存占用** - 用户关心活动状态，不是系统指标 - ❌ **不控制/停止 Agent** - 只读检测，不执行任何修改操作 - ❌ **不涉及敏感话题** - 纯技术检测，无内容审查 ### 异常处理 | 情况 | 处理方式 | |------|----------| | 会话目录不存在 | 显示"未运行"或"未安装" | | 无法读取文件时间 | 降级为仅进程检测 | | 脚本执行失败 | 输出错误信息 + 建议检查路径 | | 没有安装任何 Agent | 显示"未检测到任何 Agent" | ### 兜底策略 如果脚本检测失败，返回： ``` ⚠️ 无法获取详细状态，尝试手动检查： ps aux | grep -E "(claude|opencode|openclaw)" | grep -v grep ``` ### 已知限制 1. **Cursor IDE** - 没有统一会话目录，仅进程检测 2. **新 Agent 类型** - 需要手动添加检测逻辑 3. **跨用户检测** - 只能检测当前用户的 Agent 4. **容器/Docker** - 不检测容器内运行的 Agent --- ## 相关资源 - `scripts/check-agents.sh` - 主检测脚本 - `references/agent-commands.md` - 各 Agent 命令参考 ## 更新日志 - 基于会话文件修改时间判断活动状态（比 CPU 使用率更可靠） - 支持 Claude Code、OpenCode、OpenClaw、Cursor IDE - 提供 `agents_monitor` 命令别名

path: README.md
content: # Agent Status Monitor

Monitor the status and activity of local AI development agents (Claude Code, OpenCode, OpenClaw, Cursor, etc.).

English | [简体中文](README.zh-CN.md)

![agent-status-monitor](https://socialify.git.ci/willin/agent-status-monitor/image?description=1&forks=1&name=1&owner=1&pattern=Circuit+Board&stargazers=1&theme=Auto)

## 🚀 Quick Start

### Installation

#### Option 1: Install via ClawHub

```bash
clawhub install agent-status-monitor
```

#### Option 2: Install via npx

```bash
npx skills add willin/agent-status-monitor
```

#### Option 3: Clone from GitHub

```bash
# Clone the repository
git clone https://github.com/willin/agent-status-monitor.git
cd agent-status-monitor

# Copy to OpenClaw workspace
cp -r . ~/.openclaw/workspace/skills/agent-status-monitor/

# Make scripts executable
chmod +x ~/.openclaw/workspace/skills/agent-status-monitor/scripts/*.sh
```

### Usage

**Method 1: Run the main script**
```bash
~/.openclaw/workspace/skills/agent-status-monitor/scripts/check-agents.sh
```

**Method 2: Trigger in OpenClaw**

> ⚠️ **Note**: Avoid using "check agent status" alone, as it may trigger OpenClaw's built-in session status instead.

```
agents_monitor
Check Claude Code status
Is OpenCode running?
Monitor development tools
agent monitoring
```

**Method 3: Run individual agent checks**
```bash
./scripts/check-claude-code.sh
./scripts/check-openclaw.sh
./scripts/check-opencode.sh
./scripts/check-cursor.sh
```

## 📊 Output Example

```
========================================
   Agent Status Monitor
========================================

--- 进程状态 ---
--- Claude Code 状态 ---
● Claude Code: 🔥 Working (updated within 2 min) · 13 sessions

--- OpenClaw 状态 ---
● OpenClaw: 🔥 Working (updated within 2 min) · 3 sessions

--- OpenCode 状态 ---
● OpenCode: 💤 Idle (not used) · 1 session

--- Cursor IDE 状态 ---
○ Cursor IDE: Not running

========================================
```

## 📋 Status Indicators

| Status | Icon | Meaning |
|--------|------|---------|
| Working | 🔥 | Session files updated within 2 minutes |
| Waiting | ⏳ | Updated within 10 minutes (may be thinking/waiting for API) |
| Idle | 💤 | No updates for 10+ minutes, or unused |
| Not Running | ○ | Process not found |

## 🔧 Supported Agents

| Agent | Process Detection | Session Detection | Session Directory |
|-------|------------------|-------------------|-------------------|
| Claude Code | ✅ | ✅ | `~/.claude/projects/` |
| OpenClaw | ✅ | ✅ | `~/.openclaw/agents/` |
| OpenCode | ✅ | ✅ | `~/.local/state/opencode/` |
| Cursor IDE | ✅ | ❌ | N/A |

## 📁 Project Structure

```
agent-status-monitor/
├── README.md                       # This file (English)
├── README.zh-CN.md                 # Chinese README
├── LICENSE                         # MIT License
├── SKILL.md                        # OpenClaw skill definition
├── scripts/
│   ├── check-agents.sh             # Main script (calls all checks)
│   ├── check-claude-code.sh        # Claude Code detector
│   ├── check-openclaw.sh           # OpenClaw detector
│   ├── check-opencode.sh           # OpenCode detector
│   └── check-cursor.sh             # Cursor IDE detector
└── references/
    └── agent-commands.md           # Reference commands for each agent
```

## 🛠️ Customization

### Add a New Agent Detector

Create a new script in `scripts/`:

```bash
#!/bin/bash
# check-your-agent.sh
SESSIONS_DIR="$HOME/.your-agent/sessions"
# ... implement detection logic
```

Then update `check-agents.sh` to call it.

### Adjust Time Thresholds

Modify the time checks in individual scripts:
- `mmin -2` - Working threshold (default: 2 minutes)
- `mmin -10` - Waiting threshold (default: 10 minutes)

## ⚠️ Notes

1. **Local Only** - Only detects locally running agents, not cloud services
2. **Read-Only** - Does not modify or control any agents
3. **Filesystem Dependent** - Based on session file modification times
4. **False Positive Prevention** - Excludes macOS system processes (e.g., CursorUIViewService)
5. **Trigger Words** - Use specific triggers like `agents_monitor` or "Check Claude Code status" to avoid confusion with OpenClaw's built-in session status

## ❓ FAQ

**Q: Why does "check agent status" show OpenClaw session info instead?**

A: OpenClaw has a built-in session status feature. To use this skill, use specific triggers:
- ✅ `agents_monitor`
- ✅ "Check Claude Code status"
- ✅ "Is OpenCode running?"
- ❌ "Check agent status" (triggers built-in feature)

## 🐛 Troubleshooting

**Issue: Shows "Not Running" but agent is actually running**
```bash
# Manually check processes
ps aux | grep -i "<agent-name>" | grep -v grep

# Check if session directory exists
ls -la ~/.claude/projects/  # Claude Code example
```

**Issue: Script not executable**
```bash
chmod +x ~/.openclaw/workspace/skills/agent-status-monitor/scripts/*.sh
```

## 📝 Changelog

- **v1.0** - Initial release
  - Support for Claude Code, OpenCode, OpenClaw, Cursor IDE
  - Activity detection based on session file modification times
  - Modular script design for easy extension

## 🤝 Contributing

Issues and Pull Requests are welcome!

## 📄 License

MIT License - See [LICENSE](LICENSE) file for details.


path: README.zh-CN.md
content: # Agent Status Monitor

监控本地 AI 开发工具 Agent（Claude Code、OpenCode、OpenClaw、Cursor 等）的运行状态和活动状态。

[English](README.md) | 简体中文

![agent-status-monitor](https://socialify.git.ci/willin/agent-status-monitor/image?description=1&forks=1&name=1&owner=1&pattern=Circuit+Board&stargazers=1&theme=Auto)


## 🚀 快速开始

### 安装方式

#### 方式 1：通过 ClawHub 安装

```bash
clawhub install agent-status-monitor
```

#### 方式 2：使用 npx 安装

```bash
npx skills add willin/agent-status-monitor
```

#### 方式 3：从 GitHub 克隆或下载

```bash
# 克隆仓库
git clone https://github.com/willin/agent-status-monitor.git
cd agent-status-monitor

# 复制到 OpenClaw workspace
cp -r . ~/.openclaw/workspace/skills/agent-status-monitor/

# 添加执行权限
chmod +x ~/.openclaw/workspace/skills/agent-status-monitor/scripts/*.sh
```

### 使用方法

**方法 1：运行主脚本**
```bash
~/.openclaw/workspace/skills/agent-status-monitor/scripts/check-agents.sh
```

**方法 2：在 OpenClaw 中触发**

> ⚠️ **注意**：避免单独使用"检查 agent 状态"，这可能会触发 OpenClaw 内置的会话状态功能。

```
agents_monitor
检查 Claude Code 状态
查看 opencode 是否在运行
监控开发工具
agent 监控
```

**方法 3：单独检查某个 Agent**
```bash
./scripts/check-claude-code.sh    # 检查 Claude Code
./scripts/check-openclaw.sh       # 检查 OpenClaw
./scripts/check-opencode.sh       # 检查 OpenCode
./scripts/check-cursor.sh         # 检查 Cursor IDE
```

## 📊 输出示例

```
========================================
   Agent Status Monitor
========================================

--- 进程状态 ---
--- Claude Code 状态 ---
● Claude Code: 🔥 工作中 (2 分钟内有更新) · 13 个会话

--- OpenClaw 状态 ---
● OpenClaw: 🔥 工作中 (2 分钟内有更新) · 3 个会话

--- OpenCode 状态 ---
● OpenCode: 💤 闲置 (未使用) · 1 个会话

--- Cursor IDE 状态 ---
○ Cursor IDE: 未运行

========================================
```

## 📋 状态说明

| 状态 | 图标 | 含义 |
|------|------|------|
| 工作中 | 🔥 | 2 分钟内有会话文件更新 |
| 等待中 | ⏳ | 10 分钟内有更新（可能在思考/等待 API） |
| 闲置 | 💤 | 超过 10 分钟无更新，或未使用 |
| 未运行 | ○ | 进程不存在 |

## 🔧 支持的 Agent

| Agent | 进程检测 | 会话检测 | 会话目录 |
|-------|----------|----------|----------|
| Claude Code | ✅ | ✅ | `~/.claude/projects/` |
| OpenClaw | ✅ | ✅ | `~/.openclaw/agents/` |
| OpenCode | ✅ | ✅ | `~/.local/state/opencode/` |
| Cursor IDE | ✅ | ❌ | N/A |

## 📁 项目结构

```
agent-status-monitor/
├── README.md                       # 英文文档
├── README.zh-CN.md                 # 中文文档（本文件）
├── LICENSE                         # MIT License
├── SKILL.md                        # OpenClaw 技能定义
├── scripts/
│   ├── check-agents.sh             # 主脚本（调用所有检测）
│   ├── check-claude-code.sh        # Claude Code 检测
│   ├── check-openclaw.sh           # OpenClaw 检测
│   ├── check-opencode.sh           # OpenCode 检测
│   └── check-cursor.sh             # Cursor IDE 检测
└── references/
    └── agent-commands.md           # 各 Agent 命令参考
```

## 🛠️ 自定义扩展

### 添加新的 Agent 检测

在 `scripts/` 目录创建新脚本：

```bash
#!/bin/bash
# check-your-agent.sh
SESSIONS_DIR="$HOME/.your-agent/sessions"
# ... 实现检测逻辑
```

然后更新 `check-agents.sh` 调用它。

### 调整时间阈值

修改各个脚本中的时间判断：
- `mmin -2` - 工作中阈值（默认 2 分钟）
- `mmin -10` - 等待中阈值（默认 10 分钟）

## ⚠️ 注意事项

1. **仅本地检测** - 只检测本地运行的 Agent，不涉及云端服务
2. **只读操作** - 不会修改或控制任何 Agent
3. **文件系统依赖** - 基于会话文件修改时间，需要读取权限
4. **误报排除** - 已排除 macOS 系统进程（如 CursorUIViewService）
5. **触发词** - 使用特定触发词如 `agents_monitor` 或"检查 Claude Code 状态"，避免与 OpenClaw 内置会话状态混淆

## ❓ 常见问题

**Q: 为什么说"检查 agent 状态"显示的是 OpenClaw 会话信息？**

A: OpenClaw 内置了会话状态功能。要使用本技能，请使用特定触发词：
- ✅ `agents_monitor`
- ✅ "检查 Claude Code 状态"
- ✅ "opencode 在运行吗"
- ❌ "检查 agent 状态"（会触发内置功能）

## 🐛 故障排除

**问题：显示"未运行"但 Agent 实际在运行**
```bash
# 手动检查进程
ps aux | grep -i "<agent 名>" | grep -v grep

# 检查会话目录是否存在
ls -la ~/.claude/projects/  # Claude Code 示例
```

**问题：脚本没有执行权限**
```bash
chmod +x ~/.openclaw/workspace/skills/agent-status-monitor/scripts/*.sh
```

## 📝 更新日志

- **v1.0** - 初始版本
  - 支持 Claude Code、OpenCode、OpenClaw、Cursor IDE
  - 基于会话文件修改时间判断活动状态
  - 模块化脚本设计，易于扩展

## 🤝 贡献

欢迎提交 Issue 和 Pull Request！

## 📄 许可证

MIT License - 详见 [LICENSE](LICENSE) 文件


path: scripts/check-cursor.sh
content: #!/bin/bash
# check-cursor.sh - 检查 Cursor IDE 运行状态
# 用法：./check-cursor.sh

set -e

COLOR_RESET="\033[0m"
COLOR_GREEN="\033[32m"
COLOR_YELLOW="\033[33m"
COLOR_BLUE="\033[34m"

echo -e "${COLOR_BLUE}--- Cursor IDE 状态 ---${COLOR_RESET}"

# 检查进程（排除系统进程 CursorUIViewService）
CURSOR_PROCS=$(ps aux | grep -i "cursor" | grep -v grep | grep -v "CursorUIViewService" | wc -l | tr -d ' ')

if [ "$CURSOR_PROCS" -gt 0 ]; then
    echo -e "${COLOR_GREEN}● Cursor IDE${COLOR_RESET}: 运行中 ($CURSOR_PROCS 个进程)"
else
    echo -e "${COLOR_YELLOW}○ Cursor IDE${COLOR_RESET}: 未运行"
fi


path: scripts/check-openclaw.sh
content: #!/bin/bash
# check-openclaw.sh - 检查 OpenClaw 运行状态
# 用法：./check-openclaw.sh

set -e

COLOR_RESET="\033[0m"
COLOR_GREEN="\033[32m"
COLOR_YELLOW="\033[33m"
COLOR_BLUE="\033[34m"

SESSIONS_DIR="$HOME/.openclaw/agents"

echo -e "${COLOR_BLUE}--- OpenClaw 状态 ---${COLOR_RESET}"

# 检查进程
PROCESSES=$(ps aux | grep -i "openclaw" | grep -v grep | wc -l | tr -d ' ')

if [ "$PROCESSES" -gt 0 ]; then
    # 检查会话文件活动状态
    if [ -d "$SESSIONS_DIR" ]; then
        SESSION_COUNT=$(find "$SESSIONS_DIR" -name "*.json" -type f 2>/dev/null | wc -l | tr -d ' ')
        
        # 检查 2 分钟内是否有文件更新
        RECENT_FILES=$(find "$SESSIONS_DIR" -type f -name "*.json" -mmin -2 2>/dev/null | wc -l | tr -d ' ')
        if [ "$RECENT_FILES" -gt 0 ]; then
            echo -e "${COLOR_GREEN}● OpenClaw${COLOR_RESET}: 🔥 工作中 (2 分钟内有更新) · $SESSION_COUNT 个会话"
        else
            # 检查 10 分钟内是否有文件更新
            RECENT_FILES_10=$(find "$SESSIONS_DIR" -type f -name "*.json" -mmin -10 2>/dev/null | wc -l | tr -d ' ')
            if [ "$RECENT_FILES_10" -gt 0 ]; then
                echo -e "${COLOR_GREEN}● OpenClaw${COLOR_RESET}: ⏳ 等待中 (10 分钟内有更新) · $SESSION_COUNT 个会话"
            else
                echo -e "${COLOR_GREEN}● OpenClaw${COLOR_RESET}: 💤 闲置 (最近无更新) · $SESSION_COUNT 个会话"
            fi
        fi
    else
        echo -e "${COLOR_GREEN}● OpenClaw${COLOR_RESET}: 运行中 ($PROCESSES 个进程)"
    fi
    
    # 显示 OpenClaw status
    if command -v openclaw &> /dev/null; then
        echo ""
        openclaw status 2>/dev/null | head -15
    fi
else
    echo -e "${COLOR_YELLOW}○ OpenClaw${COLOR_RESET}: 未运行"
fi


path: scripts/check-claude-code.sh
content: #!/bin/bash
# check-claude-code.sh - 检查 Claude Code 运行状态
# 用法：./check-claude-code.sh

set -e

COLOR_RESET="\033[0m"
COLOR_GREEN="\033[32m"
COLOR_YELLOW="\033[33m"
COLOR_BLUE="\033[34m"

SESSIONS_DIR="$HOME/.claude/projects"

echo -e "${COLOR_BLUE}--- Claude Code 状态 ---${COLOR_RESET}"

# 检查进程
PROCESSES=$(ps aux | grep -i "claude" | grep -v grep | wc -l | tr -d ' ')

if [ "$PROCESSES" -gt 0 ]; then
    # 检查会话文件活动状态
    if [ -d "$SESSIONS_DIR" ]; then
        SESSION_COUNT=$(ls -1 "$SESSIONS_DIR" 2>/dev/null | wc -l | tr -d ' ')
        
        # 检查 2 分钟内是否有文件更新
        RECENT_FILES=$(find "$SESSIONS_DIR" -type f -mmin -2 2>/dev/null | wc -l | tr -d ' ')
        if [ "$RECENT_FILES" -gt 0 ]; then
            echo -e "${COLOR_GREEN}● Claude Code${COLOR_RESET}: 🔥 工作中 (2 分钟内有更新) · $SESSION_COUNT 个会话"
        else
            # 检查 10 分钟内是否有文件更新
            RECENT_FILES_10=$(find "$SESSIONS_DIR" -type f -mmin -10 2>/dev/null | wc -l | tr -d ' ')
            if [ "$RECENT_FILES_10" -gt 0 ]; then
                echo -e "${COLOR_GREEN}● Claude Code${COLOR_RESET}: ⏳ 等待中 (10 分钟内有更新) · $SESSION_COUNT 个会话"
            else
                echo -e "${COLOR_GREEN}● Claude Code${COLOR_RESET}: 💤 闲置 (最近无更新) · $SESSION_COUNT 个会话"
            fi
        fi
    else
        echo -e "${COLOR_GREEN}● Claude Code${COLOR_RESET}: 运行中 ($PROCESSES 个进程)"
    fi
else
    echo -e "${COLOR_YELLOW}○ Claude Code${COLOR_RESET}: 未运行"
fi


path: scripts/check-agents.sh
content: #!/bin/bash
# check-agents.sh - 检查所有本地开发 Agent 运行状态
# 用法：./check-agents.sh

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

COLOR_RESET="\033[0m"
COLOR_BLUE="\033[34m"

echo -e "${COLOR_BLUE}========================================${COLOR_RESET}"
echo -e "${COLOR_BLUE}   Agent Status Monitor${COLOR_RESET}"
echo -e "${COLOR_BLUE}========================================${COLOR_RESET}"
echo ""

echo -e "${COLOR_BLUE}--- 进程状态 ---${COLOR_RESET}"

# 调用各个独立检测脚本
"$SCRIPT_DIR/check-claude-code.sh"
echo ""

"$SCRIPT_DIR/check-openclaw.sh"
echo ""

"$SCRIPT_DIR/check-opencode.sh"
echo ""

"$SCRIPT_DIR/check-cursor.sh"
echo ""

echo -e "${COLOR_BLUE}========================================${COLOR_RESET}"


path: scripts/check-opencode.sh
content: #!/bin/bash
# check-opencode.sh - 检查 OpenCode 运行状态
# 用法：./check-opencode.sh

set -e

COLOR_RESET="\033[0m"
COLOR_GREEN="\033[32m"
COLOR_YELLOW="\033[33m"
COLOR_BLUE="\033[34m"

SESSIONS_DIR="$HOME/.local/state/opencode"
CONFIG_FILE="$HOME/.config/opencode/opencode.json"
EXECUTABLE="$HOME/.opencode/bin/opencode"

echo -e "${COLOR_BLUE}--- OpenCode 状态 ---${COLOR_RESET}"

# 检查进程
PROCESSES=$(ps aux | grep -i "opencode" | grep -v grep | wc -l | tr -d ' ')

if [ "$PROCESSES" -gt 0 ]; then
    # 检查会话文件活动状态
    if [ -d "$SESSIONS_DIR" ]; then
        SESSION_COUNT=$(ls -1 "$SESSIONS_DIR" 2>/dev/null | wc -l | tr -d ' ')
        
        # 检查 2 分钟内是否有文件更新
        RECENT_FILES=$(find "$SESSIONS_DIR" -type f -mmin -2 2>/dev/null | wc -l | tr -d ' ')
        if [ "$RECENT_FILES" -gt 0 ]; then
            echo -e "${COLOR_GREEN}● OpenCode${COLOR_RESET}: 🔥 工作中 (2 分钟内有更新) · $SESSION_COUNT 个会话"
        else
            # 检查 10 分钟内是否有文件更新
            RECENT_FILES_10=$(find "$SESSIONS_DIR" -type f -mmin -10 2>/dev/null | wc -l | tr -d ' ')
            if [ "$RECENT_FILES_10" -gt 0 ]; then
                # 如果只有 1 个文件且超过 5 分钟，可能是初始配置
                if [ "$SESSION_COUNT" -le 1 ]; then
                    LATEST_FILE=$(find "$SESSIONS_DIR" -type f -printf '%T@ %p\n' 2>/dev/null | sort -rn | head -1 | cut -d' ' -f2-)
                    if [ -n "$LATEST_FILE" ]; then
                        LATEST_MTIME=$(stat -f "%m" "$LATEST_FILE" 2>/dev/null || stat -c "%Y" "$LATEST_FILE" 2>/dev/null)
                        NOW=$(date +%s)
                        DIFF_MINS=$(( (NOW - LATEST_MTIME) / 60 ))
                        if [ "$DIFF_MINS" -gt 5 ]; then
                            echo -e "${COLOR_GREEN}● OpenCode${COLOR_RESET}: 💤 闲置 (未使用) · $SESSION_COUNT 个会话"
                        else
                            echo -e "${COLOR_GREEN}● OpenCode${COLOR_RESET}: ⏳ 等待中 (10 分钟内有更新) · $SESSION_COUNT 个会话"
                        fi
                    else
                        echo -e "${COLOR_GREEN}● OpenCode${COLOR_RESET}: 💤 闲置 (未使用) · $SESSION_COUNT 个会话"
                    fi
                else
                    echo -e "${COLOR_GREEN}● OpenCode${COLOR_RESET}: ⏳ 等待中 (10 分钟内有更新) · $SESSION_COUNT 个会话"
                fi
            else
                echo -e "${COLOR_GREEN}● OpenCode${COLOR_RESET}: 💤 闲置 (最近无更新) · $SESSION_COUNT 个会话"
            fi
        fi
    else
        echo -e "${COLOR_GREEN}● OpenCode${COLOR_RESET}: 运行中 ($PROCESSES 个进程)"
    fi
    
    # 显示详细信息
    if [ -f "$EXECUTABLE" ]; then
        VERSION=$("$EXECUTABLE" --version 2>/dev/null)
        echo ""
        echo -e "${COLOR_BLUE}详情:${COLOR_RESET}"
        echo "  版本：$VERSION"
        if [ -f "$CONFIG_FILE" ]; then
            echo "  配置：$CONFIG_FILE"
        fi
    fi
else
    echo -e "${COLOR_YELLOW}○ OpenCode${COLOR_RESET}: 未运行"
fi


path: telegram-commands/index.js
content: #!/usr/bin/env node

/**
 * Agents Monitor Telegram Command Handler
 * 
 * 当用户在 Telegram 中发送 /agents_monitor 命令时，
 * 执行检查脚本并返回结果。
 */

import { execSync } from 'child_process';
import { existsSync } from 'fs';
import { homedir } from 'os';
import { join } from 'path';

const SCRIPT_PATH = join(homedir(), '.openclaw/workspace/skills/agent-status-monitor/scripts/check-agents.sh');

/**
 * 处理 /agents_monitor 命令
 * @param {Object} context - 命令上下文
 * @returns {Promise<string>} - 返回格式化的状态消息
 */
export async function handleAgentsMonitorCommand(context) {
    try {
        // 检查脚本是否存在
        if (!existsSync(SCRIPT_PATH)) {
            return `❌ 错误：找不到检测脚本\n\n路径：${SCRIPT_PATH}\n\n请确保已正确安装 agent-status-monitor 技能。`;
        }

        // 执行检测脚本
        const result = execSync(SCRIPT_PATH, {
            encoding: 'utf-8',
            timeout: 30000, // 30 秒超时
            env: { ...process.env, FORCE_COLOR: '0' } // 禁用颜色输出
        });

        // 格式化输出（去除 ANSI 颜色代码）
        const cleanOutput = result.replace(/\x1b\[[0-9;]*m/g, '');

        // 构建回复消息
        const message = `🤖 **Agent 状态报告**\n\n\`\`\`\n${cleanOutput}\`\`\``;

        return message;

    } catch (error) {
        let errorMessage = '❌ **执行错误**\n\n';
        
        if (error.code === 'ETIMEDOUT' || error.message.includes('timeout')) {
            errorMessage += '⏱️ 检测超时，请稍后重试。';
        } else if (error.status === 127) {
            errorMessage += '🔧 脚本无法执行，请检查权限。\n\n';
            errorMessage += '运行以下命令添加执行权限：\n';
            errorMessage += '`chmod +x ~/.openclaw/workspace/skills/agent-status-monitor/scripts/*.sh`';
        } else {
            errorMessage += `错误信息：${error.message}`;
        }

        return errorMessage;
    }
}

// 导出命令处理器
export default {
    commands: {
        agents_monitor: {
            handler: handleAgentsMonitorCommand,
            description: '检查本地开发 Agent（Claude Code、OpenCode 等）的运行状态',
            usage: '/agents_monitor'
        }
    }
};


path: telegram-commands/README.md
content: # Telegram /agents_monitor 命令

为 Telegram Bot 添加 `/agents_monitor` 命令支持。

## 📋 功能

在 Telegram 中发送 `/agents_monitor` 命令，快速检查本地 AI 开发工具（Claude Code、OpenCode、OpenClaw 等）的运行状态。

## 🔧 安装方式

### 方式 1：通过 Completions 配置（推荐）

Completions 文件已自动创建在：
```
~/.openclaw/workspace/completions/agents_monitor.completion.json
```

重启 Gateway 即可生效：
```bash
openclaw gateway restart
```

### 方式 2：在 BotFather 中注册命令

1. 在 Telegram 中与 [@BotFather](https://t.me/BotFather) 对话
2. 发送 `/mybots` 选择你的 Bot
3. 发送 `/setcommands`
4. 输入命令列表：

```
agents_monitor - 检查本地 AI Agent 运行状态
status - 查看 Agent 状态
```

## 📱 使用方法

在 Telegram 中发送：

```
/agents_monitor
```

或使用触发词：
- "检查 agent 状态"
- "查看 agent 状态"
- "检查 Claude Code 状态"
- "opencode 状态"

## 📊 输出示例

```
🤖 Agent 状态报告

========================================
   Agent Status Monitor
========================================

--- 进程状态 ---
● Claude Code: 🔥 工作中 (2 分钟内有更新) · 13 个会话
● OpenClaw: 🔥 工作中 (2 分钟内有更新) · 3 个会话
● OpenCode: 💤 闲置 (最近无更新) · 1 个会话
○ Cursor IDE: 未运行

========================================
```

## ⚠️ 注意事项

1. **需要执行权限** - 确保脚本有执行权限：
   ```bash
   chmod +x ~/.openclaw/workspace/skills/agent-status-monitor/scripts/*.sh
   ```

2. **超时设置** - 命令执行超时时间为 30 秒，如果检测超时请检查系统负载

3. **仅限私聊** - 建议在私聊中使用，避免在群聊中暴露系统信息

## 🐛 故障排除

**问题：命令无响应**
```bash
# 检查 Gateway 是否运行
openclaw gateway status

# 查看日志
openclaw logs --tail 50
```

**问题：权限错误**
```bash
# 添加执行权限
chmod +x ~/.openclaw/workspace/skills/agent-status-monitor/scripts/*.sh
```

**问题：找不到脚本**
```bash
# 验证脚本路径
ls -la ~/.openclaw/workspace/skills/agent-status-monitor/scripts/
```

## 📄 文件结构

```
telegram-commands/
├── README.md                  # 本文档
├── agents_monitor.plugin.json # 插件配置（备用）
├── index.js                   # 命令处理器（备用）
└── install.js                 # 安装脚本（备用）
```

实际配置位于：
```
~/.openclaw/workspace/completions/agents_monitor.completion.json
```

## 📝 更新日志

- **v1.0** - 初始版本
  - 支持 `/agents_monitor` 命令
  - 通过 completions 系统实现
  - 错误处理和超时保护


path: telegram-commands/install.js
content: #!/usr/bin/env node

/**
 * 安装 Telegram /agents_monitor 命令
 * 
 * 用法：node install.js
 */

import { readFileSync, writeFileSync, existsSync } from 'fs';
import { homedir } from 'os';
import { join } from 'path';

const CONFIG_PATH = join(homedir(), '.openclaw/openclaw.json');

console.log('🔧 正在安装 Telegram /agents_monitor 命令...\n');

try {
    // 读取配置
    if (!existsSync(CONFIG_PATH)) {
        console.error('❌ 错误：找不到 OpenClaw 配置文件');
        console.error(`路径：${CONFIG_PATH}`);
        process.exit(1);
    }

    const config = JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));

    // 添加命令配置
    if (!config.commands) {
        config.commands = {};
    }

    if (!config.commands.aliases) {
        config.commands.aliases = {};
    }

    // 添加 agents_monitor 别名
    config.commands.aliases['agents_monitor'] = {
        type: 'exec',
        command: '~/.openclaw/workspace/skills/agent-status-monitor/scripts/check-agents.sh',
        description: '检查本地开发 Agent 运行状态',
        streaming: false
    };

    // 写回配置
    writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + '\n', 'utf-8');

    console.log('✅ 安装完成！\n');
    console.log('现在可以在 Telegram 中使用：');
    console.log('  /agents_monitor - 检查 Agent 状态\n');
    console.log('⚠️  请重启 OpenClaw Gateway 使配置生效：');
    console.log('  openclaw gateway restart\n');

} catch (error) {
    console.error('❌ 安装失败:', error.message);
    process.exit(1);
}


path: telegram-commands/agents_monitor.plugin.json
content: {
  "id": "agents-monitor-telegram",
  "name": "Agents Monitor Telegram Commands",
  "version": "1.0.0",
  "description": "Add /agents_monitor command to Telegram bot for checking local AI agent status",
  "author": "Willin Wang",
  "license": "MIT",
  "main": "index.js",
  "engines": {
    "openclaw": ">=2026.3.0"
  },
  "triggers": {
    "commands": [
      {
        "command": "agents_monitor",
        "description": "检查本地开发 Agent（Claude Code、OpenCode 等）的运行状态",
        "scope": "all"
      }
    ]
  }
}


path: references/agent-commands.md
content: # Agent Commands Reference

各开发工具 Agent 的状态检查命令参考。

---

## Claude Code

### 进程检查
```bash
ps aux | grep -i "claude" | grep -v grep
```

### 会话目录
```bash
# macOS/Linux
~/.claude/sessions/

# 查看最近会话
ls -lt ~/.claude/sessions/*.json | head -5
```

### 日志
```bash
# 查看日志目录
~/.claude/logs/
```

---

## OpenClaw

### 状态命令
```bash
openclaw status
openclaw status --all
openclaw sessions list
```

### 进程检查
```bash
ps aux | grep -i "openclaw" | grep -v grep
```

### 会话目录
```bash
~/.openclaw/agents/main/sessions/
```

### 日志
```bash
openclaw logs --follow
openclaw logs --tail 50
```

### Dashboard
```
http://127.0.0.1:18789
```

---

## OpenCode

### 安装位置
```bash
~/.opencode/
~/.opencode/bin/opencode
```

### 版本检查
```bash
~/.opencode/bin/opencode --version
```

### 配置目录
```bash
~/.config/opencode/opencode.json
~/.local/state/opencode/      # 会话状态
~/.local/share/opencode/      # 数据
```

### 进程检查
```bash
ps aux | grep -i "opencode" | grep -v grep
```

### 会话日志
```bash
# 查看 prompt 历史
cat ~/.local/state/opencode/prompt-history.jsonl
```

---

## Cursor

### 进程检查
```bash
ps aux | grep -i "cursor" | grep -v grep
```

### 项目历史
```bash
# Cursor 通常存储在项目本地
.cursor/
```

---

## Windsurf

### 进程检查
```bash
ps aux | grep -i "windsurf" | grep -v grep
```

---

## 通用命令

### 所有 Node.js 进程
```bash
ps aux | grep node | grep -v grep
```

### 占用端口的进程
```bash
# 查看常用 AI 工具端口
lsof -i :18789  # OpenClaw
lsof -i :8080   # 常见开发服务器
```

### 最近修改的文件
```bash
# 查找最近 1 小时内修改的日志/会话文件
find ~ -name "*.log" -o -name "sessions.json" -mmin -60 2>/dev/null
```


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