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,258 @@
1
+ """Semantic search data models for crackerjack vector store functionality."""
2
+
3
+ import typing as t
4
+ from datetime import datetime
5
+ from pathlib import Path
6
+
7
+ from pydantic import BaseModel, ConfigDict, Field, field_serializer
8
+
9
+
10
+ class EmbeddingVector(BaseModel):
11
+ """Represents a single embedding vector with metadata."""
12
+
13
+ file_path: Path = Field(..., description="Path to the source file")
14
+ chunk_id: str = Field(..., description="Unique identifier for this chunk")
15
+ content: str = Field(..., description="The text content that was embedded")
16
+ embedding: list[float] = Field(
17
+ ..., description="The numerical vector representation"
18
+ )
19
+ created_at: datetime = Field(
20
+ default_factory=datetime.now, description="Creation timestamp"
21
+ )
22
+ file_hash: str = Field(
23
+ ..., description="Hash of the source file for change detection"
24
+ )
25
+ start_line: int = Field(..., description="Starting line number in the source file")
26
+ end_line: int = Field(..., description="Ending line number in the source file")
27
+ file_type: str = Field(..., description="File extension or type identifier")
28
+
29
+ model_config = ConfigDict(ser_json_timedelta="iso8601")
30
+
31
+ @field_serializer("file_path")
32
+ def serialize_path(self, value: Path) -> str:
33
+ """Serialize Path to string."""
34
+ return str(value)
35
+
36
+ @field_serializer("created_at")
37
+ def serialize_datetime(self, value: datetime) -> str:
38
+ """Serialize datetime to ISO format."""
39
+ return value.isoformat()
40
+
41
+
42
+ class SearchResult(BaseModel):
43
+ """Represents a semantic search result with similarity score."""
44
+
45
+ file_path: Path = Field(..., description="Path to the matching file")
46
+ chunk_id: str = Field(..., description="Identifier of the matching chunk")
47
+ content: str = Field(..., description="The matching text content")
48
+ similarity_score: float = Field(
49
+ ..., ge=0.0, le=1.0, description="Similarity score (0-1)"
50
+ )
51
+ start_line: int = Field(..., description="Starting line number")
52
+ end_line: int = Field(..., description="Ending line number")
53
+ file_type: str = Field(..., description="File type identifier")
54
+ context_lines: list[str] = Field(
55
+ default_factory=list, description="Surrounding context lines"
56
+ )
57
+
58
+ @field_serializer("file_path")
59
+ def serialize_path(self, value: Path) -> str:
60
+ """Serialize Path to string."""
61
+ return str(value)
62
+
63
+
64
+ class IndexStats(BaseModel):
65
+ """Statistics about the semantic index."""
66
+
67
+ total_files: int = Field(..., description="Total number of indexed files")
68
+ total_chunks: int = Field(..., description="Total number of text chunks")
69
+ index_size_mb: float = Field(..., description="Index size in megabytes")
70
+ last_updated: datetime = Field(..., description="Last index update timestamp")
71
+ file_types: dict[str, int] = Field(
72
+ default_factory=dict, description="Count by file type"
73
+ )
74
+ embedding_model: str = Field(..., description="Name of the embedding model used")
75
+ avg_chunk_size: float = Field(..., description="Average chunk size in characters")
76
+
77
+ @field_serializer("last_updated")
78
+ def serialize_datetime(self, value: datetime) -> str:
79
+ """Serialize datetime to ISO format."""
80
+ return value.isoformat()
81
+
82
+
83
+ class SearchQuery(BaseModel):
84
+ """Represents a semantic search query with parameters."""
85
+
86
+ query: str = Field(..., min_length=1, description="The search query text")
87
+ max_results: int = Field(
88
+ default=10, ge=1, le=100, description="Maximum number of results"
89
+ )
90
+ min_similarity: float = Field(
91
+ default=0.3, ge=0.0, le=1.0, description="Minimum similarity threshold"
92
+ )
93
+ file_types: list[str] = Field(
94
+ default_factory=list, description="Filter by file types"
95
+ )
96
+ include_context: bool = Field(
97
+ default=True, description="Include surrounding context lines"
98
+ )
99
+ context_lines: int = Field(
100
+ default=3, ge=0, le=10, description="Number of context lines"
101
+ )
102
+
103
+ model_config = ConfigDict(validate_assignment=True)
104
+
105
+
106
+ class IndexingProgress(BaseModel):
107
+ """Progress information for indexing operations."""
108
+
109
+ current_file: Path = Field(..., description="Currently processing file")
110
+ files_processed: int = Field(..., ge=0, description="Number of files processed")
111
+ total_files: int = Field(..., ge=0, description="Total files to process")
112
+ chunks_created: int = Field(..., ge=0, description="Number of chunks created")
113
+ elapsed_time: float = Field(..., ge=0.0, description="Elapsed time in seconds")
114
+ estimated_remaining: float | None = Field(
115
+ default=None, description="Estimated remaining time in seconds"
116
+ )
117
+
118
+ @property
119
+ def progress_percentage(self) -> float:
120
+ """Calculate progress as a percentage."""
121
+ if self.total_files == 0:
122
+ return 0.0
123
+ return min(100.0, (self.files_processed / self.total_files) * 100.0)
124
+
125
+ @field_serializer("current_file")
126
+ def serialize_path(self, value: Path) -> str:
127
+ """Serialize Path to string."""
128
+ return str(value)
129
+
130
+
131
+ class SemanticConfig(BaseModel):
132
+ """Configuration for semantic search functionality."""
133
+
134
+ embedding_model: str = Field(
135
+ default="all-MiniLM-L6-v2", description="Sentence transformer model name"
136
+ )
137
+ chunk_size: int = Field(
138
+ default=500, ge=100, le=2000, description="Maximum characters per chunk"
139
+ )
140
+ chunk_overlap: int = Field(
141
+ default=50, ge=0, le=500, description="Overlap between chunks"
142
+ )
143
+ max_search_results: int = Field(
144
+ default=10, ge=1, le=100, description="Maximum number of search results"
145
+ )
146
+ similarity_threshold: float = Field(
147
+ default=0.7, ge=0.0, le=1.0, description="Minimum similarity threshold"
148
+ )
149
+ embedding_dimension: int = Field(
150
+ default=384, ge=128, le=1024, description="Embedding vector dimension"
151
+ )
152
+ max_file_size_mb: int = Field(
153
+ default=10, ge=1, le=100, description="Maximum file size to process"
154
+ )
155
+ excluded_patterns: list[str] = Field(
156
+ default_factory=lambda: [
157
+ "*.pyc",
158
+ "*.pyo",
159
+ "*.pyd",
160
+ "__pycache__/*",
161
+ ".git/*",
162
+ ".venv/*",
163
+ "*.log",
164
+ "*.tmp",
165
+ ],
166
+ description="File patterns to exclude from indexing",
167
+ )
168
+ included_extensions: list[str] = Field(
169
+ default_factory=lambda: [
170
+ ".py",
171
+ ".md",
172
+ ".txt",
173
+ ".yml",
174
+ ".yaml",
175
+ ".json",
176
+ ".toml",
177
+ ".ini",
178
+ ".cfg",
179
+ ".sh",
180
+ ".js",
181
+ ".ts",
182
+ ".html",
183
+ ".css",
184
+ ".sql",
185
+ ],
186
+ description="File extensions to include in indexing",
187
+ )
188
+ cache_embeddings: bool = Field(default=True, description="Cache embeddings to disk")
189
+ cache_ttl_hours: int = Field(
190
+ default=24, ge=1, le=168, description="Cache time-to-live in hours"
191
+ )
192
+
193
+ model_config = ConfigDict(validate_assignment=True)
194
+
195
+
196
+ class FileChangeEvent(BaseModel):
197
+ """Represents a file system change event for incremental indexing."""
198
+
199
+ file_path: Path = Field(..., description="Path to the changed file")
200
+ event_type: t.Literal["created", "modified", "deleted"] = Field(
201
+ ..., description="Type of change"
202
+ )
203
+ timestamp: datetime = Field(
204
+ default_factory=datetime.now, description="When the change occurred"
205
+ )
206
+ file_hash: str | None = Field(
207
+ default=None, description="New file hash if available"
208
+ )
209
+
210
+ @field_serializer("file_path")
211
+ def serialize_path(self, value: Path) -> str:
212
+ """Serialize Path to string."""
213
+ return str(value)
214
+
215
+ @field_serializer("timestamp")
216
+ def serialize_datetime(self, value: datetime) -> str:
217
+ """Serialize datetime to ISO format."""
218
+ return value.isoformat()
219
+
220
+
221
+ class SemanticContext(BaseModel):
222
+ """Context information for AI agents using semantic search."""
223
+
224
+ query: str = Field(..., description="The query that generated this context")
225
+ related_files: list[SearchResult] = Field(
226
+ ..., description="Semantically related files"
227
+ )
228
+ patterns: list[str] = Field(
229
+ default_factory=list, description="Identified code patterns"
230
+ )
231
+ suggestions: list[str] = Field(
232
+ default_factory=list, description="AI-generated suggestions"
233
+ )
234
+ confidence: float = Field(
235
+ ..., ge=0.0, le=1.0, description="Confidence in the context relevance"
236
+ )
237
+
238
+
239
+ # Type aliases for better code readability
240
+ EmbeddingMatrix = list[list[float]]
241
+ SimilarityMatrix = list[list[float]]
242
+ FilePathSet = set[Path]
243
+ ChunkMapping = dict[str, EmbeddingVector]
244
+
245
+ __all__ = [
246
+ "EmbeddingVector",
247
+ "SearchResult",
248
+ "IndexStats",
249
+ "SearchQuery",
250
+ "IndexingProgress",
251
+ "SemanticConfig",
252
+ "FileChangeEvent",
253
+ "SemanticContext",
254
+ "EmbeddingMatrix",
255
+ "SimilarityMatrix",
256
+ "FilePathSet",
257
+ "ChunkMapping",
258
+ ]
@@ -3,8 +3,9 @@ import typing as t
3
3
  from dataclasses import dataclass
