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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +30 -1
  3. crackerjack/__main__.py +342 -1263
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +27 -5
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/{rust_tool_manager.py → lsp/_manager.py} +3 -3
  27. crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
  28. crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
  29. crackerjack/adapters/refactor/README.md +59 -0
  30. crackerjack/adapters/refactor/__init__.py +12 -0
  31. crackerjack/adapters/refactor/creosote.py +318 -0
  32. crackerjack/adapters/refactor/refurb.py +406 -0
  33. crackerjack/adapters/refactor/skylos.py +494 -0
  34. crackerjack/adapters/sast/README.md +132 -0
  35. crackerjack/adapters/sast/__init__.py +32 -0
  36. crackerjack/adapters/sast/_base.py +201 -0
  37. crackerjack/adapters/sast/bandit.py +423 -0
  38. crackerjack/adapters/sast/pyscn.py +405 -0
  39. crackerjack/adapters/sast/semgrep.py +241 -0
  40. crackerjack/adapters/security/README.md +111 -0
  41. crackerjack/adapters/security/__init__.py +17 -0
  42. crackerjack/adapters/security/gitleaks.py +339 -0
  43. crackerjack/adapters/type/README.md +52 -0
  44. crackerjack/adapters/type/__init__.py +12 -0
  45. crackerjack/adapters/type/pyrefly.py +402 -0
  46. crackerjack/adapters/type/ty.py +402 -0
  47. crackerjack/adapters/type/zuban.py +522 -0
  48. crackerjack/adapters/utility/README.md +51 -0
  49. crackerjack/adapters/utility/__init__.py +10 -0
  50. crackerjack/adapters/utility/checks.py +884 -0
  51. crackerjack/agents/README.md +264 -0
  52. crackerjack/agents/__init__.py +40 -12
  53. crackerjack/agents/base.py +1 -0
  54. crackerjack/agents/claude_code_bridge.py +641 -0
  55. crackerjack/agents/coordinator.py +49 -53
  56. crackerjack/agents/dry_agent.py +187 -3
  57. crackerjack/agents/enhanced_coordinator.py +279 -0
  58. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  59. crackerjack/agents/error_middleware.py +53 -0
  60. crackerjack/agents/formatting_agent.py +6 -8
  61. crackerjack/agents/helpers/__init__.py +9 -0
  62. crackerjack/agents/helpers/performance/__init__.py +22 -0
  63. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  64. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  65. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  66. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  67. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  68. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  69. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  70. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  71. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  72. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  73. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  74. crackerjack/agents/performance_agent.py +121 -1152
  75. crackerjack/agents/refactoring_agent.py +156 -655
  76. crackerjack/agents/semantic_agent.py +479 -0
  77. crackerjack/agents/semantic_helpers.py +356 -0
  78. crackerjack/agents/test_creation_agent.py +19 -1605
  79. crackerjack/api.py +5 -7
  80. crackerjack/cli/README.md +394 -0
  81. crackerjack/cli/__init__.py +1 -1
  82. crackerjack/cli/cache_handlers.py +23 -18
  83. crackerjack/cli/cache_handlers_enhanced.py +1 -4
  84. crackerjack/cli/facade.py +70 -8
  85. crackerjack/cli/formatting.py +13 -0
  86. crackerjack/cli/handlers/__init__.py +85 -0
  87. crackerjack/cli/handlers/advanced.py +103 -0
  88. crackerjack/cli/handlers/ai_features.py +62 -0
  89. crackerjack/cli/handlers/analytics.py +479 -0
  90. crackerjack/cli/handlers/changelog.py +271 -0
  91. crackerjack/cli/handlers/config_handlers.py +16 -0
  92. crackerjack/cli/handlers/coverage.py +84 -0
  93. crackerjack/cli/handlers/documentation.py +280 -0
  94. crackerjack/cli/handlers/main_handlers.py +497 -0
  95. crackerjack/cli/handlers/monitoring.py +371 -0
  96. crackerjack/cli/handlers.py +249 -49
  97. crackerjack/cli/interactive.py +8 -5
  98. crackerjack/cli/options.py +203 -110
  99. crackerjack/cli/semantic_handlers.py +292 -0
  100. crackerjack/cli/version.py +19 -0
  101. crackerjack/code_cleaner.py +60 -24
  102. crackerjack/config/README.md +472 -0
  103. crackerjack/config/__init__.py +256 -0
  104. crackerjack/config/global_lock_config.py +191 -54
  105. crackerjack/config/hooks.py +188 -16
  106. crackerjack/config/loader.py +239 -0
  107. crackerjack/config/settings.py +141 -0
  108. crackerjack/config/tool_commands.py +331 -0
  109. crackerjack/core/README.md +393 -0
  110. crackerjack/core/async_workflow_orchestrator.py +79 -53
  111. crackerjack/core/autofix_coordinator.py +22 -9
  112. crackerjack/core/container.py +10 -9
  113. crackerjack/core/enhanced_container.py +9 -9
  114. crackerjack/core/performance.py +1 -1
  115. crackerjack/core/performance_monitor.py +5 -3
  116. crackerjack/core/phase_coordinator.py +1018 -634
  117. crackerjack/core/proactive_workflow.py +3 -3
  118. crackerjack/core/retry.py +275 -0
  119. crackerjack/core/service_watchdog.py +167 -23
  120. crackerjack/core/session_coordinator.py +187 -382
  121. crackerjack/core/timeout_manager.py +161 -44
  122. crackerjack/core/workflow/__init__.py +21 -0
  123. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  124. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  125. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  126. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  127. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  128. crackerjack/core/workflow_orchestrator.py +1247 -953
  129. crackerjack/data/README.md +11 -0
  130. crackerjack/data/__init__.py +8 -0
  131. crackerjack/data/models.py +79 -0
  132. crackerjack/data/repository.py +210 -0
  133. crackerjack/decorators/README.md +180 -0
  134. crackerjack/decorators/__init__.py +35 -0
  135. crackerjack/decorators/error_handling.py +649 -0
  136. crackerjack/decorators/error_handling_decorators.py +334 -0
  137. crackerjack/decorators/helpers.py +58 -0
  138. crackerjack/decorators/patterns.py +281 -0
  139. crackerjack/decorators/utils.py +58 -0
  140. crackerjack/docs/README.md +11 -0
  141. crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
  142. crackerjack/documentation/README.md +11 -0
  143. crackerjack/documentation/ai_templates.py +1 -1
  144. crackerjack/documentation/dual_output_generator.py +11 -9
  145. crackerjack/documentation/reference_generator.py +104 -59
  146. crackerjack/dynamic_config.py +52 -61
  147. crackerjack/errors.py +1 -1
  148. crackerjack/events/README.md +11 -0
  149. crackerjack/events/__init__.py +16 -0
  150. crackerjack/events/telemetry.py +175 -0
  151. crackerjack/events/workflow_bus.py +346 -0
  152. crackerjack/exceptions/README.md +301 -0
  153. crackerjack/exceptions/__init__.py +5 -0
  154. crackerjack/exceptions/config.py +4 -0
  155. crackerjack/exceptions/tool_execution_error.py +245 -0
  156. crackerjack/executors/README.md +591 -0
  157. crackerjack/executors/__init__.py +2 -0
  158. crackerjack/executors/async_hook_executor.py +539 -77
  159. crackerjack/executors/cached_hook_executor.py +3 -3
  160. crackerjack/executors/hook_executor.py +967 -102
  161. crackerjack/executors/hook_lock_manager.py +31 -22
  162. crackerjack/executors/individual_hook_executor.py +66 -32
  163. crackerjack/executors/lsp_aware_hook_executor.py +136 -57
  164. crackerjack/executors/progress_hook_executor.py +282 -0
  165. crackerjack/executors/tool_proxy.py +23 -7
  166. crackerjack/hooks/README.md +485 -0
  167. crackerjack/hooks/lsp_hook.py +8 -9
  168. crackerjack/intelligence/README.md +557 -0
  169. crackerjack/interactive.py +37 -10
  170. crackerjack/managers/README.md +369 -0
  171. crackerjack/managers/async_hook_manager.py +41 -57
  172. crackerjack/managers/hook_manager.py +449 -79
  173. crackerjack/managers/publish_manager.py +81 -36
  174. crackerjack/managers/test_command_builder.py +290 -12
  175. crackerjack/managers/test_executor.py +93 -8
  176. crackerjack/managers/test_manager.py +1082 -75
  177. crackerjack/managers/test_progress.py +118 -26
  178. crackerjack/mcp/README.md +374 -0
  179. crackerjack/mcp/cache.py +25 -2
  180. crackerjack/mcp/client_runner.py +35 -18
  181. crackerjack/mcp/context.py +9 -9
  182. crackerjack/mcp/dashboard.py +24 -8
  183. crackerjack/mcp/enhanced_progress_monitor.py +34 -23
  184. crackerjack/mcp/file_monitor.py +27 -6
  185. crackerjack/mcp/progress_components.py +45 -34
  186. crackerjack/mcp/progress_monitor.py +6 -9
  187. crackerjack/mcp/rate_limiter.py +11 -7
  188. crackerjack/mcp/server.py +2 -0
  189. crackerjack/mcp/server_core.py +187 -55
  190. crackerjack/mcp/service_watchdog.py +12 -9
  191. crackerjack/mcp/task_manager.py +2 -2
  192. crackerjack/mcp/tools/README.md +27 -0
  193. crackerjack/mcp/tools/__init__.py +2 -0
  194. crackerjack/mcp/tools/core_tools.py +75 -52
  195. crackerjack/mcp/tools/execution_tools.py +87 -31
  196. crackerjack/mcp/tools/intelligence_tools.py +2 -2
  197. crackerjack/mcp/tools/proactive_tools.py +1 -1
  198. crackerjack/mcp/tools/semantic_tools.py +584 -0
  199. crackerjack/mcp/tools/utility_tools.py +180 -132
  200. crackerjack/mcp/tools/workflow_executor.py +87 -46
  201. crackerjack/mcp/websocket/README.md +31 -0
  202. crackerjack/mcp/websocket/app.py +11 -1
  203. crackerjack/mcp/websocket/event_bridge.py +188 -0
  204. crackerjack/mcp/websocket/jobs.py +27 -4
  205. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  206. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  207. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  208. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  209. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  210. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  211. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  212. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  213. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  214. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  215. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  216. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  217. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  218. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  219. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  220. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  221. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  222. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  223. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  224. crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
  225. crackerjack/mcp/websocket/server.py +1 -3
  226. crackerjack/mcp/websocket/websocket_handler.py +107 -6
  227. crackerjack/models/README.md +308 -0
  228. crackerjack/models/__init__.py +10 -1
  229. crackerjack/models/config.py +639 -22
  230. crackerjack/models/config_adapter.py +6 -6
  231. crackerjack/models/protocols.py +1167 -23
  232. crackerjack/models/pydantic_models.py +320 -0
  233. crackerjack/models/qa_config.py +145 -0
  234. crackerjack/models/qa_results.py +134 -0
  235. crackerjack/models/results.py +35 -0
  236. crackerjack/models/semantic_models.py +258 -0
  237. crackerjack/models/task.py +19 -3
  238. crackerjack/models/test_models.py +60 -0
  239. crackerjack/monitoring/README.md +11 -0
  240. crackerjack/monitoring/ai_agent_watchdog.py +5 -4
  241. crackerjack/monitoring/metrics_collector.py +4 -3
  242. crackerjack/monitoring/regression_prevention.py +4 -3
  243. crackerjack/monitoring/websocket_server.py +4 -241
  244. crackerjack/orchestration/README.md +340 -0
  245. crackerjack/orchestration/__init__.py +43 -0
  246. crackerjack/orchestration/advanced_orchestrator.py +20 -67
  247. crackerjack/orchestration/cache/README.md +312 -0
  248. crackerjack/orchestration/cache/__init__.py +37 -0
  249. crackerjack/orchestration/cache/memory_cache.py +338 -0
  250. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  251. crackerjack/orchestration/config.py +297 -0
  252. crackerjack/orchestration/coverage_improvement.py +13 -6
  253. crackerjack/orchestration/execution_strategies.py +6 -6
  254. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  255. crackerjack/orchestration/strategies/README.md +401 -0
  256. crackerjack/orchestration/strategies/__init__.py +39 -0
  257. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  258. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  259. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  260. crackerjack/orchestration/test_progress_streamer.py +1 -1
  261. crackerjack/plugins/README.md +11 -0
  262. crackerjack/plugins/hooks.py +3 -2
  263. crackerjack/plugins/loader.py +3 -3
  264. crackerjack/plugins/managers.py +1 -1
  265. crackerjack/py313.py +191 -0
  266. crackerjack/security/README.md +11 -0
  267. crackerjack/services/README.md +374 -0
  268. crackerjack/services/__init__.py +8 -21
  269. crackerjack/services/ai/README.md +295 -0
  270. crackerjack/services/ai/__init__.py +7 -0
  271. crackerjack/services/ai/advanced_optimizer.py +878 -0
  272. crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
  273. crackerjack/services/ai/embeddings.py +444 -0
  274. crackerjack/services/ai/intelligent_commit.py +328 -0
  275. crackerjack/services/ai/predictive_analytics.py +510 -0
  276. crackerjack/services/api_extractor.py +5 -3
  277. crackerjack/services/bounded_status_operations.py +45 -5
  278. crackerjack/services/cache.py +249 -318
  279. crackerjack/services/changelog_automation.py +7 -3
  280. crackerjack/services/command_execution_service.py +305 -0
  281. crackerjack/services/config_integrity.py +83 -39
  282. crackerjack/services/config_merge.py +9 -6
  283. crackerjack/services/config_service.py +198 -0
  284. crackerjack/services/config_template.py +13 -26
  285. crackerjack/services/coverage_badge_service.py +6 -4
  286. crackerjack/services/coverage_ratchet.py +53 -27
  287. crackerjack/services/debug.py +18 -7
  288. crackerjack/services/dependency_analyzer.py +4 -4
  289. crackerjack/services/dependency_monitor.py +13 -13
  290. crackerjack/services/documentation_generator.py +4 -2
  291. crackerjack/services/documentation_service.py +62 -33
  292. crackerjack/services/enhanced_filesystem.py +81 -27
  293. crackerjack/services/enterprise_optimizer.py +1 -1
  294. crackerjack/services/error_pattern_analyzer.py +10 -10
  295. crackerjack/services/file_filter.py +221 -0
  296. crackerjack/services/file_hasher.py +5 -7
  297. crackerjack/services/file_io_service.py +361 -0
  298. crackerjack/services/file_modifier.py +615 -0
  299. crackerjack/services/filesystem.py +80 -109
  300. crackerjack/services/git.py +99 -5
  301. crackerjack/services/health_metrics.py +4 -6
  302. crackerjack/services/heatmap_generator.py +12 -3
  303. crackerjack/services/incremental_executor.py +380 -0
  304. crackerjack/services/initialization.py +101 -49
  305. crackerjack/services/log_manager.py +2 -2
  306. crackerjack/services/logging.py +120 -68
  307. crackerjack/services/lsp_client.py +12 -12
  308. crackerjack/services/memory_optimizer.py +27 -22
  309. crackerjack/services/monitoring/README.md +30 -0
  310. crackerjack/services/monitoring/__init__.py +9 -0
  311. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  312. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  313. crackerjack/services/monitoring/health_metrics.py +716 -0
  314. crackerjack/services/monitoring/metrics.py +587 -0
  315. crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
  316. crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
  317. crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
  318. crackerjack/services/parallel_executor.py +166 -55
  319. crackerjack/services/patterns/__init__.py +142 -0
  320. crackerjack/services/patterns/agents.py +107 -0
  321. crackerjack/services/patterns/code/__init__.py +15 -0
  322. crackerjack/services/patterns/code/detection.py +118 -0
  323. crackerjack/services/patterns/code/imports.py +107 -0
  324. crackerjack/services/patterns/code/paths.py +159 -0
  325. crackerjack/services/patterns/code/performance.py +119 -0
  326. crackerjack/services/patterns/code/replacement.py +36 -0
  327. crackerjack/services/patterns/core.py +212 -0
  328. crackerjack/services/patterns/documentation/__init__.py +14 -0
  329. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  330. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  331. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  332. crackerjack/services/patterns/formatting.py +226 -0
  333. crackerjack/services/patterns/operations.py +339 -0
  334. crackerjack/services/patterns/security/__init__.py +23 -0
  335. crackerjack/services/patterns/security/code_injection.py +122 -0
  336. crackerjack/services/patterns/security/credentials.py +190 -0
  337. crackerjack/services/patterns/security/path_traversal.py +221 -0
  338. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  339. crackerjack/services/patterns/templates.py +62 -0
  340. crackerjack/services/patterns/testing/__init__.py +18 -0
  341. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  342. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  343. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  344. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  345. crackerjack/services/patterns/tool_output/other.py +97 -0
  346. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  347. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  348. crackerjack/services/patterns/url_sanitization.py +114 -0
  349. crackerjack/services/patterns/utilities.py +42 -0
  350. crackerjack/services/patterns/utils.py +339 -0
  351. crackerjack/services/patterns/validation.py +46 -0
  352. crackerjack/services/patterns/versioning.py +62 -0
  353. crackerjack/services/predictive_analytics.py +21 -8
  354. crackerjack/services/profiler.py +280 -0
  355. crackerjack/services/quality/README.md +415 -0
  356. crackerjack/services/quality/__init__.py +11 -0
  357. crackerjack/services/quality/anomaly_detector.py +392 -0
  358. crackerjack/services/quality/pattern_cache.py +333 -0
  359. crackerjack/services/quality/pattern_detector.py +479 -0
  360. crackerjack/services/quality/qa_orchestrator.py +491 -0
  361. crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
  362. crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
  363. crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
  364. crackerjack/services/regex_patterns.py +58 -2987
  365. crackerjack/services/regex_utils.py +55 -29
  366. crackerjack/services/secure_status_formatter.py +42 -15
  367. crackerjack/services/secure_subprocess.py +35 -2
  368. crackerjack/services/security.py +16 -8
  369. crackerjack/services/server_manager.py +40 -51
  370. crackerjack/services/smart_scheduling.py +46 -6
  371. crackerjack/services/status_authentication.py +3 -3
  372. crackerjack/services/thread_safe_status_collector.py +1 -0
  373. crackerjack/services/tool_filter.py +368 -0
  374. crackerjack/services/tool_version_service.py +9 -5
  375. crackerjack/services/unified_config.py +43 -351
  376. crackerjack/services/vector_store.py +689 -0
  377. crackerjack/services/version_analyzer.py +6 -4
  378. crackerjack/services/version_checker.py +14 -8
  379. crackerjack/services/zuban_lsp_service.py +5 -4
  380. crackerjack/slash_commands/README.md +11 -0
  381. crackerjack/slash_commands/init.md +2 -12
  382. crackerjack/slash_commands/run.md +84 -50
  383. crackerjack/tools/README.md +11 -0
  384. crackerjack/tools/__init__.py +30 -0
  385. crackerjack/tools/_git_utils.py +105 -0
  386. crackerjack/tools/check_added_large_files.py +139 -0
  387. crackerjack/tools/check_ast.py +105 -0
  388. crackerjack/tools/check_json.py +103 -0
  389. crackerjack/tools/check_jsonschema.py +297 -0
  390. crackerjack/tools/check_toml.py +103 -0
  391. crackerjack/tools/check_yaml.py +110 -0
  392. crackerjack/tools/codespell_wrapper.py +72 -0
  393. crackerjack/tools/end_of_file_fixer.py +202 -0
  394. crackerjack/tools/format_json.py +128 -0
  395. crackerjack/tools/mdformat_wrapper.py +114 -0
  396. crackerjack/tools/trailing_whitespace.py +198 -0
  397. crackerjack/tools/validate_regex_patterns.py +7 -3
  398. crackerjack/ui/README.md +11 -0
  399. crackerjack/ui/dashboard_renderer.py +28 -0
  400. crackerjack/ui/templates/README.md +11 -0
  401. crackerjack/utils/console_utils.py +13 -0
  402. crackerjack/utils/dependency_guard.py +230 -0
  403. crackerjack/utils/retry_utils.py +275 -0
  404. crackerjack/workflows/README.md +590 -0
  405. crackerjack/workflows/__init__.py +46 -0
  406. crackerjack/workflows/actions.py +811 -0
  407. crackerjack/workflows/auto_fix.py +444 -0
  408. crackerjack/workflows/container_builder.py +499 -0
  409. crackerjack/workflows/definitions.py +443 -0
  410. crackerjack/workflows/engine.py +177 -0
  411. crackerjack/workflows/event_bridge.py +242 -0
  412. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
  413. crackerjack-0.45.2.dist-info/RECORD +478 -0
  414. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  415. crackerjack/managers/test_manager_backup.py +0 -1075
  416. crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
  417. crackerjack/mixins/__init__.py +0 -3
  418. crackerjack/mixins/error_handling.py +0 -145
  419. crackerjack/services/config.py +0 -358
  420. crackerjack/ui/server_panels.py +0 -125
  421. crackerjack-0.37.9.dist-info/RECORD +0 -231
  422. /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
  423. /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
  424. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
  425. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,273 @@
