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,3 +1,60 @@
1
+ from contextlib import suppress
2
+ from pathlib import Path
3
+
4
+ from acb.console import Console
5
+ from acb.depends import depends
6
+ from acb.logger import Logger
7
+
8
+ # Import protocols for service registration
9
+ from crackerjack.models.protocols import (
10
+ ChangelogGeneratorProtocol,
11
+ CoverageBadgeServiceProtocol,
12
+ CoverageRatchetProtocol,
13
+ DebugServiceProtocol,
14
+ GitServiceProtocol,
15
+ LoggerProtocol,
16
+ MemoryOptimizerProtocol,
17
+ PerformanceBenchmarkProtocol,
18
+ PerformanceCacheProtocol,
19
+ PerformanceMonitorProtocol,
20
+ QualityBaselineProtocol,
21
+ QualityIntelligenceProtocol,
22
+ VersionAnalyzerProtocol,
23
+ )
24
+ from crackerjack.services.changelog_automation import ChangelogGenerator
25
+ from crackerjack.services.coverage_badge_service import CoverageBadgeService
26
+ from crackerjack.services.coverage_ratchet import CoverageRatchetService
27
+
28
+ # Import service implementations
29
+ from crackerjack.services.debug import get_ai_agent_debugger
30
+ from crackerjack.services.git import GitService
31
+ from crackerjack.services.lsp_client import LSPClient
32
+ from crackerjack.services.memory_optimizer import MemoryOptimizer
33
+ from crackerjack.services.monitoring.performance_benchmarks import (
34
+ PerformanceBenchmarkService,
35
+ )
36
+ from crackerjack.services.monitoring.performance_cache import (
37
+ FileSystemCache,
38
+ GitOperationCache,
39
+ get_filesystem_cache,
40
+ get_git_cache,
41
+ get_performance_cache,
42
+ )
43
+ from crackerjack.services.monitoring.performance_monitor import get_performance_monitor
44
+ from crackerjack.services.parallel_executor import (
45
+ AsyncCommandExecutor,
46
+ ParallelHookExecutor,
47
+ get_async_executor,
48
+ get_parallel_executor,
49
+ )
50
+ from crackerjack.services.quality.quality_baseline_enhanced import (
51
+ EnhancedQualityBaselineService,
52
+ )
53
+ from crackerjack.services.quality.quality_intelligence import (
54
+ QualityIntelligenceService,
55
+ )
56
+ from crackerjack.services.version_analyzer import VersionAnalyzer
57
+
1
58
  from .hooks import (
2
59
  COMPREHENSIVE_STRATEGY,
3
60
  FAST_STRATEGY,
@@ -7,6 +64,200 @@ from .hooks import (
7
64
  HookStrategy,
8
65
  RetryPolicy,
9
66
  )
67
+ from .loader import load_settings, load_settings_async
68
+ from .settings import CrackerjackSettings
69
+
70
+
71
+ def get_console_width() -> int:
72
+ """Return the preferred console width from settings or pyproject.
73
+
74
+ Priority:
75
+ 1) ACB settings (CrackerjackSettings.console.width)
76
+ 2) pyproject.toml [tool.crackerjack].terminal_width
77
+ 3) Default: 70
78
+ """
79
+ # 1) Try ACB settings via DI
80
+ with suppress(Exception):
81
+ settings = depends.get_sync(CrackerjackSettings)
82
+ width = getattr(getattr(settings, "console", None), "width", None)
83
+ if isinstance(width, int) and width > 0:
84
+ return width
85
+
86
+ # 2) Try pyproject.toml
87
+ with suppress(Exception):
88
+ from pathlib import Path as _P
89
+
90
+ import tomli
91
+
92
+ pyproj = _P("pyproject.toml")
93
+ if pyproj.exists():
94
+ with pyproj.open("rb") as f:
95
+ data = tomli.load(f)
96
+ width = (
97
+ data.get("tool", {}).get("crackerjack", {}).get("terminal_width", None)
98
+ )
99
+ if isinstance(width, int) and width > 0:
100
+ return width
101
+
102
+ # 3) Default
103
+ return 70
104
+
105
+
106
+ # Load settings from YAML files using layered configuration
107
+ settings_instance = load_settings(CrackerjackSettings)
108
+ depends.set(CrackerjackSettings, settings_instance)
109
+
110
+ # Register ACB Logger (auto-registers itself, but set explicitly for clarity)
111
+ # But first, ensure we don't have an empty tuple registered for Logger
112
+ from crackerjack.utils.dependency_guard import (
113
+ ensure_logger_dependency,
114
+ validate_dependency_registration,
115
+ )
116
+
117
+ ensure_logger_dependency()
118
+
119
+ # Explicitly set logger instances if not already set properly
120
+ try:
121
+ current_logger = depends.get_sync(Logger)
122
+ if isinstance(current_logger, tuple) and len(current_logger) == 0:
123
+ logger_instance = Logger()
124
+ depends.set(Logger, logger_instance)
125
+ depends.set(LoggerProtocol, logger_instance) # Also register as LoggerProtocol
126
+ else:
127
+ # Logger is already properly registered, just ensure LoggerProtocol is too
128
+ depends.set(LoggerProtocol, current_logger)
129
+ except Exception:
130
+ # Logger not registered at all, so register it
131
+ logger_instance = Logger()
132
+ depends.set(Logger, logger_instance)
133
+ depends.set(LoggerProtocol, logger_instance) # Also register as LoggerProtocol
134
+
135
+
136
+ def register_services() -> None:
137
+ """Register all service instances with ACB dependency injection system.
138
+
139
+ Services are registered at application initialization to ensure proper
140
+ dependency ordering and lifecycle management. This follows ACB's pattern
141
+ of centralizing service registration rather than having services register
142
+ themselves or be instantiated in consumers.
143
+
144
+ The order of registration is important to ensure that dependencies are met:
145
+ 1. Core utility services (Debug, Performance Monitoring, Memory, Caching)
146
+ 2. Specialized cache services (Git, Filesystem)
147
+ 3. Quality-related services (Baseline, Intelligence)
148
+ 4. Manager-layer services (Coverage, Git, Versioning, Changelog, LSP)
149
+ """
150
+ # 1. Register Debug Service
151
+ # Uses factory function to handle environment detection
152
+ debugger = get_ai_agent_debugger()
153
+ depends.set(DebugServiceProtocol, debugger)
154
+
155
+ # 2. Register Performance Monitor
156
+ # Core performance tracking service
157
+ performance_monitor = get_performance_monitor()
158
+ depends.set(PerformanceMonitorProtocol, performance_monitor)
159
+
160
+ # 3. Register Memory Optimizer
161
+ # Memory management and optimization
162
+ memory_optimizer = MemoryOptimizer.get_instance()
163
+ depends.set(MemoryOptimizerProtocol, memory_optimizer)
164
+
165
+ # 4. Register Performance Cache
166
+ # Caching layer for performance optimization
167
+ performance_cache = get_performance_cache()
168
+ depends.set(PerformanceCacheProtocol, performance_cache)
169
+
170
+ # 5. Register Performance Benchmark Service
171
+ # The service should be registered automatically via @depends.inject
172
+ # in the service implementation, but if not let's create and register it manually
173
+ try:
174
+ # First, try to get the already registered instance
175
+ try:
176
+ performance_benchmarks = depends.get_sync(PerformanceBenchmarkProtocol)
177
+ except Exception:
178
+ # If not registered, create it using proper DI
179
+ console = depends.get_sync(Console)
180
+ logger = depends.get_sync(
181
+ Logger
182
+ ) # Get the logger instead of LoggerProtocol
183
+ pkg_path = Path.cwd() # Use current directory as fallback
184
+ performance_benchmarks = PerformanceBenchmarkService(
185
+ console=console, logger=logger, pkg_path=pkg_path
186
+ )
187
+ # Register the newly created instance
188
+ depends.set(PerformanceBenchmarkProtocol, performance_benchmarks)
189
+ except Exception as e:
190
+ # Log the error to help with debugging
191
+ print(f"WARNING: Failed to register PerformanceBenchmarkService: {e}")
192
+ # Performance benchmarking will be disabled
193
+ pass
194
+
195
+ # 6. Register Parallel Executor Services
196
+ # For parallel and async hook execution
197
+ parallel_executor = get_parallel_executor()
198
+ depends.set(ParallelHookExecutor, parallel_executor)
199
+
200
+ async_executor = get_async_executor()
201
+ depends.set(AsyncCommandExecutor, async_executor)
202
+
203
+ # 7. Register Specialized Cache Services
204
+ # Git and filesystem caching
205
+ git_cache = get_git_cache()
206
+ depends.set(GitOperationCache, git_cache)
207
+
208
+ filesystem_cache = get_filesystem_cache()
209
+ depends.set(FileSystemCache, filesystem_cache)
210
+
211
+ # 8. Register Quality Baseline Service
212
+ # Foundation for quality tracking and intelligence
213
+ with suppress(Exception):
214
+ quality_baseline = EnhancedQualityBaselineService()
215
+ depends.set(QualityBaselineProtocol, quality_baseline)
216
+
217
+ # 9. Register Quality Intelligence Service
218
+ # Depends on quality baseline service
219
+ quality_intelligence = QualityIntelligenceService(quality_baseline)
220
+ depends.set(QualityIntelligenceProtocol, quality_intelligence)
221
+
222
+ # 10. Register Manager Layer Services
223
+ # Services used by test_manager.py and publish_manager.py
224
+
225
+ # Get console and pkg_path for service initialization
226
+ with suppress(Exception):
227
+ console = depends.get_sync(Console)
228
+ pkg_path = depends.get_sync(Path)
229
+
230
+ # 10a. Coverage Ratchet Service (protocol-based)
231
+ coverage_ratchet = CoverageRatchetService(pkg_path)
232
+ depends.set(CoverageRatchetProtocol, coverage_ratchet)
233
+
234
+ # 10b. Coverage Badge Service (protocol-based)
235
+ coverage_badge = depends.inject_sync(
236
+ CoverageBadgeService, console=console, project_root=pkg_path
237
+ )
238
+ depends.set(CoverageBadgeServiceProtocol, coverage_badge)
239
+
240
+ # 10c. Git Service (protocol-based, foundation for dependent services)
241
+ git_service = GitService(pkg_path)
242
+ depends.set(GitServiceProtocol, git_service)
243
+
244
+ # 10d. Version Analyzer (protocol-based, depends on git_service)
245
+ version_analyzer = VersionAnalyzer(git_service)
246
+ depends.set(VersionAnalyzerProtocol, version_analyzer)
247
+
248
+ # 10e. Changelog Generator (protocol-based, ACB DI injects dependencies)
249
+ changelog_generator = ChangelogGenerator()
250
+ depends.set(ChangelogGeneratorProtocol, changelog_generator)
251
+
252
+ # 10f. LSP Client (concrete type - optional service with graceful fallback)
253
+ with suppress(Exception):
254
+ lsp_client = LSPClient()
255
+ depends.set(LSPClient, lsp_client)
256
+
257
+
258
+ # Service registration is called explicitly by application entry point
259
+ # to avoid circular import issues during module initialization.
260
+ # Call register_services() after all modules are loaded, typically in __main__.py
10
261
 
11
262
  __all__ = [
12
263
  "COMPREHENSIVE_STRATEGY",
@@ -16,4 +267,9 @@ __all__ = [
16
267
  "HookStage",
17
268
  "HookStrategy",
18
269
  "RetryPolicy",
270
+ "CrackerjackSettings",
271
+ "load_settings",
272
+ "load_settings_async",
273
+ "register_services",
274
+ "get_console_width",
19
275
  ]
@@ -1,70 +1,207 @@
1
- import os
1
+ from __future__ import annotations
2
+
2
3
  import socket
3
- from dataclasses import dataclass, field
4
+ import typing as t
5
+ from contextlib import suppress
4
6
  from pathlib import Path
5
7
 
6
- from ..models.protocols import OptionsProtocol
8
+ from acb.depends import depends
7
9
 
10
+ from crackerjack.config.settings import CrackerjackSettings, GlobalLockSettings
8
11
 
9
- @dataclass
10
- class GlobalLockConfig:
11
- enabled: bool = True
12
- timeout_seconds: float = 600.0
13
- stale_lock_hours: float = 2.0
14
- lock_directory: Path = field(
15
- default_factory=lambda: Path.home() / ".crackerjack" / "locks"
16
- )
17
- session_heartbeat_interval: float = 30.0
18
- max_retry_attempts: int = 3
19
- retry_delay_seconds: float = 5.0
20
- enable_lock_monitoring: bool = True
21
12
 
22
- @classmethod
23
- def from_options(
24
- cls: type["GlobalLockConfig"], options: "OptionsProtocol"
25
- ) -> "GlobalLockConfig":
26
- enabled = not options.disable_global_locks
27
- timeout_seconds = float(options.global_lock_timeout)
28
-
29
- default_lock_dir = Path.home() / ".crackerjack" / "locks"
30
- lock_directory = (
31
- Path(options.global_lock_dir)
32
- if options.global_lock_dir
33
- else default_lock_dir
13
+ class GlobalLockConfig:
14
+ """Compatibility wrapper for global lock settings.
15
+
16
+ Supports both APIs:
17
+ - New API: GlobalLockConfig(settings=GlobalLockSettings(...))
18
+ - Old API: GlobalLockConfig(lock_directory=path, timeout_seconds=600, ...)
19
+ """
20
+
21
+ def _should_build_from_compatibility_params(
22
+ self,
23
+ enabled: bool | None,
24
+ timeout_seconds: float | None,
25
+ stale_lock_hours: float | None,
26
+ lock_directory: Path | None,
27
+ session_heartbeat_interval: float | None,
28
+ max_retry_attempts: int | None,
29
+ retry_delay_seconds: float | None,
30
+ enable_lock_monitoring: bool | None,
31
+ ) -> bool:
32
+ """Check if any backwards compatibility parameters are provided."""
33
+ return any(
34
+ param is not None
35
+ for param in (
36
+ enabled,
37
+ timeout_seconds,
38
+ stale_lock_hours,
39
+ lock_directory,
40
+ session_heartbeat_interval,
41
+ max_retry_attempts,
42
+ retry_delay_seconds,
43
+ enable_lock_monitoring,
44
+ )
34
45
  )
35
46
 
36
- config = cls(
37
- enabled=enabled,
38
- timeout_seconds=timeout_seconds,
39
- lock_directory=lock_directory,
47
+ def _build_settings_from_compatibility_params(
48
+ self,
49
+ enabled: bool | None,
50
+ timeout_seconds: float | None,
51
+ stale_lock_hours: float | None,
52
+ lock_directory: Path | None,
53
+ session_heartbeat_interval: float | None,
54
+ max_retry_attempts: int | None,
55
+ retry_delay_seconds: float | None,
56
+ enable_lock_monitoring: bool | None,
57
+ ) -> GlobalLockSettings:
58
+ """Build settings from backwards compatibility parameters."""
59
+ # Get defaults from CrackerjackSettings
60
+ default_settings = depends.get_sync(CrackerjackSettings).global_lock
61
+ # Create a copy with overrides
62
+ settings_dict = {
63
+ "enabled": enabled if enabled is not None else default_settings.enabled,
64
+ "timeout_seconds": (
65
+ timeout_seconds
66
+ if timeout_seconds is not None
67
+ else default_settings.timeout_seconds
68
+ ),
69
+ "stale_lock_hours": (
70
+ stale_lock_hours
71
+ if stale_lock_hours is not None
72
+ else default_settings.stale_lock_hours
73
+ ),
74
+ "lock_directory": (
75
+ lock_directory
76
+ if lock_directory is not None
77
+ else default_settings.lock_directory
78
+ ),
79
+ "session_heartbeat_interval": (
80
+ session_heartbeat_interval
81
+ if session_heartbeat_interval is not None
82
+ else default_settings.session_heartbeat_interval
83
+ ),
84
+ "max_retry_attempts": (
85
+ max_retry_attempts
86
+ if max_retry_attempts is not None
87
+ else default_settings.max_retry_attempts
88
+ ),
89
+ "retry_delay_seconds": (
90
+ retry_delay_seconds
91
+ if retry_delay_seconds is not None
92
+ else default_settings.retry_delay_seconds
93
+ ),
94
+ "enable_lock_monitoring": (
95
+ enable_lock_monitoring
96
+ if enable_lock_monitoring is not None
97
+ else default_settings.enable_lock_monitoring
98
+ ),
99
+ }
100
+ return GlobalLockSettings(**settings_dict)
101
+
102
+ def __init__(
103
+ self,
104
+ settings: GlobalLockSettings | None = None,
105
+ # Backwards compatibility parameters
106
+ enabled: bool | None = None,
107
+ timeout_seconds: float | None = None,
108
+ stale_lock_hours: float | None = None,
109
+ lock_directory: Path | None = None,
110
+ session_heartbeat_interval: float | None = None,
111
+ max_retry_attempts: int | None = None,
112
+ retry_delay_seconds: float | None = None,
113
+ enable_lock_monitoring: bool | None = None,
114
+ ) -> None:
115
+ # If any backwards compatibility parameters are provided, build settings from them
116
+ if self._should_build_from_compatibility_params(
117
+ enabled,
118
+ timeout_seconds,
119
+ stale_lock_hours,
120
+ lock_directory,
121
+ session_heartbeat_interval,
122
+ max_retry_attempts,
123
+ retry_delay_seconds,
124
+ enable_lock_monitoring,
125
+ ):
126
+ settings = self._build_settings_from_compatibility_params(
127
+ enabled,
128
+ timeout_seconds,
129
+ stale_lock_hours,
130
+ lock_directory,
131
+ session_heartbeat_interval,
132
+ max_retry_attempts,
133
+ retry_delay_seconds,
134
+ enable_lock_monitoring,
135
+ )
136
+
137
+ base_settings = settings or depends.get_sync(CrackerjackSettings).global_lock
138
+ self._settings = base_settings.model_copy()
139
+ self.session_id = (
140
+ getattr(self._settings, "session_id", None) or self._generate_session_id()
40
141
  )
142
+ self.hostname = (
143
+ getattr(self._settings, "hostname", None) or socket.gethostname()
144
+ )
145
+ self._ensure_lock_directory()
41
146
 
42
- return config
43
-
44
- def __post_init__(self) -> None:
45
- self.lock_directory.mkdir(parents=True, exist_ok=True)
147
+ @staticmethod
148
+ def _generate_session_id() -> str:
149
+ import uuid
46
150
 
47
- self.lock_directory.chmod(0o700)
151
+ return uuid.uuid4().hex[:8]
48
152
 
49
- @property
50
- def hostname(self) -> str:
51
- return socket.gethostname()
153
+ def _ensure_lock_directory(self) -> None:
154
+ lock_dir = self._settings.lock_directory
155
+ lock_dir.mkdir(parents=True, exist_ok=True)
156
+ # Enforce secure permissions (owner rwx only)
157
+ with suppress(Exception):
158
+ lock_dir.chmod(0o700)
52
159
 
53
- @property
54
- def session_id(self) -> str:
55
- return f"{self.hostname}_{os.getpid()}"
160
+ def __getattr__(self, item: str):
161
+ return getattr(self._settings, item)
56
162
 
57
163
  def get_lock_path(self, hook_name: str) -> Path:
58
- return self.lock_directory / f"{hook_name}.lock"
59
-
60
- def get_heartbeat_path(self, hook_name: str) -> Path:
61
- return self.lock_directory / f"{hook_name}.heartbeat"
62
-
63
- def is_valid_lock_file(self, lock_path: Path) -> bool:
64
- if not lock_path.exists():
65
- return False
164
+ safe_name = hook_name.replace("/", "_")
165
+ return self._settings.lock_directory / f"{safe_name}.lock"
66
166
 
67
- import time
68
-
69
- file_age_hours = (time.time() - lock_path.stat().st_mtime) / 3600
70
- return file_age_hours < self.stale_lock_hours
167
+ @classmethod
168
+ def from_options(cls, options: t.Any) -> GlobalLockConfig:
169
+ """Create GlobalLockConfig from CLI options object.
170
+
171
+ Supports two formats:
172
+ 1. Nested: options.global_lock with GlobalLockSettings-like fields
173
+ 2. Flat: options with global_lock_* prefixed fields (from CLI)
174
+
175
+ Synchronous method - no async operations needed.
176
+ """
177
+ base_settings = depends.get_sync(CrackerjackSettings).global_lock
178
+ overrides = getattr(options, "global_lock", None)
179
+
180
+ # Handle nested global_lock object
181
+ if overrides is not None:
182
+ custom = base_settings.model_copy()
183
+ for field in custom.model_fields:
184
+ if hasattr(overrides, field):
185
+ setattr(custom, field, getattr(overrides, field))
186
+ return cls(custom)
187
+
188
+ # Handle flat CLI options with global_lock_* prefix
189
+ params: dict[str, t.Any] = {}
190
+ if hasattr(options, "disable_global_locks"):
191
+ params["enabled"] = not options.disable_global_locks
192
+ if hasattr(options, "global_lock_timeout"):
193
+ params["timeout_seconds"] = float(options.global_lock_timeout)
194
+ if hasattr(options, "global_lock_dir") and options.global_lock_dir:
195
+ params["lock_directory"] = Path(options.global_lock_dir)
196
+ # Note: global_lock_cleanup is handled at runtime, not in config
197
+
198
+ # If any options were provided, create config with them
199
+ if params:
200
+ return cls(**params)
201
+
202
+ # Otherwise use defaults
203
+ return cls(base_settings)
204
+
205
+
206
+ def get_global_lock_config() -> GlobalLockConfig:
207
+ return GlobalLockConfig()