Agent skill

Concern Review

by meain in meain/dotfiles

Generate an interactive local HTML review page for a large PR or diff, grouping the changed files by logical concern (not just by file) so a reviewer can go through one theme at a time instead of a…

MITAuto-check passedDevelopment

Install Concern Review

skills CLI
$ npx skills add meain/dotfiles --skill concern-review -a claude-code

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

GitHub CLI
$ gh skill install meain/dotfiles concern-review --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/meain/dotfiles.git skills-src && mkdir -p .claude/skills && cp -r skills-src/agents/.agents/skills/concern-review .claude/skills/concern-review && 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
concern-review
GitHub stars
285
Token cost
~2.2k tokens
SKILL.md length
1,068 words
Files
5 (incl. scripts)
Skills in repo
35
Repo updated
First seen
Licence
MIT

At a glance

Generate an interactive local HTML review page for a large PR or diff, grouping the changed files by logical concern (not just by file) so a reviewer can go through one theme at a time instead of a…

  • Works in 9 steps: Get the diff into a file → Get the authoritative hunk map → Read the diff to understand the change → …
  • Tasks that involve CSV and tabular files
  • SKILL.md covers The one rule that makes this…, Steps, What the template already… and Testing changes to this skill
  • Runs Python scripts from its folder; calls python3, git and npm

What it does

Concern Review is an agent skill from meain/dotfiles. Generate an interactive local HTML review page for a large PR or diff, grouping the changed files by logical concern (not just by file) so a reviewer can go through one theme at a time instead of a flat file list. Each concern gets its own section with a description, per-file summaries, the real diff (sliced to just the hunks relevant to that concern when a file serves more than one), and callouts for anything genuinely non-obvious. Triggers: /concern-review, "review this PR by concern", "review this large PR"…

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including scripts (for example `scripts/build_review.py`, `scripts/diffsplit.py` and `scripts/list_hunks.py`).

It sits in Development, covering CSV and tabular files. The repository describes itself as: If there is a shell, there is a way! The licence is MIT.

When your agent uses it

  • Tasks that involve CSV and tabular files

Example prompts

  • “review this PR by concern”
  • “review this large PR”
  • “build a review dashboard”
  • “/concern-review”

Requirements

  • Python 3
  • Node.js

Workflow steps

9 steps, taken from the step headings in SKILL.md.

  1. Get the diff into a file
  2. Get the authoritative hunk map
  3. Read the diff to understand the change
  4. Decide the concerns
  5. Assign files to concerns
  6. Add notes only for genuinely confusing things
  7. Write the concerns JSON
  8. Build the HTML
  9. Open it and report

What it can do on your machine

Read from SKILL.md and the folder at commit 3e336e2. 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

    Ships 3 files in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python3
    • git
    • npm

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

  • Network

    No URLs in SKILL.md. Its commands use git and npm, which can reach the network depending on how they are called.

    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

Concern Review loads about 2.2k tokens when it runs. Until then it costs about 158 tokens; SKILL.md has 1,068 words of instructions outside code blocks.

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

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); the scripts in this folder are not scanned.

SKILL.md

The full file from meain/dotfiles at commit 3e336e2, republished under its MIT licence (© meain). 1,068 words, ~2,215 tokens.

Download SKILL.mdSave it as .claude/skills/concern-review/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.
name
concern-review
description
Generate an interactive local HTML review page for a large PR or diff, grouping the changed files by logical concern (not just by file) so a reviewer can go through one theme at a time instead of a flat file list. Each concern gets its own section with a description, per-file summaries, the real diff (sliced to just the hunks relevant to that concern when a file serves more than one), and callouts for anything genuinely non-obvious. Triggers: /concern-review, "review this PR by concern", "review this large PR", "build a review dashboard", "group this diff by concern", "concern review", "help me review this PR".
user_invocable
true

concern-review

Large PRs are easier to review grouped by what the change is doing (e.g. "new retry logic", "bug fix", "reporting additions") than by a flat list of files — a file that serves two purposes should show up, sliced, in both places. This skill produces that as a static HTML page: a left sidebar to jump between concerns, one concern's files shown at a time as a single scrolling list, real unified diffs with GitHub-style coloring, and a short summary above each file's diff.

The one rule that makes this fast and safe

