[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CX6HZBRMVR2WZMWDRVWNWF":3,"skill-same:01M6CX6HZBRMVR2WZMWDRVWNWF":98},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":13,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":51,"install":52,"resources":65},"01M6CX6HZBRMVR2WZMWDRVWNWF","ops-framework",null,"A 0-token jobs + monitoring framework for OpenClaw: run long-running read tasks via scripts, checkpoint\u002Fresume safely, and send periodic progress + immediate alerts to Telegram. Write jobs are blocked by default and must be explicitly approved and verified.","vuxsoul-ui\u002Fcatclash","vuxsoul-ui","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F260295169?v=4","01M6CX4C32A80AMGCHAJSB3T1D","01M6CX4C812ZR0H69AJY65C73Q",0,"MIT","https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui\u002Fcatclash\u002Fblob\u002Fmain\u002Fskills\u002Fops-framework\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"ops framework","framework","ops","json","alerts","message","back","default","telegram","resume","periodic","bot","checkpoint","api","monitoring","gateway","run","tasks","http","python","2026-11-10 10:12:30",false,"---\nname: ops-framework\ndescription: >-\n  A 0-token jobs + monitoring framework for OpenClaw: run long-running read tasks\n  via scripts, checkpoint\u002Fresume safely, and send periodic progress + immediate\n  alerts to Telegram. Write jobs are blocked by default and must be explicitly\n  approved and verified.\nversion: 0.1.0\nauthor: Zjianru\nlicense: MIT\ncompatibility: >-\n  Requires Python 3.10+ on the gateway host. Uses `openclaw message send` when\n  available; otherwise falls back to Telegram HTTP API using the bot token in\n  `openclaw.json`.\n---\n\n# Ops Framework（Jobs + Ops Monitor）— OpenClaw Skill (MVP)\n\n目标：把“长任务执行 \u002F 断点续跑 \u002F 进度汇报 \u002F 异常告警”做成 **0-token** 的可复用能力。\n\n这套技能由两部分组成：\n\n- `ops-monitor.py`：一个纯本地脚本，负责跑 status \u002F 检测卡住 \u002F 发送 Telegram 快报\n- `ops-jobs.json`：一个声明式 job 配置（包含 kind\u002Frisk\u002F命令\u002F策略）\n\n> 推荐作为“外挂”存在：长任务尽量用脚本跑，避免让模型持续盯进度烧 token。\n\n## What this solves\n\n- **Long-running read jobs**: scans, inventories, large syncs, periodic polling; support pause\u002Fresume and stall detection.\n- **One-shot read jobs**: health checks or lint-like checks; only report when they emit `ACTION REQUIRED` \u002F `ALERT` or fail.\n- **One-shot write jobs**: **blocked by default**; must be explicitly approved and must chain to a read-only verification job.\n\n## Quickstart (local)\n\n1) Copy files to your OpenClaw host (suggested layout):\n\n- `~\u002F.openclaw\u002Fnet\u002Ftools\u002Fops-monitor.py`\n- `~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json`\n- `~\u002F.openclaw\u002Fnet\u002Fstate\u002Fops-monitor.json` (auto-created)\n\nYou can also run the script from any directory as long as `OPENCLAW_HOME` points to your OpenClaw state dir (default `~\u002F.openclaw`).\n\n2) Start from the example config:\n\n- `ops-jobs.example.json`\n\n3) Validate:\n\n```bash\npython3 ops-monitor.py validate-config --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\npython3 ops-monitor.py selftest\n```\n\n4) Run one monitoring tick (prints only; does not send):\n\n```bash\npython3 ops-monitor.py tick --print-only\n```\n\n5) Run periodic ticks via your OS scheduler (launchd\u002Fsystemd\u002Fcron). The script is designed to be called frequently; it decides whether to report based on policy and state.\n\n## Job kinds and safety\n\n`kind` is one of:\n\n- `long_running_read`\n- `one_shot_read`\n- `one_shot_write` (**never auto-executed by ops-monitor**)\n\n`risk` is one of:\n\n- `read_only`\n- `write_local`\n- `write_external`\n\nRules (MVP):\n\n- `long_running_read` may auto-resume **only** when `risk=read_only` and `policy.autoResume=true`.\n- `one_shot_read` may run explicitly or via queue (read-only only).\n- `one_shot_write` is always blocked from auto-run; it exists as a declarative “approval + verification chain” placeholder.\n\n## Status contract (for long_running_read)\n\nYour `commands.status` must print **JSON** to stdout, with at least:\n\n- `running` (boolean)\n- `completed` (boolean)\n\nRecommended:\n\n- `pid` (number)\n- `stopReason` (string)\n- `progress` (object)\n- `progressKey` (string) — stable key used for stall detection\n- `level` (`ok|warn|alert`)\n- `message` (string)\n\n## Commands\n\n```bash\n# Validate config\npython3 ops-monitor.py validate-config --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\n\n# Print current statuses (no Telegram)\npython3 ops-monitor.py status --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\n\n# One monitoring tick\npython3 ops-monitor.py tick --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\n\n# Explicitly start\u002Fstop a long job\npython3 ops-monitor.py start \u003Cjob_id> --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\npython3 ops-monitor.py stop \u003Cjob_id>  --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\n\n# Run one one_shot_read job explicitly\npython3 ops-monitor.py run \u003Cjob_id> --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\n```\n\n## Reference docs\n\n- Spec (Chinese, detailed): `OPS_FRAMEWORK.md`\n","# Ops Framework（Jobs + Ops Monitor）— OpenClaw Skill (MVP)\n\n目标：把“长任务执行 \u002F 断点续跑 \u002F 进度汇报 \u002F 异常告警”做成 **0-token** 的可复用能力。\n\n这套技能由两部分组成：\n\n- `ops-monitor.py`：一个纯本地脚本，负责跑 status \u002F 检测卡住 \u002F 发送 Telegram 快报\n- `ops-jobs.json`：一个声明式 job 配置（包含 kind\u002Frisk\u002F命令\u002F策略）\n\n> 推荐作为“外挂”存在：长任务尽量用脚本跑，避免让模型持续盯进度烧 token。\n\n## What this solves\n\n- **Long-running read jobs**: scans, inventories, large syncs, periodic polling; support pause\u002Fresume and stall detection.\n- **One-shot read jobs**: health checks or lint-like checks; only report when they emit `ACTION REQUIRED` \u002F `ALERT` or fail.\n- **One-shot write jobs**: **blocked by default**; must be explicitly approved and must chain to a read-only verification job.\n\n## Quickstart (local)\n\n1) Copy files to your OpenClaw host (suggested layout):\n\n- `~\u002F.openclaw\u002Fnet\u002Ftools\u002Fops-monitor.py`\n- `~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json`\n- `~\u002F.openclaw\u002Fnet\u002Fstate\u002Fops-monitor.json` (auto-created)\n\nYou can also run the script from any directory as long as `OPENCLAW_HOME` points to your OpenClaw state dir (default `~\u002F.openclaw`).\n\n2) Start from the example config:\n\n- `ops-jobs.example.json`\n\n3) Validate:\n\n```bash\npython3 ops-monitor.py validate-config --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\npython3 ops-monitor.py selftest\n```\n\n4) Run one monitoring tick (prints only; does not send):\n\n```bash\npython3 ops-monitor.py tick --print-only\n```\n\n5) Run periodic ticks via your OS scheduler (launchd\u002Fsystemd\u002Fcron). The script is designed to be called frequently; it decides whether to report based on policy and state.\n\n## Job kinds and safety\n\n`kind` is one of:\n\n- `long_running_read`\n- `one_shot_read`\n- `one_shot_write` (**never auto-executed by ops-monitor**)\n\n`risk` is one of:\n\n- `read_only`\n- `write_local`\n- `write_external`\n\nRules (MVP):\n\n- `long_running_read` may auto-resume **only** when `risk=read_only` and `policy.autoResume=true`.\n- `one_shot_read` may run explicitly or via queue (read-only only).\n- `one_shot_write` is always blocked from auto-run; it exists as a declarative “approval + verification chain” placeholder.\n\n## Status contract (for long_running_read)\n\nYour `commands.status` must print **JSON** to stdout, with at least:\n\n- `running` (boolean)\n- `completed` (boolean)\n\nRecommended:\n\n- `pid` (number)\n- `stopReason` (string)\n- `progress` (object)\n- `progressKey` (string) — stable key used for stall detection\n- `level` (`ok|warn|alert`)\n- `message` (string)\n\n## Commands\n\n```bash\n# Validate config\npython3 ops-monitor.py validate-config --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\n\n# Print current statuses (no Telegram)\npython3 ops-monitor.py status --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\n\n# One monitoring tick\npython3 ops-monitor.py tick --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\n\n# Explicitly start\u002Fstop a long job\npython3 ops-monitor.py start \u003Cjob_id> --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\npython3 ops-monitor.py stop \u003Cjob_id>  --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\n\n# Run one one_shot_read job explicitly\npython3 ops-monitor.py run \u003Cjob_id> --config-file ~\u002F.openclaw\u002Fnet\u002Fconfig\u002Fops-jobs.json\n```\n\n## Reference docs\n\n- Spec (Chinese, detailed): `OPS_FRAMEWORK.md`\n",{"name":5,"author":43,"license":14,"version":44,"description":7,"compatibility":45},"Zjianru","0.1.0","Requires Python 3.10+ on the gateway host. Uses `openclaw message send` when available; otherwise falls back to Telegram HTTP API using the bot token in `openclaw.json`.","main","db45cdb3399020ff169b8aff970dbd6a284565cc","skills\u002Fops-framework","https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui\u002Fcatclash","https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui","2026-04-05 06:05:12",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add vuxsoul-ui\u002Fcatclash --skill ops-framework",{"tool":58,"command":59},"bunx","bunx skills add vuxsoul-ui\u002Fcatclash --skill ops-framework",{"tool":61,"command":62},"pnpm","pnpm dlx skills add vuxsoul-ui\u002Fcatclash --skill ops-framework","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui\u002Fcatclash\u002Fblob\u002Fmain\u002Fskills\u002Fops-framework\u002FSKILL.md",true,[66,72,76,80,84,90,94],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"_meta.json","REFERENCE","参考文档",132,"https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui\u002Fcatclash\u002Fblob\u002Fmain\u002Fskills\u002Fops-framework\u002F_meta.json",{"path":73,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":74,"sourceHtmlUrl":75},".clawhub\u002Forigin.json",145,"https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui\u002Fcatclash\u002Fblob\u002Fmain\u002Fskills\u002Fops-framework\u002F.clawhub\u002Forigin.json",{"path":77,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":78,"sourceHtmlUrl":79},"OPS_FRAMEWORK.md",10291,"https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui\u002Fcatclash\u002Fblob\u002Fmain\u002Fskills\u002Fops-framework\u002FOPS_FRAMEWORK.md",{"path":81,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":82,"sourceHtmlUrl":83},"ops-jobs.example.json",1692,"https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui\u002Fcatclash\u002Fblob\u002Fmain\u002Fskills\u002Fops-framework\u002Fops-jobs.example.json",{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"ops-monitor.py","SCRIPT","脚本",49876,"https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui\u002Fcatclash\u002Fblob\u002Fmain\u002Fskills\u002Fops-framework\u002Fops-monitor.py",{"path":91,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":92,"sourceHtmlUrl":93},"README.md",695,"https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui\u002Fcatclash\u002Fblob\u002Fmain\u002Fskills\u002Fops-framework\u002FREADME.md",{"path":95,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":96,"sourceHtmlUrl":97},"UPSTREAM.md",1969,"https:\u002F\u002Fgithub.com\u002Fvuxsoul-ui\u002Fcatclash\u002Fblob\u002Fmain\u002Fskills\u002Fops-framework\u002FUPSTREAM.md",[]]