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,572 @@
1
+ """Performance optimization recommendations and fixes."""
2
+
3
+ import operator
4
+ import typing as t
5
+ from dataclasses import dataclass
6
+
7
+ from ....services.regex_patterns import SAFE_PATTERNS
8
+ from ...base import AgentContext
9
+
10
+
11
+ @dataclass
12
+ class OptimizationResult:
13
+ """Result of an optimization attempt."""
14
+
15
+ lines: list[str]
16
+ modified: bool
17
+ optimization_description: str | None = None
18
+
19
+
20
+ class PerformanceRecommender:
21
+ """Generates performance recommendations and applies optimizations."""
22
+
23
+ def __init__(self, context: AgentContext) -> None:
24
+ """Initialize recommender with agent context.
25
+
26
+ Args:
27
+ context: AgentContext for logging
28
+ """
29
+ self.context = context
30
+ self.optimization_stats: dict[str, int] = {
31
+ "nested_loops_optimized": 0,
32
+ "list_ops_optimized": 0,
33
+ "string_concat_optimized": 0,
34
+ "repeated_ops_cached": 0,
35
+ "comprehensions_applied": 0,
36
+ }
37
+
38
+ def apply_performance_optimizations(
39
+ self,
40
+ content: str,
41
+ issues: list[dict[str, t.Any]],
42
+ ) -> str:
43
+ """Apply performance optimizations to content.
44
+
45
+ Args:
46
+ content: File content
47
+ issues: Performance issues to fix
48
+
49
+ Returns:
50
+ Optimized content
51
+ """
52
+ lines = content.split("\n")
53
+ modified = False
54
+ optimizations_applied = []
55
+
56
+ for issue in issues:
57
+ result = self._process_single_issue(lines, issue)
58
+ if result.modified:
59
+ lines = result.lines
60
+ modified = True
61
+ if result.optimization_description:
62
+ optimizations_applied.append(result.optimization_description)
63
+
64
+ if optimizations_applied:
65
+ self.context.log(
66
+ f"Applied optimizations: {', '.join(optimizations_applied)}"
67
+ )
68
+
69
+ return "\n".join(lines) if modified else content
70
+
71
+ def _process_single_issue(
72
+ self, lines: list[str], issue: dict[str, t.Any]
73
+ ) -> OptimizationResult:
74
+ """Process single performance issue.
75
+
76
+ Args:
77
+ lines: File lines
78
+ issue: Performance issue
79
+
80
+ Returns:
81
+ Optimization result
82
+ """
83
+ issue_type = issue["type"]
84
+
85
+ if issue_type in (
86
+ "inefficient_list_operations",
87
+ "inefficient_list_operations_enhanced",
88
+ ):
89
+ return self._handle_list_operations_issue(lines, issue)
90
+ elif issue_type in (
91
+ "string_concatenation_in_loop",
92
+ "string_inefficiencies_enhanced",
93
+ ):
94
+ return self._handle_string_operations_issue(lines, issue)
95
+ elif issue_type == "repeated_expensive_operations":
96
+ return self._handle_repeated_operations_issue(lines, issue)
97
+ elif issue_type in ("nested_loops", "nested_loops_enhanced"):
98
+ return self._handle_nested_loops_issue(lines, issue)
99
+ elif issue_type == "list_comprehension_opportunities":
100
+ return self._handle_comprehension_opportunities_issue(lines, issue)
101
+ elif issue_type == "inefficient_builtin_usage":
102
+ return self._handle_builtin_usage_issue(lines, issue)
103
+ return self._create_no_change_result(lines)
104
+
105
+ def _handle_list_operations_issue(
106
+ self, lines: list[str], issue: dict[str, t.Any]
107
+ ) -> OptimizationResult:
108
+ """Handle inefficient list operations.
109
+
110
+ Args:
111
+ lines: File lines
112
+ issue: Issue dict
113
+
114
+ Returns:
115
+ Optimization result
116
+ """
117
+ new_lines, changed = self._fix_list_operations_enhanced(lines, issue)
118
+ description = None
119
+
120
+ if changed:
121
+ instance_count = len(issue.get("instances", []))
122
+ self.optimization_stats["list_ops_optimized"] += instance_count
123
+ description = f"List operations: {instance_count}"
124
+
125
+ return self._create_optimization_result(new_lines, changed, description)
126
+
127
+ def _handle_string_operations_issue(
128
+ self, lines: list[str], issue: dict[str, t.Any]
129
+ ) -> OptimizationResult:
130
+ """Handle inefficient string operations.
131
+
132
+ Args:
133
+ lines: File lines
134
+ issue: Issue dict
135
+
136
+ Returns:
137
+ Optimization result
138
+ """
139
+ new_lines, changed = self._fix_string_operations_enhanced(lines, issue)
140
+ description = None
141
+
142
+ if changed:
143
+ total_string_fixes = (
144
+ len(issue.get("string_concat_patterns", []))
145
+ + len(issue.get("inefficient_joins", []))
146
+ + len(issue.get("repeated_formatting", []))
147
+ )
148
+ self.optimization_stats["string_concat_optimized"] += total_string_fixes
149
+ description = f"String operations: {total_string_fixes}"
150
+
151
+ return self._create_optimization_result(new_lines, changed, description)
152
+
153
+ def _handle_repeated_operations_issue(
154
+ self, lines: list[str], issue: dict[str, t.Any]
155
+ ) -> OptimizationResult:
156
+ """Handle repeated expensive operations.
157
+
158
+ Args:
159
+ lines: File lines
160
+ issue: Issue dict
161
+
162
+ Returns:
163
+ Optimization result
164
+ """
165
+ new_lines, changed = self._fix_repeated_operations(lines, issue)
166
+
167
+ if changed:
168
+ self.optimization_stats["repeated_ops_cached"] += len(
169
+ issue.get("instances", [])
170
+ )
171
+
172
+ return self._create_optimization_result(new_lines, changed)
173
+
174
+ def _handle_nested_loops_issue(
175
+ self, lines: list[str], issue: dict[str, t.Any]
176
+ ) -> OptimizationResult:
177
+ """Handle nested loops.
178
+
179
+ Args:
180
+ lines: File lines
181
+ issue: Issue dict
182
+
183
+ Returns:
184
+ Optimization result
185
+ """
186
+ new_lines, changed = self._add_nested_loop_comments(lines, issue)
187
+
188
+ if changed:
189
+ self.optimization_stats["nested_loops_optimized"] += len(
190
+ issue.get("instances", [])
191
+ )
192
+
193
+ return self._create_optimization_result(new_lines, changed)
194
+
195
+ def _handle_comprehension_opportunities_issue(
196
+ self, lines: list[str], issue: dict[str, t.Any]
197
+ ) -> OptimizationResult:
198
+ """Handle list comprehension opportunities.
199
+
200
+ Args:
201
+ lines: File lines
202
+ issue: Issue dict
203
+
204
+ Returns:
205
+ Optimization result
206
+ """
207
+ new_lines, changed = self._apply_list_comprehension_optimizations(lines, issue)
208
+
209
+ if changed:
210
+ self.optimization_stats["comprehensions_applied"] += len(
211
+ issue.get("instances", [])
212
+ )
213
+
214
+ return self._create_optimization_result(new_lines, changed)
215
+
216
+ def _handle_builtin_usage_issue(
217
+ self, lines: list[str], issue: dict[str, t.Any]
218
+ ) -> OptimizationResult:
219
+ """Handle inefficient builtin usage.
220
+
221
+ Args:
222
+ lines: File lines
223
+ issue: Issue dict
224
+
225
+ Returns:
226
+ Optimization result
227
+ """
228
+ new_lines, changed = self._add_builtin_caching_comments(lines, issue)
229
+ return self._create_optimization_result(new_lines, changed)
230
+
231
+ @staticmethod
232
+ def _create_optimization_result(
233
+ lines: list[str], modified: bool, description: str | None = None
234
+ ) -> OptimizationResult:
235
+ """Create optimization result.
236
+
237
+ Args:
238
+ lines: File lines
239
+ modified: Whether modified
240
+ description: Description
241
+
242
+ Returns:
243
+ Optimization result
244
+ """
245
+ return OptimizationResult(
246
+ lines=lines, modified=modified, optimization_description=description
247
+ )
248
+
249
+ @staticmethod
250
+ def _create_no_change_result(lines: list[str]) -> OptimizationResult:
251
+ """Create no-change result.
252
+
253
+ Args:
254
+ lines: File lines
255
+
256
+ Returns:
257
+ Optimization result
258
+ """
259
+ return OptimizationResult(
260
+ lines=lines, modified=False, optimization_description=None
261
+ )
262
+
263
+ @staticmethod
264
+ def _fix_list_operations_enhanced(
265
+ lines: list[str],
266
+ issue: dict[str, t.Any],
267
+ ) -> tuple[list[str], bool]:
268
+ """Fix inefficient list operations.
269
+
270
+ Args:
271
+ lines: File lines
272
+ issue: Issue dict
273
+
274
+ Returns:
275
+ Tuple of modified lines and bool
276
+ """
277
+ modified = False
278
+
279
+ instances = sorted(
280
+ issue["instances"],
281
+ key=operator.itemgetter("line_number"),
282
+ reverse=True,
283
+ )
284
+
285
+ for instance in instances:
286
+ line_idx = instance["line_number"] - 1
287
+ if line_idx < len(lines):
288
+ original_line = lines[line_idx]
289
+
290
+ optimization_type = instance.get("optimization", "append")
291
+
292
+ if optimization_type == "append":
293
+ list_pattern = SAFE_PATTERNS["list_append_inefficiency_pattern"]
294
+ if list_pattern.test(original_line):
295
+ optimized_line = list_pattern.apply(original_line)
296
+ lines[line_idx] = optimized_line
297
+ modified = True
298
+
299
+ indent = original_line[
300
+ : len(original_line) - len(original_line.lstrip())
301
+ ]
302
+ performance_gain = instance.get("performance_gain", "2x")
303
+ comment = (
304
+ f"{indent}# Performance: {performance_gain}"
305
+ f" improvement (append vs +=)"
306
+ )
307
+ lines.insert(line_idx, comment)
308
+
309
+ elif optimization_type == "extend":
310
+ extend_pattern = SAFE_PATTERNS["list_extend_optimization_pattern"]
311
+ if extend_pattern.test(original_line):
312
+ optimized_line = extend_pattern.apply(original_line)
313
+ lines[line_idx] = optimized_line
314
+ modified = True
315
+
316
+ indent = original_line[
317
+ : len(original_line) - len(original_line.lstrip())
318
+ ]
319
+ performance_gain = instance.get("performance_gain", "x")
320
+ impact_factor = int(instance.get("impact_factor", "1"))
321
+ comment = (
322
+ f"{indent}# Performance: {performance_gain} "
323
+ f"improvement, impact factor: {impact_factor}"
324
+ )
325
+ lines.insert(line_idx, comment)
326
+
327
+ return lines, modified
328
+
329
+ def _fix_string_operations_enhanced(
330
+ self,
331
+ lines: list[str],
332
+ issue: dict[str, t.Any],
333
+ ) -> tuple[list[str], bool]:
334
+ """Fix inefficient string operations.
335
+
336
+ Args:
337
+ lines: File lines
338
+ issue: Issue dict
339
+
340
+ Returns:
341
+ Tuple of modified lines and bool
342
+ """
343
+ modified = False
344
+
345
+ concat_patterns = issue.get("string_concat_patterns", [])
346
+ if concat_patterns:
347
+ lines, concat_modified = self._fix_string_concatenation(
348
+ lines, {"instances": concat_patterns}
349
+ )
350
+ modified = modified or concat_modified
351
+
352
+ inefficient_joins = issue.get("inefficient_joins", [])
353
+ for join_issue in inefficient_joins:
354
+ line_idx = join_issue["line_number"] - 1
355
+ if line_idx < len(lines):
356
+ original_line = lines[line_idx]
357
+ join_pattern = SAFE_PATTERNS["inefficient_string_join_pattern"]
358
+ if join_pattern.test(original_line):
359
+ lines[line_idx] = join_pattern.apply(original_line)
360
+ modified = True
361
+
362
+ repeated_formatting = issue.get("repeated_formatting", [])
363
+ for format_issue in repeated_formatting:
364
+ line_idx = format_issue["line_number"] - 1
365
+ if line_idx < len(lines):
366
+ original_line = lines[line_idx]
367
+ indent = original_line[
368
+ : len(original_line) - len(original_line.lstrip())
369
+ ]
370
+ comment = f"{indent}# Performance: Consider caching format string outside loop"
371
+ lines.insert(line_idx, comment)
372
+ modified = True
373
+
374
+ return lines, modified
375
+
376
+ @staticmethod
377
+ def _add_nested_loop_comments(
378
+ lines: list[str],
379
+ issue: dict[str, t.Any],
380
+ ) -> tuple[list[str], bool]:
381
+ """Add comments for nested loops.
382
+
383
+ Args:
384
+ lines: File lines
385
+ issue: Issue dict
386
+
387
+ Returns:
388
+ Tuple of modified lines and bool
389
+ """
390
+ modified = False
391
+
392
+ instances = issue.get("instances", [])
393
+ for instance in sorted(
394
+ instances, key=operator.itemgetter("line_number"), reverse=True
395
+ ):
396
+ line_idx = instance["line_number"] - 1
397
+ if line_idx < len(lines):
398
+ original_line = lines[line_idx]
399
+ indent = original_line[
400
+ : len(original_line) - len(original_line.lstrip())
401
+ ]
402
+
403
+ complexity = instance.get("complexity", "O(n²)")
404
+ priority = instance.get("priority", "medium")
405
+
406
+ comment_lines = [
407
+ f"{indent}# Performance: {complexity} nested loop detected - {priority} priority",
408
+ ]
409
+
410
+ if priority in ("high", "critical"):
411
+ if priority == "critical":
412
+ comment_lines.append(
413
+ f"{indent}# CRITICAL: Consider algorithmic redesign or"
414
+ f" data structure changes"
415
+ )
416
+ else:
417
+ comment_lines.append(
418
+ f"{indent}# Suggestion: Consider memoization, caching, "
419
+ f" or hash tables"
420
+ )
421
+
422
+ for i, comment in enumerate(comment_lines):
423
+ lines.insert(line_idx + i, comment)
424
+
425
+ modified = True
426
+
427
+ return lines, modified
428
+
429
+ @staticmethod
430
+ def _apply_list_comprehension_optimizations(
431
+ lines: list[str],
432
+ issue: dict[str, t.Any],
433
+ ) -> tuple[list[str], bool]:
434
+ """Apply list comprehension optimizations.
435
+
436
+ Args:
437
+ lines: File lines
438
+ issue: Issue dict
439
+
440
+ Returns:
441
+ Tuple of modified lines and bool
442
+ """
443
+ modified = False
444
+
445
+ instances = issue.get("instances", [])
446
+ for instance in sorted(
447
+ instances, key=operator.itemgetter("line_number"), reverse=True
448
+ ):
449
+ line_idx = instance["line_number"] - 1
450
+ if line_idx < len(lines):
451
+ original_line = lines[line_idx]
452
+ indent = original_line[
453
+ : len(original_line) - len(original_line.lstrip())
454
+ ]
455
+
456
+ comment = (
457
+ f"{indent}# Performance: Consider list[t.Any] comprehension for "
458
+ f"20-30% improvement"
459
+ )
460
+ lines.insert(line_idx, comment)
461
+ modified = True
462
+
463
+ return lines, modified
464
+
465
+ @staticmethod
466
+ def _add_builtin_caching_comments(
467
+ lines: list[str],
468
+ issue: dict[str, t.Any],
469
+ ) -> tuple[list[str], bool]:
470
+ """Add caching comments for builtins.
471
+
472
+ Args:
473
+ lines: File lines
474
+ issue: Issue dict
475
+
476
+ Returns:
477
+ Tuple of modified lines and bool
478
+ """
479
+ modified = False
480
+
481
+ instances = issue.get("instances", [])
482
+ for instance in sorted(
483
+ instances, key=operator.itemgetter("line_number"), reverse=True
484
+ ):
485
+ line_idx = instance["line_number"] - 1
486
+ if line_idx < len(lines):
487
+ original_line = lines[line_idx]
488
+ indent = original_line[
489
+ : len(original_line) - len(original_line.lstrip())
490
+ ]
491
+
492
+ func_name = instance.get("function", "builtin")
493
+ performance_gain = instance.get("performance_gain", "2-10x")
494
+
495
+ comment = (
496
+ f"{indent}# Performance: Cache {func_name}() result outside"
497
+ f" loop for {performance_gain} improvement"
498
+ )
499
+ lines.insert(line_idx, comment)
500
+ modified = True
501
+
502
+ return lines, modified
503
+
504
+ @staticmethod
505
+ def _fix_string_concatenation(
506
+ lines: list[str],
507
+ issue: dict[str, t.Any],
508
+ ) -> tuple[list[str], bool]:
509
+ """Fix string concatenation issues.
510
+
511
+ Args:
512
+ lines: File lines
513
+ issue: Issue dict
514
+
515
+ Returns:
516
+ Tuple of modified lines and bool
517
+ """
518
+ modified = False
519
+ return lines, modified
520
+
521
+ @staticmethod
522
+ def _fix_repeated_operations(
523
+ lines: list[str],
524
+ issue: dict[str, t.Any],
525
+ ) -> tuple[list[str], bool]:
526
+ """Fix repeated operations.
527
+
528
+ Args:
529
+ lines: File lines
530
+ issue: Issue dict
531
+
532
+ Returns:
533
+ Tuple of modified lines and bool
534
+ """
535
+ modified = False
536
+
537
+ for instance in issue["instances"]:
538
+ line_idx = instance["line_number"] - 1
539
+ if line_idx < len(lines):
540
+ original_line = lines[line_idx]
541
+ indent_level = len(original_line) - len(original_line.lstrip())
542
+ indent_str = " " * indent_level
543
+
544
+ comment = (
545
+ f"{indent_str}# Performance: Consider caching this expensive"
546
+ f" operation outside the loop"
547
+ )
548
+ lines.insert(line_idx, comment)
549
+ modified = True
550
+
551
+ return lines, modified
552
+
553
+ def generate_optimization_summary(self) -> str:
554
+ """Generate summary of optimizations applied.
555
+
556
+ Returns:
557
+ Summary string
558
+ """
559
+ total_optimizations = sum(self.optimization_stats.values())
560
+ if total_optimizations == 0:
561
+ return "No optimizations applied in this session"
562
+
563
+ summary_parts = [
564
+ f"{opt_type}: {count}"
565
+ for opt_type, count in self.optimization_stats.items()
566
+ if count > 0
567
+ ]
568
+
569
+ return (
570
+ f"Optimization Summary - {', '.join(summary_parts)} "
571
+ f"(Total: {total_optimizations})"
572
+ )
@@ -0,0 +1,22 @@
1
+ """Refactoring helpers for the RefactoringAgent.
2
+
3
+ This module provides specialized helpers for complexity analysis, code
4
+ transformation, and dead code detection while maintaining the AgentContext pattern.
5
+ """
6
+
7
+ from .code_transformer import CodeTransformer
8
+ from .complexity_analyzer import ComplexityAnalyzer, ComplexityCalculator
9
+ from .dead_code_detector import (
10
+ DeadCodeDetector,
11
+ EnhancedUsageAnalyzer,
12
+ UsageDataCollector,
13
+ )
14
+
15
+ __all__ = [
16
+ "ComplexityAnalyzer",
17
+ "ComplexityCalculator",
18
+ "CodeTransformer",
19
+ "DeadCodeDetector",
20
+ "UsageDataCollector",
21
+ "EnhancedUsageAnalyzer",
22
+ ]