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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +30 -1
  3. crackerjack/__main__.py +342 -1263
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +27 -5
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/{rust_tool_manager.py → lsp/_manager.py} +3 -3
  27. crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
  28. crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
  29. crackerjack/adapters/refactor/README.md +59 -0
  30. crackerjack/adapters/refactor/__init__.py +12 -0
  31. crackerjack/adapters/refactor/creosote.py +318 -0
  32. crackerjack/adapters/refactor/refurb.py +406 -0
  33. crackerjack/adapters/refactor/skylos.py +494 -0
  34. crackerjack/adapters/sast/README.md +132 -0
  35. crackerjack/adapters/sast/__init__.py +32 -0
  36. crackerjack/adapters/sast/_base.py +201 -0
  37. crackerjack/adapters/sast/bandit.py +423 -0
  38. crackerjack/adapters/sast/pyscn.py +405 -0
  39. crackerjack/adapters/sast/semgrep.py +241 -0
  40. crackerjack/adapters/security/README.md +111 -0
  41. crackerjack/adapters/security/__init__.py +17 -0
  42. crackerjack/adapters/security/gitleaks.py +339 -0
  43. crackerjack/adapters/type/README.md +52 -0
  44. crackerjack/adapters/type/__init__.py +12 -0
  45. crackerjack/adapters/type/pyrefly.py +402 -0
  46. crackerjack/adapters/type/ty.py +402 -0
  47. crackerjack/adapters/type/zuban.py +522 -0
  48. crackerjack/adapters/utility/README.md +51 -0
  49. crackerjack/adapters/utility/__init__.py +10 -0
  50. crackerjack/adapters/utility/checks.py +884 -0
  51. crackerjack/agents/README.md +264 -0
  52. crackerjack/agents/__init__.py +40 -12
  53. crackerjack/agents/base.py +1 -0
  54. crackerjack/agents/claude_code_bridge.py +641 -0
  55. crackerjack/agents/coordinator.py +49 -53
  56. crackerjack/agents/dry_agent.py +187 -3
  57. crackerjack/agents/enhanced_coordinator.py +279 -0
  58. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  59. crackerjack/agents/error_middleware.py +53 -0
  60. crackerjack/agents/formatting_agent.py +6 -8
  61. crackerjack/agents/helpers/__init__.py +9 -0
  62. crackerjack/agents/helpers/performance/__init__.py +22 -0
  63. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  64. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  65. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  66. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  67. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  68. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  69. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  70. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  71. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  72. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  73. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  74. crackerjack/agents/performance_agent.py +121 -1152
  75. crackerjack/agents/refactoring_agent.py +156 -655
  76. crackerjack/agents/semantic_agent.py +479 -0
  77. crackerjack/agents/semantic_helpers.py +356 -0
  78. crackerjack/agents/test_creation_agent.py +19 -1605
  79. crackerjack/api.py +5 -7
  80. crackerjack/cli/README.md +394 -0
  81. crackerjack/cli/__init__.py +1 -1
  82. crackerjack/cli/cache_handlers.py +23 -18
  83. crackerjack/cli/cache_handlers_enhanced.py +1 -4
  84. crackerjack/cli/facade.py +70 -8
  85. crackerjack/cli/formatting.py +13 -0
  86. crackerjack/cli/handlers/__init__.py +85 -0
  87. crackerjack/cli/handlers/advanced.py +103 -0
  88. crackerjack/cli/handlers/ai_features.py +62 -0
  89. crackerjack/cli/handlers/analytics.py +479 -0
  90. crackerjack/cli/handlers/changelog.py +271 -0
  91. crackerjack/cli/handlers/config_handlers.py +16 -0
  92. crackerjack/cli/handlers/coverage.py +84 -0
  93. crackerjack/cli/handlers/documentation.py +280 -0
  94. crackerjack/cli/handlers/main_handlers.py +497 -0
  95. crackerjack/cli/handlers/monitoring.py +371 -0
  96. crackerjack/cli/handlers.py +249 -49
  97. crackerjack/cli/interactive.py +8 -5
  98. crackerjack/cli/options.py +203 -110
  99. crackerjack/cli/semantic_handlers.py +292 -0
  100. crackerjack/cli/version.py +19 -0
  101. crackerjack/code_cleaner.py +60 -24
  102. crackerjack/config/README.md +472 -0
  103. crackerjack/config/__init__.py +256 -0
  104. crackerjack/config/global_lock_config.py +191 -54
  105. crackerjack/config/hooks.py +188 -16
  106. crackerjack/config/loader.py +239 -0
  107. crackerjack/config/settings.py +141 -0
  108. crackerjack/config/tool_commands.py +331 -0
  109. crackerjack/core/README.md +393 -0
  110. crackerjack/core/async_workflow_orchestrator.py +79 -53
  111. crackerjack/core/autofix_coordinator.py +22 -9
  112. crackerjack/core/container.py +10 -9
  113. crackerjack/core/enhanced_container.py +9 -9
  114. crackerjack/core/performance.py +1 -1
  115. crackerjack/core/performance_monitor.py +5 -3
  116. crackerjack/core/phase_coordinator.py +1018 -634
  117. crackerjack/core/proactive_workflow.py +3 -3
  118. crackerjack/core/retry.py +275 -0
  119. crackerjack/core/service_watchdog.py +167 -23
  120. crackerjack/core/session_coordinator.py +187 -382
  121. crackerjack/core/timeout_manager.py +161 -44
  122. crackerjack/core/workflow/__init__.py +21 -0
  123. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  124. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  125. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  126. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  127. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  128. crackerjack/core/workflow_orchestrator.py +1247 -953
  129. crackerjack/data/README.md +11 -0
  130. crackerjack/data/__init__.py +8 -0
  131. crackerjack/data/models.py +79 -0
  132. crackerjack/data/repository.py +210 -0
  133. crackerjack/decorators/README.md +180 -0
  134. crackerjack/decorators/__init__.py +35 -0
  135. crackerjack/decorators/error_handling.py +649 -0
  136. crackerjack/decorators/error_handling_decorators.py +334 -0
  137. crackerjack/decorators/helpers.py +58 -0
  138. crackerjack/decorators/patterns.py +281 -0
  139. crackerjack/decorators/utils.py +58 -0
  140. crackerjack/docs/README.md +11 -0
  141. crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
  142. crackerjack/documentation/README.md +11 -0
  143. crackerjack/documentation/ai_templates.py +1 -1
  144. crackerjack/documentation/dual_output_generator.py +11 -9
  145. crackerjack/documentation/reference_generator.py +104 -59
  146. crackerjack/dynamic_config.py +52 -61
  147. crackerjack/errors.py +1 -1
  148. crackerjack/events/README.md +11 -0
  149. crackerjack/events/__init__.py +16 -0
  150. crackerjack/events/telemetry.py +175 -0
  151. crackerjack/events/workflow_bus.py +346 -0
  152. crackerjack/exceptions/README.md +301 -0
  153. crackerjack/exceptions/__init__.py +5 -0
  154. crackerjack/exceptions/config.py +4 -0
  155. crackerjack/exceptions/tool_execution_error.py +245 -0
  156. crackerjack/executors/README.md +591 -0
  157. crackerjack/executors/__init__.py +2 -0
  158. crackerjack/executors/async_hook_executor.py +539 -77
  159. crackerjack/executors/cached_hook_executor.py +3 -3
  160. crackerjack/executors/hook_executor.py +967 -102
  161. crackerjack/executors/hook_lock_manager.py +31 -22
  162. crackerjack/executors/individual_hook_executor.py +66 -32
  163. crackerjack/executors/lsp_aware_hook_executor.py +136 -57
  164. crackerjack/executors/progress_hook_executor.py +282 -0
  165. crackerjack/executors/tool_proxy.py +23 -7
  166. crackerjack/hooks/README.md +485 -0
  167. crackerjack/hooks/lsp_hook.py +8 -9
  168. crackerjack/intelligence/README.md +557 -0
  169. crackerjack/interactive.py +37 -10
  170. crackerjack/managers/README.md +369 -0
  171. crackerjack/managers/async_hook_manager.py +41 -57
  172. crackerjack/managers/hook_manager.py +449 -79
  173. crackerjack/managers/publish_manager.py +81 -36
  174. crackerjack/managers/test_command_builder.py +290 -12
  175. crackerjack/managers/test_executor.py +93 -8
  176. crackerjack/managers/test_manager.py +1082 -75
  177. crackerjack/managers/test_progress.py +118 -26
  178. crackerjack/mcp/README.md +374 -0
  179. crackerjack/mcp/cache.py +25 -2
  180. crackerjack/mcp/client_runner.py +35 -18
  181. crackerjack/mcp/context.py +9 -9
  182. crackerjack/mcp/dashboard.py +24 -8
  183. crackerjack/mcp/enhanced_progress_monitor.py +34 -23
  184. crackerjack/mcp/file_monitor.py +27 -6
  185. crackerjack/mcp/progress_components.py +45 -34
  186. crackerjack/mcp/progress_monitor.py +6 -9
  187. crackerjack/mcp/rate_limiter.py +11 -7
  188. crackerjack/mcp/server.py +2 -0
  189. crackerjack/mcp/server_core.py +187 -55
  190. crackerjack/mcp/service_watchdog.py +12 -9
  191. crackerjack/mcp/task_manager.py +2 -2
  192. crackerjack/mcp/tools/README.md +27 -0
  193. crackerjack/mcp/tools/__init__.py +2 -0
  194. crackerjack/mcp/tools/core_tools.py +75 -52
  195. crackerjack/mcp/tools/execution_tools.py +87 -31
  196. crackerjack/mcp/tools/intelligence_tools.py +2 -2
  197. crackerjack/mcp/tools/proactive_tools.py +1 -1
  198. crackerjack/mcp/tools/semantic_tools.py +584 -0
  199. crackerjack/mcp/tools/utility_tools.py +180 -132
  200. crackerjack/mcp/tools/workflow_executor.py +87 -46
  201. crackerjack/mcp/websocket/README.md +31 -0
  202. crackerjack/mcp/websocket/app.py +11 -1
  203. crackerjack/mcp/websocket/event_bridge.py +188 -0
  204. crackerjack/mcp/websocket/jobs.py +27 -4
  205. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  206. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  207. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  208. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  209. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  210. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  211. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  212. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  213. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  214. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  215. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  216. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  217. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  218. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  219. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  220. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  221. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  222. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  223. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  224. crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
  225. crackerjack/mcp/websocket/server.py +1 -3
  226. crackerjack/mcp/websocket/websocket_handler.py +107 -6
  227. crackerjack/models/README.md +308 -0
  228. crackerjack/models/__init__.py +10 -1
  229. crackerjack/models/config.py +639 -22
  230. crackerjack/models/config_adapter.py +6 -6
  231. crackerjack/models/protocols.py +1167 -23
  232. crackerjack/models/pydantic_models.py +320 -0
  233. crackerjack/models/qa_config.py +145 -0
  234. crackerjack/models/qa_results.py +134 -0
  235. crackerjack/models/results.py +35 -0
  236. crackerjack/models/semantic_models.py +258 -0
  237. crackerjack/models/task.py +19 -3
  238. crackerjack/models/test_models.py +60 -0
  239. crackerjack/monitoring/README.md +11 -0
  240. crackerjack/monitoring/ai_agent_watchdog.py +5 -4
  241. crackerjack/monitoring/metrics_collector.py +4 -3
  242. crackerjack/monitoring/regression_prevention.py +4 -3
  243. crackerjack/monitoring/websocket_server.py +4 -241
  244. crackerjack/orchestration/README.md +340 -0
  245. crackerjack/orchestration/__init__.py +43 -0
  246. crackerjack/orchestration/advanced_orchestrator.py +20 -67
  247. crackerjack/orchestration/cache/README.md +312 -0
  248. crackerjack/orchestration/cache/__init__.py +37 -0
  249. crackerjack/orchestration/cache/memory_cache.py +338 -0
  250. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  251. crackerjack/orchestration/config.py +297 -0
  252. crackerjack/orchestration/coverage_improvement.py +13 -6
  253. crackerjack/orchestration/execution_strategies.py +6 -6
  254. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  255. crackerjack/orchestration/strategies/README.md +401 -0
  256. crackerjack/orchestration/strategies/__init__.py +39 -0
  257. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  258. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  259. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  260. crackerjack/orchestration/test_progress_streamer.py +1 -1
  261. crackerjack/plugins/README.md +11 -0
  262. crackerjack/plugins/hooks.py +3 -2
  263. crackerjack/plugins/loader.py +3 -3
  264. crackerjack/plugins/managers.py +1 -1
  265. crackerjack/py313.py +191 -0
  266. crackerjack/security/README.md +11 -0
  267. crackerjack/services/README.md +374 -0
  268. crackerjack/services/__init__.py +8 -21
  269. crackerjack/services/ai/README.md +295 -0
  270. crackerjack/services/ai/__init__.py +7 -0
  271. crackerjack/services/ai/advanced_optimizer.py +878 -0
  272. crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
  273. crackerjack/services/ai/embeddings.py +444 -0
  274. crackerjack/services/ai/intelligent_commit.py +328 -0
  275. crackerjack/services/ai/predictive_analytics.py +510 -0
  276. crackerjack/services/api_extractor.py +5 -3
  277. crackerjack/services/bounded_status_operations.py +45 -5
  278. crackerjack/services/cache.py +249 -318
  279. crackerjack/services/changelog_automation.py +7 -3
  280. crackerjack/services/command_execution_service.py +305 -0
  281. crackerjack/services/config_integrity.py +83 -39
  282. crackerjack/services/config_merge.py +9 -6
  283. crackerjack/services/config_service.py +198 -0
  284. crackerjack/services/config_template.py +13 -26
  285. crackerjack/services/coverage_badge_service.py +6 -4
  286. crackerjack/services/coverage_ratchet.py +53 -27
  287. crackerjack/services/debug.py +18 -7
  288. crackerjack/services/dependency_analyzer.py +4 -4
  289. crackerjack/services/dependency_monitor.py +13 -13
  290. crackerjack/services/documentation_generator.py +4 -2
  291. crackerjack/services/documentation_service.py +62 -33
  292. crackerjack/services/enhanced_filesystem.py +81 -27
  293. crackerjack/services/enterprise_optimizer.py +1 -1
  294. crackerjack/services/error_pattern_analyzer.py +10 -10
  295. crackerjack/services/file_filter.py +221 -0
  296. crackerjack/services/file_hasher.py +5 -7
  297. crackerjack/services/file_io_service.py +361 -0
  298. crackerjack/services/file_modifier.py +615 -0
  299. crackerjack/services/filesystem.py +80 -109
  300. crackerjack/services/git.py +99 -5
  301. crackerjack/services/health_metrics.py +4 -6
  302. crackerjack/services/heatmap_generator.py +12 -3
  303. crackerjack/services/incremental_executor.py +380 -0
  304. crackerjack/services/initialization.py +101 -49
  305. crackerjack/services/log_manager.py +2 -2
  306. crackerjack/services/logging.py +120 -68
  307. crackerjack/services/lsp_client.py +12 -12
  308. crackerjack/services/memory_optimizer.py +27 -22
  309. crackerjack/services/monitoring/README.md +30 -0
  310. crackerjack/services/monitoring/__init__.py +9 -0
  311. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  312. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  313. crackerjack/services/monitoring/health_metrics.py +716 -0
  314. crackerjack/services/monitoring/metrics.py +587 -0
  315. crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
  316. crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
  317. crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
  318. crackerjack/services/parallel_executor.py +166 -55
  319. crackerjack/services/patterns/__init__.py +142 -0
  320. crackerjack/services/patterns/agents.py +107 -0
  321. crackerjack/services/patterns/code/__init__.py +15 -0
  322. crackerjack/services/patterns/code/detection.py +118 -0
  323. crackerjack/services/patterns/code/imports.py +107 -0
  324. crackerjack/services/patterns/code/paths.py +159 -0
  325. crackerjack/services/patterns/code/performance.py +119 -0
  326. crackerjack/services/patterns/code/replacement.py +36 -0
  327. crackerjack/services/patterns/core.py +212 -0
  328. crackerjack/services/patterns/documentation/__init__.py +14 -0
  329. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  330. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  331. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  332. crackerjack/services/patterns/formatting.py +226 -0
  333. crackerjack/services/patterns/operations.py +339 -0
  334. crackerjack/services/patterns/security/__init__.py +23 -0
  335. crackerjack/services/patterns/security/code_injection.py +122 -0
  336. crackerjack/services/patterns/security/credentials.py +190 -0
  337. crackerjack/services/patterns/security/path_traversal.py +221 -0
  338. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  339. crackerjack/services/patterns/templates.py +62 -0
  340. crackerjack/services/patterns/testing/__init__.py +18 -0
  341. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  342. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  343. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  344. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  345. crackerjack/services/patterns/tool_output/other.py +97 -0
  346. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  347. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  348. crackerjack/services/patterns/url_sanitization.py +114 -0
  349. crackerjack/services/patterns/utilities.py +42 -0
  350. crackerjack/services/patterns/utils.py +339 -0
  351. crackerjack/services/patterns/validation.py +46 -0
  352. crackerjack/services/patterns/versioning.py +62 -0
  353. crackerjack/services/predictive_analytics.py +21 -8
  354. crackerjack/services/profiler.py +280 -0
  355. crackerjack/services/quality/README.md +415 -0
  356. crackerjack/services/quality/__init__.py +11 -0
  357. crackerjack/services/quality/anomaly_detector.py +392 -0
  358. crackerjack/services/quality/pattern_cache.py +333 -0
  359. crackerjack/services/quality/pattern_detector.py +479 -0
  360. crackerjack/services/quality/qa_orchestrator.py +491 -0
  361. crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
  362. crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
  363. crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
  364. crackerjack/services/regex_patterns.py +58 -2987
  365. crackerjack/services/regex_utils.py +55 -29
  366. crackerjack/services/secure_status_formatter.py +42 -15
  367. crackerjack/services/secure_subprocess.py +35 -2
  368. crackerjack/services/security.py +16 -8
  369. crackerjack/services/server_manager.py +40 -51
  370. crackerjack/services/smart_scheduling.py +46 -6
  371. crackerjack/services/status_authentication.py +3 -3
  372. crackerjack/services/thread_safe_status_collector.py +1 -0
  373. crackerjack/services/tool_filter.py +368 -0
  374. crackerjack/services/tool_version_service.py +9 -5
  375. crackerjack/services/unified_config.py +43 -351
  376. crackerjack/services/vector_store.py +689 -0
  377. crackerjack/services/version_analyzer.py +6 -4
  378. crackerjack/services/version_checker.py +14 -8
  379. crackerjack/services/zuban_lsp_service.py +5 -4
  380. crackerjack/slash_commands/README.md +11 -0
  381. crackerjack/slash_commands/init.md +2 -12
  382. crackerjack/slash_commands/run.md +84 -50
  383. crackerjack/tools/README.md +11 -0
  384. crackerjack/tools/__init__.py +30 -0
  385. crackerjack/tools/_git_utils.py +105 -0
  386. crackerjack/tools/check_added_large_files.py +139 -0
  387. crackerjack/tools/check_ast.py +105 -0
  388. crackerjack/tools/check_json.py +103 -0
  389. crackerjack/tools/check_jsonschema.py +297 -0
  390. crackerjack/tools/check_toml.py +103 -0
  391. crackerjack/tools/check_yaml.py +110 -0
  392. crackerjack/tools/codespell_wrapper.py +72 -0
  393. crackerjack/tools/end_of_file_fixer.py +202 -0
  394. crackerjack/tools/format_json.py +128 -0
  395. crackerjack/tools/mdformat_wrapper.py +114 -0
  396. crackerjack/tools/trailing_whitespace.py +198 -0
  397. crackerjack/tools/validate_regex_patterns.py +7 -3
  398. crackerjack/ui/README.md +11 -0
  399. crackerjack/ui/dashboard_renderer.py +28 -0
  400. crackerjack/ui/templates/README.md +11 -0
  401. crackerjack/utils/console_utils.py +13 -0
  402. crackerjack/utils/dependency_guard.py +230 -0
  403. crackerjack/utils/retry_utils.py +275 -0
  404. crackerjack/workflows/README.md +590 -0
  405. crackerjack/workflows/__init__.py +46 -0
  406. crackerjack/workflows/actions.py +811 -0
  407. crackerjack/workflows/auto_fix.py +444 -0
  408. crackerjack/workflows/container_builder.py +499 -0
  409. crackerjack/workflows/definitions.py +443 -0
  410. crackerjack/workflows/engine.py +177 -0
  411. crackerjack/workflows/event_bridge.py +242 -0
  412. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
  413. crackerjack-0.45.2.dist-info/RECORD +478 -0
  414. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  415. crackerjack/managers/test_manager_backup.py +0 -1075
  416. crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
  417. crackerjack/mixins/__init__.py +0 -3
  418. crackerjack/mixins/error_handling.py +0 -145
  419. crackerjack/services/config.py +0 -358
  420. crackerjack/ui/server_panels.py +0 -125
  421. crackerjack-0.37.9.dist-info/RECORD +0 -231
  422. /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
  423. /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
  424. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
  425. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,28 @@
