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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +96 -2
  3. crackerjack/__main__.py +637 -138
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +39 -0
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/lsp/_base.py +194 -0
  27. crackerjack/adapters/lsp/_client.py +358 -0
  28. crackerjack/adapters/lsp/_manager.py +193 -0
  29. crackerjack/adapters/lsp/skylos.py +283 -0
  30. crackerjack/adapters/lsp/zuban.py +557 -0
  31. crackerjack/adapters/refactor/README.md +59 -0
  32. crackerjack/adapters/refactor/__init__.py +12 -0
  33. crackerjack/adapters/refactor/creosote.py +318 -0
  34. crackerjack/adapters/refactor/refurb.py +406 -0
  35. crackerjack/adapters/refactor/skylos.py +494 -0
  36. crackerjack/adapters/sast/README.md +132 -0
  37. crackerjack/adapters/sast/__init__.py +32 -0
  38. crackerjack/adapters/sast/_base.py +201 -0
  39. crackerjack/adapters/sast/bandit.py +423 -0
  40. crackerjack/adapters/sast/pyscn.py +405 -0
  41. crackerjack/adapters/sast/semgrep.py +241 -0
  42. crackerjack/adapters/security/README.md +111 -0
  43. crackerjack/adapters/security/__init__.py +17 -0
  44. crackerjack/adapters/security/gitleaks.py +339 -0
  45. crackerjack/adapters/type/README.md +52 -0
  46. crackerjack/adapters/type/__init__.py +12 -0
  47. crackerjack/adapters/type/pyrefly.py +402 -0
  48. crackerjack/adapters/type/ty.py +402 -0
  49. crackerjack/adapters/type/zuban.py +522 -0
  50. crackerjack/adapters/utility/README.md +51 -0
  51. crackerjack/adapters/utility/__init__.py +10 -0
  52. crackerjack/adapters/utility/checks.py +884 -0
  53. crackerjack/agents/README.md +264 -0
  54. crackerjack/agents/__init__.py +66 -0
  55. crackerjack/agents/architect_agent.py +238 -0
  56. crackerjack/agents/base.py +167 -0
  57. crackerjack/agents/claude_code_bridge.py +641 -0
  58. crackerjack/agents/coordinator.py +600 -0
  59. crackerjack/agents/documentation_agent.py +520 -0
  60. crackerjack/agents/dry_agent.py +585 -0
  61. crackerjack/agents/enhanced_coordinator.py +279 -0
  62. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  63. crackerjack/agents/error_middleware.py +53 -0
  64. crackerjack/agents/formatting_agent.py +230 -0
  65. crackerjack/agents/helpers/__init__.py +9 -0
  66. crackerjack/agents/helpers/performance/__init__.py +22 -0
  67. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  68. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  69. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  70. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  71. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  72. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  73. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  74. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  75. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  76. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  77. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  78. crackerjack/agents/import_optimization_agent.py +1181 -0
  79. crackerjack/agents/performance_agent.py +325 -0
  80. crackerjack/agents/performance_helpers.py +205 -0
  81. crackerjack/agents/proactive_agent.py +55 -0
  82. crackerjack/agents/refactoring_agent.py +511 -0
  83. crackerjack/agents/refactoring_helpers.py +247 -0
  84. crackerjack/agents/security_agent.py +793 -0
  85. crackerjack/agents/semantic_agent.py +479 -0
  86. crackerjack/agents/semantic_helpers.py +356 -0
  87. crackerjack/agents/test_creation_agent.py +570 -0
  88. crackerjack/agents/test_specialist_agent.py +526 -0
  89. crackerjack/agents/tracker.py +110 -0
  90. crackerjack/api.py +647 -0
  91. crackerjack/cli/README.md +394 -0
  92. crackerjack/cli/__init__.py +24 -0
  93. crackerjack/cli/cache_handlers.py +209 -0
  94. crackerjack/cli/cache_handlers_enhanced.py +680 -0
  95. crackerjack/cli/facade.py +162 -0
  96. crackerjack/cli/formatting.py +13 -0
  97. crackerjack/cli/handlers/__init__.py +85 -0
  98. crackerjack/cli/handlers/advanced.py +103 -0
  99. crackerjack/cli/handlers/ai_features.py +62 -0
  100. crackerjack/cli/handlers/analytics.py +479 -0
  101. crackerjack/cli/handlers/changelog.py +271 -0
  102. crackerjack/cli/handlers/config_handlers.py +16 -0
  103. crackerjack/cli/handlers/coverage.py +84 -0
  104. crackerjack/cli/handlers/documentation.py +280 -0
  105. crackerjack/cli/handlers/main_handlers.py +497 -0
  106. crackerjack/cli/handlers/monitoring.py +371 -0
  107. crackerjack/cli/handlers.py +700 -0
  108. crackerjack/cli/interactive.py +488 -0
  109. crackerjack/cli/options.py +1216 -0
  110. crackerjack/cli/semantic_handlers.py +292 -0
  111. crackerjack/cli/utils.py +19 -0
  112. crackerjack/cli/version.py +19 -0
  113. crackerjack/code_cleaner.py +1307 -0
  114. crackerjack/config/README.md +472 -0
  115. crackerjack/config/__init__.py +275 -0
  116. crackerjack/config/global_lock_config.py +207 -0
  117. crackerjack/config/hooks.py +390 -0
  118. crackerjack/config/loader.py +239 -0
  119. crackerjack/config/settings.py +141 -0
  120. crackerjack/config/tool_commands.py +331 -0
  121. crackerjack/core/README.md +393 -0
  122. crackerjack/core/__init__.py +0 -0
  123. crackerjack/core/async_workflow_orchestrator.py +738 -0
  124. crackerjack/core/autofix_coordinator.py +282 -0
  125. crackerjack/core/container.py +105 -0
  126. crackerjack/core/enhanced_container.py +583 -0
  127. crackerjack/core/file_lifecycle.py +472 -0
  128. crackerjack/core/performance.py +244 -0
  129. crackerjack/core/performance_monitor.py +357 -0
  130. crackerjack/core/phase_coordinator.py +1227 -0
  131. crackerjack/core/proactive_workflow.py +267 -0
  132. crackerjack/core/resource_manager.py +425 -0
  133. crackerjack/core/retry.py +275 -0
  134. crackerjack/core/service_watchdog.py +601 -0
  135. crackerjack/core/session_coordinator.py +239 -0
  136. crackerjack/core/timeout_manager.py +563 -0
  137. crackerjack/core/websocket_lifecycle.py +410 -0
  138. crackerjack/core/workflow/__init__.py +21 -0
  139. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  140. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  141. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  142. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  143. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  144. crackerjack/core/workflow_orchestrator.py +2243 -0
  145. crackerjack/data/README.md +11 -0
  146. crackerjack/data/__init__.py +8 -0
  147. crackerjack/data/models.py +79 -0
  148. crackerjack/data/repository.py +210 -0
  149. crackerjack/decorators/README.md +180 -0
  150. crackerjack/decorators/__init__.py +35 -0
  151. crackerjack/decorators/error_handling.py +649 -0
  152. crackerjack/decorators/error_handling_decorators.py +334 -0
  153. crackerjack/decorators/helpers.py +58 -0
  154. crackerjack/decorators/patterns.py +281 -0
  155. crackerjack/decorators/utils.py +58 -0
  156. crackerjack/docs/INDEX.md +11 -0
  157. crackerjack/docs/README.md +11 -0
  158. crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
  159. crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
  160. crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
  161. crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
  162. crackerjack/docs/generated/api/SERVICES.md +1252 -0
  163. crackerjack/documentation/README.md +11 -0
  164. crackerjack/documentation/__init__.py +31 -0
  165. crackerjack/documentation/ai_templates.py +756 -0
  166. crackerjack/documentation/dual_output_generator.py +767 -0
  167. crackerjack/documentation/mkdocs_integration.py +518 -0
  168. crackerjack/documentation/reference_generator.py +1065 -0
  169. crackerjack/dynamic_config.py +678 -0
  170. crackerjack/errors.py +378 -0
  171. crackerjack/events/README.md +11 -0
  172. crackerjack/events/__init__.py +16 -0
  173. crackerjack/events/telemetry.py +175 -0
  174. crackerjack/events/workflow_bus.py +346 -0
  175. crackerjack/exceptions/README.md +301 -0
  176. crackerjack/exceptions/__init__.py +5 -0
  177. crackerjack/exceptions/config.py +4 -0
  178. crackerjack/exceptions/tool_execution_error.py +245 -0
  179. crackerjack/executors/README.md +591 -0
  180. crackerjack/executors/__init__.py +13 -0
  181. crackerjack/executors/async_hook_executor.py +938 -0
  182. crackerjack/executors/cached_hook_executor.py +316 -0
  183. crackerjack/executors/hook_executor.py +1295 -0
  184. crackerjack/executors/hook_lock_manager.py +708 -0
  185. crackerjack/executors/individual_hook_executor.py +739 -0
  186. crackerjack/executors/lsp_aware_hook_executor.py +349 -0
  187. crackerjack/executors/progress_hook_executor.py +282 -0
  188. crackerjack/executors/tool_proxy.py +433 -0
  189. crackerjack/hooks/README.md +485 -0
  190. crackerjack/hooks/lsp_hook.py +93 -0
  191. crackerjack/intelligence/README.md +557 -0
  192. crackerjack/intelligence/__init__.py +37 -0
  193. crackerjack/intelligence/adaptive_learning.py +693 -0
  194. crackerjack/intelligence/agent_orchestrator.py +485 -0
  195. crackerjack/intelligence/agent_registry.py +377 -0
  196. crackerjack/intelligence/agent_selector.py +439 -0
  197. crackerjack/intelligence/integration.py +250 -0
  198. crackerjack/interactive.py +719 -0
  199. crackerjack/managers/README.md +369 -0
  200. crackerjack/managers/__init__.py +11 -0
  201. crackerjack/managers/async_hook_manager.py +135 -0
  202. crackerjack/managers/hook_manager.py +585 -0
  203. crackerjack/managers/publish_manager.py +631 -0
  204. crackerjack/managers/test_command_builder.py +391 -0
  205. crackerjack/managers/test_executor.py +474 -0
  206. crackerjack/managers/test_manager.py +1357 -0
  207. crackerjack/managers/test_progress.py +187 -0
  208. crackerjack/mcp/README.md +374 -0
  209. crackerjack/mcp/__init__.py +0 -0
  210. crackerjack/mcp/cache.py +352 -0
  211. crackerjack/mcp/client_runner.py +121 -0
  212. crackerjack/mcp/context.py +802 -0
  213. crackerjack/mcp/dashboard.py +657 -0
  214. crackerjack/mcp/enhanced_progress_monitor.py +493 -0
  215. crackerjack/mcp/file_monitor.py +394 -0
  216. crackerjack/mcp/progress_components.py +607 -0
  217. crackerjack/mcp/progress_monitor.py +1016 -0
  218. crackerjack/mcp/rate_limiter.py +336 -0
  219. crackerjack/mcp/server.py +24 -0
  220. crackerjack/mcp/server_core.py +526 -0
  221. crackerjack/mcp/service_watchdog.py +505 -0
  222. crackerjack/mcp/state.py +407 -0
  223. crackerjack/mcp/task_manager.py +259 -0
  224. crackerjack/mcp/tools/README.md +27 -0
  225. crackerjack/mcp/tools/__init__.py +19 -0
  226. crackerjack/mcp/tools/core_tools.py +469 -0
  227. crackerjack/mcp/tools/error_analyzer.py +283 -0
  228. crackerjack/mcp/tools/execution_tools.py +384 -0
  229. crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
  230. crackerjack/mcp/tools/intelligence_tools.py +264 -0
  231. crackerjack/mcp/tools/monitoring_tools.py +628 -0
  232. crackerjack/mcp/tools/proactive_tools.py +367 -0
  233. crackerjack/mcp/tools/progress_tools.py +222 -0
  234. crackerjack/mcp/tools/semantic_tools.py +584 -0
  235. crackerjack/mcp/tools/utility_tools.py +358 -0
  236. crackerjack/mcp/tools/workflow_executor.py +699 -0
  237. crackerjack/mcp/websocket/README.md +31 -0
  238. crackerjack/mcp/websocket/__init__.py +14 -0
  239. crackerjack/mcp/websocket/app.py +54 -0
  240. crackerjack/mcp/websocket/endpoints.py +492 -0
  241. crackerjack/mcp/websocket/event_bridge.py +188 -0
  242. crackerjack/mcp/websocket/jobs.py +406 -0
  243. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  244. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  245. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  246. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  247. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  248. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  249. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  250. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  251. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  252. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  253. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  254. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  255. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  256. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  257. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  258. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  259. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  260. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  261. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  262. crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
  263. crackerjack/mcp/websocket/server.py +174 -0
  264. crackerjack/mcp/websocket/websocket_handler.py +276 -0
  265. crackerjack/mcp/websocket_server.py +10 -0
  266. crackerjack/models/README.md +308 -0
  267. crackerjack/models/__init__.py +40 -0
  268. crackerjack/models/config.py +730 -0
  269. crackerjack/models/config_adapter.py +265 -0
  270. crackerjack/models/protocols.py +1535 -0
  271. crackerjack/models/pydantic_models.py +320 -0
  272. crackerjack/models/qa_config.py +145 -0
  273. crackerjack/models/qa_results.py +134 -0
  274. crackerjack/models/resource_protocols.py +299 -0
  275. crackerjack/models/results.py +35 -0
  276. crackerjack/models/semantic_models.py +258 -0
  277. crackerjack/models/task.py +173 -0
  278. crackerjack/models/test_models.py +60 -0
  279. crackerjack/monitoring/README.md +11 -0
  280. crackerjack/monitoring/__init__.py +0 -0
  281. crackerjack/monitoring/ai_agent_watchdog.py +405 -0
  282. crackerjack/monitoring/metrics_collector.py +427 -0
  283. crackerjack/monitoring/regression_prevention.py +580 -0
  284. crackerjack/monitoring/websocket_server.py +406 -0
  285. crackerjack/orchestration/README.md +340 -0
  286. crackerjack/orchestration/__init__.py +43 -0
  287. crackerjack/orchestration/advanced_orchestrator.py +894 -0
  288. crackerjack/orchestration/cache/README.md +312 -0
  289. crackerjack/orchestration/cache/__init__.py +37 -0
  290. crackerjack/orchestration/cache/memory_cache.py +338 -0
  291. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  292. crackerjack/orchestration/config.py +297 -0
  293. crackerjack/orchestration/coverage_improvement.py +180 -0
  294. crackerjack/orchestration/execution_strategies.py +361 -0
  295. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  296. crackerjack/orchestration/strategies/README.md +401 -0
  297. crackerjack/orchestration/strategies/__init__.py +39 -0
  298. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  299. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  300. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  301. crackerjack/orchestration/test_progress_streamer.py +647 -0
  302. crackerjack/plugins/README.md +11 -0
  303. crackerjack/plugins/__init__.py +15 -0
  304. crackerjack/plugins/base.py +200 -0
  305. crackerjack/plugins/hooks.py +254 -0
  306. crackerjack/plugins/loader.py +335 -0
  307. crackerjack/plugins/managers.py +264 -0
  308. crackerjack/py313.py +191 -0
  309. crackerjack/security/README.md +11 -0
  310. crackerjack/security/__init__.py +0 -0
  311. crackerjack/security/audit.py +197 -0
  312. crackerjack/services/README.md +374 -0
  313. crackerjack/services/__init__.py +9 -0
  314. crackerjack/services/ai/README.md +295 -0
  315. crackerjack/services/ai/__init__.py +7 -0
  316. crackerjack/services/ai/advanced_optimizer.py +878 -0
  317. crackerjack/services/ai/contextual_ai_assistant.py +542 -0
  318. crackerjack/services/ai/embeddings.py +444 -0
  319. crackerjack/services/ai/intelligent_commit.py +328 -0
  320. crackerjack/services/ai/predictive_analytics.py +510 -0
  321. crackerjack/services/anomaly_detector.py +392 -0
  322. crackerjack/services/api_extractor.py +617 -0
  323. crackerjack/services/backup_service.py +467 -0
  324. crackerjack/services/bounded_status_operations.py +530 -0
  325. crackerjack/services/cache.py +369 -0
  326. crackerjack/services/changelog_automation.py +399 -0
  327. crackerjack/services/command_execution_service.py +305 -0
  328. crackerjack/services/config_integrity.py +132 -0
  329. crackerjack/services/config_merge.py +546 -0
  330. crackerjack/services/config_service.py +198 -0
  331. crackerjack/services/config_template.py +493 -0
  332. crackerjack/services/coverage_badge_service.py +173 -0
  333. crackerjack/services/coverage_ratchet.py +381 -0
  334. crackerjack/services/debug.py +733 -0
  335. crackerjack/services/dependency_analyzer.py +460 -0
  336. crackerjack/services/dependency_monitor.py +622 -0
  337. crackerjack/services/documentation_generator.py +493 -0
  338. crackerjack/services/documentation_service.py +704 -0
  339. crackerjack/services/enhanced_filesystem.py +497 -0
  340. crackerjack/services/enterprise_optimizer.py +865 -0
  341. crackerjack/services/error_pattern_analyzer.py +676 -0
  342. crackerjack/services/file_filter.py +221 -0
  343. crackerjack/services/file_hasher.py +149 -0
  344. crackerjack/services/file_io_service.py +361 -0
  345. crackerjack/services/file_modifier.py +615 -0
  346. crackerjack/services/filesystem.py +381 -0
  347. crackerjack/services/git.py +422 -0
  348. crackerjack/services/health_metrics.py +615 -0
  349. crackerjack/services/heatmap_generator.py +744 -0
  350. crackerjack/services/incremental_executor.py +380 -0
  351. crackerjack/services/initialization.py +823 -0
  352. crackerjack/services/input_validator.py +668 -0
  353. crackerjack/services/intelligent_commit.py +327 -0
  354. crackerjack/services/log_manager.py +289 -0
  355. crackerjack/services/logging.py +228 -0
  356. crackerjack/services/lsp_client.py +628 -0
  357. crackerjack/services/memory_optimizer.py +414 -0
  358. crackerjack/services/metrics.py +587 -0
  359. crackerjack/services/monitoring/README.md +30 -0
  360. crackerjack/services/monitoring/__init__.py +9 -0
  361. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  362. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  363. crackerjack/services/monitoring/health_metrics.py +716 -0
  364. crackerjack/services/monitoring/metrics.py +587 -0
  365. crackerjack/services/monitoring/performance_benchmarks.py +410 -0
  366. crackerjack/services/monitoring/performance_cache.py +388 -0
  367. crackerjack/services/monitoring/performance_monitor.py +569 -0
  368. crackerjack/services/parallel_executor.py +527 -0
  369. crackerjack/services/pattern_cache.py +333 -0
  370. crackerjack/services/pattern_detector.py +478 -0
  371. crackerjack/services/patterns/__init__.py +142 -0
  372. crackerjack/services/patterns/agents.py +107 -0
  373. crackerjack/services/patterns/code/__init__.py +15 -0
  374. crackerjack/services/patterns/code/detection.py +118 -0
  375. crackerjack/services/patterns/code/imports.py +107 -0
  376. crackerjack/services/patterns/code/paths.py +159 -0
  377. crackerjack/services/patterns/code/performance.py +119 -0
  378. crackerjack/services/patterns/code/replacement.py +36 -0
  379. crackerjack/services/patterns/core.py +212 -0
  380. crackerjack/services/patterns/documentation/__init__.py +14 -0
  381. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  382. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  383. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  384. crackerjack/services/patterns/formatting.py +226 -0
  385. crackerjack/services/patterns/operations.py +339 -0
  386. crackerjack/services/patterns/security/__init__.py +23 -0
  387. crackerjack/services/patterns/security/code_injection.py +122 -0
  388. crackerjack/services/patterns/security/credentials.py +190 -0
  389. crackerjack/services/patterns/security/path_traversal.py +221 -0
  390. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  391. crackerjack/services/patterns/templates.py +62 -0
  392. crackerjack/services/patterns/testing/__init__.py +18 -0
  393. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  394. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  395. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  396. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  397. crackerjack/services/patterns/tool_output/other.py +97 -0
  398. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  399. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  400. crackerjack/services/patterns/url_sanitization.py +114 -0
  401. crackerjack/services/patterns/utilities.py +42 -0
  402. crackerjack/services/patterns/utils.py +339 -0
  403. crackerjack/services/patterns/validation.py +46 -0
  404. crackerjack/services/patterns/versioning.py +62 -0
  405. crackerjack/services/predictive_analytics.py +523 -0
  406. crackerjack/services/profiler.py +280 -0
  407. crackerjack/services/quality/README.md +415 -0
  408. crackerjack/services/quality/__init__.py +11 -0
  409. crackerjack/services/quality/anomaly_detector.py +392 -0
  410. crackerjack/services/quality/pattern_cache.py +333 -0
  411. crackerjack/services/quality/pattern_detector.py +479 -0
  412. crackerjack/services/quality/qa_orchestrator.py +491 -0
  413. crackerjack/services/quality/quality_baseline.py +395 -0
  414. crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
  415. crackerjack/services/quality/quality_intelligence.py +949 -0
  416. crackerjack/services/regex_patterns.py +58 -0
  417. crackerjack/services/regex_utils.py +483 -0
  418. crackerjack/services/secure_path_utils.py +524 -0
  419. crackerjack/services/secure_status_formatter.py +450 -0
  420. crackerjack/services/secure_subprocess.py +635 -0
  421. crackerjack/services/security.py +239 -0
  422. crackerjack/services/security_logger.py +495 -0
  423. crackerjack/services/server_manager.py +411 -0
  424. crackerjack/services/smart_scheduling.py +167 -0
  425. crackerjack/services/status_authentication.py +460 -0
  426. crackerjack/services/status_security_manager.py +315 -0
  427. crackerjack/services/terminal_utils.py +0 -0
  428. crackerjack/services/thread_safe_status_collector.py +441 -0
  429. crackerjack/services/tool_filter.py +368 -0
  430. crackerjack/services/tool_version_service.py +43 -0
  431. crackerjack/services/unified_config.py +115 -0
  432. crackerjack/services/validation_rate_limiter.py +220 -0
  433. crackerjack/services/vector_store.py +689 -0
  434. crackerjack/services/version_analyzer.py +461 -0
  435. crackerjack/services/version_checker.py +223 -0
  436. crackerjack/services/websocket_resource_limiter.py +438 -0
  437. crackerjack/services/zuban_lsp_service.py +391 -0
  438. crackerjack/slash_commands/README.md +11 -0
  439. crackerjack/slash_commands/__init__.py +59 -0
  440. crackerjack/slash_commands/init.md +112 -0
  441. crackerjack/slash_commands/run.md +197 -0
  442. crackerjack/slash_commands/status.md +127 -0
  443. crackerjack/tools/README.md +11 -0
  444. crackerjack/tools/__init__.py +30 -0
  445. crackerjack/tools/_git_utils.py +105 -0
  446. crackerjack/tools/check_added_large_files.py +139 -0
  447. crackerjack/tools/check_ast.py +105 -0
  448. crackerjack/tools/check_json.py +103 -0
  449. crackerjack/tools/check_jsonschema.py +297 -0
  450. crackerjack/tools/check_toml.py +103 -0
  451. crackerjack/tools/check_yaml.py +110 -0
  452. crackerjack/tools/codespell_wrapper.py +72 -0
  453. crackerjack/tools/end_of_file_fixer.py +202 -0
  454. crackerjack/tools/format_json.py +128 -0
  455. crackerjack/tools/mdformat_wrapper.py +114 -0
  456. crackerjack/tools/trailing_whitespace.py +198 -0
  457. crackerjack/tools/validate_input_validator_patterns.py +236 -0
  458. crackerjack/tools/validate_regex_patterns.py +188 -0
  459. crackerjack/ui/README.md +11 -0
  460. crackerjack/ui/__init__.py +1 -0
  461. crackerjack/ui/dashboard_renderer.py +28 -0
  462. crackerjack/ui/templates/README.md +11 -0
  463. crackerjack/utils/console_utils.py +13 -0
  464. crackerjack/utils/dependency_guard.py +230 -0
  465. crackerjack/utils/retry_utils.py +275 -0
  466. crackerjack/workflows/README.md +590 -0
  467. crackerjack/workflows/__init__.py +46 -0
  468. crackerjack/workflows/actions.py +811 -0
  469. crackerjack/workflows/auto_fix.py +444 -0
  470. crackerjack/workflows/container_builder.py +499 -0
  471. crackerjack/workflows/definitions.py +443 -0
  472. crackerjack/workflows/engine.py +177 -0
  473. crackerjack/workflows/event_bridge.py +242 -0
  474. crackerjack-0.45.2.dist-info/METADATA +1678 -0
  475. crackerjack-0.45.2.dist-info/RECORD +478 -0
  476. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  477. crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
  478. crackerjack/.gitignore +0 -14
  479. crackerjack/.libcst.codemod.yaml +0 -18
  480. crackerjack/.pdm.toml +0 -1
  481. crackerjack/.pre-commit-config.yaml +0 -91
  482. crackerjack/.pytest_cache/.gitignore +0 -2
  483. crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
  484. crackerjack/.pytest_cache/README.md +0 -8
  485. crackerjack/.pytest_cache/v/cache/nodeids +0 -1
  486. crackerjack/.pytest_cache/v/cache/stepwise +0 -1
  487. crackerjack/.ruff_cache/.gitignore +0 -1
  488. crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
  489. crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
  490. crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
  491. crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
  492. crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
  493. crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
  494. crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
  495. crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
  496. crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
  497. crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
  498. crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
  499. crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
  500. crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
  501. crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
  502. crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
  503. crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
  504. crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
  505. crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
  506. crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
  507. crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
  508. crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
  509. crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
  510. crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
  511. crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
  512. crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
  513. crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
  514. crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
  515. crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
  516. crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
  517. crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
  518. crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
  519. crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
  520. crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
  521. crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
  522. crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
  523. crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
  524. crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
  525. crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
  526. crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
  527. crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
  528. crackerjack/crackerjack.py +0 -855
  529. crackerjack/pyproject.toml +0 -214
  530. crackerjack-0.18.2.dist-info/METADATA +0 -420
  531. crackerjack-0.18.2.dist-info/RECORD +0 -59
  532. crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
  533. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