4
4
  from enum import Enum
5
5
 
6
+ from acb.console import Console
7
+ from acb.depends import Inject, depends
6
8
  from pydantic import BaseModel
7
- from rich.console import Console
8
9
 
9
10
 
10
11
  class TaskStatus(Enum):
@@ -38,11 +39,23 @@ class HookResult:
38
39
  duration: float
39
40
  files_processed: int = 0
40
41
  issues_found: list[str] | None = None
42
+ issues_count: int = (
43
+ 0 # Total count of issues (may exceed len(issues_found) if truncated)
44
+ )
41
45
  stage: str = "pre-commit"
46
+ exit_code: int | None = None # Non-zero exit codes for failed hooks
47
+ error_message: str | None = None # Error details from stderr or exceptions
48
+ is_timeout: bool = False # Whether hook failed due to timeout
49
+ is_config_error: bool = (
50
+ False # Whether failure is due to config/tool error (not code issues)
51
+ )
42
52
 
43
53
  def __post_init__(self) -> None:
44
54
  if self.issues_found is None:
45
55
  self.issues_found = []
56
+ # If issues_count not explicitly set, default to length of issues_found list
57
+ if self.issues_count == 0 and self.issues_found:
58
+ self.issues_count = len(self.issues_found)
46
59
 
47
60
 
