Agent Skills › ongridio/ongrid

ongridio/ongrid

GitHub

设备文件系统排查工具,支持批量查找大文件、目录占用统计及文件详情查询。强调一次传入多个路径以优化效率,禁止写入操作及单路径重复调用,适用于磁盘空间分析与故障定位。

3 个 Skill 353

安装全部 Skills

npx skills add ongridio/ongrid --all -g -y
更多选项

预览集合内 Skills

npx skills add ongridio/ongrid --list

集合内 Skills (3)

设备文件系统排查工具,支持批量查找大文件、目录占用统计及文件详情查询。强调一次传入多个路径以优化效率,禁止写入操作及单路径重复调用,适用于磁盘空间分析与故障定位。
磁盘空间不足排查 查找设备上的大文件 分析目录占用情况 查询特定文件的元数据
skills/host-files/SKILL.md
npx skills add ongridio/ongrid --skill host_files -g -y
SKILL.md
Frontmatter
{
    "name": "host_files",
    "metadata": {
        "os": [
            "linux",
            "darwin"
        ],
        "ongrid": {
            "scope": "edge",
            "activation": {
                "mode": "keyword",
                "keywords": [
                    "文件",
                    "目录",
                    "磁盘",
                    "file",
                    "disk",
                    "du",
                    "size",
                    "大文件",
                    "占用"
                ]
            },
            "edge_runtime": "subprocess",
            "edge_capabilities": [
                {
                    "filesystem.read.deny": [
                        "\/proc",
                        "\/sys",
                        "\/dev",
                        "\/run",
                        "\/etc\/shadow",
                        "\/etc\/sudoers",
                        "\/root\/.ssh",
                        "\/root\/.gnupg"
                    ]
                },
                {
                    "process.exec": [
                        "find",
                        "du",
                        "stat",
                        "ls"
                    ]
                }
            ],
            "min_ongrid_version": ">=0.7.30"
        },
        "requires": {
            "bins": [
                "find",
                "du",
                "stat"
            ]
        }
    },
    "description": "设备文件系统排查工具组 — 找大文件、看目录占用、stat 单文件(一次最多 16 个 path 批量查询)",
    "when_to_use": "当用户问这些时调用本组工具:\n  • \"找大文件\" \/ \"哪些文件最大\" \/ \"top N 大文件\"\n  • \"磁盘占用 \/ 哪个目录在涨 \/ du\"\n  • \"看一下 \/var\/xxx 这个目录 \/ 这个文件 size\"\n  • \"为什么磁盘满了\"\n\n明确不要用于:\n  • 查日志内容 → 用 query_logql\n  • 查 metric \/ Prom 看磁盘用率 → 用 query_promql(拿宏观数;具体哪些文件用 host_files)\n  • 查进程在写哪些 fd → 用 get_host_processes(看 IO 列)\n\n常见组合:先用 query_promql 看 disk_used_pct 趋势 → 拿到设备 ID 后用 host_du_summary 下钻\n"
}

[能力: host_files]

本组工具帮你看 设备文件系统的具体内容:哪些文件大、哪些目录在涨、单个文件的 size / mtime / mode / owner。

批量协议:每个工具的 paths 都是 数组(1..16 条)。一定一次给多个相关 path —— 单 path 多次调用是反模式,浪费 LLM 轮次。返回 results: [{path, ...data, error?}]paths 同序,per-path 失败不影响其他成功项(partial success)。还会顺手返回 success_count / error_count 让你一眼看出整体情况。

调用规则

找最大的 N 个文件(一次多个起点)

host_find_large_files(
  device_id=<num>,
  paths=["/var/log", "/var/cache", "/opt"],   # 一次 3 个候选大目录
  top_n=10,
)
  • paths 必填,1..16 条,优先一次问 3..8 个
  • top_n 默认 20,按 size 降序,每条带 path / size_bytes / size_human / mtime / owner
  • 默认排除 /proc /sys /dev /run(虚拟文件系统)
  • 返回 results[i] = {path, scanned_path, files[], error?} 与 paths 同序

