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.
npx claudepluginhub wotai-dev/woterclip --plugin woterclipThis skill uses the workspace's default tool permissions.
Execute the WoterClip heartbeat cycle: pick up assigned Linear issues, resolve the right persona, do the work, and report back with structured comments.
Displays 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.
Resumes unfinished human-in-the-loop work like handovers, incomplete grills, and mid-draft tasks from GitHub issues using /pickup command.
Interact with Paperclip API to manage tasks, coordinate agents, follow governance: check assignments, update status, delegate, post comments, manage routines. For coordination only.
Share bugs, ideas, or general feedback.
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.