48
61
  @dataclass
@@ -68,16 +81,18 @@ class TaskStatusData:
68
81
 
69
82
 
70
83
  class SessionTracker(BaseModel, arbitrary_types_allowed=True):
71
- console: Console
72
84
  session_id: str
73
85
  start_time: float
74
86
  progress_file: t.Any = None
75
87
  tasks: dict[str, TaskStatusData] = {}
76
88
  current_task: str | None = None
77
89
  metadata: dict[str, t.Any] = {}
90
+ console: t.Any = None # Console instance from DI
78
91
 
79
- def __init__(self, **data: t.Any) -> None:
92
+ @depends.inject # type: ignore[misc]
93
+ def __init__(self, console: Inject[Console], **data: t.Any) -> None:
80
94
  super().__init__(**data)
95
+ self.console = console
81
96
  if not self.tasks:
82
97
  self.tasks = {}
83
98
  if not self.metadata:
@@ -150,6 +165,7 @@ class SessionTracker(BaseModel, arbitrary_types_allowed=True):
150
165
  "session_id": self.session_id,
151
166
  "duration": time.time() - self.start_time,
152
167
  "total_tasks": len(self.tasks),
168
+ "tasks_count": len(self.tasks),
153
169
  "completed": completed,
154
170
  "failed": failed,