看哪些目录在涨(一次多个根)

host_du_summary(
  device_id=<num>,
  paths=["/", "/var", "/var/log", "/opt", "/home", "/tmp"],   # 一次 6 个常见路径
  depth=1,
)
  • depth 默认 1:每个 path 只看一层子目录,下钻一次问一层
  • 不要一上来 depth=10 —— 慢且 LLM 看不过来
  • 返回 results[i] = {path, subpaths[], total_size_bytes, total_size_human, error?}

stat 多个具体文件 / 目录

host_stat_file(
  device_id=<num>,
  paths=["/var/log/messages", "/var/log/syslog", "/var/cache/apt/archives"],
)
  • 单点查询,最便宜,一次给一组相关 path
  • 返回 results[i] = {path, type, size_bytes, size_human, mtime, atime, mode, owner, group, error?}
  • type ∈ {file, dir, symlink}

协作范式

用户问"磁盘满了排查一下" —— 推荐流程(注意每步都用 batch):

  1. query_promqlnode_filesystem_used_bytes / node_filesystem_size_bytes 趋势,确认设备 + 挂载点
  2. 拿到 device_id 后 一次 host_du_summary(device_id, paths=["/", "/var", "/opt", "/home", "/tmp"], depth=1) 找全局占用 top
  3. 看到 /var 占大头 → 一次 host_du_summary(device_id, paths=["/var/log", "/var/cache", "/var/lib"], depth=1) 下钻
  4. 看到 /var/log 占满 → host_find_large_files(device_id, paths=["/var/log"], top_n=10) 找具体文件
  5. 输出给用户:分层下钻路径 + 最终文件列表 + 建议(清理 / 轮转 / 扩容)

用户问"node-01 上有哪些大文件" —— 一步 batch:

host_find_large_files(device_id=1, paths=["/", "/var", "/opt", "/home"], top_n=20)

直接拿到 4 个根的对比,简短回答。

反模式(不要做)

  • 不要单 path 多次调用 —— 这是 #1 反模式:
    ✗ host_du_summary(device_id, paths=["/"])
    ✗ host_du_summary(device_id, paths=["/var"])
    ✗ host_du_summary(device_id, paths=["/opt"])
    ✗ host_du_summary(device_id, paths=["/home"])
    
    上面 4 轮浪费 4 倍 token,应该并成一次:
    ✓ host_du_summary(device_id, paths=["/", "/var", "/opt", "/home"])
    
  • 不要写文件 / 删文件 —— 本组都是 read class,没有写权限工具
  • 不要假设 path 存在 —— 直接放进 paths,失败的会进 results[i].error,不影响其他成功项
  • 不要在敏感路径调用(/proc /sys /dev /run /etc/shadow /root/.ssh /home/<user>/.ssh /root/.gnupg 等)—— 这些命中沙箱 deny prefix,仅这条 path 进 error,其他正常返回
  • 不要在 /proc /sysdu —— 永远跑不完(虽然沙箱已经拒,这条提醒 LLM 别尝试)
  • 不要超 16 个 path —— maxItems=16 是 hard limit,超过工具会拒绝整批

看到 results 含 error 项怎么办

  • success_count / error_count 摘要先判断整体
  • 失败项的 path + error 字符串会告诉你原因(sandbox / 找不到 / find 错误等)
  • 不要重试同一条失败 path —— sandbox reject 一定是配置问题,找不到的文件再问也是找不到
  • 直接基于成功项的数据答复,附带说明哪些 path 没拿到 + 原因
