python-code-review — Claude Code skill: what it does, how to install
The skill inspects Python source files for PEP8 compliance, type annotations, async pitfalls, and exception patterns. It helps spot issues before opening a pull request.
npx skills add existential-birds/beagle --skill python-code-review -a claude-codeWhat python-code-review does
The skill reviews .py files across five areas: PEP8 styling, type safety, async patterns, exception handling, and common anti-patterns. It flags mutable default arguments, raw print() calls instead of logging, bare except: clauses, and blocking calls like time.sleep in async code. For type hints, it looks for complete parameter and return signatures, along with Python 3.10+ T | None union syntax.
Reporting runs through a mandatory five-gate workflow. First, the agent logs every inspected path. Then it filters findings against an explicit list of valid patterns. For instance, it ignores empty __init__.py files, noqa comments, and cast() calls after runtime checks. Every valid issue must include a concrete [FILE:LINE] anchor.
Gate 4 requires loading review-verification-protocol before presenting findings to the user. If that protocol file is missing from your setup, the review chain stops before output. Check your local skill dependencies first.
What it helps with
- detect blocking calls inside async functions
- flag mutable default argument values
- verify type annotations and T | None syntax
- replace print() statements with logging calls
- clean up bare except clauses with proper error context
Example prompts for the agent
- Review backend/api.py for PEP8 formatting and type safety issues.
- Check services/worker.py for blocking calls and unhandled async exceptions.
- Run a Python code review across all files in the core/ directory.
How to install python-code-review
1Skills CLI (Vercel)
npx skills add existential-birds/beagle --skill python-code-review -a claude-code2Manually: put the files in place
~/.claude/skills/python-code-review/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/python-code-review/
1Skills CLI (Vercel)
npx skills add existential-birds/beagle --skill python-code-review -a codex2Manually: put the files in place
.agents/skills/python-code-review/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add existential-birds/beagle --skill python-code-review -a cursor2Manually: put the files in place
.cursor/skills/python-code-review/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install existential-birds/beagle python-code-review2Manually: put the files in place
.github/skills/python-code-review/SKILL.md1Skills CLI (Vercel)
npx skills add existential-birds/beagle --skill python-code-review -a gemini-cli2Platform CLI
gemini skills install https://github.com/existential-birds/beagle --path plugins/beagle-python/skills/python-code-reviewManually: put the files in place
.devin/skills/python-code-review/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add existential-birds/beagle --skill python-code-review -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about python-code-review
How do I install python-code-review in Claude Code?
Run npx skills add existential-birds/beagle --skill python-code-review -a claude-code in your terminal. The skill file is placed at ~/.claude/skills/python-code-review/SKILL.md.
What does the python-code-review skill check?
It audits Python code for PEP8 style compliance, type annotation coverage, non-blocking async execution, and specific exception handling. It also catches common bugs such as mutable default arguments and stray print() statements.
Which code patterns does the review ignore by default?
The reviewer permits empty __init__.py files, intentional noqa comments, and cast() calls after runtime type checks. It also allows Any when interfacing with external libraries that lack type stubs.
Source text
SKILL.md · Apache-2.0
--- name: python-code-review description: Reviews Python code for type safety, async patterns, error handling, and common mistakes. Use when reviewing .py files, checking type hints, async/await usage, or exception handling. --- # Python Code Review ## Quick Reference | Issue Type | Reference | |------------|-----------| | Indentation, line length, whitespace, naming | [references/pep8-style.md](references/pep8-style.md) | | Missing/wrong type hints, Any usage | [references/type-safety.md](references/type-safety.md) | | Blocking calls in async, missing await | [references/async-patterns.md](references/async-patterns.md) | | Bare except, missing context, logging | [references/error-handling.md](references/error-handling.md) | | Mutable defaults, print statements | [references/common-mistakes.md](references/common-mistakes.md) | ## Review Checklist ### PEP8 Style - [ ] 4-space indentation (no tabs) - [ ] Line length ≤79 characters (≤72 for docstrings/comments) - [ ] Two blank lines around top-level definitions, one within classes - [ ] Imports grouped: stdlib → third-party → local (blank line between groups) - [ ] No whitespace inside brackets or before colons/commas - [ ] Naming: `snake_case` for functions/variables, `CamelCase` for classes, `UPPER_CASE` for constants - [ ] Inline comments separated by at least two spaces ### Type Safety - [ ] Type hints on all function parameters and return types - [ ] No `Any` unless necessary (with comment explaining why) - [ ] Proper `T | None` syntax (Python 3.10+) ### Async Patterns - [ ] No blocking calls (`time.sleep`, `requests`) in async functions - [ ] Proper `await` on all coroutines ### Error Handling - [ ] No bare `except:` clauses - [ ] Specific exception types with context - [ ] `raise ... from` to preserve stack traces ### Common Mistakes - [ ] No mutable default arguments - [ ] Using `logger` not `print()` for output - [ ] f-strings preferred over `.format()` or `%` ## Valid Patterns (Do NOT Flag) These patterns are intentional and correct - do not report as issues: - **Type annotation vs type assertion** - Annotations declare types but are not runtime assertions; don't confuse with missing validation - **Using `Any` when interacting with untyped libraries** - Required when external libraries lack type stubs - **Empty `__init__.py` files** - Valid for package structure, no code required - **`noqa` comments** - Valid when linter rule doesn't apply to specific case - **Using `cast()` after runtime type check** - Correct pattern to inform type checker of narrowed type ## Context-Sensitive Rules Only flag these issues when the specific conditions apply: | Issue | Flag ONLY IF | |-------|--------------| | Generic exception handling | Specific exception types are available and meaningful | | Unused variables | Variable lacks `_` prefix AND isn't used in f-strings, logging, or debugging | ## Gates (reporting workflow) Complete **in order**. Do not advance until each **pass condition** is met. 1. **Scope** — **Pass:** You list every `.py` path (or explicit glob) you inspected this run. 2. **False-positive screen** — **Pass:** For each issue you plan to report, you checked **Valid Patterns** and **Context-Sensitive Rules** above; you drop or narrow the finding if those sections say not to flag it. 3. **Evidence** — **Pass:** Each remaining finding includes **`[FILE:LINE]`** (or a bounded line range). Symbols or short verbatim snippets may supplement the location anchor but do not replace it. 4. **Verification protocol** — **Pass:** You load [review-verification-protocol](../review-verification-protocol/SKILL.md) and complete its mandatory steps **for each reported issue** before the user-facing write-up. 5. **Ship** — **Pass:** The user-visible output matches whatever structure that protocol requires (no issues-only dump that skips its checks). ## When to Load References - Reviewing code formatting/style → pep8-style.md - Reviewing function signatures → type-safety.md - Reviewing `async def` functions → async-patterns.md - Reviewing try/except blocks → error-handling.md - General Python review → common-mistakes.md ## Review Questions 1. Does the code follow PEP8 formatting (indentation, line length, whitespace)? 2. Are imports properly grouped (stdlib → third-party → local)? 3. Do names follow conventions (snake_case, CamelCase, UPPER_CASE)? 4. Are all function signatures fully typed? 5. Are async functions truly non-blocking? 6. Do exceptions include meaningful context? 7. Are there any mutable default arguments? Before reporting: complete **Gates (reporting workflow)** above (especially gate 4).
© existential-birds · Apache-2.0 · existential-birds/beagle