crackerjack 0.37.9__py3-none-any.whl → 0.45.2__py3-none-any.whl

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 (425) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +30 -1
  3. crackerjack/__main__.py +342 -1263
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +27 -5
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/{rust_tool_manager.py → lsp/_manager.py} +3 -3
  27. crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
  28. crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
  29. crackerjack/adapters/refactor/README.md +59 -0
  30. crackerjack/adapters/refactor/__init__.py +12 -0
  31. crackerjack/adapters/refactor/creosote.py +318 -0
  32. crackerjack/adapters/refactor/refurb.py +406 -0
  33. crackerjack/adapters/refactor/skylos.py +494 -0
  34. crackerjack/adapters/sast/README.md +132 -0
  35. crackerjack/adapters/sast/__init__.py +32 -0
  36. crackerjack/adapters/sast/_base.py +201 -0
  37. crackerjack/adapters/sast/bandit.py +423 -0
  38. crackerjack/adapters/sast/pyscn.py +405 -0
  39. crackerjack/adapters/sast/semgrep.py +241 -0
  40. crackerjack/adapters/security/README.md +111 -0
  41. crackerjack/adapters/security/__init__.py +17 -0
  42. crackerjack/adapters/security/gitleaks.py +339 -0
  43. crackerjack/adapters/type/README.md +52 -0
  44. crackerjack/adapters/type/__init__.py +12 -0
  45. crackerjack/adapters/type/pyrefly.py +402 -0
  46. crackerjack/adapters/type/ty.py +402 -0
  47. crackerjack/adapters/type/zuban.py +522 -0
  48. crackerjack/adapters/utility/README.md +51 -0
  49. crackerjack/adapters/utility/__init__.py +10 -0
  50. crackerjack/adapters/utility/checks.py +884 -0
  51. crackerjack/agents/README.md +264 -0
  52. crackerjack/agents/__init__.py +40 -12
  53. crackerjack/agents/base.py +1 -0
  54. crackerjack/agents/claude_code_bridge.py +641 -0
  55. crackerjack/agents/coordinator.py +49 -53
  56. crackerjack/agents/dry_agent.py +187 -3
  57. crackerjack/agents/enhanced_coordinator.py +279 -0
  58. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  59. crackerjack/agents/error_middleware.py +53 -0
  60. crackerjack/agents/formatting_agent.py +6 -8
  61. crackerjack/agents/helpers/__init__.py +9 -0
  62. crackerjack/agents/helpers/performance/__init__.py +22 -0
  63. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  64. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  65. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  66. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  67. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  68. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  69. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  70. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  71. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  72. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  73. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  74. crackerjack/agents/performance_agent.py +121 -1152
  75. crackerjack/agents/refactoring_agent.py +156 -655
  76. crackerjack/agents/semantic_agent.py +479 -0
  77. crackerjack/agents/semantic_helpers.py +356 -0
  78. crackerjack/agents/test_creation_agent.py +19 -1605
  79. crackerjack/api.py +5 -7
  80. crackerjack/cli/README.md +394 -0
  81. crackerjack/cli/__init__.py +1 -1
  82. crackerjack/cli/cache_handlers.py +23 -18
  83. crackerjack/cli/cache_handlers_enhanced.py +1 -4
  84. crackerjack/cli/facade.py +70 -8
  85. crackerjack/cli/formatting.py +13 -0
  86. crackerjack/cli/handlers/__init__.py +85 -0
  87. crackerjack/cli/handlers/advanced.py +103 -0
  88. crackerjack/cli/handlers/ai_features.py +62 -0
  89. crackerjack/cli/handlers/analytics.py +479 -0
  90. crackerjack/cli/handlers/changelog.py +271 -0
  91. crackerjack/cli/handlers/config_handlers.py +16 -0
  92. crackerjack/cli/handlers/coverage.py +84 -0
  93. crackerjack/cli/handlers/documentation.py +280 -0
  94. crackerjack/cli/handlers/main_handlers.py +497 -0
  95. crackerjack/cli/handlers/monitoring.py +371 -0
  96. crackerjack/cli/handlers.py +249 -49
  97. crackerjack/cli/interactive.py +8 -5
  98. crackerjack/cli/options.py +203 -110
  99. crackerjack/cli/semantic_handlers.py +292 -0
  100. crackerjack/cli/version.py +19 -0
  101. crackerjack/code_cleaner.py +60 -24
  102. crackerjack/config/README.md +472 -0
  103. crackerjack/config/__init__.py +256 -0
  104. crackerjack/config/global_lock_config.py +191 -54
  105. crackerjack/config/hooks.py +188 -16
  106. crackerjack/config/loader.py +239 -0
  107. crackerjack/config/settings.py +141 -0
  108. crackerjack/config/tool_commands.py +331 -0
  109. crackerjack/core/README.md +393 -0
  110. crackerjack/core/async_workflow_orchestrator.py +79 -53
  111. crackerjack/core/autofix_coordinator.py +22 -9
  112. crackerjack/core/container.py +10 -9
  113. crackerjack/core/enhanced_container.py +9 -9
  114. crackerjack/core/performance.py +1 -1
  115. crackerjack/core/performance_monitor.py +5 -3
  116. crackerjack/core/phase_coordinator.py +1018 -634
  117. crackerjack/core/proactive_workflow.py +3 -3
  118. crackerjack/core/retry.py +275 -0
  119. crackerjack/core/service_watchdog.py +167 -23
  120. crackerjack/core/session_coordinator.py +187 -382
  121. crackerjack/core/timeout_manager.py +161 -44
  122. crackerjack/core/workflow/__init__.py +21 -0
  123. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  124. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  125. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  126. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  127. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  128. crackerjack/core/workflow_orchestrator.py +1247 -953
  129. crackerjack/data/README.md +11 -0
  130. crackerjack/data/__init__.py +8 -0
  131. crackerjack/data/models.py +79 -0
  132. crackerjack/data/repository.py +210 -0
  133. crackerjack/decorators/README.md +180 -0
  134. crackerjack/decorators/__init__.py +35 -0
  135. crackerjack/decorators/error_handling.py +649 -0
  136. crackerjack/decorators/error_handling_decorators.py +334 -0
  137. crackerjack/decorators/helpers.py +58 -0
  138. crackerjack/decorators/patterns.py +281 -0
  139. crackerjack/decorators/utils.py +58 -0
  140. crackerjack/docs/README.md +11 -0
  141. crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
  142. crackerjack/documentation/README.md +11 -0
  143. crackerjack/documentation/ai_templates.py +1 -1
  144. crackerjack/documentation/dual_output_generator.py +11 -9
  145. crackerjack/documentation/reference_generator.py +104 -59
  146. crackerjack/dynamic_config.py +52 -61
  147. crackerjack/errors.py +1 -1
  148. crackerjack/events/README.md +11 -0
  149. crackerjack/events/__init__.py +16 -0
  150. crackerjack/events/telemetry.py +175 -0
  151. crackerjack/events/workflow_bus.py +346 -0
  152. crackerjack/exceptions/README.md +301 -0
  153. crackerjack/exceptions/__init__.py +5 -0
  154. crackerjack/exceptions/config.py +4 -0
  155. crackerjack/exceptions/tool_execution_error.py +245 -0
  156. crackerjack/executors/README.md +591 -0
  157. crackerjack/executors/__init__.py +2 -0
  158. crackerjack/executors/async_hook_executor.py +539 -77
  159. crackerjack/executors/cached_hook_executor.py +3 -3
  160. crackerjack/executors/hook_executor.py +967 -102
  161. crackerjack/executors/hook_lock_manager.py +31 -22
  162. crackerjack/executors/individual_hook_executor.py +66 -32
  163. crackerjack/executors/lsp_aware_hook_executor.py +136 -57
  164. crackerjack/executors/progress_hook_executor.py +282 -0
  165. crackerjack/executors/tool_proxy.py +23 -7
  166. crackerjack/hooks/README.md +485 -0
  167. crackerjack/hooks/lsp_hook.py +8 -9
  168. crackerjack/intelligence/README.md +557 -0
  169. crackerjack/interactive.py +37 -10
  170. crackerjack/managers/README.md +369 -0
  171. crackerjack/managers/async_hook_manager.py +41 -57
  172. crackerjack/managers/hook_manager.py +449 -79
  173. crackerjack/managers/publish_manager.py +81 -36
  174. crackerjack/managers/test_command_builder.py +290 -12
  175. crackerjack/managers/test_executor.py +93 -8
  176. crackerjack/managers/test_manager.py +1082 -75
  177. crackerjack/managers/test_progress.py +118 -26
  178. crackerjack/mcp/README.md +374 -0
  179. crackerjack/mcp/cache.py +25 -2
  180. crackerjack/mcp/client_runner.py +35 -18
  181. crackerjack/mcp/context.py +9 -9
  182. crackerjack/mcp/dashboard.py +24 -8
  183. crackerjack/mcp/enhanced_progress_monitor.py +34 -23
  184. crackerjack/mcp/file_monitor.py +27 -6
  185. crackerjack/mcp/progress_components.py +45 -34
  186. crackerjack/mcp/progress_monitor.py +6 -9
  187. crackerjack/mcp/rate_limiter.py +11 -7
  188. crackerjack/mcp/server.py +2 -0
  189. crackerjack/mcp/server_core.py +187 -55
  190. crackerjack/mcp/service_watchdog.py +12 -9
  191. crackerjack/mcp/task_manager.py +2 -2
  192. crackerjack/mcp/tools/README.md +27 -0
  193. crackerjack/mcp/tools/__init__.py +2 -0
  194. crackerjack/mcp/tools/core_tools.py +75 -52
  195. crackerjack/mcp/tools/execution_tools.py +87 -31
  196. crackerjack/mcp/tools/intelligence_tools.py +2 -2
  197. crackerjack/mcp/tools/proactive_tools.py +1 -1
  198. crackerjack/mcp/tools/semantic_tools.py +584 -0
  199. crackerjack/mcp/tools/utility_tools.py +180 -132
  200. crackerjack/mcp/tools/workflow_executor.py +87 -46
  201. crackerjack/mcp/websocket/README.md +31 -0
  202. crackerjack/mcp/websocket/app.py +11 -1
  203. crackerjack/mcp/websocket/event_bridge.py +188 -0
  204. crackerjack/mcp/websocket/jobs.py +27 -4
  205. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  206. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  207. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  208. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  209. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  210. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  211. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  212. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  213. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  214. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  215. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  216. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  217. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  218. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  219. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  220. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  221. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  222. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  223. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  224. crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
  225. crackerjack/mcp/websocket/server.py +1 -3
  226. crackerjack/mcp/websocket/websocket_handler.py +107 -6
  227. crackerjack/models/README.md +308 -0
  228. crackerjack/models/__init__.py +10 -1
  229. crackerjack/models/config.py +639 -22
  230. crackerjack/models/config_adapter.py +6 -6
  231. crackerjack/models/protocols.py +1167 -23
  232. crackerjack/models/pydantic_models.py +320 -0
  233. crackerjack/models/qa_config.py +145 -0
  234. crackerjack/models/qa_results.py +134 -0
  235. crackerjack/models/results.py +35 -0
  236. crackerjack/models/semantic_models.py +258 -0
  237. crackerjack/models/task.py +19 -3
  238. crackerjack/models/test_models.py +60 -0
  239. crackerjack/monitoring/README.md +11 -0
  240. crackerjack/monitoring/ai_agent_watchdog.py +5 -4
  241. crackerjack/monitoring/metrics_collector.py +4 -3
  242. crackerjack/monitoring/regression_prevention.py +4 -3
  243. crackerjack/monitoring/websocket_server.py +4 -241
  244. crackerjack/orchestration/README.md +340 -0
  245. crackerjack/orchestration/__init__.py +43 -0
  246. crackerjack/orchestration/advanced_orchestrator.py +20 -67
  247. crackerjack/orchestration/cache/README.md +312 -0
  248. crackerjack/orchestration/cache/__init__.py +37 -0
  249. crackerjack/orchestration/cache/memory_cache.py +338 -0
  250. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  251. crackerjack/orchestration/config.py +297 -0
  252. crackerjack/orchestration/coverage_improvement.py +13 -6
  253. crackerjack/orchestration/execution_strategies.py +6 -6
  254. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  255. crackerjack/orchestration/strategies/README.md +401 -0
  256. crackerjack/orchestration/strategies/__init__.py +39 -0
  257. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  258. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  259. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  260. crackerjack/orchestration/test_progress_streamer.py +1 -1
  261. crackerjack/plugins/README.md +11 -0
  262. crackerjack/plugins/hooks.py +3 -2
  263. crackerjack/plugins/loader.py +3 -3
  264. crackerjack/plugins/managers.py +1 -1
  265. crackerjack/py313.py +191 -0
  266. crackerjack/security/README.md +11 -0
  267. crackerjack/services/README.md +374 -0
  268. crackerjack/services/__init__.py +8 -21
  269. crackerjack/services/ai/README.md +295 -0
  270. crackerjack/services/ai/__init__.py +7 -0
  271. crackerjack/services/ai/advanced_optimizer.py +878 -0
  272. crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
  273. crackerjack/services/ai/embeddings.py +444 -0
  274. crackerjack/services/ai/intelligent_commit.py +328 -0
  275. crackerjack/services/ai/predictive_analytics.py +510 -0
  276. crackerjack/services/api_extractor.py +5 -3
  277. crackerjack/services/bounded_status_operations.py +45 -5
  278. crackerjack/services/cache.py +249 -318
  279. crackerjack/services/changelog_automation.py +7 -3
  280. crackerjack/services/command_execution_service.py +305 -0
  281. crackerjack/services/config_integrity.py +83 -39
  282. crackerjack/services/config_merge.py +9 -6
  283. crackerjack/services/config_service.py +198 -0
  284. crackerjack/services/config_template.py +13 -26
  285. crackerjack/services/coverage_badge_service.py +6 -4
  286. crackerjack/services/coverage_ratchet.py +53 -27
  287. crackerjack/services/debug.py +18 -7
  288. crackerjack/services/dependency_analyzer.py +4 -4
  289. crackerjack/services/dependency_monitor.py +13 -13
  290. crackerjack/services/documentation_generator.py +4 -2
  291. crackerjack/services/documentation_service.py +62 -33
  292. crackerjack/services/enhanced_filesystem.py +81 -27
  293. crackerjack/services/enterprise_optimizer.py +1 -1
  294. crackerjack/services/error_pattern_analyzer.py +10 -10
  295. crackerjack/services/file_filter.py +221 -0
  296. crackerjack/services/file_hasher.py +5 -7
  297. crackerjack/services/file_io_service.py +361 -0
  298. crackerjack/services/file_modifier.py +615 -0
  299. crackerjack/services/filesystem.py +80 -109
  300. crackerjack/services/git.py +99 -5
  301. crackerjack/services/health_metrics.py +4 -6
  302. crackerjack/services/heatmap_generator.py +12 -3
  303. crackerjack/services/incremental_executor.py +380 -0
  304. crackerjack/services/initialization.py +101 -49
  305. crackerjack/services/log_manager.py +2 -2
  306. crackerjack/services/logging.py +120 -68
  307. crackerjack/services/lsp_client.py +12 -12
  308. crackerjack/services/memory_optimizer.py +27 -22
  309. crackerjack/services/monitoring/README.md +30 -0
  310. crackerjack/services/monitoring/__init__.py +9 -0
  311. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  312. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  313. crackerjack/services/monitoring/health_metrics.py +716 -0
  314. crackerjack/services/monitoring/metrics.py +587 -0
  315. crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
  316. crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
  317. crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
  318. crackerjack/services/parallel_executor.py +166 -55
  319. crackerjack/services/patterns/__init__.py +142 -0
  320. crackerjack/services/patterns/agents.py +107 -0
  321. crackerjack/services/patterns/code/__init__.py +15 -0
  322. crackerjack/services/patterns/code/detection.py +118 -0
  323. crackerjack/services/patterns/code/imports.py +107 -0
  324. crackerjack/services/patterns/code/paths.py +159 -0
  325. crackerjack/services/patterns/code/performance.py +119 -0
  326. crackerjack/services/patterns/code/replacement.py +36 -0
  327. crackerjack/services/patterns/core.py +212 -0
  328. crackerjack/services/patterns/documentation/__init__.py +14 -0
  329. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  330. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  331. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  332. crackerjack/services/patterns/formatting.py +226 -0
  333. crackerjack/services/patterns/operations.py +339 -0
  334. crackerjack/services/patterns/security/__init__.py +23 -0
  335. crackerjack/services/patterns/security/code_injection.py +122 -0
  336. crackerjack/services/patterns/security/credentials.py +190 -0
  337. crackerjack/services/patterns/security/path_traversal.py +221 -0
  338. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  339. crackerjack/services/patterns/templates.py +62 -0
  340. crackerjack/services/patterns/testing/__init__.py +18 -0
  341. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  342. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  343. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  344. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  345. crackerjack/services/patterns/tool_output/other.py +97 -0
  346. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  347. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  348. crackerjack/services/patterns/url_sanitization.py +114 -0
  349. crackerjack/services/patterns/utilities.py +42 -0
  350. crackerjack/services/patterns/utils.py +339 -0
  351. crackerjack/services/patterns/validation.py +46 -0
  352. crackerjack/services/patterns/versioning.py +62 -0
  353. crackerjack/services/predictive_analytics.py +21 -8
  354. crackerjack/services/profiler.py +280 -0
  355. crackerjack/services/quality/README.md +415 -0
  356. crackerjack/services/quality/__init__.py +11 -0
  357. crackerjack/services/quality/anomaly_detector.py +392 -0
  358. crackerjack/services/quality/pattern_cache.py +333 -0
  359. crackerjack/services/quality/pattern_detector.py +479 -0
  360. crackerjack/services/quality/qa_orchestrator.py +491 -0
  361. crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
  362. crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
  363. crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
  364. crackerjack/services/regex_patterns.py +58 -2987
  365. crackerjack/services/regex_utils.py +55 -29
  366. crackerjack/services/secure_status_formatter.py +42 -15
  367. crackerjack/services/secure_subprocess.py +35 -2
  368. crackerjack/services/security.py +16 -8
  369. crackerjack/services/server_manager.py +40 -51
  370. crackerjack/services/smart_scheduling.py +46 -6
  371. crackerjack/services/status_authentication.py +3 -3
  372. crackerjack/services/thread_safe_status_collector.py +1 -0
  373. crackerjack/services/tool_filter.py +368 -0
  374. crackerjack/services/tool_version_service.py +9 -5
  375. crackerjack/services/unified_config.py +43 -351
  376. crackerjack/services/vector_store.py +689 -0
  377. crackerjack/services/version_analyzer.py +6 -4
  378. crackerjack/services/version_checker.py +14 -8
  379. crackerjack/services/zuban_lsp_service.py +5 -4
  380. crackerjack/slash_commands/README.md +11 -0
  381. crackerjack/slash_commands/init.md +2 -12
  382. crackerjack/slash_commands/run.md +84 -50
  383. crackerjack/tools/README.md +11 -0
  384. crackerjack/tools/__init__.py +30 -0
  385. crackerjack/tools/_git_utils.py +105 -0
  386. crackerjack/tools/check_added_large_files.py +139 -0
  387. crackerjack/tools/check_ast.py +105 -0
  388. crackerjack/tools/check_json.py +103 -0
  389. crackerjack/tools/check_jsonschema.py +297 -0
  390. crackerjack/tools/check_toml.py +103 -0
  391. crackerjack/tools/check_yaml.py +110 -0
  392. crackerjack/tools/codespell_wrapper.py +72 -0
  393. crackerjack/tools/end_of_file_fixer.py +202 -0
  394. crackerjack/tools/format_json.py +128 -0
  395. crackerjack/tools/mdformat_wrapper.py +114 -0
  396. crackerjack/tools/trailing_whitespace.py +198 -0
  397. crackerjack/tools/validate_regex_patterns.py +7 -3
  398. crackerjack/ui/README.md +11 -0
  399. crackerjack/ui/dashboard_renderer.py +28 -0
  400. crackerjack/ui/templates/README.md +11 -0
  401. crackerjack/utils/console_utils.py +13 -0
  402. crackerjack/utils/dependency_guard.py +230 -0
  403. crackerjack/utils/retry_utils.py +275 -0
  404. crackerjack/workflows/README.md +590 -0
  405. crackerjack/workflows/__init__.py +46 -0
  406. crackerjack/workflows/actions.py +811 -0
  407. crackerjack/workflows/auto_fix.py +444 -0
  408. crackerjack/workflows/container_builder.py +499 -0
  409. crackerjack/workflows/definitions.py +443 -0
  410. crackerjack/workflows/engine.py +177 -0
  411. crackerjack/workflows/event_bridge.py +242 -0
  412. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
  413. crackerjack-0.45.2.dist-info/RECORD +478 -0
  414. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  415. crackerjack/managers/test_manager_backup.py +0 -1075
  416. crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
  417. crackerjack/mixins/__init__.py +0 -3
  418. crackerjack/mixins/error_handling.py +0 -145
  419. crackerjack/services/config.py +0 -358
  420. crackerjack/ui/server_panels.py +0 -125
  421. crackerjack-0.37.9.dist-info/RECORD +0 -231
  422. /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
  423. /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
  424. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
  425. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,216 @@
