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,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
+ )
@@ -0,0 +1,185 @@
1
+ """
2
+ Enhanced proactive agent that integrates Claude Code external agent consultation.
3
+
4
+ This module extends the base ProactiveAgent to consult with Claude Code's external
5
+ agents (like crackerjack-architect, python-pro, security-auditor) when handling
6
+ complex issues that require specialized expertise.
7
+ """
8
+
9
+ import typing as t
10
+ from abc import abstractmethod
11
+
12
+ from .base import AgentContext, FixResult, Issue
13
+ from .claude_code_bridge import ClaudeCodeBridge
14
+ from .proactive_agent import ProactiveAgent
15
+
16
+
17
+ class EnhancedProactiveAgent(ProactiveAgent):
18
+ """
19
+ Proactive agent enhanced with Claude Code external agent consultation.
20
+
21
+ This agent follows the standard crackerjack agent pattern but adds intelligent
22
+ consultation with external Claude Code agents for complex scenarios that
23
+ require specialized expertise.
24
+ """
25
+
26
+ def __init__(self, context: AgentContext) -> None:
27
+ super().__init__(context)
28
+ self.claude_bridge = ClaudeCodeBridge(context)
29
+ self._external_consultation_enabled = True
30
+
31
+ def enable_external_consultation(self, enabled: bool = True) -> None:
32
+ """Enable or disable external Claude Code agent consultation."""
33
+ self._external_consultation_enabled = enabled
34
+
35
+ async def _execute_with_plan(
36
+ self, issue: Issue, plan: dict[str, t.Any]
37
+ ) -> FixResult:
38
+ """
39
+ Execute fix with plan, consulting external agents when appropriate.
40
+
41
+ This method enhances the base implementation by:
42
+ 1. First attempting the internal fix
43
+ 2. Evaluating if external consultation would improve the result
44
+ 3. Consulting with relevant Claude Code agents
45
+ 4. Combining internal and external guidance for better results
46
+ """
47
+ # First, get the internal fix result
48
+ internal_result = await self._execute_internal_fix(issue, plan)
49
+
50
+ # Determine if we should consult external agents
51
+ if not self._should_consult_external_agents(issue, internal_result, plan):
52
+ return internal_result
53
+
54
+ # Consult with relevant external agents
55
+ external_consultations = await self._consult_external_agents(issue, plan)
56
+
57
+ # Enhance the result with external guidance
58
+ enhanced_result = self._combine_internal_and_external_results(
59
+ internal_result, external_consultations
60
+ )
61
+
62
+ return enhanced_result
63
+
64
+ async def _execute_internal_fix(
65
+ self, issue: Issue, plan: dict[str, t.Any]
66
+ ) -> FixResult:
67
+ """Execute the internal fix using the built-in agent logic."""
68
+ # This calls the concrete agent's analyze_and_fix implementation
69
+ return await self.analyze_and_fix(issue)
70
+
71
+ def _should_consult_external_agents(
72
+ self, issue: Issue, internal_result: FixResult, plan: dict[str, t.Any]
73
+ ) -> bool:
74
+ """Determine if external consultation would be beneficial."""
75
+ if not self._external_consultation_enabled:
76
+ return False
77
+
78
+ # Consult external agents if:
79
+ # 1. Internal result has low confidence
80
+ # 2. Issue is complex and requires specialized expertise
81
+ # 3. Plan strategy indicates external specialist guidance
82
+ return (
83
+ self.claude_bridge.should_consult_external_agent(
84
+ issue, internal_result.confidence
85
+ )
86
+ or plan.get("strategy") == "external_specialist_guided"
87
+ or not internal_result.success
88
+ )
89
+
90
+ async def _consult_external_agents(
91
+ self, issue: Issue, plan: dict[str, t.Any]
92
+ ) -> list[dict[str, t.Any]]:
93
+ """Consult with relevant external Claude Code agents."""
94
+ recommended_agents = self.claude_bridge.get_recommended_external_agents(issue)
95
+ consultations = []
96
+
97
+ # Limit to top 2 agents to avoid overwhelming the system
98
+ for agent_name in recommended_agents[:2]:
99
+ if self.claude_bridge.verify_agent_availability(agent_name):
100
+ consultation = await self.claude_bridge.consult_external_agent(
101
+ issue, agent_name, {"plan": plan}
102
+ )
103
+ if consultation.get("status") == "success":
104
+ consultations.append(consultation)
105
+
106
+ return consultations
107
+
108
+ def _combine_internal_and_external_results(
109
+ self, internal_result: FixResult, external_consultations: list[dict[str, t.Any]]
110
+ ) -> FixResult:
111
+ """Combine internal fix result with external agent consultations."""
112
+ if not external_consultations:
113
+ return internal_result
114
+
115
+ # Use the bridge to create an enhanced result
116
+ enhanced_result = self.claude_bridge.create_enhanced_fix_result(
117
+ internal_result, external_consultations
118
+ )
119
+
120
+ # Add metadata about external consultation
121
+ enhanced_result.recommendations.insert(
122
+ 0,
123
+ f"Enhanced with consultation from {len(external_consultations)} Claude Code agents",
124
+ )
125
+
126
+ return enhanced_result
127
+
128
+ async def plan_before_action(self, issue: Issue) -> dict[str, t.Any]:
129
+ """
130
+ Create a plan that considers both internal and external capabilities.
131
+
132
+ This method should be implemented by concrete agents to define their
133
+ specific planning logic while having access to external consultation.
134
+ """
135
+ # Default implementation - concrete agents should override this
136
+ if self.claude_bridge.should_consult_external_agent(issue, 0.0):
137
+ return {
138
+ "strategy": "external_specialist_guided",
139
+ "approach": "consult_claude_code_experts",
140
+ "patterns": ["external_guidance"],
141
+ "validation": ["verify_with_external_agents"],
142
+ }
143
+
144
+ return {
145
+ "strategy": "internal_pattern_based",
146
+ "approach": "apply_internal_logic",
147
+ "patterns": ["standard_patterns"],
148
+ "validation": ["run_internal_checks"],
149
+ }
150
+
151
+ @abstractmethod
152
+ async def analyze_and_fix(self, issue: Issue) -> FixResult:
153
+ """
154
+ Concrete agents must implement their specific fix logic.
155
+
156
+ This method contains the core agent-specific logic for analyzing
157
+ and fixing issues. The enhanced execution framework will automatically
158
+ handle external consultation when appropriate.
159
+ """
160
+ pass
161
+
162
+
163
+ # Convenience function to enhance existing agents
164
+ def enhance_agent_with_claude_code_bridge(
165
+ agent_class: type[ProactiveAgent],
166
+ ) -> type[EnhancedProactiveAgent]:
167
+ """
168
+ Enhance an existing ProactiveAgent class with Claude Code external consultation.
169
+
170
+ This function creates a new class that inherits from both the original agent
171
+ and EnhancedProactiveAgent, providing external consultation capabilities
172
+ while preserving the original agent's logic.
173
+ """
174
+
175
+ class EnhancedAgent(EnhancedProactiveAgent, agent_class): # type: ignore[misc,valid-type]
176
+ def __init__(self, context: AgentContext) -> None:
177
+ # Initialize both parent classes
178
+ EnhancedProactiveAgent.__init__(self, context)
179
+ agent_class.__init__(self, context)
180
+
181
+ # Preserve the original class name and metadata
182
+ EnhancedAgent.__name__ = f"Enhanced{agent_class.__name__}"
183
+ EnhancedAgent.__qualname__ = f"Enhanced{agent_class.__qualname__}"
184
+
185
+ return EnhancedAgent
@@ -0,0 +1,53 @@
1
+ """Shared error-handling middleware helpers for agents."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import typing as t
6
+ from functools import wraps
7
+
8
+ from acb.console import Console
9
+
10
+ from crackerjack.agents.base import FixResult, Issue, SubAgent
11
+
12
+ if t.TYPE_CHECKING: # pragma: no cover - typing helpers
13
+ from crackerjack.agents.coordinator import AgentCoordinator
14
+
15
+
16
+ def agent_error_boundary(
17
+ func: t.Callable[..., t.Awaitable[FixResult]],
18
+ ) -> t.Callable[..., t.Awaitable[FixResult]]:
19
+ """Decorator that centralizes error handling for agent execution.
20
+
21
+ Ensures all agent failures are logged consistently and converted into a
22
+ ``FixResult`` that upstream orchestrators can reason about without custom
23
+ ``try``/``except`` blocks.
24
+ """
25
+
26
+ @wraps(func)
27
+ async def wrapper(
28
+ self: AgentCoordinator,
29
+ agent: SubAgent,
30
+ issue: Issue,
31
+ *args: t.Any,
32
+ **kwargs: t.Any,
33
+ ) -> FixResult:
34
+ try:
35
+ return await func(self, agent, issue, *args, **kwargs)
36
+ except Exception as exc: # pragma: no cover - exercised via decorator tests
37
+ console: Console | None = getattr(self.context, "console", None)
38
+ message = f"{agent.name} encountered an error while processing issue {issue.id}: {exc}"
39
+ self.logger.exception(message, exc_info=exc)
40
+ if console is not None:
41
+ console.print(f"[red]{message}[/red]")
42
+
43
+ return FixResult(
44
+ success=False,
45
+ confidence=0.0,
46
+ remaining_issues=[message],
47
+ recommendations=[
48
+ "Review agent logs for stack trace",
49
+ "Re-run with --debug to capture additional context",
50
+ ],
51
+ )
52
+
53
+ return wrapper