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
crackerjack/api.py CHANGED
@@ -3,13 +3,13 @@ import typing as t
3
3
  from dataclasses import dataclass
4
4
  from pathlib import Path
5
5
 
6
- from rich.console import Console
6
+ from acb.console import Console
7
+ from acb.depends import depends
7
8
 
8
9
  from .code_cleaner import CleaningResult, CodeCleaner, PackageCleaningResult
9
10
  from .core.workflow_orchestrator import WorkflowOrchestrator
10
11
  from .errors import CrackerjackError, ErrorCode
11
- from .interactive import InteractiveCLI
12
- from .interactive import WorkflowOptions as InteractiveWorkflowOptions
12
+ from .interactive import InteractiveCLI, InteractiveWorkflowOptions
13
13
  from .models.config import WorkflowOptions
14
14
  from .services.regex_patterns import SAFE_PATTERNS
15
15
 
@@ -50,16 +50,15 @@ class CrackerjackAPI:
50
50
  verbose: bool = False,
51
51
  ) -> None:
52
52
  self.project_path = project_path or Path.cwd()
53
- self.console = console or Console()
53
+ self.console = console or depends.get_sync(Console)
54
54
  self.verbose = verbose
55
55
 
56
56
  self.orchestrator = WorkflowOrchestrator(
57
- console=self.console,
58
57
  pkg_path=self.project_path,
59
58
  verbose=self.verbose,
60
59
  )
61
60
 
62
- self.container = self.orchestrator.container
61
+ self.container = t.cast(t.Any, getattr(self.orchestrator, "container", None))
63
62
 
64
63
  self._code_cleaner: CodeCleaner | None = None
65
64
  self._interactive_cli: InteractiveCLI | None = None
@@ -601,7 +600,6 @@ class CrackerjackAPI:
601
600
  return None
602
601
 
603
602
  def _find_fallback_package_directory(self) -> Path | None:
604
- # Only check project directory name, not src
605
603
  package_dir = self.project_path / self.project_path.name
606
604
  if self._is_valid_python_package_directory(package_dir):
607
605
  return package_dir
