tox-pre-commit 0.0.1a0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. tox_pre_commit-0.0.1a0/.codecov.yml +39 -0
  2. tox_pre_commit-0.0.1a0/.codespellrc +35 -0
  3. tox_pre_commit-0.0.1a0/.coveragerc +38 -0
  4. tox_pre_commit-0.0.1a0/.darglint +9 -0
  5. tox_pre_commit-0.0.1a0/.editorconfig +18 -0
  6. tox_pre_commit-0.0.1a0/.flake8 +171 -0
  7. tox_pre_commit-0.0.1a0/.gitattributes +5 -0
  8. tox_pre_commit-0.0.1a0/.github/CODE_OF_CONDUCT.md +87 -0
  9. tox_pre_commit-0.0.1a0/.github/CONTRIBUTING.md +88 -0
  10. tox_pre_commit-0.0.1a0/.github/FUNDING.yml +22 -0
  11. tox_pre_commit-0.0.1a0/.github/INCIDENT_RESPONSE.md +88 -0
  12. tox_pre_commit-0.0.1a0/.github/ISSUE_TEMPLATE/bug-report.yml +148 -0
  13. tox_pre_commit-0.0.1a0/.github/ISSUE_TEMPLATE/config.yml +26 -0
  14. tox_pre_commit-0.0.1a0/.github/ISSUE_TEMPLATE/feature-request.yml +109 -0
  15. tox_pre_commit-0.0.1a0/.github/PULL_REQUEST_TEMPLATE.md +39 -0
  16. tox_pre_commit-0.0.1a0/.github/SECURITY.md +44 -0
  17. tox_pre_commit-0.0.1a0/.github/THREAT_MODEL.md +112 -0
  18. tox_pre_commit-0.0.1a0/.github/actions/cache-keys/action.yml +48 -0
  19. tox_pre_commit-0.0.1a0/.github/reusables/tox-dev/workflow/reusable-tox/hooks/post-src-checkout/action.yml +39 -0
  20. tox_pre_commit-0.0.1a0/.github/reusables/tox-dev/workflow/reusable-tox/hooks/post-tox-job/action.yml +64 -0
  21. tox_pre_commit-0.0.1a0/.github/reusables/tox-dev/workflow/reusable-tox/hooks/post-tox-run/action.yml +75 -0
  22. tox_pre_commit-0.0.1a0/.github/reusables/tox-dev/workflow/reusable-tox/hooks/prepare-for-tox-run/action.yml +127 -0
  23. tox_pre_commit-0.0.1a0/.github/workflows/ci-cd.yml +984 -0
  24. tox_pre_commit-0.0.1a0/.github/workflows/scheduled-runs.yml +41 -0
  25. tox_pre_commit-0.0.1a0/.gitignore +479 -0
  26. tox_pre_commit-0.0.1a0/.mypy.ini +68 -0
  27. tox_pre_commit-0.0.1a0/.pre-commit-config.yaml +297 -0
  28. tox_pre_commit-0.0.1a0/.pylintrc.toml +636 -0
  29. tox_pre_commit-0.0.1a0/.ruff.toml +92 -0
  30. tox_pre_commit-0.0.1a0/.yamllint +20 -0
  31. tox_pre_commit-0.0.1a0/AGENTS.md +195 -0
  32. tox_pre_commit-0.0.1a0/CLAUDE.md +5 -0
  33. tox_pre_commit-0.0.1a0/LICENSE +43 -0
  34. tox_pre_commit-0.0.1a0/PKG-INFO +80 -0
  35. tox_pre_commit-0.0.1a0/README.md +57 -0
  36. tox_pre_commit-0.0.1a0/nitpick-style.toml +109 -0
  37. tox_pre_commit-0.0.1a0/pyproject.toml +51 -0
  38. tox_pre_commit-0.0.1a0/pytest.ini +80 -0
  39. tox_pre_commit-0.0.1a0/setup.cfg +4 -0
  40. tox_pre_commit-0.0.1a0/src/tox_plugins/pre_commit/_plugin.py +95 -0
  41. tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/PKG-INFO +80 -0
  42. tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/SOURCES.txt +49 -0
  43. tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/dependency_links.txt +1 -0
  44. tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/entry_points.txt +2 -0
  45. tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/requires.txt +1 -0
  46. tox_pre_commit-0.0.1a0/src/tox_pre_commit.egg-info/top_level.txt +1 -0
  47. tox_pre_commit-0.0.1a0/tests/conftest.py +19 -0
  48. tox_pre_commit-0.0.1a0/tests/importable_test.py +51 -0
  49. tox_pre_commit-0.0.1a0/tests/integration_test.py +60 -0
  50. tox_pre_commit-0.0.1a0/tests/smoke_test.py +11 -0
  51. tox_pre_commit-0.0.1a0/tox.ini +290 -0
