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,237 @@
1
+ """Parallel execution strategy for hook orchestration.
2
+
3
+ Implements concurrent hook execution with resource limits, timeout handling,
4
+ and exception isolation. Uses asyncio.Semaphore for throttling.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import asyncio
10
+ import logging
11
+ import typing as t
12
+
13
+ from crackerjack.config.hooks import HookDefinition
14
+ from crackerjack.models.task import HookResult
15
+
16
+ # Module-level logger
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ class ParallelExecutionStrategy:
21
+ """Parallel execution strategy with resource limits.
22
+
23
+ Features:
24
+ - Concurrent execution using asyncio.gather()
25
+ - Semaphore-based resource limiting (max concurrent hooks)
26
+ - Per-hook timeout handling with asyncio.wait_for()
27
+ - Exception isolation (one failure doesn't stop others)
28
+ - Structured logging for execution flow
29
+
30
+ Use when:
31
+ - Hooks are independent (no dependencies)
32
+ - Want to maximize throughput
33
+ - System has sufficient resources
34
+
35
+ Example:
36
+ ```python
37
+ strategy = ParallelExecutionStrategy(max_parallel=3)
38
+ results = await strategy.execute(hooks=[hook1, hook2, hook3], timeout=300)
39
+ ```
40
+ """
41
+
42
+ def __init__(
43
+ self,
44
+ max_parallel: int = 3,
45
+ default_timeout: int = 300,
46
+ ) -> None:
47
+ """Initialize parallel execution strategy.
48
+
49
+ Args:
50
+ max_parallel: Maximum concurrent hook executions
51
+ default_timeout: Default timeout per hook in seconds
52
+ """
53
+ self.max_parallel = max_parallel
54
+ self.default_timeout = default_timeout
55
+ self.semaphore: asyncio.Semaphore | None = None
56
+
57
+ logger.debug(
58
+ "ParallelExecutionStrategy initialized",
59
+ extra={
60
+ "max_parallel": max_parallel,
61
+ "default_timeout": default_timeout,
62
+ },
63
+ )
64
+
65
+ async def execute(
66
+ self,
67
+ hooks: list[HookDefinition],
68
+ max_parallel: int | None = None,
69
+ timeout: int | None = None,
70
+ executor_callable: t.Callable[[HookDefinition], t.Awaitable[HookResult]]
71
+ | None = None,
72
+ ) -> list[HookResult]:
73
+ """Execute hooks in parallel with resource limits.
74
+
75
+ Args:
76
+ hooks: List of hook definitions to execute
77
+ max_parallel: Optional override for max concurrent executions
78
+ timeout: Optional override for default timeout
79
+ executor_callable: Async function that executes a single hook
80
+
81
+ Returns:
82
+ List of HookResult objects (same order as input hooks)
83
+ """
84
+ if not hooks:
85
+ logger.debug("No hooks to execute")
86
+ return []
87
+
88
+ max_par = max_parallel or self.max_parallel
89
+ timeout_sec = timeout or self.default_timeout
90
+
91
+ # Create fresh semaphore for this execution
92
+ self.semaphore = asyncio.Semaphore(max_par)
93
+
94
+ logger.info(
95
+ "Starting parallel execution",
96
+ extra={
97
+ "hook_count": len(hooks),
98
+ "max_parallel": max_par,
99
+ "timeout": timeout_sec,
100
+ },
101
+ )
102
+
103
+ async def execute_with_limit(hook: HookDefinition) -> HookResult:
104
+ """Execute hook with semaphore and timeout."""
105
+ async with self.semaphore: # type: ignore
106
+ try:
107
+ hook_timeout = hook.timeout or timeout_sec
108
+ logger.debug(
109
+ f"Executing hook {hook.name}",
110
+ extra={
111
+ "hook": hook.name,
112
+ "timeout": hook_timeout,
113
+ },
114
+ )
115
+
116
+ if executor_callable:
117
+ result = await asyncio.wait_for(
118
+ executor_callable(hook), timeout=hook_timeout
119
+ )
120
+ else:
121
+ # Placeholder if no executor provided
122
+ result = self._placeholder_result(hook)
123
+
124
+ logger.debug(
125
+ f"Hook {hook.name} completed",
126
+ extra={
127
+ "hook": hook.name,
128
+ "status": result.status,
129
+ "duration": result.duration,
130
+ },
131
+ )
132
+ return result
133
+
134
+ except TimeoutError:
135
+ logger.warning(
136
+ f"Hook {hook.name} timed out",
137
+ extra={
138
+ "hook": hook.name,
139
+ "timeout": hook_timeout,
140
+ },
141
+ )
142
+ return HookResult(
143
+ id=hook.name,
144
+ name=hook.name,
145
+ status="timeout",
146
+ duration=hook_timeout,
147
+ issues_found=[f"Hook timed out after {hook_timeout}s"],
148
+ )
149
+ except Exception as e:
150
+ logger.error(
151
+ f"Hook {hook.name} raised exception",
152
+ extra={
153
+ "hook": hook.name,
154
+ "exception": str(e),
155
+ "exception_type": type(e).__name__,
156
+ },
157
+ )
158
+ return HookResult(
159
+ id=hook.name,
160
+ name=hook.name,
161
+ status="error",
162
+ duration=0.0,
163
+ issues_found=[f"Exception: {type(e).__name__}: {e}"],
164
+ )
165
+
166
+ # Create tasks for all hooks
167
+ tasks = [execute_with_limit(hook) for hook in hooks]
168
+
169
+ # Execute all tasks concurrently
170
+ results = await asyncio.gather(*tasks, return_exceptions=True)
171
+
172
+ # Handle any unexpected exceptions (shouldn't happen due to try/except above)
173
+ final_results = []
174
+ for hook, result in zip(hooks, results):
175
+ if isinstance(result, HookResult):
176
+ final_results.append(result)
177
+ else:
178
+ logger.error(
179
+ "Unexpected exception from gather",
180
+ extra={
181
+ "hook": hook.name,
182
+ "exception": str(result),
183
+ "exception_type": type(result).__name__,
184
+ },
185
+ )
186
+ final_results.append(self._error_result(hook, result))
187
+
188
+ logger.info(
189
+ "Parallel execution complete",
190
+ extra={
191
+ "total_hooks": len(final_results),
192
+ "passed": sum(1 for r in final_results if r.status == "passed"),
193
+ "failed": sum(1 for r in final_results if r.status == "failed"),
194
+ "errors": sum(
195
+ 1 for r in final_results if r.status in ("timeout", "error")
196
+ ),
197
+ },
198
+ )
199
+
200
+ return final_results
201
+
202
+ def get_execution_order(
203
+ self,
204
+ hooks: list[HookDefinition],
205
+ ) -> list[list[HookDefinition]]:
206
+ """Return batches of hooks for execution.
207
+
208
+ Parallel strategy can execute all hooks in a single batch.
209
+
210
+ Args:
211
+ hooks: List of hook definitions
212
+
213
+ Returns:
214
+ List containing one batch with all hooks
215
+ """
216
+ return [hooks] if hooks else []
217
+
218
+ def _placeholder_result(self, hook: HookDefinition) -> HookResult:
219
+ """Create placeholder result when no executor provided."""
220
+ return HookResult(
221
+ id=hook.name,
222
+ name=hook.name,
223
+ status="passed",
224
+ duration=0.0,
225
+ issues_found=[], # Initialize with empty list to match expected format
226
+ files_processed=0,
227
+ )
228
+
229
+ def _error_result(self, hook: HookDefinition, error: BaseException) -> HookResult:
230
+ """Create error HookResult from exception."""
231
+ return HookResult(
232
+ id=hook.name,
233
+ name=hook.name,
234
+ status="error",
235
+ duration=0.0,
236
+ issues_found=[f"Exception: {type(error).__name__}: {error}"],
237
+ )
@@ -0,0 +1,299 @@
1
+ """Sequential execution strategy for hook orchestration.
2
+
3
+ Implements one-at-a-time hook execution with support for early exit on
4
+ critical failures and dependency ordering.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import asyncio
10
+ import logging
11
+ import typing as t
12
+
13
+ from crackerjack.config.hooks import HookDefinition, SecurityLevel
14
+ from crackerjack.models.task import HookResult
15
+
16
+ # Module-level logger
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ class SequentialExecutionStrategy:
21
+ """Sequential execution strategy for dependent hooks.
22
+
23
+ Features:
24
+ - One-at-a-time execution (respects dependencies)
25
+ - Early exit on critical security failures
26
+ - Per-hook timeout handling
27
+ - Comprehensive logging for debugging
28
+
29
+ Use when:
30
+ - Hooks have dependencies (gitleaks → bandit)
31
+ - Resource constraints require sequential execution
32
+ - Debugging requires isolated execution
33
+ - Critical failures should stop the pipeline
34
+
35
+ Example:
36
+ ```python
37
+ strategy = SequentialExecutionStrategy()
38
+ results = await strategy.execute(hooks=[hook1, hook2, hook3], timeout=300)
39
+ ```
40
+ """
41
+
42
+ def __init__(
43
+ self,
44
+ default_timeout: int = 300,
45
+ stop_on_critical_failure: bool = True,
46
+ ) -> None:
47
+ """Initialize sequential execution strategy.
48
+
49
+ Args:
50
+ default_timeout: Default timeout per hook in seconds
51
+ stop_on_critical_failure: Stop execution if critical hook fails
52
+ """
53
+ self.default_timeout = default_timeout
54
+ self.stop_on_critical_failure = stop_on_critical_failure
55
+
56
+ logger.debug(
57
+ "SequentialExecutionStrategy initialized",
58
+ extra={
59
+ "default_timeout": default_timeout,
60
+ "stop_on_critical_failure": stop_on_critical_failure,
61
+ },
62
+ )
63
+
64
+ async def execute(
65
+ self,
66
+ hooks: list[HookDefinition],
67
+ max_parallel: int | None = None, # Ignored for sequential
68
+ timeout: int | None = None,
69
+ executor_callable: t.Callable[[HookDefinition], t.Awaitable[HookResult]]
70
+ | None = None,
71
+ ) -> list[HookResult]:
72
+ """Execute hooks sequentially.
73
+
74
+ Args:
75
+ hooks: List of hook definitions to execute
76
+ max_parallel: Ignored (kept for protocol compatibility)
77
+ timeout: Optional override for default timeout
78
+ executor_callable: Async function that executes a single hook
79
+
80
+ Returns:
81
+ List of HookResult objects (may be partial if early exit)
82
+ """
83
+ if not hooks:
84
+ logger.debug("No hooks to execute")
85
+ return []
86
+
87
+ timeout_sec = timeout or self.default_timeout
88
+ self._log_execution_start(hooks, timeout_sec)
89
+
90
+ results = []
91
+ for idx, hook in enumerate(hooks, 1):
92
+ result = await self._execute_single_hook(
93
+ hook, idx, len(hooks), timeout_sec, executor_callable
94
+ )
95
+ results.append(result)
96
+
97
+ if self._should_stop_execution(hook, result):
98
+ self._log_early_exit(hook, results, hooks)
99
+ break
100
+
101
+ self._log_execution_complete(results, hooks)
102
+ return results
103
+
104
+ def _log_execution_start(
105
+ self, hooks: list[HookDefinition], timeout_sec: int
106
+ ) -> None:
107
+ """Log sequential execution start information."""
108
+ logger.info(
109
+ "Starting sequential execution",
110
+ extra={
111
+ "hook_count": len(hooks),
112
+ "timeout": timeout_sec,
113
+ "stop_on_critical_failure": self.stop_on_critical_failure,
114
+ },
115
+ )
116
+
117
+ async def _execute_single_hook(
118
+ self,
119
+ hook: HookDefinition,
120
+ idx: int,
121
+ total_hooks: int,
122
+ timeout_sec: int,
123
+ executor_callable: t.Callable[[HookDefinition], t.Awaitable[HookResult]] | None,
124
+ ) -> HookResult:
125
+ """Execute a single hook with error handling."""
126
+ try:
127
+ hook_timeout = hook.timeout or timeout_sec
128
+ self._log_hook_execution(hook, idx, total_hooks, hook_timeout)
129
+
130
+ result = await self._run_hook(hook, hook_timeout, executor_callable)
131
+ self._log_hook_completion(hook, result)
132
+ return result
133
+
134
+ except TimeoutError:
135
+ return self._handle_timeout(hook, hook.timeout or timeout_sec)
136
+ except Exception as e:
137
+ return self._handle_exception(hook, e)
138
+
139
+ def _log_hook_execution(
140
+ self, hook: HookDefinition, idx: int, total_hooks: int, hook_timeout: int
141
+ ) -> None:
142
+ """Log hook execution start."""
143
+ logger.debug(
144
+ f"Executing hook {idx}/{total_hooks}: {hook.name}",
145
+ extra={
146
+ "hook": hook.name,
147
+ "hook_index": idx,
148
+ "total_hooks": total_hooks,
149
+ "timeout": hook_timeout,
150
+ "security_level": hook.security_level.value,
151
+ },
152
+ )
153
+
154
+ async def _run_hook(
155
+ self,
156
+ hook: HookDefinition,
157
+ hook_timeout: int,
158
+ executor_callable: t.Callable[[HookDefinition], t.Awaitable[HookResult]] | None,
159
+ ) -> HookResult:
160
+ """Run hook with executor or return placeholder."""
161
+ if executor_callable:
162
+ return await asyncio.wait_for(executor_callable(hook), timeout=hook_timeout)
163
+ return self._placeholder_result(hook)
164
+
165
+ def _log_hook_completion(self, hook: HookDefinition, result: HookResult) -> None:
166
+ """Log hook execution completion."""
167
+ logger.debug(
168
+ f"Hook {hook.name} completed",
169
+ extra={
170
+ "hook": hook.name,
171
+ "status": result.status,
172
+ "duration": result.duration,
173
+ },
174
+ )
175
+
176
+ def _handle_timeout(self, hook: HookDefinition, hook_timeout: int) -> HookResult:
177
+ """Handle hook timeout error."""
178
+ logger.warning(
179
+ f"Hook {hook.name} timed out",
180
+ extra={
181
+ "hook": hook.name,
182
+ "timeout": hook_timeout,
183
+ },
184
+ )
185
+ return HookResult(
186
+ id=hook.name,
187
+ name=hook.name,
188
+ status="timeout",
189
+ duration=hook_timeout,
190
+ issues_found=[f"Hook timed out after {hook_timeout}s"],
191
+ )
192
+
193
+ def _handle_exception(
194
+ self, hook: HookDefinition, exception: Exception
195
+ ) -> HookResult:
196
+ """Handle hook execution exception."""
197
+ logger.error(
198
+ f"Hook {hook.name} raised exception",
199
+ extra={
200
+ "hook": hook.name,
201
+ "exception": str(exception),
202
+ "exception_type": type(exception).__name__,
203
+ },
204
+ )
205
+ return HookResult(
206
+ id=hook.name,
207
+ name=hook.name,
208
+ status="error",
209
+ duration=0.0,
210
+ issues_found=[f"Exception: {type(exception).__name__}: {exception}"],
211
+ )
212
+
213
+ def _log_early_exit(
214
+ self,
215
+ hook: HookDefinition,
216
+ results: list[HookResult],
217
+ hooks: list[HookDefinition],
218
+ ) -> None:
219
+ """Log early exit due to critical failure."""
220
+ remaining_hooks = len(hooks) - len(results)
221
+ logger.warning(
222
+ f"Critical hook {hook.name} failed, stopping execution",
223
+ extra={
224
+ "hook": hook.name,
225
+ "security_level": hook.security_level.value,
226
+ "executed_hooks": len(results),
227
+ "remaining_hooks": remaining_hooks,
228
+ },
229
+ )
230
+
231
+ def _log_execution_complete(
232
+ self, results: list[HookResult], hooks: list[HookDefinition]
233
+ ) -> None:
234
+ """Log sequential execution completion."""
235
+ logger.info(
236
+ "Sequential execution complete",
237
+ extra={
238
+ "total_hooks": len(results),
239
+ "executed": len(results),
240
+ "skipped": len(hooks) - len(results),
241
+ "passed": sum(1 for r in results if r.status == "passed"),
242
+ "failed": sum(1 for r in results if r.status == "failed"),
243
+ "errors": sum(1 for r in results if r.status in ("timeout", "error")),
244
+ },
245
+ )
246
+
247
+ def get_execution_order(
248
+ self,
249
+ hooks: list[HookDefinition],
250
+ ) -> list[list[HookDefinition]]:
251
+ """Return batches of hooks for execution.
252
+
253
+ Sequential strategy returns one hook per batch.
254
+
255
+ Args:
256
+ hooks: List of hook definitions
257
+
258
+ Returns:
259
+ List of batches, each containing one hook
260
+ """
261
+ return [[hook] for hook in hooks]
262
+
263
+ def _should_stop_execution(
264
+ self,
265
+ hook: HookDefinition,
266
+ result: HookResult,
267
+ ) -> bool:
268
+ """Determine if execution should stop based on hook result.
269
+
270
+ Early exit conditions:
271
+ - stop_on_critical_failure is True
272
+ - Hook security level is CRITICAL
273
+ - Result status is failed, timeout, or error
274
+
275
+ Args:
276
+ hook: Hook definition that was executed
277
+ result: Result from hook execution
278
+
279
+ Returns:
280
+ True if execution should stop, False otherwise
281
+ """
282
+ if not self.stop_on_critical_failure:
283
+ return False
284
+
285
+ is_critical = hook.security_level == SecurityLevel.CRITICAL
286
+ is_failure = result.status in ("failed", "timeout", "error")
287
+
288
+ return is_critical and is_failure
289
+
290
+ def _placeholder_result(self, hook: HookDefinition) -> HookResult:
291
+ """Create placeholder result when no executor provided."""
292
+ return HookResult(
293
+ id=hook.name,
294
+ name=hook.name,
295
+ status="passed",
296
+ duration=0.0,
297
+ issues_found=[], # Initialize with empty list to match expected format
298
+ files_processed=0,
299
+ )