@@ -0,0 +1,394 @@
1
+ > Crackerjack Docs: [Main](<../../README.md>) | [CLAUDE.md](../../docs/guides/CLAUDE.md) | [CLI](<./README.md>)
2
+
3
+ # CLI
4
+
5
+ Command-line interface handlers and option processing for the Crackerjack CLI using Click and Typer frameworks.
6
+
7
+ ## Overview
8
+
9
+ The CLI package provides the primary user interface for Crackerjack, handling command-line arguments, option validation, and routing to appropriate backend handlers. It follows a modular handler-based architecture with 90% ACB compliance, using protocol-based dependency injection for most components.
10
+
11
+ ## Architecture
12
+
13
+ ### Entry Point Flow
14
+
15
+ ```
16
+ python -m crackerjack [options]
17
+
18
+ __main__.py
19
+
20
+ options.py (Option parsing & validation)
21
+
22
+ handlers/ (Specialized command handlers)
23
+
24
+ Managers/Orchestration (Backend coordination)
25
+ ```
26
+
27
+ ### Core Components
28
+
29
+ - **options.py**: CLI option definitions, validation, and parsing using Pydantic models
30
+ - **handlers.py**: Main command handlers for quality workflows
31
+ - **facade.py**: CLI facade for simplified command routing
32
+ - **interactive.py**: Interactive mode for guided workflows
33
+ - **utils.py**: CLI utility functions
34
+
35
+ ### Handler Modules
36
+
37
+ **handlers/** — Specialized command handlers by feature:
38
+
39
+ - **main_handlers.py**: Core quality workflow execution (fast, comprehensive, tests)
40
+ - **analytics.py**: Coverage analytics, metrics, and reporting
41
+ - **monitoring.py**: Health monitoring, watchdog, and status checks
42
+ - **documentation.py**: Documentation generation and changelog automation
43
+ - **changelog.py**: Changelog management and versioning
44
+ - **coverage.py**: Coverage ratchet and improvement workflows
45
+ - **ai_features.py**: AI agent integration and auto-fixing
46
+ - **advanced.py**: Advanced features and experimental workflows
47
+ - **config_handlers.py**: Configuration management and initialization
48
+
49
+ ### Cache Handlers
50
+
51
+ - **cache_handlers.py**: Basic cache management operations
52
+ - **cache_handlers_enhanced.py**: Advanced cache operations with pattern analysis
53
+ - **semantic_handlers.py**: Semantic search and code comprehension handlers
54
+
55
+ ## Command Categories
56
+
57
+ ### Quality Workflows
58
+
59
+ ```bash
60
+ # Fast hooks (~5s)
61
+ python -m crackerjack --fast
62
+
63
+ # Comprehensive hooks (~30s)
64
+ python -m crackerjack --comp
65
+
66
+ # Full quality + tests
67
+ python -m crackerjack --run-tests
68
+
69
+ # AI-powered auto-fixing
70
+ python -m crackerjack --ai-fix --run-tests
71
+ ```
72
+
73
+ ### Publishing & Versioning
74
+
75
+ ```bash
76
+ # Interactive versioning
77
+ python -m crackerjack --publish interactive
78
+
79
+ # Automated bump
80
+ python -m crackerjack --publish patch # or minor, major, auto
81
+
82
+ # Full release workflow
83
+ python -m crackerjack --all patch
84
+ ```
85
+
86
+ ### MCP Server Management
87
+
88
+ ```bash
89
+ # Start MCP server
90
+ python -m crackerjack --start-mcp-server
91
+
92
+ # Restart server
93
+ python -m crackerjack --restart-mcp-server
94
+
95
+ # Health monitoring
96
+ python -m crackerjack --watchdog
97
+ ```
98
+
99
+ ### Coverage & Analytics
100
+
101
+ ```bash
102
+ # Coverage report
103
+ python -m crackerjack --coverage-report
104
+
105
+ # Analytics dashboard
106
+ python -m crackerjack --analytics
107
+
108
+ # Benchmark performance
109
+ python -m crackerjack --benchmark
110
+ ```
111
+
112
+ ### Development Modes
113
+
114
+ ```bash
115
+ # Fast iteration (skip comprehensive hooks)
116
+ python -m crackerjack --fast-iteration
117
+
118
+ # Run specific tool only
119
+ python -m crackerjack --tool ruff
120
+
121
+ # Changed files only
122
+ python -m crackerjack --changed-only
123
+
124
+ # Debug mode
125
+ python -m crackerjack --debug --verbose
126
+ ```
127
+
128
+ ## Option Processing
129
+
130
+ ### Option Validation
131
+
132
+ The `Options` Pydantic model provides type-safe option parsing with validation:
133
+
134
+ ```python
135
+ from crackerjack.cli.options import Options, BumpOption
136
+
137
+ # Parse and validate options
138
+ options = Options(run_tests=True, ai_fix=True, test_workers=4, publish=BumpOption.patch)
139
+ ```
140
+
141
+ ### Bump Options
142
+
143
+ Versioning options with enum validation:
144
+
145
+ - **patch**: 1.0.0 → 1.0.1 (bug fixes)
146
+ - **minor**: 1.0.0 → 1.1.0 (new features)
147
+ - **major**: 1.0.0 → 2.0.0 (breaking changes)
148
+ - **interactive**: Guided version selection
149
+ - **auto**: AI-powered version recommendation
150
+
151
+ ### Test Workers
152
+
153
+ Parallel test execution configuration:
154
+
155
+ ```bash
156
+ --test-workers 0 # Auto-detect (default, recommended)
157
+ --test-workers 4 # Explicit worker count
158
+ --test-workers 1 # Sequential execution (debugging)
159
+ --test-workers -2 # Fractional (half cores)
160
+ ```
161
+
162
+ ## Handler Architecture
163
+
164
+ ### Protocol-Based Dependency Injection
165
+
166
+ Most handlers use ACB dependency injection (90% compliance):
167
+
168
+ ```python
169
+ from acb.depends import depends, Inject
170
+ from crackerjack.models.protocols import Console, CrackerjackCache
171
+
172
+
173
+ @depends.inject
174
+ def handle_quality_check(
175
+ console: Inject[Console] = None,
176
+ cache: Inject[CrackerjackCache] = None,
177
+ ) -> None:
178
+ console.print("[green]Running quality checks...[/green]")
179
+ # ... handler logic
180
+ ```
181
+
182
+ ### Handler Routing
183
+
184
+ Handlers are organized by feature domain for maintainability:
185
+
186
+ ```python
187
+ # Main quality workflows
188
+ from crackerjack.cli.handlers.main_handlers import (
189
+ handle_fast_hooks,
190
+ handle_comprehensive_hooks,
191
+ handle_tests,
192
+ )
193
+
194
+ # Analytics and reporting
195
+ from crackerjack.cli.handlers.analytics import (
196
+ handle_coverage_report,
197
+ handle_analytics_dashboard,
198
+ )
199
+
200
+ # MCP server management
201
+ from crackerjack.cli.handlers.monitoring import (
202
+ handle_start_mcp_server,
203
+ handle_watchdog,
204
+ )
205
+ ```
206
+
207
+ ## Interactive Mode
208
+
209
+ Guided workflows with prompts and validation:
210
+
211
+ ```bash
212
+ python -m crackerjack --interactive
213
+ ```
214
+
215
+ **Features:**
216
+
217
+ - Step-by-step guidance
218
+ - Option validation with helpful errors
219
+ - Confirmation prompts for destructive actions
220
+ - Progress indicators for long operations
221
+
222
+ ## Facade Pattern
223
+
224
+ The `CrackerjackCLIFacade` provides simplified command routing:
225
+
226
+ ```python
227
+ from crackerjack.cli.facade import CrackerjackCLIFacade
228
+
229
+ facade = CrackerjackCLIFacade()
230
+ result = await facade.run_quality_workflow(fast=True, ai_fix=True, verbose=True)
231
+ ```
232
+
233
+ **Note:** Facade needs DI integration (currently manual instantiation).
234
+
235
+ ## Usage Examples
236
+
237
+ ### Adding a New CLI Option
238
+
239
+ ```python
240
+ # 1. Add to Options model (options.py)
241
+ class Options(BaseModel):
242
+ my_new_option: bool = False
243
+
244
+
245
+ # 2. Add Click/Typer parameter (__main__.py)
246
+ @click.option("--my-new-option", is_flag=True, help="Enable new feature")
247
+ # 3. Create handler (handlers/my_feature.py)
248
+ @depends.inject
249
+ def handle_my_feature(console: Inject[Console] = None) -> None:
250
+ console.print("[cyan]Running new feature...[/cyan]")
251
+
252
+
253
+ # 4. Route in main (__main__.py)
254
+ if options.my_new_option:
255
+ handle_my_feature()
256
+ ```
257
+
258
+ ### Adding a New Handler Module
259
+
260
+ ```python
261
+ # handlers/my_handlers.py
262
+ from acb.depends import depends, Inject
263
+ from crackerjack.models.protocols import Console
264
+
265
+
266
+ @depends.inject
267
+ async def handle_my_command(
268
+ arg1: str,
269
+ console: Inject[Console] = None,
270
+ ) -> bool:
271
+ """Handler for my custom command."""
272
+ console.print(f"Processing: {arg1}")
273
+ # ... implementation
274
+ return True
275
+ ```
276
+
277
+ ## Best Practices
278
+
279
+ 1. **Use Protocol-Based DI**: Import from `models/protocols.py`, not concrete classes
280
+ 1. **Validate Options Early**: Use Pydantic validators in the `Options` model
281
+ 1. **Keep Handlers Focused**: Single responsibility per handler
282
+ 1. **Provide User Feedback**: Use rich console for progress and status
283
+ 1. **Handle Errors Gracefully**: Catch exceptions and provide helpful error messages
284
+ 1. **Support --verbose**: Add verbose logging for troubleshooting
285
+ 1. **Document Options**: Clear help text for all CLI options
286
+ 1. **Test Interactive Flows**: Verify prompts and validation work correctly
287
+
288
+ ## Anti-Patterns to Avoid
289
+
290
+ ```python
291
+ # ❌ Direct console instantiation
292
+ from rich.console import Console
293
+ console = Console()
294
+
295
+ # ✅ Use dependency injection
296
+ @depends.inject
297
+ def handler(console: Inject[Console] = None):
298
+ console.print("...")
299
+
300
+
301
+ # ❌ Complex logic in option parsing
302
+ @click.option("--complex")
303
+ def command(complex):
304
+ if complex:
305
+ # 50 lines of logic here
306
+
307
+ # ✅ Delegate to handlers
308
+ @click.option("--complex")
309
+ def command(complex):
310
+ if complex:
311
+ handle_complex_workflow()
312
+
313
+
314
+ # ❌ Silent failures
315
+ def handler():
316
+ try:
317
+ risky_operation()
318
+ except Exception:
319
+ pass # Don't do this!
320
+
321
+ # ✅ Inform the user
322
+ def handler():
323
+ try:
324
+ risky_operation()
325
+ except Exception as e:
326
+ console.print(f"[red]Error: {e}[/red]")
327
+ raise
328
+ ```
329
+
330
+ ## Configuration
331
+
332
+ CLI behavior can be customized via `settings/crackerjack.yaml`:
333
+
334
+ ```yaml
335
+ # CLI defaults
336
+ verbose: false
337
+ interactive: false
338
+ test_workers: 0 # Auto-detect
339
+ debug: false
340
+ ai_debug: false
341
+
342
+ # Feature flags
343
+ experimental_hooks: false
344
+ async_mode: true
345
+ ```
346
+
347
+ ## Troubleshooting
348
+
349
+ ### Option Parsing Issues
350
+
351
+ ```bash
352
+ # Enable debug mode for detailed output
353
+ python -m crackerjack --debug --verbose
354
+
355
+ # Check option values
356
+ python -m crackerjack --help
357
+ ```
358
+
359
+ ### Handler Failures
360
+
361
+ ```bash
362
+ # Use verbose mode for detailed logs
363
+ python -m crackerjack --verbose --run-tests
364
+
365
+ # Enable AI debugging for agent issues
366
+ python -m crackerjack --ai-debug --ai-fix
367
+ ```
368
+
369
+ ### Test Worker Configuration
370
+
371
+ ```bash
372
+ # Sequential execution for debugging flaky tests
373
+ python -m crackerjack --run-tests --test-workers 1
374
+
375
+ # Disable auto-detection globally
376
+ export CRACKERJACK_DISABLE_AUTO_WORKERS=1
377
+ ```
378
+
379
+ ## Related
380
+
381
+ - [Managers](<../managers/README.md>) — Backend managers called by CLI handlers
382
+ - [Orchestration](<../orchestration/README.md>) — Workflow orchestration layer
383
+ - [Options](<./options.py>) — Full list of CLI options
384
+ - [Main README](<../../README.md>) — Command examples and workflows
385
+ - [CLAUDE.md](../../docs/guides/CLAUDE.md) — Essential commands reference
386
+
387
+ ## Future Enhancements
388
+
389
+ - [ ] Complete DI integration for CrackerjackCLIFacade
390
+ - [ ] Plugin system for custom commands
391
+ - [ ] Command auto-completion (shell integration)
392
+ - [ ] Configuration profiles (dev, ci, production)
393
+ - [ ] Command aliasing and shortcuts
394
+ - [ ] Enhanced interactive mode with TUI
@@ -7,7 +7,7 @@ from .handlers import (
7
7
  setup_ai_agent_env,
8
8
  )
9
9
  from .options import CLI_OPTIONS, BumpOption, Options, create_options
10
- from .utils import get_package_version
10
+ from .version import get_package_version
11
11
 
12
12
  __all__ = [
13
13
  "CLI_OPTIONS",
@@ -1,6 +1,7 @@
1
1
  import typing as t
2
2
 
3
- from rich.console import Console
3
+ from acb.console import Console
4
+ from acb.depends import Inject, depends
4
5
  from rich.panel import Panel
5
6
  from rich.table import Table
6
7
  from rich.text import Text
@@ -8,7 +9,8 @@ from rich.text import Text
8
9
  from crackerjack.services.cache import CrackerjackCache
9
10
 
10
11
 
11
- def handle_clear_cache(console: Console) -> None:
12
+ @depends.inject # type: ignore[misc]
13
+ def handle_clear_cache(console: Inject[Console]) -> None:
12
14
  """Clear all caches and display results."""
13
15
  try:
14
16
  cache = CrackerjackCache()
@@ -16,9 +18,7 @@ def handle_clear_cache(console: Console) -> None:
16
18
  # Clear memory caches and get cleanup stats
17
19
  cleanup_results = cache.cleanup_all()
18
20
 
19
- # Clear disk cache completely
20
- if cache.enable_disk_cache and cache.cache_dir:
21
- cache.disk_cache.clear()
21
+ # Note:CrackerjackCache uses memory-only caching (no disk cache to clear)
22
22
 
23
23
  # Calculate total items cleared
24
24
  total_cleared = sum(cleanup_results.values())
@@ -37,14 +37,15 @@ def handle_clear_cache(console: Console) -> None:
37
37
  table.add_row("Total", str(total_cleared), style="bold green")
38
38
 
39
39
  console.print()
40
- console.print(table)
40
+ console.print(Panel(table, title="Cache Cleared", border_style="green"))
41
41
  console.print(f"\n✅ Successfully cleared {total_cleared} cache entries")
42
42
 
43
43
  except Exception as e:
44
44
  console.print(f"\n❌ Error clearing cache: {e}", style="bold red")
45
45
 
46
46
 
47
- def handle_cache_stats(console: Console) -> None:
47
+ @depends.inject # type: ignore[misc]
48
+ def handle_cache_stats(console: Inject[Console]) -> None:
48
49
  """Display detailed cache statistics."""
49
50
  try:
50
51
  cache = CrackerjackCache()
@@ -55,10 +56,10 @@ def handle_cache_stats(console: Console) -> None:
55
56
  _add_cache_totals_row(main_table, totals)
56
57
 
57
58
  console.print()
58
- console.print(main_table)
59
+ console.print(Panel(main_table, border_style="blue"))
59
60
 
60
- _display_performance_insights(console, totals)
61
- _display_cache_directory_info(console, cache)
61
+ _display_performance_insights(totals)
62
+ _display_cache_directory_info(cache)
62
63
 
63
64
  except Exception as e:
64
65
  console.print(f"\n❌ Error retrieving cache stats: {e}", style="bold red")
@@ -134,7 +135,10 @@ def _add_cache_totals_row(table: Table, totals: dict[str, t.Any]) -> None:
134
135
  )
135
136
 
136
137
 
137
- def _display_performance_insights(console: Console, totals: dict[str, t.Any]) -> None:
138
+ @depends.inject # type: ignore[misc]
139
+ def _display_performance_insights(
140
+ totals: dict[str, t.Any], console: Inject[Console]
141
+ ) -> None:
138
142
  """Display performance insights panel based on cache statistics."""
139
143
  overall_hit_rate = (
140
144
  (totals["hits"] / (totals["hits"] + totals["misses"]) * 100)
@@ -175,30 +179,31 @@ def _generate_performance_insights(hit_rate: float, total_size: float) -> list[s
175
179
  return insights
176
180
 
177
181
 
178
- def _display_cache_directory_info(console: Console, cache: CrackerjackCache) -> None:
182
+ @depends.inject # type: ignore[misc]
183
+ def _display_cache_directory_info(
184
+ cache: CrackerjackCache, console: Inject[Console]
185
+ ) -> None:
179
186
  """Display cache directory information."""
180
187
  if not (cache.enable_disk_cache and cache.cache_dir):
181
188
  return
182
189
 
183
190
  cache_dir_info = f"📁 Cache Directory: {cache.cache_dir}"
184
191
  if cache.cache_dir.exists():
185
- disk_files = len(list[t.Any](cache.cache_dir.rglob("*.cache")))
192
+ disk_files = len(list(cache.cache_dir.rglob("*.cache")))
186
193
  cache_dir_info += f" ({disk_files} files)"
187
194
 
188
195
  console.print()
189
196
  console.print(cache_dir_info)
190
197
 
191
198
 
192
- def _handle_cache_commands(
193
- clear_cache: bool, cache_stats: bool, console: Console
194
- ) -> bool:
199
+ def _handle_cache_commands(clear_cache: bool, cache_stats: bool) -> bool:
195
200
  """Handle cache management commands. Returns True if a cache command was executed."""
196
201
  if clear_cache:
197
- handle_clear_cache(console)
202
+ handle_clear_cache()
198
203
  return True
199
204
 
200
205
  if cache_stats:
201
- handle_cache_stats(console)
206
+ handle_cache_stats()
202
207
  return True
203
208
 
204
209
  return False
@@ -61,12 +61,9 @@ class EnhancedCacheHandlers:
61
61
  pre_clear_stats = self.cache.get_cache_stats()
62
62
 
63
63
  # Clear memory caches and get cleanup stats
64
+ # Note: cleanup_all() already handles all cache types (memory + disk)
64
65
  cleanup_results = self.cache.cleanup_all()
65
66
 
66
- # Clear disk cache completely
67
- if self.cache.enable_disk_cache and self.cache.cache_dir:
68
- self.cache.disk_cache.clear()
69
-
70
67
  # Calculate total items cleared
71
68
  total_cleared = sum(cleanup_results.values())
72
69
 
crackerjack/cli/facade.py CHANGED
@@ -1,11 +1,74 @@
1
1
  import asyncio
2
+ import shlex
2
3
  from pathlib import Path
3
4
 
4
- from rich.console import Console
5
+ from acb.console import Console
6
+ from acb.depends import depends
5
7
 
6
8
  from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
7
9
  from crackerjack.models.protocols import OptionsProtocol
8
10
 
11
+ # Valid semantic commands for crackerjack operations
12
+ VALID_COMMANDS = {"test", "lint", "check", "format", "security", "complexity", "all"}
13
+
14
+
15
+ def validate_command(
16
+ command: str | None, args: str | None = None
17
+ ) -> tuple[str, list[str]]:
18
+ """Validate command and detect common misuse patterns.
19
+
20
+ Args:
21
+ command: Semantic command name (test, lint, check, etc.)
22
+ args: Additional arguments as a string
23
+
24
+ Returns:
25
+ Tuple of (validated_command, cleaned_args_list)
26
+
27
+ Raises:
28
+ ValueError: If command is invalid or misused
29
+
30
+ Examples:
31
+ >>> validate_command("test", "")
32
+ ("test", [])
33
+ >>> validate_command("check", "--verbose")
34
+ ("check", ["--verbose"])
35
+ >>> validate_command("--ai-fix", "-t")
36
+ Traceback (most recent call last):
37
+ ...
38
+ ValueError: Invalid command: '--ai-fix'...
39
+ """
40
+ # CRITICAL: Check for None command first
41
+ if command is None:
42
+ raise ValueError("Command cannot be None")
43
+
44
+ # Detect if user put flags in command parameter
45
+ if command.startswith("--") or command.startswith("-"):
46
+ raise ValueError(
47
+ f"Invalid command: {command!r}\n"
48
+ f"Commands should be semantic (e.g., 'test', 'lint', 'check')\n"
49
+ f"Use ai_agent_mode=True parameter for auto-fix, not --ai-fix in command"
50
+ )
51
+
52
+ # Validate against known semantic commands
53
+ if command not in VALID_COMMANDS:
54
+ raise ValueError(
55
+ f"Unknown command: {command!r}\n"
56
+ f"Valid commands: {', '.join(sorted(VALID_COMMANDS))}"
57
+ )
58
+
59
+ # Parse args and detect --ai-fix misuse
60
+ # Handle None gracefully by converting to empty string
61
+ args_str = args if args is not None else ""
62
+ # Use shlex.split for proper shell argument parsing (handles quotes)
63
+ parsed_args = shlex.split(args_str) if args_str else []
64
+ if "--ai-fix" in parsed_args:
65
+ raise ValueError(
66
+ "Do not pass --ai-fix in args parameter\n"
67
+ "Use ai_agent_mode=True parameter instead"
68
+ )
69
+
70
+ return command, parsed_args
71
+
9
72
 
10
73
  class CrackerjackCLIFacade:
11
74
  def __init__(
@@ -13,10 +76,9 @@ class CrackerjackCLIFacade:
13
76
  console: Console | None = None,
14
77
  pkg_path: Path | None = None,
15
78
  ) -> None:
16
- self.console = console or Console(force_terminal=True)
79
+ self.console = console or depends.get_sync(Console)
17
80
  self.pkg_path = pkg_path or Path.cwd()
18
81
  self.orchestrator = WorkflowOrchestrator(
19
- console=self.console,
20
82
  pkg_path=self.pkg_path,
21
83
  )
22
84
 
@@ -49,15 +111,15 @@ class CrackerjackCLIFacade:
49
111
  def _should_handle_special_mode(self, options: OptionsProtocol) -> bool:
50
112
  return (
51
113
  getattr(options, "start_mcp_server", False)
52
- or getattr(options, "enterprise_batch", False)
114
+ or getattr(options, "advanced_batch", False)
53
115
  or getattr(options, "monitor_dashboard", False)
54
116
  )
55
117
 
56
118
  def _handle_special_modes(self, options: OptionsProtocol) -> None:
57
119
  if getattr(options, "start_mcp_server", False):
58
120
  self._start_mcp_server()
59
- elif getattr(options, "enterprise_batch", False):
60
- self._handle_enterprise_batch(options)
121
+ elif getattr(options, "advanced_batch", False):
122
+ self._handle_advanced_batch(options)
61
123
  elif getattr(options, "monitor_dashboard", False):
62
124
  self._handle_monitor_dashboard(options)
63
125
 
@@ -79,9 +141,9 @@ class CrackerjackCLIFacade:
79
141
  self.console.print(f"[red]❌ Failed to start MCP server: {e}[/ red]")
80
142
  raise SystemExit(1)
81
143
 
82
- def _handle_enterprise_batch(self, options: OptionsProtocol) -> None:
144
+ def _handle_advanced_batch(self, options: OptionsProtocol) -> None:
83
145
  self.console.print(
84
- "[red]❌ Enterprise batch processing is not yet implemented[/ red]"
146
+ "[red]❌ Advanced batch processing is not yet implemented[/ red]"
85
147
  )
86
148
  raise SystemExit(1)
87
149
 
@@ -0,0 +1,13 @@
1
+ from __future__ import annotations
2
+
3
+ from crackerjack.config import get_console_width
4
+
5
+
6
+ def separator(char: str = "-", width: int | None = None) -> str:
7
+ """Return a horizontal separator string.
8
+
9
+ - char: the character to repeat (default '-')
10
+ - width: explicit width; if None, uses configured console width
11
+ """
12
+ w = width if isinstance(width, int) and width > 0 else get_console_width()
13
+ return char * w