155
171
  "in_progress": in_progress,
@@ -0,0 +1,60 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Any
3
+
4
+
5
+ @dataclass
6
+ class TestFailure:
7
+ """Structured representation of a test failure."""
8
+
9
+ test_name: str
10
+ """Full test node ID (e.g., tests/test_foo.py::TestClass::test_method)"""
11
+
12
+ status: str
13
+ """Test status: FAILED, ERROR, or XFAIL"""
14
+
15
+ location: str
16
+ """File path and line number (e.g., tests/test_foo.py:42)"""
17
+
18
+ traceback: list[str] = field(default_factory=list)
19
+ """Full traceback lines"""
20
+
21
+ assertion: str | None = None
22
+ """Assertion error message if present"""
23
+
24
+ captured_stdout: str | None = None
25
+ """Captured stdout during test execution"""
26
+
27
+ captured_stderr: str | None = None
28
+ """Captured stderr during test execution"""
29
+
30
+ duration: float | None = None
31
+ """Test execution duration in seconds"""
32
+
33
+ short_summary: str | None = None
34
+ """One-line failure summary"""
35
+
36
+ locals_context: dict[str, Any] = field(default_factory=dict)
37
+ """Local variables at failure point (in -vvv mode)"""
38
+
39
+ def get_file_path(self) -> str:
40
+ """Extract file path from location."""
41
+ if ":" in self.location:
42
+ return self.location.split(":")[0]
43
+ return self.location
44
+
45
+ def get_line_number(self) -> int | None:
46
+ """Extract line number from location."""
47
+ if ":" in self.location:
48
+ try:
49
+ return int(self.location.split(":")[1])
50
+ except (ValueError, IndexError):
51
+ return None
52
+ return None
53
+
54
+ def get_relevant_traceback(self, max_lines: int = 15) -> list[str]:
55
+ """Get most relevant traceback lines (last N lines)."""
56
+ return (
57
+ self.traceback[-max_lines:]
58
+ if len(self.traceback) > max_lines
59
+ else self.traceback
60
+ )
@@ -0,0 +1,11 @@
1
+ > Crackerjack Docs: [Main](<../../README.md>) | [Crackerjack Package](<../README.md>) | [Monitoring](<./README.md>)
2
+
3
+ # Monitoring
4
+
5
+ Observability, metrics, and health checks.
6
+
7
+ ## Related
8
+
9
+ - [Crackerjack Package](<../README.md>) - Parent package
10
+ - [Events](<../events/README.md>) - Event types and signals
11
+ - [MCP](<../mcp/README.md>) - MCP server monitoring and progress tracking
@@ -5,7 +5,8 @@ from dataclasses import dataclass, field
5
5
  from datetime import datetime, timedelta
