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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +30 -1
  3. crackerjack/__main__.py +342 -1263
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +27 -5
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/{rust_tool_manager.py → lsp/_manager.py} +3 -3
  27. crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
  28. crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
  29. crackerjack/adapters/refactor/README.md +59 -0
  30. crackerjack/adapters/refactor/__init__.py +12 -0
  31. crackerjack/adapters/refactor/creosote.py +318 -0
  32. crackerjack/adapters/refactor/refurb.py +406 -0
  33. crackerjack/adapters/refactor/skylos.py +494 -0
  34. crackerjack/adapters/sast/README.md +132 -0
  35. crackerjack/adapters/sast/__init__.py +32 -0
  36. crackerjack/adapters/sast/_base.py +201 -0
  37. crackerjack/adapters/sast/bandit.py +423 -0
  38. crackerjack/adapters/sast/pyscn.py +405 -0
  39. crackerjack/adapters/sast/semgrep.py +241 -0
  40. crackerjack/adapters/security/README.md +111 -0
  41. crackerjack/adapters/security/__init__.py +17 -0
  42. crackerjack/adapters/security/gitleaks.py +339 -0
  43. crackerjack/adapters/type/README.md +52 -0
  44. crackerjack/adapters/type/__init__.py +12 -0
  45. crackerjack/adapters/type/pyrefly.py +402 -0
  46. crackerjack/adapters/type/ty.py +402 -0
  47. crackerjack/adapters/type/zuban.py +522 -0
  48. crackerjack/adapters/utility/README.md +51 -0
  49. crackerjack/adapters/utility/__init__.py +10 -0
  50. crackerjack/adapters/utility/checks.py +884 -0
  51. crackerjack/agents/README.md +264 -0
  52. crackerjack/agents/__init__.py +40 -12
  53. crackerjack/agents/base.py +1 -0
  54. crackerjack/agents/claude_code_bridge.py +641 -0
  55. crackerjack/agents/coordinator.py +49 -53
  56. crackerjack/agents/dry_agent.py +187 -3
  57. crackerjack/agents/enhanced_coordinator.py +279 -0
  58. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  59. crackerjack/agents/error_middleware.py +53 -0
  60. crackerjack/agents/formatting_agent.py +6 -8
  61. crackerjack/agents/helpers/__init__.py +9 -0
  62. crackerjack/agents/helpers/performance/__init__.py +22 -0
  63. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  64. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  65. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  66. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  67. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  68. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  69. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  70. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  71. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  72. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  73. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  74. crackerjack/agents/performance_agent.py +121 -1152
  75. crackerjack/agents/refactoring_agent.py +156 -655
  76. crackerjack/agents/semantic_agent.py +479 -0
  77. crackerjack/agents/semantic_helpers.py +356 -0
  78. crackerjack/agents/test_creation_agent.py +19 -1605
  79. crackerjack/api.py +5 -7
  80. crackerjack/cli/README.md +394 -0
  81. crackerjack/cli/__init__.py +1 -1
  82. crackerjack/cli/cache_handlers.py +23 -18
  83. crackerjack/cli/cache_handlers_enhanced.py +1 -4
  84. crackerjack/cli/facade.py +70 -8
  85. crackerjack/cli/formatting.py +13 -0
  86. crackerjack/cli/handlers/__init__.py +85 -0
  87. crackerjack/cli/handlers/advanced.py +103 -0
  88. crackerjack/cli/handlers/ai_features.py +62 -0
  89. crackerjack/cli/handlers/analytics.py +479 -0
  90. crackerjack/cli/handlers/changelog.py +271 -0
  91. crackerjack/cli/handlers/config_handlers.py +16 -0
  92. crackerjack/cli/handlers/coverage.py +84 -0
  93. crackerjack/cli/handlers/documentation.py +280 -0
  94. crackerjack/cli/handlers/main_handlers.py +497 -0
  95. crackerjack/cli/handlers/monitoring.py +371 -0
  96. crackerjack/cli/handlers.py +249 -49
  97. crackerjack/cli/interactive.py +8 -5
  98. crackerjack/cli/options.py +203 -110
  99. crackerjack/cli/semantic_handlers.py +292 -0
  100. crackerjack/cli/version.py +19 -0
  101. crackerjack/code_cleaner.py +60 -24
  102. crackerjack/config/README.md +472 -0
  103. crackerjack/config/__init__.py +256 -0
  104. crackerjack/config/global_lock_config.py +191 -54
  105. crackerjack/config/hooks.py +188 -16
  106. crackerjack/config/loader.py +239 -0
  107. crackerjack/config/settings.py +141 -0
  108. crackerjack/config/tool_commands.py +331 -0
  109. crackerjack/core/README.md +393 -0
  110. crackerjack/core/async_workflow_orchestrator.py +79 -53
  111. crackerjack/core/autofix_coordinator.py +22 -9
  112. crackerjack/core/container.py +10 -9
  113. crackerjack/core/enhanced_container.py +9 -9
  114. crackerjack/core/performance.py +1 -1
  115. crackerjack/core/performance_monitor.py +5 -3
  116. crackerjack/core/phase_coordinator.py +1018 -634
  117. crackerjack/core/proactive_workflow.py +3 -3
  118. crackerjack/core/retry.py +275 -0
  119. crackerjack/core/service_watchdog.py +167 -23
  120. crackerjack/core/session_coordinator.py +187 -382
  121. crackerjack/core/timeout_manager.py +161 -44
  122. crackerjack/core/workflow/__init__.py +21 -0
  123. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  124. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  125. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  126. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  127. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  128. crackerjack/core/workflow_orchestrator.py +1247 -953
  129. crackerjack/data/README.md +11 -0
  130. crackerjack/data/__init__.py +8 -0
  131. crackerjack/data/models.py +79 -0
  132. crackerjack/data/repository.py +210 -0
  133. crackerjack/decorators/README.md +180 -0
  134. crackerjack/decorators/__init__.py +35 -0
  135. crackerjack/decorators/error_handling.py +649 -0
  136. crackerjack/decorators/error_handling_decorators.py +334 -0
  137. crackerjack/decorators/helpers.py +58 -0
  138. crackerjack/decorators/patterns.py +281 -0
  139. crackerjack/decorators/utils.py +58 -0
  140. crackerjack/docs/README.md +11 -0
  141. crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
  142. crackerjack/documentation/README.md +11 -0
  143. crackerjack/documentation/ai_templates.py +1 -1
  144. crackerjack/documentation/dual_output_generator.py +11 -9
  145. crackerjack/documentation/reference_generator.py +104 -59
  146. crackerjack/dynamic_config.py +52 -61
  147. crackerjack/errors.py +1 -1
  148. crackerjack/events/README.md +11 -0
  149. crackerjack/events/__init__.py +16 -0
  150. crackerjack/events/telemetry.py +175 -0
  151. crackerjack/events/workflow_bus.py +346 -0
  152. crackerjack/exceptions/README.md +301 -0
  153. crackerjack/exceptions/__init__.py +5 -0
  154. crackerjack/exceptions/config.py +4 -0
  155. crackerjack/exceptions/tool_execution_error.py +245 -0
  156. crackerjack/executors/README.md +591 -0
  157. crackerjack/executors/__init__.py +2 -0
  158. crackerjack/executors/async_hook_executor.py +539 -77
  159. crackerjack/executors/cached_hook_executor.py +3 -3
  160. crackerjack/executors/hook_executor.py +967 -102
  161. crackerjack/executors/hook_lock_manager.py +31 -22
  162. crackerjack/executors/individual_hook_executor.py +66 -32
  163. crackerjack/executors/lsp_aware_hook_executor.py +136 -57
  164. crackerjack/executors/progress_hook_executor.py +282 -0
  165. crackerjack/executors/tool_proxy.py +23 -7
  166. crackerjack/hooks/README.md +485 -0
  167. crackerjack/hooks/lsp_hook.py +8 -9
  168. crackerjack/intelligence/README.md +557 -0
  169. crackerjack/interactive.py +37 -10
  170. crackerjack/managers/README.md +369 -0
  171. crackerjack/managers/async_hook_manager.py +41 -57
  172. crackerjack/managers/hook_manager.py +449 -79
  173. crackerjack/managers/publish_manager.py +81 -36
  174. crackerjack/managers/test_command_builder.py +290 -12
  175. crackerjack/managers/test_executor.py +93 -8
  176. crackerjack/managers/test_manager.py +1082 -75
  177. crackerjack/managers/test_progress.py +118 -26
  178. crackerjack/mcp/README.md +374 -0
  179. crackerjack/mcp/cache.py +25 -2
  180. crackerjack/mcp/client_runner.py +35 -18
  181. crackerjack/mcp/context.py +9 -9
  182. crackerjack/mcp/dashboard.py +24 -8
  183. crackerjack/mcp/enhanced_progress_monitor.py +34 -23
  184. crackerjack/mcp/file_monitor.py +27 -6
  185. crackerjack/mcp/progress_components.py +45 -34
  186. crackerjack/mcp/progress_monitor.py +6 -9
  187. crackerjack/mcp/rate_limiter.py +11 -7
  188. crackerjack/mcp/server.py +2 -0
  189. crackerjack/mcp/server_core.py +187 -55
  190. crackerjack/mcp/service_watchdog.py +12 -9
  191. crackerjack/mcp/task_manager.py +2 -2
  192. crackerjack/mcp/tools/README.md +27 -0
  193. crackerjack/mcp/tools/__init__.py +2 -0
  194. crackerjack/mcp/tools/core_tools.py +75 -52
  195. crackerjack/mcp/tools/execution_tools.py +87 -31
  196. crackerjack/mcp/tools/intelligence_tools.py +2 -2
  197. crackerjack/mcp/tools/proactive_tools.py +1 -1
  198. crackerjack/mcp/tools/semantic_tools.py +584 -0
  199. crackerjack/mcp/tools/utility_tools.py +180 -132
  200. crackerjack/mcp/tools/workflow_executor.py +87 -46
  201. crackerjack/mcp/websocket/README.md +31 -0
  202. crackerjack/mcp/websocket/app.py +11 -1
  203. crackerjack/mcp/websocket/event_bridge.py +188 -0
  204. crackerjack/mcp/websocket/jobs.py +27 -4
  205. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  206. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  207. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  208. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  209. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  210. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  211. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  212. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  213. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  214. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  215. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  216. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  217. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  218. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  219. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  220. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  221. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  222. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  223. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  224. crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
  225. crackerjack/mcp/websocket/server.py +1 -3
  226. crackerjack/mcp/websocket/websocket_handler.py +107 -6
  227. crackerjack/models/README.md +308 -0
  228. crackerjack/models/__init__.py +10 -1
  229. crackerjack/models/config.py +639 -22
  230. crackerjack/models/config_adapter.py +6 -6
  231. crackerjack/models/protocols.py +1167 -23
  232. crackerjack/models/pydantic_models.py +320 -0
  233. crackerjack/models/qa_config.py +145 -0
  234. crackerjack/models/qa_results.py +134 -0
  235. crackerjack/models/results.py +35 -0
  236. crackerjack/models/semantic_models.py +258 -0
  237. crackerjack/models/task.py +19 -3
  238. crackerjack/models/test_models.py +60 -0
  239. crackerjack/monitoring/README.md +11 -0
  240. crackerjack/monitoring/ai_agent_watchdog.py +5 -4
  241. crackerjack/monitoring/metrics_collector.py +4 -3
  242. crackerjack/monitoring/regression_prevention.py +4 -3
  243. crackerjack/monitoring/websocket_server.py +4 -241
  244. crackerjack/orchestration/README.md +340 -0
  245. crackerjack/orchestration/__init__.py +43 -0
  246. crackerjack/orchestration/advanced_orchestrator.py +20 -67
  247. crackerjack/orchestration/cache/README.md +312 -0
  248. crackerjack/orchestration/cache/__init__.py +37 -0
  249. crackerjack/orchestration/cache/memory_cache.py +338 -0
  250. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  251. crackerjack/orchestration/config.py +297 -0
  252. crackerjack/orchestration/coverage_improvement.py +13 -6
  253. crackerjack/orchestration/execution_strategies.py +6 -6
  254. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  255. crackerjack/orchestration/strategies/README.md +401 -0
  256. crackerjack/orchestration/strategies/__init__.py +39 -0
  257. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  258. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  259. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  260. crackerjack/orchestration/test_progress_streamer.py +1 -1
  261. crackerjack/plugins/README.md +11 -0
  262. crackerjack/plugins/hooks.py +3 -2
  263. crackerjack/plugins/loader.py +3 -3
  264. crackerjack/plugins/managers.py +1 -1
  265. crackerjack/py313.py +191 -0
  266. crackerjack/security/README.md +11 -0
  267. crackerjack/services/README.md +374 -0
  268. crackerjack/services/__init__.py +8 -21
  269. crackerjack/services/ai/README.md +295 -0
  270. crackerjack/services/ai/__init__.py +7 -0
  271. crackerjack/services/ai/advanced_optimizer.py +878 -0
  272. crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
  273. crackerjack/services/ai/embeddings.py +444 -0
  274. crackerjack/services/ai/intelligent_commit.py +328 -0
  275. crackerjack/services/ai/predictive_analytics.py +510 -0
  276. crackerjack/services/api_extractor.py +5 -3
  277. crackerjack/services/bounded_status_operations.py +45 -5
  278. crackerjack/services/cache.py +249 -318
  279. crackerjack/services/changelog_automation.py +7 -3
  280. crackerjack/services/command_execution_service.py +305 -0
  281. crackerjack/services/config_integrity.py +83 -39
  282. crackerjack/services/config_merge.py +9 -6
  283. crackerjack/services/config_service.py +198 -0
  284. crackerjack/services/config_template.py +13 -26
  285. crackerjack/services/coverage_badge_service.py +6 -4
  286. crackerjack/services/coverage_ratchet.py +53 -27
  287. crackerjack/services/debug.py +18 -7
  288. crackerjack/services/dependency_analyzer.py +4 -4
  289. crackerjack/services/dependency_monitor.py +13 -13
  290. crackerjack/services/documentation_generator.py +4 -2
  291. crackerjack/services/documentation_service.py +62 -33
  292. crackerjack/services/enhanced_filesystem.py +81 -27
  293. crackerjack/services/enterprise_optimizer.py +1 -1
  294. crackerjack/services/error_pattern_analyzer.py +10 -10
  295. crackerjack/services/file_filter.py +221 -0
  296. crackerjack/services/file_hasher.py +5 -7
  297. crackerjack/services/file_io_service.py +361 -0
  298. crackerjack/services/file_modifier.py +615 -0
  299. crackerjack/services/filesystem.py +80 -109
  300. crackerjack/services/git.py +99 -5
  301. crackerjack/services/health_metrics.py +4 -6
  302. crackerjack/services/heatmap_generator.py +12 -3
  303. crackerjack/services/incremental_executor.py +380 -0
  304. crackerjack/services/initialization.py +101 -49
  305. crackerjack/services/log_manager.py +2 -2
  306. crackerjack/services/logging.py +120 -68
  307. crackerjack/services/lsp_client.py +12 -12
  308. crackerjack/services/memory_optimizer.py +27 -22
  309. crackerjack/services/monitoring/README.md +30 -0
  310. crackerjack/services/monitoring/__init__.py +9 -0
  311. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  312. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  313. crackerjack/services/monitoring/health_metrics.py +716 -0
  314. crackerjack/services/monitoring/metrics.py +587 -0
  315. crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
  316. crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
  317. crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
  318. crackerjack/services/parallel_executor.py +166 -55
  319. crackerjack/services/patterns/__init__.py +142 -0
  320. crackerjack/services/patterns/agents.py +107 -0
  321. crackerjack/services/patterns/code/__init__.py +15 -0
  322. crackerjack/services/patterns/code/detection.py +118 -0
  323. crackerjack/services/patterns/code/imports.py +107 -0
  324. crackerjack/services/patterns/code/paths.py +159 -0
  325. crackerjack/services/patterns/code/performance.py +119 -0
  326. crackerjack/services/patterns/code/replacement.py +36 -0
  327. crackerjack/services/patterns/core.py +212 -0
  328. crackerjack/services/patterns/documentation/__init__.py +14 -0
  329. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  330. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  331. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  332. crackerjack/services/patterns/formatting.py +226 -0
  333. crackerjack/services/patterns/operations.py +339 -0
  334. crackerjack/services/patterns/security/__init__.py +23 -0
  335. crackerjack/services/patterns/security/code_injection.py +122 -0
  336. crackerjack/services/patterns/security/credentials.py +190 -0
  337. crackerjack/services/patterns/security/path_traversal.py +221 -0
  338. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  339. crackerjack/services/patterns/templates.py +62 -0
  340. crackerjack/services/patterns/testing/__init__.py +18 -0
  341. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  342. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  343. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  344. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  345. crackerjack/services/patterns/tool_output/other.py +97 -0
  346. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  347. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  348. crackerjack/services/patterns/url_sanitization.py +114 -0
  349. crackerjack/services/patterns/utilities.py +42 -0
  350. crackerjack/services/patterns/utils.py +339 -0
  351. crackerjack/services/patterns/validation.py +46 -0
  352. crackerjack/services/patterns/versioning.py +62 -0
  353. crackerjack/services/predictive_analytics.py +21 -8
  354. crackerjack/services/profiler.py +280 -0
  355. crackerjack/services/quality/README.md +415 -0
  356. crackerjack/services/quality/__init__.py +11 -0
  357. crackerjack/services/quality/anomaly_detector.py +392 -0
  358. crackerjack/services/quality/pattern_cache.py +333 -0
  359. crackerjack/services/quality/pattern_detector.py +479 -0
  360. crackerjack/services/quality/qa_orchestrator.py +491 -0
  361. crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
  362. crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
  363. crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
  364. crackerjack/services/regex_patterns.py +58 -2987
  365. crackerjack/services/regex_utils.py +55 -29
  366. crackerjack/services/secure_status_formatter.py +42 -15
  367. crackerjack/services/secure_subprocess.py +35 -2
  368. crackerjack/services/security.py +16 -8
  369. crackerjack/services/server_manager.py +40 -51
  370. crackerjack/services/smart_scheduling.py +46 -6
  371. crackerjack/services/status_authentication.py +3 -3
  372. crackerjack/services/thread_safe_status_collector.py +1 -0
  373. crackerjack/services/tool_filter.py +368 -0
  374. crackerjack/services/tool_version_service.py +9 -5
  375. crackerjack/services/unified_config.py +43 -351
  376. crackerjack/services/vector_store.py +689 -0
  377. crackerjack/services/version_analyzer.py +6 -4
  378. crackerjack/services/version_checker.py +14 -8
  379. crackerjack/services/zuban_lsp_service.py +5 -4
  380. crackerjack/slash_commands/README.md +11 -0
  381. crackerjack/slash_commands/init.md +2 -12
  382. crackerjack/slash_commands/run.md +84 -50
  383. crackerjack/tools/README.md +11 -0
  384. crackerjack/tools/__init__.py +30 -0
  385. crackerjack/tools/_git_utils.py +105 -0
  386. crackerjack/tools/check_added_large_files.py +139 -0
  387. crackerjack/tools/check_ast.py +105 -0
  388. crackerjack/tools/check_json.py +103 -0
  389. crackerjack/tools/check_jsonschema.py +297 -0
  390. crackerjack/tools/check_toml.py +103 -0
  391. crackerjack/tools/check_yaml.py +110 -0
  392. crackerjack/tools/codespell_wrapper.py +72 -0
  393. crackerjack/tools/end_of_file_fixer.py +202 -0
  394. crackerjack/tools/format_json.py +128 -0
  395. crackerjack/tools/mdformat_wrapper.py +114 -0
  396. crackerjack/tools/trailing_whitespace.py +198 -0
  397. crackerjack/tools/validate_regex_patterns.py +7 -3
  398. crackerjack/ui/README.md +11 -0
  399. crackerjack/ui/dashboard_renderer.py +28 -0
  400. crackerjack/ui/templates/README.md +11 -0
  401. crackerjack/utils/console_utils.py +13 -0
  402. crackerjack/utils/dependency_guard.py +230 -0
  403. crackerjack/utils/retry_utils.py +275 -0
  404. crackerjack/workflows/README.md +590 -0
  405. crackerjack/workflows/__init__.py +46 -0
  406. crackerjack/workflows/actions.py +811 -0
  407. crackerjack/workflows/auto_fix.py +444 -0
  408. crackerjack/workflows/container_builder.py +499 -0
  409. crackerjack/workflows/definitions.py +443 -0
  410. crackerjack/workflows/engine.py +177 -0
  411. crackerjack/workflows/event_bridge.py +242 -0
  412. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
  413. crackerjack-0.45.2.dist-info/RECORD +478 -0
  414. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  415. crackerjack/managers/test_manager_backup.py +0 -1075
  416. crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
  417. crackerjack/mixins/__init__.py +0 -3
  418. crackerjack/mixins/error_handling.py +0 -145
  419. crackerjack/services/config.py +0 -358
  420. crackerjack/ui/server_panels.py +0 -125
  421. crackerjack-0.37.9.dist-info/RECORD +0 -231
  422. /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
  423. /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
  424. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
  425. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,14 +1,10 @@
