Thank you for wanting to improve killpy! Contributions of all kinds are welcome β bug reports, feature ideas, documentation fixes, and pull requests.
# 1. Fork the repo on GitHub, then clone your fork
git clone https://github.com/<your-username>/killpy.git
cd killpy
# 2. Install with development dependencies (uv recommended)
pip install -e ".[dev]"
# or
uv sync
# 3. Verify everything works
python -m compileall killpy
pytest tests/- Create a branch off
master(ormain):git checkout -b feat/my-feature
- Make focused, minimal changes β avoid refactoring unrelated code.
- Run tests before committing:
pytest tests/
- Run the linter / type checker if available:
ruff check killpy mypy killpy
- Write a commit message following Conventional Commits:
feat: add --exclude option to skip path patterns fix: handle missing conda command gracefully docs: update keybindings table in README - Open a pull request against
masterwith a clear description of what and why.
Detectors live in killpy/detectors/. Each one inherits from AbstractDetector in base.py.
from killpy.detectors.base import AbstractDetector
from killpy.models import Environment
class MyToolDetector(AbstractDetector):
name = "mytool"
def detect(self, path: Path) -> list[Environment]:
# return a list of Environment objects
...Then register it in killpy/scanner.py inside _build_detectors().
A compelling demo GIF is one of the best ways to showcase new features.
Recommended setup:
- Terminal: 100 Γ 30 characters, dark theme
- Tool: vhs or asciinema + agg
- Content: show scanning, filtering with
/, multi-selecting withT/Space, and deleting
Update show.gif in the repo root and reference it in README.md.
Look for issues labelled good first issue β these are intentionally scoped to be approachable for new contributors.
Be respectful and constructive. We follow the Contributor Covenant.