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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +30 -1
  3. crackerjack/__main__.py +342 -1263
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +27 -5
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/{rust_tool_manager.py → lsp/_manager.py} +3 -3
  27. crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
  28. crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
  29. crackerjack/adapters/refactor/README.md +59 -0
  30. crackerjack/adapters/refactor/__init__.py +12 -0
  31. crackerjack/adapters/refactor/creosote.py +318 -0
  32. crackerjack/adapters/refactor/refurb.py +406 -0
  33. crackerjack/adapters/refactor/skylos.py +494 -0
  34. crackerjack/adapters/sast/README.md +132 -0
  35. crackerjack/adapters/sast/__init__.py +32 -0
  36. crackerjack/adapters/sast/_base.py +201 -0
  37. crackerjack/adapters/sast/bandit.py +423 -0
  38. crackerjack/adapters/sast/pyscn.py +405 -0
  39. crackerjack/adapters/sast/semgrep.py +241 -0
  40. crackerjack/adapters/security/README.md +111 -0
  41. crackerjack/adapters/security/__init__.py +17 -0
  42. crackerjack/adapters/security/gitleaks.py +339 -0
  43. crackerjack/adapters/type/README.md +52 -0
  44. crackerjack/adapters/type/__init__.py +12 -0
  45. crackerjack/adapters/type/pyrefly.py +402 -0
  46. crackerjack/adapters/type/ty.py +402 -0
  47. crackerjack/adapters/type/zuban.py +522 -0
  48. crackerjack/adapters/utility/README.md +51 -0
  49. crackerjack/adapters/utility/__init__.py +10 -0
  50. crackerjack/adapters/utility/checks.py +884 -0
  51. crackerjack/agents/README.md +264 -0
  52. crackerjack/agents/__init__.py +40 -12
  53. crackerjack/agents/base.py +1 -0
  54. crackerjack/agents/claude_code_bridge.py +641 -0
  55. crackerjack/agents/coordinator.py +49 -53
  56. crackerjack/agents/dry_agent.py +187 -3
  57. crackerjack/agents/enhanced_coordinator.py +279 -0
  58. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  59. crackerjack/agents/error_middleware.py +53 -0
  60. crackerjack/agents/formatting_agent.py +6 -8
  61. crackerjack/agents/helpers/__init__.py +9 -0
  62. crackerjack/agents/helpers/performance/__init__.py +22 -0
  63. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  64. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  65. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  66. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  67. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  68. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  69. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  70. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  71. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  72. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  73. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  74. crackerjack/agents/performance_agent.py +121 -1152
  75. crackerjack/agents/refactoring_agent.py +156 -655
  76. crackerjack/agents/semantic_agent.py +479 -0
  77. crackerjack/agents/semantic_helpers.py +356 -0
  78. crackerjack/agents/test_creation_agent.py +19 -1605
  79. crackerjack/api.py +5 -7
  80. crackerjack/cli/README.md +394 -0
  81. crackerjack/cli/__init__.py +1 -1
  82. crackerjack/cli/cache_handlers.py +23 -18
  83. crackerjack/cli/cache_handlers_enhanced.py +1 -4
  84. crackerjack/cli/facade.py +70 -8
  85. crackerjack/cli/formatting.py +13 -0
  86. crackerjack/cli/handlers/__init__.py +85 -0
  87. crackerjack/cli/handlers/advanced.py +103 -0
  88. crackerjack/cli/handlers/ai_features.py +62 -0
  89. crackerjack/cli/handlers/analytics.py +479 -0
  90. crackerjack/cli/handlers/changelog.py +271 -0
  91. crackerjack/cli/handlers/config_handlers.py +16 -0
  92. crackerjack/cli/handlers/coverage.py +84 -0
  93. crackerjack/cli/handlers/documentation.py +280 -0
  94. crackerjack/cli/handlers/main_handlers.py +497 -0
  95. crackerjack/cli/handlers/monitoring.py +371 -0
  96. crackerjack/cli/handlers.py +249 -49
  97. crackerjack/cli/interactive.py +8 -5
  98. crackerjack/cli/options.py +203 -110
  99. crackerjack/cli/semantic_handlers.py +292 -0
  100. crackerjack/cli/version.py +19 -0
  101. crackerjack/code_cleaner.py +60 -24
  102. crackerjack/config/README.md +472 -0
  103. crackerjack/config/__init__.py +256 -0
  104. crackerjack/config/global_lock_config.py +191 -54
  105. crackerjack/config/hooks.py +188 -16
  106. crackerjack/config/loader.py +239 -0
  107. crackerjack/config/settings.py +141 -0
  108. crackerjack/config/tool_commands.py +331 -0
  109. crackerjack/core/README.md +393 -0
  110. crackerjack/core/async_workflow_orchestrator.py +79 -53
  111. crackerjack/core/autofix_coordinator.py +22 -9
  112. crackerjack/core/container.py +10 -9
  113. crackerjack/core/enhanced_container.py +9 -9
  114. crackerjack/core/performance.py +1 -1
  115. crackerjack/core/performance_monitor.py +5 -3
  116. crackerjack/core/phase_coordinator.py +1018 -634
  117. crackerjack/core/proactive_workflow.py +3 -3
  118. crackerjack/core/retry.py +275 -0
  119. crackerjack/core/service_watchdog.py +167 -23
  120. crackerjack/core/session_coordinator.py +187 -382
  121. crackerjack/core/timeout_manager.py +161 -44
  122. crackerjack/core/workflow/__init__.py +21 -0
  123. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  124. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  125. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  126. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  127. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  128. crackerjack/core/workflow_orchestrator.py +1247 -953
  129. crackerjack/data/README.md +11 -0
  130. crackerjack/data/__init__.py +8 -0
  131. crackerjack/data/models.py +79 -0
  132. crackerjack/data/repository.py +210 -0
  133. crackerjack/decorators/README.md +180 -0
  134. crackerjack/decorators/__init__.py +35 -0
  135. crackerjack/decorators/error_handling.py +649 -0
  136. crackerjack/decorators/error_handling_decorators.py +334 -0
  137. crackerjack/decorators/helpers.py +58 -0
  138. crackerjack/decorators/patterns.py +281 -0
  139. crackerjack/decorators/utils.py +58 -0
  140. crackerjack/docs/README.md +11 -0
  141. crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
  142. crackerjack/documentation/README.md +11 -0
  143. crackerjack/documentation/ai_templates.py +1 -1
  144. crackerjack/documentation/dual_output_generator.py +11 -9
  145. crackerjack/documentation/reference_generator.py +104 -59
  146. crackerjack/dynamic_config.py +52 -61
  147. crackerjack/errors.py +1 -1
  148. crackerjack/events/README.md +11 -0
  149. crackerjack/events/__init__.py +16 -0
  150. crackerjack/events/telemetry.py +175 -0
  151. crackerjack/events/workflow_bus.py +346 -0
  152. crackerjack/exceptions/README.md +301 -0
  153. crackerjack/exceptions/__init__.py +5 -0
  154. crackerjack/exceptions/config.py +4 -0
  155. crackerjack/exceptions/tool_execution_error.py +245 -0
  156. crackerjack/executors/README.md +591 -0
  157. crackerjack/executors/__init__.py +2 -0
  158. crackerjack/executors/async_hook_executor.py +539 -77
  159. crackerjack/executors/cached_hook_executor.py +3 -3
  160. crackerjack/executors/hook_executor.py +967 -102
  161. crackerjack/executors/hook_lock_manager.py +31 -22
  162. crackerjack/executors/individual_hook_executor.py +66 -32
  163. crackerjack/executors/lsp_aware_hook_executor.py +136 -57
  164. crackerjack/executors/progress_hook_executor.py +282 -0
  165. crackerjack/executors/tool_proxy.py +23 -7
  166. crackerjack/hooks/README.md +485 -0
  167. crackerjack/hooks/lsp_hook.py +8 -9
  168. crackerjack/intelligence/README.md +557 -0
  169. crackerjack/interactive.py +37 -10
  170. crackerjack/managers/README.md +369 -0
  171. crackerjack/managers/async_hook_manager.py +41 -57
  172. crackerjack/managers/hook_manager.py +449 -79
  173. crackerjack/managers/publish_manager.py +81 -36
  174. crackerjack/managers/test_command_builder.py +290 -12
  175. crackerjack/managers/test_executor.py +93 -8
  176. crackerjack/managers/test_manager.py +1082 -75
  177. crackerjack/managers/test_progress.py +118 -26
  178. crackerjack/mcp/README.md +374 -0
  179. crackerjack/mcp/cache.py +25 -2
  180. crackerjack/mcp/client_runner.py +35 -18
  181. crackerjack/mcp/context.py +9 -9
  182. crackerjack/mcp/dashboard.py +24 -8
  183. crackerjack/mcp/enhanced_progress_monitor.py +34 -23
  184. crackerjack/mcp/file_monitor.py +27 -6
  185. crackerjack/mcp/progress_components.py +45 -34
  186. crackerjack/mcp/progress_monitor.py +6 -9
  187. crackerjack/mcp/rate_limiter.py +11 -7
  188. crackerjack/mcp/server.py +2 -0
  189. crackerjack/mcp/server_core.py +187 -55
  190. crackerjack/mcp/service_watchdog.py +12 -9
  191. crackerjack/mcp/task_manager.py +2 -2
  192. crackerjack/mcp/tools/README.md +27 -0
  193. crackerjack/mcp/tools/__init__.py +2 -0
  194. crackerjack/mcp/tools/core_tools.py +75 -52
  195. crackerjack/mcp/tools/execution_tools.py +87 -31
  196. crackerjack/mcp/tools/intelligence_tools.py +2 -2
  197. crackerjack/mcp/tools/proactive_tools.py +1 -1
  198. crackerjack/mcp/tools/semantic_tools.py +584 -0
  199. crackerjack/mcp/tools/utility_tools.py +180 -132
  200. crackerjack/mcp/tools/workflow_executor.py +87 -46
  201. crackerjack/mcp/websocket/README.md +31 -0
  202. crackerjack/mcp/websocket/app.py +11 -1
  203. crackerjack/mcp/websocket/event_bridge.py +188 -0
  204. crackerjack/mcp/websocket/jobs.py +27 -4
  205. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  206. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  207. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  208. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  209. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  210. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  211. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  212. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  213. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  214. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  215. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  216. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  217. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  218. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  219. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  220. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  221. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  222. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  223. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  224. crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
  225. crackerjack/mcp/websocket/server.py +1 -3
  226. crackerjack/mcp/websocket/websocket_handler.py +107 -6
  227. crackerjack/models/README.md +308 -0
  228. crackerjack/models/__init__.py +10 -1
  229. crackerjack/models/config.py +639 -22
  230. crackerjack/models/config_adapter.py +6 -6
  231. crackerjack/models/protocols.py +1167 -23
  232. crackerjack/models/pydantic_models.py +320 -0
  233. crackerjack/models/qa_config.py +145 -0
  234. crackerjack/models/qa_results.py +134 -0
  235. crackerjack/models/results.py +35 -0
  236. crackerjack/models/semantic_models.py +258 -0
  237. crackerjack/models/task.py +19 -3
  238. crackerjack/models/test_models.py +60 -0
  239. crackerjack/monitoring/README.md +11 -0
  240. crackerjack/monitoring/ai_agent_watchdog.py +5 -4
  241. crackerjack/monitoring/metrics_collector.py +4 -3
  242. crackerjack/monitoring/regression_prevention.py +4 -3
  243. crackerjack/monitoring/websocket_server.py +4 -241
  244. crackerjack/orchestration/README.md +340 -0
  245. crackerjack/orchestration/__init__.py +43 -0
  246. crackerjack/orchestration/advanced_orchestrator.py +20 -67
  247. crackerjack/orchestration/cache/README.md +312 -0
  248. crackerjack/orchestration/cache/__init__.py +37 -0
  249. crackerjack/orchestration/cache/memory_cache.py +338 -0
  250. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  251. crackerjack/orchestration/config.py +297 -0
  252. crackerjack/orchestration/coverage_improvement.py +13 -6
  253. crackerjack/orchestration/execution_strategies.py +6 -6
  254. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  255. crackerjack/orchestration/strategies/README.md +401 -0
  256. crackerjack/orchestration/strategies/__init__.py +39 -0
  257. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  258. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  259. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  260. crackerjack/orchestration/test_progress_streamer.py +1 -1
  261. crackerjack/plugins/README.md +11 -0
  262. crackerjack/plugins/hooks.py +3 -2
  263. crackerjack/plugins/loader.py +3 -3
  264. crackerjack/plugins/managers.py +1 -1
  265. crackerjack/py313.py +191 -0
  266. crackerjack/security/README.md +11 -0
  267. crackerjack/services/README.md +374 -0
  268. crackerjack/services/__init__.py +8 -21
  269. crackerjack/services/ai/README.md +295 -0
  270. crackerjack/services/ai/__init__.py +7 -0
  271. crackerjack/services/ai/advanced_optimizer.py +878 -0
  272. crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
  273. crackerjack/services/ai/embeddings.py +444 -0
  274. crackerjack/services/ai/intelligent_commit.py +328 -0
  275. crackerjack/services/ai/predictive_analytics.py +510 -0
  276. crackerjack/services/api_extractor.py +5 -3
  277. crackerjack/services/bounded_status_operations.py +45 -5
  278. crackerjack/services/cache.py +249 -318
  279. crackerjack/services/changelog_automation.py +7 -3
  280. crackerjack/services/command_execution_service.py +305 -0
  281. crackerjack/services/config_integrity.py +83 -39
  282. crackerjack/services/config_merge.py +9 -6
  283. crackerjack/services/config_service.py +198 -0
  284. crackerjack/services/config_template.py +13 -26
  285. crackerjack/services/coverage_badge_service.py +6 -4
  286. crackerjack/services/coverage_ratchet.py +53 -27
  287. crackerjack/services/debug.py +18 -7
  288. crackerjack/services/dependency_analyzer.py +4 -4
  289. crackerjack/services/dependency_monitor.py +13 -13
  290. crackerjack/services/documentation_generator.py +4 -2
  291. crackerjack/services/documentation_service.py +62 -33
  292. crackerjack/services/enhanced_filesystem.py +81 -27
  293. crackerjack/services/enterprise_optimizer.py +1 -1
  294. crackerjack/services/error_pattern_analyzer.py +10 -10
  295. crackerjack/services/file_filter.py +221 -0
  296. crackerjack/services/file_hasher.py +5 -7
  297. crackerjack/services/file_io_service.py +361 -0
  298. crackerjack/services/file_modifier.py +615 -0
  299. crackerjack/services/filesystem.py +80 -109
  300. crackerjack/services/git.py +99 -5
  301. crackerjack/services/health_metrics.py +4 -6
  302. crackerjack/services/heatmap_generator.py +12 -3
  303. crackerjack/services/incremental_executor.py +380 -0
  304. crackerjack/services/initialization.py +101 -49
  305. crackerjack/services/log_manager.py +2 -2
  306. crackerjack/services/logging.py +120 -68
  307. crackerjack/services/lsp_client.py +12 -12
  308. crackerjack/services/memory_optimizer.py +27 -22
  309. crackerjack/services/monitoring/README.md +30 -0
  310. crackerjack/services/monitoring/__init__.py +9 -0
  311. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  312. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  313. crackerjack/services/monitoring/health_metrics.py +716 -0
  314. crackerjack/services/monitoring/metrics.py +587 -0
  315. crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
  316. crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
  317. crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
  318. crackerjack/services/parallel_executor.py +166 -55
  319. crackerjack/services/patterns/__init__.py +142 -0
  320. crackerjack/services/patterns/agents.py +107 -0
  321. crackerjack/services/patterns/code/__init__.py +15 -0
  322. crackerjack/services/patterns/code/detection.py +118 -0
  323. crackerjack/services/patterns/code/imports.py +107 -0
  324. crackerjack/services/patterns/code/paths.py +159 -0
  325. crackerjack/services/patterns/code/performance.py +119 -0
  326. crackerjack/services/patterns/code/replacement.py +36 -0
  327. crackerjack/services/patterns/core.py +212 -0
  328. crackerjack/services/patterns/documentation/__init__.py +14 -0
  329. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  330. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  331. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  332. crackerjack/services/patterns/formatting.py +226 -0
  333. crackerjack/services/patterns/operations.py +339 -0
  334. crackerjack/services/patterns/security/__init__.py +23 -0
  335. crackerjack/services/patterns/security/code_injection.py +122 -0
  336. crackerjack/services/patterns/security/credentials.py +190 -0
  337. crackerjack/services/patterns/security/path_traversal.py +221 -0
  338. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  339. crackerjack/services/patterns/templates.py +62 -0
  340. crackerjack/services/patterns/testing/__init__.py +18 -0
  341. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  342. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  343. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  344. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  345. crackerjack/services/patterns/tool_output/other.py +97 -0
  346. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  347. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  348. crackerjack/services/patterns/url_sanitization.py +114 -0
  349. crackerjack/services/patterns/utilities.py +42 -0
  350. crackerjack/services/patterns/utils.py +339 -0
  351. crackerjack/services/patterns/validation.py +46 -0
  352. crackerjack/services/patterns/versioning.py +62 -0
  353. crackerjack/services/predictive_analytics.py +21 -8
  354. crackerjack/services/profiler.py +280 -0
  355. crackerjack/services/quality/README.md +415 -0
  356. crackerjack/services/quality/__init__.py +11 -0
  357. crackerjack/services/quality/anomaly_detector.py +392 -0
  358. crackerjack/services/quality/pattern_cache.py +333 -0
  359. crackerjack/services/quality/pattern_detector.py +479 -0
  360. crackerjack/services/quality/qa_orchestrator.py +491 -0
  361. crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
  362. crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
  363. crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
  364. crackerjack/services/regex_patterns.py +58 -2987
  365. crackerjack/services/regex_utils.py +55 -29
  366. crackerjack/services/secure_status_formatter.py +42 -15
  367. crackerjack/services/secure_subprocess.py +35 -2
  368. crackerjack/services/security.py +16 -8
  369. crackerjack/services/server_manager.py +40 -51
  370. crackerjack/services/smart_scheduling.py +46 -6
  371. crackerjack/services/status_authentication.py +3 -3
  372. crackerjack/services/thread_safe_status_collector.py +1 -0
  373. crackerjack/services/tool_filter.py +368 -0
  374. crackerjack/services/tool_version_service.py +9 -5
  375. crackerjack/services/unified_config.py +43 -351
  376. crackerjack/services/vector_store.py +689 -0
  377. crackerjack/services/version_analyzer.py +6 -4
  378. crackerjack/services/version_checker.py +14 -8
  379. crackerjack/services/zuban_lsp_service.py +5 -4
  380. crackerjack/slash_commands/README.md +11 -0
  381. crackerjack/slash_commands/init.md +2 -12
  382. crackerjack/slash_commands/run.md +84 -50
  383. crackerjack/tools/README.md +11 -0
  384. crackerjack/tools/__init__.py +30 -0
  385. crackerjack/tools/_git_utils.py +105 -0
  386. crackerjack/tools/check_added_large_files.py +139 -0
  387. crackerjack/tools/check_ast.py +105 -0
  388. crackerjack/tools/check_json.py +103 -0
  389. crackerjack/tools/check_jsonschema.py +297 -0
  390. crackerjack/tools/check_toml.py +103 -0
  391. crackerjack/tools/check_yaml.py +110 -0
  392. crackerjack/tools/codespell_wrapper.py +72 -0
  393. crackerjack/tools/end_of_file_fixer.py +202 -0
  394. crackerjack/tools/format_json.py +128 -0
  395. crackerjack/tools/mdformat_wrapper.py +114 -0
  396. crackerjack/tools/trailing_whitespace.py +198 -0
  397. crackerjack/tools/validate_regex_patterns.py +7 -3
  398. crackerjack/ui/README.md +11 -0
  399. crackerjack/ui/dashboard_renderer.py +28 -0
  400. crackerjack/ui/templates/README.md +11 -0
  401. crackerjack/utils/console_utils.py +13 -0
  402. crackerjack/utils/dependency_guard.py +230 -0
  403. crackerjack/utils/retry_utils.py +275 -0
  404. crackerjack/workflows/README.md +590 -0
  405. crackerjack/workflows/__init__.py +46 -0
  406. crackerjack/workflows/actions.py +811 -0
  407. crackerjack/workflows/auto_fix.py +444 -0
  408. crackerjack/workflows/container_builder.py +499 -0
  409. crackerjack/workflows/definitions.py +443 -0
  410. crackerjack/workflows/engine.py +177 -0
  411. crackerjack/workflows/event_bridge.py +242 -0
  412. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
  413. crackerjack-0.45.2.dist-info/RECORD +478 -0
  414. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  415. crackerjack/managers/test_manager_backup.py +0 -1075
  416. crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
  417. crackerjack/mixins/__init__.py +0 -3
  418. crackerjack/mixins/error_handling.py +0 -145
  419. crackerjack/services/config.py +0 -358
  420. crackerjack/ui/server_panels.py +0 -125
  421. crackerjack-0.37.9.dist-info/RECORD +0 -231
  422. /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
  423. /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
  424. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
  425. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -8,15 +8,13 @@ import typing as t
