Finishing a Development Branch
obra/superpowers
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.
Fetch PR review comments, address each one in code, and post resolution replies
$ npx skills add matthiasn/lotti --skill review-comments -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install matthiasn/lotti review-comments --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "review-comments" agent skill from https://github.com/matthiasn/lotti/tree/main/.claude/skills/review-comments into .claude/skills/review-comments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-comments", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/matthiasn/lotti/tree/main/.claude/skills/review-commentsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add matthiasn/lotti --skill review-comments -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install matthiasn/lotti review-comments --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/matthiasn/lotti.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/review-comments .agents/skills/review-comments && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "review-comments" agent skill from https://github.com/matthiasn/lotti/tree/main/.claude/skills/review-comments into .agents/skills/review-comments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-comments", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add matthiasn/lotti --skill review-comments -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install matthiasn/lotti review-comments --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/matthiasn/lotti.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/review-comments .cursor/skills/review-comments && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "review-comments" agent skill from https://github.com/matthiasn/lotti/tree/main/.claude/skills/review-comments into .cursor/skills/review-comments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-comments", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/matthiasn/lotti.git --path .claude/skills/review-comments--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add matthiasn/lotti --skill review-comments -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install matthiasn/lotti review-comments --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/matthiasn/lotti.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/review-comments .gemini/skills/review-comments && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "review-comments" agent skill from https://github.com/matthiasn/lotti/tree/main/.claude/skills/review-comments into .gemini/skills/review-comments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-comments", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install matthiasn/lotti review-commentsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add matthiasn/lotti --skill review-comments -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/matthiasn/lotti.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/review-comments .github/skills/review-comments && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "review-comments" agent skill from https://github.com/matthiasn/lotti/tree/main/.claude/skills/review-comments into .github/skills/review-comments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-comments", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add matthiasn/lotti --skill review-comments -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install matthiasn/lotti review-comments --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/matthiasn/lotti.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/review-comments .opencode/skills/review-comments && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "review-comments" agent skill from https://github.com/matthiasn/lotti/tree/main/.claude/skills/review-comments into .opencode/skills/review-comments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "review-comments", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
review-commentsFetch PR review comments, address each one in code, and post resolution replies
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.
7 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 2a438d2. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
ghjqFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
api.codecov.ioFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from matthiasn/lotti at commit 2a438d2, republished under its GPL-3.0 licence (© matthiasn). 1,171 words, ~2,562 tokens.
.claude/skills/review-comments/SKILL.md (or your agent's skills folder).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.
Fetch comments — use gh api to get all review comments:
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.
Understand each comment — read the referenced file and line to understand the concern. Group related comments if they touch the same issue.
Address each comment — make the appropriate code change (fix, refactor, add docs, add tests). If you disagree with a suggestion, prepare a clear rationale.
Reply to each comment — post a reply using:
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.
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):
# 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:
fvm flutter test --coverage <the test dirs that exercise the diff>
# parse coverage/lcov.info: DA:<line>,0 == uncoveredRun 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.
Verify — run analyzer and affected tests to confirm all changes compile and pass.
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:
gh pr view <n> --json mergeable is MERGEABLEpending and zero failures, including codecov/patchPushing 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:
# 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:
# `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".
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
Just SKILL.md in .claude/skills/review-comments of matthiasn/lotti.
Open the folder on GitHubat commit 2a438d2
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Review Comments this skillmatthiasn/lotti | 1.2k | — | ~2.6k | Automated safety check: Pass | GPL-3.0 | |
| Finishing a Development Branchobra/superpowers | 297k | 5 repos | ~1.9k | Automated safety check: Pass | MIT | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Check PRonyx-dot-app/onyx | 32k | 2 repos | ~2.3k | Automated safety check: Pass | MIT | |
| PR Design DocOpenHands/OpenHands | 90k | — | ~2.4k | Automated safety check: Pass | MIT | |
| WooCommerce Code Reviewwoocommerce/woocommerce | 11k | 3 repos | ~1.1k | Automated safety check: Pass | Custom licence |
obra/superpowers
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.
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
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.
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…
woocommerce/woocommerce
Reviews WooCommerce code changes against the project's standards, flagging backend PHP architecture, naming, documentation, data integrity and testing violations.
payloadcms/payload
A skill your agent uses when a Payload pull request needs a concise visual walkthrough for reviewers.
matthiasn/lotti
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…
matthiasn/lotti
Maintain a Docusaurus product manual whose prose, navigation, localized page trees, screenshots, coverage metadata, and release build must stay aligned with the application.
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.
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.
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…
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.
Categories
Fetch PR review comments, address each one in code, and post resolution replies. Review Comments is an agent skill from matthiasn/lotti.
Review Comments fits situations like: tasks that involve Pull requests.
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.
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.
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.
Going by SKILL.md and its folder, Review Comments needs the command-line tools its instructions call (gh and jq).
SKILL.md names 1 domain. As links in the text: api.codecov.io. This is read from the text; nothing was executed.
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.
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.
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.
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.
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.