crackerjack 0.18.2__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 (533) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +96 -2
  3. crackerjack/__main__.py +637 -138
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +39 -0
  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/lsp/_base.py +194 -0
  27. crackerjack/adapters/lsp/_client.py +358 -0
  28. crackerjack/adapters/lsp/_manager.py +193 -0
  29. crackerjack/adapters/lsp/skylos.py +283 -0
  30. crackerjack/adapters/lsp/zuban.py +557 -0
  31. crackerjack/adapters/refactor/README.md +59 -0
  32. crackerjack/adapters/refactor/__init__.py +12 -0
  33. crackerjack/adapters/refactor/creosote.py +318 -0
  34. crackerjack/adapters/refactor/refurb.py +406 -0
  35. crackerjack/adapters/refactor/skylos.py +494 -0
  36. crackerjack/adapters/sast/README.md +132 -0
  37. crackerjack/adapters/sast/__init__.py +32 -0
  38. crackerjack/adapters/sast/_base.py +201 -0
  39. crackerjack/adapters/sast/bandit.py +423 -0
  40. crackerjack/adapters/sast/pyscn.py +405 -0
  41. crackerjack/adapters/sast/semgrep.py +241 -0
  42. crackerjack/adapters/security/README.md +111 -0
  43. crackerjack/adapters/security/__init__.py +17 -0
  44. crackerjack/adapters/security/gitleaks.py +339 -0
  45. crackerjack/adapters/type/README.md +52 -0
  46. crackerjack/adapters/type/__init__.py +12 -0
  47. crackerjack/adapters/type/pyrefly.py +402 -0
  48. crackerjack/adapters/type/ty.py +402 -0
  49. crackerjack/adapters/type/zuban.py +522 -0
  50. crackerjack/adapters/utility/README.md +51 -0
  51. crackerjack/adapters/utility/__init__.py +10 -0
  52. crackerjack/adapters/utility/checks.py +884 -0
  53. crackerjack/agents/README.md +264 -0
  54. crackerjack/agents/__init__.py +66 -0
  55. crackerjack/agents/architect_agent.py +238 -0
  56. crackerjack/agents/base.py +167 -0
  57. crackerjack/agents/claude_code_bridge.py +641 -0
  58. crackerjack/agents/coordinator.py +600 -0
  59. crackerjack/agents/documentation_agent.py +520 -0
  60. crackerjack/agents/dry_agent.py +585 -0
  61. crackerjack/agents/enhanced_coordinator.py +279 -0
  62. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  63. crackerjack/agents/error_middleware.py +53 -0
  64. crackerjack/agents/formatting_agent.py +230 -0
  65. crackerjack/agents/helpers/__init__.py +9 -0
  66. crackerjack/agents/helpers/performance/__init__.py +22 -0
  67. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  68. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  69. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  70. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  71. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  72. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  73. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  74. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  75. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  76. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  77. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  78. crackerjack/agents/import_optimization_agent.py +1181 -0
  79. crackerjack/agents/performance_agent.py +325 -0
  80. crackerjack/agents/performance_helpers.py +205 -0
  81. crackerjack/agents/proactive_agent.py +55 -0
  82. crackerjack/agents/refactoring_agent.py +511 -0
  83. crackerjack/agents/refactoring_helpers.py +247 -0
  84. crackerjack/agents/security_agent.py +793 -0
  85. crackerjack/agents/semantic_agent.py +479 -0
  86. crackerjack/agents/semantic_helpers.py +356 -0
  87. crackerjack/agents/test_creation_agent.py +570 -0
  88. crackerjack/agents/test_specialist_agent.py +526 -0
  89. crackerjack/agents/tracker.py +110 -0
  90. crackerjack/api.py +647 -0
  91. crackerjack/cli/README.md +394 -0
  92. crackerjack/cli/__init__.py +24 -0
  93. crackerjack/cli/cache_handlers.py +209 -0
  94. crackerjack/cli/cache_handlers_enhanced.py +680 -0
  95. crackerjack/cli/facade.py +162 -0
  96. crackerjack/cli/formatting.py +13 -0
  97. crackerjack/cli/handlers/__init__.py +85 -0
  98. crackerjack/cli/handlers/advanced.py +103 -0
  99. crackerjack/cli/handlers/ai_features.py +62 -0
  100. crackerjack/cli/handlers/analytics.py +479 -0
  101. crackerjack/cli/handlers/changelog.py +271 -0
  102. crackerjack/cli/handlers/config_handlers.py +16 -0
  103. crackerjack/cli/handlers/coverage.py +84 -0
  104. crackerjack/cli/handlers/documentation.py +280 -0
  105. crackerjack/cli/handlers/main_handlers.py +497 -0
  106. crackerjack/cli/handlers/monitoring.py +371 -0
  107. crackerjack/cli/handlers.py +700 -0
  108. crackerjack/cli/interactive.py +488 -0
  109. crackerjack/cli/options.py +1216 -0
  110. crackerjack/cli/semantic_handlers.py +292 -0
  111. crackerjack/cli/utils.py +19 -0
  112. crackerjack/cli/version.py +19 -0
  113. crackerjack/code_cleaner.py +1307 -0
  114. crackerjack/config/README.md +472 -0
  115. crackerjack/config/__init__.py +275 -0
  116. crackerjack/config/global_lock_config.py +207 -0
  117. crackerjack/config/hooks.py +390 -0
  118. crackerjack/config/loader.py +239 -0
  119. crackerjack/config/settings.py +141 -0
  120. crackerjack/config/tool_commands.py +331 -0
  121. crackerjack/core/README.md +393 -0
  122. crackerjack/core/__init__.py +0 -0
  123. crackerjack/core/async_workflow_orchestrator.py +738 -0
  124. crackerjack/core/autofix_coordinator.py +282 -0
  125. crackerjack/core/container.py +105 -0
  126. crackerjack/core/enhanced_container.py +583 -0
  127. crackerjack/core/file_lifecycle.py +472 -0
  128. crackerjack/core/performance.py +244 -0
  129. crackerjack/core/performance_monitor.py +357 -0
  130. crackerjack/core/phase_coordinator.py +1227 -0
  131. crackerjack/core/proactive_workflow.py +267 -0
  132. crackerjack/core/resource_manager.py +425 -0
  133. crackerjack/core/retry.py +275 -0
  134. crackerjack/core/service_watchdog.py +601 -0
  135. crackerjack/core/session_coordinator.py +239 -0
  136. crackerjack/core/timeout_manager.py +563 -0
  137. crackerjack/core/websocket_lifecycle.py +410 -0
  138. crackerjack/core/workflow/__init__.py +21 -0
  139. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  140. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  141. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  142. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  143. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  144. crackerjack/core/workflow_orchestrator.py +2243 -0
  145. crackerjack/data/README.md +11 -0
  146. crackerjack/data/__init__.py +8 -0
  147. crackerjack/data/models.py +79 -0
  148. crackerjack/data/repository.py +210 -0
  149. crackerjack/decorators/README.md +180 -0
  150. crackerjack/decorators/__init__.py +35 -0
  151. crackerjack/decorators/error_handling.py +649 -0
  152. crackerjack/decorators/error_handling_decorators.py +334 -0
  153. crackerjack/decorators/helpers.py +58 -0
  154. crackerjack/decorators/patterns.py +281 -0
  155. crackerjack/decorators/utils.py +58 -0
  156. crackerjack/docs/INDEX.md +11 -0
  157. crackerjack/docs/README.md +11 -0
  158. crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
  159. crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
  160. crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
  161. crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
  162. crackerjack/docs/generated/api/SERVICES.md +1252 -0
  163. crackerjack/documentation/README.md +11 -0
  164. crackerjack/documentation/__init__.py +31 -0
  165. crackerjack/documentation/ai_templates.py +756 -0
  166. crackerjack/documentation/dual_output_generator.py +767 -0
  167. crackerjack/documentation/mkdocs_integration.py +518 -0
  168. crackerjack/documentation/reference_generator.py +1065 -0
  169. crackerjack/dynamic_config.py +678 -0
  170. crackerjack/errors.py +378 -0
  171. crackerjack/events/README.md +11 -0
  172. crackerjack/events/__init__.py +16 -0
  173. crackerjack/events/telemetry.py +175 -0
  174. crackerjack/events/workflow_bus.py +346 -0
  175. crackerjack/exceptions/README.md +301 -0
  176. crackerjack/exceptions/__init__.py +5 -0
  177. crackerjack/exceptions/config.py +4 -0
  178. crackerjack/exceptions/tool_execution_error.py +245 -0
  179. crackerjack/executors/README.md +591 -0
  180. crackerjack/executors/__init__.py +13 -0
  181. crackerjack/executors/async_hook_executor.py +938 -0
  182. crackerjack/executors/cached_hook_executor.py +316 -0
  183. crackerjack/executors/hook_executor.py +1295 -0
  184. crackerjack/executors/hook_lock_manager.py +708 -0
  185. crackerjack/executors/individual_hook_executor.py +739 -0
  186. crackerjack/executors/lsp_aware_hook_executor.py +349 -0
  187. crackerjack/executors/progress_hook_executor.py +282 -0
  188. crackerjack/executors/tool_proxy.py +433 -0
  189. crackerjack/hooks/README.md +485 -0
  190. crackerjack/hooks/lsp_hook.py +93 -0
  191. crackerjack/intelligence/README.md +557 -0
  192. crackerjack/intelligence/__init__.py +37 -0
  193. crackerjack/intelligence/adaptive_learning.py +693 -0
  194. crackerjack/intelligence/agent_orchestrator.py +485 -0
  195. crackerjack/intelligence/agent_registry.py +377 -0
  196. crackerjack/intelligence/agent_selector.py +439 -0
  197. crackerjack/intelligence/integration.py +250 -0
  198. crackerjack/interactive.py +719 -0
  199. crackerjack/managers/README.md +369 -0
  200. crackerjack/managers/__init__.py +11 -0
  201. crackerjack/managers/async_hook_manager.py +135 -0
  202. crackerjack/managers/hook_manager.py +585 -0
  203. crackerjack/managers/publish_manager.py +631 -0
  204. crackerjack/managers/test_command_builder.py +391 -0
  205. crackerjack/managers/test_executor.py +474 -0
  206. crackerjack/managers/test_manager.py +1357 -0
  207. crackerjack/managers/test_progress.py +187 -0
  208. crackerjack/mcp/README.md +374 -0
  209. crackerjack/mcp/__init__.py +0 -0
  210. crackerjack/mcp/cache.py +352 -0
  211. crackerjack/mcp/client_runner.py +121 -0
  212. crackerjack/mcp/context.py +802 -0
  213. crackerjack/mcp/dashboard.py +657 -0
  214. crackerjack/mcp/enhanced_progress_monitor.py +493 -0
  215. crackerjack/mcp/file_monitor.py +394 -0
  216. crackerjack/mcp/progress_components.py +607 -0
  217. crackerjack/mcp/progress_monitor.py +1016 -0
  218. crackerjack/mcp/rate_limiter.py +336 -0
  219. crackerjack/mcp/server.py +24 -0
  220. crackerjack/mcp/server_core.py +526 -0
  221. crackerjack/mcp/service_watchdog.py +505 -0
  222. crackerjack/mcp/state.py +407 -0
  223. crackerjack/mcp/task_manager.py +259 -0
  224. crackerjack/mcp/tools/README.md +27 -0
  225. crackerjack/mcp/tools/__init__.py +19 -0
  226. crackerjack/mcp/tools/core_tools.py +469 -0
  227. crackerjack/mcp/tools/error_analyzer.py +283 -0
  228. crackerjack/mcp/tools/execution_tools.py +384 -0
  229. crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
  230. crackerjack/mcp/tools/intelligence_tools.py +264 -0
  231. crackerjack/mcp/tools/monitoring_tools.py +628 -0
  232. crackerjack/mcp/tools/proactive_tools.py +367 -0
  233. crackerjack/mcp/tools/progress_tools.py +222 -0
  234. crackerjack/mcp/tools/semantic_tools.py +584 -0
  235. crackerjack/mcp/tools/utility_tools.py +358 -0
  236. crackerjack/mcp/tools/workflow_executor.py +699 -0
  237. crackerjack/mcp/websocket/README.md +31 -0
  238. crackerjack/mcp/websocket/__init__.py +14 -0
  239. crackerjack/mcp/websocket/app.py +54 -0
  240. crackerjack/mcp/websocket/endpoints.py +492 -0
  241. crackerjack/mcp/websocket/event_bridge.py +188 -0
  242. crackerjack/mcp/websocket/jobs.py +406 -0
  243. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  244. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  245. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  246. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  247. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  248. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  249. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  250. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  251. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  252. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  253. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  254. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  255. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  256. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  257. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  258. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  259. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  260. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  261. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  262. crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
  263. crackerjack/mcp/websocket/server.py +174 -0
  264. crackerjack/mcp/websocket/websocket_handler.py +276 -0
  265. crackerjack/mcp/websocket_server.py +10 -0
  266. crackerjack/models/README.md +308 -0
  267. crackerjack/models/__init__.py +40 -0
  268. crackerjack/models/config.py +730 -0
  269. crackerjack/models/config_adapter.py +265 -0
  270. crackerjack/models/protocols.py +1535 -0
  271. crackerjack/models/pydantic_models.py +320 -0
  272. crackerjack/models/qa_config.py +145 -0
  273. crackerjack/models/qa_results.py +134 -0
  274. crackerjack/models/resource_protocols.py +299 -0
  275. crackerjack/models/results.py +35 -0
  276. crackerjack/models/semantic_models.py +258 -0
  277. crackerjack/models/task.py +173 -0
  278. crackerjack/models/test_models.py +60 -0
  279. crackerjack/monitoring/README.md +11 -0
  280. crackerjack/monitoring/__init__.py +0 -0
  281. crackerjack/monitoring/ai_agent_watchdog.py +405 -0
  282. crackerjack/monitoring/metrics_collector.py +427 -0
  283. crackerjack/monitoring/regression_prevention.py +580 -0
  284. crackerjack/monitoring/websocket_server.py +406 -0
  285. crackerjack/orchestration/README.md +340 -0
  286. crackerjack/orchestration/__init__.py +43 -0
  287. crackerjack/orchestration/advanced_orchestrator.py +894 -0
  288. crackerjack/orchestration/cache/README.md +312 -0
  289. crackerjack/orchestration/cache/__init__.py +37 -0
  290. crackerjack/orchestration/cache/memory_cache.py +338 -0
  291. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  292. crackerjack/orchestration/config.py +297 -0
  293. crackerjack/orchestration/coverage_improvement.py +180 -0
  294. crackerjack/orchestration/execution_strategies.py +361 -0
  295. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  296. crackerjack/orchestration/strategies/README.md +401 -0
  297. crackerjack/orchestration/strategies/__init__.py +39 -0
  298. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  299. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  300. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  301. crackerjack/orchestration/test_progress_streamer.py +647 -0
  302. crackerjack/plugins/README.md +11 -0
  303. crackerjack/plugins/__init__.py +15 -0
  304. crackerjack/plugins/base.py +200 -0
  305. crackerjack/plugins/hooks.py +254 -0
  306. crackerjack/plugins/loader.py +335 -0
  307. crackerjack/plugins/managers.py +264 -0
  308. crackerjack/py313.py +191 -0
  309. crackerjack/security/README.md +11 -0
  310. crackerjack/security/__init__.py +0 -0
  311. crackerjack/security/audit.py +197 -0
  312. crackerjack/services/README.md +374 -0
  313. crackerjack/services/__init__.py +9 -0
  314. crackerjack/services/ai/README.md +295 -0
  315. crackerjack/services/ai/__init__.py +7 -0
  316. crackerjack/services/ai/advanced_optimizer.py +878 -0
  317. crackerjack/services/ai/contextual_ai_assistant.py +542 -0
  318. crackerjack/services/ai/embeddings.py +444 -0
  319. crackerjack/services/ai/intelligent_commit.py +328 -0
  320. crackerjack/services/ai/predictive_analytics.py +510 -0
  321. crackerjack/services/anomaly_detector.py +392 -0
  322. crackerjack/services/api_extractor.py +617 -0
  323. crackerjack/services/backup_service.py +467 -0
  324. crackerjack/services/bounded_status_operations.py +530 -0
  325. crackerjack/services/cache.py +369 -0
  326. crackerjack/services/changelog_automation.py +399 -0
  327. crackerjack/services/command_execution_service.py +305 -0
  328. crackerjack/services/config_integrity.py +132 -0
  329. crackerjack/services/config_merge.py +546 -0
  330. crackerjack/services/config_service.py +198 -0
  331. crackerjack/services/config_template.py +493 -0
  332. crackerjack/services/coverage_badge_service.py +173 -0
  333. crackerjack/services/coverage_ratchet.py +381 -0
  334. crackerjack/services/debug.py +733 -0
  335. crackerjack/services/dependency_analyzer.py +460 -0
  336. crackerjack/services/dependency_monitor.py +622 -0
  337. crackerjack/services/documentation_generator.py +493 -0
  338. crackerjack/services/documentation_service.py +704 -0
  339. crackerjack/services/enhanced_filesystem.py +497 -0
  340. crackerjack/services/enterprise_optimizer.py +865 -0
  341. crackerjack/services/error_pattern_analyzer.py +676 -0
  342. crackerjack/services/file_filter.py +221 -0
  343. crackerjack/services/file_hasher.py +149 -0
  344. crackerjack/services/file_io_service.py +361 -0
  345. crackerjack/services/file_modifier.py +615 -0
  346. crackerjack/services/filesystem.py +381 -0
  347. crackerjack/services/git.py +422 -0
  348. crackerjack/services/health_metrics.py +615 -0
  349. crackerjack/services/heatmap_generator.py +744 -0
  350. crackerjack/services/incremental_executor.py +380 -0
  351. crackerjack/services/initialization.py +823 -0
  352. crackerjack/services/input_validator.py +668 -0
  353. crackerjack/services/intelligent_commit.py +327 -0
  354. crackerjack/services/log_manager.py +289 -0
  355. crackerjack/services/logging.py +228 -0
  356. crackerjack/services/lsp_client.py +628 -0
  357. crackerjack/services/memory_optimizer.py +414 -0
  358. crackerjack/services/metrics.py +587 -0
  359. crackerjack/services/monitoring/README.md +30 -0
  360. crackerjack/services/monitoring/__init__.py +9 -0
  361. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  362. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  363. crackerjack/services/monitoring/health_metrics.py +716 -0
  364. crackerjack/services/monitoring/metrics.py +587 -0
  365. crackerjack/services/monitoring/performance_benchmarks.py +410 -0
  366. crackerjack/services/monitoring/performance_cache.py +388 -0
  367. crackerjack/services/monitoring/performance_monitor.py +569 -0
  368. crackerjack/services/parallel_executor.py +527 -0
  369. crackerjack/services/pattern_cache.py +333 -0
  370. crackerjack/services/pattern_detector.py +478 -0
  371. crackerjack/services/patterns/__init__.py +142 -0
  372. crackerjack/services/patterns/agents.py +107 -0
  373. crackerjack/services/patterns/code/__init__.py +15 -0
  374. crackerjack/services/patterns/code/detection.py +118 -0
  375. crackerjack/services/patterns/code/imports.py +107 -0
  376. crackerjack/services/patterns/code/paths.py +159 -0
  377. crackerjack/services/patterns/code/performance.py +119 -0
  378. crackerjack/services/patterns/code/replacement.py +36 -0
  379. crackerjack/services/patterns/core.py +212 -0
  380. crackerjack/services/patterns/documentation/__init__.py +14 -0
  381. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  382. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  383. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  384. crackerjack/services/patterns/formatting.py +226 -0
  385. crackerjack/services/patterns/operations.py +339 -0
  386. crackerjack/services/patterns/security/__init__.py +23 -0
  387. crackerjack/services/patterns/security/code_injection.py +122 -0
  388. crackerjack/services/patterns/security/credentials.py +190 -0
  389. crackerjack/services/patterns/security/path_traversal.py +221 -0
  390. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  391. crackerjack/services/patterns/templates.py +62 -0
  392. crackerjack/services/patterns/testing/__init__.py +18 -0
  393. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  394. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  395. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  396. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  397. crackerjack/services/patterns/tool_output/other.py +97 -0
  398. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  399. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  400. crackerjack/services/patterns/url_sanitization.py +114 -0
  401. crackerjack/services/patterns/utilities.py +42 -0
  402. crackerjack/services/patterns/utils.py +339 -0
  403. crackerjack/services/patterns/validation.py +46 -0
  404. crackerjack/services/patterns/versioning.py +62 -0
  405. crackerjack/services/predictive_analytics.py +523 -0
  406. crackerjack/services/profiler.py +280 -0
  407. crackerjack/services/quality/README.md +415 -0
  408. crackerjack/services/quality/__init__.py +11 -0
  409. crackerjack/services/quality/anomaly_detector.py +392 -0
  410. crackerjack/services/quality/pattern_cache.py +333 -0
  411. crackerjack/services/quality/pattern_detector.py +479 -0
  412. crackerjack/services/quality/qa_orchestrator.py +491 -0
  413. crackerjack/services/quality/quality_baseline.py +395 -0
  414. crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
  415. crackerjack/services/quality/quality_intelligence.py +949 -0
  416. crackerjack/services/regex_patterns.py +58 -0
  417. crackerjack/services/regex_utils.py +483 -0
  418. crackerjack/services/secure_path_utils.py +524 -0
  419. crackerjack/services/secure_status_formatter.py +450 -0
  420. crackerjack/services/secure_subprocess.py +635 -0
  421. crackerjack/services/security.py +239 -0
  422. crackerjack/services/security_logger.py +495 -0
  423. crackerjack/services/server_manager.py +411 -0
  424. crackerjack/services/smart_scheduling.py +167 -0
  425. crackerjack/services/status_authentication.py +460 -0
  426. crackerjack/services/status_security_manager.py +315 -0
  427. crackerjack/services/terminal_utils.py +0 -0
  428. crackerjack/services/thread_safe_status_collector.py +441 -0
  429. crackerjack/services/tool_filter.py +368 -0
  430. crackerjack/services/tool_version_service.py +43 -0
  431. crackerjack/services/unified_config.py +115 -0
  432. crackerjack/services/validation_rate_limiter.py +220 -0
  433. crackerjack/services/vector_store.py +689 -0
  434. crackerjack/services/version_analyzer.py +461 -0
  435. crackerjack/services/version_checker.py +223 -0
  436. crackerjack/services/websocket_resource_limiter.py +438 -0
  437. crackerjack/services/zuban_lsp_service.py +391 -0
  438. crackerjack/slash_commands/README.md +11 -0
  439. crackerjack/slash_commands/__init__.py +59 -0
  440. crackerjack/slash_commands/init.md +112 -0
  441. crackerjack/slash_commands/run.md +197 -0
  442. crackerjack/slash_commands/status.md +127 -0
  443. crackerjack/tools/README.md +11 -0
  444. crackerjack/tools/__init__.py +30 -0
  445. crackerjack/tools/_git_utils.py +105 -0
  446. crackerjack/tools/check_added_large_files.py +139 -0
  447. crackerjack/tools/check_ast.py +105 -0
  448. crackerjack/tools/check_json.py +103 -0
  449. crackerjack/tools/check_jsonschema.py +297 -0
  450. crackerjack/tools/check_toml.py +103 -0
  451. crackerjack/tools/check_yaml.py +110 -0
  452. crackerjack/tools/codespell_wrapper.py +72 -0
  453. crackerjack/tools/end_of_file_fixer.py +202 -0
  454. crackerjack/tools/format_json.py +128 -0
  455. crackerjack/tools/mdformat_wrapper.py +114 -0
  456. crackerjack/tools/trailing_whitespace.py +198 -0
  457. crackerjack/tools/validate_input_validator_patterns.py +236 -0
  458. crackerjack/tools/validate_regex_patterns.py +188 -0
  459. crackerjack/ui/README.md +11 -0
  460. crackerjack/ui/__init__.py +1 -0
  461. crackerjack/ui/dashboard_renderer.py +28 -0
  462. crackerjack/ui/templates/README.md +11 -0
  463. crackerjack/utils/console_utils.py +13 -0
  464. crackerjack/utils/dependency_guard.py +230 -0
  465. crackerjack/utils/retry_utils.py +275 -0
  466. crackerjack/workflows/README.md +590 -0
  467. crackerjack/workflows/__init__.py +46 -0
  468. crackerjack/workflows/actions.py +811 -0
  469. crackerjack/workflows/auto_fix.py +444 -0
  470. crackerjack/workflows/container_builder.py +499 -0
  471. crackerjack/workflows/definitions.py +443 -0
  472. crackerjack/workflows/engine.py +177 -0
  473. crackerjack/workflows/event_bridge.py +242 -0
  474. crackerjack-0.45.2.dist-info/METADATA +1678 -0
  475. crackerjack-0.45.2.dist-info/RECORD +478 -0
  476. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  477. crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
  478. crackerjack/.gitignore +0 -14
  479. crackerjack/.libcst.codemod.yaml +0 -18
  480. crackerjack/.pdm.toml +0 -1
  481. crackerjack/.pre-commit-config.yaml +0 -91
  482. crackerjack/.pytest_cache/.gitignore +0 -2
  483. crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
  484. crackerjack/.pytest_cache/README.md +0 -8
  485. crackerjack/.pytest_cache/v/cache/nodeids +0 -1
  486. crackerjack/.pytest_cache/v/cache/stepwise +0 -1
  487. crackerjack/.ruff_cache/.gitignore +0 -1
  488. crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
  489. crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
  490. crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
  491. crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
  492. crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
  493. crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
  494. crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
  495. crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
  496. crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
  497. crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
  498. crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
  499. crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
  500. crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
  501. crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
  502. crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
  503. crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
  504. crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
  505. crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
  506. crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
  507. crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
  508. crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
  509. crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
  510. crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
  511. crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
  512. crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
  513. crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
  514. crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
  515. crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
  516. crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
  517. crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
  518. crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
  519. crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
  520. crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
  521. crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
  522. crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
  523. crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
  524. crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
  525. crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
  526. crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
  527. crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
  528. crackerjack/crackerjack.py +0 -855
  529. crackerjack/pyproject.toml +0 -214
  530. crackerjack-0.18.2.dist-info/METADATA +0 -420
  531. crackerjack-0.18.2.dist-info/RECORD +0 -59
  532. crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
  533. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,730 @@