1
+ """Unsafe operation detection and remediation patterns.
2
+
3
+ This module contains patterns for detecting and fixing unsafe operations
4
+ including weak cryptography, insecure random usage, subprocess shell injection,
5
+ and other dangerous programming practices.
6
+ """
7
+
8
+ import re
9
+
10
+ from ..core import ValidatedPattern
11
+
12
+ PATTERNS: dict[str, ValidatedPattern] = {
13
+ "detect_crypto_weak_algorithms": ValidatedPattern(
14
+ name="detect_crypto_weak_algorithms",
15
+ pattern=r"\b(?:md4|md5|sha1|des|3des|rc4)\b",
16
+ replacement="[WEAK_CRYPTO_ALGORITHM]",
17
+ description="Detect weak cryptographic algorithms",
18
+ flags=re.IGNORECASE,
19
+ global_replace=True,
20
+ test_cases=[
21
+ ("hashlib.md5()", "hashlib.[WEAK_CRYPTO_ALGORITHM]()"),
22
+ ("using DES encryption", "using [WEAK_CRYPTO_ALGORITHM] encryption"),
23
+ ("SHA256 is good", "SHA256 is good"),
24
+ ("MD4 hashing", "[WEAK_CRYPTO_ALGORITHM] hashing"),
25
+ ],
26
+ ),
27
+ "detect_insecure_random_usage": ValidatedPattern(
28
+ name="detect_insecure_random_usage",
29
+ pattern=r"\brandom\.(?:random|choice)\([^)]*\)",
30
+ replacement="[INSECURE_RANDOM]()",
31
+ description="Detect insecure random module usage for security-sensitive"
32
+ " operations",
33
+ global_replace=True,
34
+ test_cases=[
35
+ ("random.random()", "[INSECURE_RANDOM]()"),
36
+ ("random.choice(items)", "[INSECURE_RANDOM]()"),
37
+ ("secrets.choice(items)", "secrets.choice(items)"),
38
+ ("my_random.choice()", "my_random.choice()"),
39
+ ],
40
+ ),
41
+ "detect_regex_redos_vulnerable": ValidatedPattern(
42
+ name="detect_regex_redos_vulnerable",
43
+ pattern=r"\([^)]+\)[\*\+]",
44
+ replacement="[REDOS_VULNERABLE_PATTERN]",
45
+ description="Detect regex patterns vulnerable to ReDoS attacks (simplified"
46
+ " detection)",
47
+ global_replace=True,
48
+ test_cases=[
49
+ ("(a+)*", "[REDOS_VULNERABLE_PATTERN]"),
50
+ ("(a*)+", "[REDOS_VULNERABLE_PATTERN]"),
51
+ ("(abc)+", "[REDOS_VULNERABLE_PATTERN]"),
52
+ ("simple+", "simple+"),
53
+ ],
54
+ ),
55
+ "detect_security_keywords": ValidatedPattern(
56
+ name="detect_security_keywords",
57
+ pattern=r"(?i)(bandit|security|vulnerability|hardcoded|"
58
+ r"shell=true|b108|b602|b301|b506|unsafe|injection)",
59
+ replacement=r"MATCH",
60
+ description="Detect security-related keywords in issue messages "
61
+ "(case insensitive)",
62
+ flags=re.IGNORECASE,
63
+ test_cases=[
64
+ ("Bandit security issue found", "MATCH security issue found"),
65
+ ("VULNERABILITY detected", "MATCH detected"),
66
+ ("hardcoded path found", "MATCH path found"),
67
+ ("shell=True usage", "MATCH usage"),
68
+ ("B108 violation", "MATCH violation"),
69
+ ("normal message", "normal message"),
70
+ ],
71
+ ),
72
+ "detect_subprocess_shell_injection": ValidatedPattern(
73
+ name="detect_subprocess_shell_injection",
74
+ pattern=r"\bsubprocess\.\w+\([^)]*shell\s*=\s*True[^)]*\)",
75
+ replacement="[SHELL_INJECTION_RISK]",
76
+ description="Detect subprocess calls with shell=True",
77
+ global_replace=True,
78
+ test_cases=[
79
+ ("subprocess.run(cmd, shell=True)", "[SHELL_INJECTION_RISK]"),
80
+ ("subprocess.call(command, shell=True)", "[SHELL_INJECTION_RISK]"),
81
+ (
82
+ "subprocess.run(cmd, shell=False)",
83
+ "subprocess.run(cmd, shell=False)",
84
+ ),
85
+ ],
86
+ ),
87
+ "detect_subprocess_usage": ValidatedPattern(
88
+ name="detect_subprocess_usage",
89
+ pattern=r"subprocess\.(Popen|run)",
90
+ replacement="MATCH",
91
+ test_cases=[
92
+ ("subprocess.Popen(cmd)", "MATCH(cmd)"),
93
+ ("subprocess.run(['cmd'])", "MATCH(['cmd'])"),
94
+ ("not_subprocess.other()", "not_subprocess.other()"),
95
+ ],
96
+ description="Detect subprocess module usage for resource management integration",
97
+ ),
98
+ "detect_unsafe_pickle_usage": ValidatedPattern(
99
+ name="detect_unsafe_pickle_usage",
100
+ pattern=r"\bpickle\.(loads?)\s*\(",
101
+ replacement=r"[UNSAFE_PICKLE_USAGE].\1(",
102
+ description="Detect potentially unsafe pickle usage",
103
+ global_replace=True,
104
+ test_cases=[
105
+ ("pickle.load(file)", "[UNSAFE_PICKLE_USAGE].load(file)"),
106
+ ("pickle.loads(data)", "[UNSAFE_PICKLE_USAGE].loads(data)"),
107
+ ("my_pickle.load(file)", "my_pickle.load(file)"),
108
+ ],
109
+ ),
110
+ "fix_insecure_random_choice": ValidatedPattern(
111
+ name="fix_insecure_random_choice",
112
+ pattern=r"random\.choice\(([^)]+)\)",
113
+ replacement=r"secrets.choice(\1)",
114
+ description="Replace insecure random.choice with secrets.choice",
115
+ global_replace=True,
116
+ test_cases=[
117
+ ("random.choice(options)", "secrets.choice(options)"),
118
+ ("item = random.choice(items)", "item = secrets.choice(items)"),
119
+ ("secrets.choice(options)", "secrets.choice(options)"),
120
+ ],
121
+ ),
122
+ "fix_subprocess_call_shell": ValidatedPattern(
123
+ name="fix_subprocess_call_shell",
124
+ pattern=r"subprocess\.call\(([^,]+),\s*shell=True\)",
125
+ replacement=r"subprocess.call(\1.split())",
126
+ description="Remove shell=True from subprocess.call calls",
127
+ global_replace=True,
128
+ test_cases=[
129
+ ("subprocess.call(cmd, shell=True)", "subprocess.call(cmd.split())"),
130
+ (
131
+ "subprocess.call('ls -la', shell=True)",
132
+ "subprocess.call('ls -la'.split())",
133
+ ),
134
+ (
135
+ "subprocess.call(command, shell=False)",
136
+ "subprocess.call(command, shell=False)",
137
+ ),
138
+ ],
139
+ ),
140
+ "fix_subprocess_popen_shell": ValidatedPattern(
141
+ name="fix_subprocess_popen_shell",
142
+ pattern=r"subprocess\.Popen\(([^,]+), \s*shell=True\)",
143
+ replacement=r"subprocess.Popen(\1.split())",
144
+ description="Remove shell=True from subprocess.Popen calls",
145
+ global_replace=True,
146
+ test_cases=[
147
+ ("subprocess.Popen(cmd, shell=True)", "subprocess.Popen(cmd.split())"),
148
+ (
149
+ "subprocess.Popen('ls -la', shell=True)",
150
+ "subprocess.Popen('ls -la'.split())",
151
+ ),
152
+ (
153
+ "subprocess.Popen(command, shell=False)",
154
+ "subprocess.Popen(command, shell=False)",
155
+ ),
156
+ ],
157
+ ),
158
+ "fix_subprocess_run_shell": ValidatedPattern(
159
+ name="fix_subprocess_run_shell",
160
+ pattern=r"subprocess\.run\(([^,]+),\s*shell=True\)",
161
+ replacement=r"subprocess.run(\1.split())",
162
+ description="Remove shell=True from subprocess.run calls",
163
+ global_replace=True,
164
+ test_cases=[
165
+ ("subprocess.run(cmd, shell=True)", "subprocess.run(cmd.split())"),
166
+ (
167
+ "subprocess.run('ls -la', shell=True)",
168
+ "subprocess.run('ls -la'.split())",
169
+ ),
170
+ (
171
+ "subprocess.run(command, shell=False)",
172
+ "subprocess.run(command, shell=False)",
173
+ ),
174
+ ],
175
+ ),
176
+ "fix_unsafe_yaml_load": ValidatedPattern(
177
+ name="fix_unsafe_yaml_load",
178
+ pattern=r"\byaml\.load\(",
179
+ replacement="yaml.safe_load(",
180
+ description="Replace unsafe yaml.load with yaml.safe_load",
181
+ global_replace=True,
182
+ test_cases=[
183
+ ("yaml.load(file)", "yaml.safe_load(file)"),
184
+ ("data = yaml.load(content)", "data = yaml.safe_load(content)"),
185
+ ("yaml.safe_load(content)", "yaml.safe_load(content)"),
186
+ (
187
+ "my_yaml.load(content)",
188
+ "my_yaml.load(content)",
189
+ ),
190
+ ],
191
+ ),
192
+ "fix_weak_md5_hash": ValidatedPattern(
193
+ name="fix_weak_md5_hash",
194
+ pattern=r"\bhashlib\.md5\(",
195
+ replacement="hashlib.sha256(",
196
+ description="Replace weak MD5 hashing with SHA256",
197
+ global_replace=True,
198
+ test_cases=[
199
+ ("hashlib.md5(data)", "hashlib.sha256(data)"),
200
+ ("hash = hashlib.md5(content)", "hash = hashlib.sha256(content)"),
201
+ ("hashlib.sha256(data)", "hashlib.sha256(data)"),
202
+ ],
203
+ ),
204
+ "fix_weak_sha1_hash": ValidatedPattern(
205
+ name="fix_weak_sha1_hash",
206
+ pattern=r"\bhashlib\.sha1\(",
207
+ replacement="hashlib.sha256(",
208
+ description="Replace weak SHA1 hashing with SHA256",
209
+ global_replace=True,
210
+ test_cases=[
211
+ ("hashlib.sha1(data)", "hashlib.sha256(data)"),
212
+ ("hash = hashlib.sha1(content)", "hash = hashlib.sha256(content)"),
213
+ ("hashlib.sha256(data)", "hashlib.sha256(data)"),
214
+ ],
215
+ ),
216
+ }
@@ -0,0 +1,62 @@
1
+ """Template parsing and processing patterns."""
2
+
3
+ import re
4
+
5
+ from .core import ValidatedPattern
6
+
7
+ PATTERNS: dict[str, ValidatedPattern] = {
8
+ "extract_template_variables": ValidatedPattern(
9
+ name="extract_template_variables",
10
+ pattern=r"\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}",
11
+ replacement=r"\1",
12
+ description="Extract template variables from {{variable}} patterns",
13
+ test_cases=[
14
+ ("Hello {{name}}", "Hello name"),
15
+ ("{{user_name}}", "user_name"),
16
+ ("{{ spaced_var }}", "spaced_var"),
17
+ ("text {{var1}} and {{var2}}", "text var1 and {{var2}}"),
18
+ ],
19
+ ),
20
+ "extract_template_sections": ValidatedPattern(
21
+ name="extract_template_sections",
22
+ pattern=r"\{\%\s*section\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\%\}",
23
+ replacement=r"\1",
24
+ description="Extract section names from {% section name %} patterns",
25
+ test_cases=[
26
+ ("{% section intro %}", "intro"),
27
+ ("{% section main_content %}", "main_content"),
28
+ ("text {% section footer %} more", "text footer more"),
29
+ ("{% section header_1 %}", "header_1"),
30
+ ],
31
+ ),
32
+ "extract_template_blocks": ValidatedPattern(
33
+ name="extract_template_blocks",
34
+ pattern=r"\{\%\s*block\s+(\w+)\s*\%\}(.*?)\{\%\s*endblock\s*\%\}",
35
+ replacement=r"\1",
36
+ description="Extract block names and content from template blocks",
37
+ flags=re.DOTALL,
38
+ test_cases=[
39
+ ("{% block title %}Hello{% endblock %}", "title"),
40
+ ("{% block content %}Text content{% endblock %}", "content"),
41
+ ("{% block main %}Multi\nline{% endblock %}", "main"),
42
+ (
43
+ "prefix {% block nav %}nav content{% endblock %} suffix",
44
+ "prefix nav suffix",
45
+ ),
46
+ ],
47
+ ),
48
+ "replace_template_block": ValidatedPattern(
49
+ name="replace_template_block",
50
+ pattern=r"\{\%\s*block\s+BLOCK_NAME\s*\%\}.*?\{\%\s*endblock\s*\%\}",
51
+ replacement="REPLACEMENT_CONTENT",
52
+ description="Replace a specific template block (use with dynamic pattern substitution)",
53
+ flags=re.DOTALL,
54
+ test_cases=[
55
+ ("{% block BLOCK_NAME %}old{% endblock %}", "REPLACEMENT_CONTENT"),
56
+ (
57
+ "{% block BLOCK_NAME %}old content{% endblock %}",
58
+ "REPLACEMENT_CONTENT",
59
+ ),
60
+ ],
61
+ ),
62
+ }
@@ -0,0 +1,18 @@
1
+ """Testing pattern modules.
2
+
3
+ This package contains pattern collections for parsing and analyzing
4
+ pytest test output and test error patterns.
5
+ """
6
+
7
+ from ..core import ValidatedPattern
8
+ from .error_patterns import PATTERNS as ERROR_PATTERNS
9
+ from .pytest_output import PATTERNS as PYTEST_OUTPUT_PATTERNS
10
+
11
+ # Merge all testing patterns into a single registry
12
+ PATTERNS: dict[str, ValidatedPattern] = PYTEST_OUTPUT_PATTERNS | ERROR_PATTERNS
13
+
14
+ __all__ = [
15
+ "PATTERNS",
16
+ "PYTEST_OUTPUT_PATTERNS",
17
+ "ERROR_PATTERNS",
18
+ ]
@@ -0,0 +1,107 @@
1
+ """Test error pattern matching.
2
+
3
+ This module contains patterns for identifying and parsing various error
4
+ patterns in test failures, including assertions, imports, fixtures, and more.
5
+ """
6
+
7
+ from ..core import ValidatedPattern
8
+
9
+ PATTERNS: dict[str, ValidatedPattern] = {
10
+ "fixture_not_found_pattern": ValidatedPattern(
11
+ name="fixture_not_found_pattern",
12
+ pattern=r"fixture '(\w+)' not found",
13
+ replacement=r"fixture '\1' not found",
14
+ test_cases=[
15
+ ("fixture 'temp_pkg_path' not found", "fixture 'temp_pkg_path' not found"),
16
+ ("fixture 'console' not found", "fixture 'console' not found"),
17
+ ("fixture 'tmp_path' not found", "fixture 'tmp_path' not found"),
18
+ ],
19
+ description="Match pytest fixture not found error patterns",
20
+ ),
21
+ "import_error_pattern": ValidatedPattern(
22
+ name="import_error_pattern",
23
+ pattern=r"ImportError|ModuleNotFoundError",
24
+ replacement=r"ImportError",
25
+ test_cases=[
26
+ ("ImportError: No module named", "ImportError: No module named"),
27
+ ("ModuleNotFoundError: No module", "ImportError: No module"),
28
+ ("Other error types", "Other error types"),
29
+ ],
30
+ description="Match import error patterns in test failures",
31
+ ),
32
+ "assertion_error_pattern": ValidatedPattern(
33
+ name="assertion_error_pattern",
34
+ pattern=r"assert .+ ==",
35
+ replacement=r"AssertionError",
36
+ test_cases=[
37
+ (
38
+ "AssertionError: Values differ",
39
+ "AssertionError: Values differ",
40
+ ),
41
+ ("assert result == expected", "AssertionError expected"),
42
+ ("Normal code", "Normal code"),
43
+ ],
44
+ description="Match assertion error patterns in test failures",
45
+ ),
46
+ "attribute_error_pattern": ValidatedPattern(
47
+ name="attribute_error_pattern",
48
+ pattern=r"AttributeError: .+ has no attribute",
49
+ replacement=r"AttributeError: has no attribute",
50
+ test_cases=[
51
+ (
52
+ "AttributeError: 'Mock' has no attribute 'test'",
53
+ "AttributeError: has no attribute 'test'",
54
+ ),
55
+ (
56
+ "AttributeError: 'NoneType' has no attribute 'value'",
57
+ "AttributeError: has no attribute 'value'",
58
+ ),
59
+ ("Normal error", "Normal error"),
60
+ ],
61
+ description="Match attribute error patterns in test failures",
62
+ ),
63
+ "mock_spec_error_pattern": ValidatedPattern(
64
+ name="mock_spec_error_pattern",
65
+ pattern=r"MockSpec|spec.*Mock",
66
+ replacement=r"MockSpec",
67
+ test_cases=[
68
+ ("MockSpec error occurred", "MockSpec error occurred"),
69
+ ("spec for Mock failed", "MockSpec failed"),
70
+ ("Normal mock usage", "Normal mock usage"),
71
+ ],
72
+ description="Match mock specification error patterns in test failures",
73
+ ),
74
+ "hardcoded_path_pattern": ValidatedPattern(
75
+ name="hardcoded_path_pattern",
76
+ pattern=r"'/test/path'|/test/path",
77
+ replacement=r"str(tmp_path)",
78
+ test_cases=[
79
+ ("'/test/path'", "str(tmp_path)"),
80
+ ("/test/path", "str(tmp_path)"),
81
+ ("'/other/path'", "'/other/path'"),
82
+ ],
83
+ description="Match hardcoded test path patterns that should use tmp_path",
84
+ ),
85
+ "missing_name_pattern": ValidatedPattern(
86
+ name="missing_name_pattern",
87
+ pattern=r"name '(\w+)' is not defined",
88
+ replacement=r"name '\1' is not defined",
89
+ test_cases=[
90
+ ("name 'pytest' is not defined", "name 'pytest' is not defined"),
91
+ ("name 'Mock' is not defined", "name 'Mock' is not defined"),
92
+ ("name 'Path' is not defined", "name 'Path' is not defined"),
93
+ ],
94
+ description="Match undefined name patterns in test failures",
95
+ ),
96
+ "pydantic_validation_pattern": ValidatedPattern(
97
+ name="pydantic_validation_pattern",
98
+ pattern=r"ValidationError|validation error",
99
+ replacement=r"ValidationError",
100
+ test_cases=[
101
+ ("ValidationError: field required", "ValidationError: field required"),
102
+ ("validation error in field", "ValidationError in field"),
103
+ ("Normal validation", "Normal validation"),
104
+ ],
105
+ description="Match Pydantic validation error patterns in test failures",
106
+ ),
107
+ }
@@ -0,0 +1,126 @@
1
+ """Pytest output parsing patterns.
2
+
3
+ This module contains patterns for parsing pytest test output, including
4
+ test collection, results, coverage, and session information.
5
+ """
6
+
7
+ from ..core import ValidatedPattern
8
+
9
+ PATTERNS: dict[str, ValidatedPattern] = {
10
+ "pytest_test_start": ValidatedPattern(
11
+ name="pytest_test_start",
12
+ pattern=r"^(.+?):: ?(.+?):: ?(.+?) (PASSED|FAILED|SKIPPED|ERROR)$",
13
+ replacement=r"\1::\2::\3",
14
+ description="Parse pytest test start line with file, class, and method "
15
+ "(3-part format)",
16
+ test_cases=[
17
+ (
18
+ "test_file.py::TestClass::test_method PASSED",
19
+ "test_file.py::TestClass::test_method",
20
+ ),
21
+ (
22
+ "tests/test_core.py::TestCore::test_function FAILED",
23
+ "tests/test_core.py::TestCore::test_function",
24
+ ),
25
+ (
26
+ "src/test.py::MyTest::test_case SKIPPED",
27
+ "src/test.py::MyTest::test_case",
28
+ ),
29
+ ],
30
+ ),
31
+ "pytest_test_result": ValidatedPattern(
32
+ name="pytest_test_result",
33
+ pattern=r"^(.+?) (PASSED|FAILED|SKIPPED|ERROR)(?: \[.*?\])?\s*$",
34
+ replacement=r"\1",
35
+ description="Parse pytest test result line with test identifier",
36
+ test_cases=[
37
+ ("test_file.py::test_method PASSED", "test_file.py::test_method"),
38
+ (
39
+ "tests/test_core.py::test_func FAILED [100%]",
40
+ "tests/test_core.py::test_func",
41
+ ),
42
+ ("src/test.py::test_case SKIPPED ", "src/test.py::test_case"),
43
+ ],
44
+ ),
45
+ "pytest_collection_count": ValidatedPattern(
46
+ name="pytest_collection_count",
47
+ pattern=r"collected (\d+) items?",
48
+ replacement=r"\1",
49
+ description="Parse pytest test collection count",
50
+ test_cases=[
51
+ ("collected 5 items", "5"),
52
+ ("collected 1 item", "1"),
53
+ (
54
+ "collected 42 items for execution",
55
+ "42 for execution",
56
+ ),
57
+ ],
58
+ ),
59
+ "pytest_session_start": ValidatedPattern(
60
+ name="pytest_session_start",
61
+ pattern=r"test session starts",
62
+ replacement=r"test session starts",
63
+ description="Match pytest session start indicator",
64
+ test_cases=[
65
+ ("test session starts", "test session starts"),
66
+ ("pytest test session starts", "pytest test session starts"),
67
+ ],
68
+ ),
69
+ "pytest_coverage_total": ValidatedPattern(
70
+ name="pytest_coverage_total",
71
+ pattern=r"TOTAL\s+\d+\s+\d+\s+(\d+)%",
72
+ replacement=r"\1",
73
+ description="Parse pytest coverage total percentage",
74
+ test_cases=[
75
+ ("TOTAL 123 45 85%", "85"),
76
+ ("TOTAL 1000 250 75%", "75"),
77
+ ("TOTAL 50 0 100%", "100"),
78
+ ],
79
+ ),
80
+ "pytest_detailed_test": ValidatedPattern(
81
+ name="pytest_detailed_test",
82
+ pattern=r"^(.+\.py)::(.+) (PASSED|FAILED|SKIPPED|ERROR)",
83
+ replacement=r"\1::\2",
84
+ description="Parse detailed pytest test output with file, test name, and "
85
+ "status",
86
+ test_cases=[
87
+ (
88
+ "test_file.py::test_method PASSED [50%]",
89
+ "test_file.py::test_method [50%]",
90
+ ),
91
+ (
92
+ "tests/core.py::TestClass::test_func FAILED [75%] [0.1s]",
93
+ "tests/core.py::TestClass::test_func [75%] [0.1s]",
94
+ ),
95
+ (
96
+ "src/test.py::test_case SKIPPED",
97
+ "src/test.py::test_case",
98
+ ),
99
+ ],
100
+ ),
101
+ "remove_coverage_fail_under": ValidatedPattern(
102
+ name="remove_coverage_fail_under",
103
+ pattern=r"--cov-fail-under=\d+\.?\d*\s*",
104
+ replacement="",
105
+ description="Remove coverage fail-under flags from pytest addopts",
106
+ global_replace=True,
107
+ test_cases=[
108
+ ("--cov-fail-under=85 --verbose", "--verbose"),
109
+ ("--cov-fail-under=90.5 -x", "-x"),
110
+ ("--verbose --cov-fail-under=80 ", "--verbose "),
111
+ ("--no-cov", "--no-cov"),
112
+ ],
113
+ ),
114
+ "update_coverage_requirement": ValidatedPattern(
115
+ name="update_coverage_requirement",
116
+ pattern=r"(--cov-fail-under=)\d+\.?\d*",
117
+ replacement=r"\1NEW_COVERAGE",
118
+ description="Update coverage fail-under requirement (NEW_COVERAGE placeholder"
119
+ " replaced dynamically)",
120
+ test_cases=[
121
+ ("--cov-fail-under=85", "--cov-fail-under=NEW_COVERAGE"),
122
+ ("--cov-fail-under=90.5", "--cov-fail-under=NEW_COVERAGE"),
123
+ ("--verbose", "--verbose"),
124
+ ],
125
+ ),
126
+ }
@@ -0,0 +1,16 @@
1
+ """Tool output parsing regex patterns.
2
+
3
+ This package provides patterns for parsing output from various development tools
4
+ including linters (ruff), type checkers (pyright, mypy), security scanners (bandit),
5
+ dead code detectors (vulture), and complexity analyzers (complexipy).
6
+ """
7
+
8
+ from .bandit import PATTERNS as BANDIT_PATTERNS
9
+ from .other import PATTERNS as OTHER_PATTERNS
10
+ from .pyright import PATTERNS as PYRIGHT_PATTERNS
11
+ from .ruff import PATTERNS as RUFF_PATTERNS
12
+
13
+ # Merge all tool output patterns into a single registry
14
+ PATTERNS = RUFF_PATTERNS | PYRIGHT_PATTERNS | BANDIT_PATTERNS | OTHER_PATTERNS
15
+
16
+ __all__ = ["PATTERNS"]
@@ -0,0 +1,72 @@
1
+ """Bandit security scanner output parsing patterns.
2
+
3
+ This module provides regex patterns for parsing Bandit security analysis tool output,
4
+ including issue detection, location information, confidence, and severity levels.
5
+ """
6
+
7
+ from ..core import ValidatedPattern
8
+
9
+ PATTERNS = {
10
+ "bandit_confidence": ValidatedPattern(
11
+ name="bandit_confidence",
12
+ pattern=r"Confidence: (\w+)",
13
+ replacement=r"Confidence Level: \1",
14
+ description="Parse bandit confidence level for security issues",
15
+ test_cases=[
16
+ ("Confidence: HIGH", "Confidence Level: HIGH"),
17
+ ("Confidence: MEDIUM", "Confidence Level: MEDIUM"),
18
+ ("Confidence: LOW", "Confidence Level: LOW"),
19
+ ],
20
+ ),
21
+ "bandit_issue": ValidatedPattern(
22
+ name="bandit_issue",
23
+ pattern=r">> Issue: \[([A-Z]\d+): \w+\] (.+)",
24
+ replacement=r"Security Issue [\1]: \2",
25
+ description="Parse bandit security issue output with code and message",
26
+ test_cases=[
27
+ (
28
+ ">> Issue: [B602: shell_injection] Use of shell=True",
29
+ "Security Issue [B602]: Use of shell=True",
30
+ ),
31
+ (
32
+ ">> Issue: [B404: blacklist] Consider possible security implications",
33
+ "Security Issue [B404]: Consider possible security implications",
34
+ ),
35
+ (
36
+ ">> Issue: [B301: pickle] Pickle library detected",
37
+ "Security Issue [B301]: Pickle library detected",
38
+ ),
39
+ ],
40
+ ),
41
+ "bandit_location": ValidatedPattern(
42
+ name="bandit_location",
43
+ pattern=r"Location: (.+?): (\d+): (\d+)",
44
+ replacement=r"Location: File \1, Line \2, Column \3",
45
+ description="Parse bandit location information for security issues",
46
+ test_cases=[
47
+ (
48
+ "Location: src/main.py: 42: 10",
49
+ "Location: File src/main.py, Line 42, Column 10",
50
+ ),
51
+ (
52
+ "Location: /app/security.py: 123: 5",
53
+ "Location: File /app/security.py, Line 123, Column 5",
54
+ ),
55
+ (
56
+ "Location: crackerjack/core.py: 999: 80",
57
+ "Location: File crackerjack/core.py, Line 999, Column 80",
58
+ ),
59
+ ],
60
+ ),
61
+ "bandit_severity": ValidatedPattern(
62
+ name="bandit_severity",
63
+ pattern=r"Severity: (\w+)",
64
+ replacement=r"Severity Level: \1",
65
+ description="Parse bandit severity level for security issues",
66
+ test_cases=[
67
+ ("Severity: HIGH", "Severity Level: HIGH"),
68
+ ("Severity: MEDIUM", "Severity Level: MEDIUM"),
69
+ ("Severity: LOW", "Severity Level: LOW"),
70
+ ],
71
+ ),
72
+ }