pycmdcheck 0.1.1__tar.gz → 0.2.0__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 (243) hide show
  1. pycmdcheck-0.2.0/.gitignore +38 -0
  2. pycmdcheck-0.2.0/CHANGELOG.md +311 -0
  3. {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/LICENSE +1 -1
  4. pycmdcheck-0.2.0/PKG-INFO +919 -0
  5. pycmdcheck-0.2.0/README.md +877 -0
  6. {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/pyproject.toml +61 -26
  7. pycmdcheck-0.2.0/skills/pycmdcheck/SKILL.md +154 -0
  8. {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/src/pycmdcheck/__init__.py +19 -2
  9. pycmdcheck-0.2.0/src/pycmdcheck/__main__.py +18 -0
  10. pycmdcheck-0.2.0/src/pycmdcheck/_osi_licenses.py +915 -0
  11. pycmdcheck-0.2.0/src/pycmdcheck/_skill.py +145 -0
  12. pycmdcheck-0.2.0/src/pycmdcheck/_stdlib_names.py +361 -0
  13. pycmdcheck-0.2.0/src/pycmdcheck/ast_cache.py +128 -0
  14. pycmdcheck-0.2.0/src/pycmdcheck/checks/base.py +217 -0
  15. pycmdcheck-0.2.0/src/pycmdcheck/checks/build.py +199 -0
  16. pycmdcheck-0.2.0/src/pycmdcheck/checks/changelog.py +239 -0
  17. pycmdcheck-0.2.0/src/pycmdcheck/checks/ci.py +125 -0
  18. pycmdcheck-0.2.0/src/pycmdcheck/checks/citation.py +171 -0
  19. pycmdcheck-0.2.0/src/pycmdcheck/checks/community.py +119 -0
  20. pycmdcheck-0.2.0/src/pycmdcheck/checks/dependencies.py +433 -0
  21. pycmdcheck-0.2.0/src/pycmdcheck/checks/docs.py +669 -0
  22. pycmdcheck-0.2.0/src/pycmdcheck/checks/doctests.py +380 -0
  23. pycmdcheck-0.2.0/src/pycmdcheck/checks/formatting.py +250 -0
  24. pycmdcheck-0.2.0/src/pycmdcheck/checks/imports.py +54 -0
  25. pycmdcheck-0.2.0/src/pycmdcheck/checks/license.py +460 -0
  26. pycmdcheck-0.2.0/src/pycmdcheck/checks/linting.py +395 -0
  27. pycmdcheck-0.2.0/src/pycmdcheck/checks/metadata.py +542 -0
  28. pycmdcheck-0.2.0/src/pycmdcheck/checks/py_typed.py +213 -0
  29. pycmdcheck-0.2.0/src/pycmdcheck/checks/python_versions.py +342 -0
  30. pycmdcheck-0.2.0/src/pycmdcheck/checks/structure.py +270 -0
  31. pycmdcheck-0.2.0/src/pycmdcheck/checks/test_suite.py +178 -0
  32. pycmdcheck-0.2.0/src/pycmdcheck/checks/tests.py +371 -0
  33. pycmdcheck-0.2.0/src/pycmdcheck/checks/typing.py +377 -0
  34. pycmdcheck-0.2.0/src/pycmdcheck/checks/urls.py +553 -0
  35. pycmdcheck-0.2.0/src/pycmdcheck/checks/version.py +263 -0
  36. pycmdcheck-0.2.0/src/pycmdcheck/cli.py +927 -0
  37. pycmdcheck-0.2.0/src/pycmdcheck/config.py +481 -0
  38. pycmdcheck-0.2.0/src/pycmdcheck/constants.py +83 -0
  39. {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/src/pycmdcheck/discovery.py +40 -14
  40. pycmdcheck-0.2.0/src/pycmdcheck/fileio.py +594 -0
  41. pycmdcheck-0.2.0/src/pycmdcheck/import_scan.py +182 -0
  42. pycmdcheck-0.2.0/src/pycmdcheck/package_layout.py +986 -0
  43. pycmdcheck-0.2.0/src/pycmdcheck/profiles.py +262 -0
  44. pycmdcheck-0.2.0/src/pycmdcheck/pyproject_reader.py +771 -0
  45. {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/src/pycmdcheck/results.py +165 -6
  46. pycmdcheck-0.2.0/src/pycmdcheck/runner.py +444 -0
  47. pycmdcheck-0.2.0/src/pycmdcheck/subprocess_runner.py +450 -0
  48. pycmdcheck-0.2.0/tests/conftest.py +759 -0
  49. pycmdcheck-0.2.0/tests/helpers.py +93 -0
  50. pycmdcheck-0.2.0/tests/test_ast_cache.py +286 -0
  51. pycmdcheck-0.2.0/tests/test_check_build.py +302 -0
  52. pycmdcheck-0.2.0/tests/test_check_changelog.py +360 -0
  53. pycmdcheck-0.2.0/tests/test_check_ci.py +136 -0
  54. pycmdcheck-0.2.0/tests/test_check_citation.py +244 -0
  55. pycmdcheck-0.2.0/tests/test_check_community.py +116 -0
  56. pycmdcheck-0.2.0/tests/test_check_dependencies.py +663 -0
  57. pycmdcheck-0.2.0/tests/test_check_docs.py +1010 -0
  58. pycmdcheck-0.2.0/tests/test_check_doctests.py +1151 -0
  59. pycmdcheck-0.2.0/tests/test_check_formatting.py +467 -0
  60. pycmdcheck-0.2.0/tests/test_check_imports.py +44 -0
  61. pycmdcheck-0.2.0/tests/test_check_license.py +736 -0
  62. pycmdcheck-0.2.0/tests/test_check_linting.py +685 -0
  63. pycmdcheck-0.2.0/tests/test_check_metadata.py +651 -0
  64. pycmdcheck-0.2.0/tests/test_check_py_typed.py +323 -0
  65. pycmdcheck-0.2.0/tests/test_check_python_versions.py +506 -0
  66. pycmdcheck-0.2.0/tests/test_check_structure.py +507 -0
  67. pycmdcheck-0.2.0/tests/test_check_test_suite.py +233 -0
  68. pycmdcheck-0.2.0/tests/test_check_tests.py +534 -0
  69. pycmdcheck-0.2.0/tests/test_check_typing.py +526 -0
  70. pycmdcheck-0.2.0/tests/test_check_urls.py +885 -0
  71. pycmdcheck-0.2.0/tests/test_check_version.py +329 -0
  72. pycmdcheck-0.2.0/tests/test_cli.py +1840 -0
  73. {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/tests/test_config.py +21 -5
  74. pycmdcheck-0.2.0/tests/test_config_file.py +529 -0
  75. pycmdcheck-0.2.0/tests/test_config_validation.py +131 -0
  76. pycmdcheck-0.2.0/tests/test_discovery.py +100 -0
  77. pycmdcheck-0.2.0/tests/test_docs_sync.py +495 -0
  78. pycmdcheck-0.2.0/tests/test_e2e_triage.py +400 -0
  79. pycmdcheck-0.2.0/tests/test_fileio.py +694 -0
  80. pycmdcheck-0.2.0/tests/test_integration.py +51 -0
  81. pycmdcheck-0.2.0/tests/test_package_layout.py +895 -0
  82. pycmdcheck-0.2.0/tests/test_profiles.py +336 -0
  83. pycmdcheck-0.2.0/tests/test_pyproject_reader.py +906 -0
  84. pycmdcheck-0.2.0/tests/test_result_contract.py +220 -0
  85. {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/tests/test_results.py +141 -10
  86. pycmdcheck-0.2.0/tests/test_runner.py +559 -0
  87. pycmdcheck-0.2.0/tests/test_skill.py +169 -0
  88. pycmdcheck-0.2.0/tests/test_subprocess_runner.py +632 -0
  89. pycmdcheck-0.1.1/.devcontainer/Dockerfile +0 -17
  90. pycmdcheck-0.1.1/.devcontainer/devcontainer.json +0 -61
  91. pycmdcheck-0.1.1/.devcontainer/requirements-dev.txt +0 -5
  92. pycmdcheck-0.1.1/.github/workflows/ci.yml +0 -54
  93. pycmdcheck-0.1.1/.github/workflows/release.yml +0 -52
  94. pycmdcheck-0.1.1/.gitignore +0 -22
  95. pycmdcheck-0.1.1/CHANGELOG.md +0 -69
  96. pycmdcheck-0.1.1/PKG-INFO +0 -336
  97. pycmdcheck-0.1.1/README.md +0 -294
  98. pycmdcheck-0.1.1/docs/.gitignore +0 -2
  99. pycmdcheck-0.1.1/docs/_extensions/machow/interlinks/.gitignore +0 -3
  100. pycmdcheck-0.1.1/docs/_extensions/machow/interlinks/_extension.yml +0 -7
  101. pycmdcheck-0.1.1/docs/_extensions/machow/interlinks/interlinks.lua +0 -411
  102. pycmdcheck-0.1.1/docs/_extensions/machow/interlinks/objects.txt +0 -7
  103. pycmdcheck-0.1.1/docs/_extensions/machow/interlinks/test.qmd +0 -22
  104. pycmdcheck-0.1.1/docs/_inv/python_objects.json +0 -1
  105. pycmdcheck-0.1.1/docs/_quarto.yml +0 -85
  106. pycmdcheck-0.1.1/docs/_site/changelog.html +0 -618
  107. pycmdcheck-0.1.1/docs/_site/cli.html +0 -788
  108. pycmdcheck-0.1.1/docs/_site/configuration.html +0 -900
  109. pycmdcheck-0.1.1/docs/_site/custom-checks.html +0 -882
  110. pycmdcheck-0.1.1/docs/_site/getting-started.html +0 -784
  111. pycmdcheck-0.1.1/docs/_site/index.html +0 -680
  112. pycmdcheck-0.1.1/docs/_site/reference/CheckResult.html +0 -693
  113. pycmdcheck-0.1.1/docs/_site/reference/CheckStatus.html +0 -638
  114. pycmdcheck-0.1.1/docs/_site/reference/Report.html +0 -797
  115. pycmdcheck-0.1.1/docs/_site/reference/check.html +0 -657
  116. pycmdcheck-0.1.1/docs/_site/reference/checks.base.BaseCheck.html +0 -727
  117. pycmdcheck-0.1.1/docs/_site/reference/checks.base.Check.html +0 -684
  118. pycmdcheck-0.1.1/docs/_site/reference/checks.docs.DocsCheck.html +0 -707
  119. pycmdcheck-0.1.1/docs/_site/reference/checks.imports.ImportsCheck.html +0 -707
  120. pycmdcheck-0.1.1/docs/_site/reference/checks.license.LicenseCheck.html +0 -698
  121. pycmdcheck-0.1.1/docs/_site/reference/checks.linting.LintingCheck.html +0 -713
  122. pycmdcheck-0.1.1/docs/_site/reference/checks.metadata.MetadataCheck.html +0 -709
  123. pycmdcheck-0.1.1/docs/_site/reference/checks.structure.StructureCheck.html +0 -701
  124. pycmdcheck-0.1.1/docs/_site/reference/checks.tests.TestsCheck.html +0 -709
  125. pycmdcheck-0.1.1/docs/_site/reference/checks.typing.TypingCheck.html +0 -707
  126. pycmdcheck-0.1.1/docs/_site/reference/config.get_check_config.html +0 -645
  127. pycmdcheck-0.1.1/docs/_site/reference/config.is_check_enabled.html +0 -636
  128. pycmdcheck-0.1.1/docs/_site/reference/config.load_config.html +0 -643
  129. pycmdcheck-0.1.1/docs/_site/reference/discovery.discover_checks.html +0 -636
  130. pycmdcheck-0.1.1/docs/_site/reference/discovery.list_available_checks.html +0 -652
  131. pycmdcheck-0.1.1/docs/_site/reference/index.html +0 -688
  132. pycmdcheck-0.1.1/docs/_site/reference/runner.run_checks.html +0 -661
  133. pycmdcheck-0.1.1/docs/_site/search.json +0 -856
  134. pycmdcheck-0.1.1/docs/_site/site_libs/bootstrap/bootstrap-5b4ad623e5705c0698d39aec6f10cf02.min.css +0 -12
  135. pycmdcheck-0.1.1/docs/_site/site_libs/bootstrap/bootstrap-icons.css +0 -2106
  136. pycmdcheck-0.1.1/docs/_site/site_libs/bootstrap/bootstrap-icons.woff +0 -0
  137. pycmdcheck-0.1.1/docs/_site/site_libs/bootstrap/bootstrap.min.js +0 -7
  138. pycmdcheck-0.1.1/docs/_site/site_libs/clipboard/clipboard.min.js +0 -7
  139. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/anchor.min.js +0 -9
  140. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/axe/axe-check.js +0 -145
  141. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/popper.min.js +0 -6
  142. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +0 -236
  143. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/quarto.js +0 -847
  144. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/tabsets/tabsets.js +0 -95
  145. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/tippy.css +0 -1
  146. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-html/tippy.umd.min.js +0 -2
  147. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-nav/headroom.min.js +0 -7
  148. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-nav/quarto-nav.js +0 -325
  149. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-search/autocomplete.umd.js +0 -3
  150. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-search/fuse.min.js +0 -9
  151. pycmdcheck-0.1.1/docs/_site/site_libs/quarto-search/quarto-search.js +0 -1290
  152. pycmdcheck-0.1.1/docs/changelog.qmd +0 -5
  153. pycmdcheck-0.1.1/docs/cli.qmd +0 -264
  154. pycmdcheck-0.1.1/docs/configuration.qmd +0 -299
  155. pycmdcheck-0.1.1/docs/custom-checks.qmd +0 -264
  156. pycmdcheck-0.1.1/docs/getting-started.qmd +0 -137
  157. pycmdcheck-0.1.1/docs/index.qmd +0 -71
  158. pycmdcheck-0.1.1/docs/objects.json +0 -1
  159. pycmdcheck-0.1.1/docs/reference/CheckResult.qmd +0 -91
  160. pycmdcheck-0.1.1/docs/reference/CheckStatus.qmd +0 -44
  161. pycmdcheck-0.1.1/docs/reference/Report.qmd +0 -178
  162. pycmdcheck-0.1.1/docs/reference/_sidebar.yml +0 -36
  163. pycmdcheck-0.1.1/docs/reference/check.qmd +0 -73
  164. pycmdcheck-0.1.1/docs/reference/checks.base.BaseCheck.qmd +0 -116
  165. pycmdcheck-0.1.1/docs/reference/checks.base.Check.qmd +0 -72
  166. pycmdcheck-0.1.1/docs/reference/checks.docs.DocsCheck.qmd +0 -101
  167. pycmdcheck-0.1.1/docs/reference/checks.imports.ImportsCheck.qmd +0 -96
  168. pycmdcheck-0.1.1/docs/reference/checks.license.LicenseCheck.qmd +0 -89
  169. pycmdcheck-0.1.1/docs/reference/checks.linting.LintingCheck.qmd +0 -105
  170. pycmdcheck-0.1.1/docs/reference/checks.metadata.MetadataCheck.qmd +0 -98
  171. pycmdcheck-0.1.1/docs/reference/checks.structure.StructureCheck.qmd +0 -92
  172. pycmdcheck-0.1.1/docs/reference/checks.tests.TestsCheck.qmd +0 -102
  173. pycmdcheck-0.1.1/docs/reference/checks.typing.TypingCheck.qmd +0 -102
  174. pycmdcheck-0.1.1/docs/reference/config.get_check_config.qmd +0 -57
  175. pycmdcheck-0.1.1/docs/reference/config.is_check_enabled.qmd +0 -38
  176. pycmdcheck-0.1.1/docs/reference/config.load_config.qmd +0 -42
  177. pycmdcheck-0.1.1/docs/reference/discovery.discover_checks.qmd +0 -51
  178. pycmdcheck-0.1.1/docs/reference/discovery.list_available_checks.qmd +0 -60
  179. pycmdcheck-0.1.1/docs/reference/index.qmd +0 -56
  180. pycmdcheck-0.1.1/docs/reference/runner.run_checks.qmd +0 -73
  181. pycmdcheck-0.1.1/src/pycmdcheck/__main__.py +0 -6
  182. pycmdcheck-0.1.1/src/pycmdcheck/ast_cache.py +0 -45
  183. pycmdcheck-0.1.1/src/pycmdcheck/checks/base.py +0 -143
  184. pycmdcheck-0.1.1/src/pycmdcheck/checks/build.py +0 -101
  185. pycmdcheck-0.1.1/src/pycmdcheck/checks/changelog.py +0 -101
  186. pycmdcheck-0.1.1/src/pycmdcheck/checks/ci.py +0 -87
  187. pycmdcheck-0.1.1/src/pycmdcheck/checks/citation.py +0 -102
  188. pycmdcheck-0.1.1/src/pycmdcheck/checks/community.py +0 -108
  189. pycmdcheck-0.1.1/src/pycmdcheck/checks/dependencies.py +0 -309
  190. pycmdcheck-0.1.1/src/pycmdcheck/checks/docs.py +0 -305
  191. pycmdcheck-0.1.1/src/pycmdcheck/checks/doctests.py +0 -129
  192. pycmdcheck-0.1.1/src/pycmdcheck/checks/formatting.py +0 -200
  193. pycmdcheck-0.1.1/src/pycmdcheck/checks/imports.py +0 -239
  194. pycmdcheck-0.1.1/src/pycmdcheck/checks/license.py +0 -304
  195. pycmdcheck-0.1.1/src/pycmdcheck/checks/linting.py +0 -304
  196. pycmdcheck-0.1.1/src/pycmdcheck/checks/metadata.py +0 -235
  197. pycmdcheck-0.1.1/src/pycmdcheck/checks/py_typed.py +0 -207
  198. pycmdcheck-0.1.1/src/pycmdcheck/checks/python_versions.py +0 -188
  199. pycmdcheck-0.1.1/src/pycmdcheck/checks/structure.py +0 -285
  200. pycmdcheck-0.1.1/src/pycmdcheck/checks/tests.py +0 -231
  201. pycmdcheck-0.1.1/src/pycmdcheck/checks/typing.py +0 -259
  202. pycmdcheck-0.1.1/src/pycmdcheck/checks/urls.py +0 -124
  203. pycmdcheck-0.1.1/src/pycmdcheck/checks/version.py +0 -184
  204. pycmdcheck-0.1.1/src/pycmdcheck/cli.py +0 -309
  205. pycmdcheck-0.1.1/src/pycmdcheck/config.py +0 -194
  206. pycmdcheck-0.1.1/src/pycmdcheck/constants.py +0 -29
  207. pycmdcheck-0.1.1/src/pycmdcheck/package_layout.py +0 -234
  208. pycmdcheck-0.1.1/src/pycmdcheck/profiles.py +0 -162
  209. pycmdcheck-0.1.1/src/pycmdcheck/pyproject_reader.py +0 -226
  210. pycmdcheck-0.1.1/src/pycmdcheck/runner.py +0 -236
  211. pycmdcheck-0.1.1/src/pycmdcheck/subprocess_runner.py +0 -166
  212. pycmdcheck-0.1.1/tests/conftest.py +0 -375
  213. pycmdcheck-0.1.1/tests/test_ast_cache.py +0 -37
  214. pycmdcheck-0.1.1/tests/test_check_build.py +0 -130
  215. pycmdcheck-0.1.1/tests/test_check_changelog.py +0 -49
  216. pycmdcheck-0.1.1/tests/test_check_ci.py +0 -63
  217. pycmdcheck-0.1.1/tests/test_check_citation.py +0 -56
  218. pycmdcheck-0.1.1/tests/test_check_community.py +0 -74
  219. pycmdcheck-0.1.1/tests/test_check_dependencies.py +0 -143
  220. pycmdcheck-0.1.1/tests/test_check_deps_enhanced.py +0 -53
  221. pycmdcheck-0.1.1/tests/test_check_docs.py +0 -120
  222. pycmdcheck-0.1.1/tests/test_check_doctests.py +0 -110
  223. pycmdcheck-0.1.1/tests/test_check_formatting.py +0 -202
  224. pycmdcheck-0.1.1/tests/test_check_license.py +0 -102
  225. pycmdcheck-0.1.1/tests/test_check_metadata.py +0 -131
  226. pycmdcheck-0.1.1/tests/test_check_py_typed.py +0 -40
  227. pycmdcheck-0.1.1/tests/test_check_python_versions.py +0 -90
  228. pycmdcheck-0.1.1/tests/test_check_urls.py +0 -61
  229. pycmdcheck-0.1.1/tests/test_check_version.py +0 -140
  230. pycmdcheck-0.1.1/tests/test_checks.py +0 -592
  231. pycmdcheck-0.1.1/tests/test_cli.py +0 -232
  232. pycmdcheck-0.1.1/tests/test_config_validation.py +0 -40
  233. pycmdcheck-0.1.1/tests/test_integration.py +0 -45
  234. pycmdcheck-0.1.1/tests/test_package_layout.py +0 -97
  235. pycmdcheck-0.1.1/tests/test_profiles.py +0 -140
  236. pycmdcheck-0.1.1/tests/test_pyproject_reader.py +0 -154
  237. pycmdcheck-0.1.1/tests/test_runner.py +0 -247
  238. pycmdcheck-0.1.1/tests/test_subprocess_runner.py +0 -762
  239. pycmdcheck-0.1.1/tests/test_tool_checks_mocked.py +0 -204
  240. pycmdcheck-0.1.1/uv.lock +0 -1264
  241. {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/src/pycmdcheck/checks/__init__.py +0 -0
  242. {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/src/pycmdcheck/py.typed +0 -0
  243. {pycmdcheck-0.1.1 → pycmdcheck-0.2.0}/tests/__init__.py +0 -0
@@ -0,0 +1,38 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ dist/
6
+ build/
7
+ *.egg
8
+
9
+ # Virtual environments
10
+ .venv/
11
+ venv/
12
+
13
+ # Test and tool caches
14
+ .coverage
15
+ .coverage.*
16
+ coverage.xml
17
+ htmlcov/
18
+ .pytest_cache/
19
+ .mypy_cache/
20
+ .ruff_cache/
21
+
22
+ # OS
23
+ .DS_Store
24
+
25
+ # IDE
26
+ .idea/
27
+ .vscode/
28
+ *.swp
29
+
30
+ # Generated documentation
31
+ docs/_site/
32
+ docs/reference/
33
+ docs/_inv/
34
+ docs/objects.json
35
+ docs/.quarto/
36
+
37
+ # Plans (keep locally, don't track)
38
+ docs/plans/
@@ -0,0 +1,311 @@
1
+ # Changelog
2
+
3
+ All notable changes to pycmdcheck will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.2.0] - 2026-10-12
9
+
10
+ This release raises fewer false alarms and explains every finding. On 18 real
11
+ repositories checked with the `triage` profile, errors and warnings fell from
12
+ 11 to 4, and 9 of the 11 were false alarms.
13
+
14
+ ### New features
15
+
16
+ - Every finding now has a rule code, such as `license.missing`, and a
17
+ one-sentence suggestion that says what to do about it. `--verbose` shows
18
+ the suggestions, `--list-rules` lists all 81 rules, and the JSON report
19
+ holds both under `findings` in each result.
20
+
21
+ - `--format markdown` writes a report made for a pull request or issue
22
+ comment, and `--output FILE` saves any report to a file.
23
+
24
+ ```bash
25
+ pycmdcheck --profile triage --format markdown --output report.md
26
+ ```
27
+
28
+ - New `test_suite` check says whether a project has tests without running
29
+ them, so the `triage` profile can now report a missing test suite.
30
+
31
+ - New `--config FILE` option takes the profile, the checks and their options
32
+ from a settings file kept outside the checked project. It is for bots and
33
+ organizations that check repositories they do not own. The
34
+ `[tool.pycmdcheck]` table of the checked project is then not read at all.
35
+
36
+ - `--profile triage` now gives the same results whatever the checked
37
+ project's `[tool.pycmdcheck.checks]` table says. Its checks only read
38
+ files, and the profile sets every option they use.
39
+
40
+ - Skipped checks now say why. Each one has a `skip_reason`, such as
41
+ `tool-missing`, `not-configured` or `not-applicable`, and never fails a
42
+ run.
43
+
44
+ - New Agent Skill teaches an AI assistant to run pycmdcheck and to fix each
45
+ finding by its rule code and suggestion. `pycmdcheck --install-skill`
46
+ copies it into `.claude/skills`, and the repository also works as a Claude
47
+ Code plugin.
48
+
49
+ - `--check` and `--skip` now take several names separated by commas, as in
50
+ `--check tests,linting`.
51
+
52
+ - `--list-profiles` now shows the checks and options of each profile, and
53
+ `--list`, `--list-profiles` and `--list-rules` take `--json`.
54
+
55
+ - The JSON report gains `schema_version`, `pycmdcheck_version`, `profile`,
56
+ `config_file`, `fail_on`, `failed`, `requested_checks` and
57
+ `skipped_checks`, and every result gains `findings` and `skip_reason`. A
58
+ program that compares the exact set of keys needs an update.
59
+
60
+ - Exit code 3 now marks a failure of pycmdcheck itself, so a caller can tell
61
+ it from a report of findings.
62
+
63
+ - The Python API gains `pycmdcheck.Finding`, `BaseCheck.rules`,
64
+ `BaseCheck.hints` and `CheckResult.skip()` for custom checks that report
65
+ findings, and a `profile=` argument for `check()` and `run_checks()`. A
66
+ custom check that reports no findings still works.
67
+
68
+ ### Breaking changes
69
+
70
+ - Python 3.10 is no longer supported. pycmdcheck needs Python 3.11 or later.
71
+
72
+ - Many results change status. A check with nothing to look at is now
73
+ skipped and no longer gives a note, a warning or an error, and each cause
74
+ is reported by one check. A project with no tests, for example, now gets
75
+ its warning from `test_suite` and a skipped `tests`.
76
+
77
+ - `linting` and `typing` now run only when the project has configured a
78
+ tool, and are skipped otherwise. To run one anyway, name the tool, as in
79
+ `linting = { tool = "ruff" }` under `[tool.pycmdcheck.checks]`.
80
+
81
+ - `formatting` no longer takes a `[tool.ruff]` table alone as the sign of a
82
+ ruff formatter, so such a project is now skipped. Add a
83
+ `[tool.ruff.format]` table, which may be empty, to keep the check.
84
+
85
+ - `--fail-on` now names a threshold, so `--fail-on warning` also fails on an
86
+ error. `fail_on` in `[tool.pycmdcheck]` now takes effect when `--fail-on`
87
+ is not given, under every profile, so a project that sets
88
+ `fail_on = ["warning"]` can now get exit code 1. Pass `--fail-on` or use
89
+ `--config` when you check repositories you do not own.
90
+
91
+ - `doctests` now gives an error for a failed docstring example, and the run
92
+ exits with code 1. Fix the example, or mark it with `# doctest: +SKIP`.
93
+
94
+ - `dependencies` now warns about an undeclared import also when the module
95
+ is installed, and when the project declares no dependencies at all. Add
96
+ the package to `dependencies` in the `[project]` table.
97
+
98
+ - `--skip` now gives a usage error with exit code 2 when it names an unknown
99
+ check, holds an empty name, or leaves no check to run. So does a `PATH`
100
+ that is a file.
101
+
102
+ - `--profile default` and the `imports` check are deprecated. Use
103
+ `--profile core`, which runs the same checks, and `--check dependencies`,
104
+ which now does the work of `imports`. Take `imports` out of `--skip`.
105
+
106
+ - `--profile strict` now runs ruff and mypy whatever tool the project names
107
+ in `[tool.pycmdcheck.checks]`, such as flake8 or pyright. Use
108
+ `--profile pyopensci` to keep the project's choice.
109
+
110
+ - The `all` extra now installs the `build` package, as the new `build` extra
111
+ does, so the `build` check builds the project where it was skipped. Pass
112
+ `--skip build` to leave it out.
113
+
114
+ - Report text is reworded. The closing line starts with `Failed:` after a
115
+ failed run, many messages and detail lines changed, and advice moved from
116
+ the detail lines to the suggestion. A program should read the JSON report
117
+ and match the `code` of a finding.
118
+
119
+ - A check that raises an exception no longer prints its traceback. Run with
120
+ `--debug` to see it.
121
+
122
+ - The `dev` and `docs` extras are gone. Both are now dependency groups for
123
+ people who work on pycmdcheck.
124
+
125
+ - `check()` and `run_checks()` now raise `FileNotFoundError` or
126
+ `NotADirectoryError` for a path that is not a directory, and `ValueError`
127
+ for an unknown profile or an unknown name in `checks=`.
128
+
129
+ - A plugin can no longer replace a built-in check by registering under its
130
+ name.
131
+
132
+ - For authors of custom checks, the class attributes `CHANGELOG_FILENAMES`,
133
+ `CITATION_FILENAMES`, `CONTRIBUTING_FILENAMES` and
134
+ `CODE_OF_CONDUCT_FILENAMES` give way to `CHANGELOG_STEMS`,
135
+ `CITATION_EXTENSIONS`, `CONTRIBUTING_STEMS` and `CODE_OF_CONDUCT_STEMS`.
136
+ Several undocumented helpers of `pycmdcheck.package_layout` are gone too.
137
+
138
+ ### Minor improvements and fixes
139
+
140
+ - `--profile pyopensci` and `--profile strict` now set the minimum docstring
141
+ coverage to 50% and 80%, so missing docstrings give a note only below that
142
+ coverage.
143
+
144
+ - `build` now builds a project that has only a `setup.py`, and a `build.py`
145
+ or `build/` in the project no longer gets in its way.
146
+
147
+ - `changelog`, `ci`, `citation` and `community` now accept many more file
148
+ names and services, such as `RELEASE_NOTES`, a directory of news
149
+ fragments, Forgejo Actions, `CITATION.rst`, `codemeta.json` and `CONDUCT`.
150
+
151
+ - `changelog`, `ci`, `citation`, `community` and `docs` now match file names
152
+ in any letter case, so results agree between macOS and Linux.
153
+
154
+ - `dependencies` no longer flags guarded imports, such as those under
155
+ `if TYPE_CHECKING` or in a `try` that catches `ImportError`. It also
156
+ leaves out the standard library, the project's own modules, and code in
157
+ tests and documentation.
158
+
159
+ - `docs` gains a `check_docs_site` option, which gives a note when a project
160
+ has no documentation beyond its README. The `triage`, `pyopensci` and
161
+ `strict` profiles turn it on.
162
+
163
+ - `docs` now finds a README in `.github/` or `docs/`, or one declared in
164
+ `pyproject.toml`.
165
+
166
+ - `doctests` now names each failed example and gives the line and the
167
+ reason, as in `line 29: expected 10, got 9`.
168
+
169
+ - `doctests` now collects only the project's own packages, and still runs
170
+ the other examples when one file cannot be imported.
171
+
172
+ - `license` now gives a note when the declared license expression names no
173
+ license approved by the Open Source Initiative. The approved licenses come
174
+ from the SPDX license list.
175
+
176
+ - `license` now accepts `LICENSE/` and `LICENSES/` directories, `UNLICENSE`,
177
+ and files that are not UTF-8. It no longer labels MPL, LGPL, AGPL or EPL
178
+ texts as GPL.
179
+
180
+ - `linting` no longer rewrites files when the project's ruff settings turn
181
+ `fix` on, and lists each finding as `path:row:col CODE message`.
182
+
183
+ - `linting` and `formatting` now find ruff and black when they are installed
184
+ next to pycmdcheck, which is where `pipx` and `uv tool` put them.
185
+
186
+ - `metadata` now flags values that cannot be right. An empty `name` or
187
+ `version` gives an error, and a setuptools project that lists a
188
+ `License ::` classifier beside a license expression gets a warning,
189
+ because setuptools 77 and later refuses to build it.
190
+
191
+ - `metadata` now gives a warning, not an error, when `setup.py` or
192
+ `setup.cfg` holds the metadata beside a `pyproject.toml` that has no
193
+ `[project]` table.
194
+
195
+ - `py_typed` now suggests the `py.typed` marker only for a package that is
196
+ clearly typed, and counts `.pyi` stub files.
197
+
198
+ - `python_versions` now reads `python_requires` from `setup.py`, and knows
199
+ end-of-life dates through Python 3.15.
200
+
201
+ - `structure` now finds a package beside `src/`, namespace packages,
202
+ stub-only packages and packages with underscore names. It no longer warns
203
+ about Rust, C or front-end directories under `src/`, and it recognizes
204
+ native build tools named under `[build-system] requires`, such as
205
+ setuptools-rust, Cython, pybind11 and cffi.
206
+
207
+ - `tests` now finds tests inside the package, under `testpaths`, and in
208
+ `*_test.py` files. It says "Tests could not be collected" when a test
209
+ module cannot be imported.
210
+
211
+ - `typing` now gives ok when mypy prints only notes, counts the warnings of
212
+ pyright apart from its errors, and no longer passes `--strict` to pyright.
213
+
214
+ - `urls` no longer contacts local or private hosts, and follows a redirect
215
+ only to another `http` or `https` address.
216
+
217
+ - `urls` now gives a note, not a warning, for an address it could not
218
+ verify, such as one that answers HTTP 403 or times out. Only 404, 410 and
219
+ an unknown host give a warning.
220
+
221
+ - `version` now treats `1.0` and `1.0.0` as the same version, as PEP 440
222
+ does.
223
+
224
+ - A `pyproject.toml` that cannot be parsed no longer ends the run with a
225
+ traceback. `metadata` reports the file, and the checks that need it are
226
+ skipped.
227
+
228
+ - A tool that is installed but cannot run now gives a warning that names it,
229
+ such as "ruff could not run", not an error.
230
+
231
+ - Files in the checked repository are now read only when they are regular
232
+ files, and only up to a size limit.
233
+
234
+ - `python -m pycmdcheck` now removes the current directory from the module
235
+ search path, so a repository checked from its own root cannot register
236
+ checks of its own.
237
+
238
+ - The documentation gains pages on the rules, on triage and on working with
239
+ an AI assistant, and is published at
240
+ <https://py-pkg.thecoatlessprofessor.com/pycmdcheck/>.
241
+
242
+ ## [0.1.1] - 2026-06-25
243
+
244
+ ### Added
245
+
246
+ - `--exit-zero` flag for the command line interface (CLI). It always exits
247
+ with `0` regardless of check results, so the exit code reflects whether
248
+ pycmdcheck ran rather than what it found. Intended for CI and other
249
+ automation that parses the results itself, for example from `--json`.
250
+
251
+ ### Fixed
252
+
253
+ - Project URLs now point to the actual repository
254
+ (`github.com/coatless-py-pkg/pycmdcheck`). The previously declared
255
+ `pycmdcheck/pycmdcheck` URLs referenced a repository that does not exist (404).
256
+ - Installation instructions use `pip install pycmdcheck` now that the package is
257
+ published on PyPI.
258
+ - Corrected inaccurate docstrings (the `metadata`/`tests`/`structure`/`typing`
259
+ Returns sections, the `check`/`run_checks` built-in-check lists, `get_profile`,
260
+ and `discover_checks`) and the illustrative API doctests that crashed under
261
+ `pytest --doctest-modules`.
262
+
263
+ ### Changed
264
+
265
+ - Documentation and docstrings no longer hard-code the built-in check list.
266
+ They reference `pycmdcheck --list`, and a test keeps `ALL_CHECKS` in sync with
267
+ the registered entry points.
268
+ - Updated GitHub Actions to current versions (`checkout` v7, `setup-uv` v8.2.0,
269
+ `upload-artifact` v7, `download-artifact` v8, `gh-action-pypi-publish` v1.14.0).
270
+
271
+ ## [0.1.0] - 2026-06-25
272
+
273
+ First release of pycmdcheck on PyPI.
274
+
275
+ ### Added
276
+
277
+ - Core `check()` function and `pycmdcheck` CLI, with Rich terminal output and
278
+ JSON output for CI integration.
279
+ - Built-in checks: `metadata`, `structure`, `tests`, `linting`, `typing`,
280
+ `imports`, `license`, `docs`, `dependencies`, `build`, `formatting`,
281
+ `version`, `py_typed`, `community`, `ci`, `changelog`, `citation`,
282
+ `python_versions`, `urls`, `doctests`.
283
+ - Profile system with five profiles (`minimal`, `triage`, `default`,
284
+ `pyopensci`, `strict`), selected with `--profile` and listed with
285
+ `--list-profiles`. The `triage` profile runs only static,
286
+ no-install/no-network checks, intended for CI triage of arbitrary
287
+ (un-installed) repositories.
288
+ - Configuration via `[tool.pycmdcheck]` in pyproject.toml, a plugin system via
289
+ entry points for custom checks, and parallel check execution.
290
+ - Support for legacy Poetry projects (`[tool.poetry]` with no PEP 621
291
+ `[project]` table) across the metadata, version, python_versions, and
292
+ dependencies checks.
293
+ - Recognition of PEP 420 namespace packages, single-file modules, and
294
+ native-extension build backends (maturin and scikit-build) in the
295
+ `structure` check. This entry first named setuptools-rust as well, which
296
+ 0.1.0 and 0.1.1 did not detect. See the `structure` entry under 0.2.0.
297
+ - `formatting` check auto-detects the configured formatter (ruff vs black) and
298
+ is skipped when none is configured.
299
+ - GitHub Actions workflows for CI (lint + type-check + pytest on 3.10 to
300
+ 3.13) and for a tag-triggered PyPI release via Trusted Publishing, which
301
+ uses OpenID Connect (OIDC).
302
+ - Public API: `CheckResult`, `CheckStatus`, `Report`, and the `BaseCheck`
303
+ abstract class for custom checks.
304
+
305
+ The checks are intentionally lenient to avoid false positives on legitimate
306
+ real-world packages (PEP 621 `dynamic` fields, dual-license filenames, RST
307
+ READMEs, community files under `.github/`/`docs/`, dependency extras, and more).
308
+
309
+ [0.2.0]: https://github.com/coatless-py-pkg/pycmdcheck/compare/v0.1.1...v0.2.0
310
+ [0.1.1]: https://github.com/coatless-py-pkg/pycmdcheck/compare/v0.1.0...v0.1.1
311
+ [0.1.0]: https://github.com/coatless-py-pkg/pycmdcheck/releases/tag/v0.1.0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 pycmdcheck contributors
3
+ Copyright (c) 2024 James Joseph Balamuta and pycmdcheck contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal