From manifest-dev
Executes one iteration of PR tending: reads state, classifies comments/CI failures, routes fixes via manifest amendment or direct babysitting, handles merges/conflicts.
npx claudepluginhub doodledood/manifest-dev --plugin manifest-devThis skill uses the workspace's default tool permissions.
Execute one iteration of PR tending: read current state, classify new events, route fixes, update PR, report status. Designed to be called repeatedly by `/loop`.
Tends PRs to merge-readiness: classifies comments (bot/human, actionable/FP), fixes via manifest amendment or babysit mode, tends CI, syncs description, confirms before merge.
Autonomously resolves PR merge blockers: conflicts, CI failures, review comments; syncs description and requests re-review. For unattended cron execution via loop skill.
Monitors PR health on recurring schedules: merge conflicts, CI/CD failures in GitHub Actions/Buildkite/Vercel/Fly.io, review comment triage/resolution, merge readiness. One-shot triage mode.
Share bugs, ideas, or general feedback.
Execute one iteration of PR tending: read current state, classify new events, route fixes, update PR, report status. Designed to be called repeatedly by /loop.
$ARGUMENTS = <pr-number> <mode> [<manifest-path> <log-path>]
<pr-number>: Required. The PR to tend.<mode>: manifest or babysit.<manifest-path> and <log-path>: Required when mode is manifest. Path to the manifest and execution log.If arguments missing or malformed: error and halt with usage message.
Use a lock file at /tmp/tend-pr-lock-{pr-number}. Skip this iteration if the lock exists and isn't stale (significantly older than the expected polling interval). Remove stale locks. Create the lock at iteration start, remove at end.
Read the PR's current state: open/closed/merged/draft, new comments since last check, CI status, review status, unresolved threads.
Terminal states:
STOP: mergedSTOP: closedSTOP: draftNothing new → Remove lock. Output: SKIP: nothing new
Label source first (bot vs human — read ../tend-pr/references/known-bots.md), then classify intent (read ../tend-pr/references/classification-examples.md):
Compare against base branch first:
Manifest mode: For actionable items (review comments or CI failures), determine affected deliverable(s) — for comments, examine what files/code the comment targets; for CI failures, analyze the failure output to identify which code caused it. Match against the manifest's deliverable structure (include all potentially affected when ambiguous). Amend manifest via /define --amend <manifest-path> --from-do, then invoke /do <manifest-path> <log-path> --scope <affected-deliverable-ids>. If /do escalates, log the blocker and output: STOP: escalation — <reason>. Push changes and reply to the comment.
Babysit mode: Fix directly, push, reply.
False positives: Reply with explanation. Resolve bot threads, leave human threads open.
Uncertain: Reply asking for clarification, leave thread open.
Update the PR branch by merging the base branch in. Prefer merge over rebase to preserve review comment history (see Gotchas). Flag ambiguous conflicts to the user.
After changes, rewrite "what changed" sections to reflect the current diff. Preserve manual context (issue references, motivation, deployment notes). Update title if scope changed significantly.
Append to /tmp/tend-pr-log-{pr-number}.md: timestamp, actions taken, skipped items, remaining blockers, current PR state.
When the PR's merge state indicates it is mergeable (all required checks pass, required approvals obtained, no unresolved threads including uncertain, no pending /do runs) — output: STOP: merge-ready
Determine merge requirements from the platform's merge state (e.g., GitHub branch protection rules), not hardcoded assumptions about what's required.
Stale thread escalation: If an uncertain comment has received no reply for several consecutive iterations, or an actionable comment was fixed (pushed + replied) but the thread remains unresolved for several consecutive iterations, escalate to the user: "Thread from @reviewer unresolved for [duration]: [uncertain — no reply / fixed — awaiting reviewer resolution]. Continue waiting, resolve, or ping reviewer?"
Every iteration MUST end with exactly one of these outputs (consumed by /tend-pr or /loop):
SKIP: nothing new — No changes detected, iteration skipped.STOP: merged — PR was merged externally.STOP: closed — PR was closed.STOP: draft — PR converted to draft.STOP: merge-ready — All conditions met, ready for user to merge.STOP: escalation — <reason> — /do escalated or unresolvable blocker.CONTINUE — Work done, loop should continue.STOP: escalation — PR has empty diff