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
@@ -6,7 +6,8 @@ from enum import Enum
6
6
  from pathlib import Path
7
7
  from typing import Any
8
8
 
9
- from rich.console import Console
9
+ from acb.console import Console
10
+ from acb.depends import Inject, depends
10
11
 
11
12
  from .changelog_automation import ChangelogEntry, ChangelogGenerator
12
13
  from .git import GitService
@@ -194,7 +195,8 @@ class ConventionalCommitAnalyzer:
194
195
  class VersionAnalyzer:
195
196
  """Main service for analyzing changes and recommending version bumps."""
196
197
 
197
- def __init__(self, console: Console, git_service: GitService) -> None:
198
+ @depends.inject
199
+ def __init__(self, console: Inject[Console], git_service: GitService) -> None:
198
200
  self.console = console
199
201
  self.git = git_service
200
202
 
@@ -203,8 +205,8 @@ class VersionAnalyzer:
203
205
  self.feature_analyzer = FeatureAnalyzer()
204
206
  self.commit_analyzer = ConventionalCommitAnalyzer()
205
207
 
206
- # Initialize changelog generator for getting entries
207
- self.changelog_generator = ChangelogGenerator(console, git_service)
208
+ # Initialize changelog generator for getting entries (ACB DI injects dependencies)
209
+ self.changelog_generator = ChangelogGenerator()
208
210
 
209
211
  def _get_current_version(self) -> str | None:
210
212
  """Get current version from pyproject.toml."""
@@ -3,7 +3,10 @@ import typing as t
3
3
  from dataclasses import dataclass
4
4
 
5
5
  import aiohttp
6
- from rich.console import Console
6
+ from acb.console import Console
7
+ from acb.depends import Inject, depends
8
+
9
+ from crackerjack.core.retry import retry_api_call
7
10
 
8
11
 
9
12
  @dataclass
@@ -16,7 +19,8 @@ class VersionInfo:
16
19
 
17
20
 
18
21
  class VersionChecker:
19
- def __init__(self, console: Console) -> None:
22
+ @depends.inject
23
+ def __init__(self, console: Inject[Console]) -> None:
20
24
  self.console = console
