mcpbeat

Docs Review

pulumi/docs-review

Review docs and blog post quality before committing (style, accuracy, Pulumi best practices). Use when you've made content changes locally and want a quality pass on open files, the current branch, or a specific PR — outputs to the conversation, never posts to GitHub.

284k tokens
context cost
the whole folder, loaded on every use
63
files
ships runnable scripts
0
copies elsewhere
how many repositories repackaged it
178
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/pulumi/docs --skill docs-review

What comes with it

678 321 bytes besides the instruction
ci.md
footer.md
references/blog.md
references/claim-extraction.md
references/code-examples.md
references/docs.md
references/domain-routing.md
references/fact-check.md
references/image-review.md
references/infra.md
references/output-format.md
references/pre-computation.md
references/programs.md
references/prose-patterns.md
references/readthrough.md
references/shared-criteria.md
references/spelling-grammar.md
references/update.md
references/website.md
scripts/auto-refresh-gate.py
scripts/compose-review.py
scripts/cross-sibling-discover.py
scripts/editorial-balance-detect.py
scripts/entity_key.py
scripts/extract-claims-llm.py
scripts/extract-claims.py
scripts/extract-urls-and-fetch.py
scripts/frontmatter-validate.py
scripts/hugo-build-validate.py
scripts/markdown-syntax-findings.py
scripts/merge-claims.py
scripts/per-tool-spend.py
scripts/pinned-comment.sh
scripts/readthrough.py
scripts/scrape-review-outcomes.py
scripts/set-review-label.sh
scripts/splicer.py
scripts/strip-empty-triaged.py
scripts/test_auto_refresh_gate.py
scripts/test_extract_claims.py

The instruction itself

5 sections, as written by the author

Docs Review (interactive)

Output goes into the conversation. This skill never posts to GitHub.

Usage

/docs-review [PR_NUMBER]

If PR_NUMBER is provided, review the PR via gh pr view / gh pr diff. If omitted, auto-detect scope from the current IDE/terminal context.

Scope detection (when no PR number is provided)

Walk these steps in order; stop at the first that yields a scope.

  • Open files in the IDE. Check the conversation context for system reminders that list open files. If any are present, treat those files as the scope.
  • Uncommitted changes. Check the gitStatus block (or run git status) for modified (M) and untracked (??) files. Use git diff and read the affected files.
  • Branch changes vs. master:
    git diff $(git merge-base --fork-point master HEAD)...HEAD

If --fork-point fails (no reflog), fall back to git diff $(git merge-base master HEAD)...HEAD. Review every changed file in the branch.

Performing the review

Route each file to a domain via docs-review:references:domain-routing, then apply that domain's criteria plus docs-review:references:shared-criteria. Render the output per docs-review:references:output-format.

For files under content/docs/ or content/blog/, also run Vale and surface its findings under ⚠️ Low-confidence per the Style-findings render contract in docs-review:references:output-format (the line N: _category_ — <message> bullet form, grouped under a #### Style findings H4). Pipe through the categorize filter so the JSON has a deterministic category field — never surface the raw rule name:

vale --no-exit --output=JSON <files> > /tmp/vale-raw.json
python3 .claude/commands/docs-review/scripts/vale-findings-filter.py \
    --in /tmp/vale-raw.json --out /tmp/vale-findings.json
# Render bullets from /tmp/vale-findings.json: use .category, not .rule.

Omit --pr in interactive mode (no diff to intersect; the filter accepts all findings, categorizes, caps). If vale --version fails or vale is not on PATH, skip the Vale step with a one-line note (e.g., "Skipping Vale: not installed. Install via mise install to enable style nits.") and continue the review without Vale findings — don't hard-fail.

For PR-number invocations:

gh pr view {{arg}} --json title,body,files,additions,deletions,labels
gh pr diff {{arg}}

Format for terminal display. Include the scope in the summary, and offer to broaden if useful.

Outcome telemetry (quarterly review)

Every closed PR's pinned review encodes what happened to its findings (✅ Resolved = fixed, concede: = conceded, 🛡️ Disputed … model held = disputed, still-🚨-at-merge = ignored). scripts/scrape-review-outcomes.py derives per-finding outcomes from that structure; the weekly digest (scripts/weekly-digest/digest.py) aggregates the trailing week automatically. Quarterly, run the long-window tuning report:

uv run .claude/commands/docs-review/scripts/scrape-review-outcomes.py \
    --closed-since <quarter-start> --stats

What to do with the numbers: verdict categories with high concede or ignored-at-merge rates are candidates for demoting from the always-🚨 carve-out list (or pruning entirely — edit docs-review:references:output-format §Bucket rules in a PR); recurring prose findings with high fix rates are candidates for promotion into Vale rules so they're caught pre-review. High unconfirmed_at_merge counts mean reviews are routinely stale at merge — evidence for auto-refreshing on trivial deltas. Telemetry informs the tuning; humans make the edits.

How to use it

Copy the folder

Take pulumi/docs-review from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.