在沙箱环境中执行只读Shell命令进行设备诊断,支持文件、系统、网络及OVS等状态查询。严格限制写操作,适用于CPU、内存、日志等探索性排查任务。
查询进程资源占用情况 查看系统或网络状态 读取服务日志或配置信息 诊断网络连通性或端口状态
skills/bash/SKILL.md
npx skills add ongridio/ongrid --skill host_bash -g -y
SKILL.md
Frontmatter
{
    "name": "host_bash",
    "metadata": {
        "os": [
            "linux"
        ],
        "ongrid": {
            "scope": "edge",
            "activation": {
                "mode": "always"
            },
            "edge_runtime": "subprocess",
            "edge_capabilities": [
                {
                    "process.exec": [
                        "cat",
                        "head",
                        "tail",
                        "tac",
                        "less",
                        "ls",
                        "find",
                        "du",
                        "stat",
                        "readlink",
                        "file",
                        "tree",
                        "wc",
                        "grep",
                        "egrep",
                        "fgrep",
                        "awk",
                        "sed",
                        "ps",
                        "top",
                        "uptime",
                        "free",
                        "df",
                        "iostat",
                        "vmstat",
                        "mpstat",
                        "pidstat",
                        "lsof",
                        "ss",
                        "netstat",
                        "dmesg",
                        "who",
                        "w",
                        "uname",
                        "id",
                        "groups",
                        "hostname",
                        "date",
                        "journalctl",
                        "iptables",
                        "ip6tables",
                        "tc",
                        "systemctl",
                        "ip",
                        "mount",
                        "crontab",
                        "nc",
                        "curl",
                        "wget",
                        "dig",
                        "host",
                        "nslookup",
                        "ping",
                        "traceroute",
                        "ovs-vsctl",
                        "ovs-ofctl",
                        "ovs-dpctl",
                        "ovs-appctl",
                        "nft",
                        "conntrack",
                        "ipset",
                        "ethtool",
                        "bpftool"
                    ]
                }
            ],
            "min_ongrid_version": ">=0.7.30"
        },
        "requires": {
            "bins": [
                "ps",
                "grep",
                "awk",
                "sed",
                "find",
                "du",
                "stat",
                "ls",
                "cat",
                "head",
                "tail",
                "wc",
                "sort",
                "uniq"
            ]
        }
    },
    "description": "设备上跑只读 shell 命令做诊断探索(沙箱化 \/ read-only policy)",
    "when_to_use": "当结构化工具(host_load \/ host_processes \/ host_find_large_files \/ query_logql \/ query_promql)\n不够用、需要灵活的 shell 一行 \/ pipe 时使用。**只读**:写操作(rm \/ mv \/ chmod \/ systemctl restart 等)\n会被边端 cmdpolicy 沙箱拒掉。\n\n典型场景:\n  • 复杂条件的 ps \/ grep \/ awk \/ sed pipe(\"找 cpu top 10 + 名字含 nginx 的\")\n  • iptables -L \/ ip addr \/ tc qdisc show \/ mount 等只读运维查询\n  • systemctl status \/ cat \/ list-units \/ is-active(不能 restart \/ stop)\n  • journalctl \/ dmesg 配合 grep \/ awk 做日志快速定位\n  • find \/ du \/ stat 配合 sort \/ head 做文件系统下钻\n  • 网络探测 nc -z \/ curl --head \/ dig \/ ping(host 在 operator allowlist 内)\n\n明确不要用于:\n  • 重启服务 → 用 host_restart_service(mutating,走 reviewer)\n  • 改文件 \/ 改配置 → 不支持(也不应让 LLM 自主改)\n  • 简单单一动作 → 用结构化工具更省 token:\n    - 看 cpu\/mem 用 get_host_load\n    - 看进程列表用 get_host_processes\n    - 找大文件用 host_find_large_files\n    - 看磁盘占用用 host_du_summary\n\n**被沙箱拒绝时(response.allowed=false)读 reason,按提示改命令重试**。\n常见拒绝:sed -i \/ find -delete \/ shell 嵌套 ($()\/`) \/ redirect (> >>) \/\nsystemctl restart \/ 任何 ClassDenied 二进制(rm \/ bash \/ python \/ ...)。\n"
}

[能力: host_bash]

本工具在目标设备上运行单条 shell 命令或 pipe 管道,由边端 internal/edgeagent/cmdpolicy 沙箱 做策略校验。v1 是 read-only policy,写操作一律被拒。