crackerjack/__main__.py CHANGED
@@ -1,158 +1,657 @@
1
- from enum import Enum
1
+ """Crackerjack - Opinionated Python project management tool.
2
2
 
3
- import typer
4
- from pydantic import BaseModel, field_validator
5
- from rich.console import Console
6
- from crackerjack import create_crackerjack_runner
3
+ Early initialization: Configure logging before ACB imports to suppress startup messages.
4
+ """
7
5
 
8
- console = Console(force_terminal=True)
9
- app = typer.Typer(
10
- help="Crackerjack: Your Python project setup and style enforcement tool."
6
+ import logging
7
+ import sys
8
+ import typing as t
9
+ import warnings
10
+ from contextlib import suppress
11
+
12
+ # CRITICAL: Suppress ACB logger startup messages BEFORE any ACB imports
13
+ # ACB's logger initializes at import time and emits "Application started" messages.
14
+ # Configure Python's logging module early to intercept these messages.
15
+ _EARLY_DEBUG_MODE = any(
16
+ arg in ("--debug", "-d", "--ai-debug") or arg.startswith("--debug=")
17
+ for arg in sys.argv[1:]
11
18
  )
19
+ _EARLY_VERBOSE_MODE = any(
20
+ arg in ("--verbose", "-v") or arg.startswith("--verbose=") for arg in sys.argv[1:]
21
+ )
22
+ # Check if help is requested to suppress ACB startup messages completely
23
+ _EARLY_HELP_MODE = any(
24
+ arg in ("--help", "-h") or arg.startswith("--help=") for arg in sys.argv[1:]
25
+ )
26
+
12
27
 
28
+ def _configure_structlog_for_level(log_level: int) -> None:
29
+ """Configure structlog with appropriate filtering for the given log level."""
30
+ with suppress(ImportError):
31
+ import structlog
13
32
 
14
- class BumpOption(str, Enum):
15
- micro = "micro"
16
- minor = "minor"
17
- major = "major"
18
-
19
- def __str__(self) -> str:
20
- return self.value
21
-
22
-
23
- class Options(BaseModel):
24
- commit: bool = False
25
- interactive: bool = False
26
- doc: bool = False
27
- no_config_updates: bool = False
28
- publish: BumpOption | None = None
29
- bump: BumpOption | None = None
30
- verbose: bool = False
31
- update_precommit: bool = False
32
- clean: bool = False
33
- test: bool = False
34
- all: BumpOption | None = None
35
- ai_agent: bool = False
36
- create_pr: bool = False
37
- skip_hooks: bool = False
38
-
39
- @classmethod
40
- @field_validator("publish", "bump", mode="before")
41
- def validate_bump_options(cls, value: str | None) -> BumpOption | None:
42
- if value is None:
43
- return None
44
- try:
45
- return BumpOption(value.lower())
46
- except ValueError:
47
- valid_options = ", ".join([o.value for o in BumpOption])
48
- raise ValueError(
49
- f"Invalid bump option: {value}. Must be one of: {valid_options}"
33
+ if log_level == logging.DEBUG:
34
+ # In debug mode, show all messages
35
+ structlog.configure(
36
+ processors=[
37
+ structlog.stdlib.add_log_level,
38
+ structlog.stdlib.PositionalArgumentsFormatter(),
39
+ structlog.processors.TimeStamper(fmt="iso"),
40
+ structlog.processors.StackInfoRenderer(),
41
+ structlog.processors.format_exc_info,
42
+ structlog.processors.UnicodeDecoder(),
43
+ structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
44
+ ],
45
+ logger_factory=structlog.stdlib.LoggerFactory(),
46
+ wrapper_class=structlog.stdlib.BoundLogger,
47
+ cache_logger_on_first_use=True,
50
48
  )
49
+ elif log_level == logging.ERROR:
50
+ # In verbose mode, show only ERROR and above
51
+ structlog.configure(
52
+ processors=[
53
+ structlog.stdlib.add_log_level,
54
+ structlog.processors.TimeStamper(fmt="iso"),
55
+ structlog.processors.UnicodeDecoder(),
56
+ structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
57
+ ],
58
+ logger_factory=structlog.stdlib.LoggerFactory(),
59
+ wrapper_class=structlog.make_filtering_bound_logger(logging.ERROR),
60
+ cache_logger_on_first_use=True,
61
+ )
62
+ else: # CRITICAL level or other suppressive levels
63
+ # In normal mode, suppress all output
64
+ def dummy_processor(logger, method_name, event_dict):
65
+ """Dummy processor that returns the event dict unchanged without additional processing."""
66
+ return event_dict
67
+
68
+ structlog.configure(
69
+ processors=[dummy_processor],
70
+ logger_factory=structlog.testing.CapturingLoggerFactory(),
71
+ wrapper_class=structlog.make_filtering_bound_logger(logging.CRITICAL),
72
+ cache_logger_on_first_use=True,
73
+ )
74
+
75
+
76
+ if not _EARLY_DEBUG_MODE:
77
+ if _EARLY_HELP_MODE:
78
+ # In help mode, completely suppress ACB startup logging for clean UX
79
+ acb_logger = logging.getLogger("acb")
80
+ acb_logger.setLevel(logging.CRITICAL)
81
+ acb_logger.propagate = False
51
82
 
83
+ # Also suppress subloggers like acb.adapters.logger, acb.workflows, etc.
84
+ logging.getLogger("acb.adapters").setLevel(logging.CRITICAL)
85
+ logging.getLogger("acb.workflows").setLevel(logging.CRITICAL)
86
+ logging.getLogger("acb.console").setLevel(logging.CRITICAL)
87
+ logging.getLogger("crackerjack.core").setLevel(logging.CRITICAL)
88
+ # Specifically target the loggers that were appearing in the output
89
+ logging.getLogger("acb.adapters.logger").setLevel(logging.CRITICAL)
90
+ logging.getLogger("acb.workflows.engine").setLevel(logging.CRITICAL)
52
91
 
53
- cli_options = {
54
- "commit": typer.Option(False, "-c", "--commit", help="Commit changes to Git."),
55
- "interactive": typer.Option(
56
- False, "-i", "--interactive", help="Run pre-commit hooks interactively."
57
- ),
58
- "doc": typer.Option(False, "-d", "--doc", help="Generate documentation."),
59
- "no_config_updates": typer.Option(
60
- False, "-n", "--no-config-updates", help="Do not update configuration files."
61
- ),
62
- "update_precommit": typer.Option(
63
- False, "-u", "--update-precommit", help="Update pre-commit hooks."
64
- ),
65
- "verbose": typer.Option(False, "-v", "--verbose", help="Enable verbose output."),
66
- "publish": typer.Option(
67
- None,
68
- "-p",
69
- "--publish",
70
- help="Bump version and publish to PyPI (micro, minor, major).",
71
- case_sensitive=False,
72
- ),
73
- "bump": typer.Option(
74
- None,
75
- "-b",
76
- "--bump",
77
- help="Bump version (micro, minor, major).",
78
- case_sensitive=False,
79
- ),
80
- "clean": typer.Option(
81
- False,
82
- "-x",
83
- "--clean",
84
- help="Remove docstrings, line comments, and unnecessary whitespace.",
85
- ),
86
- "test": typer.Option(False, "-t", "--test", help="Run tests."),
87
- "skip_hooks": typer.Option(
88
- False,
89
- "-s",
90
- "--skip-hooks",
91
- help="Skip running pre-commit hooks (useful with -t).",
92
- ),
93
- "all": typer.Option(
94
- None,
95
- "-a",
96
- "--all",
97
- help="Run with `-x -t -p <micro|minor|major> -c` development options).",
98
- case_sensitive=False,
99
- ),
100
- "create_pr": typer.Option(
101
- False,
102
- "-r",
103
- "--pr",
104
- help="Create a pull request to the upstream repository.",
105
- ),
106
- "ai_agent": typer.Option(
107
- False,
108
- "--ai-agent",
109
- help="Enable AI agent mode with structured output.",
110
- hidden=True,
111
- ),
112
- }
92
+ # Configure structlog to suppress output in help mode
93
+ _configure_structlog_for_level(logging.CRITICAL)
94
+ elif not _EARLY_VERBOSE_MODE:
95
+ # In non-debug and non-verbose mode, suppress ACB startup logging for clean default UX
96
+ acb_logger = logging.getLogger("acb")
97
+ acb_logger.setLevel(logging.CRITICAL)
98
+ acb_logger.propagate = False
99
+
100
+ # Also suppress subloggers like acb.adapters.logger, acb.workflows, etc.
101
+ logging.getLogger("acb.adapters").setLevel(logging.CRITICAL)
102
+ logging.getLogger("acb.workflows").setLevel(logging.CRITICAL)
103
+ logging.getLogger("acb.console").setLevel(logging.CRITICAL)
104
+ logging.getLogger("crackerjack.core").setLevel(logging.CRITICAL)
105
+ # Specifically target the loggers that were appearing in the output
106
+ logging.getLogger("acb.adapters.logger").setLevel(logging.CRITICAL)
107
+ logging.getLogger("acb.workflows.engine").setLevel(logging.CRITICAL)
108
+
109
+ # Configure structlog to suppress output in normal mode
110
+ _configure_structlog_for_level(logging.CRITICAL)
111
+ else:
112
+ # In verbose mode but not debug, set to ERROR level to reduce noise but still show important errors
113
+ logging.getLogger("acb").setLevel(logging.ERROR)
114
+ logging.getLogger("crackerjack.core").setLevel(logging.ERROR)
115
+ # Specifically target the loggers that were appearing in the output
116
+ logging.getLogger("acb.adapters.logger").setLevel(logging.ERROR)
117
+ logging.getLogger("acb.workflows.engine").setLevel(logging.ERROR)
118
+
119
+ # Configure structlog to show only ERROR and above in verbose mode
120
+ _configure_structlog_for_level(logging.ERROR)
121
+
122
+ # NOW safe to import ACB-dependent modules
123
+ import typer
124
+ from acb.console import Console
125
+ from acb.depends import Inject, depends
126
+
127
+ # Suppress asyncio subprocess cleanup warnings when event loop closes
128
+ # This is a known Python issue - the subprocesses are properly cleaned up,
129
+ # but the warning appears when the event loop closes with pending subprocess handlers
130
+ warnings.filterwarnings(
131
+ "ignore",
132
+ message=".*loop.*closed.*",
133
+ category=RuntimeWarning,
134
+ )
135
+
136
+ if t.TYPE_CHECKING:
137
+ pass
138
+
139
+
140
+ from .cli import (
141
+ CLI_OPTIONS,
142
+ BumpOption,
143
+ create_options,
144
+ handle_interactive_mode,
145
+ handle_standard_mode,
146
+ setup_ai_agent_env,
147
+ )
148
+ from .cli.cache_handlers import _handle_cache_commands
149
+ from .cli.handlers import (
150
+ handle_config_updates,
151
+ )
152
+ from .cli.handlers.advanced import (
153
+ handle_advanced_optimizer,
154
+ )
155
+ from .cli.handlers.ai_features import handle_contextual_ai
156
+ from .cli.handlers.analytics import (
157
+ handle_anomaly_detection,
158
+ handle_heatmap_generation,
159
+ handle_predictive_analytics,
160
+ )
161
+ from .cli.handlers.changelog import (
162
+ handle_changelog_commands,
163
+ handle_version_analysis,
164
+ setup_debug_and_verbose_flags,
165
+ )
166
+ from .cli.handlers.coverage import (
167
+ handle_coverage_status,
168
+ )
169
+ from .cli.handlers.documentation import (
170
+ handle_documentation_commands,
171
+ handle_mkdocs_integration,
172
+ )
173
+ from .cli.handlers.monitoring import handle_server_commands
174
+ from .cli.semantic_handlers import (
175
+ handle_remove_from_semantic_index,
176
+ handle_semantic_index,
177
+ handle_semantic_search,
178
+ handle_semantic_stats,
179
+ )
180
+
181
+ console = Console()
182
+ app = typer.Typer(
183
+ help="Crackerjack: Your Python project setup and style enforcement tool.",
184
+ )
113
185
 
114
186
 
115
187
  @app.command()
116
188
  def main(
117
- commit: bool = cli_options["commit"],
118
- interactive: bool = cli_options["interactive"],
119
- doc: bool = cli_options["doc"],
120
- no_config_updates: bool = cli_options["no_config_updates"],
121
- update_precommit: bool = cli_options["update_precommit"],
122
- verbose: bool = cli_options["verbose"],
123
- publish: BumpOption | None = cli_options["publish"],
124
- all: BumpOption | None = cli_options["all"],
125
- bump: BumpOption | None = cli_options["bump"],
126
- clean: bool = cli_options["clean"],
127
- test: bool = cli_options["test"],
128
- skip_hooks: bool = cli_options["skip_hooks"],
129
- create_pr: bool = cli_options["create_pr"],
130
- ai_agent: bool = cli_options["ai_agent"],
189
+ commit: bool = CLI_OPTIONS["commit"],
190
+ interactive: bool = CLI_OPTIONS["interactive"],
191
+ no_config_updates: bool = CLI_OPTIONS["no_config_updates"],
192
+ update_precommit: bool = CLI_OPTIONS["update_precommit"],
193
+ verbose: bool = CLI_OPTIONS["verbose"],
194
+ debug: bool = CLI_OPTIONS["debug"],
195
+ publish: BumpOption | None = CLI_OPTIONS["publish"],
196
+ all: str | None = CLI_OPTIONS["all"],
197
+ bump: BumpOption | None = CLI_OPTIONS["bump"],
198
+ strip_code: bool = CLI_OPTIONS["strip_code"],
199
+ run_tests: bool = CLI_OPTIONS["run_tests"],
200
+ benchmark: bool = CLI_OPTIONS["benchmark"],
201
+ test_workers: int = CLI_OPTIONS["test_workers"],
202
+ test_timeout: int = CLI_OPTIONS["test_timeout"],
203
+ skip_hooks: bool = CLI_OPTIONS["skip_hooks"],
204
+ fast: bool = CLI_OPTIONS["fast"],
205
+ comp: bool = CLI_OPTIONS["comp"],
206
+ fast_iteration: bool = CLI_OPTIONS["fast_iteration"],
207
+ tool: str | None = CLI_OPTIONS["tool"],
208
+ changed_only: bool = CLI_OPTIONS["changed_only"],
209
+ all_files: bool = CLI_OPTIONS["all_files"],
210
+ create_pr: bool = CLI_OPTIONS["create_pr"],
211
+ ai_fix: bool = CLI_OPTIONS["ai_fix"],
212
+ start_mcp_server: bool = CLI_OPTIONS["start_mcp_server"],
213
+ stop_mcp_server: bool = CLI_OPTIONS["stop_mcp_server"],
214
+ restart_mcp_server: bool = CLI_OPTIONS["restart_mcp_server"],
215
+ async_mode: bool = CLI_OPTIONS["async_mode"],
216
+ experimental_hooks: bool = CLI_OPTIONS["experimental_hooks"],
217
+ enable_pyrefly: bool = CLI_OPTIONS["enable_pyrefly"],
218
+ enable_ty: bool = CLI_OPTIONS["enable_ty"],
219
+ no_git_tags: bool = CLI_OPTIONS["no_git_tags"],
220
+ skip_version_check: bool = CLI_OPTIONS["skip_version_check"],
221
+ start_websocket_server: bool = CLI_OPTIONS["start_websocket_server"],
222
+ stop_websocket_server: bool = CLI_OPTIONS["stop_websocket_server"],
223
+ restart_websocket_server: bool = CLI_OPTIONS["restart_websocket_server"],
224
+ websocket_port: int | None = CLI_OPTIONS["websocket_port"],
225
+ start_zuban_lsp: bool = CLI_OPTIONS["start_zuban_lsp"],
226
+ stop_zuban_lsp: bool = CLI_OPTIONS["stop_zuban_lsp"],
227
+ restart_zuban_lsp: bool = CLI_OPTIONS["restart_zuban_lsp"],
228
+ no_zuban_lsp: bool = CLI_OPTIONS["no_zuban_lsp"],
229
+ zuban_lsp_port: int = CLI_OPTIONS["zuban_lsp_port"],
230
+ zuban_lsp_mode: str = CLI_OPTIONS["zuban_lsp_mode"],
231
+ zuban_lsp_timeout: int = CLI_OPTIONS["zuban_lsp_timeout"],
232
+ enable_lsp_hooks: bool = CLI_OPTIONS["enable_lsp_hooks"],
233
+ watchdog: bool = CLI_OPTIONS["watchdog"],
234
+ monitor: bool = CLI_OPTIONS["monitor"],
235
+ enhanced_monitor: bool = CLI_OPTIONS["enhanced_monitor"],
236
+ ai_debug: bool = CLI_OPTIONS["ai_debug"],
237
+ job_id: str | None = CLI_OPTIONS["job_id"],
238
+ orchestrated: bool = CLI_OPTIONS["orchestrated"],
239
+ orchestration_strategy: str = CLI_OPTIONS["orchestration_strategy"],
240
+ orchestration_progress: str = CLI_OPTIONS["orchestration_progress"],
241
+ orchestration_ai_mode: str = CLI_OPTIONS["orchestration_ai_mode"],
242
+ dev: bool = CLI_OPTIONS["dev"],
243
+ dashboard: bool = CLI_OPTIONS["dashboard"],
244
+ unified_dashboard: bool = CLI_OPTIONS["unified_dashboard"],
245
+ unified_dashboard_port: int | None = CLI_OPTIONS["unified_dashboard_port"],
246
+ max_iterations: int = CLI_OPTIONS["max_iterations"],
247
+ coverage_status: bool = CLI_OPTIONS["coverage_status"],
248
+ coverage_goal: float | None = CLI_OPTIONS["coverage_goal"],
249
+ no_coverage_ratchet: bool = CLI_OPTIONS["no_coverage_ratchet"],
250
+ boost_coverage: bool = CLI_OPTIONS["boost_coverage"],
251
+ disable_global_locks: bool = CLI_OPTIONS["disable_global_locks"],
252
+ global_lock_timeout: int = CLI_OPTIONS["global_lock_timeout"],
253
+ global_lock_cleanup: bool = CLI_OPTIONS["global_lock_cleanup"],
254
+ global_lock_dir: str | None = CLI_OPTIONS["global_lock_dir"],
255
+ quick: bool = CLI_OPTIONS["quick"],
256
+ thorough: bool = CLI_OPTIONS["thorough"],
257
+ clear_cache: bool = CLI_OPTIONS["clear_cache"],
258
+ cache_stats: bool = CLI_OPTIONS["cache_stats"],
259
+ generate_docs: bool = CLI_OPTIONS["generate_docs"],
260
+ docs_format: str = CLI_OPTIONS["docs_format"],
261
+ validate_docs: bool = CLI_OPTIONS["validate_docs"],
262
+ generate_changelog: bool = CLI_OPTIONS["generate_changelog"],
263
+ changelog_version: str | None = CLI_OPTIONS["changelog_version"],
264
+ changelog_since: str | None = CLI_OPTIONS["changelog_since"],
265
+ changelog_dry_run: bool = CLI_OPTIONS["changelog_dry_run"],
266
+ auto_version: bool = CLI_OPTIONS["auto_version"],
267
+ version_since: str | None = CLI_OPTIONS["version_since"],
268
+ accept_version: bool = CLI_OPTIONS["accept_version"],
269
+ smart_commit: bool = CLI_OPTIONS["smart_commit"],
270
+ heatmap: bool = CLI_OPTIONS["heatmap"],
271
+ heatmap_type: str = CLI_OPTIONS["heatmap_type"],
272
+ heatmap_output: str | None = CLI_OPTIONS["heatmap_output"],
273
+ anomaly_detection: bool = CLI_OPTIONS["anomaly_detection"],
274
+ anomaly_sensitivity: float = CLI_OPTIONS["anomaly_sensitivity"],
275
+ anomaly_report: str | None = CLI_OPTIONS["anomaly_report"],
276
+ predictive_analytics: bool = CLI_OPTIONS["predictive_analytics"],
277
+ prediction_periods: int = CLI_OPTIONS["prediction_periods"],
278
+ analytics_dashboard: str | None = CLI_OPTIONS["analytics_dashboard"],
279
+ advanced_optimizer: bool = CLI_OPTIONS["advanced_optimizer"],
280
+ advanced_profile: str | None = CLI_OPTIONS["advanced_profile"],
281
+ advanced_report: str | None = CLI_OPTIONS["advanced_report"],
282
+ mkdocs_integration: bool = CLI_OPTIONS["mkdocs_integration"],
283
+ mkdocs_serve: bool = CLI_OPTIONS["mkdocs_serve"],
284
+ mkdocs_theme: str = CLI_OPTIONS["mkdocs_theme"],
285
+ mkdocs_output: str | None = CLI_OPTIONS["mkdocs_output"],
286
+ contextual_ai: bool = CLI_OPTIONS["contextual_ai"],
287
+ ai_recommendations: int = CLI_OPTIONS["ai_recommendations"],
288
+ ai_help_query: str | None = CLI_OPTIONS["ai_help_query"],
289
+ check_config_updates: bool = CLI_OPTIONS["check_config_updates"],
290
+ apply_config_updates: bool = CLI_OPTIONS["apply_config_updates"],
291
+ diff_config: str | None = CLI_OPTIONS["diff_config"],
292
+ config_interactive: bool = CLI_OPTIONS["config_interactive"],
293
+ refresh_cache: bool = CLI_OPTIONS["refresh_cache"],
294
+ use_acb_workflows: bool = CLI_OPTIONS["use_acb_workflows"],
295
+ use_legacy_orchestrator: bool = CLI_OPTIONS["use_legacy_orchestrator"],
296
+ index: str | None = CLI_OPTIONS["index"],
297
+ search: str | None = CLI_OPTIONS["search"],
298
+ semantic_stats: bool = CLI_OPTIONS["semantic_stats"],
299
+ remove_from_index: str | None = CLI_OPTIONS["remove_from_index"],
131
300
  ) -> None:
132
- options = Options(
133
- commit=commit,
134
- interactive=interactive,
135
- doc=doc,
136
- no_config_updates=no_config_updates,
137
- update_precommit=update_precommit,
138
- verbose=verbose,
139
- publish=publish,
140
- bump=bump,
141
- clean=clean,
142
- test=test,
143
- skip_hooks=skip_hooks,
144
- all=all,
145
- ai_agent=ai_agent,
146
- create_pr=create_pr,
301
+ from acb.depends import depends
302
+
303
+ from crackerjack import __version__
304
+ from crackerjack.config import register_services
305
+ from crackerjack.config.loader import load_settings
306
+ from crackerjack.config.settings import CrackerjackSettings
307
+
308
+ settings = load_settings(CrackerjackSettings)
309
+ depends.set(CrackerjackSettings, settings)
310
+
311
+ register_services()
312
+
313
+ # Print version on startup
314
+ console.print(f"[cyan]Crackerjack[/cyan] [dim]v{__version__}[/dim]")
315
+
316
+ # Ensure logging levels are properly set after services are registered
317
+ _configure_logging_for_execution(debug or ai_debug or ai_fix, verbose)
318
+
319
+ options = create_options(
320
+ commit,
321
+ interactive,
322
+ no_config_updates,
323
+ update_precommit,
324
+ verbose,
325
+ debug,
326
+ publish,
327
+ bump,
328
+ benchmark,
329
+ test_workers,
330
+ test_timeout,
331
+ skip_hooks,
332
+ fast,
333
+ comp,
334
+ fast_iteration,
335
+ tool,
336
+ changed_only,
337
+ all_files,
338
+ create_pr,
339
+ async_mode,
340
+ experimental_hooks,
341
+ enable_pyrefly,
342
+ enable_ty,
343
+ start_zuban_lsp,
344
+ stop_zuban_lsp,
345
+ restart_zuban_lsp,
346
+ no_zuban_lsp,
347
+ zuban_lsp_port,
348
+ zuban_lsp_mode,
349
+ zuban_lsp_timeout,
350
+ enable_lsp_hooks,
351
+ no_git_tags,
352
+ skip_version_check,
353
+ orchestrated,
354
+ orchestration_strategy,
355
+ orchestration_progress,
356
+ orchestration_ai_mode,
357
+ dev,
358
+ dashboard,
359
+ unified_dashboard,
360
+ unified_dashboard_port,
361
+ max_iterations,
362
+ coverage_status,
363
+ coverage_goal,
364
+ no_coverage_ratchet,
365
+ boost_coverage,
366
+ disable_global_locks,
367
+ global_lock_timeout,
368
+ global_lock_cleanup,
369
+ global_lock_dir,
370
+ quick,
371
+ thorough,
372
+ clear_cache,
373
+ cache_stats,
374
+ generate_docs,
375
+ docs_format,
376
+ validate_docs,
377
+ generate_changelog,
378
+ changelog_version,
379
+ changelog_since,
380
+ changelog_dry_run,
381
+ auto_version,
382
+ version_since,
383
+ accept_version,
384
+ smart_commit,
385
+ heatmap,
386
+ heatmap_type,
387
+ heatmap_output,
388
+ anomaly_detection,
389
+ anomaly_sensitivity,
390
+ anomaly_report,
391
+ predictive_analytics,
392
+ prediction_periods,
393
+ analytics_dashboard,
394
+ advanced_optimizer,
395
+ advanced_profile,
396
+ advanced_report,
397
+ mkdocs_integration,
398
+ mkdocs_serve,
399
+ mkdocs_theme,
400
+ mkdocs_output,
401
+ contextual_ai,
402
+ ai_recommendations,
403
+ ai_help_query,
404
+ check_config_updates,
405
+ apply_config_updates,
406
+ diff_config,
407
+ config_interactive,
408
+ refresh_cache,
409
+ use_acb_workflows,
410
+ use_legacy_orchestrator,
411
+ run_tests=run_tests,
412
+ )
413
+
414
+ options.index = index
415
+ options.search = search
416
+ options.semantic_stats = semantic_stats
417
+ options.remove_from_index = remove_from_index
418
+
419
+ ai_fix, verbose = setup_debug_and_verbose_flags(
420
+ ai_fix, ai_debug, debug, verbose, options
147
421
  )
422
+ setup_ai_agent_env(ai_fix, ai_debug or debug)
148
423
 
149
- if ai_agent:
150
- import os
424
+ if not _process_all_commands(locals(), options):
425
+ return
151
426
 
152
- os.environ["AI_AGENT"] = "1"
427
+ if interactive:
428
+ handle_interactive_mode(options)
429
+ else:
430
+ handle_standard_mode(options, async_mode, job_id, orchestrated)
153
431
 
154
- runner = create_crackerjack_runner(console=console)
155
- runner.process(options)
432
+
433
+ def _process_all_commands(local_vars: t.Any, options: t.Any) -> bool:
434
+ if _handle_cache_commands(local_vars["clear_cache"], local_vars["cache_stats"]):
435
+ return False
436
+
437
+ if (
438
+ local_vars["check_config_updates"]
439
+ or local_vars["apply_config_updates"]
440
+ or local_vars["diff_config"]
441
+ or local_vars["refresh_cache"]
442
+ ):
443
+ handle_config_updates(options)
444
+ return False
445
+
446
+ if not _handle_semantic_commands(
447
+ local_vars["index"],
448
+ local_vars["search"],
449
+ local_vars["semantic_stats"],
450
+ local_vars["remove_from_index"],
451
+ options,
452
+ ):
453
+ return False
454
+
455
+ if handle_server_commands(
456
+ local_vars["monitor"],
457
+ local_vars["enhanced_monitor"],
458
+ local_vars["dashboard"],
459
+ local_vars["unified_dashboard"],
460
+ local_vars["unified_dashboard_port"],
461
+ local_vars["watchdog"],
462
+ local_vars["start_websocket_server"],
463
+ local_vars["stop_websocket_server"],
464
+ local_vars["restart_websocket_server"],
465
+ local_vars["start_mcp_server"],
466
+ local_vars["stop_mcp_server"],
467
+ local_vars["restart_mcp_server"],
468
+ local_vars["websocket_port"],
469
+ local_vars["start_zuban_lsp"],
470
+ local_vars["stop_zuban_lsp"],
471
+ local_vars["restart_zuban_lsp"],
472
+ local_vars["zuban_lsp_port"],
473
+ local_vars["zuban_lsp_mode"],
474
+ local_vars["dev"],
475
+ ):
476
+ return False
477
+
478
+ if not handle_coverage_status(local_vars["coverage_status"], options):
479
+ return False
480
+
481
+ return _handle_analysis_commands(local_vars, options)
482
+
483
+
484
+ def _handle_analysis_commands(local_vars: t.Any, options: t.Any) -> bool:
485
+ if not handle_documentation_commands(
486
+ local_vars["generate_docs"], local_vars["validate_docs"], options
487
+ ):
488
+ return False
489
+
490
+ if not handle_changelog_commands(
491
+ local_vars["generate_changelog"],
492
+ local_vars["changelog_dry_run"],
493
+ local_vars["changelog_version"],
494
+ local_vars["changelog_since"],
495
+ options,
496
+ ):
497
+ return False
498
+
499
+ if not handle_version_analysis(
500
+ local_vars["auto_version"],
501
+ local_vars["version_since"],
502
+ local_vars["accept_version"],
503
+ options,
504
+ ):
505
+ return False
506
+
507
+ return _handle_specialized_analytics(local_vars)
508
+
509
+
510
+ def _handle_specialized_analytics(local_vars: t.Any) -> bool:
511
+ if not handle_heatmap_generation(
512
+ local_vars["heatmap"], local_vars["heatmap_type"], local_vars["heatmap_output"]
513
+ ):
514
+ return False
515
+
516
+ if not handle_anomaly_detection(
517
+ local_vars["anomaly_detection"],
518
+ local_vars["anomaly_sensitivity"],
519
+ local_vars["anomaly_report"],
520
+ ):
521
+ return False
522
+
523
+ if not handle_predictive_analytics(
524
+ local_vars["predictive_analytics"],
525
+ local_vars["prediction_periods"],
526
+ local_vars["analytics_dashboard"],
527
+ ):
528
+ return False
529
+
530
+ return _handle_advanced_features(local_vars)
531
+
532
+
533
+ @depends.inject # type: ignore[misc]
534
+ def _handle_semantic_commands(
535
+ index: str | None,
536
+ search: str | None,
537
+ semantic_stats: bool,
538
+ remove_from_index: str | None,
539
+ options: t.Any,
540
+ console: Inject[Console],
541
+ ) -> bool:
542
+ if not _has_semantic_operations(index, search, semantic_stats, remove_from_index):
543
+ return True
544
+
545
+ console.print("[cyan]🔍[/cyan] Running semantic search operations...")
546
+
547
+ try:
548
+ _execute_semantic_operations(index, search, semantic_stats, remove_from_index)
549
+ return False
550
+
551
+ except Exception as e:
552
+ console.print(f"[red]❌[/red] Semantic search error: {e}")
553
+ return False
554
+
555
+
556
+ def _has_semantic_operations(
557
+ index: str | None,
558
+ search: str | None,
559
+ semantic_stats: bool,
560
+ remove_from_index: str | None,
561
+ ) -> bool:
562
+ return any([index, search, semantic_stats, remove_from_index])
563
+
564
+
565
+ def _execute_semantic_operations(
566
+ index: str | None,
567
+ search: str | None,
568
+ semantic_stats: bool,
569
+ remove_from_index: str | None,
570
+ ) -> list[str]:
571
+ if index:
572
+ handle_semantic_index(index)
573
+
574
+ if search:
575
+ handle_semantic_search(search)
576
+
577
+ if semantic_stats:
578
+ handle_semantic_stats()
579
+
580
+ if remove_from_index:
581
+ handle_remove_from_semantic_index(remove_from_index)
582
+
583
+ return []
584
+
585
+
586
+ def _handle_advanced_features(local_vars: t.Any) -> bool:
587
+ if not handle_advanced_optimizer(
588
+ local_vars["advanced_optimizer"],
589
+ local_vars["advanced_profile"],
590
+ local_vars["advanced_report"],
591
+ ):
592
+ return False
593
+
594
+ if not handle_mkdocs_integration(
595
+ local_vars["mkdocs_integration"],
596
+ local_vars["mkdocs_serve"],
597
+ local_vars["mkdocs_theme"],
598
+ local_vars["mkdocs_output"],
599
+ ):
600
+ return False
601
+
602
+ if not handle_contextual_ai(
603
+ local_vars["contextual_ai"],
604
+ local_vars["ai_recommendations"],
605
+ local_vars["ai_help_query"],
606
+ ):
607
+ return False
608
+
609
+ return True
610
+
611
+
612
+ def _configure_logging_for_execution(
613
+ debug_enabled: bool, verbose_enabled: bool = False
614
+ ) -> None:
615
+ """Configure logging levels based on debug and verbose flags during execution."""
616
+ import logging
617
+
618
+ # Determine the appropriate logging level
619
+ if debug_enabled:
620
+ # In debug mode, set to DEBUG to show all messages
621
+ logging.getLogger("acb").setLevel(logging.DEBUG)
622
+ logging.getLogger("crackerjack").setLevel(logging.DEBUG)
623
+ # Configure structlog to show all messages in debug mode
624
+ _configure_structlog_for_level(logging.DEBUG)
625
+ elif verbose_enabled:
626
+ # In verbose mode, we still want to suppress ACB logs to avoid noise
627
+ # Only show ERROR and above for ACB/core components to reduce noise
628
+ logging.getLogger("acb").setLevel(logging.ERROR)
629
+ logging.getLogger("crackerjack.core").setLevel(logging.ERROR)
630
+ # Specifically target the loggers that were appearing in the output
631
+ logging.getLogger("acb.adapters.logger").setLevel(logging.ERROR)
632
+ logging.getLogger("acb.workflows.engine").setLevel(logging.ERROR)
633
+ # Also target the structlog logger adapters specifically
634
+ logging.getLogger("acb.adapters.logger.structlog").setLevel(logging.ERROR)
635
+ # Configure structlog to minimize output in verbose mode
636
+ _configure_structlog_for_level(logging.ERROR)
637
+ else:
638
+ # In normal mode, suppress ACB and crackerjack logging for clean default UX during execution
639
+ logging.getLogger("acb").setLevel(logging.CRITICAL)
640
+ logging.getLogger("acb.adapters").setLevel(logging.CRITICAL)
641
+ logging.getLogger("acb.workflows").setLevel(logging.CRITICAL)
642
+ logging.getLogger("acb.console").setLevel(logging.CRITICAL)
643
+ logging.getLogger("crackerjack.core").setLevel(logging.CRITICAL)
644
+ # Specifically target the loggers that were appearing in the output
645
+ logging.getLogger("acb.adapters.logger").setLevel(logging.CRITICAL)
646
+ logging.getLogger("acb.workflows.engine").setLevel(logging.CRITICAL)
647
+ # Also target the structlog logger adapters specifically
648
+ logging.getLogger("acb.adapters.logger.structlog").setLevel(logging.CRITICAL)
649
+ # Configure structlog to suppress output in normal mode
650
+ _configure_structlog_for_level(logging.CRITICAL)
651
+
652
+
653
+ def cli() -> None:
654
+ app()
156
655
 
157
656
 
158
657
  if __name__ == "__main__":