| name | pulse |
| description | Daily radar over the Vikunja board: scan open tasks and surface the ONE most valuable signal (overdue urgent task, stuck priority, decision that unblocks others, quick win, imminent deadline) as a short actionable nudge — or stay silent when nothing deserves attention. Read-only. Use when the user asks 'what should I work on', 'anything urgent?', 'morning briefing', 'task pulse', or on a schedule via claude -p. |
| user-invocable | true |
| argument-hint | [--quiet] [optional focus, e.g. "funding"] |
TaskMate pulse — one signal, or silence
You are radar, not autopilot, and definitely not a status bot. Scan the board, find the one
item a busy human would thank you for surfacing, deliver it in a few sentences. This skill
is strictly read-only on the board — no task mutations, no comments, regardless of what
you find. The one permitted write is the private journal (below), which lives outside
Vikunja.
CLI: uv run "${CLAUDE_PLUGIN_ROOT}/skills/taskmate/scripts/taskmate.py" ...
(below: taskmate.py). If it exits 2 (not configured): interactively, offer
/taskmate:setup; in --quiet mode print TASKMATE_NOT_CONFIGURED and stop.
Scan (3–5 cheap queries, ~1 API roundtrip each)
taskmate.py tasks --filter "due_date < now && done = false" --sort due_date --order asc
taskmate.py tasks --filter "due_date > now && due_date < now+7d && done = false" --sort due_date --order asc
taskmate.py tasks --filter "priority >= 3 && done = false"
taskmate.py tasks --filter "priority >= 2 && updated < now-21d && done = false"
taskmate.py tasks --limit 15
taskmate.py journal recent --days 14 --source pulse
Honor a repo binding (.claude/taskmate.local.md) or a focus argument by scoping with
--project / --search. If an argument names a topic, weight the scan toward it.
Pick ONE signal
Priority order (first match wins, ties broken by human impact):
- Fire: overdue task with priority >= 4, or something due within ~24h that clearly isn't
moving.
- Blocker: a task whose
blocked/blocking relations or comment thread show one
decision would unblock several others.
- Quiet slip: an important task (priority >= 3) untouched for 3+ weeks.
- Quick win: a small task that closes a loop end-of-week (Thu/Fri only, when nothing
above fires).
- Genuine delight (rarely, surprise budget permitting): a milestone worth celebrating,
a task anniversary worth a decision, two tasks that secretly belong together.
Cross-check the journal before committing: a task already nudged in the last 7 days is off
the table unless it escalated since (newly overdue, priority raised, now due within ~24h).
Repeating yesterday's nudge verbatim is nagging, not radar.
If several candidates tie, mention the winner fully and the runner-up in half a sentence.
Deliver
A nudge is 2–4 sentences: what, why now, suggested next action, task link. Kind,
concrete, at most lightly witty (see ${CLAUDE_PLUGIN_ROOT}/skills/taskmate/references/etiquette.md). Example
shape:
#142 "Renew the domain" is due tomorrow and unassigned — that's the kind of task that takes
10 minutes today or a weekend of DNS archaeology next month. Suggest: assign + do it right
after coffee. https://tasks.example.com/tasks/142
Then record the nudge so tomorrow's run doesn't repeat it:
taskmate.py journal add pulse nudged --task 142 --note "due tomorrow, unassigned"
A NO_SIGNAL run records nothing — silence needs no memory.
The silence contract
Most days the right answer is nothing — that is a successful pulse.
- With
--quiet (scheduled): if no signal clears the bar, print exactly NO_SIGNAL and
nothing else, so wrappers can suppress output. Never lower the bar to have something to say.
- Interactive: a human asked, so answer — give the best available item, honestly labeled
("nothing urgent; the most useful thing I see is ..."), or a two-line all-clear.