21
25
  self.tools_to_check = {
22
26
  "ruff": self._get_ruff_version,
@@ -115,13 +119,15 @@ class VersionChecker:
115
119
  pass
116
120
  return None
117
121
 
122
+ @retry_api_call(max_attempts=3, delay=1.0, backoff=2.0, max_delay=30.0)
118
123
  async def _fetch_latest_version(self, tool_name: str) -> str | None:
119
124
  try:
125
+ # Fix URLs - remove spaces that were added
120
126
  pypi_urls = {
121
- "ruff": "https: / / pypi.org / pypi / ruff / json",
122
- "pyright": "https: / / pypi.org / pypi / pyright / json",
123
- "pre-commit": "https: / / pypi.org / pypi / pre-commit / json",
124
- "uv": "https: / / pypi.org / pypi / uv / json",
127
+ "ruff": "https://pypi.org/pypi/ruff/json",
128
+ "pyright": "https://pypi.org/pypi/pyright/json",
129
+ "pre-commit": "https://pypi.org/pypi/pre-commit/json",
130
+ "uv": "https://pypi.org/pypi/uv/json",
125
131
  }
126
132
 
127
133
  url = pypi_urls.get(tool_name)
@@ -132,8 +138,8 @@ class VersionChecker:
132
138
  async with aiohttp.ClientSession(timeout=timeout) as session:
133
139
  async with session.get(url) as response:
134
140
  response.raise_for_status()
135
- data = await response.json()
136
- return data.get("info", {}).get("version") # type: ignore[no-any-return]
141
+ data: dict[str, t.Any] = await response.json()
142
+ return data.get("info", {}).get("version")
137
143
 
138
144
  except Exception:
139
145
  return None
@@ -9,7 +9,8 @@ import typing as t
9
9
  from contextlib import suppress
10
10
  from pathlib import Path
11
11
 
12
- from rich.console import Console
12
+ from acb.console import Console
13
+ from acb.depends import depends
13
14
 
14
15
  from .security_logger import get_security_logger
15
16
 
@@ -34,7 +35,7 @@ class ZubanLSPService:
34
35
  """
35
36
  self.port = port
36
37
  self.mode = mode
37
- self.console = console or Console()
38
+ self.console = console or depends.get_sync(Console)
38
39
  self.process: subprocess.Popen[bytes] | None = None
39
40
  self.start_time: float = 0.0
40
41
  self.security_logger = get_security_logger()
@@ -358,7 +359,7 @@ class ZubanLSPService:
358
359
  # This is a simplified implementation
359
360
  # In a production system, you'd want to use proper async I/O
360
361
  loop = asyncio.get_event_loop()
361
- line = await loop.run_in_executor(None, self.process.stdout.readline)
362
+ line = await loop.run_in_executor(None, self.process.stdout.readline) # type: ignore[call-arg]
362
363
  return line.decode("utf-8").rstrip("\r\n")
363
364
 
364
365
  async def _read_bytes_async(self, count: int) -> bytes:
@@ -367,7 +368,7 @@ class ZubanLSPService:
367
368
  return b""
368
369
 
369
370
  loop = asyncio.get_event_loop()
370
- data = await loop.run_in_executor(None, self.process.stdout.read, count)
371
+ data = await loop.run_in_executor(None, self.process.stdout.read, count) # type: ignore[call-arg]
371
372
  return data
372
373
 
373
374
 
@@ -0,0 +1,11 @@
1
+ > Crackerjack Docs: [Main](<../../README.md>) | [Crackerjack Package](<../README.md>) | [Slash Commands](<./README.md>)
2
+
3
+ # Slash Commands
4
+
5
+ Slash command handlers and related routing.
6
+
7
+ ## Related
8
+
9
+ - [Crackerjack Package](<../README.md>) - Parent package
10
+ - [MCP](<../mcp/README.md>) - MCP server slash command integration
11
+ - [CLI](<../cli/README.md>) - Command-line interface handlers
@@ -22,11 +22,9 @@ This slash command initializes a new Python project with crackerjack's best prac
22
22
  1. **Checks Project State**: Verifies which configuration files exist
23
23
  1. **Smart Merge Configuration**:
24
24
  - `pyproject.toml` - Intelligently merges tool configurations, preserves higher coverage requirements
25
- - `.pre-commit-config.yaml` - Adds missing repos, preserves existing hooks
26
25
  - `CLAUDE.md` - Appends crackerjack guidelines without overwriting existing content
27
26
  - `RULES.md` - Copies only if missing, preserves existing coding standards
28
27
  1. **Preserves Project Identity**: Never overwrites existing project metadata, dependencies, or configurations
29
- 1. **Installs Pre-commit Hooks**: Sets up git hooks for quality enforcement
30
28
 
31
29
  ## When to Use /crackerjack:init
32
30
 
@@ -34,9 +32,8 @@ This slash command initializes a new Python project with crackerjack's best prac
34
32
 
35
33
  The MCP server can detect when initialization is needed:
36
34
 
37
- - **Missing Core Files**: No pyproject.toml or .pre-commit-config.yaml
35
+ - **Missing Core Files**: No pyproject.toml
38
36
  - **New Project**: Git repository just initialized
39
- - **Outdated Hooks**: Pre-commit hooks older than 30 days
40
37
  - **Manual Request**: User explicitly asks for initialization
41
38
 
42
39
  ### Recommended Frequency
@@ -62,7 +59,6 @@ AI: I'll initialize crackerjack configuration for your project.
62
59
 
63
60
  The project has been initialized with:
64
61
  ✅ pyproject.toml - Project configuration
65
- ✅ .pre-commit-config.yaml - Quality hooks
66
62
  ✅ CLAUDE.md - AI guidelines
67
63
  ✅ RULES.md - Coding standards
68
64
 
@@ -75,7 +71,7 @@ When connected via MCP, crackerjack can automatically suggest initialization whe
75
71
 
76
72
  1. Running `/crackerjack:run` in an uninitialized project
77
73
  1. Detecting missing critical configuration files
78
- 1. Finding outdated pre-commit hooks (>30 days old)
74
+ 1. Finding configuration files that need updates
79
75
 
80
76
  This ensures projects always have up-to-date quality standards without manual intervention.
81
77
 
@@ -97,12 +93,6 @@ This ensures projects always have up-to-date quality standards without manual in
97
93
  - **Prevents Duplicates**: Skips if crackerjack section already exists
98
94
  - **Clear Boundaries**: Uses `<!-- CRACKERJACK_START -->` and `<!-- CRACKERJACK_END -->` markers
99
95
 
100
- ### .pre-commit-config.yaml Smart Merge
101
-
102
- - **Adds Missing Repos**: Only adds pre-commit repos that don't already exist
103
- - **Preserves Existing Hooks**: Never modifies existing hook configurations
104
- - **Skips if No New Repos**: Intelligent detection prevents unnecessary changes
105
-
106
96
  ### Universal Compatibility
107
97
 
108
98
  This smart merge approach works with **any Python package**, not just specific projects:
@@ -1,15 +1,15 @@
1
1
  ______________________________________________________________________
2
2
 
3
- ## description: Run Crackerjack with advanced orchestrated AI-powered auto-fix mode to automatically resolve all code quality issues with intelligent execution strategies and granular progress tracking.
3
+ ## description: Run crackerjack with AI-powered auto-fixing using intelligent session integration. Automatically tries enhanced session-mgmt execution first, then gracefully falls back to standard crackerjack execution if unavailable. Perfect for comprehensive code quality enforcement with zero configuration required.
4
4
 
5
- # /crackerjack:run
5
+ # /run
6
6
 
7
- Run Crackerjack with advanced orchestrated AI-powered auto-fix mode to automatically resolve all code quality issues with intelligent execution strategies and granular progress tracking.
7
+ Intelligent crackerjack runner that tries session-mgmt:crackerjack-run first with fallback to crackerjack:run for optimal integration with session management systems.
8
8
 
9
9
  ## Usage
10
10
 
11
11
  ```
12
- /crackerjack:run [--debug]
12
+ /run [--debug]
13
13
  ```
14
14
 
15
15
  ### Arguments
@@ -22,7 +22,12 @@ Run Crackerjack with advanced orchestrated AI-powered auto-fix mode to automatic
22
22
 
23
23
  ## Description
24
24
 
25
- This slash command runs Crackerjack with AI agent mode for autonomous code quality enforcement:
25
+ This slash command provides intelligent crackerjack execution with automatic fallback:
26
+
27
+ 1. **Primary**: Attempts `session-mgmt:crackerjack-run` for enhanced session integration
28
+ 1. **Fallback**: Uses `crackerjack:run` if session-mgmt is unavailable
29
+
30
+ Both execution paths use AI agent mode for autonomous code quality enforcement:
26
31
 
27
32
  - `--ai-fix`: AI auto-fixing mode for structured error output and intelligent fixing
28
33
  - `--test`: Run tests with comprehensive test coverage
@@ -30,25 +35,46 @@ This slash command runs Crackerjack with AI agent mode for autonomous code quali
30
35
 
31
36
  ## 💡 Agent Recommendation
32
37
 
33
- **For optimal results, use the `crackerjack-architect` agent alongside `/crackerjack:run`:**
38
+ **For optimal results, use the `crackerjack-architect` agent alongside `/run`:**
34
39
 
35
40
  ```bash
36
41
  # 1. Plan with crackerjack-architect first
37
42
  Task tool with subagent_type="crackerjack-architect" for feature planning
38
43
 
39
44
  # 2. Run crackerjack for quality enforcement
40
- /crackerjack:run
45
+ /run
41
46
 
42
47
  # 3. Use crackerjack-architect for any remaining issues
43
48
  ```
44
49
 
45
- **Why?** The crackerjack-architect agent ensures code follows crackerjack patterns from the start, reducing the number of iterations needed for `/crackerjack:run` to achieve full compliance.
50
+ **Why?** The crackerjack-architect agent ensures code follows crackerjack patterns from the start, reducing the number of iterations needed for `/run` to achieve full compliance.
46
51
 
47
52
  ## What It Does
48
53
 
49
- **Iterative AI-Powered Auto-Fixing Process (up to 10 iterations):**
54
+ **Smart Execution Strategy:**
55
+
56
+ ### 1. 🧠 **Session-Mgmt Integration (Primary)**
57
+
58
+ When `session-mgmt:crackerjack-run` is available:
59
+
60
+ - **Enhanced Context**: Leverages session history for better AI decisions
61
+ - **Progress Continuity**: Builds on previous session learnings
62
+ - **Memory Integration**: Remembers past error patterns and fixes
63
+ - **Quality Trends**: Uses historical quality metrics for optimization
64
+
65
+ ### 2. 🔄 **Standard Execution (Fallback)**
66
+
67
+ When session-mgmt is unavailable, falls back to `crackerjack:run`:
68
+
69
+ - **Full Functionality**: Complete AI auto-fixing capabilities
70
+ - **Zero Degradation**: All quality features remain available
71
+ - **Seamless Transition**: User experience unchanged
50
72
 
51
- ### Pre-Execution Safety Checks:
73
+ ### 3. ⚡ **Iterative AI-Powered Auto-Fixing Process (up to 10 iterations)**
74
+
75
+ Both execution paths follow the same comprehensive workflow:
76
+
77
+ #### Pre-Execution Safety Checks:
52
78
 
53
79
  0. 🔍 **Comprehensive Status Check** (automatic conflict prevention)
54
80
 
@@ -58,7 +84,7 @@ Task tool with subagent_type="crackerjack-architect" for feature planning
58
84
  - Auto-start missing services if needed
59
85
  - Report resource usage and system health
60
86
 
61
- ### Each Iteration Cycle:
87
+ #### Each Iteration Cycle:
62
88
 
63
89
  1. ⚡ **Fast Hooks** (formatting & basic fixes)
64
90
 
@@ -90,7 +116,7 @@ Task tool with subagent_type="crackerjack-architect" for feature planning
90
116
 
91
117
  1. 🔄 **Next Full Iteration**: Repeat entire cycle until ALL checks pass or max iterations (10) reached
92
118
 
93
- ### Final Result:
119
+ #### Final Result:
94
120
 
95
121
  🎉 **Perfect Code Quality**: All hooks pass, all tests pass, zero manual intervention!
96
122
 
@@ -100,64 +126,72 @@ When an AI assistant uses this command:
100
126
 
101
127
  ```
102
128
  User: Can you fix all the code quality issues in this project?
103
- AI: I'll use the /crackerjack:run command to automatically fix all code quality issues.
129
+ AI: I'll use the /run command to automatically fix all code quality issues with intelligent session integration.
130
+
131
+ /run
132
+
133
+ [AI first tries: session-mgmt:crackerjack-run]
134
+ ✅ Session-mgmt available - using enhanced execution mode
104
135
 
105
- /crackerjack:run
136
+ [Enhanced execution with session context: python -m crackerjack --ai-fix --test --verbose]
106
137
 
107
- [AI runs: python -m crackerjack --ai-fix --test --verbose]
138
+ The crackerjack AI agent completed successfully after 2 iterations! Here's what was automatically fixed:
108
139
 
109
- The crackerjack AI agent completed successfully after 3 iterations! Here's what was automatically fixed:
140
+ **Session Context Benefits**:
141
+ - Leveraged previous session learnings about this codebase
142
+ - Applied remembered fix patterns from similar issues
143
+ - Optimized execution based on historical performance data
110
144
 
111
145
  **Iteration 1**: Fixed formatting and imports
112
146
  - Reformatted 5 files with proper indentation
113
- - Organized imports in 3 modules
147
+ - Organized imports in 3 modules (using cached preferences)
114
148
  - Removed trailing whitespace
115
149
 
116
- **Iteration 2**: Resolved type and security issues
117
- - Added type hints to 7 functions
118
- - Fixed 2 hardcoded temp path security warnings
119
- - Removed 1 unused variable
150
+ **Iteration 2**: Final quality improvements
151
+ - Added type hints to 4 functions (improved from previous 7 due to session learning)
152
+ - All 42 tests now pass with 47% coverage
120
153
 
121
- **Iteration 3**: Final test fixes
122
- - Fixed missing test fixture import
123
- - Updated assertion in test_workflow.py
124
- - All 42 tests now pass with 45% coverage
125
-
126
- 🎉 **Result**: Perfect code quality achieved with zero manual intervention!
154
+ 🎉 **Result**: Perfect code quality achieved with enhanced session integration!
127
155
  ```
128
156
 
129
157
  ## Benefits
130
158
 
131
- - **Zero Configuration**: AI doesn't need to remember complex flag combinations
132
- - **Optimal Settings**: Always uses the most effective options
133
- - **Complete Automation**: Handles the entire quality workflow automatically
134
- - **Consistent Results**: Same high-quality outcome every time
159
+ - **Smart Integration**: Automatically leverages session-mgmt when available
160
+ - **Graceful Fallback**: No functionality loss when session-mgmt unavailable
161
+ - **Enhanced Learning**: Session context improves AI decision quality
162
+ - **Zero Configuration**: AI doesn't need to remember complex integration logic
163
+ - **Optimal Performance**: Uses best available execution method automatically
164
+ - **Consistent Results**: Same high-quality outcome regardless of execution path
135
165
 
136
166
  ## Implementation
137
167
 
138
- **CRITICAL**: When an AI assistant encounters `/crackerjack:run`, it MUST ONLY use the MCP server tools. Never fall back to bash/shell execution of `python -m crackerjack`.
139
-
140
- When an AI assistant encounters `/crackerjack:run`, it calls the MCP server tool directly:
168
+ **CRITICAL**: When an AI assistant encounters `/run`, it MUST implement the intelligent fallback strategy using MCP server tools.
141
169
 
142
- **Note**: The WebSocket server on localhost:8675 is automatically started when the command runs, so no manual setup is required.
170
+ ### Execution Strategy
143
171
 
144
172
  ```python
145
- # Call MCP server tool for orchestrated iterative auto-fixing (returns job_id immediately)
146
- job_result = execute_crackerjack("/crackerjack:run")
147
- job_id = job_result["job_id"]
148
-
149
- # For debugging, use the --debug flag:
150
- job_result = execute_crackerjack("/crackerjack:run --debug")
151
- # This runs in foreground and shows all output directly
173
+ # 1. Try session-mgmt integration first
174
+ try:
175
+ job_result = session_mgmt_crackerjack_run()
176
+ job_id = job_result["job_id"]
177
+ print("✅ Using session-mgmt enhanced execution")
178
+ except (ConnectionError, ServiceUnavailable, ToolNotFound):
179
+ # 2. Fallback to standard crackerjack execution
180
+ job_result = execute_crackerjack("/crackerjack:run")
181
+ job_id = job_result["job_id"]
182
+ print("⚡ Using standard crackerjack execution")
183
+
184
+ # For debugging, append --debug flag to either execution path:
185
+ # session_mgmt_crackerjack_run("--debug") or execute_crackerjack("/crackerjack:run --debug")
152
186
  ```
153
187
 
154
- This runs the AI agent auto-fixing process:
188
+ ### Key Features
155
189
 
156
- - **Background Execution**: Workflow runs in background, returns job_id immediately
157
- - **Progress Tracking**: Real-time progress updates via MCP tools
158
- - **Autonomous Fixing**: Makes actual code changes to resolve all issues
159
- - **Comprehensive Coverage**: Handles ALL error types (not just formatting)
160
- - **Iterative Process**: Continues fixing until perfect quality achieved (up to 10 iterations)
161
- - **Zero Manual Work**: No human intervention required
190
+ - **Automatic Detection**: No manual configuration needed
191
+ - **Seamless Fallback**: User unaware of which execution path used
192
+ - **Progress Tracking**: Real-time progress updates via MCP tools for both paths
193
+ - **Enhanced Context**: Session-mgmt path leverages conversation history
194
+ - **Background Execution**: Both paths run in background, return job_id immediately
195
+ - **Debug Support**: --debug flag works with both execution methods
162
196
 
163
- **Note**: This is NOT the same as basic hook auto-fix modes (like `ruff --fix`) which only handle simple formatting. The AI agent performs sophisticated code analysis and coordinated modification.
197
+ **Note**: This command provides the best of both worlds - enhanced session integration when available, with full functionality guaranteed through intelligent fallback.
@@ -0,0 +1,11 @@
1
+ > Crackerjack Docs: [Main](<../../README.md>) | [Crackerjack Package](<../README.md>) | [Tools](<./README.md>)
2
+
3
+ # Package Tools
4
+
5
+ Internal helper tools used within the package (distinct from top-level `tools/`).
6
+
7
+ ## Related
8
+
9
+ - [Crackerjack Package](<../README.md>) - Parent package
10
+ - [MCP](<../mcp/README.md>) - MCP tool implementations
11
+ - [Services](<../services/README.md>) - Service layer using these tools
@@ -0,0 +1,30 @@
1
+ """Native tool implementations for crackerjack (Phase 8).
2
+
3
+ This package contains Python implementations of quality checking tools,
4
+ providing direct invocation without pre-commit wrapper overhead.
5
+
6
+ Native tools replace pre-commit-hooks utilities with equivalent functionality:
7
+ - trailing_whitespace: Remove trailing whitespace
8
+ - end_of_file_fixer: Ensure files end with newline
9
+ - check_yaml: Validate YAML syntax
10
+ - check_toml: Validate TOML syntax
11
+ - check_json: Validate JSON syntax
12
+ - check_ast: Validate Python AST syntax
13
+ - format_json: Format JSON files
14
+ - check_jsonschema: Validate JSON files against schemas
15
+ - check_added_large_files: Warn on large file additions
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ __all__ = [
21
+ "trailing_whitespace",
22
+ "end_of_file_fixer",
23
+ "check_yaml",
24
+ "check_toml",
25
+ "check_json",
26
+ "check_ast",
27
+ "format_json",
28
+ "check_jsonschema",
29
+ "check_added_large_files",
30
+ ]
@@ -0,0 +1,105 @@
1
+ """Git-aware file discovery utilities for native tools.
2
+
3
+ This module provides utilities for discovering files while respecting .gitignore
4
+ patterns. It uses `git ls-files` to automatically handle gitignore compliance,
5
+ making crackerjack behave identically to pre-commit.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import subprocess
11
+ from pathlib import Path
12
+
13
+
14
+ def get_git_tracked_files(pattern: str | None = None) -> list[Path]:
15
+ """Get list of files tracked by git, optionally filtered by pattern.
16
+
17
+ This function uses `git ls-files` which automatically respects .gitignore
18
+ patterns. This is the industry-standard approach used by pre-commit and
19
+ ensures only git-tracked files are processed.
20
+
21
+ Args:
22
+ pattern: Optional glob pattern to filter files (e.g., "*.py", "*.yaml")
23
+ If None, returns all tracked files.
24
+
25
+ Returns:
26
+ List of Path objects for git-tracked files matching the pattern.
27
+ Falls back to empty list if not in a git repository.
28
+
29
+ Example:
30
+ >>> # Get all tracked Python files
31
+ >>> python_files = get_git_tracked_files("*.py")
32
+ >>> # Get all tracked YAML files
33
+ >>> yaml_files = get_git_tracked_files("*.yaml")
34
+ """
35
+ try:
36
+ cmd = ["git", "ls-files"]
37
+ if pattern:
38
+ cmd.append(pattern)
39
+
40
+ result = subprocess.run(
41
+ cmd,
42
+ capture_output=True,
43
+ text=True,
44
+ check=True,
45
+ cwd=Path.cwd(),
46
+ )
47
+
48
+ # Filter to only include files that actually exist on disk
49
+ # (git ls-files can include deleted files still in the index)
50
+ return [
51
+ Path(line.strip())
52
+ for line in result.stdout.splitlines()
53
+ if line.strip() and Path(line.strip()).exists()
54
+ ]
55
+
56
+ except subprocess.CalledProcessError:
57
+ # Git command failed (not in a git repo, etc.)
58
+ return []
59
+ except FileNotFoundError:
60
+ # Git not available
61
+ return []
62
+
63
+
64
+ def get_files_by_extension(extensions: list[str], use_git: bool = True) -> list[Path]:
65
+ """Get files with specified extensions, respecting git if available.
66
+
67
+ Args:
68
+ extensions: List of file extensions to match (e.g., [".py", ".yaml"])
69
+ use_git: If True (default), use git ls-files when in a git repo.
70
+ If False, use Path.rglob() for all files.
71
+
72
+ Returns:
73
+ List of Path objects matching the extensions.
74
+ Automatically respects .gitignore when use_git=True.
75
+
76
+ Example:
77
+ >>> # Get Python files (git-aware)
78
+ >>> py_files = get_files_by_extension([".py"])
79
+ >>> # Get YAML files (all files, ignore git)
80
+ >>> yaml_files = get_files_by_extension([".yaml", ".yml"], use_git=False)
81
+ """
82
+ if not use_git:
83
+ # Fallback to rglob for all files
84
+ files = []
85
+ for ext in extensions:
86
+ files.extend(Path.cwd().rglob(f"*{ext}"))
87
+ return [f for f in files if f.is_file()]
88
+
89
+ # Try git-aware discovery first
90
+ files = []
91
+ for ext in extensions:
92
+ # git ls-files pattern: *.ext
93
+ pattern = f"*{ext}"
94
+ git_files = get_git_tracked_files(pattern)
95
+ if git_files:
96
+ files.extend(git_files)
97
+
98
+ if files:
99
+ return files
100
+
101
+ # Fallback to rglob if git unavailable
102
+ result = []
103
+ for ext in extensions:
104
+ result.extend(Path.cwd().rglob(f"*{ext}"))
105
+ return [f for f in result if f.is_file()]