crackerjack 0.18.2__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 (533) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +96 -2
  3. crackerjack/__main__.py +637 -138
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +39 -0
  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/lsp/_base.py +194 -0
  27. crackerjack/adapters/lsp/_client.py +358 -0
  28. crackerjack/adapters/lsp/_manager.py +193 -0
  29. crackerjack/adapters/lsp/skylos.py +283 -0
  30. crackerjack/adapters/lsp/zuban.py +557 -0
  31. crackerjack/adapters/refactor/README.md +59 -0
  32. crackerjack/adapters/refactor/__init__.py +12 -0
  33. crackerjack/adapters/refactor/creosote.py +318 -0
  34. crackerjack/adapters/refactor/refurb.py +406 -0
  35. crackerjack/adapters/refactor/skylos.py +494 -0
  36. crackerjack/adapters/sast/README.md +132 -0
  37. crackerjack/adapters/sast/__init__.py +32 -0
  38. crackerjack/adapters/sast/_base.py +201 -0
  39. crackerjack/adapters/sast/bandit.py +423 -0
  40. crackerjack/adapters/sast/pyscn.py +405 -0
  41. crackerjack/adapters/sast/semgrep.py +241 -0
  42. crackerjack/adapters/security/README.md +111 -0
  43. crackerjack/adapters/security/__init__.py +17 -0
  44. crackerjack/adapters/security/gitleaks.py +339 -0
  45. crackerjack/adapters/type/README.md +52 -0
  46. crackerjack/adapters/type/__init__.py +12 -0
  47. crackerjack/adapters/type/pyrefly.py +402 -0
  48. crackerjack/adapters/type/ty.py +402 -0
  49. crackerjack/adapters/type/zuban.py +522 -0
  50. crackerjack/adapters/utility/README.md +51 -0
  51. crackerjack/adapters/utility/__init__.py +10 -0
  52. crackerjack/adapters/utility/checks.py +884 -0
  53. crackerjack/agents/README.md +264 -0
  54. crackerjack/agents/__init__.py +66 -0
  55. crackerjack/agents/architect_agent.py +238 -0
  56. crackerjack/agents/base.py +167 -0
  57. crackerjack/agents/claude_code_bridge.py +641 -0
  58. crackerjack/agents/coordinator.py +600 -0
  59. crackerjack/agents/documentation_agent.py +520 -0
  60. crackerjack/agents/dry_agent.py +585 -0
  61. crackerjack/agents/enhanced_coordinator.py +279 -0
  62. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  63. crackerjack/agents/error_middleware.py +53 -0
  64. crackerjack/agents/formatting_agent.py +230 -0
  65. crackerjack/agents/helpers/__init__.py +9 -0
  66. crackerjack/agents/helpers/performance/__init__.py +22 -0
  67. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  68. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  69. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  70. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  71. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  72. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  73. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  74. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  75. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  76. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  77. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  78. crackerjack/agents/import_optimization_agent.py +1181 -0
  79. crackerjack/agents/performance_agent.py +325 -0
  80. crackerjack/agents/performance_helpers.py +205 -0
  81. crackerjack/agents/proactive_agent.py +55 -0
  82. crackerjack/agents/refactoring_agent.py +511 -0
  83. crackerjack/agents/refactoring_helpers.py +247 -0
  84. crackerjack/agents/security_agent.py +793 -0
  85. crackerjack/agents/semantic_agent.py +479 -0
  86. crackerjack/agents/semantic_helpers.py +356 -0
  87. crackerjack/agents/test_creation_agent.py +570 -0
  88. crackerjack/agents/test_specialist_agent.py +526 -0
  89. crackerjack/agents/tracker.py +110 -0
  90. crackerjack/api.py +647 -0
  91. crackerjack/cli/README.md +394 -0
  92. crackerjack/cli/__init__.py +24 -0
  93. crackerjack/cli/cache_handlers.py +209 -0
  94. crackerjack/cli/cache_handlers_enhanced.py +680 -0
  95. crackerjack/cli/facade.py +162 -0
  96. crackerjack/cli/formatting.py +13 -0
  97. crackerjack/cli/handlers/__init__.py +85 -0
  98. crackerjack/cli/handlers/advanced.py +103 -0
  99. crackerjack/cli/handlers/ai_features.py +62 -0
  100. crackerjack/cli/handlers/analytics.py +479 -0
  101. crackerjack/cli/handlers/changelog.py +271 -0
  102. crackerjack/cli/handlers/config_handlers.py +16 -0
  103. crackerjack/cli/handlers/coverage.py +84 -0
  104. crackerjack/cli/handlers/documentation.py +280 -0
  105. crackerjack/cli/handlers/main_handlers.py +497 -0
  106. crackerjack/cli/handlers/monitoring.py +371 -0
  107. crackerjack/cli/handlers.py +700 -0
  108. crackerjack/cli/interactive.py +488 -0
  109. crackerjack/cli/options.py +1216 -0
  110. crackerjack/cli/semantic_handlers.py +292 -0
  111. crackerjack/cli/utils.py +19 -0
  112. crackerjack/cli/version.py +19 -0
  113. crackerjack/code_cleaner.py +1307 -0
  114. crackerjack/config/README.md +472 -0
  115. crackerjack/config/__init__.py +275 -0
  116. crackerjack/config/global_lock_config.py +207 -0
  117. crackerjack/config/hooks.py +390 -0
  118. crackerjack/config/loader.py +239 -0
  119. crackerjack/config/settings.py +141 -0
  120. crackerjack/config/tool_commands.py +331 -0
  121. crackerjack/core/README.md +393 -0
  122. crackerjack/core/__init__.py +0 -0
  123. crackerjack/core/async_workflow_orchestrator.py +738 -0
  124. crackerjack/core/autofix_coordinator.py +282 -0
  125. crackerjack/core/container.py +105 -0
  126. crackerjack/core/enhanced_container.py +583 -0
  127. crackerjack/core/file_lifecycle.py +472 -0
  128. crackerjack/core/performance.py +244 -0
  129. crackerjack/core/performance_monitor.py +357 -0
  130. crackerjack/core/phase_coordinator.py +1227 -0
  131. crackerjack/core/proactive_workflow.py +267 -0
  132. crackerjack/core/resource_manager.py +425 -0
  133. crackerjack/core/retry.py +275 -0
  134. crackerjack/core/service_watchdog.py +601 -0
  135. crackerjack/core/session_coordinator.py +239 -0
  136. crackerjack/core/timeout_manager.py +563 -0
  137. crackerjack/core/websocket_lifecycle.py +410 -0
  138. crackerjack/core/workflow/__init__.py +21 -0
  139. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  140. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  141. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  142. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  143. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  144. crackerjack/core/workflow_orchestrator.py +2243 -0
  145. crackerjack/data/README.md +11 -0
  146. crackerjack/data/__init__.py +8 -0
  147. crackerjack/data/models.py +79 -0
  148. crackerjack/data/repository.py +210 -0
  149. crackerjack/decorators/README.md +180 -0
  150. crackerjack/decorators/__init__.py +35 -0
  151. crackerjack/decorators/error_handling.py +649 -0
  152. crackerjack/decorators/error_handling_decorators.py +334 -0
  153. crackerjack/decorators/helpers.py +58 -0
  154. crackerjack/decorators/patterns.py +281 -0
  155. crackerjack/decorators/utils.py +58 -0
  156. crackerjack/docs/INDEX.md +11 -0
  157. crackerjack/docs/README.md +11 -0
  158. crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
  159. crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
  160. crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
  161. crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
  162. crackerjack/docs/generated/api/SERVICES.md +1252 -0
  163. crackerjack/documentation/README.md +11 -0
  164. crackerjack/documentation/__init__.py +31 -0
  165. crackerjack/documentation/ai_templates.py +756 -0
  166. crackerjack/documentation/dual_output_generator.py +767 -0
  167. crackerjack/documentation/mkdocs_integration.py +518 -0
  168. crackerjack/documentation/reference_generator.py +1065 -0
  169. crackerjack/dynamic_config.py +678 -0
  170. crackerjack/errors.py +378 -0
  171. crackerjack/events/README.md +11 -0
  172. crackerjack/events/__init__.py +16 -0
  173. crackerjack/events/telemetry.py +175 -0
  174. crackerjack/events/workflow_bus.py +346 -0
  175. crackerjack/exceptions/README.md +301 -0
  176. crackerjack/exceptions/__init__.py +5 -0
  177. crackerjack/exceptions/config.py +4 -0
  178. crackerjack/exceptions/tool_execution_error.py +245 -0
  179. crackerjack/executors/README.md +591 -0
  180. crackerjack/executors/__init__.py +13 -0
  181. crackerjack/executors/async_hook_executor.py +938 -0
  182. crackerjack/executors/cached_hook_executor.py +316 -0
  183. crackerjack/executors/hook_executor.py +1295 -0
  184. crackerjack/executors/hook_lock_manager.py +708 -0
  185. crackerjack/executors/individual_hook_executor.py +739 -0
  186. crackerjack/executors/lsp_aware_hook_executor.py +349 -0
  187. crackerjack/executors/progress_hook_executor.py +282 -0
  188. crackerjack/executors/tool_proxy.py +433 -0
  189. crackerjack/hooks/README.md +485 -0
  190. crackerjack/hooks/lsp_hook.py +93 -0
  191. crackerjack/intelligence/README.md +557 -0
  192. crackerjack/intelligence/__init__.py +37 -0
  193. crackerjack/intelligence/adaptive_learning.py +693 -0
  194. crackerjack/intelligence/agent_orchestrator.py +485 -0
  195. crackerjack/intelligence/agent_registry.py +377 -0
  196. crackerjack/intelligence/agent_selector.py +439 -0
  197. crackerjack/intelligence/integration.py +250 -0
  198. crackerjack/interactive.py +719 -0
  199. crackerjack/managers/README.md +369 -0
  200. crackerjack/managers/__init__.py +11 -0
  201. crackerjack/managers/async_hook_manager.py +135 -0
  202. crackerjack/managers/hook_manager.py +585 -0
  203. crackerjack/managers/publish_manager.py +631 -0
  204. crackerjack/managers/test_command_builder.py +391 -0
  205. crackerjack/managers/test_executor.py +474 -0
  206. crackerjack/managers/test_manager.py +1357 -0
  207. crackerjack/managers/test_progress.py +187 -0
  208. crackerjack/mcp/README.md +374 -0
  209. crackerjack/mcp/__init__.py +0 -0
  210. crackerjack/mcp/cache.py +352 -0
  211. crackerjack/mcp/client_runner.py +121 -0
  212. crackerjack/mcp/context.py +802 -0
  213. crackerjack/mcp/dashboard.py +657 -0
  214. crackerjack/mcp/enhanced_progress_monitor.py +493 -0
  215. crackerjack/mcp/file_monitor.py +394 -0
  216. crackerjack/mcp/progress_components.py +607 -0
  217. crackerjack/mcp/progress_monitor.py +1016 -0
  218. crackerjack/mcp/rate_limiter.py +336 -0
  219. crackerjack/mcp/server.py +24 -0
  220. crackerjack/mcp/server_core.py +526 -0
  221. crackerjack/mcp/service_watchdog.py +505 -0
  222. crackerjack/mcp/state.py +407 -0
  223. crackerjack/mcp/task_manager.py +259 -0
  224. crackerjack/mcp/tools/README.md +27 -0
  225. crackerjack/mcp/tools/__init__.py +19 -0
  226. crackerjack/mcp/tools/core_tools.py +469 -0
  227. crackerjack/mcp/tools/error_analyzer.py +283 -0
  228. crackerjack/mcp/tools/execution_tools.py +384 -0
  229. crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
  230. crackerjack/mcp/tools/intelligence_tools.py +264 -0
  231. crackerjack/mcp/tools/monitoring_tools.py +628 -0
  232. crackerjack/mcp/tools/proactive_tools.py +367 -0
  233. crackerjack/mcp/tools/progress_tools.py +222 -0
  234. crackerjack/mcp/tools/semantic_tools.py +584 -0
  235. crackerjack/mcp/tools/utility_tools.py +358 -0
  236. crackerjack/mcp/tools/workflow_executor.py +699 -0
  237. crackerjack/mcp/websocket/README.md +31 -0
  238. crackerjack/mcp/websocket/__init__.py +14 -0
  239. crackerjack/mcp/websocket/app.py +54 -0
  240. crackerjack/mcp/websocket/endpoints.py +492 -0
  241. crackerjack/mcp/websocket/event_bridge.py +188 -0
  242. crackerjack/mcp/websocket/jobs.py +406 -0
  243. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  244. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  245. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  246. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  247. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  248. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  249. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  250. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  251. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  252. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  253. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  254. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  255. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  256. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  257. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  258. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  259. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  260. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  261. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  262. crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
  263. crackerjack/mcp/websocket/server.py +174 -0
  264. crackerjack/mcp/websocket/websocket_handler.py +276 -0
  265. crackerjack/mcp/websocket_server.py +10 -0
  266. crackerjack/models/README.md +308 -0
  267. crackerjack/models/__init__.py +40 -0
  268. crackerjack/models/config.py +730 -0
  269. crackerjack/models/config_adapter.py +265 -0
  270. crackerjack/models/protocols.py +1535 -0
  271. crackerjack/models/pydantic_models.py +320 -0
  272. crackerjack/models/qa_config.py +145 -0
  273. crackerjack/models/qa_results.py +134 -0
  274. crackerjack/models/resource_protocols.py +299 -0
  275. crackerjack/models/results.py +35 -0
  276. crackerjack/models/semantic_models.py +258 -0
  277. crackerjack/models/task.py +173 -0
  278. crackerjack/models/test_models.py +60 -0
  279. crackerjack/monitoring/README.md +11 -0
  280. crackerjack/monitoring/__init__.py +0 -0
  281. crackerjack/monitoring/ai_agent_watchdog.py +405 -0
  282. crackerjack/monitoring/metrics_collector.py +427 -0
  283. crackerjack/monitoring/regression_prevention.py +580 -0
  284. crackerjack/monitoring/websocket_server.py +406 -0
  285. crackerjack/orchestration/README.md +340 -0
  286. crackerjack/orchestration/__init__.py +43 -0
  287. crackerjack/orchestration/advanced_orchestrator.py +894 -0
  288. crackerjack/orchestration/cache/README.md +312 -0
  289. crackerjack/orchestration/cache/__init__.py +37 -0
  290. crackerjack/orchestration/cache/memory_cache.py +338 -0
  291. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  292. crackerjack/orchestration/config.py +297 -0
  293. crackerjack/orchestration/coverage_improvement.py +180 -0
  294. crackerjack/orchestration/execution_strategies.py +361 -0
  295. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  296. crackerjack/orchestration/strategies/README.md +401 -0
  297. crackerjack/orchestration/strategies/__init__.py +39 -0
  298. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  299. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  300. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  301. crackerjack/orchestration/test_progress_streamer.py +647 -0
  302. crackerjack/plugins/README.md +11 -0
  303. crackerjack/plugins/__init__.py +15 -0
  304. crackerjack/plugins/base.py +200 -0
  305. crackerjack/plugins/hooks.py +254 -0
  306. crackerjack/plugins/loader.py +335 -0
  307. crackerjack/plugins/managers.py +264 -0
  308. crackerjack/py313.py +191 -0
  309. crackerjack/security/README.md +11 -0
  310. crackerjack/security/__init__.py +0 -0
  311. crackerjack/security/audit.py +197 -0
  312. crackerjack/services/README.md +374 -0
  313. crackerjack/services/__init__.py +9 -0
  314. crackerjack/services/ai/README.md +295 -0
  315. crackerjack/services/ai/__init__.py +7 -0
  316. crackerjack/services/ai/advanced_optimizer.py +878 -0
  317. crackerjack/services/ai/contextual_ai_assistant.py +542 -0
  318. crackerjack/services/ai/embeddings.py +444 -0
  319. crackerjack/services/ai/intelligent_commit.py +328 -0
  320. crackerjack/services/ai/predictive_analytics.py +510 -0
  321. crackerjack/services/anomaly_detector.py +392 -0
  322. crackerjack/services/api_extractor.py +617 -0
  323. crackerjack/services/backup_service.py +467 -0
  324. crackerjack/services/bounded_status_operations.py +530 -0
  325. crackerjack/services/cache.py +369 -0
  326. crackerjack/services/changelog_automation.py +399 -0
  327. crackerjack/services/command_execution_service.py +305 -0
  328. crackerjack/services/config_integrity.py +132 -0
  329. crackerjack/services/config_merge.py +546 -0
  330. crackerjack/services/config_service.py +198 -0
  331. crackerjack/services/config_template.py +493 -0
  332. crackerjack/services/coverage_badge_service.py +173 -0
  333. crackerjack/services/coverage_ratchet.py +381 -0
  334. crackerjack/services/debug.py +733 -0
  335. crackerjack/services/dependency_analyzer.py +460 -0
  336. crackerjack/services/dependency_monitor.py +622 -0
  337. crackerjack/services/documentation_generator.py +493 -0
  338. crackerjack/services/documentation_service.py +704 -0
  339. crackerjack/services/enhanced_filesystem.py +497 -0
  340. crackerjack/services/enterprise_optimizer.py +865 -0
  341. crackerjack/services/error_pattern_analyzer.py +676 -0
  342. crackerjack/services/file_filter.py +221 -0
  343. crackerjack/services/file_hasher.py +149 -0
  344. crackerjack/services/file_io_service.py +361 -0
  345. crackerjack/services/file_modifier.py +615 -0
  346. crackerjack/services/filesystem.py +381 -0
  347. crackerjack/services/git.py +422 -0
  348. crackerjack/services/health_metrics.py +615 -0
  349. crackerjack/services/heatmap_generator.py +744 -0
  350. crackerjack/services/incremental_executor.py +380 -0
  351. crackerjack/services/initialization.py +823 -0
  352. crackerjack/services/input_validator.py +668 -0
  353. crackerjack/services/intelligent_commit.py +327 -0
  354. crackerjack/services/log_manager.py +289 -0
  355. crackerjack/services/logging.py +228 -0
  356. crackerjack/services/lsp_client.py +628 -0
  357. crackerjack/services/memory_optimizer.py +414 -0
  358. crackerjack/services/metrics.py +587 -0
  359. crackerjack/services/monitoring/README.md +30 -0
  360. crackerjack/services/monitoring/__init__.py +9 -0
  361. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  362. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  363. crackerjack/services/monitoring/health_metrics.py +716 -0
  364. crackerjack/services/monitoring/metrics.py +587 -0
  365. crackerjack/services/monitoring/performance_benchmarks.py +410 -0
  366. crackerjack/services/monitoring/performance_cache.py +388 -0
  367. crackerjack/services/monitoring/performance_monitor.py +569 -0
  368. crackerjack/services/parallel_executor.py +527 -0
  369. crackerjack/services/pattern_cache.py +333 -0
  370. crackerjack/services/pattern_detector.py +478 -0
  371. crackerjack/services/patterns/__init__.py +142 -0
  372. crackerjack/services/patterns/agents.py +107 -0
  373. crackerjack/services/patterns/code/__init__.py +15 -0
  374. crackerjack/services/patterns/code/detection.py +118 -0
  375. crackerjack/services/patterns/code/imports.py +107 -0
  376. crackerjack/services/patterns/code/paths.py +159 -0
  377. crackerjack/services/patterns/code/performance.py +119 -0
  378. crackerjack/services/patterns/code/replacement.py +36 -0
  379. crackerjack/services/patterns/core.py +212 -0
  380. crackerjack/services/patterns/documentation/__init__.py +14 -0
  381. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  382. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  383. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  384. crackerjack/services/patterns/formatting.py +226 -0
  385. crackerjack/services/patterns/operations.py +339 -0
  386. crackerjack/services/patterns/security/__init__.py +23 -0
  387. crackerjack/services/patterns/security/code_injection.py +122 -0
  388. crackerjack/services/patterns/security/credentials.py +190 -0
  389. crackerjack/services/patterns/security/path_traversal.py +221 -0
  390. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  391. crackerjack/services/patterns/templates.py +62 -0
  392. crackerjack/services/patterns/testing/__init__.py +18 -0
  393. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  394. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  395. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  396. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  397. crackerjack/services/patterns/tool_output/other.py +97 -0
  398. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  399. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  400. crackerjack/services/patterns/url_sanitization.py +114 -0
  401. crackerjack/services/patterns/utilities.py +42 -0
  402. crackerjack/services/patterns/utils.py +339 -0
  403. crackerjack/services/patterns/validation.py +46 -0
  404. crackerjack/services/patterns/versioning.py +62 -0
  405. crackerjack/services/predictive_analytics.py +523 -0
  406. crackerjack/services/profiler.py +280 -0
  407. crackerjack/services/quality/README.md +415 -0
  408. crackerjack/services/quality/__init__.py +11 -0
  409. crackerjack/services/quality/anomaly_detector.py +392 -0
  410. crackerjack/services/quality/pattern_cache.py +333 -0
  411. crackerjack/services/quality/pattern_detector.py +479 -0
  412. crackerjack/services/quality/qa_orchestrator.py +491 -0
  413. crackerjack/services/quality/quality_baseline.py +395 -0
  414. crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
  415. crackerjack/services/quality/quality_intelligence.py +949 -0
  416. crackerjack/services/regex_patterns.py +58 -0
  417. crackerjack/services/regex_utils.py +483 -0
  418. crackerjack/services/secure_path_utils.py +524 -0
  419. crackerjack/services/secure_status_formatter.py +450 -0
  420. crackerjack/services/secure_subprocess.py +635 -0
  421. crackerjack/services/security.py +239 -0
  422. crackerjack/services/security_logger.py +495 -0
  423. crackerjack/services/server_manager.py +411 -0
  424. crackerjack/services/smart_scheduling.py +167 -0
  425. crackerjack/services/status_authentication.py +460 -0
  426. crackerjack/services/status_security_manager.py +315 -0
  427. crackerjack/services/terminal_utils.py +0 -0
  428. crackerjack/services/thread_safe_status_collector.py +441 -0
  429. crackerjack/services/tool_filter.py +368 -0
  430. crackerjack/services/tool_version_service.py +43 -0
  431. crackerjack/services/unified_config.py +115 -0
  432. crackerjack/services/validation_rate_limiter.py +220 -0
  433. crackerjack/services/vector_store.py +689 -0
  434. crackerjack/services/version_analyzer.py +461 -0
  435. crackerjack/services/version_checker.py +223 -0
  436. crackerjack/services/websocket_resource_limiter.py +438 -0
  437. crackerjack/services/zuban_lsp_service.py +391 -0
  438. crackerjack/slash_commands/README.md +11 -0
  439. crackerjack/slash_commands/__init__.py +59 -0
  440. crackerjack/slash_commands/init.md +112 -0
  441. crackerjack/slash_commands/run.md +197 -0
  442. crackerjack/slash_commands/status.md +127 -0
  443. crackerjack/tools/README.md +11 -0
  444. crackerjack/tools/__init__.py +30 -0
  445. crackerjack/tools/_git_utils.py +105 -0
  446. crackerjack/tools/check_added_large_files.py +139 -0
  447. crackerjack/tools/check_ast.py +105 -0
  448. crackerjack/tools/check_json.py +103 -0
  449. crackerjack/tools/check_jsonschema.py +297 -0
  450. crackerjack/tools/check_toml.py +103 -0
  451. crackerjack/tools/check_yaml.py +110 -0
  452. crackerjack/tools/codespell_wrapper.py +72 -0
  453. crackerjack/tools/end_of_file_fixer.py +202 -0
  454. crackerjack/tools/format_json.py +128 -0
  455. crackerjack/tools/mdformat_wrapper.py +114 -0
  456. crackerjack/tools/trailing_whitespace.py +198 -0
  457. crackerjack/tools/validate_input_validator_patterns.py +236 -0
  458. crackerjack/tools/validate_regex_patterns.py +188 -0
  459. crackerjack/ui/README.md +11 -0
  460. crackerjack/ui/__init__.py +1 -0
  461. crackerjack/ui/dashboard_renderer.py +28 -0
  462. crackerjack/ui/templates/README.md +11 -0
  463. crackerjack/utils/console_utils.py +13 -0
  464. crackerjack/utils/dependency_guard.py +230 -0
  465. crackerjack/utils/retry_utils.py +275 -0
  466. crackerjack/workflows/README.md +590 -0
  467. crackerjack/workflows/__init__.py +46 -0
  468. crackerjack/workflows/actions.py +811 -0
  469. crackerjack/workflows/auto_fix.py +444 -0
  470. crackerjack/workflows/container_builder.py +499 -0
  471. crackerjack/workflows/definitions.py +443 -0
  472. crackerjack/workflows/engine.py +177 -0
  473. crackerjack/workflows/event_bridge.py +242 -0
  474. crackerjack-0.45.2.dist-info/METADATA +1678 -0
  475. crackerjack-0.45.2.dist-info/RECORD +478 -0
  476. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  477. crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
  478. crackerjack/.gitignore +0 -14
  479. crackerjack/.libcst.codemod.yaml +0 -18
  480. crackerjack/.pdm.toml +0 -1
  481. crackerjack/.pre-commit-config.yaml +0 -91
  482. crackerjack/.pytest_cache/.gitignore +0 -2
  483. crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
  484. crackerjack/.pytest_cache/README.md +0 -8
  485. crackerjack/.pytest_cache/v/cache/nodeids +0 -1
  486. crackerjack/.pytest_cache/v/cache/stepwise +0 -1
  487. crackerjack/.ruff_cache/.gitignore +0 -1
  488. crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
  489. crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
  490. crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
  491. crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
  492. crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
  493. crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
  494. crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
  495. crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
  496. crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
  497. crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
  498. crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
  499. crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
  500. crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
  501. crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
  502. crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
  503. crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
  504. crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
  505. crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
  506. crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
  507. crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
  508. crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
  509. crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
  510. crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
  511. crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
  512. crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
  513. crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
  514. crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
  515. crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
  516. crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
  517. crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
  518. crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
  519. crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
  520. crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
  521. crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
  522. crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
  523. crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
  524. crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
  525. crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
  526. crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
  527. crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
  528. crackerjack/crackerjack.py +0 -855
  529. crackerjack/pyproject.toml +0 -214
  530. crackerjack-0.18.2.dist-info/METADATA +0 -420
  531. crackerjack-0.18.2.dist-info/RECORD +0 -59
  532. crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
  533. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,478 @@