调用规则

host_bash(device_id=<num>, cmd="<command>")
  • device_id 必填:与 @-mention chip 和 Prom device_id label 一致
  • cmd 必填:单条命令或单层 pipe;不支持 ; && || $() <() > >> 反引号 / heredoc
  • timeout_seconds 可选:默认 30s,最大 300s

允许的命令分类

分类 示例 binary 备注
文件系统读 ls / cat / head / tail / find / du / stat / grep / awk / sed / wc sed -i / find -delete / awk system() 拒
系统状态读 ps / df / free / uptime / iostat / vmstat / lsof / ss / netstat / dmesg / journalctl journalctl --rotate / --vacuum-* 拒
网络配置读 iptables -L / ip addr / tc qdisc show / mount -l / crontab -l iptables -A / ip addr add / mount /a /b 拒
OVS 探测 ovs-vsctl show / list-br / get / find / list;ovs-ofctl dump-flows / dump-ports / show;ovs-dpctl show;ovs-appctl fdb/show / lacp/show 等 add-br / del-br / set / add-flow / del-flows 全拒
nftables / conntrack nft list ruleset / list table;conntrack -L / -S / -G / -E;ipset list;ethtool -i <iface> nft add/delete/flush;conntrack -F / -D;ethtool -K/-G/-s 全拒
eBPF 只读 bpftool prog show / map dump / btf dump / net show / link show / iter list / feature probe bpftool prog load / attach;map create / update 全拒(要写 BPF 走 Layer-3 preset)
网络命名空间 ip netns list / identify / pids;ip netns(裸= list) ip netns exec / add / del 拒(exec 会重入沙箱)。深入 inspect 走 host_netns_inspect skill(未上)
服务状态读 systemctl status / cat / list-units / is-active systemctl restart / stop / start 拒(用 host_restart_service)
网络探测 nc -z / curl --head / dig / host / ping / traceroute curl -o / wget / nc -e/-l 拒;目标 host 须在 operator allowlist 内

推荐套路(诊断 / 探索)

问"哪个进程吃 cpu"

host_bash(device_id=N, cmd="ps aux --sort=-%cpu | head -10")

问"nginx 最近一小时报错了哪些"

host_bash(device_id=N, cmd="journalctl -u nginx --since '1 hour ago' | grep -i error | head -50")

问"看下 /var 哪些子目录占用最大"(也可以用 host_du_summary):

host_bash(device_id=N, cmd="du -sh /var/* | sort -rh | head -10")

问"iptables 当前规则"

host_bash(device_id=N, cmd="iptables -L -n")

问"哪个端口开着"

host_bash(device_id=N, cmd="ss -tlnp")

不要做的事

  • 不要尝试 redirect 写文件(> /tmp/x)—— 沙箱拒
  • 不要尝试用 bash -c 套子壳 —— bash / sh / zsh / dash 整个 ClassDenied
  • 不要尝试 sed -i —— 用 sed 看就行,改文件不在本工具职责
  • 不要尝试 systemctl restart —— 用 host_restart_service skill(带 reviewer 二审)
  • 被拒后不要重试同一条命令 —— 读 response.reason,调整命令再发
  • 不要用本工具替代结构化查询 —— 简单 cpu/mem/进程查询用 get_host_load / get_host_processes

v1 实现说明

  • Policy = cmdpolicy.DefaultReadOnly(),operator 可在 /etc/ongrid-edge/bash-policy.yaml 扩展或收紧(替换某个 binary 的 matchers / 缩短 path allowlist / 改 timeout / 加 network allowlist)
  • 网络出站默认全拒(network_host_allowlist=[]),operator 显式添加 CIDR 或 hostname suffix 才放行
  • Path allowlist 默认 /var /opt /home /tmp /srv /data(与 host_files 共享同一份)
  • stdout cap 64 KiB / stderr cap 16 KiB / 默认 timeout 30s / 单段 argv ≤32