1
- import typing as t
1
+ from __future__ import annotations
2
+
2
3
  from dataclasses import dataclass, field
4
+ from pathlib import Path
5
+ from typing import Any
6
+
7
+ from acb.depends import depends
8
+
9
+ from crackerjack.config.settings import (
10
+ AdvancedSettings,
11
+ AISettings,
12
+ CleaningSettings,
13
+ CrackerjackSettings,
14
+ ExecutionSettings,
15
+ GitSettings,
16
+ HookSettings,
17
+ MCPServerSettings,
18
+ ProgressSettings,
19
+ PublishSettings,
20
+ TestSettings,
21
+ ZubanLSPSettings,
22
+ )
23
+ from crackerjack.config.settings import (
24
+ CleanupSettings as CleanupSettingsModel,
25
+ )
3
26
 
4
27
 
5
28
  @dataclass
@@ -9,6 +32,18 @@ class CleaningConfig:
9
32
  force_update_docs: bool = False
10
33
  compress_docs: bool = False
11
34
  auto_compress_docs: bool = False
35
+ targets: list[Path] = field(default_factory=list)
36
+
37
+ @classmethod
38
+ def from_settings(cls, settings: CleaningSettings) -> CleaningConfig:
39
+ return cls(
40
+ clean=settings.clean,
41
+ update_docs=settings.update_docs,
42
+ force_update_docs=settings.force_update_docs,
43
+ compress_docs=settings.compress_docs,
44
+ auto_compress_docs=settings.auto_compress_docs,
45
+ targets=settings.targets if hasattr(settings, "targets") else [],
46
+ )
12
47
 
