From todoist-sync
Dev task tracker synced to Todoist. Auto-triggered via hooks on SessionStart and Stop in configured projects. Fetches due tasks, completes sub-tasks after work, creates chunks from plans. Use /todoist-sync:setup to configure a project.
How this skill is triggered — by the user, by Claude, or both
Slash command
/todoist-sync:todoist-syncThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Keeps Todoist in sync with Claude Code sessions. Uses `mcp__todoist__*` MCP tools.
Keeps Todoist in sync with Claude Code sessions. Uses mcp__todoist__* MCP tools.
Before doing anything, read the config file. The path ${CLAUDE_PLUGIN_DATA} is substituted by Claude Code:
cat "${CLAUDE_PLUGIN_DATA}/config.json"
If the file doesn't exist, tell the user to run /todoist-sync:setup and stop.
Parse the JSON to find the current repo's project entry. Match git rev-parse --show-toplevel against the repo field in each project. Extract section_id, section_name, and preferences.summary_max_tasks.
The SessionStart hook injects context with the pre-resolved section ID, max tasks, branch, and session file path. All discovery is already done — do NOT call get-overview, search, find-projects, or find-sections.
Exactly one MCP call:
mcp__todoist__find-tasks({ sectionId: "<from hook context>", limit: <from hook context> })
Then from the results:
Never search for the project or section by name. The hook already resolved it.
When a piece of work is done (code written, tests pass, PR merged):
mcp__todoist__complete-tasksactive_task_ids in the session file provided by the hook context. Use atomic write to prevent corruption:
python3 -c "
import json, sys, os, tempfile
path = sys.argv[1]
new_ids = sys.argv[2:]
with open(path) as f:
state = json.load(f)
state['active_task_ids'] = list(set(state.get('active_task_ids', []) + new_ids))
fd, tmp = tempfile.mkstemp(dir=os.path.dirname(path), suffix='.tmp')
with os.fdopen(fd, 'w') as f:
json.dump(state, f, indent=2)
f.flush()
os.fsync(f.fileno())
os.replace(tmp, path)
" "SESSION_FILE_FROM_HOOK_CONTEXT" "TASK_ID_1" "TASK_ID_2"
Replace SESSION_FILE_FROM_HOOK_CONTEXT with the actual path from the SessionStart hook context.When significant progress is made, append session context to the parent chunk's description via mcp__todoist__update-tasks:
---
**Session: YYYY-MM-DD**
Branch: `branch-name`
Done: what was accomplished
Next: what remains
Append, don't replace existing description content.
The Stop hook injects context with: project key, section name, branch, active task IDs, session file path.
When you receive this context:
active_task_ids is empty, skip — nothing was tracked this sessionWhen a plan is written (plan mode exit) in a configured project:
quick-win: <30 min, targeted fix, single-file changeblocked: depends on external API, waiting on someone, infra not readyneeds-design: UI work, architecture decision, multiple valid approachesp1: blocking other workp2: due this week or next deliverablep3: planned but not urgentp4: backlog / nice-to-havemcp__todoist__find-tasks with searchText to avoid duplicates| Claude manages | User manages (phone/Todoist app) |
|---|---|
| Creating chunks + sub-tasks from plans | Due dates and deadlines |
| Completing sub-tasks after work | Reordering priorities |
| Applying labels based on context | Moving tasks between sections |
| Updating descriptions with session state | Recurring task schedules |
| Suggesting new tasks from TODOs/FIXMEs | Deleting tasks they don't want |
mcp__todoist__find-tasks.npx claudepluginhub aryanbhats/ab-stack --plugin todoist-syncManages tasks using native Claude Code subagent tools (TaskCreate, TaskUpdate, TaskList, TaskGet). Tracks TODOs, checkpoints progress, and resumes work across sessions.
Executes eligible tasks from session task list, syncs against codebase/PR state to surface stales, and generates handovers. Use /task-run [--all] [--sync [--dry-run]] [--handover [query]].