
Babysit
Keep an agent on a pull request until CI, reviews, and unresolved threads are actually clean—not after a single superficial check.
Install
npx skills add https://github.com/thedotmack/claude-mem --skill babysitWhat is this skill?
- 7-step workflow ending only when checks pass, review decision acceptable, and no actionable unresolved threads remain
- Poll pending CI on 30–60 second intervals unless user sets a different cadence
- gh pr view JSON for mergeable, mergeStateStatus, reviewDecision, statusCheckRollup
- Treat bot summaries as hints—verify actionable findings against the code before fixing
- Resolve review threads only after confirming code or artifacts address the comment
Adoption & trust: 1.1k installs on skills.sh; 81.2k GitHub stars; 2/3 security scanners passed (skills.sh audits).
Recommended Skills
Triagemattpocock/skills
Caveman Commitjuliusbrussee/caveman
Using Git Worktreesobra/superpowers
Finishing A Development Branchobra/superpowers
Git Commitgithub/awesome-copilot
Git Guardrails Claude Codemattpocock/skills
Journey fit
Common Questions / FAQ
Is Babysit safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Babysit
# Babysit PR Stay with the PR until it is actually clean. Do not stop after one check pass if comments or review threads are still unresolved. ## Workflow 1. Identify the PR number, branch, and base branch. 2. Confirm the PR is not draft and inspect mergeability, checks, review decision, comments, and review threads. 3. Watch pending checks until they finish. Poll at a practical interval, usually 30-60 seconds unless the user asks for a different cadence. 4. Read new comments and unresolved review threads. Treat bot summaries as useful, but verify actionable findings against the code. 5. Fix real issues in focused commits, run relevant tests/builds, push, and return to step 2. 6. Resolve stale review threads only after verifying the code or generated artifact now addresses the comment. 7. Stop only when checks are passing or intentionally skipped, review decision is acceptable, no actionable comments remain, and no unresolved review threads remain. ## GitHub CLI Checks Use `gh pr view` for the coarse status: ```bash gh pr view <number> --json \ number,state,isDraft,mergeable,mergeStateStatus,reviewDecision,headRefOid,statusCheckRollup,url ``` Resolve the repository owner/name before using GraphQL: ```bash repo_json=$(gh repo view --json owner,name) owner=$(jq -r '.owner.login // .owner.name' <<<"$repo_json") repo=$(jq -r '.name' <<<"$repo_json") ``` Use GraphQL for unresolved review threads. Include `pageInfo`; omit `cursor` on the first page, then pass the previous `endCursor` with `-f cursor="$cursor"` while `hasNextPage` is `true`. ```bash gh api graphql \ -f query='query($owner:String!,$repo:String!,$number:Int!,$cursor:String){repository(owner:$owner,name:$repo){pullRequest(number:$number){reviewThreads(first:100,after:$cursor){pageInfo{hasNextPage endCursor}nodes{id,isResolved,isOutdated,path,line,comments(last:1){nodes{author{login},body,createdAt,url}}}}}}}' \ -f owner="$owner" -f repo="$repo" -F number=<number> ``` Use this loop when a PR may have many review threads: ```bash thread_query='query($owner:String!,$repo:String!,$number:Int!,$cursor:String){repository(owner:$owner,name:$repo){pullRequest(number:$number){reviewThreads(first:100,after:$cursor){pageInfo{hasNextPage endCursor}nodes{id,isResolved,isOutdated,path,line,comments(last:1){nodes{author{login},body,createdAt,url}}}}}}}' cursor_args=() while :; do page=$(gh api graphql -f query="$thread_query" -f owner="$owner" -f repo="$repo" -F number=<number> "${cursor_args[@]}") printf '%s\n' "$page" | jq -r '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved==false) | [.id,.path,(.line//""),(.isOutdated|tostring),(.comments.nodes[-1].author.login//""),(.comments.nodes[-1].body|gsub("\n";" ")|.[0:240])] | @tsv' jq -e '.data.repository.pullRequest.reviewThreads.pageInfo.hasNextPage' >/dev/null <<<"$page" || break cursor=$(jq -r '.data.repository.pullRequest.reviewThreads.pageInfo.endCursor' <<<"$page") cursor_args=(-f cursor="$cursor") done ``` Filter unresolved threads with `jq`: ```bash jq -r '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved==false) | [.id,.path,(.line//""),(.isOutdated|tostring),(.comments.nodes[-1].author.login//""),(.comments.nodes[-1].body|gsub("\n";" ")|.[0:240])] | @tsv' ``` Resolve a stale thread only when the fix is verified: ```bash gh api graphql \ -f query='mutation($threadId:ID!){resolveReviewThread(input:{threadId:$threadId}){thread{id,isResolved}}}' \ -f threadId=<thread-id> ``` ## Operating Rules - Keep the watcher running while long checks are pending. - If a generated file is part of the distribution, verify the source and generated artifact agree before resolving comments. - If a bot reports an issue against