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
@@ -0,0 +1,400 @@
1
+ """Security and quality gates for workflow publishing.
2
+
3
+ Ensures security standards are met before allowing publishing operations.
4
+ Extracted from WorkflowPipeline to improve modularity and maintainability.
5
+
6
+ This module handles:
7
+ - Security gate validation for publishing workflows
8
+ - Critical security failure detection (bandit, pyright, gitleaks)
9
+ - AI-assisted security issue resolution
10
+ - Hook result extraction and validation
11
+ - Security audit warnings and recommendations
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import typing as t
17
+
18
+ from acb.console import Console
19
+ from acb.depends import Inject, depends
20
+
21
+ from crackerjack.models.protocols import LoggerProtocol
22
+
23
+ if t.TYPE_CHECKING:
24
+ from crackerjack.core.session_coordinator import SessionCoordinator
25
+ from crackerjack.core.workflow_orchestrator import WorkflowPipeline
26
+ from crackerjack.models.protocols import OptionsProtocol
27
+
28
+
29
+ class WorkflowSecurityGates:
30
+ """Manages security and quality gates for workflow operations.
31
+
32
+ This class encapsulates all security-related validation logic for workflow
33
+ publishing, including:
34
+ - Pre-publishing security checks
35
+ - Critical security failure detection
36
+ - AI-assisted security remediation
37
+ - Security audit reporting
38
+
39
+ The class uses protocol-based dependency injection following ACB patterns
40
+ and maintains a reference to the workflow orchestrator for AI fixing callbacks.
41
+ """
42
+
43
+ @depends.inject
44
+ def __init__(
45
+ self,
46
+ console: Inject[Console],
47
+ logger: Inject[LoggerProtocol],
48
+ pipeline: WorkflowPipeline | None = None,
49
+ ) -> None:
50
+ """Initialize security gates with injected dependencies.
51
+
52
+ Args:
53
+ console: Console for user output
54
+ logger: Logger for diagnostic messages
55
+ pipeline: Workflow orchestrator for AI fixing callbacks (set after init)
56
+ """
57
+ self.console = console
58
+ self.logger = logger
59
+ self._pipeline = pipeline
60
+ self._last_security_audit: t.Any = None
61
+
62
+ @property
63
+ def session(self) -> SessionCoordinator:
64
+ """Get session coordinator from pipeline."""
65
+ if self._pipeline is None:
66
+ raise RuntimeError("Pipeline not set - call set_pipeline() first")
67
+ return self._pipeline.session
68
+
69
+ def set_pipeline(self, pipeline: WorkflowPipeline) -> None:
70
+ """Set the workflow pipeline reference.
71
+
72
+ This is called after initialization to avoid circular dependencies.
73
+
74
+ Args:
75
+ pipeline: The workflow orchestrator instance
76
+ """
77
+ self._pipeline = pipeline
78
+
79
+ def _show_partial_success_warning_if_needed(
80
+ self,
81
+ publishing_requested: bool,
82
+ final_success: bool,
83
+ testing_passed: bool,
84
+ comprehensive_passed: bool,
85
+ ) -> None:
86
+ """Show security audit warning if publishing with partial success.
87
+
88
+ Args:
89
+ publishing_requested: Whether publishing was requested
90
+ final_success: Whether the workflow succeeded overall
91
+ testing_passed: Whether tests passed
92
+ comprehensive_passed: Whether comprehensive hooks passed
93
+ """
94
+ should_show_warning = (
95
+ publishing_requested
96
+ and final_success
97
+ and not (testing_passed and comprehensive_passed)
98
+ )
99
+
100
+ if should_show_warning:
101
+ self._show_security_audit_warning()
102
+
103
+ def _check_security_gates_for_publishing(
104
+ self, options: OptionsProtocol
105
+ ) -> tuple[bool, bool]:
106
+ """Check if security gates allow publishing.
107
+
108
+ Args:
109
+ options: Workflow configuration options
110
+
111
+ Returns:
112
+ Tuple of (publishing_requested, security_blocks_publishing)
113
+ """
114
+ publishing_requested = bool(options.publish or options.all)
115
+
116
+ if not publishing_requested:
117
+ return False, False
118
+
119
+ try:
120
+ security_blocks_publishing = self._check_security_critical_failures()
121
+ return publishing_requested, security_blocks_publishing
122
+ except Exception as e:
123
+ self.logger.warning(f"Security check failed: {e} - blocking publishing")
124
+ self.console.print(
125
+ "[red]🔒 SECURITY CHECK FAILED: Unable to verify security status - publishing BLOCKED[/red]"
126
+ )
127
+
128
+ return publishing_requested, True
129
+
130
+ async def _handle_security_gate_failure(
131
+ self, options: OptionsProtocol, allow_ai_fixing: bool = False
132
+ ) -> bool:
133
+ """Handle security gate failure with optional AI assistance.
134
+
135
+ Args:
136
+ options: Workflow configuration options
137
+ allow_ai_fixing: Whether to attempt AI-assisted fixing
138
+
139
+ Returns:
140
+ True if security issues were resolved, False otherwise
141
+ """
142
+ self._display_security_gate_failure_message()
143
+
144
+ if allow_ai_fixing:
145
+ return await self._attempt_ai_assisted_security_fix(options)
146
+ return self._handle_manual_security_fix()
147
+
148
+ def _display_security_gate_failure_message(self) -> None:
149
+ """Display initial security gate failure message."""
150
+ self.console.print(
151
+ "[red]🔒 SECURITY GATE: Critical security checks failed[/red]"
152
+ )
153
+
154
+ async def _attempt_ai_assisted_security_fix(self, options: OptionsProtocol) -> bool:
155
+ """Attempt to fix security issues using AI assistance.
156
+
157
+ Args:
158
+ options: Configuration options
159
+
160
+ Returns:
161
+ True if security issues were resolved, False otherwise
162
+ """
163
+ if self._pipeline is None:
164
+ raise RuntimeError("Pipeline not set - cannot perform AI fixing")
165
+
166
+ self._display_ai_fixing_messages()
167
+
168
+ ai_fix_success = await self._pipeline._run_ai_agent_fixing_phase(options)
169
+ if ai_fix_success:
170
+ return self._verify_security_fix_success()
171
+
172
+ return False
173
+
174
+ def _display_ai_fixing_messages(self) -> None:
175
+ """Display messages about AI-assisted security fixing."""
176
+ self.console.print(
177
+ "[red]Security-critical hooks (bandit, pyright, gitleaks) must pass before publishing[/red]"
178
+ )
179
+ self.console.print(
180
+ "[yellow]🤖 Attempting AI-assisted security issue resolution...[/yellow]"
181
+ )
182
+
183
+ def _verify_security_fix_success(self) -> bool:
184
+ """Verify that AI fixes resolved the security issues.
185
+
186
+ Returns:
187
+ True if security issues were resolved, False otherwise
188
+ """
189
+ try:
190
+ security_still_blocks = self._check_security_critical_failures()
191
+ if not security_still_blocks:
192
+ self.console.print(
193
+ "[green]✅ AI agents resolved security issues - publishing allowed[/green]"
194
+ )
195
+ return True
196
+ else:
197
+ self.console.print(
198
+ "[red]🔒 Security issues persist after AI fixing - publishing still BLOCKED[/red]"
199
+ )
200
+ return False
201
+ except Exception as e:
202
+ self.logger.warning(f"Security re-check failed: {e} - blocking publishing")
203
+ return False
204
+
205
+ def _handle_manual_security_fix(self) -> bool:
206
+ """Handle security fix when AI assistance is not allowed.
207
+
208
+ Returns:
209
+ Always False since manual intervention is required
210
+ """
211
+ self.console.print(
212
+ "[red]Security-critical hooks (bandit, pyright, gitleaks) must pass before publishing[/red]"
213
+ )
214
+ return False
215
+
216
+ def _check_security_critical_failures(self) -> bool:
217
+ """Check for critical security failures in hook results.
218
+
219
+ Returns:
220
+ True if critical security failures exist, False otherwise
221
+
222
+ Raises:
223
+ Exception: If security audit fails (fail securely)
224
+ """
225
+ try:
226
+ from crackerjack.security.audit import SecurityAuditor
227
+
228
+ auditor = SecurityAuditor()
229
+
230
+ fast_results = self._get_recent_fast_hook_results()
231
+ comprehensive_results = self._get_recent_comprehensive_hook_results()
232
+
233
+ audit_report = auditor.audit_hook_results(
234
+ fast_results, comprehensive_results
235
+ )
236
+
237
+ self._last_security_audit = audit_report
238
+
239
+ return audit_report.has_critical_failures
240
+
241
+ except Exception as e:
242
+ self.logger.warning(f"Security audit failed: {e} - failing securely")
243
+
244
+ raise
245
+
246
+ def _get_recent_fast_hook_results(self) -> list[t.Any]:
247
+ """Get recent fast hook results from session.
248
+
249
+ Returns:
250
+ List of fast hook results, or mock results if unavailable
251
+ """
252
+ results = self._extract_hook_results_from_session("fast_hooks")
253
+
254
+ if not results:
255
+ results = self._create_mock_hook_results(["gitleaks"])
256
+
257
+ return results
258
+
259
+ def _extract_hook_results_from_session(self, hook_type: str) -> list[t.Any]:
260
+ """Extract hook results from session tracker.
261
+
262
+ Args:
263
+ hook_type: Type of hooks to extract (e.g., "fast_hooks", "comprehensive_hooks")
264
+
265
+ Returns:
266
+ List of hook results
267
+ """
268
+ results: list[t.Any] = []
269
+
270
+ session_tracker = self._get_session_tracker()
271
+ if not session_tracker:
272
+ return results
273
+
274
+ for task_id, task_data in session_tracker.tasks.items():
275
+ if task_id == hook_type and hasattr(task_data, "hook_results"):
276
+ if task_data.hook_results:
277
+ results.extend(task_data.hook_results)
278
+
279
+ return results
280
+
281
+ def _get_session_tracker(self) -> t.Any | None:
282
+ """Get session tracker from session coordinator.
283
+
284
+ Returns:
285
+ Session tracker if available, None otherwise
286
+ """
287
+ return (
288
+ getattr(self.session, "session_tracker", None)
289
+ if hasattr(self.session, "session_tracker")
290
+ else None
291
+ )
292
+
293
+ def _create_mock_hook_results(self, critical_hooks: list[str]) -> list[t.Any]:
294
+ """Create mock hook results for critical hooks.
295
+
296
+ Args:
297
+ critical_hooks: List of critical hook names
298
+
299
+ Returns:
300
+ List of mock hook result objects
301
+ """
302
+ results: list[t.Any] = []
303
+
304
+ for hook_name in critical_hooks:
305
+ mock_result = self._create_mock_hook_result(hook_name)
306
+ results.append(mock_result)
307
+
308
+ return results
309
+
310
+ def _create_mock_hook_result(self, hook_name: str) -> t.Any:
311
+ """Create a mock hook result object.
312
+
313
+ Args:
314
+ hook_name: Name of the hook
315
+
316
+ Returns:
317
+ Mock result object with name, status, and output attributes
318
+ """
319
+ return type(
320
+ "MockResult",
321
+ (),
322
+ {
323
+ "name": hook_name,
324
+ "status": "unknown",
325
+ "output": "Unable to determine hook status",
326
+ },
327
+ )()
328
+
329
+ def _get_recent_comprehensive_hook_results(self) -> list[t.Any]:
330
+ """Get recent comprehensive hook results from session.
331
+
332
+ Returns:
333
+ List of comprehensive hook results, or mock results if unavailable
334
+ """
335
+ results = self._extract_hook_results_from_session("comprehensive_hooks")
336
+
337
+ if not results:
338
+ results = self._create_mock_hook_results(["bandit", "pyright"])
339
+
340
+ return results
341
+
342
+ def _is_security_critical_failure(self, result: t.Any) -> bool:
343
+ """Check if a hook result represents a critical security failure.
344
+
345
+ Args:
346
+ result: Hook result object
347
+
348
+ Returns:
349
+ True if result is a critical security failure, False otherwise
350
+ """
351
+ security_critical_hooks = {
352
+ "bandit",
353
+ "pyright",
354
+ "gitleaks",
355
+ }
356
+
357
+ hook_name = getattr(result, "name", "").lower()
358
+ is_failed = getattr(result, "status", "unknown") in (
359
+ "failed",
360
+ "error",
361
+ "timeout",
362
+ )
363
+
364
+ return hook_name in security_critical_hooks and is_failed
365
+
366
+ def _show_security_audit_warning(self) -> None:
367
+ """Display security audit warning with recommendations.
368
+
369
+ Shows detailed security warnings and recommendations if an audit
370
+ report is available, otherwise shows generic security status.
371
+ """
372
+ audit_report = getattr(self, "_last_security_audit", None)
373
+
374
+ if audit_report:
375
+ self.console.print(
376
+ "[yellow]⚠️ SECURITY AUDIT: Proceeding with partial quality success[/yellow]"
377
+ )
378
+
379
+ for warning in audit_report.security_warnings:
380
+ if "CRITICAL" in warning:
381
+ self.console.print(f"[red]{warning}[/red]")
382
+ elif "HIGH" in warning:
383
+ self.console.print(f"[yellow]{warning}[/yellow]")
384
+ else:
385
+ self.console.print(f"[blue]{warning}[/blue]")
386
+
387
+ if audit_report.recommendations:
388
+ self.console.print("[bold]Security Recommendations: [/bold]")
389
+ for rec in audit_report.recommendations[:3]:
390
+ self.console.print(f"[dim]{rec}[/dim]")
391
+ else:
392
+ self.console.print(
393
+ "[yellow]⚠️ SECURITY AUDIT: Proceeding with partial quality success[/yellow]"
394
+ )
395
+ self.console.print(
396
+ "[yellow]✅ Security-critical checks (bandit, pyright, gitleaks) have passed[/yellow]"
397
+ )
398
+ self.console.print(
399
+ "[yellow]⚠️ Some non-critical quality checks failed - consider reviewing before production deployment[/yellow]"
400
+ )