8
8
  from pathlib import Path
9
9
 
10
10
  import uvicorn
11
- from rich.console import Console
11
+ from acb import console
12
12
 
13
13
  from crackerjack.core.timeout_manager import get_timeout_manager
14
14
 
15
15
  from .app import create_websocket_app
16
16
  from .jobs import JobManager
17
17
 
18
- console = Console()
19
-
20
18
 
21
19
  class WebSocketServer:
22
20
  def __init__(self, port: int = 8675) -> None:
@@ -1,29 +1,108 @@
1
1
  import asyncio
2
2
  import typing as t
3
3
  from contextlib import suppress
4
+ from dataclasses import dataclass
4
5
  from pathlib import Path
5
6
 
7
+ from acb import console
6
8
  from fastapi import FastAPI, WebSocket, WebSocketDisconnect
7
- from rich.console import Console
8
9
 
9
10
  from crackerjack.core.timeout_manager import TimeoutStrategy, get_timeout_manager
10
11
 
11
12
  from .jobs import JobManager
12
13
 
13
- console = Console()
14
+ # console imported from acb
15
+
16
+
17
+ # Phase 9.4: WebSocket Security Configuration
18
+ @dataclass
19
+ class WebSocketSecurityConfig:
20
+ """Security configuration for WebSocket connections.
21
+
22
+ Phase 9.4: Enhanced security hardening for MCP WebSocket server.
23
+ """
24
+
25
+ # Message limits
26
+ max_message_size: int = 1024 * 1024 # 1MB max message size
27
+ max_messages_per_connection: int = 10000 # Max messages before forcing reconnect
28
+ max_concurrent_connections: int = 100 # Limit concurrent WebSocket connections
29
+
30
+ # Origin validation (localhost only for MCP)
31
+ allowed_origins: set[str] | None = None # None = allow all (default for local dev)
32
+
33
+ # Rate limiting
34
+ messages_per_second: int = 100 # Max messages per second per connection
35
+
36
+ def __post_init__(self) -> None:
37
+ """Initialize allowed origins with secure defaults."""
38
+ if self.allowed_origins is None:
39
+ # Default: only allow localhost connections
40
+ self.allowed_origins = {
41
+ "http://localhost",
42
+ "http://127.0.0.1",
43
+ "https://localhost",
44
+ "https://127.0.0.1",
45
+ }
46
+
47
+ def validate_origin(self, origin: str | None) -> bool:
48
+ """Validate WebSocket origin header.
49
+
50
+ Args:
51
+ origin: Origin header value
52
+
53
+ Returns:
54
+ True if origin is allowed, False otherwise
55
+ """
56
+ if not origin:
57
+ # Allow connections without origin (local tools)
58
+ return True
59
+
60
+ # Check against allowed origins
61
+ for allowed in self.allowed_origins or set():
62
+ if origin.startswith(allowed):
63
+ return True
64
+
65
+ console.print(
66
+ f"[red]Rejected WebSocket connection from unauthorized origin: {origin}[/red]"
67
+ )
68
+ return False
14
69
 
