Agent Skills
› espressif/esp-claw
› cap_router_mgr
cap_router_mgr
GitHub用于管理事件路由器自动化规则,支持通过API进行规则的增删改查及重载。
Trigger Scenarios
需要列出或检查路由规则
需要新增、更新或删除路由规则
需要重载路由配置
Install
npx skills add espressif/esp-claw --skill cap_router_mgr -g -y
SKILL.md
Frontmatter
{
"name": "cap_router_mgr",
"metadata": {
"cap_groups": [
"cap_router_mgr"
],
"manage_mode": "readonly"
},
"description": "Manage router automation rules: list\/get\/add\/update\/delete\/reload with strict rule_json format."
}
Router Rule Management
Use this skill to inspect and modify event router rules through the direct callable capabilities in cap_router_mgr.
When to use
- The task is to list, inspect, add, update, delete, or reload router rules.
- The task is to change router behavior by capability calls, not by editing rule files directly.
- The task requires deciding between
add_router_ruleandupdate_router_rulefor one rule id.
Operating rules
- Use direct router manager capabilities, not console wrappers.
- Prefer changing exactly one rule per turn.
- Treat
rule_jsonas a JSON string, not an embedded object. - After
add_router_ruleorupdate_router_rule, always callget_router_rule. - Use
reload_router_rulesonly when the task explicitly requires disk reload semantics.
Capability contract
list_router_rulesInput:{}Output: JSON array of rule objects.get_router_ruleInput:{"id":"rule_id"}Output: one rule object, or standard error JSON withok=false.add_router_ruleInput:{"rule_json":"{\"id\":\"rule_id\",\"match\":{\"event_type\":\"message\"},\"actions\":[{\"type\":\"drop\"}]}"}. Output:{"action":"add_router_rule","ok":true,"id":"rule_id"}. If the error saysrule id already exists; use update_router_rule, switch toupdate_router_rule.update_router_ruleInput: same shape asadd_router_rule. Output:{"action":"update_router_rule","ok":true,"id":"rule_id"}. If the error saysrule id not found; use add_router_rule, switch toadd_router_rule.delete_router_ruleInput:{"id":"rule_id"}Output:{"action":"delete_router_rule","ok":true,"id":"rule_id"}reload_router_rulesInput:{}Output:{"action":"reload_router_rules","ok":true}
Standard workflow
- Call
list_router_rules. - Check whether the target
idalready exists. - Build one complete replacement rule object.
- Call
add_router_rulefor a new id orupdate_router_rulefor an existing id. - Call
get_router_ruleand verify the stored shape.
Rule contract
- Required fields in decoded
rule_json:idmatchactionsmatch.event_type
- Common optional rule fields:
descriptionenabledconsume_on_matchackvars
- Supported
matchfields:event_typeevent_keysource_capsource_channelchat_idcontent_typetexttext_match_rule
Match semantics
match.event_typeis required; all other match fields are optional exact-match filters.match.textusestext_match_rule="exact"by default. Settext_match_rule="prefix"to match a leading command token, for example/run args.- Prefix text matching trims leading whitespace from the event text, requires a token boundary after
match.text, rejects embedded prose such asplease /run args, and exposes the post-prefix argument string as{{match.remainder}}. event_type,event_key,source_cap, andsource_channelvalues are not fixed enums in this skill; they must match values emitted elsewhere in the system.- Use
match.source_channelas the canonical rule field. The runtime also acceptschannelas an alias. - To run a script after device boot, match the startup trigger emitted by
app_claw:source_cap=app_claw,event_type=startup,event_key=boot_completed, andcontent_type=trigger.
Actions
- Supported
type:call_caprun_agentrun_scriptsend_messageemit_eventdrop
- Optional action-level fields:
caller:system|agent|consolecapture_outputfail_open
- Requirements and defaults:
call_cap: requirescapandinput.run_agent:inputoptional; defaults to{}.textfalls back to event text.target_channelandtarget_chat_idfall back to the current event route.run_script: requiresinput; common fields arepath,args,async.send_message: requiresinput; common fields arechannel,chat_id,message. Missingchannelfalls back to target/source channel. Missingchat_idfalls back to target endpoint/event chat id. Missingmessagefalls back to previous action output.emit_event: requiresinput; common fields areevent_type,source_cap,source_channel,chat_id,message_id,content_type,text,payload_json,session_policy. Defaults:source_cap=claw_event_router,event_type=trigger,content_type=trigger,payload_json={}, invalid or missingsession_policy=trigger.drop: no special input.
Template context
- Action inputs are rendered against the current event context before execution.
- Common fields:
{{event.event_type}}{{event.event_key}}{{event.source_cap}}{{event.channel}}{{event.source_channel}}{{event.target_channel}}{{event.chat_id}}{{event.message_id}}{{event.content_type}}{{event.session_policy}}{{event.text}}
- Matched text fields are available when
match.textmatched:{{match.text}}{{match.rule}}{{match.remainder}}
- Parsed payload fields are available under
event.payload, for example{{event.payload.kind}}.
Decision policy
- If creating a new rule and the id already exists, do not call
add_router_rule. - If modifying an existing rule, inspect it first and preserve fields not meant to change.
- If it is unclear whether to create or replace, inspect first with
list_router_rulesorget_router_rule. - Do not use
reload_router_rulesas a substitute for add or update.
Common failure causes
- Putting
event_typeat the rule top level instead ofmatch.event_type. - Passing
rule_jsonas an object instead of a string. - Omitting
idoractions, or using an emptyactionsarray. - Using an unsupported action
type. - Mixing
match.source_channelwith action inputchannel. - Using a relative path for
run_script; use an absolute.luapath such as/fatfs/skills/.../scripts/action.lua.
Canonical examples
Run Lua script after boot
{
"rule_json": "{\"id\":\"startup_run_lua_script\",\"description\":\"Run a Lua script once the device finishes booting.\",\"enabled\":true,\"consume_on_match\":false,\"ack\":\"startup Lua script executed\",\"match\":{\"source_cap\":\"app_claw\",\"event_type\":\"startup\",\"event_key\":\"boot_completed\",\"content_type\":\"trigger\"},\"actions\":[{\"type\":\"run_script\",\"input\":{\"path\":\"/absolute/path/to/your_script.lua\",\"args\":{}}}]}"
}
New session on /new
{
"rule_json": "{\"id\":\"im_new_session\",\"enabled\":true,\"consume_on_match\":true,\"match\":{\"event_type\":\"message\",\"event_key\":\"text\",\"content_type\":\"text\",\"text\":\"/new\"},\"actions\":[{\"type\":\"call_cap\",\"cap\":\"new_chat_session\",\"input\":{}},{\"type\":\"send_message\",\"input\":{\"channel\":\"{{event.source_channel}}\",\"chat_id\":\"{{event.chat_id}}\",\"message\":\"Started a new session.\"}}]}"
}
Prefix command with arguments
{
"rule_json": "{\"id\":\"im_run_script_command\",\"enabled\":true,\"consume_on_match\":true,\"match\":{\"event_type\":\"message\",\"event_key\":\"text\",\"content_type\":\"text\",\"text\":\"/run\",\"text_match_rule\":\"prefix\"},\"actions\":[{\"type\":\"run_script\",\"input\":{\"path\":\"/absolute/path/to/your_script.lua\",\"args\":{\"command\":\"{{match.remainder}}\"}}}]}"
}
Route IM text to agent
{
"rule_json": "{\"id\":\"im_any_message_agent\",\"enabled\":true,\"consume_on_match\":true,\"match\":{\"event_type\":\"message\",\"event_key\":\"text\",\"content_type\":\"text\"},\"actions\":[{\"type\":\"run_agent\",\"input\":{\"target_channel\":\"{{event.source_channel}}\",\"session_policy\":\"chat\"}}]}"
}
Version History
- 06eb576 Current 2026-07-24 19:54