13
48
 
14
49
  @dataclass
@@ -20,50 +55,143 @@ class HookConfig:
20
55
  enable_ty: bool = False
21
56
  enable_lsp_optimization: bool = False
22
57
 
58
+ @classmethod
59
+ def from_settings(cls, settings: HookSettings) -> HookConfig:
60
+ return cls(
61
+ skip_hooks=settings.skip_hooks,
62
+ update_precommit=settings.update_precommit,
63
+ experimental_hooks=settings.experimental_hooks,
64
+ enable_pyrefly=settings.enable_pyrefly,
65
+ enable_ty=settings.enable_ty,
66
+ enable_lsp_optimization=settings.enable_lsp_optimization,
67
+ )
68
+
23
69
 
24
70
  @dataclass
25
71
  class TestConfig:
26
72
  test: bool = False
27
73
  benchmark: bool = False
74
+ benchmark_regression: bool = False
75
+ benchmark_regression_threshold: float = 0.1
28
76
  test_workers: int = 0
29
77
  test_timeout: int = 0
30
78
 
79
+ @property
80
+ def workers(self) -> int:
81
+ return self.test_workers
82
+
83
+ @workers.setter
84
+ def workers(self, value: int) -> None:
85
+ self.test_workers = value
86
+
87
+ @property
88
+ def timeout(self) -> int:
89
+ return self.test_timeout
90
+
91
+ @timeout.setter
92
+ def timeout(self, value: int) -> None:
93
+ self.test_timeout = value
94
+
95
+ @classmethod
96
+ def from_settings(cls, settings: TestSettings) -> TestConfig:
97
+ return cls(
98
+ test=settings.test,
99
+ benchmark=settings.benchmark,
100
+ benchmark_regression=getattr(settings, "benchmark_regression", False),
101
+ benchmark_regression_threshold=getattr(
102
+ settings,
103
+ "benchmark_regression_threshold",
104
+ 0.1,
105
+ ),
106
+ test_workers=settings.test_workers,
107
+ test_timeout=settings.test_timeout,
108
+ )
109
+
31
110
 
