pyfltr 3.22.0__tar.gz → 3.22.2__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 (306) hide show
  1. {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/agents/tool-compat-checker.md +3 -3
  2. {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/rules/targets.md +3 -3
  3. {pyfltr-3.22.0 → pyfltr-3.22.2}/PKG-INFO +1 -1
  4. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/development/architecture.md +28 -4
  5. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/configuration-tools.md +9 -0
  6. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/custom-commands.md +2 -1
  7. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/recommended.md +3 -0
  8. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/mcp_server.py +0 -1
  9. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/pipeline.py +10 -11
  10. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/core_.py +16 -1
  11. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/dispatcher.py +1 -8
  12. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/glab.py +1 -2
  13. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/linter_fix.py +1 -2
  14. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/runner.py +6 -1
  15. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/stage_runner.py +46 -2
  16. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/subproject_loop.py +2 -0
  17. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/textlint_fix.py +16 -7
  18. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/two_step/base.py +1 -6
  19. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/two_step/prettier.py +3 -4
  20. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/two_step/ruff.py +1 -2
  21. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/vitest.py +2 -3
  22. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/config.py +5 -7
  23. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/validation.py +11 -6
  24. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/parsing/common.py +1 -1
  25. pyfltr-3.22.2/pyfltr/parsing/entry.py +129 -0
  26. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/parsing/pytest.py +5 -5
  27. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/parsing/tools.py +21 -22
  28. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/paths.py +34 -0
  29. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/archive.py +100 -0
  30. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/cache.py +1 -1
  31. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/only_failed.py +1 -1
  32. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/retry.py +7 -6
  33. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/tools.py +3 -3
  34. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/mcp_server_test.py +0 -1
  35. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/runner_test.py +14 -0
  36. pyfltr-3.22.2/tests/command/stage_runner_test.py +282 -0
  37. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/textlint_fix_test.py +57 -0
  38. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/config/config_test.py +4 -107
  39. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/conftest.py +77 -0
  40. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/parser_registration_test.py +1 -1
  41. pyfltr-3.22.2/tests/integration/pipeline_config_files_warning_test.py +154 -0
  42. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/pipeline_monorepo_test.py +50 -0
  43. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/status_consistency_test.py +53 -4
  44. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/parsing/entry_test.py +69 -4
  45. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/paths_test.py +43 -0
  46. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/state/archive_test.py +107 -0
  47. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/state/only_failed_test.py +40 -0
  48. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/state/retry_test.py +9 -9
  49. pyfltr-3.22.0/pyfltr/parsing/entry.py +0 -100
  50. pyfltr-3.22.0/tests/command/stage_runner_test.py +0 -112
  51. {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/grep-replace/SKILL.md +0 -0
  52. {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/implementation-test-constraints/SKILL.md +0 -0
  53. {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/output-format/SKILL.md +0 -0
  54. {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/pyfltr-add-tool/SKILL.md +0 -0
  55. {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/ssot/SKILL.md +0 -0
  56. {pyfltr-3.22.0 → pyfltr-3.22.2}/.agents/skills/tool-resolution/SKILL.md +0 -0
  57. {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/agents/error-parser-reviewer.md +0 -0
  58. {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/rules/dogfooding.md +0 -0
  59. {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/rules/order.md +0 -0
  60. {pyfltr-3.22.0 → pyfltr-3.22.2}/.claude/rules/subprocess.md +0 -0
  61. {pyfltr-3.22.0 → pyfltr-3.22.2}/.editorconfig +0 -0
  62. {pyfltr-3.22.0 → pyfltr-3.22.2}/.editorconfig-checker.json +0 -0
  63. {pyfltr-3.22.0 → pyfltr-3.22.2}/.gitattributes +0 -0
  64. {pyfltr-3.22.0 → pyfltr-3.22.2}/.github/workflows/audit.yaml +0 -0
  65. {pyfltr-3.22.0 → pyfltr-3.22.2}/.github/workflows/ci.yaml +0 -0
  66. {pyfltr-3.22.0 → pyfltr-3.22.2}/.github/workflows/docker-build.yaml +0 -0
  67. {pyfltr-3.22.0 → pyfltr-3.22.2}/.github/workflows/docs.yaml +0 -0
  68. {pyfltr-3.22.0 → pyfltr-3.22.2}/.github/workflows/release.yaml +0 -0
  69. {pyfltr-3.22.0 → pyfltr-3.22.2}/.gitignore +0 -0
  70. {pyfltr-3.22.0 → pyfltr-3.22.2}/.gitlab-ci.yml +0 -0
  71. {pyfltr-3.22.0 → pyfltr-3.22.2}/.gitmessage +0 -0
  72. {pyfltr-3.22.0 → pyfltr-3.22.2}/.markdownlint-cli2.yaml +0 -0
  73. {pyfltr-3.22.0 → pyfltr-3.22.2}/.npmrc +0 -0
  74. {pyfltr-3.22.0 → pyfltr-3.22.2}/.pre-commit-config.yaml +0 -0
  75. {pyfltr-3.22.0 → pyfltr-3.22.2}/.python-version +0 -0
  76. {pyfltr-3.22.0 → pyfltr-3.22.2}/.textlintignore +0 -0
  77. {pyfltr-3.22.0 → pyfltr-3.22.2}/.textlintrc.yaml +0 -0
  78. {pyfltr-3.22.0 → pyfltr-3.22.2}/.vscode/extensions.json +0 -0
  79. {pyfltr-3.22.0 → pyfltr-3.22.2}/.vscode/settings.json +0 -0
  80. {pyfltr-3.22.0 → pyfltr-3.22.2}/.yamllint.yaml +0 -0
  81. {pyfltr-3.22.0 → pyfltr-3.22.2}/AGENTS.md +0 -0
  82. {pyfltr-3.22.0 → pyfltr-3.22.2}/LICENSE +0 -0
  83. {pyfltr-3.22.0 → pyfltr-3.22.2}/Makefile +0 -0
  84. {pyfltr-3.22.0 → pyfltr-3.22.2}/README.md +0 -0
  85. {pyfltr-3.22.0 → pyfltr-3.22.2}/cliff.toml +0 -0
  86. {pyfltr-3.22.0 → pyfltr-3.22.2}/docker/Dockerfile +0 -0
  87. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/.markdownlint-cli2.yaml +0 -0
  88. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/development/development.md +0 -0
  89. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/configuration.md +0 -0
  90. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/getting-started.md +0 -0
  91. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/grep-replace.md +0 -0
  92. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/index.md +0 -0
  93. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/recommended-nonpython.md +0 -0
  94. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/troubleshooting.md +0 -0
  95. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/guide/usage.md +0 -0
  96. {pyfltr-3.22.0 → pyfltr-3.22.2}/docs/index.md +0 -0
  97. {pyfltr-3.22.0 → pyfltr-3.22.2}/mise.lock +0 -0
  98. {pyfltr-3.22.0 → pyfltr-3.22.2}/mise.toml +0 -0
  99. {pyfltr-3.22.0 → pyfltr-3.22.2}/mkdocs.yml +0 -0
  100. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/__init__.py +0 -0
  101. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/__main__.py +0 -0
  102. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/__init__.py +0 -0
  103. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/command_info.py +0 -0
  104. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/command_selection.py +0 -0
  105. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/config_subcmd.py +0 -0
  106. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/grep_replace_common.py +0 -0
  107. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/grep_subcmd.py +0 -0
  108. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/main.py +0 -0
  109. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/mcp_models.py +0 -0
  110. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/mcp_transport.py +0 -0
  111. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/mcp_worker.py +0 -0
  112. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/output_format.py +0 -0
  113. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/overrides.py +0 -0
  114. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/parser.py +0 -0
  115. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/replace_subcmd.py +0 -0
  116. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/runs.py +0 -0
  117. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/shell_completion.py +0 -0
  118. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/cli/subproject_config.py +0 -0
  119. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/__init__.py +0 -0
  120. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/__main__.py +0 -0
  121. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/check.py +0 -0
  122. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/cli.py +0 -0
  123. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/words.txt +0 -0
  124. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/colloquial/words_allow.txt +0 -0
  125. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/__init__.py +0 -0
  126. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/cache_policy.py +0 -0
  127. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/completion.py +0 -0
  128. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/env.py +0 -0
  129. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/executor.py +0 -0
  130. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/lychee.py +0 -0
  131. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/mise.py +0 -0
  132. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/only_failed.py +0 -0
  133. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/precommit.py +0 -0
  134. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/precommit_guidance.py +0 -0
  135. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/process.py +0 -0
  136. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/slow_tests.py +0 -0
  137. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/snapshot.py +0 -0
  138. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/structured_output.py +0 -0
  139. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/subprojects.py +0 -0
  140. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/targets.py +0 -0
  141. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/tool_parallelism.py +0 -0
  142. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/tool_resolution.py +0 -0
  143. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/command/two_step/__init__.py +0 -0
  144. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/__init__.py +0 -0
  145. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/editing.py +0 -0
  146. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/model.py +0 -0
  147. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/operations.py +0 -0
  148. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/presets.py +0 -0
  149. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/config/selection.py +0 -0
  150. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/diagnostics.py +0 -0
  151. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/__init__.py +0 -0
  152. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/adaptive.py +0 -0
  153. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/history.py +0 -0
  154. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/jsonl_records.py +0 -0
  155. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/matcher.py +0 -0
  156. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/operations.py +0 -0
  157. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/preview.py +0 -0
  158. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/replacer.py +0 -0
  159. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/scanner.py +0 -0
  160. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/text_render.py +0 -0
  161. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/transaction.py +0 -0
  162. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/grep_/types.py +0 -0
  163. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/link_checks.py +0 -0
  164. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/__init__.py +0 -0
  165. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/auxiliary.py +0 -0
  166. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/code_quality.py +0 -0
  167. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/diagnostics.py +0 -0
  168. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/formatters.py +0 -0
  169. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/github_annotations.py +0 -0
  170. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/jsonl.py +0 -0
  171. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/logging_.py +0 -0
  172. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/positions.py +0 -0
  173. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/render.py +0 -0
  174. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/sarif.py +0 -0
  175. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/output/ui.py +0 -0
  176. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/parsing/__init__.py +0 -0
  177. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/rule_urls.py +0 -0
  178. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/run_options.py +0 -0
  179. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/__init__.py +0 -0
  180. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/retention.py +0 -0
  181. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/state/runs.py +0 -0
  182. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/text/__init__.py +0 -0
  183. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/text/exclude_fence.py +0 -0
  184. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/text/fences.py +0 -0
  185. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyfltr/warnings_.py +0 -0
  186. {pyfltr-3.22.0 → pyfltr-3.22.2}/pyproject.toml +0 -0
  187. {pyfltr-3.22.0 → pyfltr-3.22.2}/scripts/__init__.py +0 -0
  188. {pyfltr-3.22.0 → pyfltr-3.22.2}/scripts/check_distribution.py +0 -0
  189. {pyfltr-3.22.0 → pyfltr-3.22.2}/scripts/check_doc_codeblocks.py +0 -0
  190. {pyfltr-3.22.0 → pyfltr-3.22.2}/scripts/distribution_probe.py +0 -0
  191. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/__init__.py +0 -0
  192. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/__init__.py +0 -0
  193. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/command_info_test.py +0 -0
  194. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/command_selection_test.py +0 -0
  195. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/grep_subcmd_test.py +0 -0
  196. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/main_test.py +0 -0
  197. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/mcp_transport_test.py +0 -0
  198. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/pipeline_test.py +0 -0
  199. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/replace_subcmd_test.py +0 -0
  200. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/runs_test.py +0 -0
  201. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/cli/shell_completion_test.py +0 -0
  202. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/colloquial/__init__.py +0 -0
  203. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/colloquial/check_test.py +0 -0
  204. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/colloquial/cli_test.py +0 -0
  205. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/__init__.py +0 -0
  206. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/cache_policy_test.py +0 -0
  207. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/completion_test.py +0 -0
  208. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/conftest.py +0 -0
  209. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/core_test.py +0 -0
  210. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/dispatcher_test.py +0 -0
  211. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/env_test.py +0 -0
  212. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/executor_test.py +0 -0
  213. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/glab_test.py +0 -0
  214. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/linter_fix_test.py +0 -0
  215. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/mise_test.py +0 -0
  216. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/only_failed_test.py +0 -0
  217. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/precommit_guidance_test.py +0 -0
  218. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/precommit_test.py +0 -0
  219. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/process_test.py +0 -0
  220. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/runner_helpers.py +0 -0
  221. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/slow_tests_test.py +0 -0
  222. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/subproject_loop_test.py +0 -0
  223. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/subprojects_test.py +0 -0
  224. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/targets_test.py +0 -0
  225. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/tool_parallelism_test.py +0 -0
  226. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/tool_resolution_test.py +0 -0
  227. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/two_step/__init__.py +0 -0
  228. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/two_step/base_test.py +0 -0
  229. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/two_step/prettier_test.py +0 -0
  230. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/two_step/ruff_test.py +0 -0
  231. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/command/vitest_test.py +0 -0
  232. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/config/__init__.py +0 -0
  233. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/execution_request_helper.py +0 -0
  234. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/__init__.py +0 -0
  235. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/adaptive_test.py +0 -0
  236. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/history_test.py +0 -0
  237. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/matcher_test.py +0 -0
  238. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/preview_test.py +0 -0
  239. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/grep_/scanner_test.py +0 -0
  240. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/__init__.py +0 -0
  241. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/check_doc_codeblocks_test.py +0 -0
  242. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/cli_option_reference_test.py +0 -0
  243. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/documentation_test.py +0 -0
  244. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/external_paths_test.py +0 -0
  245. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/layers_test.py +0 -0
  246. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/llmstxt_test.py +0 -0
  247. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/lychee_test.py +0 -0
  248. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/module_imports_test.py +0 -0
  249. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/only_failed_test.py +0 -0
  250. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/output_format_test.py +0 -0
  251. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/pipeline_always_targets_test.py +0 -0
  252. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/pipeline_fast_targets_test.py +0 -0
  253. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/precommit_test.py +0 -0
  254. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/relative_work_dir_test.py +0 -0
  255. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/replace_failure_test.py +0 -0
  256. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/smoke_test.py +0 -0
  257. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/integration/test_placement_test.py +0 -0
  258. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/__init__.py +0 -0
  259. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/code_quality_test.py +0 -0
  260. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/diagnostics_test.py +0 -0
  261. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/github_annotations_test.py +0 -0
  262. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/jsonl_test.py +0 -0
  263. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/positions_test.py +0 -0
  264. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/sarif_test.py +0 -0
  265. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/output/ui_test.py +0 -0
  266. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/parsing/__init__.py +0 -0
  267. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/parsing/common_test.py +0 -0
  268. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/parsing/pytest_test.py +0 -0
  269. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/parsing/tools_test.py +0 -0
  270. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/rule_urls_test.py +0 -0
  271. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/.editorconfig +0 -0
  272. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/.github/workflows/ci.yaml +0 -0
  273. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/Dockerfile +0 -0
  274. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/pyproject.toml +0 -0
  275. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.md +0 -0
  276. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.py +0 -0
  277. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.sh +0 -0
  278. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.toml +0 -0
  279. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.txt +0 -0
  280. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample.yaml +0 -0
  281. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/basic/sample_test.py +0 -0
  282. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pinact_workspace/.github/workflows/pinned.yaml +0 -0
  283. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pinact_workspace/.github/workflows/unpinned.yaml +0 -0
  284. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pinact_workspace/pyproject.toml +0 -0
  285. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pre_commit_workspace/.pre-commit-config.yaml +0 -0
  286. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pre_commit_workspace/pyproject.toml +0 -0
  287. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/pre_commit_workspace/sample.py +0 -0
  288. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/prek_workspace/.pre-commit-config.yaml +0 -0
  289. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/prek_workspace/pyproject.toml +0 -0
  290. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/prek_workspace/sample.py +0 -0
  291. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/textlint_workspace/package.json +0 -0
  292. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/textlint_workspace/pyproject.toml +0 -0
  293. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/textlint_workspace/sample.md +0 -0
  294. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/eslint.config.js +0 -0
  295. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/package.json +0 -0
  296. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/pyproject.toml +0 -0
  297. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/sample.test.ts +0 -0
  298. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/sample.ts +0 -0
  299. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/ts_workspace/tsconfig.json +0 -0
  300. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/smoke_data/uv_sort_workspace/pyproject.toml +0 -0
  301. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/state/__init__.py +0 -0
  302. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/state/cache_test.py +0 -0
  303. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/text/__init__.py +0 -0
  304. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/text/exclude_fence_test.py +0 -0
  305. {pyfltr-3.22.0 → pyfltr-3.22.2}/tests/warnings_test.py +0 -0
  306. {pyfltr-3.22.0 → pyfltr-3.22.2}/uv.lock +0 -0
@@ -16,8 +16,8 @@ pyfltrの対応ツールがバージョンアップで挙動を変えていな
16
16
  pyfltrは各ツールのバージョン追従が必要なため、差分の確認を定期的に行う。
17
17
  対応ツールの集合は `pyfltr/tools.py` の `BUILTIN_COMMANDS` を典拠とする。
18
18
  チェック対象は`BUILTIN_COMMANDS`の各`CommandInfo`にある`defaults`の引数と、
19
- `diagnostic_pattern`、`parser`、`path_base_parser`が参照する解析処理。
20
- 関数パーサーは`pyfltr/parsing/tools.py`等の登録先を読み、`path_base_parser`にはパス基準の文脈が渡ることも確認する。
19
+ `diagnostic_pattern`、`parser`、`path_resolving_parser`が参照する解析処理。
20
+ 関数パーサーは`pyfltr/parsing/tools.py`等の登録先を読み、`path_resolving_parser`には解析境界のパス変換関数が渡ることも確認する。
21
21
 
22
22
  ## 入力
23
23
 
@@ -57,7 +57,7 @@ pyfltrは各ツールのバージョン追従が必要なため、差分の確
57
57
 
58
58
  - JSON Lines全体を保存し、`header`レコード(`{"kind": "header", "run_id": "..."}`形式)の`run_id`を記録する。`head`等で先頭行だけを読むパイプは使わない
59
59
  - `uv run pyfltr show-run <run_id> --commands=<tool> --output --output-format=text`へ記録済みrun IDを明示し、JSON Linesへラップされていない生出力を取得する。`latest`は使わない
60
- - 出力が対象`CommandInfo.diagnostic_pattern`、`parser`、`path_base_parser`の登録済み解析処理に対応するか比較する
60
+ - 出力が対象`CommandInfo.diagnostic_pattern`、`parser`、`path_resolving_parser`の登録済み解析処理に対応するか比較する
61
61
  - 必須グループ(`file`、`line`、`message`)が正常に取得されるか確認
62
62
 
63
63
  5. 報告
@@ -67,10 +67,10 @@ paths:
67
67
  外部パス専用の追加実行を行ったうえで結果を`CommandResult.merge`で集約する。
68
68
  除外対象ツールでは外部パスを破棄して警告のみ発行する。
69
69
 
70
- `CommandInfo.config_files`は`load_config`の設定不在時の警告とキャッシュキー算出に専用で、
70
+ `CommandInfo.config_files`は設定不在時の警告とキャッシュキー算出に専用で、
71
71
  `--config`注入候補(`config_inject_candidates`)とは責務を分離する。
72
- 設定不在時の警告は起点cwd直下のみを判定対象とし、サブプロジェクト別config解決
73
- (`load_config(for_subproject=True)`)では発行しない。
72
+ 設定不在時の警告は実行パイプラインが実行対象の確定後に今回の実行対象だけを判定し、
73
+ 起点cwd直下のみを判定対象とする。サブプロジェクトのディレクトリでは判定しない。
74
74
  `config_inject_candidates`の解決も起点cwd直下を基準とするため、
75
75
  サブプロジェクトのディレクトリを基準にした不在判定は誤検知になる。
76
76
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pyfltr
3
- Version: 3.22.0
3
+ Version: 3.22.2
4
4
  Summary: 多言語プロジェクトの品質チェックを一元管理し、コーディングエージェントから扱える形で提供する基盤。
5
5
  Project-URL: Homepage, https://github.com/ak110/pyfltr
6
6
  Author-email: "aki." <aki@tqzh.tk>
@@ -20,6 +20,12 @@ TUI/非TUIの分岐はこの関数の内側で行い、パイプライン共通
20
20
  各ステージの結果は`CommandResult`に集約され、ステージ完了ごとに`archive_hook`へ渡される。
21
21
  ステージ間の中断(`--fail-fast`時の打ち切りなど)は`stage_runner`の共通ヘルパーで吸収する。
22
22
 
23
+ fixステージの結果は同じツールの通常ステージと重複するため、成功時は最終結果へ含めず保存だけを行う。
24
+ fixステージが失敗した場合は、同じツールの通常ステージの結果(成功・スキップを含む)へ失敗と出力を統合した1件を
25
+ 最終結果とし、表示・終了コード・`retry_command`・アーカイブへ同じ結果を渡す。
26
+ `--fail-fast`で停止する場合もfixステージの失敗を記録し、同じツールのスキップ結果を重ねない。
27
+ 通常ステージの成功でfixステージの失敗が消えると、修正処理の失敗が利用者へ届かないためである。
28
+
23
29
  ## 層順とサブパッケージの責務 {#modules}
24
30
 
25
31
  依存は次の下位から上位への7層に整理する。同じ層または下位だけをimportし、
@@ -234,6 +240,22 @@ python-runnerへ委譲せず`uvx <bin>`で別環境へ解決する。
234
240
  - 出力スキーマは現行を維持する(JSONL・SARIF・archive・MCP読み取り系APIでサブプロジェクト
235
241
  識別フィールドを新設しない)。サブプロジェクト境界をまたぐ実行結果は `CommandResult.merge` で
236
242
  1件に集約し、人間向け `output` には `# subproject: <相対パス>` の区切り行のみ挿入する
243
+ - 診断の`file`は解析境界(`pyfltr.parsing.entry.parse_errors`)で起点相対へ揃え、統合時には付け替えない。
244
+ 通常・fix・2段階などの各実行処理は`ExecutionRequest.parse_errors`を通じてツールの実行cwd(`path_base`)と実行起点(`start_cwd`)を渡し、
245
+ `pyfltr.paths.to_start_relative`が相対パスを実行cwd基準で絶対化してから起点相対へ変換する。
246
+ 起点外を指すパスは`../`相対を含めて`/`区切りの絶対パスで返し、対象集合が保持する外部パスと同じ表現に揃える。
247
+ 各パーサーはツール出力のパスを区切りの統一だけで返し、基準変換を持たない。
248
+ 診断メッセージにもパスを埋め込むaridは`CommandInfo.path_resolving_parser`として同じ変換関数を受け取る。
249
+ 一時ファイルから元ファイルへの付け替え(`file_path_remap`)は変換の後に適用し、付け替え後の値は再変換しない。
250
+ `--only-failed`と`retry_command`は起点相対の対象集合と診断の`file`を文字列で突合するため、
251
+ 基準が子プロジェクト相対のまま残ると失敗ファイルを選べない
252
+ - 診断を起点相対へ揃える前の版が保存したpytestのアーカイブは、子プロジェクト相対の診断を持つ。
253
+ `ArchiveStore.read_tool_diagnostics`は保存済み生出力の`# subproject:`区間ごとに解析をやり直し、
254
+ `file`・行・メッセージが一致する区間が1件だけの診断を起点相対へ補正して返す。
255
+ 区間を一意に決められない診断は変えず、保存ファイルも書き換えない。
256
+ 新しい版はrunの`meta.json`へ`diagnostic_paths: start-relative`を書き、このキーを持たないrunだけを補正の対象にする。
257
+ 新しい版のrunを補正すると、起点直下の診断を同じ位置・メッセージを持つ子の診断と取り違えるためである。
258
+ 診断のbasenameや末尾一致で所属を推測する案は、子プロジェクト間で同じ相対名を持つファイルを誤選択するため採らない
237
259
  - `subprocess.Popen` へのcwd切り替えは引数渡しのみで実現する。`os.chdir()` を
238
260
  サブプロジェクトループで使うとプロセスcwdが並列実行中の他ツールへ干渉するため、
239
261
  cwd依存処理(mise・git・ファイル走査・snapshot等)は明示引数で起点cwdを取得する形に統一する
@@ -404,7 +426,7 @@ CLI JSONLはシェルしか使えない消費側向けの代替手段として
404
426
  対象はJSON Lines出力・CLIテキスト出力・CLIのJSON出力・MCPツール応答・SARIF・Code Quality・
405
427
  GitHub Annotationsの各出力で返すファイルパスである。
406
428
  除外対象や欠落対象として警告へ載せるパスも含む。
407
- 生成時は`pyfltr.paths.normalize_separators`または`pyfltr.paths.to_cwd_relative`を経由する。
429
+ 生成時は`pyfltr.paths.normalize_separators`・`pyfltr.paths.to_cwd_relative`・`pyfltr.paths.to_start_relative`のいずれかを経由する。
408
430
  公開値を`str()`で直接文字列化しない。
409
431
  pyfltr自身が実装するツール(`colloquial-check`など)の標準出力に含めるファイル位置も、
410
432
  生成時点で同じ正規化を経由する。これらのツールの生標準出力は`show-run --commands <name> --output`と
@@ -736,6 +758,8 @@ subparsersを`required=True`で必須化し、引数なし実行時のフォー
736
758
 
737
759
  アーカイブの保存キーはツール名固定のため、同一ツール名のfixステージと通常ステージは
738
760
  通常ステージで上書きされる。
761
+ fixステージが失敗した場合は通常ステージの結果へ統合した1件を保存するため、
762
+ `show-run`からfixステージの失敗と出力を取得できる(本書「実行パイプライン」を参照)。
739
763
  `show-run`は各ツールの最終保存結果のみを参照可能で、ステージ別保存への拡張は対象外とする。
740
764
 
741
765
  run_id解決は完全一致に加えて前方一致と`latest`エイリアスを許容する。
@@ -856,9 +880,9 @@ worker方式は起動費用を持つが、共有状態を分離し、子孫を
856
880
  プロセスグローバルなcwdに干渉しないため、`ThreadPoolExecutor`によるツールの並列実行や
857
881
  MCPクライアントからの並行ツール呼び出しでも実行起点を呼び出し単位で維持できる。
858
882
 
859
- `work_dir`指定時は診断のファイルパスが絶対パスで返る場合がある。
860
- `pyfltr.paths.to_cwd_relative()`はプロセスのcwdだけを相対化の基準とし、
861
- `work_dir`を基準ディレクトリとして注入する仕組みを持たないためである。
883
+ 診断のファイルパスは解析境界で`start_cwd`(`work_dir`)を基準に相対化する(本書「モノレポ対応」を参照)。
884
+ `pyfltr.paths.to_cwd_relative()`はプロセスのcwdだけを相対化の基準とするため、
885
+ 診断以外でこの関数を経由する値は`work_dir`指定時に絶対パスで返る場合がある。
862
886
 
863
887
  #### `run_pipeline()`戻り値
864
888
 
@@ -411,6 +411,15 @@ fix段では、pyfltrはtextlintを2段階で実行する(fix適用 → lint
411
411
  `--format` ペアを自動除去するためクラッシュしない。
412
412
  `--format` 指定は `textlint-lint-args`(lintモード専用)に書くことを推奨する。
413
413
 
414
+ `textlint-args`へ`--cache`を書くと、lint段と後段のlintチェックはtextlintのキャッシュを使う。
415
+ fixステップでは、pyfltrが起動コマンドの末尾へ`--no-cache`を加えてキャッシュを無効化する。
416
+ textlintはキャッシュに一致したファイルを修正しようとすると例外で終了する場合があるためである。
417
+ `command-info textlint`の`fix_commandline`にも同じ引数が現れる。
418
+
419
+ fixステップが失敗した場合(終了コード1の例外を含む)は、後段のlintチェックが成功しても
420
+ textlintを`failed`として扱い、fixステップの出力を結果へ残す。
421
+ `show-run`やMCPの`show_run_output`でfixステップの出力を確認できる。
422
+
414
423
  ### prettier の 2 段階実行
415
424
 
416
425
  `prettier`は`--check`(読み取り専用)と`--write`(書き込み)が排他のため、pyfltrは2段階で実行する。
@@ -43,7 +43,8 @@ fast = true
43
43
  - `pass-filenames`: ファイル引数をコマンドに渡すか否か(省略時は`true`)。
44
44
  プロジェクト全体を一括チェックするツールでは`false`に設定する
45
45
  - `config-files`: このコマンドの設定ファイル候補のリスト(省略時は空)。globパターン可。
46
- 有効化時にどれもプロジェクトルート直下に見つからないとpyfltrが警告を発行する(ツール自体は実行する)。
46
+ 有効化したコマンドを実行するときに、どれもプロジェクトルート直下に見つからないとpyfltrが警告を発行する(ツール自体は実行する)。
47
+ `--commands`などで実行対象から外したコマンドは判定しない。
47
48
  pre-commit・prekなどの「設定ファイル無しでは機能しないツール」の設定不備を可視化する用途。
48
49
  判定はモノレポでも起点cwd直下のみを対象とし、サブプロジェクトのディレクトリでは行わない
49
50
  - `severity`: `"error"`(既定)または`"warning"`。
@@ -735,6 +735,9 @@ textlint-lint-args = ["--format", "compact"]
735
735
  pyfltrはfix段の起動コマンドから`--format`ペアを自動除去するため。
736
736
  ただし新規設定では`textlint-lint-args`に書くことを推奨する。
737
737
 
738
+ lint段を高速化するために`textlint-args`へ`--cache`を設定してよい。
739
+ pyfltrはfix段の起動コマンドへ`--no-cache`を加えるため、自動修正ではtextlintのキャッシュを使わない。
740
+
738
741
  ## 呼び出し方の使い分け {#calling-style}
739
742
 
740
743
  状況に応じて`pyfltr`の呼び出し方を以下のいずれかから選ぶ。
@@ -410,7 +410,6 @@ async def tool_run(
410
410
  commands_list,
411
411
  config,
412
412
  start_cwd=base,
413
- original_cwd=str(work_dir_path) if work_dir_path is not None else None,
414
413
  original_sys_args=args.retry_arguments(for_mcp=True),
415
414
  force_text_on_stderr=True,
416
415
  jsonl_warnings_reach_consumer=False,
@@ -38,6 +38,7 @@ import pyfltr.command.targets
38
38
  import pyfltr.config.config
39
39
  import pyfltr.config.model
40
40
  import pyfltr.config.selection
41
+ import pyfltr.config.validation
41
42
  import pyfltr.output.formatters
42
43
  import pyfltr.output.jsonl
43
44
  import pyfltr.output.logging_
@@ -248,7 +249,7 @@ def _make_attach_retry_command(
248
249
  *,
249
250
  retry_args_template: list[str],
250
251
  launcher_prefix: list[str],
251
- original_cwd: str,
252
+ target_base_cwd: str,
252
253
  ) -> typing.Callable[[pyfltr.command.core_.CommandResult], None]:
253
254
  """retry_command付与フックを生成する。
254
255
 
@@ -261,7 +262,7 @@ def _make_attach_retry_command(
261
262
  result,
262
263
  retry_args_template=retry_args_template,
263
264
  launcher_prefix=launcher_prefix,
264
- original_cwd=original_cwd,
265
+ target_base_cwd=target_base_cwd,
265
266
  )
266
267
 
267
268
  return _hook
@@ -295,8 +296,9 @@ def run_commands_with_cli(
295
296
  JSONL stdoutモードでのストリーミング出力に使用する。
296
297
 
297
298
  `archive_hook`が指定されている場合、各コマンド完了時に実行アーカイブへ書き込む。
298
- fixステージの結果はsummaryに含めないが、アーカイブには通常ステージ以外も含めて
299
- 全実行を保存するためfixステージからも`archive_hook`を呼び出す。
299
+ 成功したfixステージの結果はsummaryに含めず、アーカイブへの保存だけを行う。
300
+ 失敗したfixステージの結果は同じツールの通常ステージの結果へ統合して
301
+ summary・`on_result`・アーカイブへ渡す(`pyfltr.command.stage_runner.run_stages`を参照)。
300
302
 
301
303
  `base_ctx`はパイプライン全体で不変のコンテキスト(config・all_files・cache_store・
302
304
  cache_run_idを含む)。各コマンド実行前に`ExecutionContext`を組み立てて渡す。
@@ -389,7 +391,6 @@ def run_pipeline(
389
391
  config: pyfltr.config.model.Config,
390
392
  *,
391
393
  start_cwd: pathlib.Path | None = None,
392
- original_cwd: str | None = None,
393
394
  original_sys_args: list[str] | None = None,
394
395
  force_text_on_stderr: bool = False,
395
396
  jsonl_warnings_reach_consumer: bool = True,
@@ -402,7 +403,6 @@ def run_pipeline(
402
403
  commands,
403
404
  config,
404
405
  start_cwd=start_cwd,
405
- original_cwd=original_cwd,
406
406
  original_sys_args=original_sys_args,
407
407
  force_text_on_stderr=force_text_on_stderr,
408
408
  jsonl_warnings_reach_consumer=jsonl_warnings_reach_consumer,
@@ -412,7 +412,6 @@ def run_pipeline(
412
412
  commands,
413
413
  config,
414
414
  start_cwd=start_cwd,
415
- original_cwd=original_cwd,
416
415
  original_sys_args=original_sys_args,
417
416
  force_text_on_stderr=force_text_on_stderr,
418
417
  jsonl_warnings_reach_consumer=jsonl_warnings_reach_consumer,
@@ -425,7 +424,6 @@ def _run_pipeline(
425
424
  config: pyfltr.config.model.Config,
426
425
  *,
427
426
  start_cwd: pathlib.Path | None = None,
428
- original_cwd: str | None = None,
429
427
  original_sys_args: list[str] | None = None,
430
428
  force_text_on_stderr: bool = False,
431
429
  jsonl_warnings_reach_consumer: bool = True,
@@ -470,7 +468,6 @@ def _run_pipeline(
470
468
  if isinstance(prepared, PipelineOutcome):
471
469
  return prepared
472
470
 
473
- effective_cwd = original_cwd if original_cwd is not None else os.getcwd()
474
471
  effective_sys_args = list(original_sys_args) if original_sys_args is not None else list(sys.argv[1:])
475
472
  launcher_prefix = pyfltr.state.retry.detect_launcher_prefix()
476
473
  retry_args_template = pyfltr.state.retry.build_retry_args_template(effective_sys_args)
@@ -481,7 +478,8 @@ def _run_pipeline(
481
478
  attach_retry_command = _make_attach_retry_command(
482
479
  retry_args_template=retry_args_template,
483
480
  launcher_prefix=launcher_prefix,
484
- original_cwd=effective_cwd,
481
+ # 対象ファイルは実行起点相対で保持されるため、起動時のcwdではなく実行起点を基準に絶対化する。
482
+ target_base_cwd=str(start_cwd_path),
485
483
  )
486
484
  base_ctx = _prepare_execution_context(config, prepared, start_cwd_path, cache_store, run_id)
487
485
  ctx = _prepare_run_output(
@@ -867,6 +865,8 @@ def _prepare_execution_targets(
867
865
  commands = _add_subproject_fast_pytest(commands, args, config, subproject_configs)
868
866
  requested_commands = list(commands)
869
867
  commands = [c for c in commands if pyfltr.config.selection.is_command_enabled_anywhere(c, config, subproject_configs)]
868
+ # 設定ファイル欠落の警告は確定した実行対象だけを判定する(未選択コマンドの警告を返さない)。
869
+ pyfltr.config.validation.warn_config_files(config, start_cwd_path, commands)
870
870
  unmet: list[str] = []
871
871
  if getattr(args, "commands", None) is not None:
872
872
  unmet = pyfltr.cli.command_selection.compute_unmet_commands(
@@ -1314,7 +1314,6 @@ def run_impl(
1314
1314
  commands,
1315
1315
  config,
1316
1316
  start_cwd=options.work_dir if options.work_dir is not None else pathlib.Path(original_cwd),
1317
- original_cwd=original_cwd,
1318
1317
  original_sys_args=options.retry_arguments(),
1319
1318
  )
1320
1319
  return outcome.exit_code
@@ -10,6 +10,7 @@ import pyfltr.command.slow_tests
10
10
  import pyfltr.config.config
11
11
  import pyfltr.config.model
12
12
  import pyfltr.diagnostics
13
+ import pyfltr.parsing.entry
13
14
  import pyfltr.tools
14
15
 
15
16
  FAILED_STATUSES: frozenset[str] = frozenset({"failed", "resolution_failed"})
@@ -26,7 +27,6 @@ if typing.TYPE_CHECKING:
26
27
  import pyfltr.command.only_failed
27
28
  import pyfltr.command.process
28
29
  import pyfltr.command.subprojects
29
- import pyfltr.parsing.entry
30
30
 
31
31
  Subproject = pyfltr.command.subprojects.Subproject
32
32
 
@@ -711,6 +711,21 @@ class ExecutionRequest:
711
711
  """同じ実行設定のOOM再試行条件を返す。"""
712
712
  return pyfltr.config.model.resolve_retry_kwargs(self.ctx.config.values)
713
713
 
714
+ def parse_errors(self, output: str, error_pattern: str | None) -> "list[pyfltr.diagnostics.ErrorLocation]":
715
+ """実行cwdと実行起点を基準にしてツール出力を診断へ変換する。
716
+
717
+ 各実行経路(通常・fix・2段階・個別実行モジュール)が同じパス基準を
718
+ `pyfltr.parsing.entry.parse_errors`へ渡すための入口である。
719
+ """
720
+ return pyfltr.parsing.entry.parse_errors(
721
+ self.command,
722
+ output,
723
+ error_pattern,
724
+ file_path_remap=self.params.file_path_remap,
725
+ path_base=self.cwd,
726
+ start_cwd=self.ctx.base.start_cwd,
727
+ )
728
+
714
729
 
715
730
  def overall_status(results: "typing.Iterable[CommandResult]") -> typing.Literal["SUCCESS", "FORMATTED", "FAILED"]:
716
731
  """失敗、書き換え、成功の優先順で実行全体の状態を決める。"""
@@ -32,7 +32,6 @@ import pyfltr.command.vitest
32
32
  import pyfltr.config.config
33
33
  import pyfltr.config.model
34
34
  import pyfltr.config.selection
35
- import pyfltr.parsing.entry
36
35
  import pyfltr.parsing.pytest
37
36
  import pyfltr.paths
38
37
  import pyfltr.run_options
@@ -486,13 +485,7 @@ def _run_plain_command(request: pyfltr.command.core_.ExecutionRequest) -> pyfltr
486
485
 
487
486
  output = proc.stdout.strip()
488
487
  elapsed = time.perf_counter() - request.start_time
489
- errors = pyfltr.parsing.entry.parse_errors(
490
- request.command,
491
- output,
492
- request.params.command_info.error_pattern,
493
- file_path_remap=request.params.file_path_remap,
494
- path_base=request.cwd,
495
- )
488
+ errors = request.parse_errors(output, request.params.command_info.error_pattern)
496
489
  # pytestは設定ファイル競合をヘッダー1行で通知するだけで終了コードへ反映しない。
497
490
  # 拾わないと設定が適用されないまま完走した実行を成功として報告してしまう。
498
491
  slow_tests: list[pyfltr.command.slow_tests.SlowTest] = []
@@ -9,7 +9,6 @@ import pyfltr.command.core_
9
9
  import pyfltr.command.process
10
10
  import pyfltr.config.config
11
11
  import pyfltr.config.model
12
- import pyfltr.parsing.entry
13
12
  import pyfltr.tools
14
13
  import pyfltr.warnings_
15
14
  from pyfltr.command.core_ import CommandResult
@@ -76,7 +75,7 @@ def execute_glab_ci_lint(request: pyfltr.command.core_.ExecutionRequest) -> pyfl
76
75
  elapsed=elapsed,
77
76
  )
78
77
 
79
- errors = pyfltr.parsing.entry.parse_errors(request.command, output, request.params.command_info.error_pattern)
78
+ errors = request.parse_errors(output, request.params.command_info.error_pattern)
80
79
  result = CommandResult.from_run(
81
80
  command=request.command,
82
81
  command_info=request.params.command_info,
@@ -6,7 +6,6 @@ import pyfltr.command.core_
6
6
  import pyfltr.command.process
7
7
  import pyfltr.config.config
8
8
  import pyfltr.config.model
9
- import pyfltr.parsing.entry
10
9
  from pyfltr.command.core_ import CommandResult
11
10
  from pyfltr.command.snapshot import changed_files, snapshot_file_digests
12
11
 
@@ -46,7 +45,7 @@ def execute_linter_fix(request: pyfltr.command.core_.ExecutionRequest) -> pyfltr
46
45
  else:
47
46
  result_command_type = "linter"
48
47
 
49
- errors = pyfltr.parsing.entry.parse_errors(request.command, output, None)
48
+ errors = request.parse_errors(output, None)
50
49
 
51
50
  result = CommandResult.from_run(
52
51
  command=request.command,
@@ -973,7 +973,8 @@ def build_invocation_argv(
973
973
  `commandline_prefix` 側(`{command}-path` 由来)の展開は `build_commandline` で済ませている。
974
974
 
975
975
  textlintのfix段は `execute_textlint_fix` のStep1と同じ規則
976
- (`--format` ペアを除去したargs + fix-args、auto_args / 構造化出力引数なし)を適用する。
976
+ (`--format` ペアを除去したargs + fix-args + additional_args + `--no-cache`、
977
+ auto_args / 構造化出力引数なし)を適用する。
977
978
  実行本体(`_prepare_execution_params` / `execute_textlint_fix`)と
978
979
  `command-info` 表示の双方から本ヘルパーへ集約することで、組み立て規則の重複定義を避ける。
979
980
  """
@@ -983,6 +984,9 @@ def build_invocation_argv(
983
984
  # textlintのfix Step1はfixer-formatterがcompact系をサポートしないため、
984
985
  # ユーザー指定の `--format` ペアを一律で除去したうえでfix-argsを結合する特殊経路。
985
986
  # auto_args・構造化出力引数も適用しない(fixer出力の解析は本ステップでは行わないため)。
987
+ # 末尾の`--no-cache`は修正段だけtextlintのキャッシュを無効化する。textlint 15.8.0はキャッシュヒット時に
988
+ # 修正後の本文を持たない結果を修正処理へ渡して例外終了するため、利用者が通常lint向けに`--cache`を
989
+ # 設定していても修正段では使わない。後勝ちで適用されるよう利用者引数の結合後に置き、通常段の引数は変えない。
986
990
  if fix_stage and command == "textlint":
987
991
  fix_args: list[str] = expanduser_args(list(pyfltr.config.model.command_setting(config.values, command, "fix-args", [])))
988
992
  return [
@@ -990,6 +994,7 @@ def build_invocation_argv(
990
994
  *_strip_format_option(user_args),
991
995
  *fix_args,
992
996
  *extra,
997
+ "--no-cache",
993
998
  ]
994
999
 
995
1000
  fix_args_value: list[str] | None = None
@@ -76,7 +76,13 @@ def run_stages(
76
76
  callbacks: StageCallbacks | None = None,
77
77
  results: list[pyfltr.command.core_.CommandResult] | None = None,
78
78
  ) -> list[pyfltr.command.core_.CommandResult]:
79
- """fix、直列formatter、LPT順の並列lint・testを共通の制御で実行する。"""
79
+ """fix、直列formatter、LPT順の並列lint・testを共通の制御で実行する。
80
+
81
+ fix段の結果は通常段の結果と同じツールの実行であり、成功時は保存だけを行い最終結果へ含めない。
82
+ fix段が失敗した場合は、同じツールの通常段の結果(成功・スキップを含む)へ失敗と出力を統合した
83
+ 1件を最終結果とし、`collected`・`on_result`・`archive`へ同じ結果を渡す。
84
+ fail-fastで停止する場合もfix段の失敗結果を記録し、同じツールのスキップ結果を重ねない。
85
+ """
80
86
  hooks = callbacks if callbacks is not None else StageCallbacks()
81
87
  collected = results if results is not None else []
82
88
  config = base_ctx.config
@@ -92,9 +98,15 @@ def run_stages(
92
98
  if hooks.archive is not None and not result.cached:
93
99
  hooks.archive(result)
94
100
 
101
+ # fix段で失敗したツールの結果。通常段の結果を記録するときに統合する。
102
+ fix_failures: dict[str, pyfltr.command.core_.CommandResult] = {}
103
+
95
104
  def record(result: pyfltr.command.core_.CommandResult, stage: str) -> None:
96
105
  if hooks.replace_result is not None:
97
106
  result = hooks.replace_result(result, stage)
107
+ fix_failure = fix_failures.pop(result.command, None)
108
+ if fix_failure is not None:
109
+ result = merge_fix_failure(fix_failure, result)
98
110
  collected.append(result)
99
111
  archive(result)
100
112
  if hooks.on_result is not None:
@@ -108,16 +120,26 @@ def run_stages(
108
120
  if hooks.on_skipped is not None:
109
121
  hooks.on_skipped(command)
110
122
 
123
+ def flush_fix_failures() -> None:
124
+ # 通常段の対象に含まれないツールのfix段失敗も最終結果へ残す。
125
+ for command in list(fix_failures):
126
+ record(make_skipped_result(command, config, reason=""), "skipped")
127
+
111
128
  for command in fixers:
112
129
  result = execute(command, True)
113
- archive(result)
130
+ if result.failed:
131
+ fix_failures[command] = result
132
+ else:
133
+ archive(result)
114
134
  if hooks.is_interrupted():
115
135
  if hooks.on_interrupted is not None:
116
136
  hooks.on_interrupted(command)
117
137
  skip([*formatters, *parallel])
138
+ flush_fix_failures()
118
139
  return collected
119
140
  if fail_fast and result.failed:
120
141
  skip([*formatters, *parallel])
142
+ flush_fix_failures()
121
143
  return collected
122
144
 
123
145
  for index, command in enumerate(formatters):
@@ -148,4 +170,26 @@ def run_stages(
148
170
  cancel_pending_futures(future_to_command, aborted_commands)
149
171
  if aborted_commands:
150
172
  skip(list(aborted_commands))
173
+ flush_fix_failures()
151
174
  return collected
175
+
176
+
177
+ def merge_fix_failure(
178
+ fix_result: pyfltr.command.core_.CommandResult,
179
+ result: pyfltr.command.core_.CommandResult,
180
+ ) -> pyfltr.command.core_.CommandResult:
181
+ """fix段の失敗を同じツールの通常段の結果へ統合する。
182
+
183
+ 状態と終了コードは`CommandResult.merge`の規則で集約し、fix段の失敗を保持する。
184
+ 再実行コマンドなど通常段で確定した値は通常段の結果から引き継ぐため、通常段を先頭にして集約する。
185
+ 出力は実行順にfix段、通常段の順で連結する。対象件数は同じ対象を2段で数えないよう通常段の値を使う。
186
+ 通常段が診断を出力した場合は通常段の診断だけを使う。fix段の診断は修正後の残存違反であり、通常段の診断と重複するためである。
187
+ 通常段が診断を出力しなかった場合(スキップや診断0件)はfix段の診断を残し、失敗を指すファイルと位置を保持する。
188
+ """
189
+ fix_part = dataclasses.replace(fix_result, errors=[]) if result.errors else fix_result
190
+ merged = pyfltr.command.core_.CommandResult.merge([result, fix_part])
191
+ return dataclasses.replace(
192
+ merged,
193
+ output="\n".join(output for output in (fix_result.output, result.output) if output),
194
+ files=result.files or fix_result.files,
195
+ )
@@ -103,6 +103,8 @@ def run_subproject_loop(
103
103
  実行順が非決定になっても報告順を変えないよう、`relative` の昇順で並べてから集約する。
104
104
 
105
105
  結果は `CommandResult.merge` で集約する(1件のみならそのまま返す)。
106
+ 各結果の診断の`file`は解析時点(`ExecutionRequest.parse_errors`)で起点相対へ変換済みのため、
107
+ 集約時にパスを付け替えない。
106
108
  いずれのサブプロジェクトでも実行されず、設定による無効スキップが発生したか起点でも無効な場合は、
107
109
  起点cwdでの全ファイル誤実行を避けて skipped 結果を返す。
108
110
  全件ファイル0件かつ起点で有効なときのみ通常経路の0件結果を返す(`dispatch_fn` 経由)。
@@ -9,7 +9,6 @@ import pyfltr.command.core_
9
9
  import pyfltr.command.process
10
10
  import pyfltr.config.config
11
11
  import pyfltr.config.model
12
- import pyfltr.parsing.entry
13
12
  import pyfltr.paths
14
13
  import pyfltr.tools
15
14
  from pyfltr.command.core_ import CommandResult
@@ -40,16 +39,22 @@ def execute_textlint_fix(request: pyfltr.command.core_.ExecutionRequest) -> pyfl
40
39
 
41
40
  Step1: fix適用
42
41
  commandline_prefix + (textlint-argsから--formatペアを除去) + fix-args
43
- + additional_args + targets
42
+ + additional_args + `--no-cache` + targets
43
+ (textlintのキャッシュヒット結果は修正後の本文を持たず修正処理が例外終了するため、
44
+ 修正段だけキャッシュを無効化する。通常lint段は利用者のキャッシュ指定を保つ)
44
45
 
45
46
  Step2: lintチェック (残存違反を取得)
46
47
  commandline_prefix + textlint-args + textlint-lint-args + additional_args + targets
47
48
 
48
49
  ステータス判定:
49
- -いずれかのステップがrc>=2 (致命的エラー) → failed
50
+ - いずれかのステップがrc>=2 (致命的エラー) → failed
50
51
  - Step2 rc != 0 (残存違反あり) → failed (Errorsタブに反映される)
51
- - Step2 rc == 0かつStep1で内容ハッシュに変化あり → formatted
52
- - Step2 rc == 0かつ変化なし → succeeded
52
+ - Step1 rc != 0かつStep2 rc == 0 → failed (returncodeはStep1の値)。
53
+ textlintの終了1は残存違反に加えて予期しない例外も表し、修正段に違反が残れば
54
+ Step2も非0になるため、この組合せは修正処理の失敗を示す
55
+ - いずれもrc == 0かつStep1で内容ハッシュに変化あり → formatted
56
+ - いずれもrc == 0かつ変化なし → succeeded
57
+ 修正段とlint段の出力はいずれも`output`へ保持する。
53
58
 
54
59
  textlint --fixは残存違反がなくても対象ファイルを書き戻すことがあり、
55
60
  mtimeベースの比較では偽陽性になる。このため内容ハッシュ
@@ -91,7 +96,7 @@ def execute_textlint_fix(request: pyfltr.command.core_.ExecutionRequest) -> pyfl
91
96
 
92
97
  step1_proc = pyfltr.command.process.run_process(dataclasses.replace(request, verbose=False), step1_commandline)
93
98
  step1_rc = step1_proc.returncode
94
- # rc=0 (違反なし) / rc=1 (違反残存) は通常終了、rc>=2は致命的エラー扱い
99
+ # rc>=2は致命的エラー扱い。rc=1はStep2の結果と併せて判定する(docstringのステータス判定を参照)
95
100
  step1_fatal = step1_rc >= 2
96
101
  digests_after_step1 = snapshot_file_digests(request.params.targets, base_cwd=request.ctx.base.start_cwd)
97
102
  step1_changed = digests_after_step1 != digests_before
@@ -127,7 +132,7 @@ def execute_textlint_fix(request: pyfltr.command.core_.ExecutionRequest) -> pyfl
127
132
  elapsed = time.perf_counter() - request.start_time
128
133
 
129
134
  # Step2出力から残存違反をパースする
130
- errors = pyfltr.parsing.entry.parse_errors(request.command, output, request.params.command_info.error_pattern)
135
+ errors = request.parse_errors(output, request.params.command_info.error_pattern)
131
136
 
132
137
  # ステータス判定
133
138
  timeout_exceeded = step1_proc.timeout_exceeded or step2_proc.timeout_exceeded
@@ -139,6 +144,10 @@ def execute_textlint_fix(request: pyfltr.command.core_.ExecutionRequest) -> pyfl
139
144
  step_failed = True
140
145
  returncode = step2_rc
141
146
  result_command_type = "linter"
147
+ elif step1_rc != 0:
148
+ step_failed = True
149
+ returncode = step1_rc
150
+ result_command_type = "linter"
142
151
  elif step1_changed:
143
152
  # fix適用済み、残存違反なし → formatted扱いにする
144
153
  step_failed = False
@@ -17,7 +17,6 @@ import pyfltr.command.process
17
17
  import pyfltr.command.runner
18
18
  import pyfltr.config.config
19
19
  import pyfltr.config.model
20
- import pyfltr.parsing.entry
21
20
  import pyfltr.paths
22
21
  import pyfltr.tools
23
22
  from pyfltr.command.core_ import CommandResult
@@ -218,11 +217,7 @@ def _run_fix_mode(
218
217
  formatter_failed = False
219
218
  returncode = 0
220
219
 
221
- errors = (
222
- pyfltr.parsing.entry.parse_errors(request.command, output, request.params.command_info.error_pattern)
223
- if parse_errors
224
- else []
225
- )
220
+ errors = request.parse_errors(output, request.params.command_info.error_pattern) if parse_errors else []
226
221
 
227
222
  resolved_type = (
228
223
  command_type_override(formatter_failed, returncode)
@@ -7,7 +7,6 @@ import pyfltr.command.core_
7
7
  import pyfltr.command.process
8
8
  import pyfltr.config.config
9
9
  import pyfltr.config.model
10
- import pyfltr.parsing.entry
11
10
  import pyfltr.tools
12
11
  from pyfltr.command.core_ import CommandResult
13
12
  from pyfltr.command.snapshot import changed_files, snapshot_file_digests
@@ -89,7 +88,7 @@ def _run_prettier_check_then_write(
89
88
  if step1_rc == 0:
90
89
  output = step1_proc.stdout.strip()
91
90
  elapsed = time.perf_counter() - request.start_time
92
- errors = pyfltr.parsing.entry.parse_errors(request.command, output, request.params.command_info.error_pattern)
91
+ errors = request.parse_errors(output, request.params.command_info.error_pattern)
93
92
  return CommandResult.from_run(
94
93
  command=request.command,
95
94
  command_info=request.params.command_info,
@@ -108,7 +107,7 @@ def _run_prettier_check_then_write(
108
107
  # timeout超過は同じハングが再現する確率が高く、検証時間を浪費するためStep2を実行しない。
109
108
  output = step1_proc.stdout.strip()
110
109
  elapsed = time.perf_counter() - request.start_time
111
- errors = pyfltr.parsing.entry.parse_errors(request.command, output, request.params.command_info.error_pattern)
110
+ errors = request.parse_errors(output, request.params.command_info.error_pattern)
112
111
  return CommandResult.from_run(
113
112
  command=request.command,
114
113
  command_info=request.params.command_info,
@@ -137,7 +136,7 @@ def _run_prettier_check_then_write(
137
136
  formatter_failed = True
138
137
  returncode = step2_rc
139
138
 
140
- errors = pyfltr.parsing.entry.parse_errors(request.command, output, request.params.command_info.error_pattern)
139
+ errors = request.parse_errors(output, request.params.command_info.error_pattern)
141
140
  result = CommandResult.from_run(
142
141
  command=request.command,
143
142
  command_info=request.params.command_info,
@@ -8,7 +8,6 @@ import pyfltr.command.process
8
8
  import pyfltr.command.runner
9
9
  import pyfltr.config.config
10
10
  import pyfltr.config.model
11
- import pyfltr.parsing.entry
12
11
  import pyfltr.tools
13
12
  from pyfltr.command.core_ import CommandResult
14
13
  from pyfltr.command.snapshot import changed_files, snapshot_file_digests
@@ -78,7 +77,7 @@ def _run_ruff_two_step(request: pyfltr.command.core_.ExecutionRequest, *, check_
78
77
  else:
79
78
  returncode = 0
80
79
 
81
- errors = pyfltr.parsing.entry.parse_errors(request.command, output, request.params.command_info.error_pattern)
80
+ errors = request.parse_errors(output, request.params.command_info.error_pattern)
82
81
 
83
82
  # commandlineは代表として「最後に実行したステップ」(= ruff format)を格納。
84
83
  # 両ステップ分のcommandlineはverbose出力で確認可能。