Your output is a small JSON blob — never the diff content itself. You decide which hunks belong to which concern and write short summaries; a Python script pulls the actual diff text from the real diff file and builds the HTML. This means:

  • Your generation is small and fast (summaries + hunk-index lists, not reproduced code).
  • The rendered diff can never be wrong/hallucinated — it's sliced mechanically from the same diff you read.

Do not paste diff hunks into the JSON. Reference them by index instead.

Steps

1. Get the diff into a file

Pick whichever applies:

bash
# GitHub PR (set GIT_DIR if the repo uses jj)
GIT_DIR=$(jj git root 2>/dev/null || echo .git) gh pr diff <number> > /tmp/<slug>.diff

# local working diff (jj)
jj diff --git -r <revision> > /tmp/<slug>.diff

# local working diff (git)
git diff <base>...<head> > /tmp/<slug>.diff

Use a short <slug> you'll reuse for the other temp files (e.g. pr5276).

2. Get the authoritative hunk map
bash
python3 ~/.claude/skills/concern-review/scripts/list_hunks.py /tmp/<slug>.diff [optional-path-substring-filter]

This prints, per file, every hunk's 0-based index, its @@ ... @@ header, and its +/- line count. These indices are what you'll reference in the JSON — don't hand-count @@ lines from the raw diff, use this output. Filter by a path substring if the diff is huge and you want one file at a time.

3. Read the diff to understand the change

Read /tmp/<slug>.diff (or grep/sed specific line ranges for very large files) to actually understand what changed — the hunk map from step 2 tells you where things are, not what they do. This is normal input-token reading; the efficiency goal is about what you write, not what you read.

4. Decide the concerns

Aim for 2-6 concerns that are genuinely distinct themes — not "misc" or one concern per file. Good concerns read like a PR description's bullet points: "new retry logic for X", "bug fix: Y", "reporting/logging additions". Each concern needs:

  • key: short kebab-slug, used in DOM ids/anchors (e.g. "vpn-retry")
  • title: human title, shown as the section heading
  • desc: one or two sentences
5. Assign files to concerns

For each file touched by a concern, add an entry:

json
{ "path": "exact/path/as/printed/by/list_hunks.py", "summary": "...", "hunks": "all" }
  • If all of a file's changes serve this one concern, use "hunks": "all" (or omit the key — that's the default).
  • If a file's hunks serve multiple concerns, list only the relevant 0-based hunk indices for each concern, e.g. "hunks": [0, 1, 4, 5]. Every hunk in the file must be assigned to exactly one concern — check the total hunk count from list_hunks.py against your combined lists so none are silently dropped or duplicated.
  • If a single hunk's lines genuinely mix two concerns (rare — usually only happens with an unrelated one-line addition riding inside a bigger hunk), assign the whole hunk to whichever concern dominates it. Don't try to split a hunk line-by-line; that produces an invalid diff.
  • summary: one to three sentences on what changed in this file, for this concern and why — not a restatement of the diff. Write it like you're telling a colleague what to look for.
6. Add notes only for genuinely confusing things

Each concern may have a "notes" array (rendered as an amber "Might be confusing" callout). Reserve these for things a careful reviewer could easily miss or misjudge: a hidden invariant, duplicated logic that could drift, an intentional-looking tradeoff, a migration/compatibility implication, two call sites solving the same problem differently. Do not add navigational notes like "the rest of this file is in another section" — the UI already makes that obvious (files are listed per-concern in the sidebar), and a prior user explicitly asked for these to be removed. If nothing is genuinely confusing, omit notes or leave it empty.

Show full SKILL.md (418 more words)Show less
7. Write the concerns JSON
json
{
  "pr": { "label": "org/repo #123", "subtitle": "TICKET-123 — short title" },
  "pathPrefix": "optional/common/path/prefix/to/strip/in/the/sidebar/",
  "categories": [
    {
      "key": "vpn-retry",
      "title": "VPN-resilience (new)",
      "desc": "One or two sentences.",
      "notes": ["Non-obvious point worth flagging.", "..."],
      "files": [
        { "path": "internal/cosmosretry/retry.go", "summary": "...", "hunks": "all" },
        { "path": "main.go", "summary": "...", "hunks": [0, 1, 4, 5] }
      ]
    }
  ]
}