32
111
  @dataclass
33
112
  class PublishConfig:
34
- publish: t.Any | None = None
35
- bump: t.Any | None = None
36
- all: t.Any | None = None
113
+ publish: str | None = None
114
+ bump: str | None = None
115
+ all: str | None = None
116
+ cleanup_pypi: bool = False
117
+ keep_releases: int = 10
37
118
  no_git_tags: bool = False
38
119
  skip_version_check: bool = False
39
120
 
121
+ @classmethod
122
+ def from_settings(cls, settings: PublishSettings) -> PublishConfig:
123
+ return cls(
124
+ publish=settings.publish,
125
+ bump=settings.bump,
126
+ all=settings.all,
127
+ cleanup_pypi=getattr(settings, "cleanup_pypi", False),
128
+ keep_releases=getattr(settings, "keep_releases", 10),
129
+ no_git_tags=settings.no_git_tags,
130
+ skip_version_check=settings.skip_version_check,
131
+ )
132
+
40
133
 
41
134
  @dataclass
42
135
  class GitConfig:
43
136
  commit: bool = False
44
137
  create_pr: bool = False
45
138
 
139
+ @classmethod
140
+ def from_settings(cls, settings: GitSettings) -> GitConfig:
141
+ return cls(commit=settings.commit, create_pr=settings.create_pr)
142
+
46
143
 