用于重启白名单内的systemd服务,属变更操作需经审核。强制校验设备ID、服务名及原因,支持nginx等8种服务。拦截器自动触发二审流程,拒绝后不重试并转告用户,一期为mock实现以跑通流程。
用户明确要求重启特定服务 需要执行受控的服务重启操作
skills/restart-service/SKILL.md
npx skills add ongridio/ongrid --skill host_restart_service -g -y
SKILL.md
Frontmatter
{
    "name": "host_restart_service",
    "metadata": {
        "os": [
            "linux"
        ],
        "ongrid": {
            "scope": "edge",
            "activation": {
                "mode": "keyword",
                "keywords": [
                    "重启",
                    "重起",
                    "restart",
                    "systemctl"
                ]
            },
            "edge_runtime": "subprocess",
            "edge_capabilities": [
                {
                    "process.exec": [
                        "systemctl"
                    ]
                }
            ],
            "min_ongrid_version": ">=0.7.30"
        },
        "requires": {
            "bins": [
                "systemctl"
            ]
        }
    },
    "description": "重启允许列表内的 systemd service(mutating,触发 reviewer 二审)",
    "when_to_use": "用户**明确**要求重启某个允许列表内的服务时使用。\n\n**本工具是 mutating,会触发 reviewer 二审(agents\/reviewer.md),等待 approve 后才执行**。\n调用前 reviewer 会去查 SOP \/ 设备状态 \/ 并行操作,任一不满足即 reject — 你(coordinator)\n收到 reject 时**直接告知用户原因,不要重试**。\n\n不要主动建议重启 — 让用户先要求。常见的\"我猜重启就好了\"是诊断不深入的信号,\n应该先用 query_logql \/ query_promql \/ get_edge_summary 把根因摸清楚再让用户决定。\n\n允许列表(白名单):nginx \/ redis \/ prometheus \/ loki \/ tempo \/ grafana \/ mysql \/ ongrid\n其他 service 直接拒绝(也不走 reviewer)。\n"
}

[能力: host_restart_service]

本工具重启目标设备上的 systemd 服务。属于 mutating class,调用前自动经过 reviewer 二审:

调用规则

host_restart_service(device_id=<num>, service="nginx", reason="...")
  • device_id 必填:与 @-mention chip 和 Prom device_id label 一致
  • service 必填:systemd 短名(不带 .service 后缀)
  • reason 强烈建议填:写入审计行,事后复盘看得到为什么重启的

白名单

调用前自动检查 service ∈ 下列之一:

  • nginx / redis / prometheus / loki / tempo / grafana / mysql / ongrid

其他 service 直接拒绝(不走 reviewer,省一次 LLM 调用)。

二审流程(HLD-003 SOP)

你 (coordinator) 发出 host_restart_service tool_call
      ↓
ReviewGate 装饰器拦截
      ↓ class="write"|"destructive"
      ↓ spawn reviewer worker (agents/reviewer.md)
      ↓ 等 reviewer 输出 "Decision: approve" 或 "Decision: reject"
      ↓
approve → 真正调用边端 systemctl restart
reject  → 返回 reject 理由给你,**不要重试,转告用户**

reviewer 自己会用 get_edge_summary / query_logql / get_incident_detail 看 SOP / 并行操作 / 上次 mutating 时间 / 关联告警再决议;你不需要重复这些查询。

不要做的事

  • 不要在用户没明说"重启 X"时调用 — 主动建议重启是反模式
  • 不要 reject 后立刻重试 — reviewer 已经给了理由,转告用户让他决定
  • 不要试图绕过白名单 — 边端会再校验一次,绕不过
  • 不要传 reason="" — 审计行会一片空白,post-mortem 会骂

一期实现 (PR-7)

  • 边端 handler 是 mockMocked: true),不会真跑 systemctl restart
  • 真实 shell-out 留 follow-up;本期目标是把 reviewer 二审端到端跑通

首页 - Wiki
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-07-14 12:23
浙ICP备14020137号-1 $访客地图$