1
+ """Codespell adapter for ACB QA framework - spelling error detection.
2
+
3
+ Codespell checks for common spelling errors in code, comments, and documentation.
4
+ It helps maintain professional quality by catching:
5
+ - Typos in comments and docstrings
6
+ - Misspelled variable/function names
7
+ - Documentation errors
8
+ - Common spelling mistakes
9
+
10
+ ACB Patterns:
11
+ - MODULE_ID and MODULE_STATUS at module level
12
+ - depends.set() registration after class definition
13
+ - Extends BaseToolAdapter for tool execution
14
+ - Async execution with output parsing
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import typing as t
20
+ from contextlib import suppress
21
+ from pathlib import Path
22
+ from uuid import UUID, uuid4
23
+
24
+ from acb.depends import depends
25
+ from pydantic import Field
26
+
27
+ from crackerjack.adapters._tool_adapter_base import (
28
+ BaseToolAdapter,
29
+ ToolAdapterSettings,
30
+ ToolExecutionResult,
31
+ ToolIssue,
32
+ )
33
+ from crackerjack.models.qa_results import QACheckType
34
+
35
+ if t.TYPE_CHECKING:
36
+ from crackerjack.models.qa_config import QACheckConfig
37
+
38
+ # ACB Module Registration (REQUIRED)
39
+ MODULE_ID = uuid4()
40
+ MODULE_STATUS = "stable"
41
+
42
+
43
+ class CodespellSettings(ToolAdapterSettings):
44
+ """Settings for Codespell adapter."""
45
+
46
+ tool_name: str = "codespell"
47
+ use_json_output: bool = False # Codespell uses text output
48
+ fix_enabled: bool = False # Auto-fix spelling errors
49
+ skip_hidden: bool = True
50
+ ignore_words: list[str] = Field(default_factory=list)
51
+ ignore_words_file: Path | None = None
52
+ check_filenames: bool = False
53
+ quiet_level: int = 2 # Only show errors
54
+
55
+
56
+ class CodespellAdapter(BaseToolAdapter):
57
+ """Adapter for Codespell - spelling error checker.
58
+
59
+ Detects and optionally fixes common spelling mistakes:
60
+ - Comments and docstrings
61
+ - String literals
62
+ - Variable and function names (optional)
63
+ - Documentation files
64
+
65
+ Features:
66
+ - Auto-fix support
67
+ - Custom ignore words
68
+ - Configurable scanning scope
69
+ - Multiple file type support
70
+
71
+ Example:
72
+ ```python
73
+ settings = CodespellSettings(
74
+ fix_enabled=True,
75
+ ignore_words=["acb", "pydantic"],
76
+ skip_hidden=True,
77
+ )
78
+ adapter = CodespellAdapter(settings=settings)
79
+ await adapter.init()
80
+ result = await adapter.check(files=[Path("src/"), Path("docs/")])
81
+ ```
82
+ """
83
+
84
+ settings: CodespellSettings | None = None
85
+
86
+ def __init__(self, settings: CodespellSettings | None = None) -> None:
87
+ """Initialize Codespell adapter.
88
+
89
+ Args:
90
+ settings: Optional settings override
91
+ """
92
+ super().__init__(settings=settings)
93
+
94
+ async def init(self) -> None:
95
+ """Initialize adapter with default settings."""
96
+ if not self.settings:
97
+ self.settings = await CodespellSettings.create_async()
98
+ await super().init()
99
+
100
+ @property
101
+ def adapter_name(self) -> str:
102
+ """Human-readable adapter name."""
103
+ return "Codespell (Spelling)"
104
+
105
+ @property
106
+ def module_id(self) -> UUID:
107
+ """Reference to module-level MODULE_ID."""
108
+ return MODULE_ID
109
+
110
+ @property
111
+ def tool_name(self) -> str:
112
+ """CLI tool name."""
113
+ return "codespell"
114
+
115
+ def build_command(
116
+ self,
117
+ files: list[Path],
118
+ config: QACheckConfig | None = None,
119
+ ) -> list[str]:
120
+ """Build Codespell command.
121
+
122
+ Args:
123
+ files: Files/directories to check
124
+ config: Optional configuration override
125
+
126
+ Returns:
127
+ Command as list of strings
128
+ """
129
+ if not self.settings:
130
+ raise RuntimeError("Settings not initialized")
131
+
132
+ cmd = [self.tool_name]
133
+
134
+ # Auto-fix
135
+ if self.settings.fix_enabled:
136
+ cmd.append("--write-changes")
137
+
138
+ # Skip hidden files
139
+ if self.settings.skip_hidden:
140
+ cmd.append("--skip=.*")
141
+
142
+ # Ignore specific words
143
+ if self.settings.ignore_words:
144
+ cmd.extend(["--ignore-words-list", ",".join(self.settings.ignore_words)])
145
+
146
+ # Ignore words file
147
+ if self.settings.ignore_words_file and self.settings.ignore_words_file.exists():
148
+ cmd.extend(["--ignore-words", str(self.settings.ignore_words_file)])
149
+
150
+ # Check filenames
151
+ if self.settings.check_filenames:
152
+ cmd.append("--check-filenames")
153
+
154
+ # Quiet level
155
+ cmd.extend(["--quiet-level", str(self.settings.quiet_level)])
156
+
157
+ # Add targets
158
+ cmd.extend([str(f) for f in files])
159
+
160
+ return cmd
161
+
162
+ def _parse_codespell_line(
163
+ self, line: str
164
+ ) -> tuple[Path | None, int | None, str, str | None] | None:
165
+ """Parse a single line from codespell output.
166
+
167
+ Args:
168
+ line: A line from codespell output
169
+
170
+ Returns:
171
+ Tuple of (file_path, line_number, message, suggestion) or None if parsing fails
172
+ """
173
+ # Codespell format: "file.py:10: tyop ==> typo"
174
+ if ":" not in line or "==>" not in line:
175
+ return None
176
+
177
+ parts = line.split(":", maxsplit=2)
178
+ if len(parts) < 2:
179
+ return None
180
+
181
+ file_path = Path(parts[0].strip())
182
+ line_number = int(parts[1].strip()) if parts[1].strip().isdigit() else None
183
+
184
+ # Parse error and suggestion
185
+ error_part = parts[2].strip() if len(parts) > 2 else line
186
+ if "==>" in error_part:
187
+ wrong, correct = error_part.split("==>", maxsplit=1)
188
+ wrong = wrong.strip()
189
+ correct = correct.strip()
190
+
191
+ message = f"Spelling: '{wrong}' should be '{correct}'"
192
+ suggestion = f"Replace '{wrong}' with '{correct}'"
193
+ else:
194
+ message = error_part
195
+ suggestion = None
196
+
197
+ return file_path, line_number, message, suggestion
198
+
199
+ async def parse_output(
200
+ self,
201
+ result: ToolExecutionResult,
202
+ ) -> list[ToolIssue]:
203
+ """Parse Codespell text output into standardized issues.
204
+
205
+ Args:
206
+ result: Raw execution result from Codespell
207
+
208
+ Returns:
209
+ List of parsed issues
210
+ """
211
+ if not result.raw_output:
212
+ return []
213
+
214
+ issues = []
215
+ lines = result.raw_output.strip().split("\n")
216
+
217
+ for line in lines:
218
+ parsed_result = self._parse_codespell_line(line)
219
+ if parsed_result is not None:
220
+ file_path, line_number, message, suggestion = parsed_result
221
+
222
+ issue = ToolIssue(
223
+ file_path=file_path,
224
+ line_number=line_number,
225
+ message=message,
226
+ code="SPELLING",
227
+ severity="warning",
228
+ suggestion=suggestion,
229
+ )
230
+ issues.append(issue)
231
+
232
+ return issues
233
+
234
+ def _get_check_type(self) -> QACheckType:
235
+ """Return format check type."""
236
+ return QACheckType.FORMAT
237
+
238
+ def get_default_config(self) -> QACheckConfig:
239
+ """Get default configuration for Codespell adapter.
240
+
241
+ Returns:
242
+ QACheckConfig with sensible defaults
243
+ """
244
+ from crackerjack.models.qa_config import QACheckConfig
245
+
246
+ return QACheckConfig(
247
+ check_id=MODULE_ID,
248
+ check_name=self.adapter_name,
249
+ check_type=QACheckType.FORMAT,
250
+ enabled=True,
251
+ file_patterns=["**/*.py", "**/*.md", "**/*.rst", "**/*.txt"],
252
+ exclude_patterns=[
253
+ "**/.git/**",
254
+ "**/.venv/**",
255
+ "**/node_modules/**",
256
+ "**/__pycache__/**",
257
+ ],
258
+ timeout_seconds=60,
259
+ is_formatter=False, # Only checks, doesn't format
260
+ parallel_safe=True,
261
+ stage="fast", # Spelling checks in fast stage
262
+ settings={
263
+ "fix_enabled": False,
264
+ "skip_hidden": True,
265
+ "ignore_words": ["acb", "pydantic", "uuid"],
266
+ "check_filenames": False,
267
+ },
268
+ )
269
+
270
+
271
+ # ACB Registration (REQUIRED at module level)
272
+ with suppress(Exception):
273
+ depends.set(CodespellAdapter)
@@ -0,0 +1,49 @@
1
+ > Crackerjack Docs: [Main](<../../../README.md>) | [Adapters](<../README.md>) | [LSP](<./README.md>)
2
+
3
+ # LSP Adapters
4
+
5
+ Rust-backed tools with Language Server Protocol integration for fast, incremental diagnostics.
6
+
7
+ ## Overview
8
+
9
+ - Shared base (`_base.py`) defines `Issue`/`ToolResult` and adapter protocol
10
+ - Optional LSP paths for low-latency diagnostics, with CLI fallback
11
+ - Useful for continuous analysis in editors and orchestrated runs
12
+
13
+ ## Built-in Implementations
14
+
15
+ | Module | Description | LSP | Status |
16
+ | ------ | ----------- | --- | ------ |
17
+ | `zuban.py` | Ultra-fast Python type checking with LSP and CLI fallback | Yes | Stable |
18
+ | `skylos.py` | Dead code detection with JSON/text parsing | N/A | Stable |
19
+
20
+ Support modules:
21
+
22
+ - `_client.py` — Optimized Zuban LSP client wrapper
23
+ - `_manager.py` — LSP process and workspace lifecycle helpers
24
+ - `_base.py` — Common protocol types and base adapter
25
+
26
+ ## Zuban (LSP) Usage
27
+
28
+ ```python
29
+ from pathlib import Path
30
+ from crackerjack.adapters.lsp.zuban import ZubanAdapter
31
+
32
+
33
+ async def typecheck_with_lsp(ctx) -> None:
34
+ adapter = ZubanAdapter(context=ctx, strict_mode=True, use_lsp=True)
35
+ result = await adapter.check_with_lsp_or_fallback([Path("src/")])
36
+ print("errors:", result.error_count, "warnings:", result.warning_count)
37
+ ```
38
+
39
+ CLI helpers are available to manage Zuban LSP via `python -m crackerjack` options (start/stop/restart).
40
+
41
+ ## Notes
42
+
43
+ - LSP improves iteration speed; adapters transparently fall back to CLI
44
+ - Some Zuban builds may have TOML parsing issues; health checks guard usage
45
+
46
+ ## Related
47
+
48
+ - [Type](<../type/README.md>) — Non-LSP type checkers and settings
49
+ - [Refactor](<../refactor/README.md>) — Skylos-based dead code detection
@@ -0,0 +1,27 @@
1
+ """LSP adapter consolidation for Rust-based analysis tools.
2
+
3
+ This module consolidates all LSP-related adapter functionality:
4
+ - Zuban: Type checking with LSP integration
5
+ - Skylos: Dead code detection
6
+ - Base protocols and tool result structures
7
+ - Manager for coordinating multiple tools
8
+ """
9
+
10
+ from ._base import BaseRustToolAdapter, Issue, RustToolAdapter, ToolResult
11
+ from ._client import ZubanLSPClient
12
+ from ._manager import RustToolHookManager
13
+ from .skylos import DeadCodeIssue, SkylosAdapter
14
+ from .zuban import TypeIssue, ZubanAdapter
15
+
16
+ __all__ = [
17
+ "RustToolAdapter",
18
+ "BaseRustToolAdapter",
19
+ "ToolResult",
20
+ "Issue",
21
+ "SkylosAdapter",
22
+ "DeadCodeIssue",
23
+ "ZubanAdapter",
24
+ "TypeIssue",
25
+ "RustToolHookManager",
26
+ "ZubanLSPClient",
27
+ ]
@@ -5,9 +5,9 @@ import time
5
5
  import typing as t
6
6
  from pathlib import Path
7
7
 
8
- from .rust_tool_adapter import BaseRustToolAdapter, ToolResult
9
- from .skylos_adapter import SkylosAdapter
10
- from .zuban_adapter import ZubanAdapter
8
+ from ._base import BaseRustToolAdapter, ToolResult
9
+ from .skylos import SkylosAdapter
10
+ from .zuban import ZubanAdapter
11
11
 
12
12
  if t.TYPE_CHECKING:
13
13
  from crackerjack.orchestration.execution_strategies import ExecutionContext
@@ -4,7 +4,7 @@ import typing as t
4
4
  from dataclasses import dataclass
5
5
  from pathlib import Path
6
6
 
7
- from .rust_tool_adapter import BaseRustToolAdapter, Issue, ToolResult
7
+ from ._base import BaseRustToolAdapter, Issue, ToolResult
8
8
 
9
9
  if t.TYPE_CHECKING:
10
10
  from crackerjack.orchestration.execution_strategies import ExecutionContext
@@ -38,7 +38,7 @@ class SkylosAdapter(BaseRustToolAdapter):
38
38
  def __init__(
39
39
  self,
40
40
  context: "ExecutionContext",
41
- confidence_threshold: int = 86,
41
+ confidence_threshold: int = 99, # Higher threshold to reduce false positives in DI system
42
42
  web_dashboard_port: int = 5090,
43
43
  ) -> None:
44
44
  """Initialize Skylos adapter."""
@@ -56,7 +56,14 @@ class SkylosAdapter(BaseRustToolAdapter):
56
56
 
57
57
  def get_command_args(self, target_files: list[Path]) -> list[str]:
58
58
  """Get command arguments for Skylos execution."""
59
- args = ["uv", "run", "skylos", "--confidence", str(self.confidence_threshold)]
59
+ # Use higher confidence threshold to avoid false positives from DI system
60
+ args = [
61
+ "uv",
62
+ "run",
63
+ "skylos",
64
+ "--confidence",
65
+ str(max(95, self.confidence_threshold)),
66
+ ]
60
67
 
61
68
  # Add JSON mode for AI agents
62
69
  if self._should_use_json_output():
@@ -66,14 +73,59 @@ class SkylosAdapter(BaseRustToolAdapter):
66
73
  if self.context.interactive:
67
74
  args.extend(["--web", "--port", str(self.web_dashboard_port)])
68
75
 
69
- # Add target files or default to current directory
76
+ # Add target files or determine the appropriate target directory
70
77
  if target_files:
71
78
  args.extend(str(f) for f in target_files)
72
79
  else:
73
- args.append(".")
80
+ package_target = self._determine_package_target()
81
+ args.append(package_target)
74
82
 
75
83
  return args
76
84
 
85
+ def _determine_package_target(self) -> str:
86
+ """Determine the package target directory to scan."""
87
+ from pathlib import Path
88
+
89
+ # Look for package directory in common locations
90
+ cwd = Path.cwd()
91
+ package_name = self._get_package_name_from_pyproject(cwd)
92
+
93
+ if not package_name:
94
+ package_name = self._find_package_directory_with_init(cwd)
95
+
96
+ # Default to 'crackerjack' if nothing found
97
+ if not package_name:
98
+ package_name = "crackerjack"
99
+
100
+ return f"./{package_name}"
101
+
102
+ def _get_package_name_from_pyproject(self, cwd: Path) -> str | None:
103
+ """Get package name from pyproject.toml."""
104
+ pyproject_path = cwd / "pyproject.toml"
105
+ if not pyproject_path.exists():
106
+ return None
107
+
108
+ import tomllib
109
+ from contextlib import suppress
110
+
111
+ with suppress(Exception):
112
+ with pyproject_path.open("rb") as f:
113
+ data = tomllib.load(f)
114
+ project_name = data.get("project", {}).get("name")
115
+ if project_name:
116
+ return project_name.replace("-", "_")
117
+ return None
118
+
119
+ def _find_package_directory_with_init(self, cwd: Path) -> str | None:
120
+ """Find first directory with __init__.py in project root."""
121
+ excluded = {"tests", "docs", ".venv", "venv", "build", "dist"}
122
+
123
+ for item in cwd.iterdir():
124
+ if item.is_dir() and (item / "__init__.py").exists():
125
+ if item.name not in excluded:
126
+ return item.name
127
+ return None
128
+
77
129
  def parse_output(self, output: str) -> ToolResult:
78
130
  """Parse Skylos output into standardized result."""
79
131
  if self._should_use_json_output():
@@ -102,7 +154,7 @@ class SkylosAdapter(BaseRustToolAdapter):
102
154
  for item in data.get("dead_code", [])
103
155
  ]
104
156
 
105
- # Skylos success means no issues found
157
+ # For skylos, having dead code issues means the check failed (not success)
106
158
  success = len(issues) == 0
107
159
 
108
160
  return ToolResult(
@@ -141,7 +193,7 @@ class SkylosAdapter(BaseRustToolAdapter):
141
193
  if issue:
142
194
  issues.append(issue)
143
195
 
144
- # Success if no issues found
196
+ # For skylos, having ANY dead code issues means it failed the check
145
197
  success = len(issues) == 0
146
198
 
147
199
  return ToolResult(
@@ -6,14 +6,14 @@ from contextlib import suppress
6
6
  from dataclasses import dataclass
7
7
  from pathlib import Path
8
8
 
9
- from .rust_tool_adapter import BaseRustToolAdapter, Issue, ToolResult
9
+ from ._base import BaseRustToolAdapter, Issue, ToolResult
10
10
 
11
11
  if t.TYPE_CHECKING:
12
12
  from crackerjack.orchestration.execution_strategies import ExecutionContext
13
13
  from crackerjack.services.lsp_client import LSPClient
14
14
 
15
15
  # Import the LSP client wrapper
16
- from .lsp_client import ZubanLSPClient
16
+ from ._client import ZubanLSPClient
17
17
 
18
18
 
19
19
  @dataclass
@@ -111,12 +111,9 @@ class ZubanAdapter(BaseRustToolAdapter):
111
111
 
112
112
  try:
113
113
  # Import here to avoid circular imports
114
- from rich.console import Console
115
-
116
114
  from crackerjack.services.lsp_client import LSPClient
117
115
 
118
- console = getattr(self.context, "console", Console())
119
- self._lsp_client = LSPClient(console=console)
116
+ self._lsp_client = LSPClient()
120
117
  self._lsp_available = self._lsp_client.is_server_running()
121
118
 
122
119
  except ImportError:
@@ -0,0 +1,59 @@
1
+ > Crackerjack Docs: [Main](<../../../README.md>) | [Adapters](<../README.md>) | [Refactor](<./README.md>)
2
+
3
+ # Refactor Adapters
4
+
5
+ Modernization and dead-code tooling to simplify code and reduce risk.
6
+
7
+ ## Overview
8
+
9
+ - Suggest idiomatic patterns and cleanups (Refurb)
10
+ - Identify unused dependencies (Creosote)
11
+ - Detect dead code for deletion (Skylos)
12
+
13
+ ## Built-in Implementations
14
+
15
+ | Module | Description | Status |
16
+ | ------ | ----------- | ------ |
17
+ | `refurb.py` | Refactoring suggestions for modern Python idioms | Stable |
18
+ | `creosote.py` | Detects unused dependencies in `pyproject.toml`/`requirements*.txt` | Stable |
19
+ | `skylos.py` | Dead code detection (text/JSON parsing) | Stable |
20
+
21
+ ## Examples
22
+
23
+ Refurb:
24
+
25
+ ```python
26
+ from pathlib import Path
27
+ from crackerjack.adapters.refactor.refurb import RefurbAdapter, RefurbSettings
28
+
29
+
30
+ async def suggest_refactors() -> None:
31
+ adapter = RefurbAdapter(settings=RefurbSettings(explain=True))
32
+ await adapter.init()
33
+ result = await adapter.check(files=[Path("src/")])
34
+ ```
35
+
36
+ Creosote:
37
+
38
+ ```python
39
+ from pathlib import Path
40
+ from crackerjack.adapters.refactor.creosote import CreosoteAdapter, CreosoteSettings
41
+
42
+
43
+ async def find_unused_deps() -> None:
44
+ adapter = CreosoteAdapter(
45
+ settings=CreosoteSettings(config_file=Path("pyproject.toml"))
46
+ )
47
+ await adapter.init()
48
+ result = await adapter.check()
49
+ ```
50
+
51
+ ## Notes
52
+
53
+ - Treat Refurb suggestions as warnings; human review recommended
54
+ - Exclude dev/build tools in Creosote to avoid false positives
55
+
56
+ ## Related
57
+
58
+ - [Complexity](<../complexity/README.md>) — Use complexity reports to target refactors
59
+ - [Format](<../format/README.md>) — Formatting changes often enable simpler refactors
@@ -0,0 +1,12 @@
1
+ """Refactor adapters for code improvement suggestions.
2
+
3
+ Adapters:
4
+ - refurb: Modern Python best practices and idiom suggestions
5
+ - creosote: Unused dependency detection
6
+ - skylos: Dead code detection (unused imports, functions, classes, variables)
7
+ """
8
+
9
+ # ACB will auto-discover these adapters via depends.set() in module files
10
+ # No explicit imports needed here
11
+
12
+ __all__ = []