47
144
  @dataclass
48
145
  class AIConfig:
49
146
  ai_agent: bool = False
50
- start_mcp_server: bool = False
51
- max_iterations: int = 5
52
147
  autofix: bool = True
53
148
  ai_agent_autofix: bool = False
149
+ start_mcp_server: bool = False
150
+ max_iterations: int = 5
151
+
152
+ @classmethod
153
+ def from_settings(cls, settings: AISettings) -> AIConfig:
154
+ return cls(
155
+ ai_agent=settings.ai_agent,
156
+ autofix=settings.autofix,
157
+ ai_agent_autofix=settings.ai_agent_autofix,
158
+ start_mcp_server=settings.start_mcp_server,
159
+ max_iterations=settings.max_iterations,
160
+ )
54
161
 
55
162
 
56
163
  @dataclass
57
164
  class ExecutionConfig:
58
- interactive: bool = False
165
+ interactive: bool = True
59
166
  verbose: bool = False
60
167
  async_mode: bool = False
61
168
  no_config_updates: bool = False
169
+ dry_run: bool = False
170
+
171
+ @classmethod
172
+ def from_settings(cls, settings: ExecutionSettings) -> ExecutionConfig:
173
+ return cls(
174
+ interactive=settings.interactive,
175
+ verbose=settings.verbose,
176
+ async_mode=settings.async_mode,
177
+ no_config_updates=settings.no_config_updates,
178
+ dry_run=getattr(settings, "dry_run", False),
179
+ )
62
180
 
63
181
 
64
182
  @dataclass
65
183
  class ProgressConfig:
66
- enabled: bool = False
184
+ track_progress: bool = False
185
+ resume_from: str | None = None
186
+ progress_file: str | None = None
187
+
188
+ @classmethod
189
+ def from_settings(cls, settings: ProgressSettings) -> ProgressConfig:
190
+ return cls(
191
+ track_progress=settings.enabled,
192
+ resume_from=getattr(settings, "resume_from", None),
193
+ progress_file=getattr(settings, "progress_file", None),
194
+ )
67
195
 
68
196
 
69
197
  @dataclass
@@ -72,13 +200,32 @@ class CleanupConfig:
72
200
  keep_debug_logs: int = 5
73
201
  keep_coverage_files: int = 10
74
202
 
203
+ @classmethod
204
+ def from_settings(
205
+ cls,
206
+ settings: CleanupSettingsModel,
207
+ ) -> CleanupConfig:
208
+ return cls(
209
+ auto_cleanup=settings.auto_cleanup,
210
+ keep_debug_logs=settings.keep_debug_logs,
211
+ keep_coverage_files=settings.keep_coverage_files,
212
+ )
213
+
75
214
 
76
215
  @dataclass
77
- class EnterpriseConfig:
216
+ class AdvancedConfig:
78
217
  enabled: bool = False
79
218
  license_key: str | None = None
80
219
  organization: str | None = None
81
220
 
221
+ @classmethod
222
+ def from_settings(cls, settings: AdvancedSettings) -> AdvancedConfig:
223
+ return cls(
224
+ enabled=settings.enabled,
225
+ license_key=settings.license_key,
226
+ organization=settings.organization,
227
+ )
228
+
82
229
 
83
230
  @dataclass
84
231
  class MCPServerConfig:
@@ -87,6 +234,15 @@ class MCPServerConfig:
87
234
  websocket_port: int = 8675
88
235
  http_enabled: bool = False
89
236
 
237
+ @classmethod
238
+ def from_settings(cls, settings: MCPServerSettings) -> MCPServerConfig:
239
+ return cls(
240
+ http_port=settings.http_port,
241
+ http_host=settings.http_host,
242
+ websocket_port=settings.websocket_port,
243
+ http_enabled=settings.http_enabled,
244
+ )
245
+
90
246
 
