Agent skill

Review Comments

by matthiasn in matthiasn/lotti

Fetch PR review comments, address each one in code, and post resolution replies

GPL-3.0Auto-check passedDevelopment

Install Review Comments

skills CLI
$ npx skills add matthiasn/lotti --skill review-comments -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install matthiasn/lotti review-comments --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/matthiasn/lotti.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/review-comments .claude/skills/review-comments && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
review-comments
GitHub stars
1.2k
Token cost
~2.6k tokens
SKILL.md length
1,171 words
Files
1
Skills in repo
10
Repo updated
First seen
Licence
GPL-3.0

At a glance

Fetch PR review comments, address each one in code, and post resolution replies

  • Works in 7 steps: Fetch comments — use gh api to get all… → Understand each comment — read the… → Address each comment — make the… → …
  • Tasks that involve Pull requests
  • SKILL.md covers Steps and Guidelines
  • Calls gh and jq

What it does

Review Comments is an agent skill from matthiasn/lotti. Fetch PR review comments, address each one in code, and post resolution replies

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Pull requests. The repository describes itself as: A private logbook with a staff of personal AI assistants. Agents read what you record and propose what to do next — you approve the changes. End-to-end encrypted sync between… The licence is GPL-3.0.

When your agent uses it

  • Tasks that involve Pull requests

Example prompts

  • “/review-comments”

Workflow steps

