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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +30 -1
  3. crackerjack/__main__.py +342 -1263
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +27 -5
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/{rust_tool_manager.py → lsp/_manager.py} +3 -3
  27. crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
  28. crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
  29. crackerjack/adapters/refactor/README.md +59 -0
  30. crackerjack/adapters/refactor/__init__.py +12 -0
  31. crackerjack/adapters/refactor/creosote.py +318 -0
  32. crackerjack/adapters/refactor/refurb.py +406 -0
  33. crackerjack/adapters/refactor/skylos.py +494 -0
  34. crackerjack/adapters/sast/README.md +132 -0
  35. crackerjack/adapters/sast/__init__.py +32 -0
  36. crackerjack/adapters/sast/_base.py +201 -0
  37. crackerjack/adapters/sast/bandit.py +423 -0
  38. crackerjack/adapters/sast/pyscn.py +405 -0
  39. crackerjack/adapters/sast/semgrep.py +241 -0
  40. crackerjack/adapters/security/README.md +111 -0
  41. crackerjack/adapters/security/__init__.py +17 -0
  42. crackerjack/adapters/security/gitleaks.py +339 -0
  43. crackerjack/adapters/type/README.md +52 -0
  44. crackerjack/adapters/type/__init__.py +12 -0
  45. crackerjack/adapters/type/pyrefly.py +402 -0
  46. crackerjack/adapters/type/ty.py +402 -0
  47. crackerjack/adapters/type/zuban.py +522 -0
  48. crackerjack/adapters/utility/README.md +51 -0
  49. crackerjack/adapters/utility/__init__.py +10 -0
  50. crackerjack/adapters/utility/checks.py +884 -0
  51. crackerjack/agents/README.md +264 -0
  52. crackerjack/agents/__init__.py +40 -12
  53. crackerjack/agents/base.py +1 -0
  54. crackerjack/agents/claude_code_bridge.py +641 -0
  55. crackerjack/agents/coordinator.py +49 -53
  56. crackerjack/agents/dry_agent.py +187 -3
  57. crackerjack/agents/enhanced_coordinator.py +279 -0
  58. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  59. crackerjack/agents/error_middleware.py +53 -0
  60. crackerjack/agents/formatting_agent.py +6 -8
  61. crackerjack/agents/helpers/__init__.py +9 -0
  62. crackerjack/agents/helpers/performance/__init__.py +22 -0
  63. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  64. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  65. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  66. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  67. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  68. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  69. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  70. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  71. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  72. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  73. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  74. crackerjack/agents/performance_agent.py +121 -1152
  75. crackerjack/agents/refactoring_agent.py +156 -655
  76. crackerjack/agents/semantic_agent.py +479 -0
  77. crackerjack/agents/semantic_helpers.py +356 -0
  78. crackerjack/agents/test_creation_agent.py +19 -1605
  79. crackerjack/api.py +5 -7
  80. crackerjack/cli/README.md +394 -0
  81. crackerjack/cli/__init__.py +1 -1
  82. crackerjack/cli/cache_handlers.py +23 -18
  83. crackerjack/cli/cache_handlers_enhanced.py +1 -4
  84. crackerjack/cli/facade.py +70 -8
  85. crackerjack/cli/formatting.py +13 -0
  86. crackerjack/cli/handlers/__init__.py +85 -0
  87. crackerjack/cli/handlers/advanced.py +103 -0
  88. crackerjack/cli/handlers/ai_features.py +62 -0
  89. crackerjack/cli/handlers/analytics.py +479 -0
  90. crackerjack/cli/handlers/changelog.py +271 -0
  91. crackerjack/cli/handlers/config_handlers.py +16 -0
  92. crackerjack/cli/handlers/coverage.py +84 -0
  93. crackerjack/cli/handlers/documentation.py +280 -0
  94. crackerjack/cli/handlers/main_handlers.py +497 -0
  95. crackerjack/cli/handlers/monitoring.py +371 -0
  96. crackerjack/cli/handlers.py +249 -49
  97. crackerjack/cli/interactive.py +8 -5
  98. crackerjack/cli/options.py +203 -110
  99. crackerjack/cli/semantic_handlers.py +292 -0
  100. crackerjack/cli/version.py +19 -0
  101. crackerjack/code_cleaner.py +60 -24
  102. crackerjack/config/README.md +472 -0
  103. crackerjack/config/__init__.py +256 -0
  104. crackerjack/config/global_lock_config.py +191 -54
  105. crackerjack/config/hooks.py +188 -16
  106. crackerjack/config/loader.py +239 -0
  107. crackerjack/config/settings.py +141 -0
  108. crackerjack/config/tool_commands.py +331 -0
  109. crackerjack/core/README.md +393 -0
  110. crackerjack/core/async_workflow_orchestrator.py +79 -53
  111. crackerjack/core/autofix_coordinator.py +22 -9
  112. crackerjack/core/container.py +10 -9
  113. crackerjack/core/enhanced_container.py +9 -9
  114. crackerjack/core/performance.py +1 -1
  115. crackerjack/core/performance_monitor.py +5 -3
  116. crackerjack/core/phase_coordinator.py +1018 -634
  117. crackerjack/core/proactive_workflow.py +3 -3
  118. crackerjack/core/retry.py +275 -0
  119. crackerjack/core/service_watchdog.py +167 -23
  120. crackerjack/core/session_coordinator.py +187 -382
  121. crackerjack/core/timeout_manager.py +161 -44
  122. crackerjack/core/workflow/__init__.py +21 -0
  123. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  124. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  125. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  126. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  127. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  128. crackerjack/core/workflow_orchestrator.py +1247 -953
  129. crackerjack/data/README.md +11 -0
  130. crackerjack/data/__init__.py +8 -0
  131. crackerjack/data/models.py +79 -0
  132. crackerjack/data/repository.py +210 -0
  133. crackerjack/decorators/README.md +180 -0
  134. crackerjack/decorators/__init__.py +35 -0
  135. crackerjack/decorators/error_handling.py +649 -0
  136. crackerjack/decorators/error_handling_decorators.py +334 -0
  137. crackerjack/decorators/helpers.py +58 -0
  138. crackerjack/decorators/patterns.py +281 -0
  139. crackerjack/decorators/utils.py +58 -0
  140. crackerjack/docs/README.md +11 -0
  141. crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
  142. crackerjack/documentation/README.md +11 -0
  143. crackerjack/documentation/ai_templates.py +1 -1
  144. crackerjack/documentation/dual_output_generator.py +11 -9
  145. crackerjack/documentation/reference_generator.py +104 -59
  146. crackerjack/dynamic_config.py +52 -61
  147. crackerjack/errors.py +1 -1
  148. crackerjack/events/README.md +11 -0
  149. crackerjack/events/__init__.py +16 -0
  150. crackerjack/events/telemetry.py +175 -0
  151. crackerjack/events/workflow_bus.py +346 -0
  152. crackerjack/exceptions/README.md +301 -0
  153. crackerjack/exceptions/__init__.py +5 -0
  154. crackerjack/exceptions/config.py +4 -0
  155. crackerjack/exceptions/tool_execution_error.py +245 -0
  156. crackerjack/executors/README.md +591 -0
  157. crackerjack/executors/__init__.py +2 -0
  158. crackerjack/executors/async_hook_executor.py +539 -77
  159. crackerjack/executors/cached_hook_executor.py +3 -3
  160. crackerjack/executors/hook_executor.py +967 -102
  161. crackerjack/executors/hook_lock_manager.py +31 -22
  162. crackerjack/executors/individual_hook_executor.py +66 -32
  163. crackerjack/executors/lsp_aware_hook_executor.py +136 -57
  164. crackerjack/executors/progress_hook_executor.py +282 -0
  165. crackerjack/executors/tool_proxy.py +23 -7
  166. crackerjack/hooks/README.md +485 -0
  167. crackerjack/hooks/lsp_hook.py +8 -9
  168. crackerjack/intelligence/README.md +557 -0
  169. crackerjack/interactive.py +37 -10
  170. crackerjack/managers/README.md +369 -0
  171. crackerjack/managers/async_hook_manager.py +41 -57
  172. crackerjack/managers/hook_manager.py +449 -79
  173. crackerjack/managers/publish_manager.py +81 -36
  174. crackerjack/managers/test_command_builder.py +290 -12
  175. crackerjack/managers/test_executor.py +93 -8
  176. crackerjack/managers/test_manager.py +1082 -75
  177. crackerjack/managers/test_progress.py +118 -26
  178. crackerjack/mcp/README.md +374 -0
  179. crackerjack/mcp/cache.py +25 -2
  180. crackerjack/mcp/client_runner.py +35 -18
  181. crackerjack/mcp/context.py +9 -9
  182. crackerjack/mcp/dashboard.py +24 -8
  183. crackerjack/mcp/enhanced_progress_monitor.py +34 -23
  184. crackerjack/mcp/file_monitor.py +27 -6
  185. crackerjack/mcp/progress_components.py +45 -34
  186. crackerjack/mcp/progress_monitor.py +6 -9
  187. crackerjack/mcp/rate_limiter.py +11 -7
  188. crackerjack/mcp/server.py +2 -0
  189. crackerjack/mcp/server_core.py +187 -55
  190. crackerjack/mcp/service_watchdog.py +12 -9
  191. crackerjack/mcp/task_manager.py +2 -2
  192. crackerjack/mcp/tools/README.md +27 -0
  193. crackerjack/mcp/tools/__init__.py +2 -0
  194. crackerjack/mcp/tools/core_tools.py +75 -52
  195. crackerjack/mcp/tools/execution_tools.py +87 -31
  196. crackerjack/mcp/tools/intelligence_tools.py +2 -2
  197. crackerjack/mcp/tools/proactive_tools.py +1 -1
  198. crackerjack/mcp/tools/semantic_tools.py +584 -0
  199. crackerjack/mcp/tools/utility_tools.py +180 -132
  200. crackerjack/mcp/tools/workflow_executor.py +87 -46
  201. crackerjack/mcp/websocket/README.md +31 -0
  202. crackerjack/mcp/websocket/app.py +11 -1
  203. crackerjack/mcp/websocket/event_bridge.py +188 -0
  204. crackerjack/mcp/websocket/jobs.py +27 -4
  205. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  206. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  207. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  208. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  209. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  210. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  211. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  212. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  213. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  214. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  215. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  216. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  217. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  218. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  219. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  220. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  221. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  222. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  223. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  224. crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
  225. crackerjack/mcp/websocket/server.py +1 -3
  226. crackerjack/mcp/websocket/websocket_handler.py +107 -6
  227. crackerjack/models/README.md +308 -0
  228. crackerjack/models/__init__.py +10 -1
  229. crackerjack/models/config.py +639 -22
  230. crackerjack/models/config_adapter.py +6 -6
  231. crackerjack/models/protocols.py +1167 -23
  232. crackerjack/models/pydantic_models.py +320 -0
  233. crackerjack/models/qa_config.py +145 -0
  234. crackerjack/models/qa_results.py +134 -0
  235. crackerjack/models/results.py +35 -0
  236. crackerjack/models/semantic_models.py +258 -0
  237. crackerjack/models/task.py +19 -3
  238. crackerjack/models/test_models.py +60 -0
  239. crackerjack/monitoring/README.md +11 -0
  240. crackerjack/monitoring/ai_agent_watchdog.py +5 -4
  241. crackerjack/monitoring/metrics_collector.py +4 -3
  242. crackerjack/monitoring/regression_prevention.py +4 -3
  243. crackerjack/monitoring/websocket_server.py +4 -241
  244. crackerjack/orchestration/README.md +340 -0
  245. crackerjack/orchestration/__init__.py +43 -0
  246. crackerjack/orchestration/advanced_orchestrator.py +20 -67
  247. crackerjack/orchestration/cache/README.md +312 -0
  248. crackerjack/orchestration/cache/__init__.py +37 -0
  249. crackerjack/orchestration/cache/memory_cache.py +338 -0
  250. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  251. crackerjack/orchestration/config.py +297 -0
  252. crackerjack/orchestration/coverage_improvement.py +13 -6
  253. crackerjack/orchestration/execution_strategies.py +6 -6
  254. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  255. crackerjack/orchestration/strategies/README.md +401 -0
  256. crackerjack/orchestration/strategies/__init__.py +39 -0
  257. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  258. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  259. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  260. crackerjack/orchestration/test_progress_streamer.py +1 -1
  261. crackerjack/plugins/README.md +11 -0
  262. crackerjack/plugins/hooks.py +3 -2
  263. crackerjack/plugins/loader.py +3 -3
  264. crackerjack/plugins/managers.py +1 -1
  265. crackerjack/py313.py +191 -0
  266. crackerjack/security/README.md +11 -0
  267. crackerjack/services/README.md +374 -0
  268. crackerjack/services/__init__.py +8 -21
  269. crackerjack/services/ai/README.md +295 -0
  270. crackerjack/services/ai/__init__.py +7 -0
  271. crackerjack/services/ai/advanced_optimizer.py +878 -0
  272. crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
  273. crackerjack/services/ai/embeddings.py +444 -0
  274. crackerjack/services/ai/intelligent_commit.py +328 -0
  275. crackerjack/services/ai/predictive_analytics.py +510 -0
  276. crackerjack/services/api_extractor.py +5 -3
  277. crackerjack/services/bounded_status_operations.py +45 -5
  278. crackerjack/services/cache.py +249 -318
  279. crackerjack/services/changelog_automation.py +7 -3
  280. crackerjack/services/command_execution_service.py +305 -0
  281. crackerjack/services/config_integrity.py +83 -39
  282. crackerjack/services/config_merge.py +9 -6
  283. crackerjack/services/config_service.py +198 -0
  284. crackerjack/services/config_template.py +13 -26
  285. crackerjack/services/coverage_badge_service.py +6 -4
  286. crackerjack/services/coverage_ratchet.py +53 -27
  287. crackerjack/services/debug.py +18 -7
  288. crackerjack/services/dependency_analyzer.py +4 -4
  289. crackerjack/services/dependency_monitor.py +13 -13
  290. crackerjack/services/documentation_generator.py +4 -2
  291. crackerjack/services/documentation_service.py +62 -33
  292. crackerjack/services/enhanced_filesystem.py +81 -27
  293. crackerjack/services/enterprise_optimizer.py +1 -1
  294. crackerjack/services/error_pattern_analyzer.py +10 -10
  295. crackerjack/services/file_filter.py +221 -0
  296. crackerjack/services/file_hasher.py +5 -7
  297. crackerjack/services/file_io_service.py +361 -0
  298. crackerjack/services/file_modifier.py +615 -0
  299. crackerjack/services/filesystem.py +80 -109
  300. crackerjack/services/git.py +99 -5
  301. crackerjack/services/health_metrics.py +4 -6
  302. crackerjack/services/heatmap_generator.py +12 -3
  303. crackerjack/services/incremental_executor.py +380 -0
  304. crackerjack/services/initialization.py +101 -49
  305. crackerjack/services/log_manager.py +2 -2
  306. crackerjack/services/logging.py +120 -68
  307. crackerjack/services/lsp_client.py +12 -12
  308. crackerjack/services/memory_optimizer.py +27 -22
  309. crackerjack/services/monitoring/README.md +30 -0
  310. crackerjack/services/monitoring/__init__.py +9 -0
  311. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  312. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  313. crackerjack/services/monitoring/health_metrics.py +716 -0
  314. crackerjack/services/monitoring/metrics.py +587 -0
  315. crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
  316. crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
  317. crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
  318. crackerjack/services/parallel_executor.py +166 -55
  319. crackerjack/services/patterns/__init__.py +142 -0
  320. crackerjack/services/patterns/agents.py +107 -0
  321. crackerjack/services/patterns/code/__init__.py +15 -0
  322. crackerjack/services/patterns/code/detection.py +118 -0
  323. crackerjack/services/patterns/code/imports.py +107 -0
  324. crackerjack/services/patterns/code/paths.py +159 -0
  325. crackerjack/services/patterns/code/performance.py +119 -0
  326. crackerjack/services/patterns/code/replacement.py +36 -0
  327. crackerjack/services/patterns/core.py +212 -0
  328. crackerjack/services/patterns/documentation/__init__.py +14 -0
  329. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  330. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  331. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  332. crackerjack/services/patterns/formatting.py +226 -0
  333. crackerjack/services/patterns/operations.py +339 -0
  334. crackerjack/services/patterns/security/__init__.py +23 -0
  335. crackerjack/services/patterns/security/code_injection.py +122 -0
  336. crackerjack/services/patterns/security/credentials.py +190 -0
  337. crackerjack/services/patterns/security/path_traversal.py +221 -0
  338. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  339. crackerjack/services/patterns/templates.py +62 -0
  340. crackerjack/services/patterns/testing/__init__.py +18 -0
  341. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  342. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  343. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  344. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  345. crackerjack/services/patterns/tool_output/other.py +97 -0
  346. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  347. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  348. crackerjack/services/patterns/url_sanitization.py +114 -0
  349. crackerjack/services/patterns/utilities.py +42 -0
  350. crackerjack/services/patterns/utils.py +339 -0
  351. crackerjack/services/patterns/validation.py +46 -0
  352. crackerjack/services/patterns/versioning.py +62 -0
  353. crackerjack/services/predictive_analytics.py +21 -8
  354. crackerjack/services/profiler.py +280 -0
  355. crackerjack/services/quality/README.md +415 -0
  356. crackerjack/services/quality/__init__.py +11 -0
  357. crackerjack/services/quality/anomaly_detector.py +392 -0
  358. crackerjack/services/quality/pattern_cache.py +333 -0
  359. crackerjack/services/quality/pattern_detector.py +479 -0
  360. crackerjack/services/quality/qa_orchestrator.py +491 -0
  361. crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
  362. crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
  363. crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
  364. crackerjack/services/regex_patterns.py +58 -2987
  365. crackerjack/services/regex_utils.py +55 -29
  366. crackerjack/services/secure_status_formatter.py +42 -15
  367. crackerjack/services/secure_subprocess.py +35 -2
  368. crackerjack/services/security.py +16 -8
  369. crackerjack/services/server_manager.py +40 -51
  370. crackerjack/services/smart_scheduling.py +46 -6
  371. crackerjack/services/status_authentication.py +3 -3
  372. crackerjack/services/thread_safe_status_collector.py +1 -0
  373. crackerjack/services/tool_filter.py +368 -0
  374. crackerjack/services/tool_version_service.py +9 -5
  375. crackerjack/services/unified_config.py +43 -351
  376. crackerjack/services/vector_store.py +689 -0
  377. crackerjack/services/version_analyzer.py +6 -4
  378. crackerjack/services/version_checker.py +14 -8
  379. crackerjack/services/zuban_lsp_service.py +5 -4
  380. crackerjack/slash_commands/README.md +11 -0
  381. crackerjack/slash_commands/init.md +2 -12
  382. crackerjack/slash_commands/run.md +84 -50
  383. crackerjack/tools/README.md +11 -0
  384. crackerjack/tools/__init__.py +30 -0
  385. crackerjack/tools/_git_utils.py +105 -0
  386. crackerjack/tools/check_added_large_files.py +139 -0
  387. crackerjack/tools/check_ast.py +105 -0
  388. crackerjack/tools/check_json.py +103 -0
  389. crackerjack/tools/check_jsonschema.py +297 -0
  390. crackerjack/tools/check_toml.py +103 -0
  391. crackerjack/tools/check_yaml.py +110 -0
  392. crackerjack/tools/codespell_wrapper.py +72 -0
  393. crackerjack/tools/end_of_file_fixer.py +202 -0
  394. crackerjack/tools/format_json.py +128 -0
  395. crackerjack/tools/mdformat_wrapper.py +114 -0
  396. crackerjack/tools/trailing_whitespace.py +198 -0
  397. crackerjack/tools/validate_regex_patterns.py +7 -3
  398. crackerjack/ui/README.md +11 -0
  399. crackerjack/ui/dashboard_renderer.py +28 -0
  400. crackerjack/ui/templates/README.md +11 -0
  401. crackerjack/utils/console_utils.py +13 -0
  402. crackerjack/utils/dependency_guard.py +230 -0
  403. crackerjack/utils/retry_utils.py +275 -0
  404. crackerjack/workflows/README.md +590 -0
  405. crackerjack/workflows/__init__.py +46 -0
  406. crackerjack/workflows/actions.py +811 -0
  407. crackerjack/workflows/auto_fix.py +444 -0
  408. crackerjack/workflows/container_builder.py +499 -0
  409. crackerjack/workflows/definitions.py +443 -0
  410. crackerjack/workflows/engine.py +177 -0
  411. crackerjack/workflows/event_bridge.py +242 -0
  412. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
  413. crackerjack-0.45.2.dist-info/RECORD +478 -0
  414. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  415. crackerjack/managers/test_manager_backup.py +0 -1075
  416. crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
  417. crackerjack/mixins/__init__.py +0 -3
  418. crackerjack/mixins/error_handling.py +0 -145
  419. crackerjack/services/config.py +0 -358
  420. crackerjack/ui/server_panels.py +0 -125
  421. crackerjack-0.37.9.dist-info/RECORD +0 -231
  422. /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
  423. /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
  424. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
  425. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,12 +1,17 @@