@@ -0,0 +1,39 @@
1
+ ---
2
+
3
+ codecov:
4
+ notify:
5
+ manual_trigger: true # prevent notifications until we notify Codecov
6
+ wait_for_ci: false
7
+
8
+ require_ci_to_pass: false
9
+
10
+ comment:
11
+ require_changes: true
12
+
13
+ coverage:
14
+ range: 100..100
15
+ status:
16
+ patch:
17
+ default:
18
+ target: 100%
19
+ pytest:
20
+ target: 100%
21
+ flags:
22
+ - pytest
23
+ project:
24
+ default:
25
+ target: 100%
26
+ lib:
27
+ flags:
28
+ - pytest
29
+ paths:
30
+ - src/
31
+ target: 100%
32
+ tests:
33
+ flags:
34
+ - pytest
35
+ paths:
36
+ - tests/
37
+ target: 100%
38
+
39
+ ...
@@ -0,0 +1,35 @@
1
+ [codespell]
2
+ # Ref: https://github.com/codespell-project/codespell#using-a-config-file
3
+
4
+ builtin = clear,code,en-GB_to_en-US,informal,names,rare
5
+
6
+ check-filenames =
7
+ check-hidden =
8
+
9
+ count =
10
+
11
+ # NOTE: `exclude-file` should be uncommented once we have Sphinx
12
+ # exclude-file = docs/spelling_ignorelines.txt
13
+
14
+ # NOTE: `ignore-words` should be uncommented once we have Sphinx
15
+ # ignore-words = docs/spelling_wordlist.txt
16
+ ignore-words-list = THIRDPARTY
17
+ # NOTE: `cancelled()` is a common helper function in GHA
18
+ ignore-regex = \b!?cancelled()\b
19
+
20
+ quiet-level = 3
21
+
22
+ # NOTE: `.gitignore` is skipped due to
23
+ # NOTE: https://github.com/codespell-project/codespell/issues/3941
24
+ skip =
25
+ .git,
26
+ .gitignore,
27
+ .mypy_cache,
28
+ .ruff_cache,
29
+ .tox,
30
+ __pycache__,
31
+ build,
32
+ dist,
33
+ *.egg-info,
34
+
35
+ # write-changes = true
@@ -0,0 +1,38 @@
1
+ [html]
2
+ show_contexts = true
3
+ skip_covered = false
4
+
5
+ [paths]
6
+ _site-packages-to-src-mapping =
7
+ src
8
+ */src
9
+ *\src
10
+ */lib/pypy*/site-packages
11
+ */lib/python*/site-packages
12
+ *\Lib\site-packages
13
+
14
+ [report]
15
+ skip_covered = true
16
+ skip_empty = true
17
+ show_missing = true
18
+ # custom excludes extend baselines from coverage + covdefaults
19
+ # for reference, see
20
+ # coverage: https://coverage.readthedocs.io/en/latest/excluding.html#default-exclusions
21
+ # covdefaults: https://github.com/asottile/covdefaults/blob/8d8712c26ad505f1269851a7c8431b8c1fedaa62/covdefaults.py#L86-L105
22
+ exclude_also =
23
+ ^\s*@pytest\.mark\.xfail
24
+ ^\s*if _t\.TYPE_CHECKING:
25
+
26
+ [run]
27
+ branch = true
28
+ cover_pylib = false
29
+ # https://coverage.rtfd.io/en/latest/contexts.html#dynamic-contexts
30
+ # dynamic_context = test_function # conflicts with `pytest-cov` if set here
31
+ parallel = true
32
+ plugins =
33
+ covdefaults
34
+ relative_files = true
35
+ source =
36
+ .
37
+ source_pkgs =
38
+ tox_plugins
@@ -0,0 +1,9 @@
1
+ [darglint]
2
+ # NOTE: All `darglint` styles except for `sphinx` hit ridiculously low
3
+ # NOTE: performance on some of the in-project Python modules.
4
+ # Refs:
5
+ # * https://github.com/terrencepreilly/darglint/issues/186
6
+ # * https://github.com/wemake-services/wemake-python-styleguide/issues/2287
7
+ docstring_style = sphinx
8
+ # enable = DAR104 # covered by `sphinx_autodoc_typehints`
9
+ strictness = full
@@ -0,0 +1,18 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ indent_size = 4
7
+ indent_style = space
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.{bat,cmd,ps1}]
12
+ end_of_line = crlf
13
+
14
+ [*.{js,json,json5,yml,yaml,md,rb}]
15
+ indent_size = 2
16
+
17
+ [Makefile]
18
+ indent_style = tab
@@ -0,0 +1,171 @@
1
+ [flake8]
2
+
3
+ # Print the total number of errors:
4
+ count = true
5
+
6
+ # Don't even try to analyze these:
7
+ extend-exclude =
8
+ # Circle CI configs
9
+ .circleci,
10
+ # No need to traverse egg info dir
11
+ *.egg-info,
12
+ # GitHub configs
13
+ .github,
14
+ # Cache files of MyPy
15
+ .mypy_cache,
16
+ # Cache files of pytest
17
+ .pytest_cache,
18
+ # Temp dir of pytest-testmon
19
+ .tmontmp,
20
+ # Countless third-party libs in venvs
21
+ .tox,
22
+ # Occasional virtualenv dir
23
+ .venv,
24
+ # VS Code
25
+ .vscode,
26
+ # Temporary build dir
27
+ build,
28
+ # This contains sdists and wheels that we don't want to check
29
+ dist,
30
+ # Metadata of `pip wheel` cmd is autogenerated
31
+ pip-wheel-metadata,
32
+
33
+ # IMPORTANT: avoid using ignore option, always use extend-ignore instead
34
+ # Completely and unconditionally ignore the following errors:
35
+ extend-ignore =
36
+ # Legitimate cases, no need to "fix" these violations:
37
+ # E501: "line too long", its function is replaced by `flake8-length`
38
+ E501,
39
+ # I: isort-handled
40
+ I,
41
+ # W505: "doc line too long", its function is replaced by `flake8-length`
42
+ W505,
43
+ # S101: MyPy requires `asserts`, plus they're not bad if cooked well
44
+ S101,
45
+ # WPS300: "Found local folder import" -- nothing bad about this
46
+ WPS300,
47
+ # WPS305: "Found f string" -- nothing bad about this
48
+ WPS305,
49
+ # An opposite consistency expectation is currently enforced
50
+ # by pylint via: useless-object-inheritance (R0205):
51
+ # WPS306: "Found class without a base class: *" -- nothing bad about this
52
+ WPS306,
53
+ # WPS317 enforces weird indents
54
+ WPS317,
55
+ # WPS318 enforces weird indents too
56
+ WPS318,
57
+ # WPS322: "Found incorrect multi-line string" -- false-positives with
58
+ # attribute docstrings. Ref:
59
+ # https://github.com/wemake-services/wemake-python-styleguide/issues/3056
60
+ WPS322,
61
+ # WPS326: "Found implicit string concatenation" -- nothing bad about this
62
+ WPS326,
63
+ # WPS332: "Found walrus operator" -- nothing bad about this
64
+ WPS332,
65
+ # WPS422: "Found future import: *" -- we need these for multipython
66
+ WPS422,
67
+ # WPS428: "Found statement that has no effect" -- false-positives with
68
+ # attribute docstrings. Ref:
69
+ # https://github.com/wemake-services/wemake-python-styleguide/issues/3056
70
+ WPS428,
71
+ # WPS462: "Wrong multiline string usage" -- false-positives with
72
+ # attribute docstrings. Ref:
73
+ # https://github.com/wemake-services/wemake-python-styleguide/issues/3056
74
+ WPS462,
75
+
76
+ # IMPORTANT: avoid using select option, always use extend-select instead
77
+ # Enable the following errors:
78
+ extend-select =
79
+ # B950: "line too long", longer than `max-line-length` + 10%
80
+ B950,
81
+
82
+ # https://wemake-python-stylegui.de/en/latest/pages/usage/formatter.html
83
+ format = wemake
84
+
85
+ # Let's not overcomplicate the code:
86
+ max-complexity = 10
87
+
88
+ # Accessibility/large fonts and PEP8 friendly.
89
+ # This is being flexibly extended through the `flake8-length`:
90
+ max-line-length = 79
91
+
92
+ # Allow certain violations in certain files:
93
+ # Please keep both sections of this list sorted, as it will be easier for others to find and add entries in the future
94
+ per-file-ignores =
95
+ # The following ignores have been researched and should be considered permanent
96
+ # each should be preceded with an explanation of each of the error codes
97
+ # If other ignores are added for a specific file in the section following this,
98
+ # these will need to be added to that line as well.
99
+
100
+ # There are multiple `assert`s (S101) in tests;
101
+ # we don't care about the security of temporary directories in tests (S108);
102
+ # also, using fixtures looks like shadowing the outer scope (WPS442);
103
+ # nested functions are often necessary for mocking (WPS430);
104
+ # furthermore, we should be able to import and test private attributes
105
+ # (WPS450) and modules (WPS436); `pytest.raises()` allows inspecting the
106
+ # exception outside the CM (WPS441); additionally test docstrings don't
107
+ # need param lists (DAR, DCO020):
108
+ tests/**.py: DAR, DCO020, S101, S108, WPS430, WPS436, WPS441, WPS442, WPS450
109
+
110
+ tests/importable_test.py: ANN101, DAR
111
+
112
+ # Count the number of occurrences of each error/warning code and print a report:
113
+ statistics = true
114
+
115
+ # ## Plugin-provided settings: ##
116
+
117
+ # flake8-eradicate
118
+ # E800:
119
+ eradicate-whitelist-extend = isort:\s+\w+|(Ref:|\*)\s+https?:\/\/
120
+
121
+ # flake8-pytest-style
122
+ # PT001:
123
+ pytest-fixture-no-parentheses = true
124
+ # PT006:
125
+ pytest-parametrize-names-type = tuple
126
+ # PT007:
127
+ pytest-parametrize-values-type = tuple
128
+ pytest-parametrize-values-row-type = tuple
129
+ # PT023:
130
+ pytest-mark-no-parentheses = true
131
+
132
+ # flake8-quotes
133
+ inline-quotes = single
134
+ multiline-quotes = double
135
+ docstring-quotes = double
136
+
137
+ # flake8-rst-docstrings
138
+ rst-directives =
139
+ spelling
140
+ rst-roles =
141
+ # Built-in Sphinx roles:
142
+ class,
143
+ data,
144
+ file,
145
+ func,
146
+ exc,
147
+ meth,
148
+ mod,
149
+ term,
150
+ py:class,
151
+ py:data,
152
+ py:exc,
153
+ py:func,
154
+ py:meth,
155
+ py:term,
156
+ # Sphinx's internal role:
157
+ event,
158
+
159
+ # flake8-typing-as-t
160
+ # TYT02:
161
+ typing-as-t-imported-name = _t
162
+
163
+ # wemake-python-styleguide
164
+ # WPS111:
165
+ # `_t` will be enforced by `flake8-typing-as-t`
166
+ allowed-domain-names =
167
+ _t,
168
+ _c,
169
+ i-control-code = false
170
+ show-violation-links = true
171
+ show-source = true
@@ -0,0 +1,5 @@
1
+ # Force LF line endings for text files
2
+ * text=auto eol=lf
3
+
4
+ # Needed for setuptools-scm-git-archive
5
+ .git_archival.txt export-subst
@@ -0,0 +1,87 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project
7
+ and our community a harassment-free experience for everyone, regardless of
8
+ age, body size, disability, ethnicity, gender identity and expression,
9
+ level of experience, nationality, personal appearance, race, religion, or
10
+ sexual identity and orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention
26
+ or advances
27
+ * Trolling, insulting/derogatory comments, and personal or political
28
+ attacks
29
+ * Public or private harassment
30
+ * Publishing others' private information, such as a physical or electronic
31
+ address, without explicit permission
32
+ * Submitting low-quality AI-generated contributions (commonly known as
33
+ "AI slop") -- unsolicited LLM-authored pull requests, issues, comments,
34
+ or documentation that the human submitter has not personally reviewed,
35
+ validated, and taken responsibility for. See the [contribution guide]
36
+ for the full LLM contribution policy.
37
+ * Other conduct which could reasonably be considered inappropriate in a
38
+ professional setting
39
+
40
+ [contribution guide]: ./CONTRIBUTING.md#llm-generated-contributions
41
+
42
+ ## Our Responsibilities
43
+
44
+ Project maintainers are responsible for clarifying the standards of
45
+ acceptable behavior and are expected to take appropriate and fair
46
+ corrective action in response to any instances of unacceptable behavior.
47
+
48
+ Project maintainers have the right and responsibility to remove, edit, or
49
+ reject comments, commits, code, wiki edits, issues, and other
50
+ contributions that are not aligned to this Code of Conduct, or to ban
51
+ temporarily or permanently any contributor for other behaviors that they
52
+ deem inappropriate, threatening, offensive, or harmful. **Repeated
53
+ submission of AI-generated spam contributions constitutes grounds for a
54
+ ban under this provision.**
55
+
56
+ ## Scope
57
+
58
+ This Code of Conduct applies both within project spaces and in public
59
+ spaces when an individual is representing the project or its community.
60
+ Examples of representing a project or community include using an
61
+ official project e-mail address, posting via an official social media
62
+ account, or acting as an appointed representative at an online or
63
+ offline event. Representation of a project may be further defined and
64
+ clarified by project maintainers.
65
+
66
+ ## Enforcement
67
+
68
+ Instances of abusive, harassing, or otherwise unacceptable behavior may
69
+ be reported by contacting the project maintainer at
70
+ `wk+~foss/tox-dev/tox-plugins/coc@sydorenko.org.ua`. The project team
71
+ will review and investigate all complaints, and will respond in a way
72
+ that it deems appropriate to the circumstances. The project team is
73
+ obligated to maintain confidentiality with regard to the reporter of an
74
+ incident. Further details of specific enforcement policies may be
75
+ posted separately.
76
+
77
+ Project maintainers who do not follow or enforce the Code of Conduct in
78
+ good faith may face temporary or permanent repercussions as determined
79
+ by other members of the project's leadership.
80
+
81
+ ## Attribution
82
+
83
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
84
+ version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
85
+
86
+ [homepage]: http://contributor-covenant.org
87
+ [version]: http://contributor-covenant.org/version/1/4/
@@ -0,0 +1,88 @@
1
+ # Contributing
2
+
3
+ <!-- sphinx-inclusion-post-this-line -->
4
+
5
+ This project is part of the [tox-dev] ecosystem. By contributing, you
6
+ agree to abide by the [Contributor Code of Conduct][coc] and follow the
7
+ conventions outlined below.
8
+
9
+ ## Project Contribution Guidelines
10
+
11
+ The following apply to contributions in this repository:
12
+
13
+ - Use [`tox`] to invoke the testing, linting and packaging environments
14
+ declared in `tox.ini`.
15
+ - Local code-style and static-analysis checks run under [`pre-commit`].
16
+ Run `pre-commit run --all-files` before pushing.
17
+ - Add tests for behavioral changes. The test suite uses [`tox.pytest`]
18
+ to exercise the plugin against a real `tox` runtime.
19
+ - Give a clear one-line description in the pull request title.
20
+ - Wait for review from at least one other contributor before merging,
21
+ even if you have write access.
22
+
23
+ The only exception to these guidelines is for trivial changes, such as
24
+ documentation corrections or contributions that do not change the
25
+ plugin itself.
26
+
27
+ Contributions following these guidelines are always welcomed, encouraged
28
+ and appreciated.
29
+
30
+ [`pre-commit`]: https://pre-commit.com
31
+ [`tox`]: https://tox.wiki
32
+ [`tox.pytest`]:
33
+ https://tox.wiki/en/latest/plugin/howto.html#testing-plugins
34
+ [coc]: ./CODE_OF_CONDUCT.md
35
+ [tox-dev]: https://github.com/tox-dev
36
+
37
+ ### LLM Generated Contributions
38
+
39
+ Contributors are free to use whatever tools they like, but we have some
40
+ additional guidance for LLM-assisted contributions.
41
+
42
+ When interacting in this project's spaces (issues, pull requests,
43
+ discussions, etc.), do not use LLMs to speak for you, except for
44
+ translation or grammar edits. This includes the creation of change
45
+ logs and pull request descriptions. Human-to-human communication is
46
+ foundational to open source communities.
47
+
48
+ > [!CAUTION]
49
+ > In extreme cases, low quality PRs may be closed as spam.
50
+
51
+ #### Responsibility
52
+
53
+ Remember that you, not the LLM, are responsible for your contributions.
54
+ Be ready to discuss your changes.
55
+ Do not submit code you have not reviewed.
56
+
57
+ Do your best to follow the conventions and standards of the project.
58
+ Make sure your code really works.
59
+ Be thoughtful about testing and documentation.
60
+
61
+ Try to make your code brief, and recognize when less is more.
62
+
63
+ #### Autonomous Code Submissions
64
+
65
+ The use of agents which write code and submit pull requests without
66
+ human review is not permitted.
67
+
68
+ We can already run these tools ourselves, if we want to. Contributions
69
+ should provide value beyond running a tool.
70
+
71
+ #### Pull Request Templates
72
+
73
+ Please do not replace the pull request template, which is part of the
74
+ maintainers' process.
75
+
76
+ ### The `good first issue` label
77
+
78
+ The [`good first issue` label] is used to designate items which are
79
+ being left for new contributors.
80
+ They're a great way to get onboarded into the project and learn.
81
+
82
+ Having an LLM resolve one of these issues does not help anyone learn.
83
+ Therefore, please be considerate of those who may benefit from these
84
+ opportunities, and refrain from asking an LLM to produce a complete
85
+ solution.
86
+
87
+ [`good first issue` label]:
88
+ https://github.com/search?q=org%3Atox-dev+label%3A%22good+first+issue%22&type=issues
@@ -0,0 +1,22 @@
1
+ ---
2
+
3
+ custom:
4
+ - https://savelife.in.ua/donate-en
5
+ - https://github.com/vshymanskyy/StandWithUkraine#for-maintainers-and-authors
6
+ - https://www.paypal.me/webknjazCZ
7
+ - https://webknjaz.me
8
+
9
+ github:
10
+ - webknjaz
11
+
12
+ ko_fi: webknjaz
13
+
14
+ liberapay: webknjaz
15
+
16
+ open_collective: webknjaz
17
+
18
+ # patreon: webknjaz # not in use because of the ties with ruscism
19
+
20
+ thanks_dev: u/gh/webknjaz
21
+
22
+ ...
@@ -0,0 +1,88 @@
1
+ # Incident Response Playbook
2
+
3
+ This document captures how the maintainer triages, fixes and discloses
4
+ confirmed security incidents covering this plugin. The path is
5
+ written down here so it is decided in calm waters, not in the middle
6
+ of a live disclosure.
7
+
8
+ > [!note]
9
+ > Reporters should follow [`SECURITY.md`][SECURITY] to reach the
10
+ > maintainer. This file is for the maintainer's response side.
11
+
12
+ [SECURITY]: ./SECURITY.md
13
+
14
+
15
+ ## Severity Classes
16
+
17
+ | Class | Definition |
18
+ |-------|------------|
19
+ | **Critical** | Arbitrary code execution from default plugin behavior, or any vulnerability that compromises the integrity of the published distribution. |
20
+ | **High** | Information disclosure or denial of service that the plugin can cause without explicit user opt-in. |
21
+ | **Medium** | Broken builds for legitimate users; CI hangs; spurious data leaks limited to the user's own machine. |
22
+ | **Low** | Cosmetic, non-exploitable bugs incorrectly classified as security. |
23
+
24
+
25
+ ## Triage Timeline
26
+
27
+ | Step | Target turnaround |
28
+ |------|-------------------|
29
+ | Initial acknowledgment to the reporter | **≤ 72 hours** from receipt |
30
+ | Severity-class assignment | **≤ 72 hours** |
31
+ | Impact assessment + remediation plan | **≤ 7 days** |
32
+ | Fix-or-yank decision | **≤ 14 days** |
33
+ | Coordinated disclosure window for **Critical** / **High** | **≤ 45 days** from initial report by default; extendable on reporter request |
34
+
35
+ These are targets, not hard SLAs -- this is unpaid maintenance on an
36
+ open-source project.
37
+
38
+
39
+ ## Coordination
40
+
41
+ * For **Critical** and **High**: open a GitHub Security Advisory
42
+ draft as soon as the issue is reproduced. The draft serves as the
43
+ shared workspace between the maintainer and the reporter.
44
+ * Cross-link the advisory to the `tox-dev` maintainer chat for severe
45
+ cross-project impact (e.g. if the bug originates in `tox` itself
46
+ rather than the plugin).
47
+ * CVE assignment is requested via GitHub's GHSA flow when CVSS
48
+ v4.0 base score ≥ 7.0 (High or Critical).
49
+
50
+
51
+ ## Disclosure Philosophy
52
+
53
+ * Coordinated disclosure is preferred.
54
+ * The advisory is **published after** the fix release reaches PyPI
55
+ so users have a remediation available immediately.
56
+ * Embargo only when downstream coordination warrants it (e.g.
57
+ affected downstream packagers have not yet shipped the fix).
58
+
59
+
60
+ ## Remediation Playbook
61
+
62
+ 1. Cut a hot-fix branch from the latest released tag.
63
+ 2. Land the minimal fix + a regression test under `tests/`.
64
+ 3. Bump the patch component of the version.
65
+ 4. Release via Trusted Publishing on PyPI (the existing
66
+ `ci-cd.yml` release flow does this).
67
+ 5. If older versions are confirmed affected and not in active use,
68
+ `pip` yank them (PyPI maintainer console). Yanking does not
69
+ delete; it warns installers off.
70
+ 6. Publish the GHSA advisory.
71
+ 7. Open a public GitHub Discussion announcing the fix.
72
+
73
+
74
+ ## Post-Incident
75
+
76
+ * A short public post-mortem is published within **30 days** after
77
+ disclosure for any **Critical** / **High** incident.
78
+ * The [threat model][threat-model] is updated to reflect any new
79
+ mitigations added.
80
+ * Regression coverage is verified to be in place under `tests/`.
81
+
82
+ [threat-model]: ./THREAT_MODEL.md
83
+
84
+
85
+ ## Drills
86
+
87
+ Incident response drills are not currently scheduled. Revisit if user
88
+ base or attack surface grows substantially.