Todoist Skill 为 OpenClaw 提供统一的待办管理能力,支持多 Agent 身份识别。 身份系统 每个 OpenClaw 实例有唯一 ID,每个 Agent 有独立标签: 命令 | 命令 | 说明 | |------|------| | | 列出任务 (today/personal/agent/overdue) | | | 添加任务 | | | 添加子任务 | | | 查看任务详情 | | | 更新任务 | | | 认领任务 | | | 完成任务 | | | 删除任务 | | | 列出项目 | | | 列出标签 | 配置 | 命令 | 说明 | |------|------| | | 显示配置 | | | 设置每日提醒时间 | | | 设置心跳检查间隔(小时) | | | 切换当前 Agent | | | 添加新 Agent | 🔄 自动同步任务到 TASK.md 心跳时会自动同步 Todoist 任务到 : 生成的 TASK.md 格式: 心跳配置 在 中添加: bash /.openclaw/workspace/skills/openclaw-todoist/scripts/sync-to-task.sh 一键配置 提醒逻辑 - ✅ 自动同步所有任务到 TASK.md - ⚠️ 仅逾期任务 时主动提醒用户 - 无任务或无逾期 → 静默(HEARTBEAT…

| head -1 || true)\nhas_overdue=$(echo \"$overdue_tasks\" | grep -v '^

Todoist Skill 为 OpenClaw 提供统一的待办管理能力,支持多 Agent 身份识别。 身份系统 每个 OpenClaw 实例有唯一 ID,每个 Agent 有独立标签: 命令 | 命令 | 说明 | |------|------| | | 列出任务 (today/personal/agent/overdue) | | | 添加任务 | | | 添加子任务 | | | 查看任务详情 | | | 更新任务 | | | 认领任务 | | | 完成任务 | | | 删除任务 | | | 列出项目 | | | 列出标签 | 配置 | 命令 | 说明 | |------|------| | | 显示配置 | | | 设置每日提醒时间 | | | 设置心跳检查间隔(小时) | | | 切换当前 Agent | | | 添加新 Agent | 🔄 自动同步任务到 TASK.md 心跳时会自动同步 Todoist 任务到 : 生成的 TASK.md 格式: 心跳配置 在 中添加: bash /.openclaw/workspace/skills/openclaw-todoist/scripts/sync-to-task.sh 一键配置 提醒逻辑 - ✅ 自动同步所有任务到 TASK.md - ⚠️ 仅逾期任务 时主动提醒用户 - 无任务或无逾期 → 静默(HEARTBEAT…

| head -1 || true)\nhas_nodue=$(echo \"$no_due_tasks\" | grep -v '^

Todoist Skill 为 OpenClaw 提供统一的待办管理能力,支持多 Agent 身份识别。 身份系统 每个 OpenClaw 实例有唯一 ID,每个 Agent 有独立标签: 命令 | 命令 | 说明 | |------|------| | | 列出任务 (today/personal/agent/overdue) | | | 添加任务 | | | 添加子任务 | | | 查看任务详情 | | | 更新任务 | | | 认领任务 | | | 完成任务 | | | 删除任务 | | | 列出项目 | | | 列出标签 | 配置 | 命令 | 说明 | |------|------| | | 显示配置 | | | 设置每日提醒时间 | | | 设置心跳检查间隔(小时) | | | 切换当前 Agent | | | 添加新 Agent | 🔄 自动同步任务到 TASK.md 心跳时会自动同步 Todoist 任务到 : 生成的 TASK.md 格式: 心跳配置 在 中添加: bash /.openclaw/workspace/skills/openclaw-todoist/scripts/sync-to-task.sh 一键配置 提醒逻辑 - ✅ 自动同步所有任务到 TASK.md - ⚠️ 仅逾期任务 时主动提醒用户 - 无任务或无逾期 → 静默(HEARTBEAT…

| head -1 || true)\n\n# No tasks at all - remove TASK.md if exists\nif [ -z \"$has_today\" ] && [ -z \"$has_overdue\" ] && [ -z \"$has_nodue\" ]; then\n [ -f \"$TASK_FILE\" ] && rm \"$TASK_FILE\"\n exit 0\nfi\n\n# Build TASK.md content\n{\n echo \"# 当前任务\"\n echo \"\"\n echo \"_自动同步自 Todoist ($(date '+%Y-%m-%d %H:%M'))_\"\n echo \"\"\n\n if [ -n \"$has_overdue\" ]; then\n echo \"## ⚠️ 逾期任务\"\n echo \"\"\n echo \"$overdue_tasks\" | while read -r line; do\n [ -n \"$line\" ] && echo \"- [ ] $line\"\n done\n echo \"\"\n fi\n\n if [ -n \"$has_today\" ]; then\n echo \"## 📅 今日任务\"\n echo \"\"\n echo \"$today_tasks\" | while read -r line; do\n [ -n \"$line\" ] && echo \"- [ ] $line\"\n done\n echo \"\"\n fi\n\n if [ -n \"$has_nodue\" ]; then\n echo \"## 📌 待办(无日期)\"\n echo \"\"\n echo \"$no_due_tasks\" | while read -r line; do\n [ -n \"$line\" ] && echo \"- [ ] $line\"\n done\n echo \"\"\n fi\n\n echo \"---\"\n echo \"完成或修改任务请使用 Todoist 命令或 App\"\n} > \"$TASK_FILE\"\n\n# Return status for heartbeat\nif [ -n \"$has_overdue\" ]; then\n echo \"⚠️ 有 $(echo \"$overdue_tasks\" | grep -v '^

Todoist Skill 为 OpenClaw 提供统一的待办管理能力,支持多 Agent 身份识别。 身份系统 每个 OpenClaw 实例有唯一 ID,每个 Agent 有独立标签: 命令 | 命令 | 说明 | |------|------| | | 列出任务 (today/personal/agent/overdue) | | | 添加任务 | | | 添加子任务 | | | 查看任务详情 | | | 更新任务 | | | 认领任务 | | | 完成任务 | | | 删除任务 | | | 列出项目 | | | 列出标签 | 配置 | 命令 | 说明 | |------|------| | | 显示配置 | | | 设置每日提醒时间 | | | 设置心跳检查间隔(小时) | | | 切换当前 Agent | | | 添加新 Agent | 🔄 自动同步任务到 TASK.md 心跳时会自动同步 Todoist 任务到 : 生成的 TASK.md 格式: 心跳配置 在 中添加: bash /.openclaw/workspace/skills/openclaw-todoist/scripts/sync-to-task.sh 一键配置 提醒逻辑 - ✅ 自动同步所有任务到 TASK.md - ⚠️ 仅逾期任务 时主动提醒用户 - 无任务或无逾期 → 静默(HEARTBEAT…

| wc -l | tr -d ' ') 个逾期任务\"\n exit 0\nfi","content_type":"application/x-sh; charset=utf-8","language":"bash","size":2498,"content_sha256":"ad8bcd7e7e179fb8eab0c67494a8ecd14892c2b95d73c88306634ce7c9e5959a"},{"filename":"skill.json","content":"{\n \"name\": \"todoist\",\n \"version\": \"1.0.0\",\n \"description\": \"Todoist task management for OpenClaw with multi-agent identity support\",\n \"author\": \"kings0527\",\n \"license\": \"MIT\"\n}\n","content_type":"application/json; charset=utf-8","language":"json","size":182,"content_sha256":"f9cc58502d4074d3282e899d5fa459a87050004adbfd8f5ae4dd0f1a56f70e6c"},{"filename":"todoist.sh","content":"#!/bin/bash\n# Todoist CLI wrapper for OpenClaw\n\nset -e\n\nTOKEN_FILE=\"$HOME/.openclaw/workspace/.todoist-token\"\nIDENTITY_FILE=\"$HOME/.openclaw/workspace/.agent-identity.json\"\nAPI_BASE=\"https://api.todoist.com/api/v1\"\n\n# Load token\nif [ ! -f \"$TOKEN_FILE\" ]; then\n echo \"Token not found: $TOKEN_FILE\"\n exit 1\nfi\nTOKEN=$(cat \"$TOKEN_FILE\")\n\n# Load identity\nload_identity() {\n if [ -f \"$IDENTITY_FILE\" ]; then\n INSTANCE_ID=$(jq -r .instance_id \"$IDENTITY_FILE\")\n CURRENT_AGENT=$(jq -r .current_agent \"$IDENTITY_FILE\")\n AGENT_LABEL=$(jq -r \".agents.$CURRENT_AGENT.todoist_label\" \"$IDENTITY_FILE\")\n else\n INSTANCE_ID=$(hostname | shasum -a 256 | cut -c1-8)\n CURRENT_AGENT=\"main\"\n AGENT_LABEL=\"agent-$INSTANCE_ID-main\"\n fi\n}\n\n# API helpers\napi_get() { curl -s \"$API_BASE/$1\" -H \"Authorization: Bearer $TOKEN\"; }\napi_post() { curl -s -X POST \"$API_BASE/$1\" -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" -d \"$2\"; }\n\nget_task_id() {\n api_get \"tasks\" | jq -r \".results[] | select(.content | test(\\\"$1\\\"; \\\"i\\\")) | .id\" | head -1\n}\n\nget_project_id() {\n api_get \"projects\" | jq -r \".results[] | select(.name | contains(\\\"$1\\\")) | .id\" | head -1\n}\n\n# Commands\ncmd_list() {\n local filter=\"${1:-all}\"\n load_identity\n echo \"Tasks (Instance: $INSTANCE_ID, Agent: $CURRENT_AGENT)\"\n echo \"\"\n \n local tasks=$(api_get \"tasks\")\n local today=$(date +%Y-%m-%d)\n \n case \"$filter\" in\n today)\n echo \"Today:\"\n echo \"$tasks\" | jq -r \".results[] | select(.due.date == \\\"$today\\\") | \\\" [ ] \\(.content)\\\"\"\n ;;\n overdue)\n echo \"Overdue:\"\n echo \"$tasks\" | jq -r \".results[] | select(.due.date \u003c \\\"$today\\\") | \\\" [!] \\(.content) (\\(.due.date))\\\"\"\n ;;\n personal)\n local pid=$(get_project_id \"个人事务\")\n echo \"Personal:\"\n echo \"$tasks\" | jq -r \".results[] | select(.project_id == \\\"$pid\\\") | \\\" [ ] \\(.content)\\\"\"\n ;;\n agent)\n echo \"Agent ($CURRENT_AGENT):\"\n echo \"$tasks\" | jq -r \".results[] | select(.labels | index(\\\"$AGENT_LABEL\\\")) | \\\" [ ] \\(.content)\\\"\"\n ;;\n *)\n local pid=$(get_project_id \"个人事务\")\n echo \"Personal:\"\n echo \"$tasks\" | jq -r \".results[] | select(.project_id == \\\"$pid\\\") | \\\" [ ] \\(.content)\\\"\"\n echo \"\"\n echo \"Agent ($CURRENT_AGENT):\"\n echo \"$tasks\" | jq -r \".results[] | select(.labels | index(\\\"$AGENT_LABEL\\\")) | \\\" [ ] \\(.content)\\\"\"\n ;;\n esac\n}\n\ncmd_add() {\n local content=\"$1\"\n local type=\"${2:-personal}\"\n local due=\"${3:-}\"\n load_identity\n \n local pid\n local labels=\"[]\"\n \n if [ \"$type\" = \"agent\" ]; then\n pid=$(get_project_id \"Agent 任务\")\n labels=\"[\\\"$AGENT_LABEL\\\"]\"\n echo \"Adding Agent task [$CURRENT_AGENT]: $content\"\n else\n pid=$(get_project_id \"个人事务\")\n echo \"Adding personal task: $content\"\n fi\n \n local payload=\"{\\\"content\\\":\\\"$content\\\",\\\"project_id\\\":\\\"$pid\\\",\\\"labels\\\":$labels\"\n [ -n \"$due\" ] && payload=\"$payload,\\\"due_string\\\":\\\"$due\\\"\"\n payload=\"$payload}\"\n \n api_post \"tasks\" \"$payload\" | jq -r '.content // \"Added\"'\n}\n\ncmd_subtask() {\n local parent=\"$1\"\n local content=\"$2\"\n local pid=$(get_task_id \"$parent\")\n [ -z \"$pid\" ] && { echo \"Parent not found: $parent\"; exit 1; }\n echo \"Adding subtask to: $parent\"\n api_post \"tasks\" \"{\\\"content\\\":\\\"$content\\\",\\\"parent_id\\\":\\\"$pid\\\"}\" | jq -r '.content // \"Added\"'\n}\n\ncmd_show() {\n local q=\"$1\"\n local id=$(get_task_id \"$q\")\n [ -z \"$id\" ] && { echo \"Task not found: $q\"; exit 1; }\n local t=$(api_get \"tasks\" | jq -r \".results[] | select(.id == \\\"$id\\\")\")\n echo \"Task: $(echo \"$t\" | jq -r .content)\"\n echo \"Due: $(echo \"$t\" | jq -r '.due.string // \"none\"')\"\n echo \"Labels: $(echo \"$t\" | jq -r '.labels | join(\", \") // \"none\"')\"\n echo \"\"\n echo \"Subtasks:\"\n api_get \"tasks\" | jq -r \".results[] | select(.parent_id == \\\"$id\\\") | \\\" - \\(.content)\\\"\"\n}\n\ncmd_update() {\n local q=\"$1\"\n local field=\"$2\"\n local val=\"$3\"\n local id=$(get_task_id \"$q\")\n [ -z \"$id\" ] && { echo \"Task not found: $q\"; exit 1; }\n \n local payload\n case \"$field\" in\n date|due) payload=\"{\\\"due_string\\\":\\\"$val\\\"}\" ;;\n content) payload=\"{\\\"content\\\":\\\"$val\\\"}\" ;;\n priority) payload=\"{\\\"priority\\\":$val}\" ;;\n *) echo \"Unknown field: $field\"; exit 1 ;;\n esac\n \n curl -s -X POST \"$API_BASE/tasks/$id\" -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" -d \"$payload\" > /dev/null\n echo \"Updated: $q ($field = $val)\"\n}\n\ncmd_claim() {\n local q=\"$1\"\n load_identity\n local id=$(get_task_id \"$q\")\n [ -z \"$id\" ] && { echo \"Task not found: $q\"; exit 1; }\n local t=$(api_get \"tasks\" | jq -r \".results[] | select(.id == \\\"$id\\\")\")\n local lbls=$(echo \"$t\" | jq -r '.labels')\n local new=$(echo \"[$lbls, \\\"$AGENT_LABEL\\\"]\" | jq -s 'add | unique')\n curl -s -X POST \"$API_BASE/tasks/$id\" -H \"Authorization: Bearer $TOKEN\" -H \"Content-Type: application/json\" -d \"{\\\"labels\\\":$new}\" > /dev/null\n echo \"Claimed: $(echo \"$t\" | jq -r .content) -> $CURRENT_AGENT\"\n}\n\ncmd_complete() {\n local q=\"$1\"\n local id=$(get_task_id \"$q\")\n [ -z \"$id\" ] && { echo \"Task not found: $q\"; exit 1; }\n local name=$(api_get \"tasks\" | jq -r \".results[] | select(.id == \\\"$id\\\") | .content\")\n api_post \"tasks/$id/close\" \"{}\" > /dev/null\n echo \"Completed: $name\"\n}\n\ncmd_delete() {\n local q=\"$1\"\n local id=$(get_task_id \"$q\")\n [ -z \"$id\" ] && { echo \"Task not found: $q\"; exit 1; }\n local name=$(api_get \"tasks\" | jq -r \".results[] | select(.id == \\\"$id\\\") | .content\")\n curl -s -X DELETE \"$API_BASE/tasks/$id\" -H \"Authorization: Bearer $TOKEN\" > /dev/null\n echo \"Deleted: $name\"\n}\n\ncmd_projects() { api_get \"projects\" | jq -r '.results[] | \" \\(.name)\"'; }\ncmd_labels() { api_get \"labels\" | jq -r '.results[] | \" \\(.name)\"'; }\ncmd_config() { jq -C . \"$IDENTITY_FILE\"; }\n\n# Main\ncase \"${1:-help}\" in\n list|ls) cmd_list \"$2\" ;;\n add) cmd_add \"$2\" \"$3\" \"$4\" ;;\n subtask) cmd_subtask \"$2\" \"$3\" ;;\n show) cmd_show \"$2\" ;;\n update) cmd_update \"$2\" \"$3\" \"$4\" ;;\n claim) cmd_claim \"$2\" ;;\n complete|done) cmd_complete \"$2\" ;;\n delete|rm) cmd_delete \"$2\" ;;\n projects) cmd_projects ;;\n labels) cmd_labels ;;\n config) cmd_config ;;\n *)\n echo \"Todoist CLI\"\n echo \"\"\n echo \"Commands:\"\n echo \" list [today|personal|agent|overdue] List tasks\"\n echo \" add \u003ccontent> [type] [due] Add task\"\n echo \" subtask \u003cparent> \u003ccontent> Add subtask\"\n echo \" show \u003ckeyword> Show task details\"\n echo \" update \u003ctask> \u003cfield> \u003cvalue> Update task\"\n echo \" claim \u003ctask> Claim task for current agent\"\n echo \" complete \u003ctask> Complete task\"\n echo \" delete \u003ctask> Delete task\"\n echo \" projects List projects\"\n echo \" labels List labels\"\n echo \" config Show config\"\n ;;\nesac","content_type":"application/x-sh; charset=utf-8","language":"bash","size":7348,"content_sha256":"c98b597a05c533e2545499cb0328d9ae94cdc3d33940bc0fbeae914eb35914cd"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Todoist Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"为 OpenClaw 提供统一的待办管理能力,支持多 Agent 身份识别。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"身份系统","type":"text"}]},{"type":"paragraph","content":[{"text":"每个 OpenClaw 实例有唯一 ID,每个 Agent 有独立标签:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"实例 ID: 8259c9d1 (自动生成)\nAgent 标签: agent-8259c9d1-main","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"命令","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"命令","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"list [filter]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"列出任务 (today/personal/agent/overdue)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"add \u003c内容> [type] [日期]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加任务","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"subtask \u003c父任务> \u003c内容>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加子任务","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"show \u003c关键词>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"查看任务详情","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"update \u003c任务> \u003c字段> \u003c值>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"更新任务","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"claim \u003c任务>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"认领任务","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"complete \u003c任务>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"完成任务","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"delete \u003c任务>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"删除任务","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"projects","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"列出项目","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"labels","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"列出标签","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"配置","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"命令","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"show","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"显示配置","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"set-time HH:MM","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设置每日提醒时间","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"set-interval N","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设置心跳检查间隔(小时)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"set-agent \u003cname>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"切换当前 Agent","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"add-agent \u003cname>","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加新 Agent","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"🔄 自动同步任务到 TASK.md","type":"text"}]},{"type":"paragraph","content":[{"text":"心跳时会自动同步 Todoist 任务到 ","type":"text"},{"text":"~/.openclaw/workspace/TASK.md","type":"text","marks":[{"type":"code_inline"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"~/.openclaw/workspace/skills/openclaw-todoist/scripts/sync-to-task.sh","type":"text"}]},{"type":"paragraph","content":[{"text":"生成的 TASK.md 格式:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"# 当前任务\n\n_自动同步自 Todoist (2026-03-16 10:00)_\n\n## ⚠️ 逾期任务\n- [ ] 任务名 (逾期: 2026-03-15)\n\n## 📅 今日任务\n- [ ] 任务名\n\n## 📌 待办(无日期)\n- [ ] 任务名","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"心跳配置","type":"text"}]},{"type":"paragraph","content":[{"text":"在 ","type":"text"},{"text":"HEARTBEAT.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" 中添加:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"# 心跳任务\n\n## 每次心跳自动执行\n\n1. **同步 Todoist 任务到 TASK.md**\n ```bash\n ~/.openclaw/workspace/skills/openclaw-todoist/scripts/sync-to-task.sh","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"静默条件","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"无任务时回复 HEARTBEAT_OK","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"有逾期任务时主动提醒","type":"text"}]}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"\n### 一键配置\n\n```bash\n~/.openclaw/workspace/skills/openclaw-todoist/scripts/setup-heartbeat.sh","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"提醒逻辑","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 自动同步所有任务到 TASK.md","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"仅逾期任务","type":"text","marks":[{"type":"strong"}]},{"text":"时主动提醒用户","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"无任务或无逾期 → 静默(HEARTBEAT_OK)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"发布内容","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"skills/todoist/\n├── SKILL.md\n└── todoist.sh\n\nscripts/\n├── agent-config.sh\n└── heartbeat-tasks.sh","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"用户配置文件(不包含在发布中)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"~/.openclaw/workspace/\n├── .todoist-token # 用户 API token\n└── .agent-identity.json # 用户身份配置","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"todoist","author":"@skillopedia","source":{"stars":2012,"repo_name":"openclaw-master-skills","origin_url":"https://github.com/leoyeai/openclaw-master-skills/blob/HEAD/skills/openclaw-todoist/SKILL.md","repo_owner":"leoyeai","body_sha256":"4abec907c949fd19a81d4f7d8b4431555e266fcdbc7bbf9a39a17b46b3b09511","cluster_key":"d2ee623ca53c961ce5041eb6eb566672e986cf1049dc06882ef3e0857bf5a32f","clean_bundle":{"format":"clean-skill-bundle-v1","source":"leoyeai/openclaw-master-skills/skills/openclaw-todoist/SKILL.md","attachments":[{"id":"e4d6f126-77f3-5f72-b12b-86d2f8e864d1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e4d6f126-77f3-5f72-b12b-86d2f8e864d1/attachment.json","path":".clawhub/origin.json","size":148,"sha256":"27cbc830ca6350f285725141a197aba5bca152f0347bbacfbfb26112a994b85a","contentType":"application/json; charset=utf-8"},{"id":"67a3bc93-c6f0-5a5a-99ab-7b8cf2e0dfb4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/67a3bc93-c6f0-5a5a-99ab-7b8cf2e0dfb4/attachment.json","path":"_meta.json","size":135,"sha256":"e9e84f0ea09a3367044136165356cea8742347b8a5a9f6e01ad7be5901ff8696","contentType":"application/json; charset=utf-8"},{"id":"f54a3d29-fa60-5cb4-a11b-63d959bf8f49","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f54a3d29-fa60-5cb4-a11b-63d959bf8f49/attachment.sh","path":"agent-config.sh","size":3526,"sha256":"3ca8e9f3be28cc5d7b60bc3f5ee1695b6627fe4fb3dd5e909cfe5df834246aff","contentType":"application/x-sh; charset=utf-8"},{"id":"576d05db-c19c-52b0-886f-8055dadf1169","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/576d05db-c19c-52b0-886f-8055dadf1169/attachment.sh","path":"heartbeat-tasks.sh","size":1871,"sha256":"ad204db9c14f68a5b36f3cadf65764619682cf5ea11c81003b0f1de72e36082e","contentType":"application/x-sh; charset=utf-8"},{"id":"680b3b3c-e662-5e55-a0a3-0e576a299c08","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/680b3b3c-e662-5e55-a0a3-0e576a299c08/attachment.sh","path":"scripts/setup-heartbeat.sh","size":1324,"sha256":"2e5278cba08df8f300e2f89ea796dc7bdb24b37fc18164de4aca7255ddc8452d","contentType":"application/x-sh; charset=utf-8"},{"id":"a170c7ee-895a-5a20-aed0-7fd702f5146a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a170c7ee-895a-5a20-aed0-7fd702f5146a/attachment.sh","path":"scripts/sync-to-task.sh","size":2498,"sha256":"ad8bcd7e7e179fb8eab0c67494a8ecd14892c2b95d73c88306634ce7c9e5959a","contentType":"application/x-sh; charset=utf-8"},{"id":"baed210e-b9f1-5b39-a441-e7f7b82aacb9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/baed210e-b9f1-5b39-a441-e7f7b82aacb9/attachment.json","path":"skill.json","size":182,"sha256":"f9cc58502d4074d3282e899d5fa459a87050004adbfd8f5ae4dd0f1a56f70e6c","contentType":"application/json; charset=utf-8"},{"id":"cde42c7d-b3c5-56e7-af79-a0b5d6703572","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cde42c7d-b3c5-56e7-af79-a0b5d6703572/attachment.sh","path":"todoist.sh","size":7348,"sha256":"c98b597a05c533e2545499cb0328d9ae94cdc3d33940bc0fbeae914eb35914cd","contentType":"application/x-sh; charset=utf-8"}],"bundle_sha256":"c1affb1a467b0cac29707051a9c85e3fcc381b0519b7103d5ae12c9527227107","attachment_count":8,"text_attachments":8,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/openclaw-todoist/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"integrations-apis","category_label":"Integrations"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"integrations-apis","metadata":{"openclaw":{"emoji":"✅","requires":{}}},"import_tag":"clean-skills-v1","description":"Todoist task management for OpenClaw. Unified todo API with multi-agent identity, scheduled checks and reminders."}},"renderedAt":1782980669086}

Todoist Skill 为 OpenClaw 提供统一的待办管理能力,支持多 Agent 身份识别。 身份系统 每个 OpenClaw 实例有唯一 ID,每个 Agent 有独立标签: 命令 | 命令 | 说明 | |------|------| | | 列出任务 (today/personal/agent/overdue) | | | 添加任务 | | | 添加子任务 | | | 查看任务详情 | | | 更新任务 | | | 认领任务 | | | 完成任务 | | | 删除任务 | | | 列出项目 | | | 列出标签 | 配置 | 命令 | 说明 | |------|------| | | 显示配置 | | | 设置每日提醒时间 | | | 设置心跳检查间隔(小时) | | | 切换当前 Agent | | | 添加新 Agent | 🔄 自动同步任务到 TASK.md 心跳时会自动同步 Todoist 任务到 : 生成的 TASK.md 格式: 心跳配置 在 中添加: bash /.openclaw/workspace/skills/openclaw-todoist/scripts/sync-to-task.sh 一键配置 提醒逻辑 - ✅ 自动同步所有任务到 TASK.md - ⚠️ 仅逾期任务 时主动提醒用户 - 无任务或无逾期 → 静默(HEARTBEAT…