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,276 @@
1
+ import asyncio
2
+ import typing as t
3
+ from contextlib import suppress
4
+ from dataclasses import dataclass
5
+ from pathlib import Path
6
+
7
+ from acb import console
8
+ from fastapi import FastAPI, WebSocket, WebSocketDisconnect
9
+
10
+ from crackerjack.core.timeout_manager import TimeoutStrategy, get_timeout_manager
11
+
12
+ from .jobs import JobManager
13
+
14
+ # console imported from acb
15
+
16
+
17
+ # Phase 9.4: WebSocket Security Configuration
18
+ @dataclass
19
+ class WebSocketSecurityConfig:
20
+ """Security configuration for WebSocket connections.
21
+
22
+ Phase 9.4: Enhanced security hardening for MCP WebSocket server.
23
+ """
24
+
25
+ # Message limits
26
+ max_message_size: int = 1024 * 1024 # 1MB max message size
27
+ max_messages_per_connection: int = 10000 # Max messages before forcing reconnect
28
+ max_concurrent_connections: int = 100 # Limit concurrent WebSocket connections
29
+
30
+ # Origin validation (localhost only for MCP)
31
+ allowed_origins: set[str] | None = None # None = allow all (default for local dev)
32
+
33
+ # Rate limiting
34
+ messages_per_second: int = 100 # Max messages per second per connection
35
+
36
+ def __post_init__(self) -> None:
37
+ """Initialize allowed origins with secure defaults."""
38
+ if self.allowed_origins is None:
39
+ # Default: only allow localhost connections
40
+ self.allowed_origins = {
41
+ "http://localhost",
42
+ "http://127.0.0.1",
43
+ "https://localhost",
44
+ "https://127.0.0.1",
45
+ }
46
+
47
+ def validate_origin(self, origin: str | None) -> bool:
48
+ """Validate WebSocket origin header.
49
+
50
+ Args:
51
+ origin: Origin header value
52
+
53
+ Returns:
54
+ True if origin is allowed, False otherwise
55
+ """
56
+ if not origin:
57
+ # Allow connections without origin (local tools)
58
+ return True
59
+
60
+ # Check against allowed origins
61
+ for allowed in self.allowed_origins or set():
62
+ if origin.startswith(allowed):
63
+ return True
64
+
65
+ console.print(
66
+ f"[red]Rejected WebSocket connection from unauthorized origin: {origin}[/red]"
67
+ )
68
+ return False
69
+
70
+
71
+ class WebSocketHandler:
72
+ def __init__(
73
+ self,
74
+ job_manager: JobManager,
75
+ progress_dir: Path,
76
+ security_config: WebSocketSecurityConfig | None = None,
77
+ event_bridge: t.Any | None = None, # EventBusWebSocketBridge from DI
78
+ ) -> None:
79
+ self.job_manager = job_manager
80
+ self.progress_dir = progress_dir
81
+ self.timeout_manager = get_timeout_manager()
82
+ self.security_config = security_config or WebSocketSecurityConfig()
83
+ self.event_bridge = event_bridge
84
+ self._connection_count = 0
85
+
86
+ async def handle_connection(self, websocket: WebSocket, job_id: str) -> None:
87
+ # Phase 9.4: Security validations
88
+ if not self.job_manager.validate_job_id(job_id):
89
+ await websocket.close(code=1008, reason="Invalid job ID")
90
+ return
91
+
92
+ # Check origin header
93
+ origin = websocket.headers.get("origin")
94
+ if not self.security_config.validate_origin(origin):
95
+ await websocket.close(code=1008, reason="Unauthorized origin")
96
+ return
97
+
98
+ # Check connection limit
99
+ if self._connection_count >= self.security_config.max_concurrent_connections:
100
+ await websocket.close(code=1008, reason="Connection limit reached")
101
+ console.print(
102
+ f"[yellow]Connection limit reached: {self._connection_count}[/yellow]"
103
+ )
104
+ return
105
+
106
+ try:
107
+ async with self.timeout_manager.timeout_context(
108
+ "websocket_connection",
109
+ timeout=3600.0,
110
+ strategy=TimeoutStrategy.GRACEFUL_DEGRADATION,
111
+ ):
112
+ await self._establish_connection(websocket, job_id)
113
+ await self._send_initial_progress(websocket, job_id)
114
+ await self._handle_message_loop(websocket, job_id)
115
+
116
+ except TimeoutError:
117
+ await self._handle_timeout_error(websocket, job_id)
118
+ except WebSocketDisconnect:
119
+ console.print(f"[yellow]WebSocket disconnected for job: {job_id}[/yellow]")
120
+ except Exception as e:
121
+ await self._handle_connection_error(websocket, job_id, e)
122
+ finally:
123
+ await self._cleanup_connection(job_id, websocket)
124
+
125
+ async def _establish_connection(self, websocket: WebSocket, job_id: str) -> None:
126
+ await websocket.accept()
127
+ self._connection_count += 1 # Phase 9.4: Track concurrent connections
128
+ self.job_manager.add_connection(job_id, websocket)
129
+
130
+ # Phase 7.3: Register client with event bridge for real-time updates
131
+ if self.event_bridge:
132
+ await self.event_bridge.register_client(job_id, websocket)
133
+
134
+ console.print(
135
+ f"[green]WebSocket connected for job: {job_id} (connections: {self._connection_count})[/green]"
136
+ )
137
+
138
+ async def _send_initial_progress(self, websocket: WebSocket, job_id: str) -> None:
139
+ try:
140
+ async with self.timeout_manager.timeout_context(
141
+ "websocket_broadcast",
142
+ timeout=5.0,
143
+ strategy=TimeoutStrategy.FAIL_FAST,
144
+ ):
145
+ initial_progress = self.job_manager.get_job_progress(job_id)
146
+ if initial_progress:
147
+ await websocket.send_json(initial_progress)
148
+ else:
149
+ await websocket.send_json(
150
+ self._create_initial_progress_message(job_id)
151
+ )
152
+ except Exception as e:
153
+ console.print(
154
+ f"[red]Failed to send initial progress for {job_id}: {e}[/red]"
155
+ )
156
+
157
+ def _create_initial_progress_message(self, job_id: str) -> dict[str, t.Any]:
158
+ return {
159
+ "job_id": job_id,
160
+ "status": "waiting",
161
+ "message": "Waiting for job to start...",
162
+ "overall_progress": 0,
163
+ "iteration": 0,
164
+ "max_iterations": 10,
165
+ "current_stage": "Initializing",
166
+ }
167
+
168
+ async def _handle_message_loop(self, websocket: WebSocket, job_id: str) -> None:
169
+ message_count = 0
170
+ max_messages = (
171
+ self.security_config.max_messages_per_connection
172
+ ) # Phase 9.4: Use config
173
+
174
+ while message_count < max_messages:
175
+ try:
176
+ should_continue = await self._process_single_message(
177
+ websocket, job_id, message_count + 1
178
+ )
179
+ if not should_continue:
180
+ break
181
+ message_count += 1
182
+ except (TimeoutError, WebSocketDisconnect, Exception):
183
+ break
184
+
185
+ if message_count >= max_messages:
186
+ console.print(
187
+ f"[yellow]WebSocket connection limit reached for {job_id}: {max_messages} messages[/yellow]"
188
+ )
189
+
190
+ async def _process_single_message(
191
+ self, websocket: WebSocket, job_id: str, message_count: int
192
+ ) -> bool:
193
+ try:
194
+ async with self.timeout_manager.timeout_context(
195
+ "websocket_message",
196
+ timeout=30.0,
197
+ strategy=TimeoutStrategy.FAIL_FAST,
198
+ ):
199
+ data = await asyncio.wait_for(
200
+ websocket.receive_text(),
201
+ timeout=25.0,
202
+ )
203
+
204
+ console.print(
205
+ f"[blue]Received message {message_count} for {job_id}: {data[:100]}...[/blue]",
206
+ )
207
+
208
+ await asyncio.wait_for(
209
+ websocket.send_json(
210
+ {
211
+ "type": "echo",
212
+ "message": f"Received: {data}",
213
+ "job_id": job_id,
214
+ "message_count": message_count,
215
+ }
216
+ ),
217
+ timeout=5.0,
218
+ )
219
+
220
+ return True
221
+
222
+ except TimeoutError:
223
+ console.print(
224
+ f"[yellow]Message timeout for {job_id} after {message_count} messages[/yellow]"
225
+ )
226
+ return False
227
+ except WebSocketDisconnect:
228
+ console.print(f"[yellow]WebSocket disconnected for job: {job_id}[/yellow]")
229
+ return False
230
+ except Exception as e:
231
+ console.print(f"[red]WebSocket message error for job {job_id}: {e}[/red]")
232
+ return False
233
+
234
+ async def _handle_timeout_error(self, websocket: WebSocket, job_id: str) -> None:
235
+ console.print(
236
+ f"[yellow]WebSocket connection timeout for job: {job_id}[/yellow]"
237
+ )
238
+ with suppress(Exception):
239
+ await websocket.close(code=1001, reason="Connection timeout")
240
+
241
+ async def _handle_connection_error(
242
+ self, websocket: WebSocket, job_id: str, error: Exception
243
+ ) -> None:
244
+ console.print(f"[red]WebSocket error for job {job_id}: {error}[/red]")
245
+ with suppress(Exception):
246
+ await websocket.close(code=1011, reason="Internal error")
247
+
248
+ async def _cleanup_connection(self, job_id: str, websocket: WebSocket) -> None:
249
+ try:
250
+ self.job_manager.remove_connection(job_id, websocket)
251
+
252
+ # Phase 7.3: Unregister client from event bridge
253
+ if self.event_bridge:
254
+ await self.event_bridge.unregister_client(job_id, websocket)
255
+
256
+ self._connection_count = max(
257
+ 0, self._connection_count - 1
258
+ ) # Phase 9.4: Decrement count
259
+ console.print(
260
+ f"[yellow]WebSocket disconnected for job: {job_id} (connections: {self._connection_count})[/yellow]"
261
+ )
262
+ except Exception as e:
263
+ console.print(f"[red]Error removing connection for {job_id}: {e}[/red]")
264
+
265
+
266
+ def register_websocket_routes(
267
+ app: FastAPI,
268
+ job_manager: JobManager,
269
+ progress_dir: Path,
270
+ event_bridge: t.Any | None = None, # EventBusWebSocketBridge from DI
271
+ ) -> None:
272
+ handler = WebSocketHandler(job_manager, progress_dir, event_bridge=event_bridge)
273
+
274
+ @app.websocket("/ws/progress/{job_id}")
275
+ async def websocket_progress_endpoint(websocket: WebSocket, job_id: str) -> None:
276
+ await handler.handle_connection(websocket, job_id)
@@ -0,0 +1,10 @@
1
+ from .websocket import WebSocketServer, main
2
+
3
+ __all__ = ["WebSocketServer", "main"]
4
+
5
+
6
+ if __name__ == "__main__":
7
+ import sys
8
+
9
+ port = int(sys.argv[1]) if len(sys.argv) > 1 else 8675
10
+ main(port)
@@ -0,0 +1,308 @@
1
+ # Models
2
+
3
+ > Crackerjack Docs: [Main](<../../README.md>) | [CLAUDE.md](../../docs/guides/CLAUDE.md) | [Models](<./README.md>)
4
+
5
+ Data models, schemas, and protocol definitions for the Crackerjack architecture.
6
+
7
+ ## Overview
8
+
9
+ The models package provides the foundational data structures and protocol-based interfaces that define Crackerjack's architecture. The **protocol-based dependency injection (DI) pattern** is the most critical architectural pattern in Crackerjack, enabling loose coupling, testability, and clean separation of concerns.
10
+
11
+ ## Key Components
12
+
13
+ ### protocols.py - THE MOST CRITICAL FILE
14
+
15
+ **This is the heart of Crackerjack's architecture.** Always import protocols from here, never concrete classes.
16
+
17
+ **Core Service Protocols:**
18
+
19
+ - `ServiceProtocol` - Base protocol for all ACB services with lifecycle management
20
+ - `Console` (ConsoleInterface) - Rich console output interface
21
+ - `TestManagerProtocol` - Test execution and coverage management
22
+ - `HookManager` / `SecurityAwareHookManager` - Pre-commit hook orchestration
23
+ - `CoverageRatchetProtocol` - Coverage baseline tracking
24
+ - `SecurityServiceProtocol` - Security validation and secret detection
25
+
26
+ **Configuration & File System:**
27
+
28
+ - `UnifiedConfigurationServiceProtocol` - Centralized configuration access
29
+ - `FileSystemServiceProtocol` / `EnhancedFileSystemServiceProtocol` - File operations
30
+ - `GitServiceProtocol` / `GitInterface` - Git repository interactions
31
+ - `SmartFileFilterProtocol` - Intelligent file filtering
32
+
33
+ **Quality Assurance:**
34
+
35
+ - `QAAdapterProtocol` - Base protocol for all QA check adapters
36
+ - `QAOrchestratorProtocol` - QA check coordination and execution
37
+
38
+ **Hook Orchestration (Phase 3):**
39
+
40
+ - `ExecutionStrategyProtocol` - Hook execution strategies (parallel/sequential/adaptive)
41
+ - `CacheStrategyProtocol` - Result caching strategies
42
+ - `HookOrchestratorProtocol` - Hook lifecycle and dependency resolution
43
+
44
+ **Performance & Monitoring:**
45
+
46
+ - `PerformanceMonitorProtocol` - Workflow performance tracking
47
+ - `PerformanceBenchmarkProtocol` / `PerformanceBenchmarkServiceProtocol` - Benchmarking
48
+ - `MemoryOptimizerProtocol` - Memory optimization tracking
49
+ - `PerformanceCacheProtocol` - Performance result caching
50
+
51
+ **Agent System (Phase 4):**
52
+
53
+ - `AgentCoordinatorProtocol` - AI agent coordination and issue routing
54
+ - `AgentTrackerProtocol` - Agent execution metrics tracking
55
+ - `AgentDebuggerProtocol` - Agent debugging and activity logging
56
+
57
+ **Orchestration:**
58
+
59
+ - `ServiceWatchdogProtocol` - Service health monitoring and restart
60
+ - `TimeoutManagerProtocol` - Centralized timeout management
61
+ - `ParallelExecutorProtocol` / `ParallelHookExecutorProtocol` - Parallel task execution
62
+ - `AsyncCommandExecutorProtocol` - Async command execution with caching
63
+
64
+ **Publishing & Documentation:**
65
+
66
+ - `PublishManager` - Package publishing and versioning
67
+ - `DocumentationServiceProtocol` - Automated documentation generation
68
+ - `APIExtractorProtocol` / `DocumentationGeneratorProtocol` / `DocumentationValidatorProtocol` - Doc tooling
69
+
70
+ ### Configuration Models
71
+
72
+ **qa_config.py** - Quality assurance configuration:
73
+
74
+ - `QACheckConfig` - Configuration for individual QA checks
75
+ - Check-specific settings (file patterns, timeouts, retries)
76
+ - Pydantic validation for type safety
77
+
78
+ **config.py** - Core configuration models:
79
+
80
+ - Project-wide configuration structures
81
+ - ACB Settings integration
82
+ - Environment-specific overrides
83
+
84
+ **config_adapter.py** - Configuration adapters:
85
+
86
+ - Bridges between different configuration formats
87
+ - Legacy config migration support
88
+
89
+ ### Result Models
90
+
91
+ **qa_results.py** - Quality assurance results:
92
+
93
+ - `QAResult` - Individual check results
94
+ - `QACheckType` - Enumeration of check types
95
+ - Result aggregation structures
96
+
97
+ **results.py** - Execution results:
98
+
99
+ - `ExecutionResult` - Individual execution outcomes
100
+ - `ParallelExecutionResult` - Parallel execution aggregation
101
+ - Performance metrics and timing data
102
+
103
+ **task.py** - Task and hook models:
104
+
105
+ - `HookResult` - Pre-commit hook execution results
106
+ - `SessionTracker` - Session metadata and task tracking
107
+ - Task lifecycle management
108
+
109
+ ### Specialized Models
110
+
111
+ **semantic_models.py** - Semantic analysis models:
112
+
113
+ - Code comprehension structures
114
+ - Semantic analysis results
115
+ - Intelligent refactoring support
116
+
117
+ **resource_protocols.py** - Resource management protocols:
118
+
119
+ - Resource lifecycle interfaces
120
+ - Resource cleanup coordination
121
+
122
+ ## THE MOST CRITICAL PATTERN: Protocol-Based Dependency Injection
123
+
124
+ ### Gold Standard Usage
125
+
126
+ ```python
127
+ # ✅ CORRECT - Always import protocols from models/protocols.py
128
+ from acb.depends import depends, Inject
129
+ from crackerjack.models.protocols import (
130
+ Console,
131
+ TestManagerProtocol,
132
+ SecurityServiceProtocol,
133
+ )
134
+
135
+
136
+ @depends.inject
137
+ def setup_environment(
138
+ console: Inject[Console] = None,
139
+ test_manager: Inject[TestManagerProtocol] = None,
140
+ security: Inject[SecurityServiceProtocol] = None,
141
+ ) -> None:
142
+ """All functions use @depends.inject with protocol-based dependencies."""
143
+ console.print("[green]Environment configured[/green]")
144
+ test_manager.validate_test_environment()
145
+ security.validate_file_safety("/path/to/file")
146
+
147
+
148
+ class MyCoordinator:
149
+ @depends.inject
150
+ def __init__(
151
+ self,
152
+ console: Inject[Console],
153
+ test_manager: Inject[TestManagerProtocol],
154
+ ) -> None:
155
+ """Perfect DI integration with protocol-based dependencies."""
156
+ self.console = console
157
+ self.test_manager = test_manager
158
+ ```
159
+
160
+ ### Anti-Patterns to Avoid
161
+
162
+ ```python
163
+ # ❌ WRONG - Direct class imports (BREAKS ARCHITECTURE)
164
+ from crackerjack.managers.test_manager import TestManager
165
+ from rich.console import Console as RichConsole
166
+
167
+ # ❌ WRONG - Manual fallbacks bypass DI
168
+ self.console = console or Console()
169
+ self.cache = cache or CrackerjackCache()
170
+
171
+ # ❌ WRONG - Factory functions bypass DI
172
+ self.tracker = get_agent_tracker()
173
+ self.timeout_manager = get_timeout_manager()
174
+
175
+ # ❌ WRONG - Direct service instantiation
176
+ self.logger = logging.getLogger(__name__)
177
+ ```
178
+
179
+ ## Why Protocol-Based DI?
180
+
181
+ 1. **Loose Coupling**: Depend on interfaces, not implementations
182
+ 1. **Testability**: Easy to mock with protocol implementations
183
+ 1. **Flexibility**: Swap implementations without changing dependents
184
+ 1. **Type Safety**: Runtime type checking via `@runtime_checkable`
185
+ 1. **Clear Contracts**: Protocol defines exact interface requirements
186
+ 1. **ACB Integration**: Seamless integration with ACB dependency injection
187
+
188
+ ## Usage Examples
189
+
190
+ ### Using Protocols for Type Hints
191
+
192
+ ```python
193
+ from crackerjack.models.protocols import Console, FileSystemServiceProtocol
194
+
195
+
196
+ def process_files(
197
+ console: Console,
198
+ fs: FileSystemServiceProtocol,
199
+ paths: list[Path],
200
+ ) -> bool:
201
+ """Process files with protocol-based dependencies."""
202
+ for path in paths:
203
+ if fs.exists(path):
204
+ content = fs.read_file(path)
205
+ console.print(f"Processing {path}")
206
+ return True
207
+ ```
208
+
209
+ ### Creating Protocol Implementations
210
+
211
+ ```python
212
+ import typing as t
213
+ from crackerjack.models.protocols import ServiceProtocol
214
+
215
+
216
+ @t.runtime_checkable
217
+ class MyServiceProtocol(ServiceProtocol, t.Protocol):
218
+ """Custom service protocol extending base ServiceProtocol."""
219
+
220
+ def custom_operation(self, data: str) -> bool:
221
+ """Custom operation for this service."""
222
+ ...
223
+
224
+
225
+ class MyService:
226
+ """Concrete implementation of MyServiceProtocol."""
227
+
228
+ def initialize(self) -> None:
229
+ """Initialize service."""
230
+ pass
231
+
232
+ def cleanup(self) -> None:
233
+ """Cleanup resources."""
234
+ pass
235
+
236
+ def health_check(self) -> bool:
237
+ """Health check."""
238
+ return True
239
+
240
+ # ... implement all ServiceProtocol methods ...
241
+
242
+ def custom_operation(self, data: str) -> bool:
243
+ """Implementation of custom operation."""
244
+ return True
245
+ ```
246
+
247
+ ### Dependency Injection Integration
248
+
249
+ ```python
250
+ from acb.depends import depends
251
+ from crackerjack.models.protocols import Console, TestManagerProtocol
252
+
253
+ # Register concrete implementation
254
+ depends.set(Console, MyConsoleImplementation())
255
+ depends.set(TestManagerProtocol, MyTestManager())
256
+
257
+
258
+ # Inject in functions/classes
259
+ @depends.inject
260
+ def my_function(
261
+ console: Console = depends(),
262
+ test_manager: TestManagerProtocol = depends(),
263
+ ) -> None:
264
+ """Function with automatic dependency injection."""
265
+ console.print("Running tests...")
266
+ test_manager.run_tests(options)
267
+ ```
268
+
269
+ ## Configuration
270
+
271
+ Models use **Pydantic** for validation and type safety:
272
+
273
+ ```python
274
+ from pydantic import BaseModel, Field
275
+
276
+
277
+ class MyConfig(BaseModel):
278
+ """Example configuration model."""
279
+
280
+ timeout: int = Field(default=300, gt=0, description="Timeout in seconds")
281
+ enabled: bool = Field(default=True, description="Enable feature")
282
+ patterns: list[str] = Field(default_factory=list, description="File patterns")
283
+ ```
284
+
285
+ ## Best Practices
286
+
287
+ 1. **ALWAYS Import Protocols**: Never import concrete classes for dependencies
288
+ 1. **Use @runtime_checkable**: Mark all protocols with `@runtime_checkable`
289
+ 1. **Extend ServiceProtocol**: Base all service protocols on `ServiceProtocol`
290
+ 1. **Use Inject[T]**: Use `Inject[ProtocolType]` type hints for DI parameters
291
+ 1. **Validate with Pydantic**: Use Pydantic models for configuration validation
292
+ 1. **Document Protocols**: Add comprehensive docstrings to protocol methods
293
+ 1. **Type Annotate Everything**: Use Python 3.13+ type hints (`|` unions)
294
+
295
+ ## Related Documentation
296
+
297
+ - [CLAUDE.md](../../docs/guides/CLAUDE.md) - Architecture patterns and DI guidelines
298
+ - [Managers](<../managers/README.md>) - Protocol implementations
299
+ - [Services](<../services/README.md>) - Service layer implementations
300
+ - [Core](<../core/README.md>) - Coordinators and orchestration
301
+ - [COVERAGE_POLICY.md](<../../docs/reference/COVERAGE_POLICY.md>) - Testing requirements
302
+
303
+ ## Future Enhancements
304
+
305
+ - Phase 5: Additional agent system protocols
306
+ - Enhanced validation protocols for AI agent fixes
307
+ - Extended performance monitoring protocols
308
+ - Advanced caching strategy protocols
@@ -0,0 +1,40 @@
1
+ from .config import (
2
+ AIConfig,
3
+ CleaningConfig,
4
+ CleanupConfig,
5
+ ExecutionConfig,
6
+ GitConfig,
7
+ HookConfig,
8
+ ProgressConfig,
9
+ PublishConfig,
10
+ TestConfig,
11
+ WorkflowOptions,
12
+ )
13
+ from .protocols import OptionsProtocol, QAAdapterProtocol, QAOrchestratorProtocol
14
+ from .qa_config import QACheckConfig, QAOrchestratorConfig
15
+ from .qa_results import QACheckType, QAResult, QAResultStatus
16
+ from .task import HookResult, SessionTracker, TaskStatus
17
+
18
+ __all__ = [
19
+ "AIConfig",
20
+ "CleaningConfig",
21
+ "CleanupConfig",
22
+ "ExecutionConfig",
23
+ "GitConfig",
24
+ "HookConfig",
25
+ "HookResult",
26
+ "OptionsProtocol",
27
+ "ProgressConfig",
28
+ "PublishConfig",
29
+ "QAAdapterProtocol",
30
+ "QACheckConfig",
31
+ "QACheckType",
32
+ "QAOrchestratorConfig",
33
+ "QAOrchestratorProtocol",
34
+ "QAResult",
35
+ "QAResultStatus",
36
+ "SessionTracker",
37
+ "TaskStatus",
38
+ "TestConfig",
39
+ "WorkflowOptions",
40
+ ]