15
70
 
16
71
  class WebSocketHandler:
17
- def __init__(self, job_manager: JobManager, progress_dir: Path) -> None:
72
+ def __init__(
73
+ self,
74
+ job_manager: JobManager,
75
+ progress_dir: Path,
76
+ security_config: WebSocketSecurityConfig | None = None,
77
+ event_bridge: t.Any | None = None, # EventBusWebSocketBridge from DI
78
+ ) -> None:
18
79
  self.job_manager = job_manager
19
80
  self.progress_dir = progress_dir
20
81
  self.timeout_manager = get_timeout_manager()
82
+ self.security_config = security_config or WebSocketSecurityConfig()
83
+ self.event_bridge = event_bridge
84
+ self._connection_count = 0
21
85
 
22
86
  async def handle_connection(self, websocket: WebSocket, job_id: str) -> None:
87
+ # Phase 9.4: Security validations
23
88
  if not self.job_manager.validate_job_id(job_id):
24
89
  await websocket.close(code=1008, reason="Invalid job ID")
25
90
  return
26
91
 
92
+ # Check origin header
93
+ origin = websocket.headers.get("origin")
94
+ if not self.security_config.validate_origin(origin):
95
+ await websocket.close(code=1008, reason="Unauthorized origin")
96
+ return
97
+
98
+ # Check connection limit
99
+ if self._connection_count >= self.security_config.max_concurrent_connections:
100
+ await websocket.close(code=1008, reason="Connection limit reached")
101
+ console.print(
102
+ f"[yellow]Connection limit reached: {self._connection_count}[/yellow]"
103
+ )
104
+ return
105
+
27
106
  try:
