diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..5b976af47c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,67 @@ +# Agent Instructions + +## Tox + +- Always run tox from the main `tox.venv` +- If there is no `tox.venv`, create one with `python -m venv tox.venv`, active it and run `pip install tox` + +## Package Manager + +Use **tox** for testing (not pytest directly): +- Test matrix configuration is in `tox.ini` +- Integration tests: `tox -e py3.14-{integration}-v{version}` +- Common tests: `tox -e py3.14-common` + +## Type Checking + +Use **tox** for type checking (not mypy directly): +- Run `tox -e mypy` before committing (must pass with zero errors) +- Strict mode enabled (`check_untyped_defs`, `disallow_untyped_defs`) + +## Linting & Formatting + +Use **tox** for linting (not ruff directly): +- `tox -e ruff` +- Full lint suite: `tox -e linters` +- Full lint suite must pass before committing + +## Commit Attribution + +AI commits MUST include: +``` +Co-Authored-By: +``` +Example: `Co-Authored-By: Claude Opus 4.6 ` + +## Auto-Generated Files + +Do NOT edit these directly — modify source scripts instead: +- `tox.ini` — generated by `scripts/populate_tox/populate_tox.py` from `scripts/populate_tox/tox.jinja` +- `.github/workflows/test-integrations-*.yml` — generated by `scripts/split_tox_gh_actions/split_tox_gh_actions.py` +- Regenerate all: `scripts/generate-test-files.sh` + +## Adding Integrations to Test Suite + +1. Add minimum version to `_MIN_VERSIONS` in `sentry_sdk/integrations/__init__.py` +2. Add config to `TEST_SUITE_CONFIG` in `scripts/populate_tox/config.py` +3. Add to group in `scripts/split_tox_gh_actions/split_tox_gh_actions.py` +4. Run `scripts/generate-test-files.sh` + +## Integration Contract + +- Don't crash applications or swallow exceptions +- Don't mutate object references or alter function signatures +- Don't leak file descriptors or make unexpected DB requests +- Write defensive code +- Use end-to-end tests (not mocks) + +## Key Paths + +| Path | Description | +|------|-------------| +| `sentry_sdk/integrations/` | integration modules | +| `sentry_sdk/ai/` | AI monitoring | +| `sentry_sdk/crons/` | Cron monitoring | +| `sentry_sdk/profiler/` | Performance profiling | +| `tests/integrations/{name}/` | Integration test suites | +| `scripts/populate_tox/config.py` | Test suite configuration | diff --git a/CLAUDE.md b/CLAUDE.md new file mode 120000 index 0000000000..47dc3e3d86 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/tox.ini b/tox.ini index 64120eaa3d..5cf4693c85 100644 --- a/tox.ini +++ b/tox.ini @@ -327,6 +327,9 @@ deps = linters: -r requirements-linting.txt linters: werkzeug<2.3.0 + ruff: -r requirements-linting.txt + mypy: -r requirements-linting.txt + # === Common === py3.8-common: hypothesis common: pytest-asyncio @@ -915,6 +918,8 @@ basepython = # Tools like ruff and mypy have options that pin the target Python # version (configured in pyproject.toml), ensuring consistent behavior. linters: python3.14 + mypy: python3.14 + ruff: python3.14 commands = {py3.7,py3.8}-boto3: pip install urllib3<2.0.0 @@ -933,3 +938,12 @@ commands = ruff format --check tests sentry_sdk mypy sentry_sdk python scripts/find_raise_from_none.py + +[testenv:mypy] +commands = + mypy sentry_sdk + +[testenv:ruff] +commands = + ruff check tests sentry_sdk + ruff format --check tests sentry_sdk