91
247
  @dataclass
92
248
  class ZubanLSPConfig:
@@ -96,18 +252,479 @@ class ZubanLSPConfig:
96
252
  mode: str = "stdio"
97
253
  timeout: int = 30
98
254
 
255
+ @classmethod
256
+ def from_settings(cls, settings: ZubanLSPSettings) -> ZubanLSPConfig:
257
+ return cls(
258
+ enabled=settings.enabled,
259
+ auto_start=settings.auto_start,
260
+ port=settings.port,
261
+ mode=settings.mode,
262
+ timeout=settings.timeout,
263
+ )
99
264
 
100
- @dataclass
265
+
266
+ @dataclass(init=False)
101
267
  class WorkflowOptions:
102
- cleaning: CleaningConfig = field(default_factory=CleaningConfig)
103
- hooks: HookConfig = field(default_factory=HookConfig)
104
- testing: TestConfig = field(default_factory=TestConfig)
105
- publishing: PublishConfig = field(default_factory=PublishConfig)
106
- git: GitConfig = field(default_factory=GitConfig)
107
- ai: AIConfig = field(default_factory=AIConfig)
108
- execution: ExecutionConfig = field(default_factory=ExecutionConfig)
109
- progress: ProgressConfig = field(default_factory=ProgressConfig)
110
- cleanup: CleanupConfig = field(default_factory=CleanupConfig)
111
- enterprise: EnterpriseConfig = field(default_factory=EnterpriseConfig)
112
- mcp_server: MCPServerConfig = field(default_factory=MCPServerConfig)
113
- zuban_lsp: ZubanLSPConfig = field(default_factory=ZubanLSPConfig)
268
+ cleaning: CleaningConfig
269
+ hooks: HookConfig
270
+ testing: TestConfig
271
+ publishing: PublishConfig
272
+ git: GitConfig
273
+ ai: AIConfig
274
+ execution: ExecutionConfig
275
+ progress: ProgressConfig
276
+ cleanup: CleanupConfig
277
+ advanced: AdvancedConfig
278
+ mcp_server: MCPServerConfig
279
+ zuban_lsp: ZubanLSPConfig
280
+
281
+ _DEFAULT_OVERRIDES: dict[str, Any] = field(
282
+ default_factory=lambda: {
283
+ "clean": False,
284
+ "test": False,
285
+ "publish": None,
286
+ "bump": None,
287
+ "commit": False,
288
+ "create_pr": False,
289
+ "interactive": True,
290
+ "dry_run": False,
291
+ },
292
+ init=False,
293
+ )
294
+
295
+ def _initialize_config_attributes(
296
+ self,
297
+ cleaning: CleaningConfig | None,
298
+ hooks: HookConfig | None,
299
+ testing: TestConfig | None,
300
+ publishing: PublishConfig | None,
301
+ git: GitConfig | None,
302
+ ai: AIConfig | None,
303
+ execution: ExecutionConfig | None,
304
+ progress: ProgressConfig | None,
305
+ cleanup: CleanupConfig | None,
306
+ advanced: AdvancedConfig | None,
307
+ mcp_server: MCPServerConfig | None,
308
+ zuban_lsp: ZubanLSPConfig | None,
309
+ ) -> None:
310
+ """Initialize all configuration attributes."""
311
+ self.cleaning = cleaning or CleaningConfig()
312
+ self.hooks = hooks or HookConfig()
313
+ self.testing = testing or TestConfig()
314
+ self.publishing = publishing or PublishConfig()
315
+ self.git = git or GitConfig()
316
+ self.ai = ai or AIConfig()
317
+ self.execution = execution or ExecutionConfig()
318
+ self.progress = progress or ProgressConfig()
319
+ self.cleanup = cleanup or CleanupConfig()
320
+ self.advanced = advanced or AdvancedConfig()
321
+ self.mcp_server = mcp_server or MCPServerConfig()
322
+ self.zuban_lsp = zuban_lsp or ZubanLSPConfig()
323
+
324
+ def _set_default_overrides(self, kwargs: dict[str, Any]) -> None:
325
+ """Set default overrides for specific attributes."""
326
+ self._DEFAULT_OVERRIDES = {
327
+ "clean": False,
328
+ "test": False,
329
+ "publish": None,
330
+ "bump": None,
331
+ "commit": False,
332
+ "create_pr": False,
333
+ "interactive": True,
334
+ "dry_run": False,
335
+ }
336
+
337
+ for attr, value in self._DEFAULT_OVERRIDES.items():
338
+ if attr not in kwargs:
339
+ setattr(self, attr, value)
340
+
341
+ def _set_kwargs_attributes(self, kwargs: dict[str, Any]) -> None:
342
+ """Set attributes based on provided kwargs."""
343
+ for attr, value in kwargs.items():
344
+ if hasattr(self.__class__, attr):
345
+ setattr(self, attr, value)
346
+ elif hasattr(self, attr):
347
+ setattr(self, attr, value)
348
+
349
+ def __init__(
350
+ self,
351
+ *,
352
+ cleaning: CleaningConfig | None = None,
353
+ hooks: HookConfig | None = None,
354
+ testing: TestConfig | None = None,
355
+ publishing: PublishConfig | None = None,
356
+ git: GitConfig | None = None,
357
+ ai: AIConfig | None = None,
358
+ execution: ExecutionConfig | None = None,
359
+ progress: ProgressConfig | None = None,
360
+ cleanup: CleanupConfig | None = None,
361
+ advanced: AdvancedConfig | None = None,
362
+ mcp_server: MCPServerConfig | None = None,
363
+ zuban_lsp: ZubanLSPConfig | None = None,
364
+ **kwargs: Any,
365
+ ) -> None:
366
+ self._initialize_config_attributes(
367
+ cleaning,
368
+ hooks,
369
+ testing,
370
+ publishing,
371
+ git,
372
+ ai,
373
+ execution,
374
+ progress,
375
+ cleanup,
376
+ advanced,
377
+ mcp_server,
378
+ zuban_lsp,
379
+ )
380
+ self._set_default_overrides(kwargs)
381
+ self._set_kwargs_attributes(kwargs)
382
+
383
+ # Convenience property mappings
384
+ @property
385
+ def clean(self) -> bool:
386
+ return self.cleaning.clean
387
+
388
+ @clean.setter
389
+ def clean(self, value: bool) -> None:
390
+ self.cleaning.clean = value
391
+
392
+ @property
393
+ def update_docs(self) -> bool:
394
+ return self.cleaning.update_docs
395
+
396
+ @update_docs.setter
397
+ def update_docs(self, value: bool) -> None:
398
+ self.cleaning.update_docs = value
399
+
400
+ @property
401
+ def test(self) -> bool:
402
+ return self.testing.test
403
+
404
+ @test.setter
405
+ def test(self, value: bool) -> None:
406
+ self.testing.test = value
407
+
408
+ @property
409
+ def benchmark(self) -> bool:
410
+ return self.testing.benchmark
411
+
412
+ @benchmark.setter
413
+ def benchmark(self, value: bool) -> None:
414
+ self.testing.benchmark = value
415
+
416
+ @property
417
+ def benchmark_regression(self) -> bool:
418
+ return self.testing.benchmark_regression
419
+
420
+ @benchmark_regression.setter
421
+ def benchmark_regression(self, value: bool) -> None:
422
+ self.testing.benchmark_regression = value
423
+
424
+ @property
425
+ def benchmark_regression_threshold(self) -> float:
426
+ return self.testing.benchmark_regression_threshold
427
+
428
+ @benchmark_regression_threshold.setter
429
+ def benchmark_regression_threshold(self, value: float) -> None:
430
+ self.testing.benchmark_regression_threshold = value
431
+
432
+ @property
433
+ def test_workers(self) -> int:
434
+ return self.testing.test_workers
435
+
436
+ @test_workers.setter
437
+ def test_workers(self, value: int) -> None:
438
+ self.testing.test_workers = value
439
+
440
+ @property
441
+ def test_timeout(self) -> int:
442
+ return self.testing.test_timeout
443
+
444
+ @test_timeout.setter
445
+ def test_timeout(self, value: int) -> None:
446
+ self.testing.test_timeout = value
447
+
448
+ @property
449
+ def publish(self) -> str | None:
450
+ return self.publishing.publish
451
+
452
+ @publish.setter
453
+ def publish(self, value: str | None) -> None:
454
+ self.publishing.publish = value
455
+
456
+ @property
457
+ def bump(self) -> str | None:
458
+ return self.publishing.bump
459
+
460
+ @bump.setter
461
+ def bump(self, value: str | None) -> None:
462
+ self.publishing.bump = value
463
+
464
+ @property
465
+ def all(self) -> str | None:
466
+ return self.publishing.all
467
+
468
+ @all.setter
469
+ def all(self, value: str | None) -> None:
470
+ self.publishing.all = value
471
+
472
+ @property
473
+ def commit(self) -> bool:
474
+ return self.git.commit
475
+
476
+ @commit.setter
477
+ def commit(self, value: bool) -> None:
478
+ self.git.commit = value
479
+
480
+ @property
481
+ def create_pr(self) -> bool:
482
+ return self.git.create_pr
483
+
484
+ @create_pr.setter
485
+ def create_pr(self, value: bool) -> None:
486
+ self.git.create_pr = value
487
+
488
+ @property
489
+ def ai_agent(self) -> bool:
490
+ return self.ai.ai_agent
491
+
492
+ @ai_agent.setter
493
+ def ai_agent(self, value: bool) -> None:
494
+ self.ai.ai_agent = value
495
+
496
+ @property
497
+ def autofix(self) -> bool:
498
+ return self.ai.autofix
499
+
500
+ @autofix.setter
501
+ def autofix(self, value: bool) -> None:
502
+ self.ai.autofix = value
503
+
504
+ @property
505
+ def ai_agent_autofix(self) -> bool:
506
+ return self.ai.ai_agent_autofix
507
+
508
+ @ai_agent_autofix.setter
509
+ def ai_agent_autofix(self, value: bool) -> None:
510
+ self.ai.ai_agent_autofix = value
511
+
512
+ @property
513
+ def start_mcp_server(self) -> bool:
514
+ return self.ai.start_mcp_server
515
+
516
+ @start_mcp_server.setter
517
+ def start_mcp_server(self, value: bool) -> None:
518
+ self.ai.start_mcp_server = value
519
+
520
+ @property
521
+ def max_iterations(self) -> int:
522
+ return self.ai.max_iterations
523
+
524
+ @max_iterations.setter
525
+ def max_iterations(self, value: int) -> None:
526
+ self.ai.max_iterations = value
527
+
528
+ @property
529
+ def interactive(self) -> bool:
530
+ return self.execution.interactive
531
+
532
+ @interactive.setter
533
+ def interactive(self, value: bool) -> None:
534
+ self.execution.interactive = value
535
+
536
+ @property
537
+ def verbose(self) -> bool:
538
+ return self.execution.verbose
539
+
540
+ @verbose.setter
541
+ def verbose(self, value: bool) -> None:
542
+ self.execution.verbose = value
543
+
544
+ @property
545
+ def async_mode(self) -> bool:
546
+ return self.execution.async_mode
547
+
548
+ @async_mode.setter
549
+ def async_mode(self, value: bool) -> None:
550
+ self.execution.async_mode = value
551
+
552
+ @property
553
+ def no_config_updates(self) -> bool:
554
+ return self.execution.no_config_updates
555
+
556
+ @no_config_updates.setter
557
+ def no_config_updates(self, value: bool) -> None:
558
+ self.execution.no_config_updates = value
559
+
560
+ @property
561
+ def dry_run(self) -> bool:
562
+ return self.execution.dry_run
563
+
564
+ @dry_run.setter
565
+ def dry_run(self, value: bool) -> None:
566
+ self.execution.dry_run = value
567
+
568
+ @property
569
+ def skip_hooks(self) -> bool:
570
+ return self.hooks.skip_hooks
571
+
572
+ @skip_hooks.setter
573
+ def skip_hooks(self, value: bool) -> None:
574
+ self.hooks.skip_hooks = value
575
+
576
+ @property
577
+ def update_precommit(self) -> bool:
578
+ return self.hooks.update_precommit
579
+
580
+ @update_precommit.setter
581
+ def update_precommit(self, value: bool) -> None:
582
+ self.hooks.update_precommit = value
583
+
584
+ @property
585
+ def experimental_hooks(self) -> bool:
586
+ return self.hooks.experimental_hooks
587
+
588
+ @experimental_hooks.setter
589
+ def experimental_hooks(self, value: bool) -> None:
590
+ self.hooks.experimental_hooks = value
591
+
592
+ @property
593
+ def enable_pyrefly(self) -> bool:
594
+ return self.hooks.enable_pyrefly
595
+
596
+ @enable_pyrefly.setter
597
+ def enable_pyrefly(self, value: bool) -> None:
598
+ self.hooks.enable_pyrefly = value
599
+
600
+ @property
601
+ def enable_ty(self) -> bool:
602
+ return self.hooks.enable_ty
603
+
604
+ @enable_ty.setter
605
+ def enable_ty(self, value: bool) -> None:
606
+ self.hooks.enable_ty = value
607
+
608
+ @property
609
+ def enable_lsp_optimization(self) -> bool:
610
+ return self.hooks.enable_lsp_optimization
611
+
612
+ @enable_lsp_optimization.setter
613
+ def enable_lsp_optimization(self, value: bool) -> None:
614
+ self.hooks.enable_lsp_optimization = value
615
+
616
+ @property
617
+ def track_progress(self) -> bool:
618
+ return self.progress.track_progress
619
+
620
+ @track_progress.setter
621
+ def track_progress(self, value: bool) -> None:
622
+ self.progress.track_progress = value
623
+
624
+ @property
625
+ def resume_from(self) -> str | None:
626
+ return self.progress.resume_from
627
+
628
+ @resume_from.setter
629
+ def resume_from(self, value: str | None) -> None:
630
+ self.progress.resume_from = value
631
+
632
+ @property
633
+ def progress_file(self) -> str | None:
634
+ return self.progress.progress_file
635
+
636
+ @progress_file.setter
637
+ def progress_file(self, value: str | None) -> None:
638
+ self.progress.progress_file = value
639
+
640
+ @classmethod
641
+ def from_settings(cls, settings: CrackerjackSettings) -> WorkflowOptions:
642
+ return cls(
643
+ cleaning=CleaningConfig.from_settings(settings.cleaning),
644
+ hooks=HookConfig.from_settings(settings.hooks),
645
+ testing=TestConfig.from_settings(settings.testing),
646
+ publishing=PublishConfig.from_settings(settings.publishing),
647
+ git=GitConfig.from_settings(settings.git),
648
+ ai=AIConfig.from_settings(settings.ai),
649
+ execution=ExecutionConfig.from_settings(settings.execution),
650
+ progress=ProgressConfig.from_settings(settings.progress),
651
+ cleanup=CleanupConfig.from_settings(settings.cleanup),
652
+ advanced=AdvancedConfig.from_settings(settings.advanced),
653
+ mcp_server=MCPServerConfig.from_settings(settings.mcp_server),
654
+ zuban_lsp=ZubanLSPConfig.from_settings(settings.zuban_lsp),
655
+ )
656
+
657
+ def to_settings(self) -> CrackerjackSettings:
658
+ return CrackerjackSettings(
659
+ cleaning=self.cleaning.__dict__,
660
+ hooks=self.hooks.__dict__,
661
+ testing=self.testing.__dict__,
662
+ publishing=self.publishing.__dict__,
663
+ git=self.git.__dict__,
664
+ ai=self.ai.__dict__,
665
+ execution=self.execution.__dict__,
666
+ progress={"enabled": self.progress.track_progress},
667
+ cleanup=self.cleanup.__dict__,
668
+ advanced=self.advanced.__dict__,
669
+ mcp_server=self.mcp_server.__dict__,
670
+ zuban_lsp=self.zuban_lsp.__dict__,
671
+ )
672
+
673
+ @classmethod
674
+ def from_args(cls, args: Any) -> WorkflowOptions:
675
+ simple_fields = [
676
+ "clean",
677
+ "test",
678
+ "publish",
679
+ "bump",
680
+ "commit",
681
+ "create_pr",
682
+ "dry_run",
683
+ ]
684
+ kwargs = {
685
+ field: getattr(args, field)
686
+ for field in simple_fields
687
+ if hasattr(args, field)
688
+ }
689
+ return cls(**kwargs)
690
+
691
+ def to_dict(self) -> dict[str, Any]:
692
+ return {
693
+ "cleaning": self.cleaning.__dict__,
694
+ "hooks": self.hooks.__dict__,
695
+ "testing": self.testing.__dict__,
696
+ "publishing": self.publishing.__dict__,
697
+ "git": self.git.__dict__,
698
+ "ai": self.ai.__dict__,
699
+ "execution": self.execution.__dict__,
700
+ "progress": self.progress.__dict__,
701
+ "cleanup": self.cleanup.__dict__,
702
+ "advanced": self.advanced.__dict__,
703
+ "mcp_server": self.mcp_server.__dict__,
704
+ "zuban_lsp": self.zuban_lsp.__dict__,
705
+ }
706
+
707
+
708
+ from typing import cast
709
+
710
+
711
+ def get_workflow_options() -> CrackerjackSettings:
712
+ return cast(CrackerjackSettings, depends.get_sync(CrackerjackSettings))
713
+
714
+
715
+ __all__ = [
716
+ "AIConfig",
717
+ "CleaningConfig",
718
+ "CleanupConfig",
719
+ "AdvancedConfig",
720
+ "ExecutionConfig",
721
+ "GitConfig",
722
+ "HookConfig",
723
+ "MCPServerConfig",
724
+ "PublishConfig",
725
+ "ProgressConfig",
726
+ "TestConfig",
727
+ "WorkflowOptions",
728
+ "ZubanLSPConfig",
729
+ "get_workflow_options",
730
+ ]