28
107
  async with self.timeout_manager.timeout_context(
29
108
  "websocket_connection",
@@ -45,8 +124,16 @@ class WebSocketHandler:
45
124
 
46
125
  async def _establish_connection(self, websocket: WebSocket, job_id: str) -> None:
47
126
  await websocket.accept()
127
+ self._connection_count += 1 # Phase 9.4: Track concurrent connections
48
128
  self.job_manager.add_connection(job_id, websocket)
49
- console.print(f"[green]WebSocket connected for job: {job_id}[/green]")
129
+
130
+ # Phase 7.3: Register client with event bridge for real-time updates
131
+ if self.event_bridge:
132
+ await self.event_bridge.register_client(job_id, websocket)
133
+
134
+ console.print(
135
+ f"[green]WebSocket connected for job: {job_id} (connections: {self._connection_count})[/green]"
136
+ )
50
137
 
51
138
  async def _send_initial_progress(self, websocket: WebSocket, job_id: str) -> None:
52
139
  try:
@@ -80,7 +167,9 @@ class WebSocketHandler:
80
167
 
81
168
  async def _handle_message_loop(self, websocket: WebSocket, job_id: str) -> None:
82
169
  message_count = 0
83
- max_messages = 10000
170
+ max_messages = (
171
+ self.security_config.max_messages_per_connection
172
+ ) # Phase 9.4: Use config
84
173
 
85
174
  while message_count < max_messages:
86
175
  try:
@@ -159,6 +248,17 @@ class WebSocketHandler:
159
248
  async def _cleanup_connection(self, job_id: str, websocket: WebSocket) -> None:
160
249
  try:
161
250
  self.job_manager.remove_connection(job_id, websocket)
251
+
252
+ # Phase 7.3: Unregister client from event bridge
253
+ if self.event_bridge:
254
+ await self.event_bridge.unregister_client(job_id, websocket)
255
+
256
+ self._connection_count = max(
257
+ 0, self._connection_count - 1
258
+ ) # Phase 9.4: Decrement count
259
+ console.print(
260
+ f"[yellow]WebSocket disconnected for job: {job_id} (connections: {self._connection_count})[/yellow]"
261
+ )
162
262
  except Exception as e:
163
263
  console.print(f"[red]Error removing connection for {job_id}: {e}[/red]")
164
264
 
@@ -167,8 +267,9 @@ def register_websocket_routes(
167
267
  app: FastAPI,
168
268
  job_manager: JobManager,
169
269
  progress_dir: Path,
270
+ event_bridge: t.Any | None = None, # EventBusWebSocketBridge from DI
170
271
  ) -> None:
171
- handler = WebSocketHandler(job_manager, progress_dir)
272
+ handler = WebSocketHandler(job_manager, progress_dir, event_bridge=event_bridge)
172
273
 
173
274
  @app.websocket("/ws/progress/{job_id}")
174
275
  async def websocket_progress_endpoint(websocket: WebSocket, job_id: str) -> None:
@@ -0,0 +1,308 @@
1
+ # Models
2
+
3
+ > Crackerjack Docs: [Main](<../../README.md>) | [CLAUDE.md](../../docs/guides/CLAUDE.md) | [Models](<./README.md>)
4
+
5
+ Data models, schemas, and protocol definitions for the Crackerjack architecture.
6
+
7
+ ## Overview
8
+
9
+ The models package provides the foundational data structures and protocol-based interfaces that define Crackerjack's architecture. The **protocol-based dependency injection (DI) pattern** is the most critical architectural pattern in Crackerjack, enabling loose coupling, testability, and clean separation of concerns.
10
+
11
+ ## Key Components
12
+
13
+ ### protocols.py - THE MOST CRITICAL FILE
14
+
15
+ **This is the heart of Crackerjack's architecture.** Always import protocols from here, never concrete classes.
16
+
17
+ **Core Service Protocols:**
18
+
19
+ - `ServiceProtocol` - Base protocol for all ACB services with lifecycle management
20
+ - `Console` (ConsoleInterface) - Rich console output interface
21
+ - `TestManagerProtocol` - Test execution and coverage management
22
+ - `HookManager` / `SecurityAwareHookManager` - Pre-commit hook orchestration
23
+ - `CoverageRatchetProtocol` - Coverage baseline tracking
24
+ - `SecurityServiceProtocol` - Security validation and secret detection
25
+
26
+ **Configuration & File System:**
27
+
28
+ - `UnifiedConfigurationServiceProtocol` - Centralized configuration access
29
+ - `FileSystemServiceProtocol` / `EnhancedFileSystemServiceProtocol` - File operations
30
+ - `GitServiceProtocol` / `GitInterface` - Git repository interactions
31
+ - `SmartFileFilterProtocol` - Intelligent file filtering
32
+
33
+ **Quality Assurance:**
34
+
35
+ - `QAAdapterProtocol` - Base protocol for all QA check adapters
36
+ - `QAOrchestratorProtocol` - QA check coordination and execution
37
+
38
+ **Hook Orchestration (Phase 3):**
39
+
40
+ - `ExecutionStrategyProtocol` - Hook execution strategies (parallel/sequential/adaptive)
41
+ - `CacheStrategyProtocol` - Result caching strategies
42
+ - `HookOrchestratorProtocol` - Hook lifecycle and dependency resolution
43
+
44
+ **Performance & Monitoring:**
45
+
46
+ - `PerformanceMonitorProtocol` - Workflow performance tracking
47
+ - `PerformanceBenchmarkProtocol` / `PerformanceBenchmarkServiceProtocol` - Benchmarking
48
+ - `MemoryOptimizerProtocol` - Memory optimization tracking
49
+ - `PerformanceCacheProtocol` - Performance result caching
50
+
51
+ **Agent System (Phase 4):**
52
+
53
+ - `AgentCoordinatorProtocol` - AI agent coordination and issue routing
54
+ - `AgentTrackerProtocol` - Agent execution metrics tracking
55
+ - `AgentDebuggerProtocol` - Agent debugging and activity logging
56
+
57
+ **Orchestration:**
58
+
59
+ - `ServiceWatchdogProtocol` - Service health monitoring and restart
60
+ - `TimeoutManagerProtocol` - Centralized timeout management
61
+ - `ParallelExecutorProtocol` / `ParallelHookExecutorProtocol` - Parallel task execution
62
+ - `AsyncCommandExecutorProtocol` - Async command execution with caching
63
+
64
+ **Publishing & Documentation:**
65
+
66
+ - `PublishManager` - Package publishing and versioning
67
+ - `DocumentationServiceProtocol` - Automated documentation generation
68
+ - `APIExtractorProtocol` / `DocumentationGeneratorProtocol` / `DocumentationValidatorProtocol` - Doc tooling
69
+
70
+ ### Configuration Models
71
+
72
+ **qa_config.py** - Quality assurance configuration:
73
+
74
+ - `QACheckConfig` - Configuration for individual QA checks
75
+ - Check-specific settings (file patterns, timeouts, retries)
76
+ - Pydantic validation for type safety
77
+
78
+ **config.py** - Core configuration models:
79
+
80
+ - Project-wide configuration structures
81
+ - ACB Settings integration
82
+ - Environment-specific overrides
83
+
84
+ **config_adapter.py** - Configuration adapters:
85
+
86
+ - Bridges between different configuration formats
87
+ - Legacy config migration support
88
+
89
+ ### Result Models
90
+
91
+ **qa_results.py** - Quality assurance results:
92
+
93
+ - `QAResult` - Individual check results
94
+ - `QACheckType` - Enumeration of check types
95
+ - Result aggregation structures
96
+
97
+ **results.py** - Execution results:
98
+
99
+ - `ExecutionResult` - Individual execution outcomes
100
+ - `ParallelExecutionResult` - Parallel execution aggregation
101
+ - Performance metrics and timing data
102
+
103
+ **task.py** - Task and hook models:
104
+
105
+ - `HookResult` - Pre-commit hook execution results
106
+ - `SessionTracker` - Session metadata and task tracking
107
+ - Task lifecycle management
108
+
109
+ ### Specialized Models
110
+
111
+ **semantic_models.py** - Semantic analysis models:
112
+
113
+ - Code comprehension structures
114
+ - Semantic analysis results
115
+ - Intelligent refactoring support
116
+
117
+ **resource_protocols.py** - Resource management protocols:
118
+
119
+ - Resource lifecycle interfaces
120
+ - Resource cleanup coordination
121
+
122
+ ## THE MOST CRITICAL PATTERN: Protocol-Based Dependency Injection
123
+
124
+ ### Gold Standard Usage
125
+
126
+ ```python
127
+ # ✅ CORRECT - Always import protocols from models/protocols.py
128
+ from acb.depends import depends, Inject
129
+ from crackerjack.models.protocols import (
130
+ Console,
131
+ TestManagerProtocol,
132
+ SecurityServiceProtocol,
133
+ )
134
+
135
+
136
+ @depends.inject
137
+ def setup_environment(
138
+ console: Inject[Console] = None,
139
+ test_manager: Inject[TestManagerProtocol] = None,
140
+ security: Inject[SecurityServiceProtocol] = None,
141
+ ) -> None:
142
+ """All functions use @depends.inject with protocol-based dependencies."""
143
+ console.print("[green]Environment configured[/green]")
144
+ test_manager.validate_test_environment()
145
+ security.validate_file_safety("/path/to/file")
146
+
147
+
148
+ class MyCoordinator:
149
+ @depends.inject
150
+ def __init__(
151
+ self,
152
+ console: Inject[Console],
153
+ test_manager: Inject[TestManagerProtocol],
154
+ ) -> None:
155
+ """Perfect DI integration with protocol-based dependencies."""
156
+ self.console = console
157
+ self.test_manager = test_manager
158
+ ```
159
+
160
+ ### Anti-Patterns to Avoid
161
+
162
+ ```python
163
+ # ❌ WRONG - Direct class imports (BREAKS ARCHITECTURE)
164
+ from crackerjack.managers.test_manager import TestManager
165
+ from rich.console import Console as RichConsole
166
+
167
+ # ❌ WRONG - Manual fallbacks bypass DI
168
+ self.console = console or Console()
169
+ self.cache = cache or CrackerjackCache()
170
+
171
+ # ❌ WRONG - Factory functions bypass DI
172
+ self.tracker = get_agent_tracker()
173
+ self.timeout_manager = get_timeout_manager()
174
+
175
+ # ❌ WRONG - Direct service instantiation
176
+ self.logger = logging.getLogger(__name__)
177
+ ```
178
+
179
+ ## Why Protocol-Based DI?
180
+
181
+ 1. **Loose Coupling**: Depend on interfaces, not implementations
182
+ 1. **Testability**: Easy to mock with protocol implementations
183
+ 1. **Flexibility**: Swap implementations without changing dependents
184
+ 1. **Type Safety**: Runtime type checking via `@runtime_checkable`
185
+ 1. **Clear Contracts**: Protocol defines exact interface requirements
186
+ 1. **ACB Integration**: Seamless integration with ACB dependency injection
187
+
188
+ ## Usage Examples
189
+
190
+ ### Using Protocols for Type Hints
191
+
192
+ ```python
193
+ from crackerjack.models.protocols import Console, FileSystemServiceProtocol
194
+
195
+
196
+ def process_files(
197
+ console: Console,
198
+ fs: FileSystemServiceProtocol,
199
+ paths: list[Path],
200
+ ) -> bool:
201
+ """Process files with protocol-based dependencies."""
202
+ for path in paths:
203
+ if fs.exists(path):
204
+ content = fs.read_file(path)
205
+ console.print(f"Processing {path}")
206
+ return True
207
+ ```
208
+
209
+ ### Creating Protocol Implementations
210
+
211
+ ```python
212
+ import typing as t
213
+ from crackerjack.models.protocols import ServiceProtocol
214
+
215
+
216
+ @t.runtime_checkable
217
+ class MyServiceProtocol(ServiceProtocol, t.Protocol):
218
+ """Custom service protocol extending base ServiceProtocol."""
219
+
220
+ def custom_operation(self, data: str) -> bool:
221
+ """Custom operation for this service."""
222
+ ...
223
+
224
+
225
+ class MyService:
226
+ """Concrete implementation of MyServiceProtocol."""
227
+
228
+ def initialize(self) -> None:
229
+ """Initialize service."""
230
+ pass
231
+
232
+ def cleanup(self) -> None:
233
+ """Cleanup resources."""
234
+ pass
235
+
236
+ def health_check(self) -> bool:
237
+ """Health check."""
238
+ return True
239
+
240
+ # ... implement all ServiceProtocol methods ...
241
+
242
+ def custom_operation(self, data: str) -> bool:
243
+ """Implementation of custom operation."""
244
+ return True
245
+ ```
246
+
247
+ ### Dependency Injection Integration
248
+
249
+ ```python
250
+ from acb.depends import depends
251
+ from crackerjack.models.protocols import Console, TestManagerProtocol
252
+
253
+ # Register concrete implementation
254
+ depends.set(Console, MyConsoleImplementation())
255
+ depends.set(TestManagerProtocol, MyTestManager())
256
+
257
+
258
+ # Inject in functions/classes
259
+ @depends.inject
260
+ def my_function(
261
+ console: Console = depends(),
262
+ test_manager: TestManagerProtocol = depends(),
263
+ ) -> None:
264
+ """Function with automatic dependency injection."""
265
+ console.print("Running tests...")
266
+ test_manager.run_tests(options)
267
+ ```
268
+
269
+ ## Configuration
270
+
271
+ Models use **Pydantic** for validation and type safety:
272
+
273
+ ```python
274
+ from pydantic import BaseModel, Field
275
+
276
+
277
+ class MyConfig(BaseModel):
278
+ """Example configuration model."""
279
+
280
+ timeout: int = Field(default=300, gt=0, description="Timeout in seconds")
281
+ enabled: bool = Field(default=True, description="Enable feature")
282
+ patterns: list[str] = Field(default_factory=list, description="File patterns")
283
+ ```
284
+
285
+ ## Best Practices
286
+
287
+ 1. **ALWAYS Import Protocols**: Never import concrete classes for dependencies
288
+ 1. **Use @runtime_checkable**: Mark all protocols with `@runtime_checkable`
289
+ 1. **Extend ServiceProtocol**: Base all service protocols on `ServiceProtocol`
290
+ 1. **Use Inject[T]**: Use `Inject[ProtocolType]` type hints for DI parameters
291
+ 1. **Validate with Pydantic**: Use Pydantic models for configuration validation
292
+ 1. **Document Protocols**: Add comprehensive docstrings to protocol methods
293
+ 1. **Type Annotate Everything**: Use Python 3.13+ type hints (`|` unions)
294
+
295
+ ## Related Documentation
296
+
297
+ - [CLAUDE.md](../../docs/guides/CLAUDE.md) - Architecture patterns and DI guidelines
298
+ - [Managers](<../managers/README.md>) - Protocol implementations
299
+ - [Services](<../services/README.md>) - Service layer implementations
300
+ - [Core](<../core/README.md>) - Coordinators and orchestration
301
+ - [COVERAGE_POLICY.md](<../../docs/reference/COVERAGE_POLICY.md>) - Testing requirements
302
+
303
+ ## Future Enhancements
304
+
305
+ - Phase 5: Additional agent system protocols
306
+ - Enhanced validation protocols for AI agent fixes
307
+ - Extended performance monitoring protocols
308
+ - Advanced caching strategy protocols
@@ -10,7 +10,9 @@ from .config import (
10
10
  TestConfig,
11
11
  WorkflowOptions,
12
12
  )
13
- from .protocols import OptionsProtocol
13
+ from .protocols import OptionsProtocol, QAAdapterProtocol, QAOrchestratorProtocol
14
+ from .qa_config import QACheckConfig, QAOrchestratorConfig
15
+ from .qa_results import QACheckType, QAResult, QAResultStatus
14
16
  from .task import HookResult, SessionTracker, TaskStatus
15
17
 
16
18
  __all__ = [
@@ -24,6 +26,13 @@ __all__ = [
24
26
  "OptionsProtocol",
25
27
  "ProgressConfig",
26
28
  "PublishConfig",
29
+ "QAAdapterProtocol",
30
+ "QACheckConfig",
31
+ "QACheckType",
32
+ "QAOrchestratorConfig",
33
+ "QAOrchestratorProtocol",
34
+ "QAResult",
35
+ "QAResultStatus",
27
36
  "SessionTracker",
28
37
  "TaskStatus",
29
38
  "TestConfig",