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,583 @@
1
+ import inspect
2
+ import threading
3
+ import typing as t
4
+ from collections.abc import Callable
5
+ from dataclasses import dataclass, field
6
+ from enum import Enum
7
+ from pathlib import Path
8
+ from typing import Any, TypeVar
9
+
10
+ from rich.console import Console
11
+
12
+ from crackerjack.models.protocols import (
13
+ ConfigMergeServiceProtocol,
14
+ ConfigurationServiceProtocol,
15
+ CoverageRatchetProtocol,
16
+ FileSystemInterface,
17
+ GitInterface,
18
+ HookManager,
19
+ InitializationServiceProtocol,
20
+ PublishManager,
21
+ SecurityServiceProtocol,
22
+ TestManagerProtocol,
23
+ UnifiedConfigurationServiceProtocol,
24
+ )
25
+ from crackerjack.services.logging import get_logger
26
+
27
+ T = TypeVar("T")
28
+ FactoryFunc = Callable[..., T]
29
+
30
+
31
+ class ServiceLifetime(Enum):
32
+ SINGLETON = "singleton"
33
+ TRANSIENT = "transient"
34
+ SCOPED = "scoped"
35
+
36
+
37
+ @dataclass
38
+ class ServiceDescriptor:
39
+ interface: type
40
+ implementation: type | None = None
41
+ factory: Callable[..., Any] | None = None
42
+ lifetime: ServiceLifetime = ServiceLifetime.TRANSIENT
43
+ instance: Any | None = None
44
+ created_count: int = 0
45
+ dependencies: list[type] = field(default_factory=list)
46
+
47
+ def __post_init__(self):
48
+ if self.implementation is self.factory is self.instance is None:
49
+ msg = "Must provide either implementation, factory, or instance"
50
+ raise ValueError(msg)
51
+
52
+
53
+ class ServiceScope:
54
+ def __init__(self, name: str) -> None:
55
+ self.name = name
56
+ self._instances: dict[str, Any] = {}
57
+ self._lock = threading.Lock()
58
+ self.logger = get_logger("crackerjack.container.scope")
59
+
60
+ def get_instance(self, key: str) -> Any | None:
61
+ with self._lock:
62
+ return self._instances.get(key)
63
+
64
+ def set_instance(self, key: str, instance: Any) -> None:
65
+ with self._lock:
66
+ self._instances[key] = instance
67
+ self.logger.debug("Scoped instance created", scope=self.name, service=key)
68
+
69
+ def dispose(self) -> None:
70
+ with self._lock:
71
+ for key, instance in self._instances.items():
72
+ if hasattr(instance, "dispose"):
73
+ try:
74
+ instance.dispose()
75
+ except Exception as e:
76
+ self.logger.exception(
77
+ "Error disposing service",
78
+ service=key,
79
+ error=str(e),
80
+ )
81
+
82
+ self._instances.clear()
83
+ self.logger.info("Service scope disposed", scope=self.name)
84
+
85
+
86
+ class DependencyResolver:
87
+ def __init__(self, container: "EnhancedDependencyContainer") -> None:
88
+ self.container = container
89
+ self.logger = get_logger("crackerjack.container.resolver")
90
+
91
+ def create_instance(
92
+ self,
93
+ descriptor: ServiceDescriptor,
94
+ scope: ServiceScope | None = None,
95
+ ) -> Any:
96
+ if descriptor.instance is not None:
97
+ return descriptor.instance
98
+
99
+ if descriptor.factory is not None:
100
+ return self._create_from_factory(descriptor.factory)
101
+
102
+ if descriptor.implementation is not None:
103
+ return self._create_from_class(descriptor.implementation)
104
+
105
+ msg = f"Cannot create instance for {descriptor.interface}"
106
+ raise ValueError(msg)
107
+
108
+ def _create_from_factory(self, factory: Callable[..., Any]) -> Any:
109
+ sig = inspect.signature(factory)
110
+ kwargs = {}
111
+
112
+ for param_name, param in sig.parameters.items():
113
+ if param.annotation != inspect.Parameter.empty:
114
+ try:
115
+ dependency = self.container.get(param.annotation)
116
+ kwargs[param_name] = dependency
117
+ except Exception as e:
118
+ if param.default == inspect.Parameter.empty:
119
+ self.logger.warning(
120
+ "Could not inject dependency",
121
+ parameter=param_name,
122
+ type=param.annotation,
123
+ error=str(e),
124
+ )
125
+ else:
126
+ self.logger.debug(
127
+ "Could not inject optional dependency, using default",
128
+ parameter=param_name,
129
+ type=param.annotation,
130
+ default=param.default,
131
+ )
132
+
133
+ return factory(**kwargs)
134
+
135
+ def _create_from_class(self, implementation: type) -> Any:
136
+ try:
137
+ kwargs = self._build_constructor_kwargs(implementation)
138
+ return self._instantiate_with_logging(implementation, kwargs)
139
+ except Exception as e:
140
+ self.logger.exception(
141
+ "Failed to create instance",
142
+ implementation_class=implementation.__name__,
143
+ error=str(e),
144
+ )
145
+ raise
146
+
147
+ def _build_constructor_kwargs(self, implementation: type) -> dict[str, Any]:
148
+ init_sig = inspect.signature(implementation.__init__)
149
+ kwargs: dict[str, Any] = {}
150
+
151
+ for param_name, param in init_sig.parameters.items():
152
+ if param_name == "self":
153
+ continue
154
+
155
+ if param.annotation != inspect.Parameter.empty:
156
+ self._resolve_parameter_dependency(
157
+ kwargs, param_name, param, implementation.__name__
158
+ )
159
+
160
+ return kwargs
161
+
162
+ def _resolve_parameter_dependency(
163
+ self,
164
+ kwargs: dict[str, Any],
165
+ param_name: str,
166
+ param: inspect.Parameter,
167
+ class_name: str,
168
+ ) -> None:
169
+ try:
170
+ dependency = self.container.get(param.annotation)
171
+ kwargs[param_name] = dependency
172
+ except Exception as e:
173
+ if param.default == inspect.Parameter.empty:
174
+ self.logger.exception(
175
+ "Required dependency not available",
176
+ implementation_class=class_name,
177
+ parameter=param_name,
178
+ type=param.annotation,
179
+ error=str(e),
180
+ )
181
+ raise
182
+ self.logger.debug(
183
+ "Optional dependency not available, using default",
184
+ parameter=param_name,
185
+ type=param.annotation,
186
+ )
187
+
188
+ def _instantiate_with_logging(
189
+ self, implementation: type, kwargs: dict[str, Any]
190
+ ) -> Any:
191
+ instance = implementation(**kwargs)
192
+ self.logger.debug(
193
+ "Instance created with DI",
194
+ implementation_class=implementation.__name__,
195
+ )
196
+ return instance
197
+
198
+
199
+ class EnhancedDependencyContainer:
200
+ def __init__(self, name: str = "default") -> None:
201
+ self.name = name
202
+ self._services: dict[str, ServiceDescriptor] = {}
203
+ self._singletons: dict[str, Any] = {}
204
+ self._lock = threading.Lock()
205
+ self._current_scope: ServiceScope | None = None
206
+ self.resolver = DependencyResolver(self)
207
+ self.logger = get_logger("crackerjack.container")
208
+
209
+ def register_singleton(
210
+ self,
211
+ interface: type,
212
+ implementation: type | None = None,
213
+ factory: Callable[..., Any] | None = None,
214
+ instance: Any | None = None,
215
+ ) -> "EnhancedDependencyContainer":
216
+ key = self._get_service_key(interface)
217
+
218
+ descriptor = ServiceDescriptor(
219
+ interface=interface,
220
+ implementation=implementation,
221
+ factory=factory,
222
+ instance=instance,
223
+ lifetime=ServiceLifetime.SINGLETON,
224
+ )
225
+
226
+ with self._lock:
227
+ self._services[key] = descriptor
228
+
229
+ self.logger.debug("Singleton registered", interface=interface.__name__)
230
+ return self
231
+
232
+ def register_transient(
233
+ self,
234
+ interface: type,
235
+ implementation: type | None = None,
236
+ factory: Callable[..., Any] | None = None,
237
+ ) -> "EnhancedDependencyContainer":
238
+ key = self._get_service_key(interface)
239
+
240
+ descriptor = ServiceDescriptor(
241
+ interface=interface,
242
+ implementation=implementation,
243
+ factory=factory,
244
+ lifetime=ServiceLifetime.TRANSIENT,
245
+ )
246
+
247
+ with self._lock:
248
+ self._services[key] = descriptor
249
+
250
+ self.logger.debug("Transient registered", interface=interface.__name__)
251
+ return self
252
+
253
+ def register_scoped(
254
+ self,
255
+ interface: type,
256
+ implementation: type | None = None,
257
+ factory: Callable[..., Any] | None = None,
258
+ ) -> "EnhancedDependencyContainer":
259
+ key = self._get_service_key(interface)
260
+
261
+ descriptor = ServiceDescriptor(
262
+ interface=interface,
263
+ implementation=implementation,
264
+ factory=factory,
265
+ lifetime=ServiceLifetime.SCOPED,
266
+ )
267
+
268
+ with self._lock:
269
+ self._services[key] = descriptor
270
+
271
+ self.logger.debug("Scoped registered", interface=interface.__name__)
272
+ return self
273
+
274
+ def get(self, interface: type, scope: ServiceScope | None = None) -> Any:
275
+ key = self._get_service_key(interface)
276
+
277
+ with self._lock:
278
+ if key not in self._services:
279
+ msg = f"Service {interface.__name__} not registered"
280
+ raise ValueError(msg)
281
+
282
+ descriptor = self._services[key]
283
+
284
+ return self._create_service_instance(descriptor, scope or self._current_scope)
285
+
286
+ def get_optional(self, interface: type, default: Any = None) -> Any:
287
+ try:
288
+ return self.get(interface)
289
+ except ValueError:
290
+ return default
291
+
292
+ def is_registered(self, interface: type) -> bool:
293
+ key = self._get_service_key(interface)
294
+ return key in self._services
295
+
296
+ def create_scope(self, name: str = "scope") -> ServiceScope:
297
+ return ServiceScope(name)
298
+
299
+ def set_current_scope(self, scope: ServiceScope | None) -> None:
300
+ self._current_scope = scope
301
+
302
+ def get_service_info(self) -> dict[str, Any]:
303
+ info = {}
304
+
305
+ with self._lock:
306
+ for key, descriptor in self._services.items():
307
+ info[key] = {
308
+ "interface": descriptor.interface.__name__,
309
+ "implementation": descriptor.implementation.__name__
310
+ if descriptor.implementation
311
+ else None,
312
+ "lifetime": descriptor.lifetime.value,
313
+ "created_count": descriptor.created_count,
314
+ "has_instance": descriptor.instance is not None,
315
+ }
316
+
317
+ return info
318
+
319
+ def dispose(self) -> None:
320
+ with self._lock:
321
+ for key, instance in self._singletons.items():
322
+ if hasattr(instance, "dispose"):
323
+ try:
324
+ instance.dispose()
325
+ except Exception as e:
326
+ self.logger.exception(
327
+ "Error disposing singleton",
328
+ service=key,
329
+ error=str(e),
330
+ )
331
+
332
+ self._singletons.clear()
333
+
334
+ if self._current_scope:
335
+ self._current_scope.dispose()
336
+ self._current_scope = None
337
+
338
+ self.logger.info("Container disposed", name=self.name)
339
+
340
+ def _create_service_instance(
341
+ self,
342
+ descriptor: ServiceDescriptor,
343
+ scope: ServiceScope | None = None,
344
+ ) -> Any:
345
+ if descriptor.lifetime == ServiceLifetime.SINGLETON:
346
+ return self._get_or_create_singleton(descriptor)
347
+ if descriptor.lifetime == ServiceLifetime.SCOPED:
348
+ return self._get_or_create_scoped(descriptor, scope)
349
+
350
+ return self._create_transient_instance(descriptor)
351
+
352
+ def _get_or_create_singleton(self, descriptor: ServiceDescriptor) -> Any:
353
+ key = self._get_service_key(descriptor.interface)
354
+
355
+ if key in self._singletons:
356
+ return self._singletons[key]
357
+
358
+ instance = self.resolver.create_instance(descriptor)
359
+ self._singletons[key] = instance
360
+ descriptor.created_count += 1
361
+
362
+ self.logger.debug("Singleton created", interface=descriptor.interface.__name__)
363
+ return instance
364
+
365
+ def _get_or_create_scoped(
366
+ self,
367
+ descriptor: ServiceDescriptor,
368
+ scope: ServiceScope | None,
369
+ ) -> Any:
370
+ if scope is None:
371
+ msg = f"Scoped service {descriptor.interface.__name__} requires an active scope"
372
+ raise ValueError(
373
+ msg,
374
+ )
375
+
376
+ key = self._get_service_key(descriptor.interface)
377
+ instance = scope.get_instance(key)
378
+
379
+ if instance is None:
380
+ instance = self.resolver.create_instance(descriptor, scope)
381
+ scope.set_instance(key, instance)
382
+ descriptor.created_count += 1
383
+
384
+ return instance
385
+
386
+ def _create_transient_instance(self, descriptor: ServiceDescriptor) -> Any:
387
+ instance = self.resolver.create_instance(descriptor)
388
+ descriptor.created_count += 1
389
+ return instance
390
+
391
+ def _get_service_key(self, interface: type) -> str:
392
+ return f"{interface.__module__}.{interface.__name__}"
393
+
394
+ def __enter__(self):
395
+ return self
396
+
397
+ def __exit__(
398
+ self,
399
+ exc_type: type[BaseException] | None,
400
+ exc_val: BaseException | None,
401
+ _exc_tb: t.Any,
402
+ ) -> None:
403
+ self.dispose()
404
+
405
+
406
+ class ServiceCollectionBuilder:
407
+ def __init__(self, container: EnhancedDependencyContainer) -> None:
408
+ self.container = container
409
+ self.console: Console | None = None
410
+ self.pkg_path: Path | None = None
411
+ self.dry_run: bool = False
412
+ self.verbose: bool = False
413
+
414
+ def with_console(self, console: Console) -> "ServiceCollectionBuilder":
415
+ self.console = console
416
+ return self
417
+
418
+ def with_package_path(self, pkg_path: Path) -> "ServiceCollectionBuilder":
419
+ self.pkg_path = pkg_path
420
+ return self
421
+
422
+ def with_dry_run(self, dry_run: bool) -> "ServiceCollectionBuilder":
423
+ self.dry_run = dry_run
424
+ return self
425
+
426
+ def with_verbose(self, verbose: bool) -> "ServiceCollectionBuilder":
427
+ self.verbose = verbose
428
+ return self
429
+
430
+ def add_core_services(self) -> "ServiceCollectionBuilder":
431
+ console = self.console or Console(force_terminal=True)
432
+ pkg_path = self.pkg_path or Path.cwd()
433
+
434
+ from crackerjack.services.enhanced_filesystem import EnhancedFileSystemService
435
+
436
+ self.container.register_singleton(
437
+ FileSystemInterface,
438
+ factory=EnhancedFileSystemService,
439
+ )
440
+
441
+ from crackerjack.services.git import GitService
442
+
443
+ self.container.register_transient(
444
+ GitInterface,
445
+ factory=lambda: GitService(console=console, pkg_path=pkg_path),
446
+ )
447
+
448
+ from crackerjack.managers.hook_manager import HookManagerImpl
449
+
450
+ self.container.register_transient(
451
+ HookManager,
452
+ factory=lambda: HookManagerImpl(
453
+ console=console, pkg_path=pkg_path, verbose=self.verbose
454
+ ),
455
+ )
456
+
457
+ from crackerjack.managers.test_manager import TestManagementImpl
458
+
459
+ self.container.register_transient(
460
+ TestManagerProtocol,
461
+ factory=lambda: TestManagementImpl(console=console, pkg_path=pkg_path),
462
+ )
463
+
464
+ from crackerjack.managers.publish_manager import PublishManagerImpl
465
+
466
+ # Use factory without parameters to trigger @depends.inject decorator
467
+ # The decorator will inject all dependencies from the DI container
468
+ self.container.register_transient(
469
+ PublishManager,
470
+ factory=PublishManagerImpl,
471
+ )
472
+
473
+ return self
474
+
475
+ def add_service_protocols(self) -> "ServiceCollectionBuilder":
476
+ console = self.console or Console(force_terminal=True)
477
+ pkg_path = self.pkg_path or Path.cwd()
478
+
479
+ def create_coverage_ratchet() -> CoverageRatchetProtocol:
480
+ from crackerjack.services.coverage_ratchet import CoverageRatchetService
481
+
482
+ return CoverageRatchetService(pkg_path, console)
483
+
484
+ self.container.register_transient(
485
+ CoverageRatchetProtocol,
486
+ factory=create_coverage_ratchet,
487
+ )
488
+
489
+ def create_configuration_service() -> ConfigurationServiceProtocol:
490
+ from crackerjack.services.config import ConfigurationService
491
+
492
+ return ConfigurationService(console=console, pkg_path=pkg_path)
493
+
494
+ self.container.register_transient(
495
+ ConfigurationServiceProtocol,
496
+ factory=create_configuration_service,
497
+ )
498
+
499
+ def create_security_service() -> SecurityServiceProtocol:
500
+ from crackerjack.services.security import SecurityService
501
+
502
+ return SecurityService()
503
+
504
+ self.container.register_transient(
505
+ SecurityServiceProtocol,
506
+ factory=create_security_service,
507
+ )
508
+
509
+ def create_initialization_service() -> InitializationServiceProtocol:
510
+ from crackerjack.services.filesystem import FileSystemService
511
+ from crackerjack.services.git import GitService
512
+ from crackerjack.services.initialization import InitializationService
513
+
514
+ filesystem = FileSystemService()
515
+ git_service = GitService(console, pkg_path)
516
+ service = InitializationService(console, filesystem, git_service, pkg_path)
517
+ # Cast to protocol type to ensure correct typing
518
+ return t.cast(InitializationServiceProtocol, service)
519
+
520
+ self.container.register_transient(
521
+ InitializationServiceProtocol,
522
+ factory=create_initialization_service,
523
+ )
524
+
525
+ return self
526
+
527
+ def add_configuration_services(self) -> "ServiceCollectionBuilder":
528
+ console = self.console or Console(force_terminal=True)
529
+ pkg_path = self.pkg_path or Path.cwd()
530
+
531
+ from crackerjack.services.unified_config import UnifiedConfigurationService
532
+
533
+ self.container.register_singleton(
534
+ UnifiedConfigurationService,
535
+ factory=lambda: UnifiedConfigurationService(console, pkg_path),
536
+ )
537
+
538
+ self.container.register_singleton(
539
+ UnifiedConfigurationServiceProtocol,
540
+ factory=lambda: self.container.get(UnifiedConfigurationService),
541
+ )
542
+
543
+ from crackerjack.services.config_merge import ConfigMergeService
544
+
545
+ def create_config_merge_service() -> ConfigMergeService:
546
+ filesystem = self.container.get(FileSystemInterface)
547
+ git_service = self.container.get(GitInterface)
548
+ return ConfigMergeService(
549
+ console=console,
550
+ filesystem=filesystem,
551
+ git_service=git_service,
552
+ )
553
+
554
+ self.container.register_transient(
555
+ ConfigMergeServiceProtocol,
556
+ factory=create_config_merge_service,
557
+ )
558
+
559
+ return self
560
+
561
+ def build(self) -> EnhancedDependencyContainer:
562
+ return self.container
563
+
564
+
565
+ def create_enhanced_container(
566
+ console: Console | None = None,
567
+ pkg_path: Path | None = None,
568
+ dry_run: bool = False,
569
+ verbose: bool = False,
570
+ name: str = "crackerjack",
571
+ ) -> EnhancedDependencyContainer:
572
+ container = EnhancedDependencyContainer(name)
573
+
574
+ builder = ServiceCollectionBuilder(container)
575
+ builder.with_console(console or Console(force_terminal=True))
576
+ builder.with_package_path(pkg_path or Path.cwd())
577
+ builder.with_dry_run(dry_run)
578
+ builder.with_verbose(verbose)
579
+
580
+ builder.add_core_services()
581
+ builder.add_configuration_services()
582
+
583
+ return builder.build()