
Code Review
- 194 installs
- 27.3k repo stars
- Updated August 5, 2026
- langchain-ai/deepagents
Run pre-merge agent reviews that flag defects, style drift, missing tests, and risky diffs before PR approval or release candidates ship.
About
DeepAgents code-review skill orchestrates automated pull-request inspection: analyze diffs, surface bugs and regressions, check conventions, and emit reviewer-style feedback aligned with team quality bars before shipping.
- Diff-focused defect detection
- Test coverage gap calls
- Style and convention checks
- Risky change highlighting
- Actionable review comments
Code Review by the numbers
- 194 all-time installs (skills.sh)
- +9 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #345 of 1,352 Code Review & Quality skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/langchain-ai/deepagents --skill code-reviewAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 194 |
|---|---|
| repo stars | ★ 27.3k |
| Last updated | August 5, 2026 |
| Repository | langchain-ai/deepagents ↗ |
What it does
Run pre-merge agent reviews that flag defects, style drift, missing tests, and risky diffs before PR approval or release candidates ship.
Files
Code Review Skill
Use this skill after implementing changes to validate your work before delivering.
Review Checklist
1. Correctness
- [ ] Changes solve the original issue/task
- [ ] No unintended side effects on existing functionality
- [ ] Edge cases are handled
- [ ] Error handling is appropriate (not excessive)
2. Code Quality
- [ ] Code matches existing style and patterns
- [ ] No unnecessary complexity or abstraction
- [ ] Variable and function names are clear
- [ ] No dead code, commented-out code, or TODOs left behind
3. Tests
- [ ] New functionality has test coverage
- [ ] Existing tests still pass
- [ ] Tests cover both happy path and error cases
- [ ] Tests are not brittle (don't test implementation details)
4. Safety
- [ ] No hardcoded secrets or credentials
- [ ] User input is validated at boundaries
- [ ] No SQL injection, XSS, or command injection vectors
- [ ] File operations use safe paths
Process
1. Read each modified file end-to-end (not just the diff) 2. Run the test suite: execute("python -m pytest -v") 3. Run linters if available: execute("ruff check .") 4. Run the bundled lint check: execute("python /skills/code-review/lint_check.py .") 5. Check against each item in the review checklist 6. If any issues found, fix them and re-review 7. When everything passes, the review is complete
Helper Scripts
- `/skills/code-review/lint_check.py` — Scans Python files for missing
docstrings, long functions (>50 lines), and bare except: clauses. Run it via execute("python /skills/code-review/lint_check.py [path ...]").
#!/usr/bin/env python3
"""Quick lint check helper for the code-review skill.
Scans Python files for common issues that a full linter might miss or that
are worth flagging during code review:
- Files missing a module docstring
- Functions longer than 50 lines
- Bare `except:` clauses
Usage::
python /skills/code-review/lint_check.py [path ...]
If no paths are given, scans the current directory recursively.
"""
import ast
import sys
from pathlib import Path
def check_file(path: Path) -> list[str]:
"""Return a list of warnings for a single Python file."""
warnings: list[str] = []
try:
source = path.read_text(encoding="utf-8")
except Exception as exc:
return [f"{path}: could not read ({exc})"]
try:
tree = ast.parse(source, filename=str(path))
except SyntaxError as exc:
return [f"{path}:{exc.lineno}: syntax error: {exc.msg}"]
# Check for missing module docstring
if not ast.get_docstring(tree):
warnings.append(f"{path}:1: missing module docstring")
for node in ast.walk(tree):
# Long functions
if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef)):
length = (node.end_lineno or node.lineno) - node.lineno + 1
if length > 50:
warnings.append(
f"{path}:{node.lineno}: function '{node.name}' is {length} lines long (>50)"
)
# Bare except
if isinstance(node, ast.ExceptHandler) and node.type is None:
warnings.append(f"{path}:{node.lineno}: bare 'except:' clause")
return warnings
def main(paths: list[str]) -> int:
targets = [Path(p) for p in paths] if paths else [Path(".")]
all_warnings: list[str] = []
for target in targets:
if target.is_file() and target.suffix == ".py":
all_warnings.extend(check_file(target))
elif target.is_dir():
for py_file in sorted(target.rglob("*.py")):
all_warnings.extend(check_file(py_file))
for w in all_warnings:
print(w)
if all_warnings:
print(f"\n{len(all_warnings)} warning(s) found.")
return 1
print("No warnings found.")
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))