Save it to /tmp/<slug>-concerns.json. pathPrefix is optional — set it to whatever common prefix (e.g. a monorepo module path) should be stripped when showing filenames in the sidebar, so internal/foo/bar.go shows instead of tools/some-service/internal/foo/bar.go.

8. Build the HTML
bash
python3 ~/.claude/skills/concern-review/scripts/build_review.py \
  --diff /tmp/<slug>.diff \
  --concerns /tmp/<slug>-concerns.json \
  --out /tmp/<slug>-review.html

The script errors out with a clear message (and the list of valid paths) if a path doesn't match anything in the diff, or if a hunks index is out of range — fix the JSON and re-run rather than guessing.

9. Open it and report
bash
open /tmp/<slug>-review.html

(use dangerouslyDisableSandbox: true for the open call). Tell the user how many concerns/files it covers in a sentence or two — don't re-narrate the whole PR in chat, the page is the review surface now.

What the template already handles

You never touch template.html's CSS/JS — it already implements everything validated across real review sessions:

  • Sidebar lists concerns and their files; clicking a concern loads only that concern's files as one continuous scroll (not a wall of every concern at once).
  • Clicking a file scrolls to it and briefly highlights it, switching concern first if needed.
  • Sidebar filenames truncate from the front (so the actual filename stays visible, not the directory prefix) — don't fight this by pre-truncating paths yourself.
  • Sidebar width is user-resizable (drag the divider) and persists across reloads.
  • Diffs render GitHub-style (green/red, line numbers, hunk headers) with per-file expand/collapse and page-wide expand/collapse-all buttons.
  • No stat tiles, charts, or metrics — a past iteration of this had a dashboard-style summary view and it was explicitly rejected in favor of seeing the actual code. Don't reintroduce metrics/charts here.

Testing changes to this skill

If you modify template.html or the scripts, verify with a headless browser before considering it done — a static review of the JS isn't enough to catch layout bugs (this skill's design went through several rounds of exactly that kind of bug). Playwright works well for this (npm install playwright in a scratch dir, then drive it with a small node script); screenshot at least the default concern and one concern with a long file path, and check for errors via page.on("console", ...) and page.on("pageerror", ...).

Note when scripting clicks: data-cat-select="<key>" appears on every file link in a concern's sidebar list, not just once on the concern's header link — that's intentional (clicking any file jumps to it within that concern), but it means a plain page.click('[data-cat-select="..."]') or an nth-match click can silently hit the same concern twice instead of switching. Scope the selector to the header when you want an unambiguous single click: .cat-link[data-cat-select="<key>"].

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

Files

SKILL.md and 4 other files (scripts) in agents/.agents/skills/concern-review of meain/dotfiles.

  • SKILL.md
  • scripts/build_review.py
  • scripts/diffsplit.py
  • scripts/list_hunks.py
  • template.html

Open the folder on GitHubat commit 3e336e2

Compare with similar skills

Concern Review 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.

Concern Review compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Concern Review this skillmeain/dotfiles285—~2.2kAutomated safety check: PassMIT
Openai Security Ownership Maptrailofbits/skills-curated5135 repos~2.2kAutomated safety check: NotesCC-BY-SA-4.0
Add To Dependabot CSVlangfuse/langfuse36k—~1.5kAutomated safety check: PassCustom licence
Taskmasterlili-luo/aicoding-cookbook687—~2.9kAutomated safety check: PassNone
Deadline Prepdavila7/claude-code-templates33k—~739Automated safety check: PassMIT
Portaljs Add Datasetdatopian/portaljs2.4k1 repos~1.6kAutomated safety check: PassMIT