1
+ import ast
2
+ import logging
3
+ import typing as t
4
+ from collections.abc import Awaitable, Callable
5
+ from dataclasses import dataclass
6
+ from pathlib import Path
7
+
8
+ from ..agents.base import Issue, IssueType, Priority
9
+ from .pattern_cache import CachedPattern, PatternCache
10
+
11
+ DetectorMethod = Callable[[Path, str, ast.AST], Awaitable[list["AntiPattern"]]]
12
+
13
+
14
+ class AntiPatternConfig(t.TypedDict):
15
+ detector: DetectorMethod
16
+ description: str
17
+ prevention: str
18
+
19
+
20
+ @dataclass
21
+ class AntiPattern:
22
+ pattern_type: str
23
+ severity: Priority
24
+ file_path: str
25
+ line_number: int | None
26
+ description: str
27
+ suggestion: str
28
+ prevention_strategy: str
29
+
30
+
31
+ class PatternDetector:
32
+ def __init__(self, project_path: Path, pattern_cache: PatternCache) -> None:
33
+ self.project_path = project_path
34
+ self.pattern_cache = pattern_cache
35
+ self.logger = logging.getLogger(__name__)
36
+
37
+ self._anti_patterns: dict[str, AntiPatternConfig] = {
38
+ "complexity_hotspot": {
39
+ "detector": self._detect_complexity_hotspots,
40
+ "description": "Functions approaching complexity limits",
41
+ "prevention": "Extract methods, use helper functions",
42
+ },
43
+ "code_duplication": {
44
+ "detector": self._detect_code_duplication,
45
+ "description": "Repeated code patterns across files",
46
+ "prevention": "Extract common functionality to utilities",
47
+ },
48
+ "performance_issues": {
49
+ "detector": self._detect_performance_issues,
50
+ "description": "Inefficient code patterns",
51
+ "prevention": "Use optimized algorithms and data structures",
52
+ },
53
+ "security_risks": {
54
+ "detector": self._detect_security_risks,
55
+ "description": "Potentially unsafe code patterns",
56
+ "prevention": "Apply secure coding practices",
57
+ },
58
+ "import_complexity": {
59
+ "detector": self._detect_import_complexity,
60
+ "description": "Complex or problematic import patterns",
61
+ "prevention": "Organize imports, avoid circular dependencies",
62
+ },
63
+ }
64
+
65
+ async def analyze_codebase(self) -> list[AntiPattern]:
66
+ self.logger.info("Starting proactive anti-pattern analysis")
67
+
68
+ anti_patterns = []
69
+ python_files = list[t.Any](self.project_path.glob("**/*.py"))
70
+
71
+ for file_path in python_files:
72
+ if self._should_skip_file(file_path):
73
+ continue
74
+
75
+ file_anti_patterns = await self._analyze_file(file_path)
76
+ anti_patterns.extend(file_anti_patterns)
77
+
78
+ self.logger.info(f"Detected {len(anti_patterns)} potential anti-patterns")
79
+ return anti_patterns
80
+
81
+ async def _analyze_file(self, file_path: Path) -> list[AntiPattern]:
82
+ anti_patterns = []
83
+
84
+ try:
85
+ content = file_path.read_text(encoding="utf-8")
86
+
87
+ try:
88
+ tree = ast.parse(content, filename=str(file_path))
89
+ except SyntaxError as e:
90
+ self.logger.warning(f"Syntax error in {file_path}: {e}")
91
+ return []
92
+
93
+ for pattern_name, pattern_info in self._anti_patterns.items():
94
+ detector_method = pattern_info["detector"]
95
+ try:
96
+ detected = await detector_method(file_path, content, tree)
97
+ anti_patterns.extend(detected)
98
+ except Exception as e:
99
+ self.logger.warning(
100
+ f"Error in {pattern_name} detector for {file_path}: {e}"
101
+ )
102
+
103
+ except Exception as e:
104
+ self.logger.warning(f"Failed to analyze {file_path}: {e}")
105
+
106
+ return anti_patterns
107
+
108
+ async def _detect_complexity_hotspots(
109
+ self, file_path: Path, content: str, tree: ast.AST
110
+ ) -> list[AntiPattern]:
111
+ anti_patterns = []
112
+
113
+ class ComplexityVisitor(ast.NodeVisitor):
114
+ def __init__(self) -> None:
115
+ self.functions: list[tuple[str, int, int]] = []
116
+
117
+ def visit_FunctionDef(self, node: ast.FunctionDef) -> None:
118
+ complexity = 1
119
+
120
+ for child in ast.walk(node):
121
+ if isinstance(child, ast.If | ast.For | ast.While | ast.With):
122
+ complexity += 1
123
+ elif isinstance(child, ast.Try):
124
+ complexity += 1
125
+ elif isinstance(child, ast.ExceptHandler):
126
+ complexity += 1
127
+ elif isinstance(child, ast.BoolOp):
128
+ complexity += len(child.values) - 1
129
+
130
+ self.functions.append((node.name, node.lineno, complexity))
131
+ self.generic_visit(node)
132
+
133
+ visitor = ComplexityVisitor()
134
+ visitor.visit(tree)
135
+
136
+ for func_name, line_no, complexity in visitor.functions:
137
+ if complexity >= 10:
138
+ anti_patterns.append(
139
+ AntiPattern(
140
+ pattern_type="complexity_hotspot",
141
+ severity=Priority.HIGH if complexity >= 12 else Priority.MEDIUM,
142
+ file_path=str(file_path),
143
+ line_number=line_no,
144
+ description=f"Function '{func_name}' has complexity {complexity} (approaching limit of 15)",
145
+ suggestion=f"Break down '{func_name}' into smaller helper methods",
146
+ prevention_strategy="extract_method",
147
+ )
148
+ )
149
+
150
+ return anti_patterns
151
+
152
+ async def _detect_code_duplication(
153
+ self, file_path: Path, content: str, tree: ast.AST
154
+ ) -> list[AntiPattern]:
155
+ anti_patterns = []
156
+
157
+ lines = content.split("\n")
158
+ line_groups: dict[str, list[int]] = {}
159
+
160
+ for i, line in enumerate(lines, 1):
161
+ stripped = line.strip()
162
+ if len(stripped) > 20 and not stripped.startswith("#"):
163
+ if stripped in line_groups:
164
+ line_groups[stripped].append(i)
165
+ else:
166
+ line_groups[stripped] = [i]
167
+
168
+ for line_content, line_numbers in line_groups.items():
169
+ if len(line_numbers) >= 3:
170
+ anti_patterns.append(
171
+ AntiPattern(
172
+ pattern_type="code_duplication",
173
+ severity=Priority.MEDIUM,
174
+ file_path=str(file_path),
175
+ line_number=line_numbers[0],
176
+ description=f"Line appears {len(line_numbers)} times: '{line_content[:50]}...'",
177
+ suggestion="Extract common functionality to a utility function",
178
+ prevention_strategy="extract_utility",
179
+ )
180
+ )
181
+
182
+ return anti_patterns
183
+
184
+ async def _detect_performance_issues(
185
+ self, file_path: Path, content: str, tree: ast.AST
186
+ ) -> list[AntiPattern]:
187
+ anti_patterns = []
188
+
189
+ class PerformanceVisitor(ast.NodeVisitor):
190
+ def __init__(self) -> None:
191
+ self.issues: list[tuple[int, str, str]] = []
192
+
193
+ def visit_For(self, node: ast.For) -> None:
194
+ for child in ast.walk(node.body[0] if node.body else node):
195
+ if isinstance(child, ast.For | ast.While) and child != node:
196
+ self.issues.append(
197
+ (
198
+ node.lineno,
199
+ "Nested loop detected-potential O(n²) complexity",
200
+ "Consider using dictionary lookups or set[t.Any] operations",
201
+ )
202
+ )
203
+ break
204
+
205
+ for stmt in node.body:
206
+ if (
207
+ isinstance(stmt, ast.AugAssign)
208
+ and isinstance(stmt.op, ast.Add)
209
+ and isinstance(stmt.target, ast.Name)
210
+ ):
211
+ self.issues.append(
212
+ (
213
+ stmt.lineno,
214
+ "List concatenation in loop-inefficient",
215
+ "Use list[t.Any].append() and join at the end",
216
+ )
217
+ )
218
+
219
+ self.generic_visit(node)
220
+
221
+ visitor = PerformanceVisitor()
222
+ visitor.visit(tree)
223
+
224
+ for line_no, description, suggestion in visitor.issues:
225
+ anti_patterns.append(
226
+ AntiPattern(
227
+ pattern_type="performance_issues",
228
+ severity=Priority.MEDIUM,
229
+ file_path=str(file_path),
230
+ line_number=line_no,
231
+ description=description,
232
+ suggestion=suggestion,
233
+ prevention_strategy="optimize_algorithm",
234
+ )
235
+ )
236
+
237
+ return anti_patterns
238
+
239
+ async def _detect_security_risks(
240
+ self, file_path: Path, content: str, tree: ast.AST
241
+ ) -> list[AntiPattern]:
242
+ anti_patterns = []
243
+
244
+ hardcoded_path_patterns = self._check_hardcoded_paths(file_path, content)
245
+ anti_patterns.extend(hardcoded_path_patterns)
246
+
247
+ subprocess_patterns = self._check_subprocess_security(file_path, tree)
248
+ anti_patterns.extend(subprocess_patterns)
249
+
250
+ return anti_patterns
251
+
252
+ def _check_hardcoded_paths(
253
+ self, file_path: Path, content: str
254
+ ) -> list[AntiPattern]:
255
+ anti_patterns = []
256
+
257
+ if "/tmp/" in content or "C: \\" in content: # nosec B108
258
+ lines = content.split("\n")
259
+ for i, line in enumerate(lines, 1):
260
+ if "/tmp/" in line or "C: \\" in line: # nosec B108
261
+ anti_patterns.append(
262
+ AntiPattern(
263
+ pattern_type="security_risks",
264
+ severity=Priority.HIGH,
265
+ file_path=str(file_path),
266
+ line_number=i,
267
+ description="Hardcoded path detected-potential security risk",
268
+ suggestion="Use tempfile module for temporary files",
269
+ prevention_strategy="use_secure_temp_files",
270
+ )
271
+ )
272
+ break
273
+
274
+ return anti_patterns
275
+
276
+ def _check_subprocess_security(
277
+ self, file_path: Path, tree: ast.AST
278
+ ) -> list[AntiPattern]:
279
+ anti_patterns = []
280
+
281
+ class SecurityVisitor(ast.NodeVisitor):
282
+ def __init__(self) -> None:
283
+ self.issues: list[tuple[int, str, str]] = []
284
+
285
+ def visit_Call(self, node: ast.Call) -> None:
286
+ if (
287
+ isinstance(node.func, ast.Attribute)
288
+ and isinstance(node.func.value, ast.Name)
289
+ and node.func.value.id == "subprocess"
290
+ ):
291
+ for keyword in node.keywords:
292
+ if (
293
+ keyword.arg == "shell"
294
+ and isinstance(keyword.value, ast.Constant)
295
+ and keyword.value.value is True
296
+ ):
297
+ self.issues.append(
298
+ (
299
+ node.lineno,
300
+ "subprocess with shell=True-security risk",
301
+ "Avoid shell=True or validate inputs carefully",
302
+ )
303
+ )
304
+
305
+ self.generic_visit(node)
306
+
307
+ visitor = SecurityVisitor()
308
+ visitor.visit(tree)
309
+
310
+ for line_no, description, suggestion in visitor.issues:
311
+ anti_patterns.append(
312
+ AntiPattern(
313
+ pattern_type="security_risks",
314
+ severity=Priority.HIGH,
315
+ file_path=str(file_path),
316
+ line_number=line_no,
317
+ description=description,
318
+ suggestion=suggestion,
319
+ prevention_strategy="secure_subprocess",
320
+ )
321
+ )
322
+
323
+ return anti_patterns
324
+
325
+ async def _detect_import_complexity(
326
+ self, file_path: Path, content: str, tree: ast.AST
327
+ ) -> list[AntiPattern]:
328
+ anti_patterns = []
329
+
330
+ class ImportVisitor(ast.NodeVisitor):
331
+ def __init__(self) -> None:
332
+ self.imports: list[tuple[int, str]] = []
333
+ self.import_count = 0
334
+
335
+ def visit_Import(self, node: ast.Import) -> None:
336
+ self.import_count += len(node.names)
337
+ for alias in node.names:
338
+ if alias.name.count(".") > 2:
339
+ self.imports.append((node.lineno, f"Deep import: {alias.name}"))
340
+ self.generic_visit(node)
341
+
342
+ def visit_ImportFrom(self, node: ast.ImportFrom) -> None:
343
+ if node.module:
344
+ self.import_count += len(node.names) if node.names else 1
345
+ if node.names and len(node.names) > 10:
346
+ self.imports.append(
347
+ (node.lineno, f"Many imports from {node.module}")
348
+ )
349
+ self.generic_visit(node)
350
+
351
+ visitor = ImportVisitor()
352
+ visitor.visit(tree)
353
+
354
+ if visitor.import_count > 50:
355
+ anti_patterns.append(
356
+ AntiPattern(
357
+ pattern_type="import_complexity",
358
+ severity=Priority.MEDIUM,
359
+ file_path=str(file_path),
360
+ line_number=1,
361
+ description=f"File has {visitor.import_count} imports-may indicate tight coupling",
362
+ suggestion="Consider breaking file into smaller modules",
363
+ prevention_strategy="modular_design",
364
+ )
365
+ )
366
+
367
+ for line_no, description in visitor.imports:
368
+ anti_patterns.append(
369
+ AntiPattern(
370
+ pattern_type="import_complexity",
371
+ severity=Priority.LOW,
372
+ file_path=str(file_path),
373
+ line_number=line_no,
374
+ description=description,
375
+ suggestion="Simplify import structure",
376
+ prevention_strategy="clean_imports",
377
+ )
378
+ )
379
+
380
+ return anti_patterns
381
+
382
+ def _should_skip_file(self, file_path: Path) -> bool:
383
+ skip_patterns = [
384
+ "__pycache__",
385
+ ".git",
386
+ ".venv",
387
+ "venv",
388
+ ".tox",
389
+ "build",
390
+ "dist",
391
+ ".pytest_cache",
392
+ "node_modules",
393
+ ]
394
+
395
+ path_str = str(file_path)
396
+ return any(pattern in path_str for pattern in skip_patterns)
397
+
398
+ async def suggest_proactive_refactoring(
399
+ self, anti_patterns: list[AntiPattern]
400
+ ) -> list[Issue]:
401
+ issues = []
402
+
403
+ for anti_pattern in anti_patterns:
404
+ issue_type_map = {
405
+ "complexity_hotspot": IssueType.COMPLEXITY,
406
+ "code_duplication": IssueType.DRY_VIOLATION,
407
+ "performance_issues": IssueType.PERFORMANCE,
408
+ "security_risks": IssueType.SECURITY,
409
+ "import_complexity": IssueType.IMPORT_ERROR,
410
+ }
411
+
412
+ issue_type = issue_type_map.get(
413
+ anti_pattern.pattern_type, IssueType.FORMATTING
414
+ )
415
+
416
+ issue = Issue(
417
+ id=f"proactive_{anti_pattern.pattern_type}_{hash(anti_pattern.file_path + str(anti_pattern.line_number))}",
418
+ type=issue_type,
419
+ severity=anti_pattern.severity,
420
+ message=f"Proactive: {anti_pattern.description}",
421
+ file_path=anti_pattern.file_path,
422
+ line_number=anti_pattern.line_number,
423
+ details=[
424
+ anti_pattern.suggestion,
425
+ f"Prevention strategy: {anti_pattern.prevention_strategy}",
426
+ ],
427
+ stage="proactive_analysis",
428
+ )
429
+
430
+ issues.append(issue)
431
+
432
+ return issues
433
+
434
+ async def get_cached_solutions(
435
+ self, anti_patterns: list[AntiPattern]
436
+ ) -> dict[str, CachedPattern]:
437
+ solutions = {}
438
+
439
+ for anti_pattern in anti_patterns:
440
+ solution_key = self._generate_solution_key(anti_pattern)
441
+ cached_pattern = self._find_cached_pattern_for_anti_pattern(anti_pattern)
442
+
443
+ if cached_pattern:
444
+ solutions[solution_key] = cached_pattern
445
+
446
+ return solutions
447
+
448
+ def _generate_solution_key(self, anti_pattern: AntiPattern) -> str:
449
+ return f"{anti_pattern.pattern_type}_{anti_pattern.file_path}_{anti_pattern.line_number}"
450
+
451
+ def _find_cached_pattern_for_anti_pattern(
452
+ self, anti_pattern: AntiPattern
453
+ ) -> CachedPattern | None:
454
+ issue_type = self._map_anti_pattern_to_issue_type(anti_pattern.pattern_type)
455
+ if not issue_type:
456
+ return None
457
+
458
+ temp_issue = self._create_temp_issue_for_lookup(anti_pattern, issue_type)
459
+ return self.pattern_cache.get_best_pattern_for_issue(temp_issue)
460
+
461
+ def _map_anti_pattern_to_issue_type(self, pattern_type: str) -> IssueType | None:
462
+ return {
463
+ "complexity_hotspot": IssueType.COMPLEXITY,
464
+ "code_duplication": IssueType.DRY_VIOLATION,
465
+ "performance_issues": IssueType.PERFORMANCE,
466
+ "security_risks": IssueType.SECURITY,
467
+ }.get(pattern_type)
468
+
469
+ def _create_temp_issue_for_lookup(
470
+ self, anti_pattern: AntiPattern, issue_type: IssueType
471
+ ) -> Issue:
472
+ return Issue(
473
+ id="temp",
474
+ type=issue_type,
475
+ severity=anti_pattern.severity,
476
+ message=anti_pattern.description,
477
+ file_path=anti_pattern.file_path,
478
+ )
@@ -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
+ ]