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,142 @@
1
+ """Centralized pattern registry for safe regex operations.
2
+
3
+ This module provides backward compatibility with the old regex_patterns.py
4
+ by automatically loading all patterns from domain-specific modules.
5
+
6
+ The patterns are organized by domain:
7
+ - formatting: Text formatting and spacing patterns
8
+ - versioning: Version number extraction and updates
9
+ - validation: Input validation patterns
10
+ - utilities: General utility extraction patterns
11
+ - url_sanitization: URL sanitization for localhost addresses
12
+ - agents: Agent count management patterns
13
+ - templates: Template processing patterns
14
+ - code: Code-related patterns (imports, paths, performance, detection, replacement)
15
+ - documentation: Documentation patterns (docstrings, badges, comments)
16
+ - tool_output: Linter/checker output parsing (ruff, pyright, bandit, mypy, vulture, complexipy)
17
+ - testing: Test output and error patterns
18
+ - security: Security patterns (credentials, path_traversal, unsafe_operations, code_injection)
19
+
20
+ For backward compatibility, the main SAFE_PATTERNS dict contains all patterns.
21
+ """
22
+
23
+ # Import standalone modules
24
+ # Import subdirectories
25
+ from . import (
26
+ agents,
27
+ code,
28
+ documentation,
29
+ formatting,
30
+ security,
31
+ templates,
32
+ testing,
33
+ tool_output,
34
+ url_sanitization,
35
+ utilities,
36
+ validation,
37
+ versioning,
38
+ )
39
+ from .core import (
40
+ MAX_INPUT_SIZE,
41
+ MAX_ITERATIONS,
42
+ PATTERN_CACHE_SIZE,
43
+ CompiledPatternCache,
44
+ ValidatedPattern,
45
+ validate_pattern_safety,
46
+ )
47
+
48
+ # Build the complete SAFE_PATTERNS registry for backward compatibility
49
+ _merged_patterns = (
50
+ formatting.PATTERNS
51
+ | versioning.PATTERNS
52
+ | validation.PATTERNS
53
+ | utilities.PATTERNS
54
+ | url_sanitization.PATTERNS
55
+ | agents.PATTERNS
56
+ | templates.PATTERNS
57
+ | code.PATTERNS
58
+ | documentation.PATTERNS
59
+ | tool_output.PATTERNS
60
+ | testing.PATTERNS
61
+ | security.PATTERNS
62
+ )
63
+ SAFE_PATTERNS: dict[str, ValidatedPattern] = _merged_patterns # type: ignore[assignment]
64
+
65
+ # Import utility functions for backward compatibility
66
+ from .operations import (
67
+ RegexPatternsService,
68
+ apply_formatting_fixes,
69
+ apply_pattern_iteratively,
70
+ apply_safe_replacement,
71
+ apply_security_fixes,
72
+ apply_test_fixes,
73
+ clear_all_caches,
74
+ detect_dangerous_directory_patterns,
75
+ detect_null_byte_patterns,
76
+ detect_path_traversal_patterns,
77
+ detect_suspicious_path_patterns,
78
+ find_pattern_for_text,
79
+ fix_multi_word_hyphenation,
80
+ get_all_pattern_stats,
81
+ get_cache_info,
82
+ get_pattern_description,
83
+ is_valid_job_id,
84
+ remove_coverage_fail_under,
85
+ sanitize_internal_urls,
86
+ update_coverage_requirement,
87
+ update_pyproject_version,
88
+ update_repo_revision,
89
+ validate_all_patterns,
90
+ validate_path_security,
91
+ )
92
+
93
+ # Export everything for convenience
94
+ __all__ = [
95
+ # Core classes and utilities
96
+ "ValidatedPattern",
97
+ "CompiledPatternCache",
98
+ "validate_pattern_safety",
99
+ "MAX_INPUT_SIZE",
100
+ "MAX_ITERATIONS",
101
+ "PATTERN_CACHE_SIZE",
102
+ # Main registry (backward compatibility)
103
+ "SAFE_PATTERNS",
104
+ # Module namespaces for organized access
105
+ "formatting",
106
+ "versioning",
107
+ "validation",
108
+ "utilities",
109
+ "url_sanitization",
110
+ "agents",
111
+ "templates",
112
+ "code",
113
+ "documentation",
114
+ "tool_output",
115
+ "testing",
116
+ "security",
117
+ # Utility functions (backward compatibility)
118
+ "validate_all_patterns",
119
+ "find_pattern_for_text",
120
+ "apply_safe_replacement",
121
+ "get_pattern_description",
122
+ "fix_multi_word_hyphenation",
123
+ "update_pyproject_version",
124
+ "apply_formatting_fixes",
125
+ "apply_security_fixes",
126
+ "apply_test_fixes",
127
+ "is_valid_job_id",
128
+ "remove_coverage_fail_under",
129
+ "update_coverage_requirement",
130
+ "update_repo_revision",
131
+ "sanitize_internal_urls",
132
+ "apply_pattern_iteratively",
133
+ "get_all_pattern_stats",
134
+ "clear_all_caches",
135
+ "get_cache_info",
136
+ "detect_path_traversal_patterns",
137
+ "detect_null_byte_patterns",
138
+ "detect_dangerous_directory_patterns",
139
+ "detect_suspicious_path_patterns",
140
+ "validate_path_security",
141
+ "RegexPatternsService",
142
+ ]
@@ -0,0 +1,107 @@
1
+ """Agent count and configuration patterns."""
2
+
3
+ import re
4
+
5
+ from .core import ValidatedPattern
6
+
7
+ PATTERNS: dict[str, ValidatedPattern] = {
8
+ "agent_count_pattern": ValidatedPattern(
9
+ name="agent_count_pattern",
10
+ pattern=r"(\d+)\s+agents",
11
+ replacement=r"\1 agents",
12
+ test_cases=[
13
+ ("9 agents", "9 agents"),
14
+ ("12 agents", "12 agents"),
15
+ ("5 agents", "5 agents"),
16
+ ],
17
+ description="Match agent count patterns for documentation consistency",
18
+ flags=re.IGNORECASE,
19
+ ),
20
+ "specialized_agent_count_pattern": ValidatedPattern(
21
+ name="specialized_agent_count_pattern",
22
+ pattern=r"(\d+)\s+specialized\s+agents",
23
+ replacement=r"\1 specialized agents",
24
+ test_cases=[
25
+ ("9 specialized agents", "9 specialized agents"),
26
+ ("12 specialized agents", "12 specialized agents"),
27
+ ("5 specialized agents", "5 specialized agents"),
28
+ ],
29
+ description="Match specialized agent count patterns for documentation "
30
+ "consistency",
31
+ flags=re.IGNORECASE,
32
+ ),
33
+ "total_agents_config_pattern": ValidatedPattern(
34
+ name="total_agents_config_pattern",
35
+ pattern=r'total_agents["\'][\s]*: \s*(\d+)',
36
+ replacement=r'total_agents": \1',
37
+ test_cases=[
38
+ ('total_agents": 9', 'total_agents": 9'),
39
+ ("total_agents': 12", 'total_agents": 12'),
40
+ ('total_agents" : 5', 'total_agents": 5'),
41
+ ],
42
+ description="Match total agents configuration patterns",
43
+ flags=re.IGNORECASE,
44
+ ),
45
+ "sub_agent_count_pattern": ValidatedPattern(
46
+ name="sub_agent_count_pattern",
47
+ pattern=r"(\d+)\s+sub-agents",
48
+ replacement=r"\1 sub-agents",
49
+ test_cases=[
50
+ ("9 sub-agents", "9 sub-agents"),
51
+ ("12 sub-agents", "12 sub-agents"),
52
+ ("5 sub-agents", "5 sub-agents"),
53
+ ],
54
+ description="Match sub-agent count patterns for documentation consistency",
55
+ flags=re.IGNORECASE,
56
+ ),
57
+ "update_agent_count": ValidatedPattern(
58
+ name="update_agent_count",
59
+ pattern=r"\b(\d+)\s+agents\b",
60
+ replacement=r"NEW_COUNT agents",
61
+ test_cases=[
62
+ ("9 agents working", "NEW_COUNT agents working"),
63
+ ("We have 12 agents ready", "We have NEW_COUNT agents ready"),
64
+ ("All 5 agents are active", "All NEW_COUNT agents are active"),
65
+ ],
66
+ description="Update agent count references (NEW_COUNT replaced dynamically)",
67
+ ),
68
+ "update_specialized_agent_count": ValidatedPattern(
69
+ name="update_specialized_agent_count",
70
+ pattern=r"\b(\d+)\s+specialized\s+agents\b",
71
+ replacement=r"NEW_COUNT specialized agents",
72
+ test_cases=[
73
+ (
74
+ "9 specialized agents available",
75
+ "NEW_COUNT specialized agents available",
76
+ ),
77
+ ("We have 12 specialized agents", "We have NEW_COUNT specialized agents"),
78
+ ("All 5 specialized agents work", "All NEW_COUNT specialized agents work"),
79
+ ],
80
+ description="Update specialized agent count references (NEW_COUNT replaced"
81
+ " dynamically)",
82
+ ),
83
+ "update_total_agents_config": ValidatedPattern(
84
+ name="update_total_agents_config",
85
+ pattern=r'total_agents["\'][\s]*: \s*\d+',
86
+ replacement=r'total_agents": NEW_COUNT',
87
+ test_cases=[
88
+ ('total_agents": 9', 'total_agents": NEW_COUNT'),
89
+ ("total_agents': 12", 'total_agents": NEW_COUNT'),
90
+ ('total_agents" : 5', 'total_agents": NEW_COUNT'),
91
+ ],
92
+ description="Update total agents configuration (NEW_COUNT replaced"
93
+ " dynamically)",
94
+ ),
95
+ "update_sub_agent_count": ValidatedPattern(
96
+ name="update_sub_agent_count",
97
+ pattern=r"\b(\d+)\s+sub-agents\b",
98
+ replacement=r"NEW_COUNT sub-agents",
99
+ test_cases=[
100
+ ("9 sub-agents working", "NEW_COUNT sub-agents working"),
101
+ ("We have 12 sub-agents ready", "We have NEW_COUNT sub-agents ready"),
102
+ ("All 5 sub-agents are active", "All NEW_COUNT sub-agents are active"),
103
+ ],
104
+ description="Update sub-agent count references (NEW_COUNT replaced"
105
+ " dynamically)",
106
+ ),
107
+ }
@@ -0,0 +1,15 @@
1
+ """Code-related patterns."""
2
+
3
+ from .detection import PATTERNS as DETECTION_PATTERNS
4
+ from .imports import PATTERNS as IMPORT_PATTERNS
5
+ from .paths import PATTERNS as PATH_PATTERNS
6
+ from .performance import PATTERNS as PERFORMANCE_PATTERNS
7
+ from .replacement import PATTERNS as REPLACEMENT_PATTERNS
8
+
9
+ PATTERNS: dict[str, object] = (
10
+ IMPORT_PATTERNS
11
+ | PATH_PATTERNS
12
+ | PERFORMANCE_PATTERNS
13
+ | DETECTION_PATTERNS
14
+ | REPLACEMENT_PATTERNS
15
+ )
@@ -0,0 +1,118 @@
1
+ """Code pattern descriptions."""
2
+
3
+ from ..core import ValidatedPattern
4
+
5
+ PATTERNS: dict[str, ValidatedPattern] = {
6
+ "detect_tempfile_usage": ValidatedPattern(
7
+ name="detect_tempfile_usage",
8
+ pattern=r"tempfile\.(mkdtemp|NamedTemporaryFile|TemporaryDirectory)",
9
+ replacement="MATCH",
10
+ test_cases=[
11
+ ("tempfile.mkdtemp()", "MATCH()"),
12
+ ("tempfile.NamedTemporaryFile()", "MATCH()"),
13
+ ("tempfile.TemporaryDirectory()", "MATCH()"),
14
+ (
15
+ "not_tempfile.other()",
16
+ "not_tempfile.other()",
17
+ ),
18
+ ],
19
+ description="Detect tempfile module usage for resource management integration",
20
+ ),
21
+ "detect_asyncio_create_task": ValidatedPattern(
22
+ name="detect_asyncio_create_task",
23
+ pattern=r"asyncio\.create_task",
24
+ replacement="MATCH",
25
+ test_cases=[
26
+ ("asyncio.create_task(coro)", "MATCH(coro)"),
27
+ ("not_asyncio.other()", "not_asyncio.other()"),
28
+ ],
29
+ description="Detect asyncio.create_task usage for resource management"
30
+ " integration",
31
+ ),
32
+ "detect_file_open_operations": ValidatedPattern(
33
+ name="detect_file_open_operations",
34
+ pattern=r"(\.open\(|with open\()",
35
+ replacement=r"MATCH",
36
+ test_cases=[
37
+ ("file.open()", "fileMATCH)"),
38
+ ("with open('file.txt'): ", "MATCH'file.txt'): "),
39
+ ("other_method()", "other_method()"),
40
+ ],
41
+ description="Detect file open operations for resource management integration",
42
+ ),
43
+ "detect_exception_patterns": ValidatedPattern(
44
+ name="detect_exception_patterns",
45
+ pattern=r"except\s+\w*Exception\s+as\s+\w+: ",
46
+ replacement=r"MATCH",
47
+ description="Detect exception handling patterns for base Exception class in Python code for DRY violations",
48
+ test_cases=[
49
+ ("except Exception as e: ", "MATCH"),
50
+ ("except BaseException as error: ", "MATCH"),
51
+ (
52
+ "except ValueError as error: ",
53
+ "except ValueError as error: ",
54
+ ),
55
+ ("try: ", "try: "),
56
+ ],
57
+ ),
58
+ "match_async_function_definition": ValidatedPattern(
59
+ name="match_async_function_definition",
60
+ pattern=r"(async def \w+\([^)]*\)[^: ]*: )",
61
+ replacement=r"\1",
62
+ test_cases=[
63
+ ("async def foo(): ", "async def foo(): "),
64
+ ("async def bar(a, b) -> None: ", "async def bar(a, b) -> None: "),
65
+ ("def sync_func(): ", "def sync_func(): "),
66
+ ],
67
+ description="Match async function definitions for resource management"
68
+ " integration",
69
+ ),
70
+ "match_class_definition": ValidatedPattern(
71
+ name="match_class_definition",
72
+ pattern=r"class (\w+).*: ",
73
+ replacement=r"\1",
74
+ test_cases=[
75
+ ("class MyClass: ", "MyClass"),
76
+ ("class MyClass(BaseClass): ", "MyClass"),
77
+ ("class MyClass(Base, Mixin): ", "MyClass"),
78
+ ("def not_class(): ", "def not_class(): "),
79
+ ],
80
+ description="Match class definitions for resource management integration",
81
+ ),
82
+ "match_error_code_patterns": ValidatedPattern(
83
+ name="match_error_code_patterns",
84
+ pattern=r"F\d{3}|I\d{3}|E\d{3}|W\d{3}",
85
+ replacement=r"\g<0>",
86
+ description="Match standard error codes like F403, I001, etc.",
87
+ test_cases=[
88
+ ("F403", "F403"),
89
+ ("I001", "I001"),
90
+ ("E302", "E302"),
91
+ ("W291", "W291"),
92
+ ("ABC123", "ABC123"),
93
+ ],
94
+ ),
95
+ "match_validation_patterns": ValidatedPattern(
96
+ name="match_validation_patterns",
97
+ pattern=r"if\s+not\s+\w+\s*: |if\s+\w+\s+is\s+None\s*: |if\s+len\(\w+\)\s*[<>=]",
98
+ replacement=r"\g<0>",
99
+ description="Match common validation patterns for extraction",
100
+ test_cases=[
101
+ ("if not var: ", "if not var: "),
102
+ ("if item is None: ", "if item is None: "),
103
+ ("if len(items) >", "if len(items) >"),
104
+ ("other code", "other code"),
105
+ ],
106
+ ),
107
+ "match_loop_patterns": ValidatedPattern(
108
+ name="match_loop_patterns",
109
+ pattern=r"\s*for\s+.*: \s*$|\s*while\s+.*: \s*$",
110
+ replacement=r"\g<0>",
111
+ description="Match for/while loop patterns",
112
+ test_cases=[
113
+ (" for i in items: ", " for i in items: "),
114
+ (" while condition: ", " while condition: "),
115
+ ("regular line", "regular line"),
116
+ ],
117
+ ),
118
+ }
@@ -0,0 +1,107 @@
1
+ """Code pattern descriptions."""
2
+
3
+ from ..core import ValidatedPattern
4
+
5
+ PATTERNS: dict[str, ValidatedPattern] = {
6
+ "match_star_import": ValidatedPattern(
7
+ name="match_star_import",
8
+ pattern=r"from\s+\w+\s+import\s+\*",
9
+ replacement=r"\g<0>",
10
+ description="Match star import statements",
11
+ test_cases=[
12
+ ("from module import *", "from module import *"),
13
+ ("from my_pkg import *", "from my_pkg import *"),
14
+ ("from module import specific", "from module import specific"),
15
+ ],
16
+ ),
17
+ "clean_unused_import": ValidatedPattern(
18
+ name="clean_unused_import",
19
+ pattern=r"^\s*import\s+unused_module\s*$",
20
+ replacement=r"",
21
+ description="Remove unused import statements (example with unused_module)",
22
+ test_cases=[
23
+ (" import unused_module", ""),
24
+ (
25
+ "import other_module",
26
+ "import other_module",
27
+ ),
28
+ ],
29
+ ),
30
+ "clean_unused_from_import": ValidatedPattern(
31
+ name="clean_unused_from_import",
32
+ pattern=r"^\s*from\s+\w+\s+import\s+.*\bunused_item\b",
33
+ replacement=r"\g<0>",
34
+ description="Match from import statements with unused items (example with "
35
+ "unused_item)",
36
+ test_cases=[
37
+ (
38
+ "from module import used, unused_item",
39
+ "from module import used, unused_item",
40
+ ),
41
+ ("from other import needed", "from other import needed"),
42
+ ],
43
+ ),
44
+ "clean_import_commas": ValidatedPattern(
45
+ name="clean_import_commas",
46
+ pattern=r", \s*, ",
47
+ replacement=r", ",
48
+ description="Clean double commas in import statements",
49
+ test_cases=[
50
+ ("from module import a, , b", "from module import a, b"),
51
+ ("items = [a, , b]", "items = [a, b]"),
52
+ ("normal, list[t.Any]", "normal, list[t.Any]"),
53
+ ],
54
+ ),
55
+ "clean_trailing_import_comma": ValidatedPattern(
56
+ name="clean_trailing_import_comma",
57
+ pattern=r", \s*$",
58
+ replacement=r"",
59
+ description="Remove trailing commas from lines",
60
+ test_cases=[
61
+ ("from module import a, b, ", "from module import a, b"),
62
+ ("import item, ", "import item"),
63
+ ("normal line", "normal line"),
64
+ ],
65
+ ),
66
+ "clean_import_prefix": ValidatedPattern(
67
+ name="clean_import_prefix",
68
+ pattern=r"import\s*, \s*",
69
+ replacement=r"import ",
70
+ description="Clean malformed import statements with leading comma",
71
+ test_cases=[
72
+ ("import , module", "import module"),
73
+ ("from pkg import , item", "from pkg import item"),
74
+ ("import normal", "import normal"),
75
+ ],
76
+ ),
77
+ "extract_unused_import_name": ValidatedPattern(
78
+ name="extract_unused_import_name",
79
+ pattern=r"unused import ['\"]([^'\"]+)['\"]",
80
+ replacement=r"\1",
81
+ description="Extract import name from vulture unused import messages",
82
+ test_cases=[
83
+ ("unused import 'module_name'", "module_name"),
84
+ ('unused import "other_module"', "other_module"),
85
+ ("some other text", "some other text"),
86
+ ],
87
+ ),
88
+ "detect_typing_usage": ValidatedPattern(
89
+ name="detect_typing_usage",
90
+ pattern=r"\bt\.[A-Z]",
91
+ replacement="",
92
+ description="Detect usage of typing module aliases like t.Any, t.Dict, etc.",
93
+ global_replace=True,
94
+ test_cases=[
95
+ (
96
+ "def func(x: t.Any) -> t.Dict:",
97
+ "def func(x: ny) -> ict:",
98
+ ), # Removes t.A and t.D
99
+ (
100
+ "value: t.Optional[str] = None",
101
+ "value: ptional[str] = None",
102
+ ), # Removes t.O
103
+ ("from typing import Dict", "from typing import Dict"), # No match
104
+ ("data = dict()", "data = dict()"), # No match
105
+ ],
106
+ ),
107
+ }
@@ -0,0 +1,159 @@
1
+ """Code pattern descriptions."""
2
+
3
+ from ..core import ValidatedPattern
4
+
5
+ PATTERNS: dict[str, ValidatedPattern] = {
6
+ "detect_error_response_patterns": ValidatedPattern(
7
+ name="detect_error_response_patterns",
8
+ pattern=r'return\s+.*[\'\"]\{.*[\'\""]error[\'\""].*\}.*[\'\""]',
9
+ replacement=r"MATCH",
10
+ description="Detect error response patterns in Python code for DRY violations",
11
+ test_cases=[
12
+ ('return \'{"error": "msg"}\'', "MATCH"),
13
+ ('return f\'{"error": "msg"}\'', "MATCH"),
14
+ ('return {"success": True}', 'return {"success": True}'),
15
+ ('return \'{"error": "test message", "code": 500}\'', "MATCH"),
16
+ ],
17
+ ),
18
+ "detect_path_conversion_patterns": ValidatedPattern(
19
+ name="detect_path_conversion_patterns",
20
+ pattern=r"Path\([^)]+\)\s+if\s+isinstance\([^)]+, \s*str\)\s+else\s+[^)]+",
21
+ replacement=r"MATCH",
22
+ description="Detect path conversion patterns in Python code for DRY violations",
23
+ test_cases=[
24
+ ("Path(value) if isinstance(value, str) else value", "MATCH"),
25
+ ("Path(path) if isinstance(path, str) else path", "MATCH"),
26
+ ("Path('/tmp/file')", "Path('/tmp/file')"),
27
+ (
28
+ "Path(input_path) if isinstance(input_path, str) else input_path",
29
+ "MATCH",
30
+ ),
31
+ ],
32
+ ),
33
+ "detect_file_existence_patterns": ValidatedPattern(
34
+ name="detect_file_existence_patterns",
35
+ pattern=r"if\s+not\s+\w+\.exists\(\): ",
36
+ replacement=r"MATCH",
37
+ description="Detect file existence check patterns in Python code for DRY"
38
+ " violations",
39
+ test_cases=[
40
+ ("if not file.exists(): ", "MATCH"),
41
+ ("if not path.exists(): ", "MATCH"),
42
+ ("if not file_path.exists(): ", "MATCH"),
43
+ ("if file.exists(): ", "if file.exists(): "),
44
+ ],
45
+ ),
46
+ "fix_path_conversion_with_ensure_path": ValidatedPattern(
47
+ name="fix_path_conversion_with_ensure_path",
48
+ pattern=r"Path\([^)]+\)\s+if\s+isinstance\([^)]+, \s*str\)\s+else\s+([^)]+)",
49
+ replacement=r"_ensure_path(\1)",
50
+ description="Replace path conversion patterns with _ensure_path utility "
51
+ "function",
52
+ test_cases=[
53
+ ("Path(value) if isinstance(value, str) else value", "_ensure_path(value)"),
54
+ ("Path(path) if isinstance(path, str) else path", "_ensure_path(path)"),
55
+ (
56
+ "Path(input_path) if isinstance(input_path, str) else input_path",
57
+ "_ensure_path(input_path)",
58
+ ),
59
+ ],
60
+ ),
61
+ "fix_path_conversion_simple": ValidatedPattern(
62
+ name="fix_path_conversion_simple",
63
+ pattern=r"Path\(([^)]+)\)\s+if\s+isinstance\(\1, \s*str\)\s+else\s+\1",
64
+ replacement=r"_ensure_path(\1)",
65
+ description="Replace simple path conversion patterns with _ensure_path utility "
66
+ "function",
67
+ test_cases=[
68
+ ("Path(value) if isinstance(value, str) else value", "_ensure_path(value)"),
69
+ ("Path(path) if isinstance(path, str) else path", "_ensure_path(path)"),
70
+ (
71
+ "Path(file_path) if isinstance(file_path, str) else file_path",
72
+ "_ensure_path(file_path)",
73
+ ),
74
+ ],
75
+ ),
76
+ "detect_hardcoded_temp_paths_basic": ValidatedPattern(
77
+ name="detect_hardcoded_temp_paths_basic",
78
+ pattern=r"(?:/tmp/|/temp/|C:\\temp\\|C:\\tmp\\)", # nosec B108
79
+ replacement="[TEMP_PATH]/",
80
+ description="Detect hardcoded temporary directory paths",
81
+ global_replace=True,
82
+ test_cases=[
83
+ ("/tmp/myfile.txt", "[TEMP_PATH]/myfile.txt"), # nosec B108
84
+ (r"C:\tmp\data.log", "[TEMP_PATH]/data.log"),
85
+ ("/temp/cache", "[TEMP_PATH]/cache"),
86
+ (r"C:\temp\work", "[TEMP_PATH]/work"),
87
+ ("/regular/path", "/regular/path"),
88
+ ],
89
+ ),
90
+ "replace_hardcoded_temp_paths": ValidatedPattern(
91
+ name="replace_hardcoded_temp_paths",
92
+ pattern=r'Path\("/tmp/([^"]+)"\)',
93
+ replacement=r'Path(tempfile.gettempdir()) / "\1"',
94
+ description="Replace hardcoded /tmp paths with tempfile.gettempdir()",
95
+ global_replace=True,
96
+ test_cases=[
97
+ ('Path("/tmp/myfile.txt")', 'Path(tempfile.gettempdir()) / "myfile.txt"'),
98
+ ('Path("/tmp/data.log")', 'Path(tempfile.gettempdir()) / "data.log"'),
99
+ ('Path("/regular/path")', 'Path("/regular/path")'),
100
+ ],
101
+ ),
102
+ "replace_hardcoded_temp_strings": ValidatedPattern(
103
+ name="replace_hardcoded_temp_strings",
104
+ pattern=r'"/tmp/([^"]+)"',
105
+ replacement=r'str(Path(tempfile.gettempdir()) / "\1")',
106
+ description="Replace hardcoded /tmp string paths with tempfile equivalent",
107
+ global_replace=True,
108
+ test_cases=[
109
+ ('"/tmp/myfile.txt"', 'str(Path(tempfile.gettempdir()) / "myfile.txt")'),
110
+ ('"/tmp/data.log"', 'str(Path(tempfile.gettempdir()) / "data.log")'),
111
+ ('"/regular/path"', '"/regular/path"'),
112
+ ],
113
+ ),
114
+ "replace_hardcoded_temp_single_quotes": ValidatedPattern(
115
+ name="replace_hardcoded_temp_single_quotes",
116
+ pattern=r"'/tmp/([^']+)'",
117
+ replacement=r"str(Path(tempfile.gettempdir()) / '\1')",
118
+ description="Replace hardcoded /tmp paths (single quotes) with tempfile"
119
+ " equivalent",
120
+ global_replace=True,
121
+ test_cases=[
122
+ ("'/tmp/myfile.txt'", "str(Path(tempfile.gettempdir()) / 'myfile.txt')"),
123
+ ("'/tmp/data.log'", "str(Path(tempfile.gettempdir()) / 'data.log')"),
124
+ ("'/regular/path'", "'/regular/path'"),
125
+ ],
126
+ ),
127
+ "replace_test_path_patterns": ValidatedPattern(
128
+ name="replace_test_path_patterns",
129
+ pattern=r'Path\("/test/path"\)',
130
+ replacement=r"Path(tempfile.gettempdir()) / 'test-path'",
131
+ description="Replace hardcoded /test/path patterns with tempfile equivalent",
132
+ test_cases=[
133
+ ('Path("/test/path")', "Path(tempfile.gettempdir()) / 'test-path'"),
134
+ ('Path("/other/path")', 'Path("/other/path")'),
135
+ ],
136
+ ),
137
+ "replace_path_open_write": ValidatedPattern(
138
+ name="replace_path_open_write",
139
+ pattern=r'(\w+)\.open\(["\']wb?["\'][^)]*\)',
140
+ replacement=r"atomic_file_write(\1)",
141
+ test_cases=[
142
+ ("path.open('w')", "atomic_file_write(path)"),
143
+ ("file.open('wb')", "atomic_file_write(file)"),
144
+ ],
145
+ description="Replace file.open() with atomic_file_write",
146
+ ),
147
+ "replace_path_write_text": ValidatedPattern(
148
+ name="replace_path_write_text",
149
+ pattern=r"(\w+)\.write_text\(([^)]+)\)",
150
+ replacement=r"await SafeFileOperations.safe_write_text(\1, \2, atomic=True)",
151
+ test_cases=[
152
+ (
153
+ "path.write_text(content)",
154
+ "await SafeFileOperations.safe_write_text(path, content, atomic=True)",
155
+ ),
156
+ ],
157
+ description="Replace path.write_text with safe atomic write",
158
+ ),
159
+ }