7 steps, taken from the first numbered list in SKILL.md.

  1. Fetch comments — use gh api to get all review comments
  2. Understand each comment — read the referenced file and line to understand
  3. Address each comment — make the appropriate code change (fix, refactor,
  4. Reply to each comment — post a reply using
  5. Close every codecov gap — target 100% patch coverage. The Codecov bot
  6. Verify — run analyzer and affected tests to confirm all changes compile
  7. Babysit the PR until it is actually done. Opening a PR and replying once

What it can do on your machine

Read from SKILL.md and the folder at commit 2a438d2. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • gh
    • jq

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • api.codecov.io

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Review Comments loads about 2.6k tokens when it runs. Until then it costs about 24 tokens; SKILL.md has 1,171 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~24
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from matthiasn/lotti at commit 2a438d2, republished under its GPL-3.0 licence (© matthiasn). 1,171 words, ~2,562 tokens.

Download SKILL.mdSave it as .claude/skills/review-comments/SKILL.md (or your agent's skills folder).
name
review-comments
description
Fetch PR review comments, address each one in code, and post resolution replies
argument-hint
[pr-number]

Review PR Comments

Fetch all review comments from a pull request, address each one (fix code, add docs, or explain the rationale), and reply to each comment on GitHub with the resolution.

Steps

  1. Fetch comments — use gh api to get all review comments:

    bash
    gh api repos/{owner}/{repo}/pulls/$ARGUMENTS/comments \
      --jq '.[] | {id, path, line, body, in_reply_to_id}'

    Filter to top-level comments only (in_reply_to_id == null) — those are the ones that need responses.

  2. Understand each comment — read the referenced file and line to understand the concern. Group related comments if they touch the same issue.

  3. Address each comment — make the appropriate code change (fix, refactor, add docs, add tests). If you disagree with a suggestion, prepare a clear rationale.

  4. Reply to each comment — post a reply using:

    bash
    gh api repos/{owner}/{repo}/pulls/$ARGUMENTS/comments -X POST \
      -f body="<resolution>" \
      -F in_reply_to=<comment-id>

    Keep replies concise: state what was done (e.g., "Fixed. Replaced generic fallback with explicit throw.") or explain why it was left as-is.

  5. Close every codecov gap — target 100% patch coverage. The Codecov bot posts a PR comment/check; treat its uncovered lines as review comments that MUST be resolved with tests. Every line codecov marks uncovered has to be covered — no exceptions for "pre-existing" files. If a file shows up in the PR diff with uncovered lines, cover them even if you didn't write them.

    a. Find what's actually uncovered. The bot summary only gives totals; pull the per-line data from the Codecov API and intersect it with the PR's added lines (this is exactly what codecov/patch scores):

    bash
    # Per-line diff coverage (head_cov == 0 → miss):
    curl -s "https://api.codecov.io/api/v2/github/{owner}/repos/{repo}/compare?pullid=$ARGUMENTS" \
      > /tmp/cc.json
    # Then: for each file with has_diff, list lines where
    #   coverage.head == 0 && is_diff, and intersect with the file's
    #   git-diff added-line numbers (git diff --unified=0 origin/main...HEAD).

    Codecov ignores are in codecov.yml (*.g.dart, *.freezed.dart, l10n/*.dart here) — skip those.

    b. Codecov is often stale/partial — trust local coverage for new code. Coverage is sharded; if any shard failed or the run is mid-flight, the bot shows a partial picture (e.g. "1% of diff") that inflates the miss list with trivial lines (@override, const ctors). Regenerate locally and intersect with the git-diff added lines for the authoritative set:

    bash
    fvm flutter test --coverage <the test dirs that exercise the diff>
    # parse coverage/lcov.info: DA:<line>,0 == uncovered

    Run enough test dirs that every diff file is genuinely exercised (a file covered only by tests you didn't run shows as a false miss).

    c. Write real tests for each uncovered line — mirror the sibling case already tested (e.g. a new .map/switch arm → copy the aiConfig case for savedTaskFilter; a debounce-cancel line → emit two notifications so the timer is non-null when cancelled). Extend parameterized variantCases/variantsByBucket tables rather than duplicating whole test bodies.

    d. Uncoverable private-ctor lines (const FooKeys._(); in a static-only keys class) can't be hit and dart coverage ignores no inline comment — convert the class to abstract final class FooKeys { ... } so the constructor line disappears entirely.

    e. Re-run coverage until the (added ∩ uncovered) set is empty, then run the affected suites to confirm still-green.

  6. Verify — run analyzer and affected tests to confirm all changes compile and pass.

  7. Babysit the PR until it is actually done. Opening a PR and replying once is not the end of the job. A PR is finished only when all three hold at the same time:

    • mergeable — gh pr view <n> --json mergeable is MERGEABLE
    • all green — every check passed, not merely "not failing": zero pending and zero failures, including codecov/patch
    • all replied — every top-level review comment has a reply, with a real fix or a stated reason for declining

    Pushing requires authorization. Commits, rebases and pushes need explicit user or orchestrator approval (AGENTS.md, "Issue Tracking"). Being asked to address review comments authorizes the code changes, not the push — confirm before the first push of a session, and never force-push a branch you did not create in this session. --force-with-lease guards against clobbering a concurrent update; it is not a substitute for approval.

    Reviews arrive after pushes, so pushing fixes restarts the loop: the reviewer re-reviews the new commit and may file new findings. Bots also rate-limit and arrive late (CodeRabbit will say "next review available in N minutes" and skip the run entirely). Keep watching until the three conditions hold together.

    Poll on the structured status rather than the display columns — the table format is human-facing, and a failed API or auth call prints to stderr and would otherwise read as "no pending checks".

    Note gh pr checks has no --json flag (checked on gh 2.45); the structured source is gh pr view --json statusCheckRollup. Verify whatever command you poll with actually works before wrapping it in an until loop: a command that errors makes the loop exit immediately and every subsequent report a lie.

    For a CheckRun, status is the lifecycle (COMPLETED) and conclusion carries the verdict (SUCCESS / FAILURE / CANCELLED) — a failed check is COMPLETED, so keying on status alone reports a red run as done and green. Read the conclusion for completed checks and the state for StatusContexts:

    bash
    # one "<verdict>\t<name>" line per check; empty output means the query
    # failed, not that everything passed — so treat it as not-done.
    rollup() {
      gh pr view "$1" --json statusCheckRollup --jq '
        .statusCheckRollup[]
        | if .status == "COMPLETED" then .conclusion
          elif .status then .status
          else .state end
        + "\t" + (.name // .context)'
    }
    # Capture once per iteration and check the exit status: an errored or
    # empty result is "not done", never "done and green".
    while :; do
      out=$(rollup <n>) || { echo "poll failed"; sleep 30; continue; }
      [ -n "$out" ] || { echo "empty rollup — treating as not done"; sleep 30; continue; }
      printf '%s\n' "$out" | grep -qE '^(IN_PROGRESS|QUEUED|PENDING)' || break
      sleep 30
    done
    bad=$(printf '%s\n' "$out" | grep -vE '^(SUCCESS|NEUTRAL|SKIPPED)')
    [ -z "$bad" ] && echo "all green (${#out} bytes of verdicts)" || printf '%s\n' "$bad"

    Three ways these snippets lie if written casually, all worth guarding: an errored command inside $( ) yields empty output that a grep -q pending reads as "nothing pending"; grep … || echo "all green" turns no output at all into a pass; and a background poller whose result is never collected lets the summary be written before it finishes. Capture the output, check the status, and wait for the poller before reporting.

    Cross-check the total against gh pr checks <n> before declaring green — a poller that exits on its first iteration otherwise reports "settled" while checks are still queued.

    Run that in the background (run_in_background: true, or … & with the PID kept) so replying to comments proceeds concurrently rather than blocking on CI.

    Then re-check for comments filed against the new commits — including top-level ones with no reply yet:

    gh api returns one page (30 comments) unless --paginate is passed, and --jq then runs per page — so a comment and its reply landing on different pages makes an answered comment look unanswered, and a comment on a later page look absent. Fetch every page and aggregate once with jq -s:

    bash
    # `set -o pipefail` so an API failure fails the pipeline instead of
    # producing an empty list that reads as "nothing unanswered".
    ( set -o pipefail
      gh api --paginate repos/{owner}/{repo}/pulls/<n>/comments --jq '.[]' | jq -s -r '
        [.[] | select(.in_reply_to_id != null) | .in_reply_to_id] as $replied
        | [.[] | select(.in_reply_to_id == null)] as $top
        | "top-level: \($top | length), answered: \([$top[] | select(.id as $i | $replied | index($i))] | length)",
          ($top[] | select(.id as $i | ($replied | index($i)) | not)
           | "UNANSWERED \(.id) \(.user.login) \(.path)")'
    ) || echo "comment query FAILED — do not report all-replied"

    Print the counted totals, not just the unanswered lines: "top-level: 26, answered: 22" is checkable, whereas empty output is indistinguishable from a query that never ran.

    Post replies with -F body=@file rather than an inline shell string. Review bodies contain backticks, quotes and code fences; nested shell quoting silently mangles them, and a failed POST inside a loop can still look like it succeeded.

    Report the real state — "27 pass, 1 pending" is the honest answer while a check is still running, not "all green".

Show full SKILL.md (88 more words)Show less

Guidelines

  • Address every comment.
  • Make real code fixes, not just reply text.
  • Run the analyzer and formatter after all fixes.
  • Run affected tests to verify fixes.
  • Keep reply text concise and factual.
  • If a comment is from a bot review (e.g., CodeRabbit, Gemini), still address valid points but use your judgement on noise.
  • Coverage is not optional: every codecov-flagged line in the diff must end up covered (goal 100% patch), pre-existing or not. Prefer real behavioural tests; only restructure code (e.g. abstract final class) for genuinely uncoverable lines.

© matthiasn, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/review-comments of matthiasn/lotti.

Open the folder on GitHubat commit 2a438d2

Compare with similar skills

Review Comments next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Review Comments compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Review Comments this skillmatthiasn/lotti1.2k—~2.6kAutomated safety check: PassGPL-3.0
Finishing a Development Branchobra/superpowers297k5 repos~1.9kAutomated safety check: PassMIT
PR Babysitteropeninterpreter/openinterpreter69k3 repos~4.2kAutomated safety check: PassApache-2.0
Check PRonyx-dot-app/onyx32k2 repos~2.3kAutomated safety check: PassMIT
PR Design DocOpenHands/OpenHands90k—~2.4kAutomated safety check: PassMIT
WooCommerce Code Reviewwoocommerce/woocommerce11k3 repos~1.1kAutomated safety check: PassCustom licence

Similar skills

  • Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.

    297k GitHub starsUsed in 5 repos~1.9k tokens
    DevelopmentAuto-check passed
  • PR Babysitter

    openinterpreter/openinterpreter

    Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.

    69k GitHub starsUsed in 3 repos~4.2k tokens
    DevelopmentAuto-check passed
  • Check PR

    onyx-dot-app/onyx

    Checks a GitHub, GitLab, or Perforce (p4) pull request (or merge request, or shelved changelist) for unresolved review comments, failing status checks, and incomplete PR descriptions.

    32k GitHub starsUsed in 2 repos~2.3k tokens
    DevelopmentAuto-check passed
  • PR Design Doc

    OpenHands/OpenHands

    For a non-trivial pull request, write a self-contained HTML design doc under the temporary .pr/ directory and link a visibility-appropriate preview in the PR description, so maintainers grasp the…

    90k GitHub stars~2.4k tokensUpdated today
    DevelopmentAuto-check passed
  • WooCommerce Code Review

    woocommerce/woocommerce

    Reviews WooCommerce code changes against the project's standards, flagging backend PHP architecture, naming, documentation, data integrity and testing violations.

    11k GitHub starsUsed in 3 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Record PR Demo

    payloadcms/payload

    A skill your agent uses when a Payload pull request needs a concise visual walkthrough for reviewers.

    45k GitHub stars~1k tokensUpdated yesterday
    DevelopmentAuto-check passed

More from matthiasn/lotti

All 10 skills in this repo
  • Add, complete, or audit a locale across a Flutter application's ARB catalogs and a localized Docusaurus manual, including generated localization code, locale selectors, native platform declarations…

    1.2k GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Maintain a Docusaurus product manual whose prose, navigation, localized page trees, screenshots, coverage metadata, and release build must stay aligned with the application.

    1.2k GitHub stars~930 tokensUpdated today
    Auto-check passed
  • App Screenshots

    matthiasn/lotti

    Capture in-app screenshots of a widget or flow at mobile + desktop sizes — offline, deterministic, real fonts and icons — using the reusable screenshot harness.

    1.2k GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • Beads

    matthiasn/lotti

    A skill your agent uses for authorized Lotti maintainer work that needs private durable task tracking, issue dependencies, blocker management, multi-session handoff, or shared agent memory.

    1.2k GitHub stars~589 tokensUpdated today
    Auto-check passed
  • Design Review Panel

    matthiasn/lotti

    Run a multi-agent design review on a UI surface — capture reproducible baseline screenshots, then rate them with a panel of design experts (one agent per craft dimension) and, optionally, a panel of…

    1.2k GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Release

    matthiasn/lotti

    Cut a Lotti release — assemble the changelog.d/ fragments into CHANGELOG.md and the Flathub metainfo, bump the version, open the release PR, then tag.

    1.2k GitHub stars~2.6k tokensUpdated today
    Auto-check passed

Categories

Questions about Review Comments

What does Review Comments do?

Fetch PR review comments, address each one in code, and post resolution replies. Review Comments is an agent skill from matthiasn/lotti.

When should I use Review Comments?

Review Comments fits situations like: tasks that involve Pull requests.

How do I install Review Comments in Claude Code?

Run `npx skills add matthiasn/lotti --skill review-comments -a claude-code`. Or copy the skill folder (.claude/skills/review-comments in matthiasn/lotti) into .claude/skills/review-comments in your project. Claude Code loads it when a task matches its description.

How do I install Review Comments in Codex?

Run `npx skills add matthiasn/lotti --skill review-comments -a codex`. Or copy the skill folder (.claude/skills/review-comments in matthiasn/lotti) into .agents/skills/review-comments in your project. Codex loads it when a task matches its description.

Can I use Review Comments in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add matthiasn/lotti --skill review-comments -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/review-comments, .gemini/skills/review-comments, .github/skills/review-comments and .opencode/skills/review-comments in your project.

What does Review Comments need to run?

Going by SKILL.md and its folder, Review Comments needs the command-line tools its instructions call (gh and jq).

Does Review Comments access the network?

SKILL.md names 1 domain. As links in the text: api.codecov.io. This is read from the text; nothing was executed.

Is Review Comments safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Review Comments use?

Review Comments is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Review Comments use?

About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Review Comments?

Skills that share tags, products or a category with Review Comments: Finishing a Development Branch (obra/superpowers, 297k stars), PR Babysitter (openinterpreter/openinterpreter, 69k stars), Check PR (onyx-dot-app/onyx, 32k stars) and PR Design Doc (OpenHands/OpenHands, 90k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Review Comments?

matthiasn (a GitHub user) maintains it in matthiasn/lotti, which has 1,199 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 9, 2026.

Source: matthiasn/lotti on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.