6
6
  from pathlib import Path
7
7
 
8
- from rich.console import Console
8
+ from acb.console import Console
9
+ from acb.depends import depends
9
10
  from rich.live import Live
10
11
  from rich.table import Table
11
12
 
@@ -21,7 +22,7 @@ class AgentPerformanceMetrics:
21
22
  failed_fixes: int = 0
22
23
  average_confidence: float = 0.0
23
24
  average_execution_time: float = 0.0
24
- issue_types_handled: dict[IssueType, int] = field(default_factory=dict[str, t.Any])
25
+ issue_types_handled: dict[IssueType, int] = field(default_factory=dict)
25
26
  recent_failures: list[str] = field(default_factory=list)
26
27
  last_successful_fix: datetime | None = None
27
28
  regression_patterns: list[str] = field(default_factory=list)
@@ -39,7 +40,7 @@ class WatchdogAlert:
39
40
 
40
41
  class AIAgentWatchdog:
41
42
  def __init__(self, console: Console | None = None):
42
- self.console = console or Console()
43
+ self.console = console or depends.get_sync(Console)
43
44
  self.performance_metrics: dict[str, AgentPerformanceMetrics] = {}
44
45
  self.alerts: list[WatchdogAlert] = []
45
46
  self.known_regressions: set[str] = {
@@ -358,7 +359,7 @@ class AIAgentWatchdog:
358
359
 
359
360
 
360
361
  async def run_agent_monitoring_demo() -> None:
361
- console = Console()
362
+ console = depends.get_sync(Console)
362
363
  watchdog = AIAgentWatchdog(console)
363
364
 
364
365
  from crackerjack.agents.base import AgentContext
@@ -9,10 +9,11 @@ from collections.abc import Callable
9
9
  from dataclasses import asdict, dataclass, field
10
10
  from datetime import datetime, timedelta
11
11
 
12
- from rich.console import Console
12
+ from acb.console import Console
13
+ from acb.depends import depends
13
14
 
14
15
  from crackerjack.monitoring.ai_agent_watchdog import AgentPerformanceMetrics
15
- from crackerjack.services.cache import CrackerjackCache
16
+ from crackerjack.services.acb_cache_adapter import CrackerjackCache
16
17
 
17
18
  logger = logging.getLogger(__name__)
18
19
 
@@ -111,7 +112,7 @@ class MetricsCollector:
111
112
  """
112
113
 
113
114
  def __init__(self, cache: CrackerjackCache | None = None):
114
- self.console = Console()
115
+ self.console = depends.get_sync(Console)
115
116
  self.cache = cache or CrackerjackCache()
116
117
 
117
118
  self.is_collecting = False
@@ -6,7 +6,8 @@ from datetime import datetime, timedelta
6
6
  from pathlib import Path
7
7
  from typing import Any
8
8
 
9
- from rich.console import Console
9
+ from acb.console import Console
10
+ from acb.depends import depends
10
11
  from rich.panel import Panel
11
12
  from rich.table import Table
12
13
 
@@ -40,7 +41,7 @@ class RegressionAlert:
40
41
 
41
42
  class RegressionPreventionSystem:
42
43
  def __init__(self, console: Console | None = None):
43
- self.console = console or Console()
44
+ self.console = console or depends.get_sync(Console)
44
45
  self.known_patterns: dict[str, RegressionPattern] = {}
45
46
  self.regression_alerts: list[RegressionAlert] = []
46
47
  self.prevention_active = True
@@ -565,7 +566,7 @@ async def monitor_for_regressions(
565
566
 
566
567
 
567
568
  if __name__ == "__main__":
568
- console = Console()
569
+ console = depends.get_sync(Console)
569
570
  system = RegressionPreventionSystem(console)
570
571
 
571
572
  console.print(system.create_prevention_dashboard())