Quality Analysis Tools
When to use: Before committing, when reviewing code, or when investigating quality issues.
run_qc.py
Purpose: Run all automated QC checks and generate a report.
Use when:
- Before committing changes
- After significant refactoring
- Periodic quality audits
Usage:
python scripts/run_qc.py
Runs:
- ruff check (linting)
- mypy (type checking)
- Naming convention checks
- And more
Output: Report saved to qc_reports/<timestamp>_qc_report.txt
detect_slop.py
Purpose: Find complexity hotspots, architecture violations, and refactor targets.
Use when:
- Evaluating a file's maintainability
- Finding where to focus refactoring
- Checking for AI-generated "slop" patterns
Usage:
# Scan entire codebase
python scripts/detect_slop.py
# Scan specific directory
python scripts/detect_slop.py nomarr/interfaces/
# Scan specific file
python scripts/detect_slop.py nomarr/services/domain/tagging_svc.py
# HTML report
python scripts/detect_slop.py --format html
# Markdown report
python scripts/detect_slop.py --format md
Detects:
- High cyclomatic complexity (radon)
- Architecture violations (import-linter)
- Code smells (flake8 plugins)
- Commented-out code
- Overcomplicated patterns
Decision rule: Use on one file or package at a time. Summarize findings, propose focused refactor, iterate.
check_naming.py
Purpose: Enforce Nomarr's naming conventions across the codebase.
Use when:
- Reviewing new code for naming compliance
- Finding naming violations before commit
- Verifying refactored code follows conventions
Usage:
# Check all files
python scripts/check_naming.py
# JSON output
python scripts/check_naming.py --format=json
Checks (based on scripts/configs/naming_rules.yaml):
- Service method naming (
<verb>_<noun>) - Module naming conventions
- Forbidden patterns (
api_*,*_for_admin)
check_dead_nodes.py
Purpose: Find unreachable code (functions, classes, methods not called from entrypoints).
Use when:
- Cleaning up unused code
- After major refactoring
- Periodic maintenance
Usage:
# Summary and likely dead nodes
python scripts/check_dead_nodes.py
# Verbose - list all unreachable nodes
python scripts/check_dead_nodes.py --verbose
python scripts/check_dead_nodes.py -v
# JSON output
python scripts/check_dead_nodes.py --format=json
Requires: Run build_code_graph.py first to generate the graph.
Output shows:
- Nodes not reachable from interface entrypoints
- Analysis of whether they're truly dead (checks imports, type usage, grep hits)
find_legacy.py
Purpose: Find references to "legacy" or "backwards compatibility" in the codebase.
Why: Nomarr is pre-alpha. There should be NO legacy code or compatibility layers.
Use when:
- Ensuring no one added migration/shim code
- Cleaning up TODO comments about removing old code
- Pre-release quality check
Usage:
python scripts/find_legacy.py
# JSON output
python scripts/find_legacy.py --format=json
# Search specific directories
python scripts/find_legacy.py nomarr/services tests/unit
Detects patterns:
legacybackwards compatibilitydeprecatedTODO...removeFIXME...remove
Expected result: Zero matches. Any match is a violation of pre-alpha policy.
Workflow: Quality Check Before Commit
# 1. Run full QC
python scripts/run_qc.py
# 2. Check for legacy patterns (should be empty)
python scripts/find_legacy.py
# 3. Check naming violations
python scripts/check_naming.py
# 4. Spot-check modified files for complexity
python scripts/detect_slop.py nomarr/services/domain/tagging_svc.py
Workflow: Refactoring Triage
# 1. Find complexity hotspots
python scripts/detect_slop.py nomarr/workflows/ --format html
# 2. Open report, identify worst files
# 3. For each hotspot, analyze in detail
python scripts/detect_slop.py nomarr/workflows/processing/process_file_wf.py
# 4. Propose and apply focused refactor
# 5. Re-run to verify improvement
python scripts/detect_slop.py nomarr/workflows/processing/process_file_wf.py
Key Rules
- Use
detect_slop.pyon one file/package at a time — don't try to fix everything from one giant report find_legacy.pyshould always return zero results — pre-alpha means no legacy code- Run
check_naming.pybefore committing — naming violations are enforcement, not cosmetic
微信扫一扫