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
@@ -0,0 +1,226 @@
1
+ """Formatting and whitespace normalization patterns."""
2
+
3
+ from .core import ValidatedPattern
4
+
5
+ PATTERNS: dict[str, ValidatedPattern] = {
6
+ "fix_command_spacing": ValidatedPattern(
7
+ name="fix_command_spacing",
8
+ pattern=r"python\s*-\s*m\s+(\w+)",
9
+ replacement=r"python -m \1",
10
+ description="Fix spacing in 'python -m command' patterns",
11
+ test_cases=[
12
+ ("python - m crackerjack", "python -m crackerjack"),
13
+ ("python -m crackerjack", "python -m crackerjack"),
14
+ ("python - m pytest", "python -m pytest"),
15
+ ("other python - m stuff", "other python -m stuff"),
16
+ ],
17
+ ),
18
+ "fix_long_flag_spacing": ValidatedPattern(
19
+ name="fix_long_flag_spacing",
20
+ pattern=r"-\s*-\s*(\w+(?: -\w+)*)",
21
+ replacement=r"--\1",
22
+ description="Fix spacing in long flags like '--help'",
23
+ test_cases=[
24
+ ("- - help", "--help"),
25
+ ("- - ai-fix", "--ai-fix"),
26
+ ("--help", "--help"),
27
+ ("- - start-websocket-server", "--start-websocket-server"),
28
+ ],
29
+ ),
30
+ "fix_short_flag_spacing": ValidatedPattern(
31
+ name="fix_short_flag_spacing",
32
+ pattern=r"(?<!\w)-\s+(\w)(?!\w)",
33
+ replacement=r"-\1",
34
+ description="Fix spacing in short flags like '-t'",
35
+ test_cases=[
36
+ ("python -m crackerjack - t", "python -m crackerjack -t"),
37
+ ("- q", "-q"),
38
+ ("-t", "-t"),
39
+ ("some - x flag", "some -x flag"),
40
+ ],
41
+ ),
42
+ "fix_hyphenated_names": ValidatedPattern(
43
+ name="fix_hyphenated_names",
44
+ pattern=r"(\w+)\s*-\s*(\w+)",
45
+ replacement=r"\1-\2",
46
+ description="Fix spacing in hyphenated names and identifiers",
47
+ test_cases=[
48
+ ("python - pro", "python-pro"),
49
+ (
50
+ "pytest - hypothesis - specialist",
51
+ "pytest-hypothesis - specialist",
52
+ ),
53
+ ("backend - architect", "backend-architect"),
54
+ ("python-pro", "python-pro"),
55
+ ("end - of - file-fixer", "end-of - file-fixer"),
56
+ ],
57
+ ),
58
+ "fix_hyphenated_names_global": ValidatedPattern(
59
+ name="fix_hyphenated_names_global",
60
+ pattern=r"(\w+)\s+-\s+(\w+)",
61
+ replacement=r"\1-\2",
62
+ description="Globally fix spacing in hyphenated names (single pass only)",
63
+ global_replace=True,
64
+ test_cases=[
65
+ ("python - pro", "python-pro"),
66
+ ("end - of - file", "end-of - file"),
67
+ ("already-hyphenated", "already-hyphenated"),
68
+ ("start - middle - end", "start-middle - end"),
69
+ ],
70
+ ),
71
+ "fix_spaced_hyphens": ValidatedPattern(
72
+ name="fix_spaced_hyphens",
73
+ pattern=r"(\w+)\s+-\s+(\w+)",
74
+ replacement=r"\1-\2",
75
+ description="Fix spaced hyphens with spaces around dashes (use apply_iteratively for multi-word)",
76
+ global_replace=True,
77
+ test_cases=[
78
+ ("python - pro", "python-pro"),
79
+ (
80
+ "pytest - hypothesis - specialist",
81
+ "pytest-hypothesis - specialist",
82
+ ),
83
+ (
84
+ "end - of - file - fixer",
85
+ "end-of - file-fixer",
86
+ ),
87
+ ("already-hyphenated", "already-hyphenated"),
88
+ ("mixed-case with - spaces", "mixed-case with-spaces"),
89
+ ],
90
+ ),
91
+ "fix_debug_log_pattern": ValidatedPattern(
92
+ name="fix_debug_log_pattern",
93
+ pattern=r"crackerjack\s*-\s*debug",
94
+ replacement="crackerjack-debug",
95
+ description="Fix spacing in debug log patterns",
96
+ test_cases=[
97
+ ("crackerjack - debug-12345.log", "crackerjack-debug-12345.log"),
98
+ ("crackerjack-debug.log", "crackerjack-debug.log"),
99
+ ("old crackerjack - debug files", "old crackerjack-debug files"),
100
+ ],
101
+ ),
102
+ "fix_job_file_pattern": ValidatedPattern(
103
+ name="fix_job_file_pattern",
104
+ pattern=r"job\s*-\s*(\{[^}]+\}|\w+)",
105
+ replacement=r"job-\1",
106
+ description="Fix spacing in job file patterns",
107
+ test_cases=[
108
+ ("job - {self.web_job_id}.json", "job-{self.web_job_id}.json"),
109
+ ("job - abc123.json", "job-abc123.json"),
110
+ ("job-existing.json", "job-existing.json"),
111
+ ],
112
+ ),
113
+ "fix_markdown_bold": ValidatedPattern(
114
+ name="fix_markdown_bold",
115
+ pattern=r"\*\s+\*(.+?)\s*\*\s+\*",
116
+ replacement=r"**\1**",
117
+ description="Fix spacing in markdown bold patterns",
118
+ test_cases=[
119
+ ("* *Bold Text * *", "**Bold Text**"),
120
+ ("* *🧪 pytest-specialist * *", "**🧪 pytest-specialist**"),
121
+ ("**Already Bold**", "**Already Bold**"),
122
+ ],
123
+ ),
124
+ "remove_trailing_whitespace": ValidatedPattern(
125
+ name="remove_trailing_whitespace",
126
+ pattern=r"[ \t]+$",
127
+ replacement="",
128
+ description="Remove trailing whitespace from lines",
129
+ global_replace=True,
130
+ test_cases=[
131
+ ("line with spaces ", "line with spaces"),
132
+ ("line with tabs\t\t", "line with tabs"),
133
+ ("normal line", "normal line"),
134
+ ("mixed \t ", "mixed"),
135
+ ("", ""),
136
+ ],
137
+ ),
138
+ "normalize_multiple_newlines": ValidatedPattern(
139
+ name="normalize_multiple_newlines",
140
+ pattern=r"\n{3,}",
141
+ replacement="\n\n",
142
+ description="Normalize multiple consecutive newlines to maximum 2",
143
+ global_replace=True,
144
+ test_cases=[
145
+ ("line1\n\n\nline2", "line1\n\nline2"),
146
+ ("line1\n\n\n\n\nline2", "line1\n\nline2"),
147
+ ("line1\n\nline2", "line1\n\nline2"),
148
+ ("line1\nline2", "line1\nline2"),
149
+ ],
150
+ ),
151
+ "normalize_assert_statements": ValidatedPattern(
152
+ name="normalize_assert_statements",
153
+ pattern=r"assert (.+?)\s*==\s*(.+)",
154
+ replacement=r"assert \1 == \2",
155
+ description="Normalize spacing around == in assert statements",
156
+ global_replace=True,
157
+ test_cases=[
158
+ ("assert result==expected", "assert result == expected"),
159
+ ("assert value == other", "assert value == other"),
160
+ ("assert result== expected", "assert result == expected"),
161
+ ("assert result ==expected", "assert result == expected"),
162
+ (
163
+ "assert result == expected",
164
+ "assert result == expected",
165
+ ),
166
+ ],
167
+ ),
168
+ "spacing_after_comma": ValidatedPattern(
169
+ name="spacing_after_comma",
170
+ pattern=r",(?! |\n|$)",
171
+ replacement=r", ",
172
+ description="Add space after comma if missing (skip if already spaced, at end of line, or end of string)",
173
+ global_replace=True,
174
+ test_cases=[
175
+ ("func(a,b,c)", "func(a, b, c)"),
176
+ ("func(a, b, c)", "func(a, b, c)"),
177
+ ("[1,2,3]", "[1, 2, 3]"),
178
+ ("[1, 2, 3]", "[1, 2, 3]"),
179
+ ("{'x':1,'y':2,'z':3}", "{'x':1, 'y':2, 'z':3}"),
180
+ ("trailing,\nnewline", "trailing,\nnewline"),
181
+ ("end_comma,", "end_comma,"),
182
+ ],
183
+ ),
184
+ "spacing_after_colon": ValidatedPattern(
185
+ name="spacing_after_colon",
186
+ pattern=r"(?<!https)(?<!http)(?<!ftp)(?<!file)(?<!: )(\b[a-zA-Z_][a-zA-Z0-9_]*):([a-zA-Z0-9_][^ \n:]*)",
187
+ replacement=r"\1: \2",
188
+ global_replace=True,
189
+ description="Add space after colon if missing (avoid double colons, URLs, and protocols)",
190
+ test_cases=[
191
+ ("def func(x: int, y: str): ", "def func(x: int, y: str): "),
192
+ ("dict_item = {'key': 'value'}", "dict_item = {'key': 'value'}"),
193
+ ("already: spaced: properly", "already: spaced: properly"),
194
+ ("class::method", "class::method"),
195
+ ("https://github.com", "https://github.com"),
196
+ ("http://example.com", "http://example.com"),
197
+ ("ftp://server.com", "ftp://server.com"),
198
+ ("repo:local", "repo: local"),
199
+ ],
200
+ ),
201
+ "multiple_spaces": ValidatedPattern(
202
+ name="multiple_spaces",
203
+ pattern=r" {2,}",
204
+ replacement=r" ",
205
+ description="Replace multiple spaces with single space",
206
+ global_replace=True,
207
+ test_cases=[
208
+ ("def func( x, y ): ", "def func( x, y ): "),
209
+ ("single space only", "single space only"),
210
+ ("lots of spaces", "lots of spaces"),
211
+ ("\tkeep\ttabs\tbut fix spaces", "\tkeep\ttabs\tbut fix spaces"),
212
+ ],
213
+ ),
214
+ "normalize_whitespace": ValidatedPattern(
215
+ name="normalize_whitespace",
216
+ pattern=r"\s+",
217
+ replacement=r" ",
218
+ description="Normalize multiple whitespace to single space",
219
+ global_replace=True,
220
+ test_cases=[
221
+ ("import module", "import module"),
222
+ ("from pkg import item", "from pkg import item"),
223
+ ("normal text", "normal text"),
224
+ ],
225
+ ),
226
+ }
@@ -0,0 +1,339 @@
1
+ """Utility functions for regex pattern operations."""
2
+
3
+ import re
4
+
5
+ # Import for type checking - circular import avoided
6
+ from typing import TYPE_CHECKING
7
+
8
+ from .core import MAX_ITERATIONS, CompiledPatternCache, ValidatedPattern
9
+
10
+ if TYPE_CHECKING:
11
+ pass # SAFE_PATTERNS imported at runtime to avoid circular imports
12
+
13
+
14
+ def validate_all_patterns() -> dict[str, bool]:
15
+ """Validate all patterns in the registry."""
16
+ from . import SAFE_PATTERNS
17
+
18
+ results: dict[str, bool] = {}
19
+ for name, pattern in SAFE_PATTERNS.items():
20
+ try:
21
+ pattern._validate()
22
+ results[name] = True
23
+ except ValueError as e:
24
+ results[name] = False
25
+ print(f"Pattern '{name}' failed validation: {e}")
26
+ return results
27
+
28
+
29
+ def find_pattern_for_text(text: str) -> list[str]:
30
+ """Find all patterns that match the given text."""
31
+ from . import SAFE_PATTERNS
32
+
33
+ return [name for name, pattern in SAFE_PATTERNS.items() if pattern.test(text)]
34
+
35
+
36
+ def apply_safe_replacement(text: str, pattern_name: str) -> str:
37
+ """Apply a named pattern to text."""
38
+ from . import SAFE_PATTERNS
39
+
40
+ if pattern_name not in SAFE_PATTERNS:
41
+ raise ValueError(f"Unknown pattern: {pattern_name}")
42
+
43
+ return SAFE_PATTERNS[pattern_name].apply(text)
44
+
45
+
46
+ def get_pattern_description(pattern_name: str) -> str:
47
+ """Get description for a named pattern."""
48
+ from . import SAFE_PATTERNS
49
+
50
+ if pattern_name not in SAFE_PATTERNS:
51
+ return "Unknown pattern"
52
+
53
+ return SAFE_PATTERNS[pattern_name].description
54
+
55
+
56
+ def fix_multi_word_hyphenation(text: str) -> str:
57
+ """Fix multi-word hyphenation iteratively."""
58
+ from . import SAFE_PATTERNS
59
+
60
+ return SAFE_PATTERNS["fix_spaced_hyphens"].apply_iteratively(text)
61
+
62
+
63
+ def update_pyproject_version(content: str, new_version: str) -> str:
64
+ """Update version in pyproject.toml content."""
65
+ from . import SAFE_PATTERNS
66
+
67
+ pattern_obj = SAFE_PATTERNS["update_pyproject_version"]
68
+
69
+ temp_pattern = ValidatedPattern(
70
+ name="temp_version_update",
71
+ pattern=pattern_obj.pattern,
72
+ replacement=f"\\g<1>{new_version}\\g<3>",
73
+ description=f"Update version to {new_version}",
74
+ test_cases=[
75
+ ('version = "1.2.3"', f'version = "{new_version}"'),
76
+ ],
77
+ )
78
+
79
+ return re.compile(pattern_obj.pattern, re.MULTILINE).sub(
80
+ temp_pattern.replacement, content
81
+ )
82
+
83
+
84
+ def apply_formatting_fixes(content: str) -> str:
85
+ """Apply common formatting fixes to content."""
86
+ from . import SAFE_PATTERNS
87
+
88
+ pattern = SAFE_PATTERNS["remove_trailing_whitespace"]
89
+ content = re.compile(pattern.pattern, re.MULTILINE).sub(
90
+ pattern.replacement, content
91
+ )
92
+
93
+ content = SAFE_PATTERNS["normalize_multiple_newlines"].apply(content)
94
+
95
+ return content
96
+
97
+
98
+ def apply_security_fixes(content: str) -> str:
99
+ """Apply common security fixes to content."""
100
+ from . import SAFE_PATTERNS
101
+
102
+ content = SAFE_PATTERNS["fix_subprocess_run_shell"].apply(content)
103
+ content = SAFE_PATTERNS["fix_subprocess_call_shell"].apply(content)
104
+ content = SAFE_PATTERNS["fix_subprocess_popen_shell"].apply(content)
105
+
106
+ content = SAFE_PATTERNS["fix_unsafe_yaml_load"].apply(content)
107
+ content = SAFE_PATTERNS["fix_weak_md5_hash"].apply(content)
108
+ content = SAFE_PATTERNS["fix_weak_sha1_hash"].apply(content)
109
+ content = SAFE_PATTERNS["fix_insecure_random_choice"].apply(content)
110
+
111
+ content = SAFE_PATTERNS["remove_debug_prints_with_secrets"].apply(content)
112
+
113
+ return content
114
+
115
+
116
+ def apply_test_fixes(content: str) -> str:
117
+ """Apply common test-related fixes to content."""
118
+ from . import SAFE_PATTERNS
119
+
120
+ return SAFE_PATTERNS["normalize_assert_statements"].apply(content)
121
+
122
+
123
+ def is_valid_job_id(job_id: str) -> bool:
124
+ """Check if a job ID is valid."""
125
+ from . import SAFE_PATTERNS
126
+
127
+ return SAFE_PATTERNS["validate_job_id_alphanumeric"].test(job_id)
128
+
129
+
130
+ def remove_coverage_fail_under(addopts: str) -> str:
131
+ """Remove --cov-fail-under from pytest addopts."""
132
+ from . import SAFE_PATTERNS
133
+
134
+ return SAFE_PATTERNS["remove_coverage_fail_under"].apply(addopts)
135
+
136
+
137
+ def update_coverage_requirement(content: str, new_coverage: float) -> str:
138
+ """Update coverage requirement to a new value."""
139
+ from . import SAFE_PATTERNS
140
+
141
+ pattern_obj = SAFE_PATTERNS["update_coverage_requirement"]
142
+
143
+ temp_pattern = ValidatedPattern(
144
+ name="temp_coverage_update",
145
+ pattern=pattern_obj.pattern,
146
+ replacement=f"\\1{new_coverage: .0f}",
147
+ description=f"Update coverage to {new_coverage}",
148
+ test_cases=[
149
+ ("--cov-fail-under=85", f"--cov-fail-under={new_coverage: .0f}"),
150
+ ],
151
+ )
152
+
153
+ return re.compile(pattern_obj.pattern).sub(temp_pattern.replacement, content)
154
+
155
+
156
+ def update_repo_revision(content: str, repo_url: str, new_revision: str) -> str:
157
+ """Update repository revision in content."""
158
+ escaped_url = re.escape(repo_url)
159
+ pattern = rf'("repo": "{escaped_url}".*?"rev": )"([^"]+)"'
160
+ replacement = rf'\1"{new_revision}"'
161
+
162
+ return re.compile(pattern, re.DOTALL).sub(replacement, content)
163
+
164
+
165
+ def sanitize_internal_urls(text: str) -> str:
166
+ """Sanitize all internal URLs in text."""
167
+ from . import SAFE_PATTERNS
168
+
169
+ url_patterns = [
170
+ "sanitize_localhost_urls",
171
+ "sanitize_127_urls",
172
+ "sanitize_any_localhost_urls",
173
+ "sanitize_ws_localhost_urls",
174
+ "sanitize_ws_127_urls",
175
+ "sanitize_simple_localhost_urls",
176
+ "sanitize_simple_ws_localhost_urls",
177
+ ]
178
+
179
+ result = text
180
+ for pattern_name in url_patterns:
181
+ result = SAFE_PATTERNS[pattern_name].apply(result)
182
+
183
+ return result
184
+
185
+
186
+ def apply_pattern_iteratively(
187
+ text: str, pattern_name: str, max_iterations: int = MAX_ITERATIONS
188
+ ) -> str:
189
+ """Apply a pattern iteratively until no more changes."""
190
+ from . import SAFE_PATTERNS
191
+
192
+ if pattern_name not in SAFE_PATTERNS:
193
+ raise ValueError(f"Unknown pattern: {pattern_name}")
194
+
195
+ return SAFE_PATTERNS[pattern_name].apply_iteratively(text, max_iterations)
196
+
197
+
198
+ def get_all_pattern_stats() -> dict[str, dict[str, float] | dict[str, str]]:
199
+ """Get performance statistics for all patterns."""
200
+ from . import SAFE_PATTERNS
201
+
202
+ test_text = "python - m crackerjack - t with pytest - hypothesis - specialist"
203
+ stats: dict[str, dict[str, float] | dict[str, str]] = {}
204
+
205
+ for name, pattern in SAFE_PATTERNS.items():
206
+ try:
207
+ pattern_stats = pattern.get_performance_stats(test_text, iterations=10)
208
+ stats[name] = pattern_stats
209
+ except Exception as e:
210
+ stats[name] = {"error": str(e)}
211
+
212
+ return stats
213
+
214
+
215
+ def clear_all_caches() -> None:
216
+ """Clear all pattern caches."""
217
+ CompiledPatternCache.clear_cache()
218
+
219
+
220
+ def get_cache_info() -> dict[str, int | list[str]]:
221
+ """Get cache statistics."""
222
+ return CompiledPatternCache.get_cache_stats()
223
+
224
+
225
+ def detect_path_traversal_patterns(path_str: str) -> list[str]:
226
+ """Detect path traversal patterns in a path string."""
227
+ from . import SAFE_PATTERNS
228
+
229
+ detected = []
230
+ traversal_patterns = [
231
+ "detect_directory_traversal_basic",
232
+ "detect_directory_traversal_backslash",
233
+ "detect_url_encoded_traversal",
234
+ "detect_double_url_encoded_traversal",
235
+ ]
236
+
237
+ for pattern_name in traversal_patterns:
238
+ pattern = SAFE_PATTERNS[pattern_name]
239
+ if pattern.test(path_str):
240
+ detected.append(pattern_name)
241
+
242
+ return detected
243
+
244
+
245
+ def detect_null_byte_patterns(path_str: str) -> list[str]:
246
+ """Detect null byte patterns in a path string."""
247
+ from . import SAFE_PATTERNS
248
+
249
+ detected = []
250
+ null_patterns = [
251
+ "detect_null_bytes_url",
252
+ "detect_null_bytes_literal",
253
+ "detect_utf8_overlong_null",
254
+ ]
255
+
256
+ for pattern_name in null_patterns:
257
+ pattern = SAFE_PATTERNS[pattern_name]
258
+ if pattern.test(path_str):
259
+ detected.append(pattern_name)
260
+
261
+ return detected
262
+
263
+
264
+ def detect_dangerous_directory_patterns(path_str: str) -> list[str]:
265
+ """Detect dangerous directory access patterns in a path string."""
266
+ from . import SAFE_PATTERNS
267
+
268
+ detected = []
269
+ dangerous_patterns = [
270
+ "detect_sys_directory_pattern",
271
+ "detect_proc_directory_pattern",
272
+ "detect_etc_directory_pattern",
273
+ "detect_boot_directory_pattern",
274
+ "detect_dev_directory_pattern",
275
+ "detect_root_directory_pattern",
276
+ "detect_var_log_directory_pattern",
277
+ "detect_bin_directory_pattern",
278
+ "detect_sbin_directory_pattern",
279
+ ]
280
+
281
+ for pattern_name in dangerous_patterns:
282
+ pattern = SAFE_PATTERNS[pattern_name]
283
+ if pattern.test(path_str):
284
+ detected.append(pattern_name)
285
+
286
+ return detected
287
+
288
+
289
+ def detect_suspicious_path_patterns(path_str: str) -> list[str]:
290
+ """Detect suspicious path patterns in a path string."""
291
+ from . import SAFE_PATTERNS
292
+
293
+ detected = []
294
+ suspicious_patterns = [
295
+ "detect_parent_directory_in_path",
296
+ "detect_suspicious_temp_traversal",
297
+ "detect_suspicious_var_traversal",
298
+ ]
299
+
300
+ for pattern_name in suspicious_patterns:
301
+ pattern = SAFE_PATTERNS[pattern_name]
302
+ if pattern.test(path_str):
303
+ detected.append(pattern_name)
304
+
305
+ return detected
306
+
307
+
308
+ def validate_path_security(path_str: str) -> dict[str, list[str]]:
309
+ """Validate path security by checking for various attack patterns."""
310
+ return {
311
+ "traversal_patterns": detect_path_traversal_patterns(path_str),
312
+ "null_bytes": detect_null_byte_patterns(path_str),
313
+ "dangerous_directories": detect_dangerous_directory_patterns(path_str),
314
+ "suspicious_patterns": detect_suspicious_path_patterns(path_str),
315
+ }
316
+
317
+
318
+ class RegexPatternsService:
319
+ """Service class that implements RegexPatternsProtocol.
320
+
321
+ Wraps module-level regex pattern functions to provide a protocol-compliant interface.
322
+ """
323
+
324
+ def update_pyproject_version(self, content: str, new_version: str) -> str:
325
+ """Update version in pyproject.toml content."""
326
+ return update_pyproject_version(content, new_version)
327
+
328
+ def remove_coverage_fail_under(self, content: str) -> str:
329
+ """Remove --cov-fail-under from pytest addopts."""
330
+ return remove_coverage_fail_under(content)
331
+
332
+ def update_version_in_changelog(self, content: str, new_version: str) -> str:
333
+ """Update version in changelog content."""
334
+ # Placeholder implementation - can be enhanced later
335
+ return content
336
+
337
+ def mask_tokens_in_text(self, text: str) -> str:
338
+ """Mask sensitive tokens in text."""
339
+ return sanitize_internal_urls(text)
@@ -0,0 +1,23 @@
1
+ """Security-related patterns for credential detection, path traversal, and unsafe operations.
2
+
3
+ This module aggregates all security patterns from specialized submodules:
4
+ - credentials: Hardcoded credentials, secrets, tokens, and passwords (9 patterns)
5
+ - path_traversal: Directory traversal and unsafe path access (19 patterns)
6
+ - unsafe_operations: Weak crypto, insecure random, subprocess injection (14 patterns)
7
+ - code_injection: SQL injection, code eval, system commands (8 patterns)
8
+
9
+ Total: 50 security patterns
10
+ """
11
+
12
+ from ..core import ValidatedPattern
13
+ from .code_injection import PATTERNS as CODE_INJECTION_PATTERNS
14
+ from .credentials import PATTERNS as CREDENTIAL_PATTERNS
15
+ from .path_traversal import PATTERNS as PATH_TRAVERSAL_PATTERNS
16
+ from .unsafe_operations import PATTERNS as UNSAFE_OPERATION_PATTERNS
17
+
18
+ PATTERNS: dict[str, ValidatedPattern] = (
19
+ CREDENTIAL_PATTERNS
20
+ | PATH_TRAVERSAL_PATTERNS
21
+ | UNSAFE_OPERATION_PATTERNS
22
+ | CODE_INJECTION_PATTERNS
23
+ )