1
1
  import asyncio
2
2
  import hashlib
3
- import logging
4
3
  import typing as t
5
4
  from collections import defaultdict
6
5
  from itertools import starmap
7
6
 
8
- from crackerjack.services.cache import CrackerjackCache
9
- from crackerjack.services.debug import get_ai_agent_debugger
10
-
11
- from .base import (
7
+ from crackerjack.agents.base import (
12
8
  AgentContext,
13
9
  FixResult,
14
10
  Issue,
@@ -16,24 +12,28 @@ from .base import (
16
12
  SubAgent,
17
13
  agent_registry,
18
14
  )
19
- from .tracker import get_agent_tracker
15
+ from crackerjack.agents.error_middleware import agent_error_boundary
16
+ from crackerjack.agents.tracker import get_agent_tracker
17
+ from crackerjack.services.cache import CrackerjackCache
18
+ from crackerjack.services.debug import get_ai_agent_debugger
19
+ from crackerjack.services.logging import get_logger
20
20
 
21
- # Static mapping for O(1) agent lookup by issue type
22
- ISSUE_TYPE_TO_AGENTS = {
21
+ ISSUE_TYPE_TO_AGENTS: dict[IssueType, list[str]] = {
22
+ IssueType.FORMATTING: ["FormattingAgent"],
23
+ IssueType.TYPE_ERROR: ["TestCreationAgent", "RefactoringAgent"],
24
+ IssueType.SECURITY: ["SecurityAgent"],
25
+ IssueType.TEST_FAILURE: ["TestSpecialistAgent", "TestCreationAgent"],
26
+ IssueType.IMPORT_ERROR: ["ImportOptimizationAgent"],
23
27
  IssueType.COMPLEXITY: ["RefactoringAgent"],
24
28
  IssueType.DEAD_CODE: ["RefactoringAgent", "ImportOptimizationAgent"],
25
- IssueType.SECURITY: ["SecurityAgent"],
26
- IssueType.PERFORMANCE: ["PerformanceAgent", "RefactoringAgent"],
27
- IssueType.TEST_FAILURE: ["TestCreationAgent", "TestSpecialistAgent"],
28
- IssueType.TYPE_ERROR: ["TestCreationAgent", "RefactoringAgent"],
29
- IssueType.FORMATTING: ["FormattingAgent", "ImportOptimizationAgent"],
29
+ IssueType.DEPENDENCY: ["ImportOptimizationAgent"],
30
+ IssueType.DRY_VIOLATION: ["DRYAgent"],
31
+ IssueType.PERFORMANCE: ["PerformanceAgent"],
30
32
  IssueType.DOCUMENTATION: ["DocumentationAgent"],
31
- IssueType.DRY_VIOLATION: ["DRYAgent", "RefactoringAgent"],
32
- IssueType.IMPORT_ERROR: ["ImportOptimizationAgent", "RefactoringAgent"],
33
- IssueType.COVERAGE_IMPROVEMENT: ["TestCreationAgent", "TestSpecialistAgent"],
34
- IssueType.TEST_ORGANIZATION: ["TestSpecialistAgent", "TestCreationAgent"],
35
- IssueType.DEPENDENCY: ["RefactoringAgent"],
33
+ IssueType.TEST_ORGANIZATION: ["TestSpecialistAgent"],
34
+ IssueType.COVERAGE_IMPROVEMENT: ["TestCreationAgent"],
36
35
  IssueType.REGEX_VALIDATION: ["SecurityAgent", "RefactoringAgent"],
36
+ IssueType.SEMANTIC_CONTEXT: ["SemanticAgent", "ArchitectAgent"],
37
37
  }
38
38
 
39
39
 
@@ -43,7 +43,7 @@ class AgentCoordinator:
43
43
  ) -> None:
44
44
  self.context = context
45
45
  self.agents: list[SubAgent] = []
46
- self.logger = logging.getLogger(__name__)
46
+ self.logger = get_logger(__name__)
47
47
  self._issue_cache: dict[str, FixResult] = {}
48
48
  self._collaboration_threshold = 0.7
49
49
  self.tracker = get_agent_tracker()
@@ -292,39 +292,27 @@ class AgentCoordinator:
292
292
  metadata={"issue_type": issue.type.value, "severity": issue.severity.value},
293
293
  )
294
294
 
295
- try:
296
- # Use cached analysis for better performance
297
- result = await self._cached_analyze_and_fix(agent, issue)
298
- if result.success:
299
- self.logger.info(f"{agent.name} successfully fixed issue")
300
- else:
301
- self.logger.warning(f"{agent.name} failed to fix issue")
302
-
303
- self.tracker.track_agent_complete(agent.name, result)
304
-
305
- self.debugger.log_agent_activity(
306
- agent_name=agent.name,
307
- activity="processing_completed",
308
- issue_id=issue.id,
309
- confidence=result.confidence,
310
- result={
311
- "success": result.success,
312
- "remaining_issues": len(result.remaining_issues),
313
- },
314
- metadata={"fix_applied": result.success},
315
- )
295
+ result = await self._execute_agent(agent, issue)
296
+ if result.success:
297
+ self.logger.info(f"{agent.name} successfully fixed issue")
298
+ else:
299
+ self.logger.warning(f"{agent.name} failed to fix issue")
316
300
 
317
- return result
318
- except Exception as e:
319
- self.logger.exception(f"{agent.name} threw exception: {e}")
320
- error_result = FixResult(
321
- success=False,
322
- confidence=0.0,
323
- remaining_issues=[f"{agent.name} failed with exception: {e}"],
324
- )
301
+ self.tracker.track_agent_complete(agent.name, result)
302
+
303
+ self.debugger.log_agent_activity(
304
+ agent_name=agent.name,
305
+ activity="processing_completed",
306
+ issue_id=issue.id,
307
+ confidence=result.confidence,
308
+ result={
309
+ "success": result.success,
310
+ "remaining_issues": len(result.remaining_issues),
311
+ },
312
+ metadata={"fix_applied": result.success},
313
+ )
325
314
 
326
- self.tracker.track_agent_complete(agent.name, error_result)
327
- return error_result
315
+ return result
328
316
 
329
317
  def _group_issues_by_type(
330
318
  self,
@@ -347,6 +335,11 @@ class AgentCoordinator:
347
335
  issue_hash = self._create_issue_hash(issue)
348
336
  return f"{agent_name}:{issue_hash}"
349
337
 
338
+ @agent_error_boundary
339
+ async def _execute_agent(self, agent: SubAgent, issue: Issue) -> FixResult:
340
+ """Execute agent analysis with centralized error handling."""
341
+ return await self._cached_analyze_and_fix(agent, issue)
342
+
350
343
  async def _cached_analyze_and_fix(self, agent: SubAgent, issue: Issue) -> FixResult:
351
344
  """Analyze and fix issue with intelligent caching."""
352
345
  cache_key = self._get_cache_key(agent.name, issue)
@@ -450,12 +443,15 @@ class AgentCoordinator:
450
443
 
451
444
  try:
452
445
  plan = await architect.plan_before_action(primary_issue)
453
- plan = self._enrich_architectural_plan(plan, all_issues)
446
+ # Ensure plan is properly typed as dict[str, Any]
447
+ if not isinstance(plan, dict):
448
+ plan = {"strategy": "default", "confidence": 0.5}
449
+ enriched_plan = self._enrich_architectural_plan(plan, all_issues)
454
450
 
455
451
  self.logger.info(
456
- f"Created architectural plan: {plan.get('strategy', 'unknown')}"
452
+ f"Created architectural plan: {enriched_plan.get('strategy', 'unknown')}"
457
453
  )
458
- return plan # type: ignore[no-any-return]
454
+ return enriched_plan
459
455
 
460
456
  except Exception as e:
461
457
  self.logger.exception(f"Failed to create architectural plan: {e}")
@@ -3,15 +3,32 @@ from pathlib import Path
3
3
 
4
4
  from ..services.regex_patterns import SAFE_PATTERNS
5
5
  from .base import (
6
+ AgentContext,
6
7
  FixResult,
7
8
  Issue,
8
9
  IssueType,
9
10
  SubAgent,
10
11
  agent_registry,
11
12
  )
13
+ from .semantic_helpers import (
14
+ SemanticInsight,
15
+ create_semantic_enhancer,
16
+ get_session_enhanced_recommendations,
17
+ )
12
18
 
13
19
 
14
20
  class DRYAgent(SubAgent):
21
+ """Agent for detecting and fixing DRY (Don't Repeat Yourself) violations.
22
+
23
+ Enhanced with semantic context to detect conceptual duplicates beyond
24
+ just syntactic pattern matching.
25
+ """
26
+
27
+ def __init__(self, context: AgentContext) -> None:
28
+ super().__init__(context)
29
+ self.semantic_enhancer = create_semantic_enhancer(context.project_path)
30
+ self.semantic_insights: dict[str, SemanticInsight] = {}
31
+
15
32
  def get_supported_types(self) -> set[IssueType]:
16
33
  return {IssueType.DRY_VIOLATION}
17
34
 
@@ -66,8 +83,13 @@ class DRYAgent(SubAgent):
66
83
  remaining_issues=[f"Could not read file: {file_path}"],
67
84
  )
68
85
 
86
+ # Detect traditional pattern-based violations
69
87
  violations = self._detect_dry_violations(content, file_path)
70
88
 
89
+ # Enhance with semantic duplicate detection
90
+ semantic_violations = await self._detect_semantic_violations(content, file_path)
91
+ violations.extend(semantic_violations)
92
+
71
93
  if not violations:
72
94
  return FixResult(
73
95
  success=True,
@@ -75,9 +97,9 @@ class DRYAgent(SubAgent):
75
97
  recommendations=["No DRY violations detected"],
76
98
  )
77
99
 
78
- return self._apply_and_save_dry_fixes(file_path, content, violations)
100
+ return await self._apply_and_save_dry_fixes(file_path, content, violations)
79
101
 
80
- def _apply_and_save_dry_fixes(
102
+ async def _apply_and_save_dry_fixes(
81
103
  self,
82
104
  file_path: Path,
83
105
  content: str,
@@ -96,6 +118,28 @@ class DRYAgent(SubAgent):
96
118
  remaining_issues=[f"Failed to write fixed file: {file_path}"],
97
119
  )
98
120
 
121
+ # Enhance recommendations with semantic insights and session continuity
122
+ recommendations = ["Verify functionality after DRY fixes"]
123
+ if hasattr(self, "current_semantic_insight") and self.current_semantic_insight:
124
+ recommendations = self.semantic_enhancer.enhance_recommendations(
125
+ recommendations, self.current_semantic_insight
126
+ )
127
+ # Log semantic context for debugging
128
+ summary = self.semantic_enhancer.get_semantic_context_summary(
129
+ self.current_semantic_insight
130
+ )
131
+ self.log(f"Semantic context: {summary}")
132
+
133
+ # Store insight for session continuity
134
+ await self.semantic_enhancer.store_insight_to_session(
135
+ self.current_semantic_insight, "DRYAgent"
136
+ )
137
+
138
+ # Enhance with session-stored insights
139
+ recommendations = await get_session_enhanced_recommendations(
140
+ recommendations, "DRYAgent", self.context.project_path
141
+ )
142
+
99
143
  return FixResult(
100
144
  success=True,
101
145
  confidence=0.8,
@@ -104,7 +148,7 @@ class DRYAgent(SubAgent):
104
148
  "Consolidated repetitive patterns",
105
149
  ],
106
150
  files_modified=[str(file_path)],
107
- recommendations=["Verify functionality after DRY fixes"],
151
+ recommendations=recommendations,
108
152
  )
109
153
 
110
154
  def _create_no_fixes_result(self) -> FixResult:
@@ -397,5 +441,145 @@ def _ensure_path(path: str | Path) -> Path:
397
441
 
398
442
  return modified
399
443
 
444
+ async def _detect_semantic_violations(
445
+ self, content: str, file_path: Path
446
+ ) -> list[dict[str, t.Any]]:
447
+ """Detect semantic code duplicates using vector similarity."""
448
+ violations = []
449
+
450
+ try:
451
+ # Extract key code functions for semantic analysis
452
+ code_elements = self._extract_code_functions(content)
453
+
454
+ for element in code_elements:
455
+ if element["type"] == "function" and len(element["body"]) > 50:
456
+ # Search for semantically similar functions
457
+ insight = await self.semantic_enhancer.find_duplicate_patterns(
458
+ element["signature"]
459
+ + "\n"
460
+ + element["body"][:200], # Include body sample
461
+ current_file=file_path,
462
+ )
463
+
464
+ if insight.high_confidence_matches > 0:
465
+ violations.append(
466
+ {
467
+ "type": "semantic_duplicate",
468
+ "element": element,
469
+ "similar_patterns": insight.related_patterns[
470
+ :3
471
+ ], # Top 3 matches
472
+ "confidence_score": insight.high_confidence_matches
473
+ / insight.total_matches
474
+ if insight.total_matches > 0
475
+ else 0,
476
+ "suggestion": "Consider extracting common functionality to shared utility",
477
+ }
478
+ )
479
+
480
+ # Store insight for recommendation enhancement
481
+ self.current_semantic_insight = insight
482
+
483
+ except Exception as e:
484
+ self.log(f"Warning: Semantic violation detection failed: {e}")
485
+
486
+ return violations
487
+
488
+ def _extract_code_functions(self, content: str) -> list[dict[str, t.Any]]:
489
+ """Extract functions from code for semantic analysis."""
490
+ functions: list[dict[str, t.Any]] = []
491
+ lines = content.split("\n")
492
+ current_function = None
493
+
494
+ for i, line in enumerate(lines):
495
+ stripped = line.strip()
496
+
497
+ if self._should_skip_line(stripped, current_function, line):
498
+ continue
499
+
500
+ indent = len(line) - len(line.lstrip())
501
+
502
+ if self._is_function_definition(stripped):
503
+ current_function = self._handle_function_definition(
504
+ functions, current_function, stripped, indent, i
505
+ )
506
+ elif current_function:
507
+ current_function = self._handle_function_body_line(
508
+ functions, current_function, line, stripped, indent, i
509
+ )
510
+
511
+ # Add last function if exists
512
+ if current_function:
513
+ current_function["end_line"] = len(lines)
514
+ functions.append(current_function)
515
+
516
+ return functions
517
+
518
+ def _should_skip_line(
519
+ self, stripped: str, current_function: dict[str, t.Any] | None, line: str
520
+ ) -> bool:
521
+ """Check if line should be skipped during function extraction."""
522
+ if not stripped or stripped.startswith("#"):
523
+ if current_function:
524
+ current_function["body"] += line + "\n"
525
+ return True
526
+ return False
527
+
528
+ def _is_function_definition(self, stripped: str) -> bool:
529
+ """Check if line is a function definition."""
530
+ return stripped.startswith("def ") and "(" in stripped
531
+
532
+ def _handle_function_definition(
533
+ self,
534
+ functions: list[dict[str, t.Any]],
535
+ current_function: dict[str, t.Any] | None,
536
+ stripped: str,
537
+ indent: int,
538
+ line_index: int,
539
+ ) -> dict[str, t.Any]:
540
+ """Handle a new function definition."""
541
+ # Save previous function if exists
542
+ if current_function:
543
+ functions.append(current_function)
544
+
545
+ func_name = stripped.split("(")[0].replace("def ", "").strip()
546
+ return {
547
+ "type": "function",
548
+ "name": func_name,
549
+ "signature": stripped,
550
+ "start_line": line_index + 1,
551
+ "body": "",
552
+ "indent_level": indent,
553
+ }
554
+
555
+ def _handle_function_body_line(
556
+ self,
557
+ functions: list[dict[str, t.Any]],
558
+ current_function: dict[str, t.Any],
559
+ line: str,
560
+ stripped: str,
561
+ indent: int,
562
+ line_index: int,
563
+ ) -> dict[str, t.Any] | None:
564
+ """Handle a line within a function body."""
565
+ # Check if we're still inside the function
566
+ if self._is_line_inside_function(current_function, indent, stripped):
567
+ current_function["body"] += line + "\n"
568
+ return current_function
569
+ else:
570
+ # Function ended
571
+ current_function["end_line"] = line_index
572
+ functions.append(current_function)
573
+ return None
574
+
575
+ def _is_line_inside_function(
576
+ self, current_function: dict[str, t.Any], indent: int, stripped: str
577
+ ) -> bool:
578
+ """Check if line is still inside the current function."""
579
+ return indent > current_function["indent_level"] or (
580
+ indent == current_function["indent_level"]
581
+ and stripped.startswith(('"', "'", "@"))
582
+ )
583
+
400
584
 
401
585
  agent_registry.register(DRYAgent)
@@ -0,0 +1,279 @@
1
+ """
2
+ Enhanced AgentCoordinator with Claude Code external agent integration.
3
+
4
+ This module extends the base AgentCoordinator to seamlessly integrate with
5
+ Claude Code's external agents while maintaining full compatibility with
6
+ the existing crackerjack agent system.
7
+ """
8
+
9
+ import typing as t
10
+
11
+ from .base import AgentContext, FixResult, Issue
12
+ from .claude_code_bridge import ClaudeCodeBridge
13
+ from .coordinator import AgentCoordinator
14
+
15
+
16
+ class EnhancedAgentCoordinator(AgentCoordinator):
17
+ """
18
+ AgentCoordinator enhanced with Claude Code external agent integration.
19
+
20
+ This coordinator maintains all the functionality of the base AgentCoordinator
21
+ while adding intelligent consultation with external Claude Code agents
22
+ when handling complex issues.
23
+ """
24
+
25
+ def __init__(
26
+ self,
27
+ context: AgentContext,
28
+ cache: t.Any = None,
29
+ enable_external_agents: bool = True,
30
+ ) -> None:
31
+ super().__init__(context, cache)
32
+ self.claude_bridge = ClaudeCodeBridge(context)
33
+ self.external_agents_enabled = enable_external_agents
34
+ self._external_consultation_stats: dict[str, int] = {
35
+ "consultations_requested": 0,
36
+ "consultations_successful": 0,
37
+ "improvements_achieved": 0,
38
+ }
39
+
40
+ self.logger.info(
41
+ f"Enhanced coordinator initialized with external agents: {enable_external_agents}"
42
+ )
43
+
44
+ def enable_external_agents(self, enabled: bool = True) -> None:
45
+ """Enable or disable external Claude Code agent consultation."""
46
+ self.external_agents_enabled = enabled
47
+ self.logger.info(f"External agents {'enabled' if enabled else 'disabled'}")
48
+
49
+ def get_external_consultation_stats(self) -> dict[str, int]:
50
+ """Get statistics about external agent consultations."""
51
+ return self._external_consultation_stats.copy()
52
+
53
+ async def handle_issues_proactively(self, issues: list[Issue]) -> FixResult:
54
+ """
55
+ Enhanced proactive handling with external agent consultation.
56
+
57
+ This method extends the base proactive handling to:
58
+ 1. Identify issues that would benefit from external consultation
59
+ 2. Pre-consult with relevant Claude Code agents for strategic guidance
60
+ 3. Apply the combined internal/external strategy
61
+ """
62
+ if not self.external_agents_enabled:
63
+ return await super().handle_issues_proactively(issues)
64
+
65
+ if not self.agents:
66
+ self.initialize_agents()
67
+
68
+ if not issues:
69
+ return FixResult(success=True, confidence=1.0)
70
+
71
+ self.logger.info(f"Enhanced proactive handling of {len(issues)} issues")
72
+
73
+ # Pre-analyze issues for external consultation opportunities
74
+ strategic_consultations = await self._pre_consult_for_strategy(issues)
75
+
76
+ # Create enhanced architectural plan incorporating external guidance
77
+ architectural_plan = await self._create_enhanced_architectural_plan(
78
+ issues, strategic_consultations
79
+ )
80
+
81
+ # Apply fixes with enhanced strategy
82
+ overall_result = await self._apply_enhanced_fixes_with_plan(
83
+ issues, architectural_plan, strategic_consultations
84
+ )
85
+
86
+ # Post-process with external validation if needed
87
+ validated_result = await self._validate_with_external_agents(
88
+ overall_result, architectural_plan
89
+ )
90
+
91
+ self._update_consultation_stats(strategic_consultations, validated_result)
92
+
93
+ return validated_result
94
+
95
+ async def _pre_consult_for_strategy(self, issues: list[Issue]) -> dict[str, t.Any]:
96
+ """Pre-consult with external agents for strategic guidance."""
97
+ strategic_consultations: dict[str, t.Any] = {
98
+ "crackerjack_architect_guidance": None,
99
+ "specialist_recommendations": {},
100
+ "coordination_strategy": "internal_first",
101
+ }
102
+
103
+ # Identify complex issues that need architectural guidance
104
+ complex_issues = [
105
+ issue
106
+ for issue in issues
107
+ if self.claude_bridge.should_consult_external_agent(issue, 0.0)
108
+ ]
109
+
110
+ if not complex_issues:
111
+ return strategic_consultations
112
+
113
+ # Consult crackerjack-architect for overall strategy if available
114
+ if self.claude_bridge.verify_agent_availability("crackerjack-architect"):
115
+ self._external_consultation_stats["consultations_requested"] += 1
116
+
117
+ # Use the first complex issue as representative for strategic planning
118
+ primary_issue = complex_issues[0]
119
+ architect_consultation = await self.claude_bridge.consult_external_agent(
120
+ primary_issue,
121
+ "crackerjack-architect",
122
+ {"context": "strategic_planning"},
123
+ )
124
+
125
+ if architect_consultation.get("status") == "success":
126
+ strategic_consultations["crackerjack_architect_guidance"] = (
127
+ architect_consultation
128
+ )
129
+ strategic_consultations["coordination_strategy"] = "architect_guided"
130
+ self._external_consultation_stats["consultations_successful"] += 1
131
+
132
+ return strategic_consultations
133
+
134
+ async def _create_enhanced_architectural_plan(
135
+ self, issues: list[Issue], strategic_consultations: dict[str, t.Any]
136
+ ) -> dict[str, t.Any]:
137
+ """Create architectural plan enhanced with external agent guidance."""
138
+ # Start with the base architectural plan
139
+ base_plan = await self._create_architectural_plan(issues)
140
+
141
+ # Enhance with external guidance if available
142
+ architect_guidance = strategic_consultations.get(
143
+ "crackerjack_architect_guidance"
144
+ )
145
+ if architect_guidance and architect_guidance.get("status") == "success":
146
+ # Integrate external architectural guidance
147
+ base_plan["external_guidance"] = architect_guidance
148
+ base_plan["enhanced_patterns"] = architect_guidance.get("patterns", [])
149
+ base_plan["external_validation"] = architect_guidance.get(
150
+ "validation_steps", []
151
+ )
152
+
153
+ # Update strategy based on external guidance
154
+ if "strategy" in architect_guidance:
155
+ base_plan["strategy"] = "external_specialist_guided"
156
+
157
+ return base_plan
158
+
159
+ async def _apply_enhanced_fixes_with_plan(
160
+ self,
161
+ issues: list[Issue],
162
+ plan: dict[str, t.Any],
163
+ strategic_consultations: dict[str, t.Any],
164
+ ) -> FixResult:
165
+ """Apply fixes using enhanced strategy with external guidance."""
166
+ # Use the base implementation but with enhanced plan
167
+ return await self._apply_fixes_with_plan(issues, plan)
168
+
169
+ async def _validate_with_external_agents(
170
+ self, result: FixResult, plan: dict[str, t.Any]
171
+ ) -> FixResult:
172
+ """Post-validate results with external agents if configured."""
173
+ external_validation = plan.get("external_validation", [])
174
+
175
+ if not external_validation or not self.external_agents_enabled:
176
+ return result
177
+
178
+ # Add validation recommendations from external agents
179
+ validation_recommendations = [
180
+ f"External validation: {validation_step}"
181
+ for validation_step in external_validation
182
+ ]
183
+
184
+ enhanced_result = FixResult(
185
+ success=result.success,
186
+ confidence=min(
187
+ result.confidence + 0.1, 1.0
188
+ ), # Slight confidence boost for external validation
189
+ fixes_applied=result.fixes_applied.copy(),
190
+ remaining_issues=result.remaining_issues.copy(),
191
+ recommendations=result.recommendations + validation_recommendations,
192
+ files_modified=result.files_modified.copy(),
193
+ )
194
+
195
+ return enhanced_result
196
+
197
+ def _update_consultation_stats(
198
+ self, strategic_consultations: dict[str, t.Any], result: FixResult
199
+ ) -> None:
200
+ """Update statistics about external consultations."""
201
+ if strategic_consultations.get("crackerjack_architect_guidance"):
202
+ if result.success and result.confidence > 0.8:
203
+ self._external_consultation_stats["improvements_achieved"] += 1
204
+
205
+ async def _handle_with_single_agent_enhanced(
206
+ self, agent: t.Any, issue: Issue
207
+ ) -> FixResult:
208
+ """Enhanced single agent handling with external consultation."""
209
+ # Check if this agent should consult external experts
210
+ internal_result = await super()._handle_with_single_agent(agent, issue)
211
+
212
+ # If the agent is proactive and has external consultation capability, enhance it
213
+ if (
214
+ hasattr(agent, "claude_bridge")
215
+ and self.external_agents_enabled
216
+ and not internal_result.success
217
+ ):
218
+ # Try external consultation for failed fixes
219
+ recommended_agents = self.claude_bridge.get_recommended_external_agents(
220
+ issue
221
+ )
222
+ if recommended_agents:
223
+ self._external_consultation_stats["consultations_requested"] += 1
224
+
225
+ # Consult the top recommended external agent
226
+ consultation = await self.claude_bridge.consult_external_agent(
227
+ issue, recommended_agents[0]
228
+ )
229
+
230
+ if consultation.get("status") == "success":
231
+ self._external_consultation_stats["consultations_successful"] += 1
232
+ enhanced_result = self.claude_bridge.create_enhanced_fix_result(
233
+ internal_result, [consultation]
234
+ )
235
+ return enhanced_result
236
+
237
+ return internal_result
238
+
239
+ def get_enhanced_agent_capabilities(self) -> dict[str, dict[str, t.Any]]:
240
+ """Get capabilities including external agent integration."""
241
+ base_capabilities = self.get_agent_capabilities()
242
+
243
+ # Add information about external agent integration
244
+ enhanced_info = {
245
+ "external_agents_enabled": self.external_agents_enabled,
246
+ "available_external_agents": [
247
+ agent
248
+ for agent in (
249
+ "crackerjack-architect",
250
+ "python-pro",
251
+ "security-auditor",
252
+ "refactoring-specialist",
253
+ "crackerjack-test-specialist",
254
+ )
255
+ if self.claude_bridge.verify_agent_availability(agent)
256
+ ],
257
+ "consultation_stats": self.get_external_consultation_stats(),
258
+ "claude_code_bridge": {
259
+ "agent_mapping_coverage": len(self.claude_bridge._get_agent_mapping()),
260
+ "consultation_threshold": self.claude_bridge._get_consultation_threshold(),
261
+ },
262
+ }
263
+
264
+ return base_capabilities | {"_enhanced_coordinator_info": enhanced_info}
265
+
266
+
267
+ def create_enhanced_coordinator(
268
+ context: AgentContext, cache: t.Any = None, enable_external_agents: bool = True
269
+ ) -> EnhancedAgentCoordinator:
270
+ """
271
+ Factory function to create an enhanced coordinator.
272
+
273
+ This function provides a clean interface for creating coordinators
274
+ with external agent integration while maintaining compatibility
275
+ with existing code.
276
+ """
277
+ return EnhancedAgentCoordinator(
278
+ context=context, cache=cache, enable_external_agents=enable_external_agents
279
+ )