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,427 @@
1
+ """Real-time metrics collection service for unified monitoring dashboard."""
2
+
3
+ import asyncio
4
+ import logging
5
+ import time
6
+ import typing as t
7
+ from collections import deque
8
+ from collections.abc import Callable
9
+ from dataclasses import asdict, dataclass, field
10
+ from datetime import datetime, timedelta
11
+
12
+ from acb.console import Console
13
+ from acb.depends import depends
14
+
15
+ from crackerjack.monitoring.ai_agent_watchdog import AgentPerformanceMetrics
16
+ from crackerjack.services.acb_cache_adapter import CrackerjackCache
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ @dataclass
22
+ class SystemMetrics:
23
+ """System-level performance metrics."""
24
+
25
+ cpu_usage: float = 0.0
26
+ memory_usage_mb: float = 0.0
27
+ disk_usage_gb: float = 0.0
28
+ active_processes: int = 0
29
+ uptime_seconds: float = 0.0
30
+
31
+ def to_dict(self) -> dict[str, t.Any]:
32
+ return asdict(self)
33
+
34
+
35
+ @dataclass
36
+ class QualityMetrics:
37
+ """Code quality and workflow metrics."""
38
+
39
+ total_issues_found: int = 0
40
+ issues_fixed: int = 0
41
+ success_rate: float = 0.0
42
+ average_confidence: float = 0.0
43
+ test_coverage: float = 0.0
44
+ complexity_violations: int = 0
45
+ security_issues: int = 0
46
+ performance_issues: int = 0
47
+
48
+ def to_dict(self) -> dict[str, t.Any]:
49
+ return asdict(self)
50
+
51
+
52
+ @dataclass
53
+ class WorkflowMetrics:
54
+ """Workflow execution and timing metrics."""
55
+
56
+ jobs_completed: int = 0
57
+ jobs_failed: int = 0
58
+ average_job_duration: float = 0.0
59
+ fastest_job_time: float = 0.0
60
+ slowest_job_time: float = 0.0
61
+ queue_depth: int = 0
62
+ throughput_per_hour: float = 0.0
63
+
64
+ def to_dict(self) -> dict[str, t.Any]:
65
+ return asdict(self)
66
+
67
+
68
+ @dataclass
69
+ class AgentMetrics:
70
+ """AI agent performance and utilization metrics."""
71
+
72
+ active_agents: int = 0
73
+ total_fixes_applied: int = 0
74
+ cache_hit_rate: float = 0.0
75
+ average_response_time: float = 0.0
76
+ agent_effectiveness: dict[str, float] = field(default_factory=dict[str, t.Any])
77
+ issue_type_distribution: dict[str, int] = field(default_factory=dict[str, t.Any])
78
+
79
+ def to_dict(self) -> dict[str, t.Any]:
80
+ return asdict(self)
81
+
82
+
83
+ @dataclass
84
+ class UnifiedDashboardMetrics:
85
+ """Combined metrics for unified dashboard display."""
86
+
87
+ timestamp: datetime = field(default_factory=datetime.now)
88
+ system: SystemMetrics = field(default_factory=SystemMetrics)
89
+ quality: QualityMetrics = field(default_factory=QualityMetrics)
90
+ workflow: WorkflowMetrics = field(default_factory=WorkflowMetrics)
91
+ agents: AgentMetrics = field(default_factory=AgentMetrics)
92
+
93
+ def to_dict(self) -> dict[str, t.Any]:
94
+ return {
95
+ "timestamp": self.timestamp.isoformat(),
96
+ "system": self.system.to_dict(),
97
+ "quality": self.quality.to_dict(),
98
+ "workflow": self.workflow.to_dict(),
99
+ "agents": self.agents.to_dict(),
100
+ }
101
+
102
+
103
+ class MetricsCollector:
104
+ """
105
+ Real-time metrics collection service for unified monitoring dashboard.
106
+
107
+ Collects and aggregates metrics from multiple sources:
108
+ - System performance (CPU, memory, disk)
109
+ - Code quality (issues, coverage, complexity)
110
+ - Workflow execution (jobs, timing, throughput)
111
+ - AI agent performance (fixes, confidence, cache hits)
112
+ """
113
+
114
+ def __init__(self, cache: CrackerjackCache | None = None):
115
+ self.console = depends.get_sync(Console)
116
+ self.cache = cache or CrackerjackCache()
117
+
118
+ self.is_collecting = False
119
+ self.collection_interval = 5.0 # seconds
120
+ self.history_size = 100
121
+
122
+ # Metrics storage
123
+ self.metrics_history: deque[UnifiedDashboardMetrics] = deque(
124
+ maxlen=self.history_size
125
+ )
126
+ self.current_metrics = UnifiedDashboardMetrics()
127
+
128
+ # Agent performance tracking
129
+ self.agent_metrics: dict[str, AgentPerformanceMetrics] = {}
130
+
131
+ # Workflow tracking
132
+ self.job_start_times: dict[str, float] = {}
133
+ self.job_durations: list[float] = []
134
+
135
+ # Collection tasks
136
+ self.collection_task: asyncio.Task[t.Any] | None = None
137
+ self.listeners: list[Callable[[UnifiedDashboardMetrics], None]] = []
138
+
139
+ async def start_collection(self) -> None:
140
+ """Start the metrics collection service."""
141
+ if self.is_collecting:
142
+ logger.warning("Metrics collection already running")
143
+ return
144
+
145
+ self.is_collecting = True
146
+ self.collection_task = asyncio.create_task(self._collection_loop())
147
+
148
+ logger.info("🔍 Metrics collection started")
149
+
150
+ async def stop_collection(self) -> None:
151
+ """Stop the metrics collection service."""
152
+ self.is_collecting = False
153
+
154
+ if self.collection_task:
155
+ self.collection_task.cancel()
156
+ try:
157
+ await self.collection_task
158
+ except asyncio.CancelledError:
159
+ pass
160
+
161
+ logger.info("🔍 Metrics collection stopped")
162
+
163
+ def add_metrics_listener(
164
+ self, callback: Callable[[UnifiedDashboardMetrics], None]
165
+ ) -> None:
166
+ """Add a callback to be notified of new metrics."""
167
+ self.listeners.append(callback)
168
+
169
+ def remove_metrics_listener(
170
+ self, callback: Callable[[UnifiedDashboardMetrics], None]
171
+ ) -> None:
172
+ """Remove a metrics callback."""
173
+ if callback in self.listeners:
174
+ self.listeners.remove(callback)
175
+
176
+ async def _collection_loop(self) -> None:
177
+ """Main metrics collection loop."""
178
+ while self.is_collecting:
179
+ try:
180
+ await self._collect_all_metrics()
181
+ await asyncio.sleep(self.collection_interval)
182
+ except asyncio.CancelledError:
183
+ break
184
+ except Exception as e:
185
+ logger.error(f"Error in metrics collection: {e}")
186
+ await asyncio.sleep(self.collection_interval)
187
+
188
+ async def _collect_all_metrics(self) -> None:
189
+ """Collect all metrics from various sources."""
190
+ # Collect system metrics
191
+ system_metrics = await self._collect_system_metrics()
192
+
193
+ # Collect quality metrics
194
+ quality_metrics = await self._collect_quality_metrics()
195
+
196
+ # Collect workflow metrics
197
+ workflow_metrics = await self._collect_workflow_metrics()
198
+
199
+ # Collect agent metrics
200
+ agent_metrics = await self._collect_agent_metrics()
201
+
202
+ # Create unified metrics
203
+ unified_metrics = UnifiedDashboardMetrics(
204
+ system=system_metrics,
205
+ quality=quality_metrics,
206
+ workflow=workflow_metrics,
207
+ agents=agent_metrics,
208
+ )
209
+
210
+ # Store metrics
211
+ self.current_metrics = unified_metrics
212
+ self.metrics_history.append(unified_metrics)
213
+
214
+ # Notify listeners
215
+ for listener in self.listeners:
216
+ try:
217
+ listener(unified_metrics)
218
+ except Exception as e:
219
+ logger.error(f"Error in metrics listener: {e}")
220
+
221
+ async def _collect_system_metrics(self) -> SystemMetrics:
222
+ """Collect system performance metrics."""
223
+ try:
224
+ import psutil
225
+
226
+ cpu_usage = psutil.cpu_percent(interval=None)
227
+ memory = psutil.virtual_memory()
228
+ memory_mb = memory.used / (1024 * 1024)
229
+ disk = psutil.disk_usage("/")
230
+ disk_gb = disk.used / (1024 * 1024 * 1024)
231
+
232
+ return SystemMetrics(
233
+ cpu_usage=cpu_usage,
234
+ memory_usage_mb=memory_mb,
235
+ disk_usage_gb=disk_gb,
236
+ active_processes=len(psutil.pids()),
237
+ uptime_seconds=time.time() - psutil.boot_time(),
238
+ )
239
+ except ImportError:
240
+ # Fallback if psutil not available
241
+ return SystemMetrics()
242
+ except Exception as e:
243
+ logger.error(f"Error collecting system metrics: {e}")
244
+ return SystemMetrics()
245
+
246
+ async def _collect_quality_metrics(self) -> QualityMetrics:
247
+ """Collect code quality metrics."""
248
+ try:
249
+ # Try to get metrics from cache or recent runs
250
+ quality_data = self.cache.get("quality_metrics", {})
251
+
252
+ return QualityMetrics(
253
+ total_issues_found=quality_data.get("total_issues", 0),
254
+ issues_fixed=quality_data.get("issues_fixed", 0),
255
+ success_rate=quality_data.get("success_rate", 0.0),
256
+ average_confidence=quality_data.get("avg_confidence", 0.0),
257
+ test_coverage=quality_data.get("test_coverage", 0.0),
258
+ complexity_violations=quality_data.get("complexity_violations", 0),
259
+ security_issues=quality_data.get("security_issues", 0),
260
+ performance_issues=quality_data.get("performance_issues", 0),
261
+ )
262
+ except Exception as e:
263
+ logger.error(f"Error collecting quality metrics: {e}")
264
+ return QualityMetrics()
265
+
266
+ async def _collect_workflow_metrics(self) -> WorkflowMetrics:
267
+ """Collect workflow execution metrics."""
268
+ try:
269
+ workflow_data = self.cache.get("workflow_metrics", {})
270
+
271
+ # Calculate throughput
272
+ recent_jobs = len([d for d in self.job_durations if d > 0])
273
+ throughput = recent_jobs / max(
274
+ 1, self.collection_interval / 3600
275
+ ) # per hour
276
+
277
+ return WorkflowMetrics(
278
+ jobs_completed=workflow_data.get("jobs_completed", 0),
279
+ jobs_failed=workflow_data.get("jobs_failed", 0),
280
+ average_job_duration=sum(self.job_durations)
281
+ / max(1, len(self.job_durations)),
282
+ fastest_job_time=min(self.job_durations) if self.job_durations else 0.0,
283
+ slowest_job_time=max(self.job_durations) if self.job_durations else 0.0,
284
+ queue_depth=workflow_data.get("queue_depth", 0),
285
+ throughput_per_hour=throughput,
286
+ )
287
+ except Exception as e:
288
+ logger.error(f"Error collecting workflow metrics: {e}")
289
+ return WorkflowMetrics()
290
+
291
+ async def _collect_agent_metrics(self) -> AgentMetrics:
292
+ """Collect AI agent performance metrics."""
293
+ try:
294
+ agent_data = self.cache.get("agent_metrics", {})
295
+
296
+ # Calculate agent effectiveness
297
+ effectiveness = {}
298
+ issue_distribution: dict[str, int] = {}
299
+ total_fixes = 0
300
+ total_response_time = 0.0
301
+
302
+ for agent_name, metrics in self.agent_metrics.items():
303
+ if metrics.total_issues_handled > 0:
304
+ success_rate = (
305
+ metrics.successful_fixes / metrics.total_issues_handled
306
+ )
307
+ effectiveness[agent_name] = success_rate
308
+ total_fixes += metrics.successful_fixes
309
+ total_response_time += metrics.average_execution_time
310
+
311
+ for issue_type, count in metrics.issue_types_handled.items():
312
+ issue_distribution[issue_type.value] = (
313
+ issue_distribution.get(issue_type.value, 0) + count
314
+ )
315
+
316
+ # Calculate cache hit rate from agent usage
317
+ cache_stats = agent_data.get("cache_stats", {})
318
+ cache_hits = cache_stats.get("hits", 0)
319
+ cache_misses = cache_stats.get("misses", 0)
320
+ cache_hit_rate = cache_hits / max(1, cache_hits + cache_misses)
321
+
322
+ return AgentMetrics(
323
+ active_agents=len(self.agent_metrics),
324
+ total_fixes_applied=total_fixes,
325
+ cache_hit_rate=cache_hit_rate,
326
+ average_response_time=total_response_time
327
+ / max(1, len(self.agent_metrics)),
328
+ agent_effectiveness=effectiveness,
329
+ issue_type_distribution=issue_distribution,
330
+ )
331
+ except Exception as e:
332
+ logger.error(f"Error collecting agent metrics: {e}")
333
+ return AgentMetrics()
334
+
335
+ # Integration methods for external systems
336
+
337
+ def record_job_start(self, job_id: str) -> None:
338
+ """Record the start of a job for timing."""
339
+ self.job_start_times[job_id] = time.time()
340
+
341
+ def record_job_completion(self, job_id: str, success: bool = True) -> None:
342
+ """Record job completion and calculate duration."""
343
+ if job_id in self.job_start_times:
344
+ duration = time.time() - self.job_start_times[job_id]
345
+ self.job_durations.append(duration)
346
+ del self.job_start_times[job_id]
347
+
348
+ # Keep only recent job durations
349
+ if len(self.job_durations) > self.history_size:
350
+ self.job_durations = self.job_durations[-self.history_size :]
351
+
352
+ # Update cache
353
+ workflow_data = self.cache.get("workflow_metrics", {})
354
+ if success:
355
+ workflow_data["jobs_completed"] = (
356
+ workflow_data.get("jobs_completed", 0) + 1
357
+ )
358
+ else:
359
+ workflow_data["jobs_failed"] = workflow_data.get("jobs_failed", 0) + 1
360
+ self.cache.set("workflow_metrics", workflow_data)
361
+
362
+ def record_agent_performance(
363
+ self, agent_name: str, metrics: AgentPerformanceMetrics
364
+ ) -> None:
365
+ """Record agent performance metrics."""
366
+ self.agent_metrics[agent_name] = metrics
367
+
368
+ def record_quality_data(
369
+ self, issues_found: int, issues_fixed: int, coverage: float, success_rate: float
370
+ ) -> None:
371
+ """Record quality metrics from a run."""
372
+ quality_data = {
373
+ "total_issues": issues_found,
374
+ "issues_fixed": issues_fixed,
375
+ "test_coverage": coverage,
376
+ "success_rate": success_rate,
377
+ "timestamp": datetime.now().isoformat(),
378
+ }
379
+ self.cache.set("quality_metrics", quality_data)
380
+
381
+ def get_current_metrics(self) -> UnifiedDashboardMetrics:
382
+ """Get the current metrics snapshot."""
383
+ return self.current_metrics
384
+
385
+ def get_metrics_history(self, hours: int = 1) -> list[UnifiedDashboardMetrics]:
386
+ """Get metrics history for the specified number of hours."""
387
+ cutoff = datetime.now() - timedelta(hours=hours)
388
+ return [m for m in self.metrics_history if m.timestamp > cutoff]
389
+
390
+ def get_metrics_summary(self) -> dict[str, t.Any]:
391
+ """Get a summary of current metrics for display."""
392
+ metrics = self.current_metrics
393
+
394
+ return {
395
+ "system": {
396
+ "cpu": f"{metrics.system.cpu_usage:.1f}%",
397
+ "memory": f"{metrics.system.memory_usage_mb:.0f}MB",
398
+ "disk": f"{metrics.system.disk_usage_gb:.1f}GB",
399
+ "uptime": self._format_uptime(metrics.system.uptime_seconds),
400
+ },
401
+ "quality": {
402
+ "success_rate": f"{metrics.quality.success_rate:.1%}",
403
+ "issues_fixed": metrics.quality.issues_fixed,
404
+ "test_coverage": f"{metrics.quality.test_coverage:.1%}",
405
+ "avg_confidence": f"{metrics.quality.average_confidence:.2f}",
406
+ },
407
+ "workflow": {
408
+ "jobs_completed": metrics.workflow.jobs_completed,
409
+ "avg_duration": f"{metrics.workflow.average_job_duration:.1f}s",
410
+ "throughput": f"{metrics.workflow.throughput_per_hour:.1f}/h",
411
+ "queue_depth": metrics.workflow.queue_depth,
412
+ },
413
+ "agents": {
414
+ "active_agents": metrics.agents.active_agents,
415
+ "total_fixes": metrics.agents.total_fixes_applied,
416
+ "cache_hit_rate": f"{metrics.agents.cache_hit_rate:.1%}",
417
+ "avg_response": f"{metrics.agents.average_response_time:.1f}s",
418
+ },
419
+ }
420
+
421
+ def _format_uptime(self, seconds: float) -> str:
422
+ """Format uptime in human-readable format."""
423
+ if seconds < 3600:
424
+ return f"{seconds / 60:.0f}m"
425
+ elif seconds < 86400:
426
+ return f"{seconds / 3600:.0f}h"
427
+ return f"{seconds / 86400:.0f}d"