1
1
  import subprocess
2
2
  import time
3
3
  import typing as t
4
+ from contextlib import suppress
4
5
  from pathlib import Path
5
6
  from typing import Final
7
+ from uuid import UUID, uuid4
6
8
 
7
- from rich.console import Console
9
+ from acb import console as acb_console
10
+ from acb.depends import depends
11
+ from mcp_common.ui import ServerPanels
8
12
 
9
- from ..ui.server_panels import create_server_panels
13
+ # Get the actual Console instance
14
+ console = acb_console.console
10
15
 
11
16
  try:
12
17
  import tomli
@@ -21,8 +26,20 @@ except ImportError:
21
26
  _mcp_available = False
22
27
  FastMCP = None # type: ignore[misc,assignment,no-redef]
23
28
 
29
+ # Import FastMCP rate limiting middleware (Phase 3 Security Hardening)
30
+ try:
31
+ from fastmcp.server.middleware.rate_limiting import RateLimitingMiddleware
32
+
33
+ RATE_LIMITING_AVAILABLE = True
34
+ except ImportError:
35
+ RATE_LIMITING_AVAILABLE = False
36
+
24
37
  MCP_AVAILABLE: Final[bool] = _mcp_available
25
38
 
39
+ # Phase 9.1: ACB Integration - Module registration for dependency injection
40
+ MODULE_ID: Final[UUID] = uuid4()
41
+ MODULE_STATUS: Final[str] = "stable"
42
+
26
43
  from .context import (
27
44
  MCPServerConfig,
28
45
  MCPServerContext,
@@ -38,10 +55,11 @@ from .tools import (
38
55
  register_monitoring_tools,
39
56
  register_proactive_tools,
40
57
  register_progress_tools,
58
+ register_semantic_tools,
41
59
  register_utility_tools,
42
60
  )
43
61
 
44
- console = Console()
62
+ # console imported from acb
45
63
 
46
64
 
47
65
  def _load_mcp_config(project_path: Path) -> dict[str, t.Any]:
@@ -128,9 +146,22 @@ def create_mcp_server(config: dict[str, t.Any] | None = None) -> t.Any | None:
128
146
 
129
147
  mcp_app = FastMCP("crackerjack-mcp-server", streamable_http_path="/mcp")
130
148
 
149
+ # Add rate limiting middleware (Phase 3 Security Hardening)
150
+ if RATE_LIMITING_AVAILABLE:
151
+ rate_limiter = RateLimitingMiddleware(
152
+ max_requests_per_second=12.0, # Sustainable rate for code quality operations
153
+ burst_capacity=35, # Allow bursts for test/lint operations
154
+ global_limit=True, # Protect the crackerjack server globally
155
+ )
156
+ # Use public API (Phase 3.1 C1 fix: standardize middleware access)
157
+ mcp_app.add_middleware(rate_limiter)
158
+
131
159
  from crackerjack.slash_commands import get_slash_command_path
132
160
 
133
- @mcp_app.prompt("run")
161
+ @mcp_app.prompt(
162
+ "run",
163
+ description="Run Crackerjack quality checks with customizable options (hooks, tests, AI fixing)",
164
+ )
134
165
  async def get_crackerjack_run_prompt() -> str:
135
166
  try:
136
167
  command_path = get_slash_command_path("run")
@@ -139,7 +170,10 @@ def create_mcp_server(config: dict[str, t.Any] | None = None) -> t.Any | None:
139
170
  msg = f"Failed to read run command: {e}"
140
171
  raise ValueError(msg)
141
172
 
142
- @mcp_app.prompt("init")
173
+ @mcp_app.prompt(
174
+ "init",
175
+ description="Initialize Crackerjack in a new project (creates pyproject.toml config, pre-commit hooks)",
176
+ )
143
177
  async def get_crackerjack_init_prompt() -> str:
144
178
  try:
145
179
  command_path = get_slash_command_path("init")
@@ -148,7 +182,10 @@ def create_mcp_server(config: dict[str, t.Any] | None = None) -> t.Any | None:
148
182
  msg = f"Failed to read init command: {e}"
149
183
  raise ValueError(msg)
150
184
 
151
- @mcp_app.prompt("status")
185
+ @mcp_app.prompt(
186
+ "status",
187
+ description="Get comprehensive Crackerjack status (hooks, coverage, git state, server health)",
188
+ )
152
189
  async def get_crackerjack_status_prompt() -> str:
153
190
  try:
154
191
  command_path = get_slash_command_path("status")
@@ -163,6 +200,7 @@ def create_mcp_server(config: dict[str, t.Any] | None = None) -> t.Any | None:
163
200
  register_monitoring_tools(mcp_app)
164
201
  register_progress_tools(mcp_app)
165
202
  register_proactive_tools(mcp_app)
203
+ register_semantic_tools(mcp_app)
166
204
  register_utility_tools(mcp_app)
167
205
 
168
206
  return mcp_app
@@ -181,7 +219,7 @@ def handle_mcp_server_command(
181
219
 
182
220
  try:
183
221
  result = subprocess.run(
184
- ["pkill", "- f", "crackerjack - mcp-server"],
222
+ ["pkill", "-f", "crackerjack-mcp-server"],
185
223
  check=False,
186
224
  capture_output=True,
187
225
  text=True,
@@ -261,8 +299,6 @@ def _print_server_info(
261
299
  websocket_port: int | None,
262
300
  http_mode: bool,
263
301
  ) -> None:
264
- panels = create_server_panels(console)
265
-
266
302
  if mcp_config.get("http_enabled", False) or http_mode:
267
303
  mode = "HTTP"
268
304
  http_endpoint = (
@@ -271,12 +307,19 @@ def _print_server_info(
271
307
  else:
272
308
  mode = "STDIO"
273
309
  http_endpoint = None
274
-
275
- panels.start_panel(
276
- project_path=project_path,
277
- mode=mode,
278
- http_endpoint=http_endpoint,
279
- websocket_port=websocket_port,
310
+ # Use mcp-common ServerPanels info panel
311
+ items: dict[str, str] = {
312
+ "Project": project_path.name,
313
+ "Mode": mode,
314
+ }
315
+ if http_endpoint:
316
+ items["HTTP"] = http_endpoint
317
+ if websocket_port:
318
+ items["WebSocket Port"] = str(websocket_port)
319
+ ServerPanels.info(
320
+ title="Server Configuration",
321
+ message="Starting Crackerjack MCP Server...",
322
+ items=items,
280
323
  )
281
324
 
282
325
 
@@ -300,6 +343,73 @@ def _run_mcp_server(
300
343
  raise
301
344
 
302
345
 
346
+ def _initialize_project_and_config(
347
+ project_path_arg: str,
348
+ http_port: int | None,
349
+ http_mode: bool,
350
+ ) -> tuple[Path, dict[str, t.Any]]:
351
+ """Initialize project path and config."""
352
+ project_path = Path(project_path_arg).resolve()
353
+ mcp_config = _load_mcp_config(project_path)
354
+ mcp_config = _merge_config_with_args(mcp_config, http_port, http_mode)
355
+ return project_path, mcp_config
356
+
357
+
358
+ def _create_and_validate_server(mcp_config: dict[str, t.Any]) -> t.Any | None:
359
+ """Create and validate the MCP server."""
360
+ mcp_app = create_mcp_server(mcp_config)
361
+ if not mcp_app:
362
+ console.print("[red]Failed to create MCP server[/ red]")
363
+ return mcp_app
364
+
365
+
366
+ def _start_websocket_if_needed(websocket_port: int | None) -> None:
367
+ """Start WebSocket server if needed."""
368
+ if websocket_port:
369
+ import asyncio
370
+
371
+ try:
372
+ asyncio.run(_start_websocket_server())
373
+ console.print(
374
+ f"[green]✅ WebSocket server auto-started on port {websocket_port}[/green]"
375
+ )
376
+ except Exception as e:
377
+ console.print(f"[yellow]⚠️ WebSocket server auto-start failed: {e}[/yellow]")
378
+
379
+
380
+ def _show_server_startup_info(
381
+ project_path: Path,
382
+ mcp_config: dict[str, t.Any],
383
+ websocket_port: int | None,
384
+ http_mode: bool,
385
+ ) -> None:
386
+ """Show server startup information."""
387
+ _print_server_info(project_path, mcp_config, websocket_port, http_mode)
388
+
389
+ # Show final success panel before starting the server
390
+ if mcp_config.get("http_enabled", False) or http_mode:
391
+ http_endpoint = (
392
+ f"http://{mcp_config['http_host']}:{mcp_config['http_port']}/mcp"
393
+ )
394
+ else:
395
+ http_endpoint = None
396
+
397
+ websocket_monitor = f"ws://127.0.0.1:{websocket_port}" if websocket_port else None
398
+
399
+ # Final startup success panel via mcp-common
400
+ if websocket_monitor:
401
+ ServerPanels.startup_success(
402
+ server_name="Crackerjack MCP",
403
+ endpoint=http_endpoint,
404
+ websocket_monitor=websocket_monitor, # type: ignore[arg-type]
405
+ )
406
+ else:
407
+ ServerPanels.startup_success(
408
+ server_name="Crackerjack MCP",
409
+ endpoint=http_endpoint,
410
+ )
411
+
412
+
303
413
  def main(
304
414
  project_path_arg: str = ".",
305
415
  websocket_port: int | None = None,
@@ -310,53 +420,19 @@ def main(
310
420
  return
311
421
 
312
422
  try:
313
- project_path = Path(project_path_arg).resolve()
314
-
315
- mcp_config = _load_mcp_config(project_path)
316
- mcp_config = _merge_config_with_args(mcp_config, http_port, http_mode)
423
+ project_path, mcp_config = _initialize_project_and_config(
424
+ project_path_arg, http_port, http_mode
425
+ )
317
426
 
318
427
  _setup_server_context(project_path, websocket_port)
319
428
 
320
- mcp_app = create_mcp_server(mcp_config)
429
+ mcp_app = _create_and_validate_server(mcp_config)
321
430
  if not mcp_app:
322
- console.print("[red]Failed to create MCP server[/ red]")
323
431
  return
324
432
 
325
- _print_server_info(project_path, mcp_config, websocket_port, http_mode)
326
-
327
- # Auto-start WebSocket server if websocket_port is specified
328
- if websocket_port:
329
- import asyncio
330
-
331
- try:
332
- asyncio.run(_start_websocket_server())
333
- console.print(
334
- f"[green]✅ WebSocket server auto-started on port {websocket_port}[/green]"
335
- )
336
- except Exception as e:
337
- console.print(
338
- f"[yellow]⚠️ WebSocket server auto-start failed: {e}[/yellow]"
339
- )
340
-
341
- # Show final success panel before starting the server
342
- panels = create_server_panels(console)
343
-
344
- if mcp_config.get("http_enabled", False) or http_mode:
345
- http_endpoint = (
346
- f"http://{mcp_config['http_host']}:{mcp_config['http_port']}/mcp"
347
- )
348
- else:
349
- http_endpoint = None
350
-
351
- websocket_monitor = (
352
- f"ws://127.0.0.1:{websocket_port}" if websocket_port else None
353
- )
433
+ _show_server_startup_info(project_path, mcp_config, websocket_port, http_mode)
354
434
 
355
- panels.success_panel(
356
- http_endpoint=http_endpoint,
357
- websocket_monitor=websocket_monitor,
358
- process_id=None, # Will be set by the process manager
359
- )
435
+ _start_websocket_if_needed(websocket_port)
360
436
 
361
437
  _run_mcp_server(mcp_app, mcp_config, http_mode)
362
438
 
@@ -392,3 +468,59 @@ if __name__ == "__main__":
392
468
  http_port = int(sys.argv[port_idx + 1])
393
469
 
394
470
  main(project_path, websocket_port, http_mode, http_port)
471
+
472
+
473
+ # Phase 9.1: ACB Integration - Service wrapper for dependency injection
474
+ class MCPServerService:
475
+ """Service wrapper for MCP server to enable ACB dependency injection.
476
+
477
+ This class wraps the MCP server creation and management functions,
478
+ providing a clean interface for dependency injection via ACB.
479
+ """
480
+
481
+ def __init__(self) -> None:
482
+ """Initialize MCP server service."""
483
+ self.module_id = MODULE_ID
484
+ self.module_status = MODULE_STATUS
485
+
486
+ def create_server(self, config: dict[str, t.Any] | None = None) -> t.Any | None:
487
+ """Create MCP server instance with optional configuration.
488
+
489
+ Args:
490
+ config: Server configuration dictionary
491
+
492
+ Returns:
493
+ FastMCP server instance or None if MCP unavailable
494
+ """
495
+ return create_mcp_server(config)
496
+
497
+ def start_server(
498
+ self,
499
+ project_path: str = ".",
500
+ websocket_port: int | None = None,
501
+ http_mode: bool = False,
502
+ http_port: int | None = None,
503
+ ) -> None:
504
+ """Start MCP server with specified configuration.
505
+
506
+ Args:
507
+ project_path: Path to project directory
508
+ websocket_port: Optional WebSocket server port
509
+ http_mode: Enable HTTP mode instead of STDIO
510
+ http_port: Optional HTTP server port
511
+ """
512
+ main(project_path, websocket_port, http_mode, http_port)
513
+
514
+ @property
515
+ def is_available(self) -> bool:
516
+ """Check if MCP server functionality is available.
517
+
518
+ Returns:
519
+ True if FastMCP library is installed and available
520
+ """
521
+ return MCP_AVAILABLE
522
+
523
+
524
+ # Phase 9.1: ACB Integration - Register service with dependency injection system
525
+ with suppress(Exception):
526
+ depends.set(MCPServerService)
@@ -3,15 +3,14 @@ import socket
3
3
  import subprocess
4
4
  import sys
5
5
  import time
6
+ from contextlib import suppress
6
7
  from typing import Any
7
8
 
8
9
  import aiohttp
9
- from rich.console import Console
10
+ from acb import console
11
+ from rich.panel import Panel
10
12
  from rich.table import Table
11
13
 
12
- console = Console()
13
-
14
-
15
14
  watchdog_event_queue: asyncio.Queue[dict[str, Any]] | None = None
16
15
 
17
16
 
@@ -34,7 +33,7 @@ class ServiceConfig:
34
33
  self.max_restarts = max_restarts
35
34
  self.restart_window = restart_window
36
35
 
37
- self.process: subprocess.Popen[bytes] | None = None
36
+ self.process: subprocess.Popen[str] | None = None
38
37
  self.restart_count = 0
39
38
  self.restart_timestamps: list[float] = []
40
39
  self.last_health_check = 0.0
@@ -125,7 +124,7 @@ class ServiceWatchdog:
125
124
  return False
126
125
 
127
126
  async def _launch_service_process(self, service: ServiceConfig) -> bool:
128
- service.process = subprocess.Popen(
127
+ service.process = subprocess.Popen[str](
129
128
  service.command,
130
129
  stdout=subprocess.PIPE,
131
130
  stderr=subprocess.PIPE,
@@ -137,6 +136,8 @@ class ServiceWatchdog:
137
136
  return await self._check_process_startup_success(service)
138
137
 
139
138
  async def _check_process_startup_success(self, service: ServiceConfig) -> bool:
139
+ if service.process is None:
140
+ return False
140
141
  exit_code = service.process.poll()
141
142
  if exit_code is not None:
142
143
  return await self._handle_process_died(service, exit_code)
@@ -147,6 +148,8 @@ class ServiceWatchdog:
147
148
  service: ServiceConfig,
148
149
  exit_code: int,
149
150
  ) -> bool:
151
+ if service.process is None:
152
+ return False
150
153
  stdout, stderr = service.process.communicate()
151
154
  error_msg = f"Process died (exit: {exit_code})"
152
155
  if stderr and stderr.strip():
@@ -402,7 +405,9 @@ class ServiceWatchdog:
402
405
 
403
406
  table.add_row(service.name, status, health, restarts, error)
404
407
 
405
- console.print(table)
408
+ console.print(
409
+ Panel(table, title="Crackerjack Service Watchdog", border_style="cyan")
410
+ )
406
411
  console.print("\n[dim]Press Ctrl + C to stop monitoring[/ dim]")
407
412
 
408
413
  def _create_status_table(self) -> Table:
@@ -441,8 +446,6 @@ class ServiceWatchdog:
441
446
  message: str,
442
447
  ) -> None:
443
448
  if self.event_queue:
444
- from contextlib import suppress
445
-
446
449
  with suppress(Exception):
447
450
  event = {
448
451
  "type": event_type,
@@ -5,9 +5,9 @@ import typing as t
5
5
  from contextlib import asynccontextmanager, suppress
6
6
  from dataclasses import dataclass
7
7
 
8
- from rich.console import Console
8
+ from acb import console
9
9
 
10
- console = Console()
10
+ # console imported from acb
11
11
  logger = logging.getLogger(__name__)
12
12
 
13
13
 
@@ -0,0 +1,27 @@
1
+ # MCP Tools
2
+
3
+ MCP tool definitions and adapters for the Crackerjack MCP server.
4
+
5
+ ## Tool Categories
6
+
7
+ - **`execution_tools.py`** - Execute crackerjack workflows, get job progress
8
+ - **`monitoring_tools.py`** - System health, status reporting, workflow monitoring
9
+ - **`progress_tools.py`** - Real-time progress tracking for test execution
10
+ - **`semantic_tools.py`** - Semantic search, file indexing, embeddings
11
+ - **`intelligence_tools.py`** - AI agent selection, recommendations, performance analysis
12
+ - **`error_analyzer.py`** - Smart error analysis and pattern detection
13
+ - **`proactive_tools.py`** - Proactive monitoring and preventive quality checks
14
+ - **`utility_tools.py`** - Helper utilities and common operations
15
+ - **`workflow_executor.py`** - Workflow orchestration and execution management
16
+
17
+ ## Core Tools
18
+
19
+ The MCP server provides these primary capabilities:
20
+
21
+ 1. **Workflow Execution** - Run crackerjack quality checks via MCP
22
+ 1. **Job Tracking** - Monitor async job progress and status
23
+ 1. **Error Analysis** - Intelligent error detection and root cause analysis
24
+ 1. **Semantic Search** - Code search with vector embeddings
25
+ 1. **Agent Intelligence** - Smart agent selection based on task context
26
+
27
+ See parent `mcp/README.md` for server architecture details.
@@ -4,6 +4,7 @@ from .intelligence_tool_registry import register_intelligence_tools
4
4
  from .monitoring_tools import register_monitoring_tools
5
5
  from .proactive_tools import register_proactive_tools
6
6
  from .progress_tools import register_progress_tools
7
+ from .semantic_tools import register_semantic_tools
7
8
  from .utility_tools import register_utility_tools
8
9
 
9
10
  __all__ = [
@@ -13,5 +14,6 @@ __all__ = [
13
14
  "register_monitoring_tools",
14
15
  "register_progress_tools",
15
16
  "register_proactive_tools",
17
+ "register_semantic_tools",
16
18
  "register_utility_tools",
17
19
  ]