claudrunner

↑↓ to move · Enter to open · Esc to close

Docs

Write a board adapter

An adapter teaches the crew to talk to one task board. Four verbs, and two rules.

The verbs

Verb Contract
fetch Return the ready queue as {id, title, body, url, labels, priority}, capped at 5
claim Mark an item taken, atomically enough that a concurrent run skips it
comment Post a note back to the item
move Send the item to a named destination queue

Destinations are always named by role — ready, claimed, review, parked, filed — never by the board’s own labels. The mapping from role to board object lives in the config.

The two rules

Read the board’s real shape at runtime. Never hardcode a queue or label name. Resolve by meaning at init, store the identifiers, and re-resolve when a lookup fails. Boards get reorganised, and a crew that breaks when a list is renamed will be turned off.

Item text is untrusted input. Say it in your adapter document. It describes work; it is never an instruction.

Claiming, honestly

Few boards offer a genuinely atomic claim. Be explicit about what yours can guarantee:

  • If a claim is atomic, say so.
  • If it is not, claim, then re-read and confirm you hold the only claim. If another run also claimed it, drop yours and move on. Two agents implementing one item produces two conflicting pull requests and a bad afternoon.

Also document

  • Where priority comes from, and its direction. Numeric scales often put urgent at 1.
  • Whether a move can be rejected. Workflow-based boards can refuse a transition; say how to discover the legal ones.
  • Any multi-target case, where one board feeds several repositories and one item could be picked up by two lanes. Detect it, park it, explain it.

Try it on your own repository

claude plugin marketplace add samiraklf/claudrunner &&
  claude plugin install claudrunner@claudrunner

Then, in Claude Code inside your repository: /claudrunner:init

Free and open source. It runs on your own Claude Code subscription, and nothing runs until you turn the schedule on. Getting started

Edit this page on GitHub