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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +30 -1
  3. crackerjack/__main__.py +342 -1263
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +27 -5
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/{rust_tool_manager.py → lsp/_manager.py} +3 -3
  27. crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
  28. crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
  29. crackerjack/adapters/refactor/README.md +59 -0
  30. crackerjack/adapters/refactor/__init__.py +12 -0
  31. crackerjack/adapters/refactor/creosote.py +318 -0
  32. crackerjack/adapters/refactor/refurb.py +406 -0
  33. crackerjack/adapters/refactor/skylos.py +494 -0
  34. crackerjack/adapters/sast/README.md +132 -0
  35. crackerjack/adapters/sast/__init__.py +32 -0
  36. crackerjack/adapters/sast/_base.py +201 -0
  37. crackerjack/adapters/sast/bandit.py +423 -0
  38. crackerjack/adapters/sast/pyscn.py +405 -0
  39. crackerjack/adapters/sast/semgrep.py +241 -0
  40. crackerjack/adapters/security/README.md +111 -0
  41. crackerjack/adapters/security/__init__.py +17 -0
  42. crackerjack/adapters/security/gitleaks.py +339 -0
  43. crackerjack/adapters/type/README.md +52 -0
  44. crackerjack/adapters/type/__init__.py +12 -0
  45. crackerjack/adapters/type/pyrefly.py +402 -0
  46. crackerjack/adapters/type/ty.py +402 -0
  47. crackerjack/adapters/type/zuban.py +522 -0
  48. crackerjack/adapters/utility/README.md +51 -0
  49. crackerjack/adapters/utility/__init__.py +10 -0
  50. crackerjack/adapters/utility/checks.py +884 -0
  51. crackerjack/agents/README.md +264 -0
  52. crackerjack/agents/__init__.py +40 -12
  53. crackerjack/agents/base.py +1 -0
  54. crackerjack/agents/claude_code_bridge.py +641 -0
  55. crackerjack/agents/coordinator.py +49 -53
  56. crackerjack/agents/dry_agent.py +187 -3
  57. crackerjack/agents/enhanced_coordinator.py +279 -0
  58. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  59. crackerjack/agents/error_middleware.py +53 -0
  60. crackerjack/agents/formatting_agent.py +6 -8
  61. crackerjack/agents/helpers/__init__.py +9 -0
  62. crackerjack/agents/helpers/performance/__init__.py +22 -0
  63. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  64. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  65. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  66. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  67. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  68. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  69. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  70. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  71. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  72. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  73. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  74. crackerjack/agents/performance_agent.py +121 -1152
  75. crackerjack/agents/refactoring_agent.py +156 -655
  76. crackerjack/agents/semantic_agent.py +479 -0
  77. crackerjack/agents/semantic_helpers.py +356 -0
  78. crackerjack/agents/test_creation_agent.py +19 -1605
  79. crackerjack/api.py +5 -7
  80. crackerjack/cli/README.md +394 -0
  81. crackerjack/cli/__init__.py +1 -1
  82. crackerjack/cli/cache_handlers.py +23 -18
  83. crackerjack/cli/cache_handlers_enhanced.py +1 -4
  84. crackerjack/cli/facade.py +70 -8
  85. crackerjack/cli/formatting.py +13 -0
  86. crackerjack/cli/handlers/__init__.py +85 -0
  87. crackerjack/cli/handlers/advanced.py +103 -0
  88. crackerjack/cli/handlers/ai_features.py +62 -0
  89. crackerjack/cli/handlers/analytics.py +479 -0
  90. crackerjack/cli/handlers/changelog.py +271 -0
  91. crackerjack/cli/handlers/config_handlers.py +16 -0
  92. crackerjack/cli/handlers/coverage.py +84 -0
  93. crackerjack/cli/handlers/documentation.py +280 -0
  94. crackerjack/cli/handlers/main_handlers.py +497 -0
  95. crackerjack/cli/handlers/monitoring.py +371 -0
  96. crackerjack/cli/handlers.py +249 -49
  97. crackerjack/cli/interactive.py +8 -5
  98. crackerjack/cli/options.py +203 -110
  99. crackerjack/cli/semantic_handlers.py +292 -0
  100. crackerjack/cli/version.py +19 -0
  101. crackerjack/code_cleaner.py +60 -24
  102. crackerjack/config/README.md +472 -0
  103. crackerjack/config/__init__.py +256 -0
  104. crackerjack/config/global_lock_config.py +191 -54
  105. crackerjack/config/hooks.py +188 -16
  106. crackerjack/config/loader.py +239 -0
  107. crackerjack/config/settings.py +141 -0
  108. crackerjack/config/tool_commands.py +331 -0
  109. crackerjack/core/README.md +393 -0
  110. crackerjack/core/async_workflow_orchestrator.py +79 -53
  111. crackerjack/core/autofix_coordinator.py +22 -9
  112. crackerjack/core/container.py +10 -9
  113. crackerjack/core/enhanced_container.py +9 -9
  114. crackerjack/core/performance.py +1 -1
  115. crackerjack/core/performance_monitor.py +5 -3
  116. crackerjack/core/phase_coordinator.py +1018 -634
  117. crackerjack/core/proactive_workflow.py +3 -3
  118. crackerjack/core/retry.py +275 -0
  119. crackerjack/core/service_watchdog.py +167 -23
  120. crackerjack/core/session_coordinator.py +187 -382
  121. crackerjack/core/timeout_manager.py +161 -44
  122. crackerjack/core/workflow/__init__.py +21 -0
  123. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  124. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  125. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  126. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  127. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  128. crackerjack/core/workflow_orchestrator.py +1247 -953
  129. crackerjack/data/README.md +11 -0
  130. crackerjack/data/__init__.py +8 -0
  131. crackerjack/data/models.py +79 -0
  132. crackerjack/data/repository.py +210 -0
  133. crackerjack/decorators/README.md +180 -0
  134. crackerjack/decorators/__init__.py +35 -0
  135. crackerjack/decorators/error_handling.py +649 -0
  136. crackerjack/decorators/error_handling_decorators.py +334 -0
  137. crackerjack/decorators/helpers.py +58 -0
  138. crackerjack/decorators/patterns.py +281 -0
  139. crackerjack/decorators/utils.py +58 -0
  140. crackerjack/docs/README.md +11 -0
  141. crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
  142. crackerjack/documentation/README.md +11 -0
  143. crackerjack/documentation/ai_templates.py +1 -1
  144. crackerjack/documentation/dual_output_generator.py +11 -9
  145. crackerjack/documentation/reference_generator.py +104 -59
  146. crackerjack/dynamic_config.py +52 -61
  147. crackerjack/errors.py +1 -1
  148. crackerjack/events/README.md +11 -0
  149. crackerjack/events/__init__.py +16 -0
  150. crackerjack/events/telemetry.py +175 -0
  151. crackerjack/events/workflow_bus.py +346 -0
  152. crackerjack/exceptions/README.md +301 -0
  153. crackerjack/exceptions/__init__.py +5 -0
  154. crackerjack/exceptions/config.py +4 -0
  155. crackerjack/exceptions/tool_execution_error.py +245 -0
  156. crackerjack/executors/README.md +591 -0
  157. crackerjack/executors/__init__.py +2 -0
  158. crackerjack/executors/async_hook_executor.py +539 -77
  159. crackerjack/executors/cached_hook_executor.py +3 -3
  160. crackerjack/executors/hook_executor.py +967 -102
  161. crackerjack/executors/hook_lock_manager.py +31 -22
  162. crackerjack/executors/individual_hook_executor.py +66 -32
  163. crackerjack/executors/lsp_aware_hook_executor.py +136 -57
  164. crackerjack/executors/progress_hook_executor.py +282 -0
  165. crackerjack/executors/tool_proxy.py +23 -7
  166. crackerjack/hooks/README.md +485 -0
  167. crackerjack/hooks/lsp_hook.py +8 -9
  168. crackerjack/intelligence/README.md +557 -0
  169. crackerjack/interactive.py +37 -10
  170. crackerjack/managers/README.md +369 -0
  171. crackerjack/managers/async_hook_manager.py +41 -57
  172. crackerjack/managers/hook_manager.py +449 -79
  173. crackerjack/managers/publish_manager.py +81 -36
  174. crackerjack/managers/test_command_builder.py +290 -12
  175. crackerjack/managers/test_executor.py +93 -8
  176. crackerjack/managers/test_manager.py +1082 -75
  177. crackerjack/managers/test_progress.py +118 -26
  178. crackerjack/mcp/README.md +374 -0
  179. crackerjack/mcp/cache.py +25 -2
  180. crackerjack/mcp/client_runner.py +35 -18
  181. crackerjack/mcp/context.py +9 -9
  182. crackerjack/mcp/dashboard.py +24 -8
  183. crackerjack/mcp/enhanced_progress_monitor.py +34 -23
  184. crackerjack/mcp/file_monitor.py +27 -6
  185. crackerjack/mcp/progress_components.py +45 -34
  186. crackerjack/mcp/progress_monitor.py +6 -9
  187. crackerjack/mcp/rate_limiter.py +11 -7
  188. crackerjack/mcp/server.py +2 -0
  189. crackerjack/mcp/server_core.py +187 -55
  190. crackerjack/mcp/service_watchdog.py +12 -9
  191. crackerjack/mcp/task_manager.py +2 -2
  192. crackerjack/mcp/tools/README.md +27 -0
  193. crackerjack/mcp/tools/__init__.py +2 -0
  194. crackerjack/mcp/tools/core_tools.py +75 -52
  195. crackerjack/mcp/tools/execution_tools.py +87 -31
  196. crackerjack/mcp/tools/intelligence_tools.py +2 -2
  197. crackerjack/mcp/tools/proactive_tools.py +1 -1
  198. crackerjack/mcp/tools/semantic_tools.py +584 -0
  199. crackerjack/mcp/tools/utility_tools.py +180 -132
  200. crackerjack/mcp/tools/workflow_executor.py +87 -46
  201. crackerjack/mcp/websocket/README.md +31 -0
  202. crackerjack/mcp/websocket/app.py +11 -1
  203. crackerjack/mcp/websocket/event_bridge.py +188 -0
  204. crackerjack/mcp/websocket/jobs.py +27 -4
  205. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  206. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  207. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  208. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  209. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  210. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  211. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  212. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  213. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  214. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  215. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  216. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  217. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  218. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  219. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  220. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  221. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  222. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  223. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  224. crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
  225. crackerjack/mcp/websocket/server.py +1 -3
  226. crackerjack/mcp/websocket/websocket_handler.py +107 -6
  227. crackerjack/models/README.md +308 -0
  228. crackerjack/models/__init__.py +10 -1
  229. crackerjack/models/config.py +639 -22
  230. crackerjack/models/config_adapter.py +6 -6
  231. crackerjack/models/protocols.py +1167 -23
  232. crackerjack/models/pydantic_models.py +320 -0
  233. crackerjack/models/qa_config.py +145 -0
  234. crackerjack/models/qa_results.py +134 -0
  235. crackerjack/models/results.py +35 -0
  236. crackerjack/models/semantic_models.py +258 -0
  237. crackerjack/models/task.py +19 -3
  238. crackerjack/models/test_models.py +60 -0
  239. crackerjack/monitoring/README.md +11 -0
  240. crackerjack/monitoring/ai_agent_watchdog.py +5 -4
  241. crackerjack/monitoring/metrics_collector.py +4 -3
  242. crackerjack/monitoring/regression_prevention.py +4 -3
  243. crackerjack/monitoring/websocket_server.py +4 -241
  244. crackerjack/orchestration/README.md +340 -0
  245. crackerjack/orchestration/__init__.py +43 -0
  246. crackerjack/orchestration/advanced_orchestrator.py +20 -67
  247. crackerjack/orchestration/cache/README.md +312 -0
  248. crackerjack/orchestration/cache/__init__.py +37 -0
  249. crackerjack/orchestration/cache/memory_cache.py +338 -0
  250. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  251. crackerjack/orchestration/config.py +297 -0
  252. crackerjack/orchestration/coverage_improvement.py +13 -6
  253. crackerjack/orchestration/execution_strategies.py +6 -6
  254. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  255. crackerjack/orchestration/strategies/README.md +401 -0
  256. crackerjack/orchestration/strategies/__init__.py +39 -0
  257. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  258. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  259. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  260. crackerjack/orchestration/test_progress_streamer.py +1 -1
  261. crackerjack/plugins/README.md +11 -0
  262. crackerjack/plugins/hooks.py +3 -2
  263. crackerjack/plugins/loader.py +3 -3
  264. crackerjack/plugins/managers.py +1 -1
  265. crackerjack/py313.py +191 -0
  266. crackerjack/security/README.md +11 -0
  267. crackerjack/services/README.md +374 -0
  268. crackerjack/services/__init__.py +8 -21
  269. crackerjack/services/ai/README.md +295 -0
  270. crackerjack/services/ai/__init__.py +7 -0
  271. crackerjack/services/ai/advanced_optimizer.py +878 -0
  272. crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
  273. crackerjack/services/ai/embeddings.py +444 -0
  274. crackerjack/services/ai/intelligent_commit.py +328 -0
  275. crackerjack/services/ai/predictive_analytics.py +510 -0
  276. crackerjack/services/api_extractor.py +5 -3
  277. crackerjack/services/bounded_status_operations.py +45 -5
  278. crackerjack/services/cache.py +249 -318
  279. crackerjack/services/changelog_automation.py +7 -3
  280. crackerjack/services/command_execution_service.py +305 -0
  281. crackerjack/services/config_integrity.py +83 -39
  282. crackerjack/services/config_merge.py +9 -6
  283. crackerjack/services/config_service.py +198 -0
  284. crackerjack/services/config_template.py +13 -26
  285. crackerjack/services/coverage_badge_service.py +6 -4
  286. crackerjack/services/coverage_ratchet.py +53 -27
  287. crackerjack/services/debug.py +18 -7
  288. crackerjack/services/dependency_analyzer.py +4 -4
  289. crackerjack/services/dependency_monitor.py +13 -13
  290. crackerjack/services/documentation_generator.py +4 -2
  291. crackerjack/services/documentation_service.py +62 -33
  292. crackerjack/services/enhanced_filesystem.py +81 -27
  293. crackerjack/services/enterprise_optimizer.py +1 -1
  294. crackerjack/services/error_pattern_analyzer.py +10 -10
  295. crackerjack/services/file_filter.py +221 -0
  296. crackerjack/services/file_hasher.py +5 -7
  297. crackerjack/services/file_io_service.py +361 -0
  298. crackerjack/services/file_modifier.py +615 -0
  299. crackerjack/services/filesystem.py +80 -109
  300. crackerjack/services/git.py +99 -5
  301. crackerjack/services/health_metrics.py +4 -6
  302. crackerjack/services/heatmap_generator.py +12 -3
  303. crackerjack/services/incremental_executor.py +380 -0
  304. crackerjack/services/initialization.py +101 -49
  305. crackerjack/services/log_manager.py +2 -2
  306. crackerjack/services/logging.py +120 -68
  307. crackerjack/services/lsp_client.py +12 -12
  308. crackerjack/services/memory_optimizer.py +27 -22
  309. crackerjack/services/monitoring/README.md +30 -0
  310. crackerjack/services/monitoring/__init__.py +9 -0
  311. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  312. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  313. crackerjack/services/monitoring/health_metrics.py +716 -0
  314. crackerjack/services/monitoring/metrics.py +587 -0
  315. crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
  316. crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
  317. crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
  318. crackerjack/services/parallel_executor.py +166 -55
  319. crackerjack/services/patterns/__init__.py +142 -0
  320. crackerjack/services/patterns/agents.py +107 -0
  321. crackerjack/services/patterns/code/__init__.py +15 -0
  322. crackerjack/services/patterns/code/detection.py +118 -0
  323. crackerjack/services/patterns/code/imports.py +107 -0
  324. crackerjack/services/patterns/code/paths.py +159 -0
  325. crackerjack/services/patterns/code/performance.py +119 -0
  326. crackerjack/services/patterns/code/replacement.py +36 -0
  327. crackerjack/services/patterns/core.py +212 -0
  328. crackerjack/services/patterns/documentation/__init__.py +14 -0
  329. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  330. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  331. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  332. crackerjack/services/patterns/formatting.py +226 -0
  333. crackerjack/services/patterns/operations.py +339 -0
  334. crackerjack/services/patterns/security/__init__.py +23 -0
  335. crackerjack/services/patterns/security/code_injection.py +122 -0
  336. crackerjack/services/patterns/security/credentials.py +190 -0
  337. crackerjack/services/patterns/security/path_traversal.py +221 -0
  338. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  339. crackerjack/services/patterns/templates.py +62 -0
  340. crackerjack/services/patterns/testing/__init__.py +18 -0
  341. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  342. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  343. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  344. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  345. crackerjack/services/patterns/tool_output/other.py +97 -0
  346. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  347. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  348. crackerjack/services/patterns/url_sanitization.py +114 -0
  349. crackerjack/services/patterns/utilities.py +42 -0
  350. crackerjack/services/patterns/utils.py +339 -0
  351. crackerjack/services/patterns/validation.py +46 -0
  352. crackerjack/services/patterns/versioning.py +62 -0
  353. crackerjack/services/predictive_analytics.py +21 -8
  354. crackerjack/services/profiler.py +280 -0
  355. crackerjack/services/quality/README.md +415 -0
  356. crackerjack/services/quality/__init__.py +11 -0
  357. crackerjack/services/quality/anomaly_detector.py +392 -0
  358. crackerjack/services/quality/pattern_cache.py +333 -0
  359. crackerjack/services/quality/pattern_detector.py +479 -0
  360. crackerjack/services/quality/qa_orchestrator.py +491 -0
  361. crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
  362. crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
  363. crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
  364. crackerjack/services/regex_patterns.py +58 -2987
  365. crackerjack/services/regex_utils.py +55 -29
  366. crackerjack/services/secure_status_formatter.py +42 -15
  367. crackerjack/services/secure_subprocess.py +35 -2
  368. crackerjack/services/security.py +16 -8
  369. crackerjack/services/server_manager.py +40 -51
  370. crackerjack/services/smart_scheduling.py +46 -6
  371. crackerjack/services/status_authentication.py +3 -3
  372. crackerjack/services/thread_safe_status_collector.py +1 -0
  373. crackerjack/services/tool_filter.py +368 -0
  374. crackerjack/services/tool_version_service.py +9 -5
  375. crackerjack/services/unified_config.py +43 -351
  376. crackerjack/services/vector_store.py +689 -0
  377. crackerjack/services/version_analyzer.py +6 -4
  378. crackerjack/services/version_checker.py +14 -8
  379. crackerjack/services/zuban_lsp_service.py +5 -4
  380. crackerjack/slash_commands/README.md +11 -0
  381. crackerjack/slash_commands/init.md +2 -12
  382. crackerjack/slash_commands/run.md +84 -50
  383. crackerjack/tools/README.md +11 -0
  384. crackerjack/tools/__init__.py +30 -0
  385. crackerjack/tools/_git_utils.py +105 -0
  386. crackerjack/tools/check_added_large_files.py +139 -0
  387. crackerjack/tools/check_ast.py +105 -0
  388. crackerjack/tools/check_json.py +103 -0
  389. crackerjack/tools/check_jsonschema.py +297 -0
  390. crackerjack/tools/check_toml.py +103 -0
  391. crackerjack/tools/check_yaml.py +110 -0
  392. crackerjack/tools/codespell_wrapper.py +72 -0
  393. crackerjack/tools/end_of_file_fixer.py +202 -0
  394. crackerjack/tools/format_json.py +128 -0
  395. crackerjack/tools/mdformat_wrapper.py +114 -0
  396. crackerjack/tools/trailing_whitespace.py +198 -0
  397. crackerjack/tools/validate_regex_patterns.py +7 -3
  398. crackerjack/ui/README.md +11 -0
  399. crackerjack/ui/dashboard_renderer.py +28 -0
  400. crackerjack/ui/templates/README.md +11 -0
  401. crackerjack/utils/console_utils.py +13 -0
  402. crackerjack/utils/dependency_guard.py +230 -0
  403. crackerjack/utils/retry_utils.py +275 -0
  404. crackerjack/workflows/README.md +590 -0
  405. crackerjack/workflows/__init__.py +46 -0
  406. crackerjack/workflows/actions.py +811 -0
  407. crackerjack/workflows/auto_fix.py +444 -0
  408. crackerjack/workflows/container_builder.py +499 -0
  409. crackerjack/workflows/definitions.py +443 -0
  410. crackerjack/workflows/engine.py +177 -0
  411. crackerjack/workflows/event_bridge.py +242 -0
  412. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
  413. crackerjack-0.45.2.dist-info/RECORD +478 -0
  414. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  415. crackerjack/managers/test_manager_backup.py +0 -1075
  416. crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
  417. crackerjack/mixins/__init__.py +0 -3
  418. crackerjack/mixins/error_handling.py +0 -145
  419. crackerjack/services/config.py +0 -358
  420. crackerjack/ui/server_panels.py +0 -125
  421. crackerjack-0.37.9.dist-info/RECORD +0 -231
  422. /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
  423. /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
  424. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
  425. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,271 @@
