[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C5TN3NWEYDB9DSX92NAMCJ":3,"skill-same:01M6C5TN3NWEYDB9DSX92NAMCJ":50},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":23,"linkOnly":24,"markdownContent":25,"markdownBody":26,"frontMatter":27,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":33,"ownerHtmlUrl":34,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":35,"install":36,"resources":49},"01M6C5TN3NWEYDB9DSX92NAMCJ","automation",null,"ZMGID\u002Fkivio","ZMGID","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F214914950?v=4","01M6C5P2ZSDBWZEWX8S97JBJ11","ZhiMeng","01M6C5P35DMH85NJY5E9AJ7R9Q",585,"GPL-3.0","https:\u002F\u002Fgithub.com\u002FZMGID\u002Fkivio\u002Fblob\u002Fmain\u002Fsrc-tauri\u002Fresources\u002Fskills\u002Fautomation\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5],"2026-11-10 10:12:30",false,"---\nid: automation\nname: automation\ndescription: 创建\u002F编辑\u002F运行 Kivio 自动化工作流（画布上的触发器 + 动作节点：热键、Agent、通知、HTTP、命令、产出 PDF\u002FWord）。Create, edit, and run Kivio automation graphs. Use ONLY when the user explicitly asks for 自动化, 工作流 or a graph of triggers and actions. NOT for 定时任务 \u002F reminders \u002F \"every day at 9 do X\" — those are scheduled tasks: use `schedule action=create`, which sends the prompt into the current conversation. Activate this skill BEFORE calling automation action=upsert — do not probe node types with dry_run.\nrecommended-tools:\n  - automation\n---\n\n# Kivio automations\n\nKivio automations are directed graphs: one trigger, then actions and logic, stored as JSON.\n\n**Not for scheduled tasks.** When the user wants something done on a schedule in this conversation (定时任务, 提醒, \"每天早上帮我…\"), call `schedule action=create` instead. Build an automation only when the user explicitly asks for an automation\u002Fworkflow.\n\n**Do this:** activate this skill, `automation action=list` once, then `automation action=upsert` with a **complete** graph in one call.\n\n**Do not:** glob the repo, invent node type names, or `dry_run` to discover the schema. `dry_run` is only for a finished candidate. This skill is the schema — `automation action=upsert`'s tool description is short on purpose. Validation errors also return `allowedNodeTypes` + `schemaHint`.\n\nChat exposes one native `automation` tool with seven actions. It is an on-demand tool: when it is not in your tool list, read `tool:\u002F\u002Fautomation` for its schema and run it with `write` to `tool:\u002F\u002Fautomation` (`content` = JSON arguments, e.g. `{\"action\":\"list\"}`), or call `automation` directly by name. After creating a graph, tell the user to open `#chat\u002Fautomations\u002F{id}`.\n\n## Tools\n\n1. `automation action=list` — ids, names, enabled, trigger type. **Call this first** to avoid duplicates.\n2. `automation action=get` — full graph for one id.\n3. `automation action=upsert` — create or replace the whole graph in **one** call. Omit `id` to create. Omit node `position` to auto-layout. `dry_run: true` only after you already have a complete graph. Error-severity issues reject the save and return `allowedNodeTypes` + `schemaHint`; fix those and resubmit the whole graph.\n4. `automation action=set_enabled` — start\u002Fstop schedule and hotkey registration (separate from upsert).\n5. `automation action=run` — **blocking**. Optional `input` (string or `{ text, json }`) becomes `{{output}}` \u002F `{{json.input.*}}` for later nodes. Default wait 600s (max 1800). Timeout is not a failure: the run continues; poll with `automation action=runs`.\n6. `automation action=runs` — recent summaries, or one run's per-node details when `run_id` is set.\n7. `automation action=delete` — permanent. Goes through normal approval.\n\nDo **not** call these tools from inside an `action.agent` step. Workflow agents never receive `automation` tools.\n\nAfter creating or changing a graph, tell the user to open `#chat\u002Fautomations\u002F{id}` (Extensions → Automations) to inspect the canvas.\n\n## Graph contract (schema v1)\n\n```json\n{\n  \"schemaVersion\": 1,\n  \"id\": \"\",\n  \"name\": \"Daily briefing\",\n  \"enabled\": false,\n  \"nodes\": [],\n  \"edges\": [],\n  \"viewport\": { \"x\": 0, \"y\": 0, \"zoom\": 1 }\n}\n```\n\n- Exactly one trigger recommended (`trigger.manual` | `trigger.schedule` | `trigger.hotkey`).\n- Main-flow edges: `{ \"id\", \"source\", \"target\" }`. Tree only — no cycles.\n- Agent slot edges (not part of the main flow): `source` is the slot node, `target` is `action.agent`, `sourceHandle`: `\"slot\"`, `targetHandle`: `\"runtime\"` | `\"context\"` | `\"tool\"` | `\"skill\"`.\n- Node ids unique. Positions optional (auto-layout when every node is at `{x:0,y:0}`).\n- `enabled: false` until the user asks to arm schedule\u002Fhotkey. Manual and agent runs still work.\n\n## Interpolation\n\nDownstream templates:\n\n- `{{output}}` — previous node's text. After `automation action=run` with a string input, this is that string at the trigger.\n- `{{json.path}}` — walk the previous JSON. Agent-run input is nested at `json.input`.\n- `{{json.input.topic}}` — a field from `automation action=run` `{ \"input\": { \"json\": { \"topic\": \"...\" } } }`.\n\nNo `$json` expressions, no `$('Node')` cross-references.\n\n## Node types and `data`\n\nEvery node: `{ \"id\", \"type\", \"position\"?, \"data\": { \"label\": \"...\" } }`. Extra fields live under `data`.\n\n### Triggers\n\n**`trigger.manual`** — editor \u002F agent test runs only.\n\n**`trigger.schedule`**\n\n```json\n\"data\": {\n  \"label\": \"Schedule\",\n  \"schedule\": { \"kind\": \"daily\", \"hour\": 9, \"minute\": 0, \"intervalMinutes\": 60 }\n}\n```\n\n`kind`: `daily` | `weekdays` | `interval`. For `interval`, `intervalMinutes` ≥ 1. `hour` 0–23, `minute` 0–59.\n\n**`trigger.hotkey`**\n\n```json\n\"data\": { \"label\": \"Hotkey\", \"hotkey\": { \"accelerator\": \"CommandOrControl+Shift+B\" } }\n```\n\nModifiers: `CommandOrControl`, `Control`, `Alt`, `Shift`, `Super`.\n\n### Actions\n\n**`action.agent`** — unattended model step. Put prompt\u002Fruntime\u002Ftools\u002Fskills on **slot nodes**, not inline.\n\n**`action.notify`** — `{ \"notify\": { \"body\": \"{{output}}\" } }`\n\n**`action.http`** — `{ \"http\": { \"method\": \"GET\", \"url\": \"https:\u002F\u002F…\", \"headers\": \"\", \"body\": \"\" } }`  \n`method`: GET|POST|PUT|PATCH|DELETE. URL required.\n\n**`action.set`** — `{ \"set\": { \"fields\": [{ \"key\": \"text\", \"value\": \"{{output}}\" }] } }`\n\n**`action.clipboard`** — `{ \"clipboard\": { \"op\": \"copy\", \"text\": \"{{output}}\" } }` (`copy` | `read`)\n\n**`action.file`** — `{ \"file\": { \"op\": \"write\", \"path\": \"notes.md\", \"content\": \"{{output}}\" } }` (`read` | `write`; path required)\n\n**`action.command`** — `{ \"command\": { \"command\": \"echo hi\", \"cwd\": \"\", \"timeoutSeconds\": 30, \"continueOnFail\": false } }`\n\n### Logic\n\n**`logic.if`** — `{ \"if\": { \"op\": \"contains\", \"value\": \"ok\" } }`  \n`op`: `contains` | `equals` | `notEmpty`. Outgoing `sourceHandle`: `\"true\"` | `\"false\"`.\n\n**`logic.switch`** — `{ \"switch\": { \"cases\": [{ \"id\": \"1\", \"op\": \"equals\", \"value\": \"a\" }] } }`  \nOutgoing handles: each case `id`, plus `\"default\"`.\n\n**`logic.delay`** — `{ \"delay\": { \"seconds\": 5 } }` (integer ≥ 1)\n\n### Agent slots (plug into `action.agent`)\n\nSlot node `data.agent`:\n\n**`agent.runtime`**\n\n```json\n\"agent\": {\n  \"runtimeKind\": \"builtin\",\n  \"providerId\": \"\",\n  \"model\": \"\",\n  \"externalAgentId\": null,\n  \"externalModel\": null\n}\n```\n\n`runtimeKind`: `builtin` | `chat` | `external`. External needs `externalAgentId` (claude, codex, cursor, …).\n\n**`agent.context`** — `{ \"agent\": { \"prompt\": \"Summarize {{output}} in 5 bullets.\" } }`\n\n**`agent.tool`** — `{ \"agent\": { \"toolIds\": [\"web_search\", \"web_fetch\"] } }`  \nEmpty = read-only tools + skill loader. Never include `automation` or memory tools.\n\n**`agent.skill`** — `{ \"agent\": { \"skillIds\": [\"\u003Cinstalled-skill-id>\"] } }`（只写当前已启用技能的 id）\n\n## Best practices\n\n1. `automation action=list` before create. Reuse an id with upsert to replace.\n2. `dry_run: true` first. Fix every `severity: \"error\"` (`nodeId` + `message`).\n3. Leave `enabled: false` until the user wants the schedule\u002Fhotkey live; then `automation action=set_enabled`.\n4. Only when the user explicitly wants an automation: `trigger.schedule` + `action.agent` + `action.notify` fits “every morning, do X and ping me”. A plain timed prompt is a scheduled task (`schedule action=create`).\n5. For “take this problem and run my workflow”, `automation action=run` with `input`; do not rebuild the graph each time.\n6. After save, tell the user the name, id, and to open the Automations page.\n\n## Example 1 — daily agent briefing\n\n```json\n{\n  \"name\": \"Daily briefing\",\n  \"enabled\": false,\n  \"nodes\": [\n    { \"id\": \"t\", \"type\": \"trigger.schedule\", \"data\": { \"label\": \"09:00\", \"schedule\": { \"kind\": \"daily\", \"hour\": 9, \"minute\": 0, \"intervalMinutes\": 60 } } },\n    { \"id\": \"a\", \"type\": \"action.agent\", \"data\": { \"label\": \"Brief\" } },\n    { \"id\": \"ctx\", \"type\": \"agent.context\", \"data\": { \"label\": \"Prompt\", \"agent\": { \"prompt\": \"Write a short morning briefing from {{output}}.\" } } },\n    { \"id\": \"rt\", \"type\": \"agent.runtime\", \"data\": { \"label\": \"Runtime\", \"agent\": { \"runtimeKind\": \"builtin\" } } },\n    { \"id\": \"n\", \"type\": \"action.notify\", \"data\": { \"label\": \"Notify\", \"notify\": { \"body\": \"{{output}}\" } } }\n  ],\n  \"edges\": [\n    { \"id\": \"e1\", \"source\": \"t\", \"target\": \"a\" },\n    { \"id\": \"e2\", \"source\": \"a\", \"target\": \"n\" },\n    { \"id\": \"er\", \"source\": \"rt\", \"target\": \"a\", \"sourceHandle\": \"slot\", \"targetHandle\": \"runtime\" },\n    { \"id\": \"ec\", \"source\": \"ctx\", \"target\": \"a\", \"sourceHandle\": \"slot\", \"targetHandle\": \"context\" }\n  ]\n}\n```\n\n## Example 2 — run with input\n\nExisting graph: manual trigger → agent (prompt uses `{{output}}`) → notify.\n\n```\nautomation action=run id=\u003Cid> input=\"Draft a reply to this email: …\"\n```\n\nThe trigger text becomes that string; the agent prompt interpolates it.\n\n## Example 3 — HTTP then branch\n\n```json\n{\n  \"name\": \"Health ping\",\n  \"nodes\": [\n    { \"id\": \"t\", \"type\": \"trigger.manual\", \"data\": { \"label\": \"Manual\" } },\n    { \"id\": \"h\", \"type\": \"action.http\", \"data\": { \"label\": \"GET\", \"http\": { \"method\": \"GET\", \"url\": \"https:\u002F\u002Fexample.com\u002Fhealth\", \"headers\": \"\", \"body\": \"\" } } },\n    { \"id\": \"i\", \"type\": \"logic.if\", \"data\": { \"label\": \"OK?\", \"if\": { \"op\": \"contains\", \"value\": \"ok\" } } },\n    { \"id\": \"yes\", \"type\": \"action.notify\", \"data\": { \"label\": \"Up\", \"notify\": { \"body\": \"healthy: {{output}}\" } } },\n    { \"id\": \"no\", \"type\": \"action.notify\", \"data\": { \"label\": \"Down\", \"notify\": { \"body\": \"unhealthy: {{output}}\" } } }\n  ],\n  \"edges\": [\n    { \"id\": \"e1\", \"source\": \"t\", \"target\": \"h\" },\n    { \"id\": \"e2\", \"source\": \"h\", \"target\": \"i\" },\n    { \"id\": \"e3\", \"source\": \"i\", \"target\": \"yes\", \"sourceHandle\": \"true\" },\n    { \"id\": \"e4\", \"source\": \"i\", \"target\": \"no\", \"sourceHandle\": \"false\" }\n  ]\n}\n```\n","# Kivio automations\n\nKivio automations are directed graphs: one trigger, then actions and logic, stored as JSON.\n\n**Not for scheduled tasks.** When the user wants something done on a schedule in this conversation (定时任务, 提醒, \"每天早上帮我…\"), call `schedule action=create` instead. Build an automation only when the user explicitly asks for an automation\u002Fworkflow.\n\n**Do this:** activate this skill, `automation action=list` once, then `automation action=upsert` with a **complete** graph in one call.\n\n**Do not:** glob the repo, invent node type names, or `dry_run` to discover the schema. `dry_run` is only for a finished candidate. This skill is the schema — `automation action=upsert`'s tool description is short on purpose. Validation errors also return `allowedNodeTypes` + `schemaHint`.\n\nChat exposes one native `automation` tool with seven actions. It is an on-demand tool: when it is not in your tool list, read `tool:\u002F\u002Fautomation` for its schema and run it with `write` to `tool:\u002F\u002Fautomation` (`content` = JSON arguments, e.g. `{\"action\":\"list\"}`), or call `automation` directly by name. After creating a graph, tell the user to open `#chat\u002Fautomations\u002F{id}`.\n\n## Tools\n\n1. `automation action=list` — ids, names, enabled, trigger type. **Call this first** to avoid duplicates.\n2. `automation action=get` — full graph for one id.\n3. `automation action=upsert` — create or replace the whole graph in **one** call. Omit `id` to create. Omit node `position` to auto-layout. `dry_run: true` only after you already have a complete graph. Error-severity issues reject the save and return `allowedNodeTypes` + `schemaHint`; fix those and resubmit the whole graph.\n4. `automation action=set_enabled` — start\u002Fstop schedule and hotkey registration (separate from upsert).\n5. `automation action=run` — **blocking**. Optional `input` (string or `{ text, json }`) becomes `{{output}}` \u002F `{{json.input.*}}` for later nodes. Default wait 600s (max 1800). Timeout is not a failure: the run continues; poll with `automation action=runs`.\n6. `automation action=runs` — recent summaries, or one run's per-node details when `run_id` is set.\n7. `automation action=delete` — permanent. Goes through normal approval.\n\nDo **not** call these tools from inside an `action.agent` step. Workflow agents never receive `automation` tools.\n\nAfter creating or changing a graph, tell the user to open `#chat\u002Fautomations\u002F{id}` (Extensions → Automations) to inspect the canvas.\n\n## Graph contract (schema v1)\n\n```json\n{\n  \"schemaVersion\": 1,\n  \"id\": \"\",\n  \"name\": \"Daily briefing\",\n  \"enabled\": false,\n  \"nodes\": [],\n  \"edges\": [],\n  \"viewport\": { \"x\": 0, \"y\": 0, \"zoom\": 1 }\n}\n```\n\n- Exactly one trigger recommended (`trigger.manual` | `trigger.schedule` | `trigger.hotkey`).\n- Main-flow edges: `{ \"id\", \"source\", \"target\" }`. Tree only — no cycles.\n- Agent slot edges (not part of the main flow): `source` is the slot node, `target` is `action.agent`, `sourceHandle`: `\"slot\"`, `targetHandle`: `\"runtime\"` | `\"context\"` | `\"tool\"` | `\"skill\"`.\n- Node ids unique. Positions optional (auto-layout when every node is at `{x:0,y:0}`).\n- `enabled: false` until the user asks to arm schedule\u002Fhotkey. Manual and agent runs still work.\n\n## Interpolation\n\nDownstream templates:\n\n- `{{output}}` — previous node's text. After `automation action=run` with a string input, this is that string at the trigger.\n- `{{json.path}}` — walk the previous JSON. Agent-run input is nested at `json.input`.\n- `{{json.input.topic}}` — a field from `automation action=run` `{ \"input\": { \"json\": { \"topic\": \"...\" } } }`.\n\nNo `$json` expressions, no `$('Node')` cross-references.\n\n## Node types and `data`\n\nEvery node: `{ \"id\", \"type\", \"position\"?, \"data\": { \"label\": \"...\" } }`. Extra fields live under `data`.\n\n### Triggers\n\n**`trigger.manual`** — editor \u002F agent test runs only.\n\n**`trigger.schedule`**\n\n```json\n\"data\": {\n  \"label\": \"Schedule\",\n  \"schedule\": { \"kind\": \"daily\", \"hour\": 9, \"minute\": 0, \"intervalMinutes\": 60 }\n}\n```\n\n`kind`: `daily` | `weekdays` | `interval`. For `interval`, `intervalMinutes` ≥ 1. `hour` 0–23, `minute` 0–59.\n\n**`trigger.hotkey`**\n\n```json\n\"data\": { \"label\": \"Hotkey\", \"hotkey\": { \"accelerator\": \"CommandOrControl+Shift+B\" } }\n```\n\nModifiers: `CommandOrControl`, `Control`, `Alt`, `Shift`, `Super`.\n\n### Actions\n\n**`action.agent`** — unattended model step. Put prompt\u002Fruntime\u002Ftools\u002Fskills on **slot nodes**, not inline.\n\n**`action.notify`** — `{ \"notify\": { \"body\": \"{{output}}\" } }`\n\n**`action.http`** — `{ \"http\": { \"method\": \"GET\", \"url\": \"https:\u002F\u002F…\", \"headers\": \"\", \"body\": \"\" } }`  \n`method`: GET|POST|PUT|PATCH|DELETE. URL required.\n\n**`action.set`** — `{ \"set\": { \"fields\": [{ \"key\": \"text\", \"value\": \"{{output}}\" }] } }`\n\n**`action.clipboard`** — `{ \"clipboard\": { \"op\": \"copy\", \"text\": \"{{output}}\" } }` (`copy` | `read`)\n\n**`action.file`** — `{ \"file\": { \"op\": \"write\", \"path\": \"notes.md\", \"content\": \"{{output}}\" } }` (`read` | `write`; path required)\n\n**`action.command`** — `{ \"command\": { \"command\": \"echo hi\", \"cwd\": \"\", \"timeoutSeconds\": 30, \"continueOnFail\": false } }`\n\n### Logic\n\n**`logic.if`** — `{ \"if\": { \"op\": \"contains\", \"value\": \"ok\" } }`  \n`op`: `contains` | `equals` | `notEmpty`. Outgoing `sourceHandle`: `\"true\"` | `\"false\"`.\n\n**`logic.switch`** — `{ \"switch\": { \"cases\": [{ \"id\": \"1\", \"op\": \"equals\", \"value\": \"a\" }] } }`  \nOutgoing handles: each case `id`, plus `\"default\"`.\n\n**`logic.delay`** — `{ \"delay\": { \"seconds\": 5 } }` (integer ≥ 1)\n\n### Agent slots (plug into `action.agent`)\n\nSlot node `data.agent`:\n\n**`agent.runtime`**\n\n```json\n\"agent\": {\n  \"runtimeKind\": \"builtin\",\n  \"providerId\": \"\",\n  \"model\": \"\",\n  \"externalAgentId\": null,\n  \"externalModel\": null\n}\n```\n\n`runtimeKind`: `builtin` | `chat` | `external`. External needs `externalAgentId` (claude, codex, cursor, …).\n\n**`agent.context`** — `{ \"agent\": { \"prompt\": \"Summarize {{output}} in 5 bullets.\" } }`\n\n**`agent.tool`** — `{ \"agent\": { \"toolIds\": [\"web_search\", \"web_fetch\"] } }`  \nEmpty = read-only tools + skill loader. Never include `automation` or memory tools.\n\n**`agent.skill`** — `{ \"agent\": { \"skillIds\": [\"\u003Cinstalled-skill-id>\"] } }`（只写当前已启用技能的 id）\n\n## Best practices\n\n1. `automation action=list` before create. Reuse an id with upsert to replace.\n2. `dry_run: true` first. Fix every `severity: \"error\"` (`nodeId` + `message`).\n3. Leave `enabled: false` until the user wants the schedule\u002Fhotkey live; then `automation action=set_enabled`.\n4. Only when the user explicitly wants an automation: `trigger.schedule` + `action.agent` + `action.notify` fits “every morning, do X and ping me”. A plain timed prompt is a scheduled task (`schedule action=create`).\n5. For “take this problem and run my workflow”, `automation action=run` with `input`; do not rebuild the graph each time.\n6. After save, tell the user the name, id, and to open the Automations page.\n\n## Example 1 — daily agent briefing\n\n```json\n{\n  \"name\": \"Daily briefing\",\n  \"enabled\": false,\n  \"nodes\": [\n    { \"id\": \"t\", \"type\": \"trigger.schedule\", \"data\": { \"label\": \"09:00\", \"schedule\": { \"kind\": \"daily\", \"hour\": 9, \"minute\": 0, \"intervalMinutes\": 60 } } },\n    { \"id\": \"a\", \"type\": \"action.agent\", \"data\": { \"label\": \"Brief\" } },\n    { \"id\": \"ctx\", \"type\": \"agent.context\", \"data\": { \"label\": \"Prompt\", \"agent\": { \"prompt\": \"Write a short morning briefing from {{output}}.\" } } },\n    { \"id\": \"rt\", \"type\": \"agent.runtime\", \"data\": { \"label\": \"Runtime\", \"agent\": { \"runtimeKind\": \"builtin\" } } },\n    { \"id\": \"n\", \"type\": \"action.notify\", \"data\": { \"label\": \"Notify\", \"notify\": { \"body\": \"{{output}}\" } } }\n  ],\n  \"edges\": [\n    { \"id\": \"e1\", \"source\": \"t\", \"target\": \"a\" },\n    { \"id\": \"e2\", \"source\": \"a\", \"target\": \"n\" },\n    { \"id\": \"er\", \"source\": \"rt\", \"target\": \"a\", \"sourceHandle\": \"slot\", \"targetHandle\": \"runtime\" },\n    { \"id\": \"ec\", \"source\": \"ctx\", \"target\": \"a\", \"sourceHandle\": \"slot\", \"targetHandle\": \"context\" }\n  ]\n}\n```\n\n## Example 2 — run with input\n\nExisting graph: manual trigger → agent (prompt uses `{{output}}`) → notify.\n\n```\nautomation action=run id=\u003Cid> input=\"Draft a reply to this email: …\"\n```\n\nThe trigger text becomes that string; the agent prompt interpolates it.\n\n## Example 3 — HTTP then branch\n\n```json\n{\n  \"name\": \"Health ping\",\n  \"nodes\": [\n    { \"id\": \"t\", \"type\": \"trigger.manual\", \"data\": { \"label\": \"Manual\" } },\n    { \"id\": \"h\", \"type\": \"action.http\", \"data\": { \"label\": \"GET\", \"http\": { \"method\": \"GET\", \"url\": \"https:\u002F\u002Fexample.com\u002Fhealth\", \"headers\": \"\", \"body\": \"\" } } },\n    { \"id\": \"i\", \"type\": \"logic.if\", \"data\": { \"label\": \"OK?\", \"if\": { \"op\": \"contains\", \"value\": \"ok\" } } },\n    { \"id\": \"yes\", \"type\": \"action.notify\", \"data\": { \"label\": \"Up\", \"notify\": { \"body\": \"healthy: {{output}}\" } } },\n    { \"id\": \"no\", \"type\": \"action.notify\", \"data\": { \"label\": \"Down\", \"notify\": { \"body\": \"unhealthy: {{output}}\" } } }\n  ],\n  \"edges\": [\n    { \"id\": \"e1\", \"source\": \"t\", \"target\": \"h\" },\n    { \"id\": \"e2\", \"source\": \"h\", \"target\": \"i\" },\n    { \"id\": \"e3\", \"source\": \"i\", \"target\": \"yes\", \"sourceHandle\": \"true\" },\n    { \"id\": \"e4\", \"source\": \"i\", \"target\": \"no\", \"sourceHandle\": \"false\" }\n  ]\n}\n```\n",{},"main","9cbb212173f3cc08c870257a1f99dbafeb49fa45","src-tauri\u002Fresources\u002Fskills\u002Fautomation",42,"https:\u002F\u002Fgithub.com\u002FZMGID\u002Fkivio","https:\u002F\u002Fkivio-desktop.xyz","https:\u002F\u002Fgithub.com\u002FZMGID","2026-11-12 05:47:08",{"source":7,"skillName":5,"commands":37,"prompt":47,"zipAvailable":48},[38,41,44],{"tool":39,"command":40},"npx","npx skills add ZMGID\u002Fkivio --skill automation",{"tool":42,"command":43},"bunx","bunx skills add ZMGID\u002Fkivio --skill automation",{"tool":45,"command":46},"pnpm","pnpm dlx skills add ZMGID\u002Fkivio --skill automation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FZMGID\u002Fkivio\u002Fblob\u002Fmain\u002Fsrc-tauri\u002Fresources\u002Fskills\u002Fautomation\u002FSKILL.md",true,[],[51,62,69,82,96,115],{"skillNo":52,"name":53,"nameZh":6,"description":54,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":55,"categories":56,"keywords":57,"publishedAt":23},"01M6C5VRHAA6BGC03211DN35M5","example","Demonstrate loading a plugin skill from its original directory.","https:\u002F\u002Fgithub.com\u002FZMGID\u002Fkivio\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fplugins\u002Fportable-example\u002Fskills\u002Fexample\u002FSKILL.md",[],[53,58,59,60,61],"loading","directory","plugin","plugin skill",{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":23},"01M6C5VQHJN3YSF7MSBX962MJZ","review","检查代码改动的逻辑错误与遗漏","https:\u002F\u002Fgithub.com\u002FZMGID\u002Fkivio\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fplugins\u002Fkivio-example\u002Fskills\u002Freview\u002FSKILL.md",[],[64],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":76,"publishedAt":23},"01M6C5V58F1VDC0HQCERDC2M7H","kivio-configuration-guide","配置与排查 Kivio 自身：模型、提示词、Skills、插件、MCP、Hooks、斜杠命令及运行时。用户要求安装扩展、调整配置或解决不生效问题时使用；普通项目开发不触发。","https:\u002F\u002Fgithub.com\u002FZMGID\u002Fkivio\u002Fblob\u002Fmain\u002Fsrc-tauri\u002Fresources\u002Fskills\u002Fkivio-configuration-guide\u002FSKILL.md",[75],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[77,78,79,80,81],"guide","kivio configuration guide","configuration","MCP","hooks",{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":23},"01M6C5TKABAPJW0KPA1G12YQF8","wecom-cli","Work with WeCom through the official wecom-cli and the skills shipped by WeComTeam\u002Fwecom-cli.","https:\u002F\u002Fgithub.com\u002FZMGID\u002Fkivio\u002Fblob\u002Fmain\u002Fsrc-tauri\u002Fresources\u002Fplugins\u002Fwecom-cli\u002FSKILL.md",[],[89,90,91,92,93,94,95],"cli","wecom cli","wecom","official","work","with","true",{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":23},"01M6C5THASGNVKWH1M36Q91GT3","wecom-cli-setup","Install the official wecom-cli and its published skills, then verify scan-code login with one read-only identity call.","https:\u002F\u002Fgithub.com\u002FZMGID\u002Fkivio\u002Fblob\u002Fmain\u002Fsrc-tauri\u002Fresources\u002Fplugins\u002Fwecom-cli-setup\u002FSKILL.md",[],[103,89,104,90,91,105,94,106,95,107,108,109,92,110,111,112,113,114],"setup","wecom cli setup","call","read-only","login","scan","identity","code","verify","read","install","only",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":23},"01M6C5TFA160M3HNDTW7F3S16S","feishu-cli","Work with Feishu messages, documents, Base, sheets, calendar, tasks and other services through the official lark-cli and its embedded domain guidance.","https:\u002F\u002Fgithub.com\u002FZMGID\u002Fkivio\u002Fblob\u002Fmain\u002Fsrc-tauri\u002Fresources\u002Fplugins\u002Ffeishu-cli\u002FSKILL.md",[],[122,123,89,124,92,125,126,127,128,93,129,130,131,132,133,94,134,95],"feishu","feishu cli","domain","documents","tasks","messages","services","embedded","calendar","guidance","base","lark","sheets"]