Similar skills

  • Openai Security Ownership Map

    trailofbits/skills-curated

    Official

    Analyze git repositories to build a security ownership topology (people-to-file), compute bus factor and sensitive-code ownership, and export CSV/JSON for graph databases and visualization.

    513 GitHub starsUsed in 5 repos~2.2k tokens
    DevelopmentAuto-check: notes
  • Add To Dependabot CSV

    langfuse/langfuse

    Append GitHub Dependabot or Snyk/code-scanning alerts to an existing vulnerability CSV after verifying their API metadata.

    36k GitHub stars~1.5k tokensUpdated today
    DevelopmentAuto-check passed
  • Taskmaster

    lili-luo/aicoding-cookbook

    Unified task execution protocol for Codex-only work. An agent skill from lili-luo/aicoding-cookbook.

    687 GitHub stars~2.9k tokensUpdated 3 mo ago
    DevelopmentAuto-check passed
  • Deadline Prep

    davila7/claude-code-templates

    Generate a structured demo outline from your session's change log and git history.

    33k GitHub stars~739 tokensUpdated today
    DevelopmentAuto-check passed
  • Portaljs Add Dataset

    datopian/portaljs

    Add a dataset (CSV, TSV, JSON, or GeoJSON) to an existing PortalJS portal.

    2.4k GitHub starsUsed in 1 repo~1.6k tokens
    Documents & OfficeAuto-check passed
  • Resolve PR Review

    shencangsheng/easydb_app

    Resolve pull request code review comments end-to-end. An agent skill from shencangsheng/easydb_app.

    590 GitHub stars~2.4k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed

More from meain/dotfiles

All 35 skills in this repo
  • Recall

    meain/dotfiles

    Search past Claude Code and Codex sessions. An agent skill from meain/dotfiles.

    285 GitHub starsUsed in 1 repo~684 tokens
    Auto-check passed
  • Grill With Docs

    meain/dotfiles

    Grilling session that challenges your plan against the existing domain model, sharpens terminology, and updates documentation (CONTEXT.md, ADRs) inline as decisions crystallise.

    285 GitHub starsUsed in 20 repos~875 tokens
    Auto-check passed
  • Backlog

    meain/dotfiles

    Daily backlog management — full planning review OR add a single entry from a URL.

    285 GitHub stars~3k tokensUpdated 2 days ago
    Auto-check passed
  • My Weekly Report

    meain/dotfiles

    Generate a concise weekly status update in team format. An agent skill from meain/dotfiles.

    285 GitHub stars~2.5k tokensUpdated 2 days ago
    Auto-check passed
  • Web Search

    meain/dotfiles

    Search the web using lynx and DuckDuckGo. An agent skill from meain/dotfiles.

    285 GitHub stars~830 tokensUpdated 2 days ago
    Auto-check passed
  • Explain Tests

    meain/dotfiles

    Explain test code changes as a side-by-side HTML page — real test code on the left, a short note on the right saying which case that code covers.

    285 GitHub stars~1.5k tokensUpdated 2 days ago
    Auto-check passed

Questions about Concern Review

What does Concern Review do?

Generate an interactive local HTML review page for a large PR or diff, grouping the changed files by logical concern (not just by file) so a reviewer can go through one theme at a time instead of a…. Concern Review is an agent skill from meain/dotfiles. Generate an interactive local HTML review page for a large PR or diff, grouping the changed files by logical concern (not just by file) so a reviewer can go through one theme at a time instead of a flat file list.

When should I use Concern Review?

Concern Review fits situations like: tasks that involve CSV and tabular files.

How do I install Concern Review in Claude Code?

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

How do I install Concern Review in Codex?

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

Can I use Concern Review 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 meain/dotfiles --skill concern-review -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/concern-review, .gemini/skills/concern-review, .github/skills/concern-review and .opencode/skills/concern-review in your project.

What does Concern Review need to run?

Going by SKILL.md and its folder, Concern Review needs Python for the scripts in its folder and the command-line tools its instructions call (python3, git and npm). Our summary lists: Python 3; Node.js.

Does Concern Review access the network?

SKILL.md contains no URLs. Its commands use git and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Concern Review 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Concern Review use?

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

How many tokens does Concern Review use?

About 2.2k tokens (SKILL.md is roughly 8.9k 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 Concern Review?

Skills that share tags, products or a category with Concern Review: Openai Security Ownership Map (trailofbits/skills-curated, 513 stars), Add To Dependabot CSV (langfuse/langfuse, 36k stars), Taskmaster (lili-luo/aicoding-cookbook, 687 stars) and Deadline Prep (davila7/claude-code-templates, 33k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Concern Review?

meain (a GitHub user) maintains it in meain/dotfiles, which has 285 GitHub stars. The repository holds 35 skills in this directory. The repository was last updated on October 8, 2026.

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