1
+ """CLI handlers for changelog generation and version analysis.
2
+
3
+ This module contains handlers for:
4
+ - Changelog generation from git commits
5
+ - Changelog dry-run previews
6
+ - Automated version analysis and recommendations
7
+ - Debug/verbose flag setup
8
+ """
9
+
10
+ import typing as t
11
+ from pathlib import Path
12
+
13
+ from acb.console import Console
14
+ from acb.depends import Inject, depends
15
+
16
+ if t.TYPE_CHECKING:
17
+ from crackerjack.services.changelog_automation import ChangelogGenerator
18
+ from crackerjack.services.git import GitService
19
+
20
+
21
+ def setup_changelog_services() -> dict[str, t.Any]:
22
+ """Set up changelog generation services (git, generator, path)."""
23
+ from crackerjack.services.changelog_automation import ChangelogGenerator
24
+ from crackerjack.services.git import GitService
25
+
26
+ pkg_path = Path()
27
+ git_service = GitService()
28
+ changelog_generator = ChangelogGenerator()
29
+
30
+ return {
31
+ "pkg_path": pkg_path,
32
+ "git_service": git_service,
33
+ "generator": changelog_generator,
34
+ }
35
+
36
+
37
+ @depends.inject # type: ignore[misc]
38
+ def handle_changelog_dry_run(
39
+ generator: "ChangelogGenerator",
40
+ changelog_since: str | None,
41
+ options: t.Any,
42
+ console: Inject[Console],
43
+ ) -> bool:
44
+ """Handle changelog dry-run (preview without writing)."""
45
+ console.print("🔍 [bold blue]Previewing changelog generation...[/bold blue]")
46
+ entries = generator.generate_changelog_entries(changelog_since)
47
+ if entries:
48
+ generator._display_changelog_preview(entries)
49
+ console.print("✅ [bold green]Changelog preview completed![/bold green]")
50
+ else:
51
+ console.print("⚠️ No new changelog entries to generate")
52
+
53
+ return should_continue_after_changelog(options)
54
+
55
+
56
+ @depends.inject # type: ignore[misc]
57
+ def handle_changelog_generation(
58
+ services: dict[str, t.Any],
59
+ changelog_path: Path,
60
+ changelog_version: str | None,
61
+ changelog_since: str | None,
62
+ options: t.Any,
63
+ console: Inject[Console],
64
+ ) -> bool:
65
+ """Handle changelog generation and write to file."""
66
+ console.print("📝 [bold blue]Generating changelog...[/bold blue]")
67
+
68
+ version = determine_changelog_version(
69
+ services["git_service"], changelog_version, changelog_since, options
70
+ )
71
+
72
+ success = services["generator"].generate_changelog_from_commits(
73
+ changelog_path=changelog_path,
74
+ version=version,
75
+ since_version=changelog_since,
76
+ )
77
+
78
+ if success:
79
+ console.print(
80
+ f"✅ [bold green]Changelog updated for version {version}![/bold green]"
81
+ )
82
+ return should_continue_after_changelog(options)
83
+ console.print("❌ [bold red]Changelog generation failed![/bold red]")
84
+ return False
85
+
86
+
87
+ @depends.inject # type: ignore[misc]
88
+ def determine_changelog_version(
89
+ git_service: "GitService",
90
+ changelog_version: str | None,
91
+ changelog_since: str | None,
92
+ options: t.Any,
93
+ console: Inject[Console],
94
+ ) -> str:
95
+ """Determine changelog version (auto-detect via AI or use provided version)."""
96
+ if getattr(options, "auto_version", False) and not changelog_version:
97
+ try:
98
+ import asyncio
99
+
100
+ from crackerjack.services.version_analyzer import VersionAnalyzer
101
+
102
+ version_analyzer = VersionAnalyzer(git_service)
103
+ console.print(
104
+ "[cyan]🔍[/cyan] Analyzing version changes for intelligent changelog..."
105
+ )
106
+
107
+ recommendation = asyncio.run(
108
+ version_analyzer.recommend_version_bump(changelog_since)
109
+ )
110
+ version = recommendation.recommended_version
111
+ console.print(f"[green]✨[/green] Using AI-recommended version: {version}")
112
+ return version
113
+ except Exception as e:
114
+ console.print(f"[yellow]⚠️[/yellow] Version analysis failed: {e}")
115
+ return changelog_version or "Unreleased"
116
+
117
+ return changelog_version or "Unreleased"
118
+
119
+
120
+ def should_continue_after_changelog(options: t.Any) -> bool:
121
+ """Check if workflow should continue after changelog commands."""
122
+ return any(
123
+ [
124
+ options.run_tests,
125
+ options.strip_code,
126
+ options.all,
127
+ options.publish,
128
+ options.comp,
129
+ ]
130
+ )
131
+
132
+
133
+ def handle_changelog_commands(
134
+ generate_changelog: bool,
135
+ changelog_dry_run: bool,
136
+ changelog_version: str | None,
137
+ changelog_since: str | None,
138
+ options: t.Any,
139
+ ) -> bool:
140
+ """Handle all changelog-related commands (generation, dry-run, versioning).
141
+
142
+ Args:
143
+ generate_changelog: Whether to generate changelog
144
+ changelog_dry_run: Whether to preview changelog without writing
145
+ changelog_version: Explicit version to use (or None for auto/unreleased)
146
+ changelog_since: Git reference to generate changelog since
147
+ options: CLI options object
148
+
149
+ Returns:
150
+ True if execution should continue to other workflows
151
+ """
152
+ if not (generate_changelog or changelog_dry_run):
153
+ return True
154
+
155
+ services = setup_changelog_services()
156
+ changelog_path = services["pkg_path"] / "CHANGELOG.md"
157
+
158
+ if changelog_dry_run:
159
+ return handle_changelog_dry_run(services["generator"], changelog_since, options)
160
+
161
+ if generate_changelog:
162
+ return handle_changelog_generation(
163
+ services, changelog_path, changelog_version, changelog_since, options
164
+ )
165
+
166
+ return should_continue_after_changelog(options)
167
+
168
+
169
+ # === Version Analysis Handler ===
170
+
171
+
172
+ @depends.inject # type: ignore[misc]
173
+ def handle_version_analysis(
174
+ auto_version: bool,
175
+ version_since: str | None,
176
+ accept_version: bool,
177
+ options: t.Any,
178
+ console: Inject[Console],
179
+ ) -> bool:
180
+ """Handle automated version analysis and recommendations.
181
+
182
+ Args:
183
+ auto_version: Whether to perform automated version analysis
184
+ version_since: Git reference to analyze changes since
185
+ accept_version: Whether to auto-accept the recommendation
186
+ options: CLI options object
187
+ console: Rich console for output
188
+
189
+ Returns:
190
+ True if execution should continue to other workflows
191
+ """
192
+ if not auto_version:
193
+ return True
194
+
195
+ from rich.prompt import Confirm
196
+
197
+ from crackerjack.services.git import GitService
198
+ from crackerjack.services.version_analyzer import VersionAnalyzer
199
+
200
+ Path()
201
+ git_service = GitService()
202
+ version_analyzer = VersionAnalyzer(git_service)
203
+
204
+ try:
205
+ import asyncio
206
+
207
+ recommendation = asyncio.run(
208
+ version_analyzer.recommend_version_bump(version_since)
209
+ )
210
+ version_analyzer.display_recommendation(recommendation)
211
+
212
+ if accept_version or Confirm.ask(
213
+ f"\nAccept recommendation ({recommendation.bump_type.value})",
214
+ default=True,
215
+ ):
216
+ console.print(
217
+ f"[green]✅ Version bump accepted: {recommendation.current_version} → {recommendation.recommended_version}[/green]"
218
+ )
219
+
220
+ else:
221
+ console.print("[yellow]❌ Version bump declined[/yellow]")
222
+
223
+ except Exception as e:
224
+ console.print(f"[red]❌ Version analysis failed: {e}[/red]")
225
+
226
+ return any(
227
+ [
228
+ options.run_tests,
229
+ options.strip_code,
230
+ options.all,
231
+ options.publish,
232
+ options.comp,
233
+ ]
234
+ )
235
+
236
+
237
+ # === Debug/Verbose Setup ===
238
+
239
+
240
+ def setup_debug_and_verbose_flags(
241
+ ai_fix: bool, ai_debug: bool, debug: bool, verbose: bool, options: t.Any
242
+ ) -> tuple[bool, bool]:
243
+ """Set up debug and verbose flags for AI and general operations.
244
+
245
+ Args:
246
+ ai_fix: Whether AI fixing is enabled
247
+ ai_debug: Whether AI debug mode is enabled
248
+ debug: Whether general debug mode is enabled
249
+ verbose: Whether verbose output is enabled
250
+ options: CLI options object to update
251
+
252
+ Returns:
253
+ Tuple of (ai_fix, verbose) flags after processing
254
+ """
255
+ if ai_debug:
256
+ ai_fix = True
257
+ verbose = True
258
+ options.verbose = True
259
+ options.ai_debug = True # Set ai_debug on options for downstream checks
260
+
261
+ if debug:
262
+ verbose = True
263
+ options.verbose = True
264
+
265
+ # Set up structured logging for AI-related operations if needed
266
+ if ai_fix or ai_debug:
267
+ from crackerjack.services.logging import setup_structured_logging
268
+
269
+ setup_structured_logging(level="DEBUG", json_output=True)
270
+
271
+ return ai_fix, verbose
@@ -0,0 +1,16 @@
1
+ """Config-related handlers for the CLI."""
2
+
3
+ # This is a placeholder - in a proper refactoring, these functions would be moved
4
+ # from the original handlers.py file to the appropriate module
5
+
6
+
7
+ def handle_config_updates(options, console=None):
8
+ """Handle configuration update commands."""
9
+ # This function would be implemented based on the original in handlers.py
10
+ # For now, we'll just raise an error to indicate this needs to be implemented
11
+ raise NotImplementedError(
12
+ "handle_config_updates needs to be properly implemented in the modular structure"
13
+ )
14
+
15
+
16
+ __all__ = ["handle_config_updates"]
@@ -0,0 +1,84 @@
1
+ """CLI handlers for test coverage reporting and status"""
2
+
3
+ import typing as t
4
+ from pathlib import Path
5
+
6
+ from acb.console import Console
7
+ from acb.depends import Inject, depends
8
+
9
+
10
+ @depends.inject # type: ignore[misc]
11
+ def display_coverage_info(
12
+ coverage_info: dict[str, t.Any], console: Inject[Console]
13
+ ) -> None:
14
+ coverage_percent = coverage_info.get("coverage_percent", 0.0)
15
+ coverage_source = coverage_info.get("source", "unknown")
16
+
17
+ if coverage_percent > 0:
18
+ console.print(
19
+ f"[green]Current Coverage:[/green] {coverage_percent:.2f}% (from {coverage_source})"
20
+ )
21
+ else:
22
+ console.print("[yellow]Current Coverage:[/yellow] No coverage data available")
23
+
24
+ status_message = coverage_info.get("message")
25
+ if status_message:
26
+ console.print(f"[dim]{status_message}[/dim]")
27
+
28
+
29
+ @depends.inject # type: ignore[misc]
30
+ def display_coverage_report(test_manager: t.Any, console: Inject[Console]) -> None:
31
+ coverage_report = test_manager.get_coverage_report()
32
+ if coverage_report:
33
+ console.print(f"[cyan]Details:[/cyan] {coverage_report}")
34
+
35
+
36
+ @depends.inject # type: ignore[misc]
37
+ def display_ratchet_status(test_manager: t.Any, console: Inject[Console]) -> None:
38
+ from contextlib import suppress
39
+
40
+ with suppress(Exception):
41
+ ratchet_status = test_manager.get_coverage_ratchet_status()
42
+ if ratchet_status:
43
+ next_milestone = ratchet_status.get("next_milestone")
44
+ if next_milestone:
45
+ console.print(f"[cyan]Next Milestone:[/cyan] {next_milestone:.0f}%")
46
+
47
+ milestones = ratchet_status.get("milestones_achieved", [])
48
+ if milestones:
49
+ console.print(f"[green]Milestones Achieved:[/green] {len(milestones)}")
50
+
51
+
52
+ @depends.inject # type: ignore[misc]
53
+ def handle_coverage_status(
54
+ coverage_status: bool, options: t.Any, console: Inject[Console]
55
+ ) -> bool:
56
+ if not coverage_status:
57
+ return True
58
+
59
+ try:
60
+ from crackerjack.managers.test_manager import TestManager
61
+
62
+ pkg_path = Path.cwd()
63
+
64
+ test_manager = TestManager(pkg_path)
65
+
66
+ console.print("[cyan]📊[/cyan] Coverage Status Report")
67
+ console.print("=" * 50)
68
+
69
+ coverage_info = test_manager.get_coverage()
70
+ display_coverage_info(coverage_info)
71
+
72
+ display_coverage_report(test_manager)
73
+
74
+ display_ratchet_status(test_manager)
75
+
76
+ console.print()
77
+ return False
78
+
79
+ except Exception as e:
80
+ console.print(f"[red]❌[/red] Failed to get coverage status: {e}")
81
+ import traceback
82
+
83
+ console.print(f"[dim]{traceback.format_exc()}[/dim]")
84
+ return False
@@ -0,0 +1,280 @@
1
+ """CLI handlers for documentation generation and validation.
2
+
3
+ This module contains handlers for:
4
+ - API documentation generation
5
+ - Documentation validation
6
+ - MkDocs integration and site building
7
+ """
8
+
9
+ import typing as t
10
+ from pathlib import Path
11
+
12
+ from acb.console import Console
13
+ from acb.depends import Inject, depends
14
+
15
+
16
+ @depends.inject # type: ignore[misc]
17
+ def generate_documentation(doc_service: t.Any, console: Inject[Console]) -> bool:
18
+ """Generate API documentation using documentation service."""
19
+ console.print("📖 [bold blue]Generating API documentation...[/bold blue]")
20
+ success = doc_service.generate_full_api_documentation()
21
+ if success:
22
+ console.print(
23
+ "✅ [bold green]Documentation generated successfully![/bold green]"
24
+ )
25
+ return True
26
+ console.print("❌ [bold red]Documentation generation failed![/bold red]")
27
+ return False
28
+
29
+
30
+ @depends.inject # type: ignore[misc]
31
+ def validate_documentation_files(doc_service: t.Any, console: Inject[Console]) -> None:
32
+ """Validate existing documentation files for consistency."""
33
+ console.print("🔍 [bold blue]Validating documentation...[/bold blue]")
34
+ doc_paths = [Path("docs"), Path("README.md"), Path("CHANGELOG.md")]
35
+ existing_docs = [p for p in doc_paths if p.exists()]
36
+
37
+ if existing_docs:
38
+ issues = doc_service.validate_documentation(existing_docs)
39
+ if issues:
40
+ console.print(f"⚠️ Found {len(issues)} documentation issues:")
41
+ for issue in issues:
42
+ file_path = issue.get("path", issue.get("file", "unknown"))
43
+ console.print(f" - {file_path}: {issue['message']}")
44
+ else:
45
+ console.print(
46
+ "✅ [bold green]Documentation validation passed![/bold green]"
47
+ )
48
+ else:
49
+ console.print("⚠️ No documentation files found to validate")
50
+
51
+
52
+ def handle_documentation_commands(
53
+ generate_docs: bool, validate_docs: bool, options: t.Any
54
+ ) -> bool:
55
+ """Handle documentation generation and validation commands.
56
+
57
+ Args:
58
+ generate_docs: Whether to generate API documentation
59
+ validate_docs: Whether to validate existing documentation
60
+ options: CLI options object with run_tests, strip_code, all, publish, comp flags
61
+
62
+ Returns:
63
+ True if execution should continue to other workflows
64
+ """
65
+ if not (generate_docs or validate_docs):
66
+ return True
67
+
68
+ from crackerjack.services.documentation_service import DocumentationServiceImpl
69
+
70
+ # Use current working directory instead of hardcoded "crackerjack"
71
+ pkg_path = Path.cwd()
72
+ doc_service = DocumentationServiceImpl(pkg_path=pkg_path)
73
+
74
+ if generate_docs:
75
+ if not generate_documentation(doc_service):
76
+ return False
77
+
78
+ if validate_docs:
79
+ validate_documentation_files(doc_service)
80
+
81
+ return any(
82
+ [
83
+ options.run_tests,
84
+ options.strip_code,
85
+ options.all,
86
+ options.publish,
87
+ options.comp,
88
+ ]
89
+ )
90
+
91
+
92
+ # === MkDocs Integration Handlers ===
93
+
94
+
95
+ def create_sync_filesystem_service() -> t.Any:
96
+ """Create synchronous filesystem service for MkDocs integration."""
97
+
98
+ class SyncFileSystemService:
99
+ def read_file(self, path: str | Path) -> str:
100
+ return Path(path).read_text()
101
+
102
+ def write_file(self, path: str | Path, content: str) -> None:
103
+ Path(path).write_text(content)
104
+
105
+ def exists(self, path: str | Path) -> bool:
106
+ return Path(path).exists()
107
+
108
+ def mkdir(self, path: str | Path, parents: bool = False) -> None:
109
+ Path(path).mkdir(parents=parents, exist_ok=True)
110
+
111
+ def ensure_directory(self, path: str | Path) -> None:
112
+ Path(path).mkdir(parents=True, exist_ok=True)
113
+
114
+ return SyncFileSystemService()
115
+
116
+
117
+ def create_config_manager() -> t.Any:
118
+ """Create configuration manager for MkDocs integration."""
119
+
120
+ class ConfigManager:
121
+ def __init__(self) -> None:
122
+ self._config: dict[str, t.Any] = {}
123
+
124
+ def get(self, key: str, default: t.Any = None) -> t.Any:
125
+ return self._config.get(key, default)
126
+
127
+ def set(self, key: str, value: t.Any) -> None:
128
+ self._config[key] = value
129
+
130
+ def save(self) -> bool:
131
+ return True
132
+
133
+ def load(self) -> bool:
134
+ return True
135
+
136
+ return ConfigManager()
137
+
138
+
139
+ def create_logger_adapter(logger: t.Any) -> t.Any:
140
+ """Create logger adapter for MkDocs integration."""
141
+
142
+ class LoggerAdapter:
143
+ def __init__(self, logger: t.Any) -> None:
144
+ self._logger = logger
145
+
146
+ def debug(self, message: str, **kwargs: t.Any) -> None:
147
+ self._logger.debug(message)
148
+
149
+ def info(self, message: str, **kwargs: t.Any) -> None:
150
+ self._logger.info(message)
151
+
152
+ def warning(self, message: str, **kwargs: t.Any) -> None:
153
+ self._logger.warning(message)
154
+
155
+ def error(self, message: str, **kwargs: t.Any) -> None:
156
+ self._logger.error(message)
157
+
158
+ return LoggerAdapter(logger)
159
+
160
+
161
+ def create_mkdocs_services() -> dict[str, t.Any]:
162
+ """Create MkDocs service instances (integration, builder, filesystem, config)."""
163
+ from logging import getLogger
164
+
165
+ from crackerjack.documentation.mkdocs_integration import (
166
+ MkDocsIntegrationService,
167
+ MkDocsSiteBuilder,
168
+ )
169
+
170
+ filesystem = create_sync_filesystem_service()
171
+ config_manager = create_config_manager()
172
+ logger = getLogger(__name__)
173
+ logger_adapter = create_logger_adapter(logger)
174
+
175
+ integration_service = MkDocsIntegrationService(
176
+ config_manager, filesystem, logger_adapter
177
+ )
178
+ builder = MkDocsSiteBuilder(integration_service)
179
+
180
+ return {"builder": builder, "filesystem": filesystem, "config": config_manager}
181
+
182
+
183
+ def determine_mkdocs_output_dir(mkdocs_output: str | None) -> Path:
184
+ """Determine output directory for MkDocs site."""
185
+ return Path(mkdocs_output) if mkdocs_output else Path.cwd() / "docs_site"
186
+
187
+
188
+ def create_sample_docs_content() -> dict[str, str]:
189
+ """Create sample documentation content for MkDocs site."""
190
+ return {
191
+ "index.md": "# Project Documentation\n\nWelcome to the project documentation.",
192
+ "getting-started.md": "# Getting Started\n\nQuick start guide for the project.",
193
+ "api-reference.md": "# API Reference\n\nAPI documentation and examples.",
194
+ }
195
+
196
+
197
+ def build_mkdocs_site(
198
+ builder: t.Any, docs_content: dict[str, str], output_dir: Path, serve: bool
199
+ ) -> None:
200
+ """Build MkDocs documentation site asynchronously."""
201
+ import asyncio
202
+
203
+ asyncio.run(
204
+ builder.build_documentation_site(
205
+ project_name="Project Documentation",
206
+ project_description="Comprehensive project documentation",
207
+ author="Crackerjack",
208
+ documentation_content=docs_content,
209
+ output_dir=output_dir,
210
+ serve=serve,
211
+ )
212
+ )
213
+
214
+
215
+ @depends.inject # type: ignore[misc]
216
+ def handle_mkdocs_build_result(
217
+ site: t.Any, mkdocs_serve: bool, console: Inject[Console] = None
218
+ ) -> None:
219
+ """Display MkDocs build results to console."""
220
+ if site:
221
+ console.print(
222
+ f"[green]✅[/green] MkDocs site generated successfully at: {site.build_path}"
223
+ )
224
+ console.print(
225
+ f"[blue]📄[/blue] Generated {len(site.pages)} documentation pages"
226
+ )
227
+
228
+ if mkdocs_serve:
229
+ console.print(
230
+ "[blue]🌐[/blue] MkDocs development server started at http://127.0.0.1:8000"
231
+ )
232
+ console.print("[yellow]Press Ctrl+C to stop the server[/yellow]")
233
+ else:
234
+ console.print("[red]❌[/red] Failed to generate MkDocs site")
235
+
236
+
237
+ @depends.inject # type: ignore[misc]
238
+ def handle_mkdocs_integration(
239
+ mkdocs_integration: bool,
240
+ mkdocs_serve: bool,
241
+ mkdocs_theme: str,
242
+ mkdocs_output: str | None,
243
+ console: Inject[Console],
244
+ ) -> bool:
245
+ """Handle MkDocs integration command for documentation site generation.
246
+
247
+ Args:
248
+ mkdocs_integration: Whether MkDocs integration is requested
249
+ mkdocs_serve: Whether to serve the site locally
250
+ mkdocs_theme: Theme to use for MkDocs site
251
+ mkdocs_output: Output directory for site
252
+ console: Rich console for output
253
+
254
+ Returns:
255
+ True if execution should continue, False otherwise
256
+ """
257
+ if not mkdocs_integration:
258
+ return True
259
+
260
+ console.print("[cyan]📚[/cyan] Generating MkDocs documentation site...")
261
+
262
+ try:
263
+ services = create_mkdocs_services()
264
+ builder = services["builder"]
265
+ output_dir = determine_mkdocs_output_dir(mkdocs_output)
266
+ docs_content = create_sample_docs_content()
267
+
268
+ console.print(
269
+ f"[blue]🏗️[/blue] Building documentation site with {mkdocs_theme} theme..."
270
+ )
271
+
272
+ build_mkdocs_site(builder, docs_content, output_dir, mkdocs_serve)
273
+ site = None
274
+ handle_mkdocs_build_result(site, mkdocs_serve)
275
+
276
+ return False
277
+
278
+ except Exception as e:
279
+ console.print(f"[red]❌[/red] MkDocs integration error: {e}")
280
+ return False