From woterclip
Executes WoterClip heartbeat: loads config, checks locks/quiet hours, fetches/sorts assigned Linear issues by status/priority, picks top issue, invokes persona, completes work, reports with structured comments.
How this skill is triggered — by the user, by Claude, or both
Slash command
/woterclip:heartbeatThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Execute the WoterClip heartbeat cycle: pick up assigned Linear issues, resolve the right persona, do the work, and report back with structured comments.
Execute the WoterClip heartbeat cycle: pick up assigned Linear issues, resolve the right persona, do the work, and report back with structured comments.
Arguments:
--dry-run — Show what would be picked up without doing work--persona <name> — Only pick issues matching a specific personaReference files (consult as needed during execution):
${CLAUDE_PLUGIN_ROOT}/references/comment-format.md — Comment templates and rules${CLAUDE_PLUGIN_ROOT}/references/label-conventions.md — Label lifecycle and read-modify-write pattern${CLAUDE_PLUGIN_ROOT}/references/status-mapping.md — Linear states, sort order, inbox filtering.woterclip/config.yaml. If missing, stop and instruct the user to run /woterclip-init..woterclip/.heartbeat-lock.
stale_lock_hours old → stop with message: "Previous heartbeat still active. Skipping."stale_lock_hours → delete it, log: "Cleaned stale lockfile."Check quiet hours: if quiet_hours.enabled and current time is within the quiet window:
behavior: "skip" → delete lockfile and exit with message: "Quiet hours active. Skipping."behavior: "triage-only" → proceed but only load Orchestrator persona (skip worker personas in step 3).mcp__claude_ai_Linear__list_issues with filter for assigned issues (assignee: "me").agent-blocked issues unless new human comments exist since the last agent comment (check via mcp__claude_ai_Linear__list_comments)agent-working labels: if an issue has agent-working but no heartbeat comment within stale_lock_hours, clean the stale label (remove agent-working, post cleanup comment).--persona <name> flag is set, filter to only issues matching that persona's label.--dry-run, report what would be picked and exit:
Dry run — would pick:
WOT-XX [backend] "Issue title" (In Progress, High)
Queue:
WOT-YY [frontend] "Other issue" (Todo, Medium)
personas map in config.is_default: true (typically Orchestrator)..woterclip/<persona.path>/:
SOUL.md → inject into context as identity instructionsTOOLS.md → inject into context as tool guidanceconfig.yaml → read runtime settingsApply runtime config from persona's config.yaml:
model — note the target model (informational; cannot switch mid-session)thinking_effort — apply if supportedmax_turns — respect as work budgetenable_chrome — note for browser-dependent tasksRead required_tools from persona config. For each entry, verify the tool prefix is available:
mcp__claude_ai_Linear should match any tool starting with mcp__claude_ai_Linear__agent-blocked label (read-modify-write)agent-working if presentmcp__claude_ai_Linear__get_issue to read the issue's current labels.agent-working is already present (from a previous heartbeat on same issue), proceed without re-saving.agent-working to the labels array and call mcp__claude_ai_Linear__save_issue with the full label set.mcp__claude_ai_Linear__get_issue and mcp__claude_ai_Linear__list_comments.Heartbeat #N pattern. Next comment will be #N+1. If none found, start at #1.Follow the persona's SOUL.md instructions. This step varies by persona:
Orchestrator persona: Triage the issue – apply persona labels, create sub-issues, or escalate. Never write code.
CEO persona: Make strategic decisions – prioritization, scope, architecture, coordination. Never write code.
Worker personas (backend, frontend, etc.):
mcp__claude_ai_Linear__save_issue with parentId set to current issue, team from config, and appropriate persona labelsmax_turns from persona config as a work budgetIf Linear MCP becomes unavailable mid-work: Stop immediately. Leave agent-working label in place (will be cleaned as stale on next heartbeat). Delete lockfile and exit with error log.
Post a structured comment on the Linear issue via mcp__claude_ai_Linear__save_comment.
Follow the comment format from ${CLAUDE_PLUGIN_ROOT}/references/comment-format.md:
Heartbeat #N counter (incremented from step 7)linear.user_name)Append heartbeat metadata to .woterclip/heartbeat-log.jsonl:
{"heartbeat": N, "timestamp": "ISO", "issue": "WOT-XX", "persona": "name", "duration_sec": N, "status": "in_progress|completed|blocked", "actions": ["description"]}
Read the issue's current labels via mcp__claude_ai_Linear__get_issue, then update based on outcome:
| Outcome | Labels | Status |
|---|---|---|
| Completed | Remove agent-working | Move to Done (or In Review if PR opened) |
| Blocked | Remove agent-working, add agent-blocked | Keep In Progress |
| More work needed | Keep agent-working | Keep In Progress |
For blocked issues: include the Board user's display name in the comment text (e.g., "@Alex Kim — please review").
max_issues_per_heartbeat, return to Step 2 to pick the next issue.npx claudepluginhub wotai-dev/woterclip --plugin woterclipDisplays WoterClip status: schedule, last heartbeat with persona/issue/outcome, recent Linear issue changes (completed/in-progress/blocked/new), todo queue by persona/priority, blocked items. Supports --history flag.
Manage Linear issues, projects, and teams using MCP tools, Linear CLI via Bash, or scripts with secure Varlock API key handling.
Resumes unfinished work from previous handovers or directly claims GitHub issues via /pickup. Interactive flow when starting a new session.