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,19 @@
1
+ from .core_tools import register_core_tools
2
+ from .execution_tools import register_execution_tools
3
+ from .intelligence_tool_registry import register_intelligence_tools
4
+ from .monitoring_tools import register_monitoring_tools
5
+ from .proactive_tools import register_proactive_tools
6
+ from .progress_tools import register_progress_tools
7
+ from .semantic_tools import register_semantic_tools
8
+ from .utility_tools import register_utility_tools
9
+
10
+ __all__ = [
11
+ "register_core_tools",
12
+ "register_execution_tools",
13
+ "register_intelligence_tools",
14
+ "register_monitoring_tools",
15
+ "register_progress_tools",
16
+ "register_proactive_tools",
17
+ "register_semantic_tools",
18
+ "register_utility_tools",
19
+ ]
@@ -0,0 +1,469 @@
1
+ import typing as t
2
+
3
+ from acb.depends import depends
4
+
5
+ from crackerjack.config import CrackerjackSettings
6
+ from crackerjack.mcp.context import MCPServerContext, get_context
7
+ from crackerjack.mcp.rate_limiter import RateLimitMiddleware
8
+ from crackerjack.services.input_validator import (
9
+ SecureInputValidator,
10
+ get_input_validator,
11
+ )
12
+
13
+ if t.TYPE_CHECKING:
14
+ from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
15
+
16
+
17
+ async def create_task_with_subagent(
18
+ description: str,
19
+ prompt: str,
20
+ subagent_type: str,
21
+ ) -> dict[str, t.Any]:
22
+ try:
23
+ validator = get_input_validator()
24
+
25
+ desc_result = validator.validate_command_args(description)
26
+ if not desc_result.valid:
27
+ return {
28
+ "success": False,
29
+ "error": f"Invalid description: {desc_result.error_message}",
30
+ "validation_type": desc_result.validation_type,
31
+ }
32
+
33
+ prompt_result = validator.validate_command_args(prompt)
34
+ if not prompt_result.valid:
35
+ return {
36
+ "success": False,
37
+ "error": f"Invalid prompt: {prompt_result.error_message}",
38
+ "validation_type": prompt_result.validation_type,
39
+ }
40
+
41
+ subagent_result = validator.sanitizer.sanitize_string(
42
+ subagent_type, max_length=100, strict_alphanumeric=True
43
+ )
44
+ if not subagent_result.valid:
45
+ return {
46
+ "success": False,
47
+ "error": f"Invalid subagent_type: {subagent_result.error_message}",
48
+ "validation_type": subagent_result.validation_type,
49
+ }
50
+
51
+ sanitized_description = desc_result.sanitized_value or description
52
+ sanitized_prompt = prompt_result.sanitized_value or prompt
53
+ sanitized_subagent = subagent_result.sanitized_value
54
+
55
+ result = {
56
+ "success": True,
57
+ "description": sanitized_description,
58
+ "prompt": sanitized_prompt,
59
+ "subagent_type": sanitized_subagent,
60
+ "result": f"Task would be executed by {sanitized_subagent}: {sanitized_prompt[:100]}...",
61
+ "agent_type": "user"
62
+ if sanitized_subagent
63
+ not in ("general-purpose", "statusline-setup", "output-style-setup")
64
+ else "system",
65
+ }
66
+
67
+ return result
68
+
69
+ except Exception as e:
70
+ return {
71
+ "success": False,
72
+ "error": f"Task creation failed: {e}",
73
+ "description": description,
74
+ "subagent_type": subagent_type,
75
+ }
76
+
77
+
78
+ async def _validate_stage_request(
79
+ context: MCPServerContext | None, rate_limiter: RateLimitMiddleware | None
80
+ ) -> str | None:
81
+ if not context:
82
+ return '{"error": "Server context not available", "success": false}'
83
+
84
+ if rate_limiter and hasattr(rate_limiter, "check_request_allowed"):
85
+ allowed, details = await rate_limiter.check_request_allowed()
86
+ if not allowed:
87
+ return f'{{"error": "Rate limit exceeded: {details.get("reason", "unknown")}", "success": false}}'
88
+ return None
89
+
90
+
91
+ def _parse_stage_args(args: str, kwargs: str) -> tuple[str, dict[str, t.Any]] | str:
92
+ try:
93
+ validator = get_input_validator()
94
+
95
+ stage_validation = _validate_stage_argument(validator, args)
96
+ if isinstance(stage_validation, str):
97
+ return stage_validation
98
+ stage = stage_validation
99
+
100
+ kwargs_validation = _validate_kwargs_argument(validator, kwargs)
101
+ if isinstance(kwargs_validation, str):
102
+ return kwargs_validation
103
+ extra_kwargs = kwargs_validation
104
+
105
+ return stage, extra_kwargs
106
+
107
+ except Exception as e:
108
+ return f'{{"error": "Stage argument parsing failed: {e}", "success": false}}'
109
+
110
+
111
+ def _validate_stage_argument(validator: SecureInputValidator, args: str) -> str:
112
+ stage_result = validator.sanitizer.sanitize_string(
113
+ args.strip(), max_length=50, strict_alphanumeric=True
114
+ )
115
+ if not stage_result.valid:
116
+ return f'{{"error": "Invalid stage argument: {stage_result.error_message}", "success": false}}'
117
+
118
+ stage: str = str(stage_result.sanitized_value).lower()
119
+ valid_stages = {"fast", "comprehensive", "tests", "cleaning", "init"}
120
+
121
+ if stage not in valid_stages:
122
+ return f'{{"error": "Invalid stage: {stage}. Valid stages: {valid_stages}", "success": false}}'
123
+
124
+ return stage
125
+
126
+
127
+ def _validate_kwargs_argument(
128
+ validator: SecureInputValidator, kwargs: str
129
+ ) -> dict[str, t.Any] | str:
130
+ extra_kwargs: dict[str, t.Any] = {}
131
+ if not kwargs.strip():
132
+ return extra_kwargs
133
+
134
+ kwargs_result = validator.validate_json_payload(kwargs.strip())
135
+ if not kwargs_result.valid:
136
+ return f'{{"error": "Invalid JSON in kwargs: {kwargs_result.error_message}", "success": false}}'
137
+
138
+ extra_kwargs = kwargs_result.sanitized_value
139
+
140
+ if not isinstance(extra_kwargs, dict):
141
+ return f'{{"error": "kwargs must be a JSON object, got {type(extra_kwargs).__name__}", "success": false}}'
142
+
143
+ return extra_kwargs
144
+
145
+
146
+ def _configure_stage_options(stage: str) -> CrackerjackSettings:
147
+ """Configure settings for a specific stage using ACB dependency injection.
148
+
149
+ Note: Returns a copy of global settings with stage-specific overrides.
150
+ The global settings remain unchanged.
151
+ """
152
+ # Get base settings from DI
153
+ base_settings = depends.get_sync(CrackerjackSettings)
154
+
155
+ # Create a new settings instance with stage-specific values
156
+ # We copy the base settings and override specific fields
157
+ settings_dict = base_settings.model_dump()
158
+
159
+ if stage in {"fast", "comprehensive"}:
160
+ settings_dict["skip_hooks"] = False
161
+ elif stage == "tests":
162
+ settings_dict["run_tests"] = (
163
+ True # Note: field renamed from 'test' to 'run_tests'
164
+ )
165
+ elif stage == "cleaning":
166
+ settings_dict["clean"] = True
167
+ elif stage == "init":
168
+ settings_dict["skip_hooks"] = True
169
+
170
+ return CrackerjackSettings(**settings_dict)
171
+
172
+
173
+ def _execute_stage(
174
+ orchestrator: "WorkflowOrchestrator", stage: str, settings: CrackerjackSettings
175
+ ) -> bool:
176
+ # Convert CrackerjackSettings to OptionsProtocol
177
+ adapted_options = _adapt_settings_to_protocol(settings)
178
+
179
+ if stage == "fast":
180
+ return orchestrator.run_fast_hooks_only(adapted_options)
181
+ if stage == "comprehensive":
182
+ return orchestrator.run_comprehensive_hooks_only(adapted_options)
183
+ if stage == "tests":
184
+ return orchestrator.run_testing_phase(adapted_options)
185
+ if stage == "cleaning":
186
+ return orchestrator.run_cleaning_phase(adapted_options)
187
+ return False
188
+
189
+
190
+ def _adapt_settings_to_protocol(settings: CrackerjackSettings) -> t.Any:
191
+ """Adapt CrackerjackSettings to match OptionsProtocol."""
192
+ return _AdaptedOptions(settings) # type: ignore
193
+
194
+
195
+ class _AdaptedOptions:
196
+ """Adapter class to convert CrackerjackSettings to OptionsProtocol.
197
+
198
+ Since CrackerjackSettings uses flat field structure, this adapter
199
+ is much simpler than the old nested WorkflowOptions version.
200
+ """
201
+
202
+ def __init__(self, settings: CrackerjackSettings):
203
+ self.settings = settings
204
+
205
+ # Git properties
206
+ @property
207
+ def commit(self) -> bool:
208
+ return self.settings.commit
209
+
210
+ @property
211
+ def create_pr(self) -> bool:
212
+ return self.settings.create_pr
213
+
214
+ # Execution properties
215
+ @property
216
+ def interactive(self) -> bool:
217
+ return self.settings.interactive
218
+
219
+ @property
220
+ def no_config_updates(self) -> bool:
221
+ return self.settings.no_config_updates
222
+
223
+ @property
224
+ def verbose(self) -> bool:
225
+ return self.settings.verbose
226
+
227
+ @property
228
+ def async_mode(self) -> bool:
229
+ return self.settings.async_mode
230
+
231
+ # Testing properties
232
+ @property
233
+ def test(self) -> bool:
234
+ return self.settings.run_tests # Note: Field renamed in CrackerjackSettings
235
+
236
+ @property
237
+ def benchmark(self) -> bool:
238
+ return self.settings.benchmark
239
+
240
+ @property
241
+ def test_workers(self) -> int:
242
+ return self.settings.test_workers
243
+
244
+ @property
245
+ def test_timeout(self) -> int:
246
+ return self.settings.test_timeout
247
+
248
+ # Publishing properties
249
+ @property
250
+ def publish(self) -> t.Any | None:
251
+ return self.settings.publish_version
252
+
253
+ @property
254
+ def bump(self) -> t.Any | None:
255
+ return self.settings.bump_version
256
+
257
+ @property
258
+ def all(self) -> t.Any | None:
259
+ return self.settings.all_workflow
260
+
261
+ @property
262
+ def no_git_tags(self) -> bool:
263
+ return self.settings.no_git_tags
264
+
265
+ @property
266
+ def skip_version_check(self) -> bool:
267
+ return self.settings.skip_version_check
268
+
269
+ # AI properties
270
+ @property
271
+ def ai_agent(self) -> bool:
272
+ return self.settings.ai_agent
273
+
274
+ @property
275
+ def start_mcp_server(self) -> bool:
276
+ return self.settings.start_mcp_server
277
+
278
+ # Hook properties
279
+ @property
280
+ def skip_hooks(self) -> bool:
281
+ return self.settings.skip_hooks
282
+
283
+ @property
284
+ def update_precommit(self) -> bool:
285
+ return self.settings.update_precommit
286
+
287
+ @property
288
+ def experimental_hooks(self) -> bool:
289
+ return self.settings.experimental_hooks
290
+
291
+ @property
292
+ def enable_pyrefly(self) -> bool:
293
+ return self.settings.enable_pyrefly
294
+
295
+ @property
296
+ def enable_ty(self) -> bool:
297
+ return self.settings.enable_ty
298
+
299
+ # Cleaning properties
300
+ @property
301
+ def clean(self) -> bool:
302
+ return self.settings.clean
303
+
304
+ # Progress properties
305
+ @property
306
+ def track_progress(self) -> bool:
307
+ return self.settings.progress_enabled
308
+
309
+ # Default/static properties (not in settings, keep defaults)
310
+ @property
311
+ def cleanup(self) -> t.Any | None:
312
+ return None
313
+
314
+ @property
315
+ def cleanup_pypi(self) -> bool:
316
+ return False
317
+
318
+ @property
319
+ def coverage(self) -> bool:
320
+ return self.settings.coverage_enabled
321
+
322
+ @property
323
+ def keep_releases(self) -> int:
324
+ return 10
325
+
326
+ @property
327
+ def fast(self) -> bool:
328
+ return False
329
+
330
+
331
+ from acb.console import Console
332
+ from acb.depends import Inject
333
+
334
+ from crackerjack.services.filesystem import FileSystemService
335
+ from crackerjack.services.git import GitService
336
+ from crackerjack.services.initialization import InitializationService
337
+
338
+
339
+ def _execute_init_stage(
340
+ orchestrator: "WorkflowOrchestrator", console: Inject[Console]
341
+ ) -> bool:
342
+ try:
343
+ from pathlib import Path
344
+
345
+ pkg_path = orchestrator.pkg_path
346
+
347
+ filesystem = FileSystemService()
348
+ git_service = GitService(pkg_path)
349
+
350
+ init_service = InitializationService(filesystem, git_service, pkg_path)
351
+
352
+ results = init_service.initialize_project_full(target_path=Path.cwd())
353
+
354
+ success_result: bool = bool(results.get("success", False))
355
+ return success_result
356
+
357
+ except Exception as e:
358
+ if hasattr(orchestrator, "console"):
359
+ orchestrator.console.print(f"[red]❌[/ red] Initialization failed: {e}")
360
+ return False
361
+
362
+
363
+ def register_core_tools(mcp_app: t.Any) -> None:
364
+ @mcp_app.tool() # type: ignore[misc]
365
+ async def run_crackerjack_stage(args: str, kwargs: str) -> str:
366
+ context = get_context()
367
+ rate_limiter = context.rate_limiter if context else None
368
+
369
+ validation_error = await _validate_stage_request(context, rate_limiter)
370
+ if validation_error:
371
+ return validation_error
372
+
373
+ try:
374
+ from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
375
+
376
+ parse_result = _parse_stage_args(args, kwargs)
377
+ if isinstance(parse_result, str):
378
+ return parse_result
379
+
380
+ stage, extra_kwargs = parse_result
381
+
382
+ orchestrator = WorkflowOrchestrator(
383
+ console=context.console,
384
+ pkg_path=context.config.project_path,
385
+ dry_run=extra_kwargs.get("dry_run", False),
386
+ )
387
+
388
+ options = _configure_stage_options(stage)
389
+ success = _execute_stage(orchestrator, stage, options)
390
+
391
+ return f'{{"success": {str(success).lower()}, "stage": "{stage}"}}'
392
+
393
+ except Exception as e:
394
+ context.safe_print(f"Error executing stage {args}: {e}")
395
+ return f'{{"error": "Stage execution failed: {e}", "success": false}}'
396
+
397
+
398
+ def _get_error_patterns() -> list[tuple[str, str]]:
399
+ return [
400
+ ("type_error", r"TypeError: | type object .* has no attribute"),
401
+ ("import_error", r"ImportError: | ModuleNotFoundError: "),
402
+ ("attribute_error", r"AttributeError: "),
403
+ ("syntax_error", r"SyntaxError: | invalid syntax"),
404
+ ("test_failure", r"FAILED | AssertionError: "),
405
+ ("hook_failure", r"hook .* failed"),
406
+ ]
407
+
408
+
409
+ def _get_error_suggestion(error_type: str) -> str:
410
+ suggestions = {
411
+ "type_error": "Check type annotations and ensure proper imports",
412
+ "import_error": "Verify module exists and is properly installed",
413
+ "test_failure": "Review test assertions and expected behavior",
414
+ "hook_failure": "Run hooks individually to identify specific failures",
415
+ }
416
+ return suggestions.get(error_type) or "No specific suggestion available"
417
+
418
+
419
+ def _detect_errors_and_suggestions(
420
+ text: str,
421
+ include_suggestions: bool,
422
+ ) -> tuple[list[str], list[str]]:
423
+ import re
424
+
425
+ detected_errors: list[str] = []
426
+ suggestions: list[str] = []
427
+
428
+ for error_type, pattern in _get_error_patterns():
429
+ if re.search(pattern, text, re.IGNORECASE):
430
+ detected_errors.append(error_type)
431
+ if include_suggestions:
432
+ suggestions.append(_get_error_suggestion(error_type))
433
+
434
+ return detected_errors, suggestions
435
+
436
+
437
+ def register_analyze_errors_tool(mcp_app: t.Any) -> None:
438
+ @mcp_app.tool() # type: ignore[misc]
439
+ async def analyze_errors(output: str = "", include_suggestions: bool = True) -> str:
440
+ context = get_context()
441
+ if not context:
442
+ return '{"error": "Server context not available"}'
443
+
444
+ try:
445
+ from crackerjack.services.debug import get_ai_agent_debugger
446
+
447
+ debugger = get_ai_agent_debugger()
448
+ if not debugger.enabled:
449
+ return '{"analysis": "Debugging not enabled", "suggestions": []}'
450
+
451
+ analysis_text = output or "No specific output provided"
452
+ detected_errors, suggestions = _detect_errors_and_suggestions(
453
+ analysis_text,
454
+ include_suggestions,
455
+ )
456
+
457
+ result = {
458
+ "analysis": f"Detected {len(detected_errors)} error types",
459
+ "error_types": detected_errors,
460
+ "suggestions": suggestions if include_suggestions else [],
461
+ "raw_output_length": len(analysis_text),
462
+ }
463
+
464
+ import json
465
+
466
+ return json.dumps(result, indent=2)
467
+
468
+ except Exception as e:
469
+ return f'{{"error": "Error analysis failed: {e}"}}'