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,11 @@
1
+ > Crackerjack Docs: [Main](<../../README.md>) | [Crackerjack Package](<../README.md>) | [Data](<./README.md>)
2
+
3
+ # Data
4
+
5
+ Static data and assets used by the package (keep small; large assets belong elsewhere).
6
+
7
+ ## Related
8
+
9
+ - [Crackerjack Package](<../README.md>) - Parent package
10
+ - [Documentation](<../documentation/README.md>) - Documentation helpers
11
+ - [UI Templates](<../ui/templates/README.md>) - UI template files
@@ -0,0 +1,8 @@
1
+ """Data access layer utilities backed by ACB infrastructure."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from crackerjack.data.models import QualityBaselineRecord
6
+ from crackerjack.data.repository import QualityBaselineRepository
7
+
8
+ __all__ = ["QualityBaselineRecord", "QualityBaselineRepository"]
@@ -0,0 +1,79 @@
1
+ """SQLModel data models for the Crackerjack data layer."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from typing import Any
7
+
8
+ from sqlalchemy import JSON, Column, DateTime, String
9
+ from sqlmodel import Field, SQLModel
10
+
11
+
12
+ class QualityBaselineRecord(SQLModel, table=True):
13
+ """Persistent representation of quality metrics for a git revision."""
14
+
15
+ __tablename__ = "quality_baselines"
16
+
17
+ id: int | None = Field(default=None, primary_key=True)
18
+ git_hash: str = Field(sa_column=Column(String(64), unique=True, index=True))
19
+ recorded_at: datetime = Field(
20
+ default_factory=datetime.utcnow,
21
+ sa_column=Column(DateTime(timezone=True), index=True),
22
+ )
23
+ coverage_percent: float = Field(default=0.0)
24
+ test_count: int = Field(default=0)
25
+ test_pass_rate: float = Field(default=0.0)
26
+ hook_failures: int = Field(default=0)
27
+ complexity_violations: int = Field(default=0)
28
+ security_issues: int = Field(default=0)
29
+ type_errors: int = Field(default=0)
30
+ linting_issues: int = Field(default=0)
31
+ quality_score: int = Field(default=0)
32
+ extra_metadata: dict[str, Any] | None = Field(
33
+ default=None,
34
+ sa_column=Column(JSON, nullable=True),
35
+ )
36
+
37
+ def update_from_dict(self, data: dict[str, Any]) -> None:
38
+ """Update this record in-place from a dictionary of values."""
39
+ for key, value in data.items():
40
+ if not hasattr(self, key):
41
+ continue
42
+ setattr(self, key, value)
43
+
44
+
45
+ class ProjectHealthRecord(SQLModel, table=True):
46
+ """Persistent representation of project health metrics."""
47
+
48
+ __tablename__ = "project_health"
49
+
50
+ id: int | None = Field(default=None, primary_key=True)
51
+ project_root: str = Field(sa_column=Column(String(255), unique=True, index=True))
52
+ lint_error_trend: list[int] = Field(default_factory=list, sa_column=Column(JSON))
53
+ test_coverage_trend: list[float] = Field(
54
+ default_factory=list,
55
+ sa_column=Column(JSON),
56
+ )
57
+ dependency_age: dict[str, int] = Field(
58
+ default_factory=dict,
59
+ sa_column=Column(JSON),
60
+ )
61
+ config_completeness: float = Field(default=0.0)
62
+ last_updated: datetime = Field(
63
+ default_factory=datetime.utcnow,
64
+ sa_column=Column(DateTime(timezone=True)),
65
+ )
66
+
67
+
68
+ class DependencyMonitorCacheRecord(SQLModel, table=True):
69
+ """Cache entry for dependency monitor state."""
70
+
71
+ __tablename__ = "dependency_monitor_cache"
72
+
73
+ id: int | None = Field(default=None, primary_key=True)
74
+ project_root: str = Field(sa_column=Column(String(255), unique=True, index=True))
75
+ cache_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
76
+ updated_at: datetime = Field(
77
+ default_factory=datetime.utcnow,
78
+ sa_column=Column(DateTime(timezone=True)),
79
+ )
@@ -0,0 +1,210 @@
1
+ """Data repositories backed by ACB SQL adapter."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import typing as t
7
+ from typing import Any
8
+
9
+ from crackerjack.data.models import (
10
+ DependencyMonitorCacheRecord,
11
+ ProjectHealthRecord,
12
+ QualityBaselineRecord,
13
+ )
14
+
15
+ LOGGER = logging.getLogger(__name__)
16
+
17
+
18
+ from acb.depends import depends
19
+
20
+ try:
21
+ from acb.adapters.models._hybrid import ACBQuery # type: ignore[attr-defined]
22
+ from acb.adapters.models._memory import (
23
+ MemoryDatabaseAdapter, # type: ignore[attr-defined]
24
+ )
25
+ from acb.adapters.models._pydantic import (
26
+ PydanticModelAdapter, # type: ignore[attr-defined]
27
+ )
28
+ from acb.adapters.models._query import registry # type: ignore[attr-defined]
29
+
30
+ # Register in-memory adapters for default usage
31
+ registry.register_database_adapter("memory", MemoryDatabaseAdapter())
32
+ registry.register_model_adapter("pydantic", PydanticModelAdapter())
33
+
34
+ # ACB hybrid query is available - use in-memory adapter as default
35
+ # (SQL/NoSQL adapters can be configured when those databases are set up)
36
+ _query_instance = ACBQuery(
37
+ database_adapter_name="memory",
38
+ model_adapter_name="pydantic",
39
+ )
40
+ depends.set(ACBQuery, _query_instance)
41
+
42
+ except ImportError: # pragma: no cover - fallback when hybrid query missing
43
+ LOGGER.warning(
44
+ "ACB hybrid query adapter not available; using in-memory query fallback.",
45
+ )
46
+
47
+ class _InMemorySimpleOps:
48
+ def __init__(self, model: type[Any], store: list[Any]) -> None:
49
+ self._model = model
50
+ self._store = store
51
+
52
+ async def create_or_update(
53
+ self,
54
+ data: dict[str, Any],
55
+ key_field: str,
56
+ ) -> Any:
57
+ key_value = data.get(key_field)
58
+ for existing in self._store:
59
+ if getattr(existing, key_field, None) == key_value:
60
+ if hasattr(existing, "update_from_dict"):
61
+ existing.update_from_dict(data)
62
+ else:
63
+ for key, value in data.items():
64
+ if hasattr(existing, key):
65
+ setattr(existing, key, value)
66
+ return existing
67
+ instance = self._model(**data)
68
+ self._store.append(instance)
69
+ return instance
70
+
71
+ async def find(self, **filters: Any) -> Any | None:
72
+ for existing in self._store:
73
+ if all(
74
+ getattr(existing, key, None) == value
75
+ for key, value in filters.items()
76
+ ):
77
+ return existing
78
+ return None
79
+
80
+ async def delete(self, **filters: Any) -> bool:
81
+ to_remove = [
82
+ existing
83
+ for existing in self._store
84
+ if all(
85
+ getattr(existing, key, None) == value
86
+ for key, value in filters.items()
87
+ )
88
+ ]
89
+ for item in to_remove:
90
+ self._store.remove(item)
91
+ return bool(to_remove)
92
+
93
+ async def all(self) -> list[Any]:
94
+ return self._store.copy()
95
+
96
+ class _InMemoryAdvancedOps:
97
+ def __init__(self, simple_ops: _InMemorySimpleOps) -> None:
98
+ self._simple = simple_ops
99
+ self._order_field: str | None = None
100
+ self._limit: int | None = None
101
+
102
+ def order_by_desc(self, field: str) -> _InMemoryAdvancedOps:
103
+ self._order_field = field
104
+ return self
105
+
106
+ def limit(self, limit: int) -> _InMemoryAdvancedOps:
107
+ self._limit = limit
108
+ return self
109
+
110
+ async def all(self) -> list[Any]:
111
+ records = await self._simple.all()
112
+ if self._order_field:
113
+
114
+ def key_fn(item: Any) -> Any:
115
+ return getattr(item, self._order_field or "", None)
116
+
117
+ records.sort(key=key_fn, reverse=True)
118
+ if self._limit is not None:
119
+ records = records[: self._limit]
120
+ return records
121
+
122
+ class _InMemoryModelInterface:
123
+ def __init__(self, model: type[Any], store: list[Any]) -> None:
124
+ self.simple = _InMemorySimpleOps(model, store)
125
+ self.advanced = _InMemoryAdvancedOps(self.simple)
126
+
127
+ class ACBQuery: # type: ignore[no-redef]
128
+ def __init__(self) -> None:
129
+ self._stores: dict[type[Any], list[Any]] = {}
130
+
131
+ def for_model(self, model: type[Any]) -> _InMemoryModelInterface:
132
+ if model not in self._stores:
133
+ self._stores[model] = []
134
+ return _InMemoryModelInterface(model, self._stores[model])
135
+
136
+ depends.set(ACBQuery, ACBQuery())
137
+
138
+
139
+ class QualityBaselineRepository:
140
+ def __init__(self) -> None:
141
+ self.query = depends.get_sync(ACBQuery)
142
+
143
+ async def upsert(self, data: dict[str, Any]) -> QualityBaselineRecord:
144
+ result = await self.query.for_model(
145
+ QualityBaselineRecord
146
+ ).simple.create_or_update(data, "git_hash")
147
+ return t.cast(QualityBaselineRecord, result)
148
+
149
+ async def get_by_git_hash(self, git_hash: str) -> QualityBaselineRecord | None:
150
+ result = await self.query.for_model(QualityBaselineRecord).simple.find(
151
+ git_hash=git_hash
152
+ )
153
+ return t.cast(QualityBaselineRecord | None, result)
154
+
155
+ async def list_recent(self, limit: int = 10) -> list[QualityBaselineRecord]:
156
+ result = (
157
+ await self.query.for_model(QualityBaselineRecord)
158
+ .advanced.order_by_desc("recorded_at")
159
+ .limit(limit)
160
+ .all()
161
+ )
162
+ return t.cast(list[QualityBaselineRecord], result)
163
+
164
+ async def delete_for_git_hash(self, git_hash: str) -> bool:
165
+ result = await self.query.for_model(QualityBaselineRecord).simple.delete(
166
+ git_hash=git_hash
167
+ )
168
+ return t.cast(bool, result)
169
+
170
+
171
+ class HealthMetricsRepository:
172
+ def __init__(self) -> None:
173
+ self.query = depends.get_sync(ACBQuery)
174
+
175
+ async def upsert(
176
+ self,
177
+ project_root: str,
178
+ data: dict[str, Any],
179
+ ) -> ProjectHealthRecord:
180
+ result = await self.query.for_model(
181
+ ProjectHealthRecord
182
+ ).simple.create_or_update(data, "project_root")
183
+ return t.cast(ProjectHealthRecord, result)
184
+
185
+ async def get(self, project_root: str) -> ProjectHealthRecord | None:
186
+ result = await self.query.for_model(ProjectHealthRecord).simple.find(
187
+ project_root=project_root
188
+ )
189
+ return t.cast(ProjectHealthRecord | None, result)
190
+
191
+
192
+ class DependencyMonitorRepository:
193
+ def __init__(self) -> None:
194
+ self.query = depends.get_sync(ACBQuery)
195
+
196
+ async def upsert(
197
+ self,
198
+ project_root: str,
199
+ cache_data: dict[str, Any],
200
+ ) -> DependencyMonitorCacheRecord:
201
+ result = await self.query.for_model(
202
+ DependencyMonitorCacheRecord
203
+ ).simple.create_or_update(cache_data, "project_root")
204
+ return t.cast(DependencyMonitorCacheRecord, result)
205
+
206
+ async def get(self, project_root: str) -> DependencyMonitorCacheRecord | None:
207
+ result = await self.query.for_model(DependencyMonitorCacheRecord).simple.find(
208
+ project_root=project_root
209
+ )
210
+ return t.cast(DependencyMonitorCacheRecord | None, result)
@@ -0,0 +1,180 @@
1
+ > Crackerjack Docs: [Main](<../../README.md>) | [Crackerjack Package](<../README.md>) | [Decorators](<./README.md>)
2
+
3
+ # Decorators
4
+
5
+ Cross-cutting decorators and helper wrappers for error handling, retry logic, validation, and performance optimization. All decorators support both sync and async functions automatically.
6
+
7
+ ## Available Decorators
8
+
9
+ ### Error Handling
10
+
11
+ **`handle_errors`** - Centralized error handling with transformation and fallback support
12
+
13
+ ```python
14
+ from crackerjack.decorators import handle_errors
15
+ from crackerjack.errors import FileError
16
+
17
+
18
+ @handle_errors(
19
+ error_types=[FileNotFoundError, PermissionError],
20
+ transform_to=FileError,
21
+ fallback={},
22
+ )
23
+ def load_config(path: str) -> dict:
24
+ with open(path) as f:
25
+ return json.load(f)
26
+ ```
27
+
28
+ **`log_errors`** - Log errors with context before re-raising
29
+
30
+ ```python
31
+ import logging
32
+ from crackerjack.decorators import log_errors
33
+
34
+ logger = logging.getLogger(__name__)
35
+
36
+
37
+ @log_errors(logger=logger, level="error", include_traceback=True)
38
+ async def critical_operation() -> bool:
39
+ return await perform_operation()
40
+ ```
41
+
42
+ **`graceful_degradation`** - Gracefully degrade on errors with optional warnings
43
+
44
+ ```python
45
+ from crackerjack.decorators import graceful_degradation
46
+
47
+
48
+ @graceful_degradation(fallback_value=[], warn=True)
49
+ def get_optional_features() -> list[str]:
50
+ # Returns [] on error with warning
51
+ return fetch_features()
52
+ ```
53
+
54
+ ### Retry and Timeout
55
+
56
+ **`retry`** - Retry decorator with exponential backoff
57
+
58
+ ```python
59
+ from crackerjack.decorators import retry
60
+
61
+
62
+ @retry(max_attempts=3, exceptions=[ConnectionError], backoff=0.5)
63
+ async def fetch_data() -> dict:
64
+ return await api_client.get()
65
+ ```
66
+
67
+ **`with_timeout`** - Timeout enforcement for long-running operations
68
+
69
+ ```python
70
+ from crackerjack.decorators import with_timeout
71
+
72
+
73
+ @with_timeout(seconds=30, error_message="Operation timed out")
74
+ def heavy_computation() -> int:
75
+ return compute_result()
76
+ ```
77
+
78
+ ### Validation
79
+
80
+ **`validate_args`** - Validate function arguments using callables and type checks
81
+
82
+ ```python
83
+ from crackerjack.decorators import validate_args
84
+
85
+
86
+ @validate_args(
87
+ validators={"path": lambda p: Path(p).exists(), "count": lambda n: n > 0},
88
+ type_check=True,
89
+ )
90
+ def process_files(path: str, count: int) -> bool:
91
+ return True
92
+ ```
93
+
94
+ ### Pattern Detection
95
+
96
+ **`cache_errors`** - Detect and cache error patterns for AI-powered analysis
97
+
98
+ ```python
99
+ from crackerjack.decorators import cache_errors
100
+ from pathlib import Path
101
+
102
+
103
+ @cache_errors(error_type="lint", auto_analyze=True)
104
+ async def run_linter(files: list[Path]) -> bool:
105
+ # Errors automatically cached and analyzed
106
+ return await linter.run(files)
107
+ ```
108
+
109
+ ## Best Practices
110
+
111
+ ### Complexity Guidelines
112
+
113
+ Keep decorator implementation complexity ≤15 per function using helper methods:
114
+
115
+ ```python
116
+ def _create_async_wrapper(func, config):
117
+ """Helper to create async wrapper - reduces complexity."""
118
+
119
+ @wraps(func)
120
+ async def wrapper(*args, **kwargs):
121
+ return await func(*args, **kwargs)
122
+
123
+ return wrapper
124
+ ```
125
+
126
+ ### Sync and Async Support
127
+
128
+ All decorators automatically detect function type using `is_async_function`:
129
+
130
+ ```python
131
+ from crackerjack.decorators.helpers import is_async_function
132
+
133
+
134
+ def decorator(func):
135
+ if is_async_function(func):
136
+ return _create_async_wrapper(func)
137
+ return _create_sync_wrapper(func)
138
+ ```
139
+
140
+ ### Error Context
141
+
142
+ Use `get_function_context` for rich error reporting:
143
+
144
+ ```python
145
+ from crackerjack.decorators.helpers import get_function_context
146
+
147
+ context = get_function_context(func)
148
+ # Returns: {
149
+ # "function_name": "my_function",
150
+ # "module": "mymodule",
151
+ # "qualname": "MyClass.my_function",
152
+ # "is_async": True
153
+ # }
154
+ ```
155
+
156
+ ### Combining Decorators
157
+
158
+ Stack decorators from innermost to outermost:
159
+
160
+ ```python
161
+ @log_errors()
162
+ @retry(max_attempts=3)
163
+ @with_timeout(seconds=30)
164
+ @handle_errors(fallback={})
165
+ async def fetch_and_process() -> dict:
166
+ return await process()
167
+ ```
168
+
169
+ ## Implementation Modules
170
+
171
+ - **`error_handling.py`** - Core error decorators (retry, handle_errors, timeout, etc.)
172
+ - **`patterns.py`** - Pattern detection decorators (cache_errors)
173
+ - **`utils.py`** - Shared utilities for decorator implementation
174
+
175
+ ## Related
176
+
177
+ - [Exceptions](<../exceptions/README.md>) - Custom exception types
178
+ - [Errors](../errors/README.md) - Error handling and error types
179
+ - [MCP Cache](<../mcp/README.md>) - Error pattern caching for AI analysis
180
+ - [Architecture: ACB Patterns](../../docs/guides/CLAUDE.md#critical-architectural-pattern-protocol-based-di) - Dependency injection patterns
@@ -0,0 +1,35 @@
1
+ from .error_handling import (
2
+ graceful_degradation,
3
+ handle_errors,
4
+ log_errors,
5
+ retry,
6
+ validate_args,
7
+ with_timeout,
8
+ )
9
+ from .error_handling_decorators import (
10
+ handle_all_errors,
11
+ handle_file_errors,
12
+ handle_json_errors,
13
+ handle_network_errors,
14
+ handle_subprocess_errors,
15
+ handle_validation_errors,
16
+ retry_on_error,
17
+ )
18
+ from .patterns import cache_errors
19
+
20
+ __all__ = [
21
+ "retry",
22
+ "handle_errors",
23
+ "with_timeout",
24
+ "log_errors",
25
+ "graceful_degradation",
26
+ "validate_args",
27
+ "handle_file_errors",
28
+ "handle_json_errors",
29
+ "handle_subprocess_errors",
30
+ "handle_validation_errors",
31
+ "handle_network_errors",
32
+ "handle_all_errors",
33
+ "retry_on_error",
34
+ "cache_errors",
35
+ ]