1
+ from __future__ import annotations
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
+ )
26
+
27
+
28
+ @dataclass
29
+ class CleaningConfig:
30
+ clean: bool = True
31
+ update_docs: bool = False
32
+ force_update_docs: bool = False
33
+ compress_docs: bool = False
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
+ )
47
+
48
+
49
+ @dataclass
50
+ class HookConfig:
51
+ skip_hooks: bool = False
52
+ update_precommit: bool = False
53
+ experimental_hooks: bool = False
54
+ enable_pyrefly: bool = False
55
+ enable_ty: bool = False
56
+ enable_lsp_optimization: bool = False
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
+
69
+
70
+ @dataclass
71
+ class TestConfig:
72
+ test: bool = False
73
+ benchmark: bool = False
74
+ benchmark_regression: bool = False
75
+ benchmark_regression_threshold: float = 0.1
76
+ test_workers: int = 0
77
+ test_timeout: int = 0
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
+
110
+
111
+ @dataclass
112
+ class PublishConfig:
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
118
+ no_git_tags: bool = False
119
+ skip_version_check: bool = False
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
+
133
+
134
+ @dataclass
135
+ class GitConfig:
136
+ commit: bool = False
137
+ create_pr: bool = False
138
+
139
+ @classmethod
140
+ def from_settings(cls, settings: GitSettings) -> GitConfig:
141
+ return cls(commit=settings.commit, create_pr=settings.create_pr)
142
+
143
+
144
+ @dataclass
145
+ class AIConfig:
146
+ ai_agent: bool = False
147
+ autofix: bool = True
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
+ )
161
+
162
+
163
+ @dataclass
164
+ class ExecutionConfig:
165
+ interactive: bool = True
166
+ verbose: bool = False
167
+ async_mode: bool = False
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
+ )
180
+
181
+
182
+ @dataclass
183
+ class ProgressConfig:
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
+ )
195
+
196
+
197
+ @dataclass
198
+ class CleanupConfig:
199
+ auto_cleanup: bool = True
200
+ keep_debug_logs: int = 5
201
+ keep_coverage_files: int = 10
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
+
214
+
215
+ @dataclass
216
+ class AdvancedConfig:
217
+ enabled: bool = False
218
+ license_key: str | None = None
219
+ organization: str | None = None
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
+
229
+
230
+ @dataclass
231
+ class MCPServerConfig:
232
+ http_port: int = 8676
233
+ http_host: str = "127.0.0.1"
234
+ websocket_port: int = 8675
235
+ http_enabled: bool = False
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
+
246
+
247
+ @dataclass
248
+ class ZubanLSPConfig:
249
+ enabled: bool = True
250
+ auto_start: bool = True
251
+ port: int = 8677
252
+ mode: str = "stdio"
253
+ timeout: int = 30
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
+ )
264
+
265
+
266
+ @dataclass(init=False)
267
+ class WorkflowOptions:
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
+ ]