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.
- crackerjack/README.md +19 -0
- crackerjack/__init__.py +96 -2
- crackerjack/__main__.py +637 -138
- crackerjack/adapters/README.md +18 -0
- crackerjack/adapters/__init__.py +39 -0
- crackerjack/adapters/_output_paths.py +167 -0
- crackerjack/adapters/_qa_adapter_base.py +309 -0
- crackerjack/adapters/_tool_adapter_base.py +706 -0
- crackerjack/adapters/ai/README.md +65 -0
- crackerjack/adapters/ai/__init__.py +5 -0
- crackerjack/adapters/ai/claude.py +853 -0
- crackerjack/adapters/complexity/README.md +53 -0
- crackerjack/adapters/complexity/__init__.py +10 -0
- crackerjack/adapters/complexity/complexipy.py +641 -0
- crackerjack/adapters/dependency/__init__.py +22 -0
- crackerjack/adapters/dependency/pip_audit.py +418 -0
- crackerjack/adapters/format/README.md +72 -0
- crackerjack/adapters/format/__init__.py +11 -0
- crackerjack/adapters/format/mdformat.py +313 -0
- crackerjack/adapters/format/ruff.py +516 -0
- crackerjack/adapters/lint/README.md +47 -0
- crackerjack/adapters/lint/__init__.py +11 -0
- crackerjack/adapters/lint/codespell.py +273 -0
- crackerjack/adapters/lsp/README.md +49 -0
- crackerjack/adapters/lsp/__init__.py +27 -0
- crackerjack/adapters/lsp/_base.py +194 -0
- crackerjack/adapters/lsp/_client.py +358 -0
- crackerjack/adapters/lsp/_manager.py +193 -0
- crackerjack/adapters/lsp/skylos.py +283 -0
- crackerjack/adapters/lsp/zuban.py +557 -0
- crackerjack/adapters/refactor/README.md +59 -0
- crackerjack/adapters/refactor/__init__.py +12 -0
- crackerjack/adapters/refactor/creosote.py +318 -0
- crackerjack/adapters/refactor/refurb.py +406 -0
- crackerjack/adapters/refactor/skylos.py +494 -0
- crackerjack/adapters/sast/README.md +132 -0
- crackerjack/adapters/sast/__init__.py +32 -0
- crackerjack/adapters/sast/_base.py +201 -0
- crackerjack/adapters/sast/bandit.py +423 -0
- crackerjack/adapters/sast/pyscn.py +405 -0
- crackerjack/adapters/sast/semgrep.py +241 -0
- crackerjack/adapters/security/README.md +111 -0
- crackerjack/adapters/security/__init__.py +17 -0
- crackerjack/adapters/security/gitleaks.py +339 -0
- crackerjack/adapters/type/README.md +52 -0
- crackerjack/adapters/type/__init__.py +12 -0
- crackerjack/adapters/type/pyrefly.py +402 -0
- crackerjack/adapters/type/ty.py +402 -0
- crackerjack/adapters/type/zuban.py +522 -0
- crackerjack/adapters/utility/README.md +51 -0
- crackerjack/adapters/utility/__init__.py +10 -0
- crackerjack/adapters/utility/checks.py +884 -0
- crackerjack/agents/README.md +264 -0
- crackerjack/agents/__init__.py +66 -0
- crackerjack/agents/architect_agent.py +238 -0
- crackerjack/agents/base.py +167 -0
- crackerjack/agents/claude_code_bridge.py +641 -0
- crackerjack/agents/coordinator.py +600 -0
- crackerjack/agents/documentation_agent.py +520 -0
- crackerjack/agents/dry_agent.py +585 -0
- crackerjack/agents/enhanced_coordinator.py +279 -0
- crackerjack/agents/enhanced_proactive_agent.py +185 -0
- crackerjack/agents/error_middleware.py +53 -0
- crackerjack/agents/formatting_agent.py +230 -0
- crackerjack/agents/helpers/__init__.py +9 -0
- crackerjack/agents/helpers/performance/__init__.py +22 -0
- crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
- crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
- crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
- crackerjack/agents/helpers/refactoring/__init__.py +22 -0
- crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
- crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
- crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
- crackerjack/agents/helpers/test_creation/__init__.py +19 -0
- crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
- crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
- crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
- crackerjack/agents/import_optimization_agent.py +1181 -0
- crackerjack/agents/performance_agent.py +325 -0
- crackerjack/agents/performance_helpers.py +205 -0
- crackerjack/agents/proactive_agent.py +55 -0
- crackerjack/agents/refactoring_agent.py +511 -0
- crackerjack/agents/refactoring_helpers.py +247 -0
- crackerjack/agents/security_agent.py +793 -0
- crackerjack/agents/semantic_agent.py +479 -0
- crackerjack/agents/semantic_helpers.py +356 -0
- crackerjack/agents/test_creation_agent.py +570 -0
- crackerjack/agents/test_specialist_agent.py +526 -0
- crackerjack/agents/tracker.py +110 -0
- crackerjack/api.py +647 -0
- crackerjack/cli/README.md +394 -0
- crackerjack/cli/__init__.py +24 -0
- crackerjack/cli/cache_handlers.py +209 -0
- crackerjack/cli/cache_handlers_enhanced.py +680 -0
- crackerjack/cli/facade.py +162 -0
- crackerjack/cli/formatting.py +13 -0
- crackerjack/cli/handlers/__init__.py +85 -0
- crackerjack/cli/handlers/advanced.py +103 -0
- crackerjack/cli/handlers/ai_features.py +62 -0
- crackerjack/cli/handlers/analytics.py +479 -0
- crackerjack/cli/handlers/changelog.py +271 -0
- crackerjack/cli/handlers/config_handlers.py +16 -0
- crackerjack/cli/handlers/coverage.py +84 -0
- crackerjack/cli/handlers/documentation.py +280 -0
- crackerjack/cli/handlers/main_handlers.py +497 -0
- crackerjack/cli/handlers/monitoring.py +371 -0
- crackerjack/cli/handlers.py +700 -0
- crackerjack/cli/interactive.py +488 -0
- crackerjack/cli/options.py +1216 -0
- crackerjack/cli/semantic_handlers.py +292 -0
- crackerjack/cli/utils.py +19 -0
- crackerjack/cli/version.py +19 -0
- crackerjack/code_cleaner.py +1307 -0
- crackerjack/config/README.md +472 -0
- crackerjack/config/__init__.py +275 -0
- crackerjack/config/global_lock_config.py +207 -0
- crackerjack/config/hooks.py +390 -0
- crackerjack/config/loader.py +239 -0
- crackerjack/config/settings.py +141 -0
- crackerjack/config/tool_commands.py +331 -0
- crackerjack/core/README.md +393 -0
- crackerjack/core/__init__.py +0 -0
- crackerjack/core/async_workflow_orchestrator.py +738 -0
- crackerjack/core/autofix_coordinator.py +282 -0
- crackerjack/core/container.py +105 -0
- crackerjack/core/enhanced_container.py +583 -0
- crackerjack/core/file_lifecycle.py +472 -0
- crackerjack/core/performance.py +244 -0
- crackerjack/core/performance_monitor.py +357 -0
- crackerjack/core/phase_coordinator.py +1227 -0
- crackerjack/core/proactive_workflow.py +267 -0
- crackerjack/core/resource_manager.py +425 -0
- crackerjack/core/retry.py +275 -0
- crackerjack/core/service_watchdog.py +601 -0
- crackerjack/core/session_coordinator.py +239 -0
- crackerjack/core/timeout_manager.py +563 -0
- crackerjack/core/websocket_lifecycle.py +410 -0
- crackerjack/core/workflow/__init__.py +21 -0
- crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
- crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
- crackerjack/core/workflow/workflow_issue_parser.py +714 -0
- crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
- crackerjack/core/workflow/workflow_security_gates.py +400 -0
- crackerjack/core/workflow_orchestrator.py +2243 -0
- crackerjack/data/README.md +11 -0
- crackerjack/data/__init__.py +8 -0
- crackerjack/data/models.py +79 -0
- crackerjack/data/repository.py +210 -0
- crackerjack/decorators/README.md +180 -0
- crackerjack/decorators/__init__.py +35 -0
- crackerjack/decorators/error_handling.py +649 -0
- crackerjack/decorators/error_handling_decorators.py +334 -0
- crackerjack/decorators/helpers.py +58 -0
- crackerjack/decorators/patterns.py +281 -0
- crackerjack/decorators/utils.py +58 -0
- crackerjack/docs/INDEX.md +11 -0
- crackerjack/docs/README.md +11 -0
- crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
- crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
- crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
- crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
- crackerjack/docs/generated/api/SERVICES.md +1252 -0
- crackerjack/documentation/README.md +11 -0
- crackerjack/documentation/__init__.py +31 -0
- crackerjack/documentation/ai_templates.py +756 -0
- crackerjack/documentation/dual_output_generator.py +767 -0
- crackerjack/documentation/mkdocs_integration.py +518 -0
- crackerjack/documentation/reference_generator.py +1065 -0
- crackerjack/dynamic_config.py +678 -0
- crackerjack/errors.py +378 -0
- crackerjack/events/README.md +11 -0
- crackerjack/events/__init__.py +16 -0
- crackerjack/events/telemetry.py +175 -0
- crackerjack/events/workflow_bus.py +346 -0
- crackerjack/exceptions/README.md +301 -0
- crackerjack/exceptions/__init__.py +5 -0
- crackerjack/exceptions/config.py +4 -0
- crackerjack/exceptions/tool_execution_error.py +245 -0
- crackerjack/executors/README.md +591 -0
- crackerjack/executors/__init__.py +13 -0
- crackerjack/executors/async_hook_executor.py +938 -0
- crackerjack/executors/cached_hook_executor.py +316 -0
- crackerjack/executors/hook_executor.py +1295 -0
- crackerjack/executors/hook_lock_manager.py +708 -0
- crackerjack/executors/individual_hook_executor.py +739 -0
- crackerjack/executors/lsp_aware_hook_executor.py +349 -0
- crackerjack/executors/progress_hook_executor.py +282 -0
- crackerjack/executors/tool_proxy.py +433 -0
- crackerjack/hooks/README.md +485 -0
- crackerjack/hooks/lsp_hook.py +93 -0
- crackerjack/intelligence/README.md +557 -0
- crackerjack/intelligence/__init__.py +37 -0
- crackerjack/intelligence/adaptive_learning.py +693 -0
- crackerjack/intelligence/agent_orchestrator.py +485 -0
- crackerjack/intelligence/agent_registry.py +377 -0
- crackerjack/intelligence/agent_selector.py +439 -0
- crackerjack/intelligence/integration.py +250 -0
- crackerjack/interactive.py +719 -0
- crackerjack/managers/README.md +369 -0
- crackerjack/managers/__init__.py +11 -0
- crackerjack/managers/async_hook_manager.py +135 -0
- crackerjack/managers/hook_manager.py +585 -0
- crackerjack/managers/publish_manager.py +631 -0
- crackerjack/managers/test_command_builder.py +391 -0
- crackerjack/managers/test_executor.py +474 -0
- crackerjack/managers/test_manager.py +1357 -0
- crackerjack/managers/test_progress.py +187 -0
- crackerjack/mcp/README.md +374 -0
- crackerjack/mcp/__init__.py +0 -0
- crackerjack/mcp/cache.py +352 -0
- crackerjack/mcp/client_runner.py +121 -0
- crackerjack/mcp/context.py +802 -0
- crackerjack/mcp/dashboard.py +657 -0
- crackerjack/mcp/enhanced_progress_monitor.py +493 -0
- crackerjack/mcp/file_monitor.py +394 -0
- crackerjack/mcp/progress_components.py +607 -0
- crackerjack/mcp/progress_monitor.py +1016 -0
- crackerjack/mcp/rate_limiter.py +336 -0
- crackerjack/mcp/server.py +24 -0
- crackerjack/mcp/server_core.py +526 -0
- crackerjack/mcp/service_watchdog.py +505 -0
- crackerjack/mcp/state.py +407 -0
- crackerjack/mcp/task_manager.py +259 -0
- crackerjack/mcp/tools/README.md +27 -0
- crackerjack/mcp/tools/__init__.py +19 -0
- crackerjack/mcp/tools/core_tools.py +469 -0
- crackerjack/mcp/tools/error_analyzer.py +283 -0
- crackerjack/mcp/tools/execution_tools.py +384 -0
- crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
- crackerjack/mcp/tools/intelligence_tools.py +264 -0
- crackerjack/mcp/tools/monitoring_tools.py +628 -0
- crackerjack/mcp/tools/proactive_tools.py +367 -0
- crackerjack/mcp/tools/progress_tools.py +222 -0
- crackerjack/mcp/tools/semantic_tools.py +584 -0
- crackerjack/mcp/tools/utility_tools.py +358 -0
- crackerjack/mcp/tools/workflow_executor.py +699 -0
- crackerjack/mcp/websocket/README.md +31 -0
- crackerjack/mcp/websocket/__init__.py +14 -0
- crackerjack/mcp/websocket/app.py +54 -0
- crackerjack/mcp/websocket/endpoints.py +492 -0
- crackerjack/mcp/websocket/event_bridge.py +188 -0
- crackerjack/mcp/websocket/jobs.py +406 -0
- crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
- crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
- crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
- crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
- crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
- crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
- crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
- crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
- crackerjack/mcp/websocket/monitoring/factory.py +109 -0
- crackerjack/mcp/websocket/monitoring/filters.py +10 -0
- crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
- crackerjack/mcp/websocket/monitoring/models.py +90 -0
- crackerjack/mcp/websocket/monitoring/utils.py +171 -0
- crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
- crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
- crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
- crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
- crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
- crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
- crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
- crackerjack/mcp/websocket/server.py +174 -0
- crackerjack/mcp/websocket/websocket_handler.py +276 -0
- crackerjack/mcp/websocket_server.py +10 -0
- crackerjack/models/README.md +308 -0
- crackerjack/models/__init__.py +40 -0
- crackerjack/models/config.py +730 -0
- crackerjack/models/config_adapter.py +265 -0
- crackerjack/models/protocols.py +1535 -0
- crackerjack/models/pydantic_models.py +320 -0
- crackerjack/models/qa_config.py +145 -0
- crackerjack/models/qa_results.py +134 -0
- crackerjack/models/resource_protocols.py +299 -0
- crackerjack/models/results.py +35 -0
- crackerjack/models/semantic_models.py +258 -0
- crackerjack/models/task.py +173 -0
- crackerjack/models/test_models.py +60 -0
- crackerjack/monitoring/README.md +11 -0
- crackerjack/monitoring/__init__.py +0 -0
- crackerjack/monitoring/ai_agent_watchdog.py +405 -0
- crackerjack/monitoring/metrics_collector.py +427 -0
- crackerjack/monitoring/regression_prevention.py +580 -0
- crackerjack/monitoring/websocket_server.py +406 -0
- crackerjack/orchestration/README.md +340 -0
- crackerjack/orchestration/__init__.py +43 -0
- crackerjack/orchestration/advanced_orchestrator.py +894 -0
- crackerjack/orchestration/cache/README.md +312 -0
- crackerjack/orchestration/cache/__init__.py +37 -0
- crackerjack/orchestration/cache/memory_cache.py +338 -0
- crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
- crackerjack/orchestration/config.py +297 -0
- crackerjack/orchestration/coverage_improvement.py +180 -0
- crackerjack/orchestration/execution_strategies.py +361 -0
- crackerjack/orchestration/hook_orchestrator.py +1398 -0
- crackerjack/orchestration/strategies/README.md +401 -0
- crackerjack/orchestration/strategies/__init__.py +39 -0
- crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
- crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
- crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
- crackerjack/orchestration/test_progress_streamer.py +647 -0
- crackerjack/plugins/README.md +11 -0
- crackerjack/plugins/__init__.py +15 -0
- crackerjack/plugins/base.py +200 -0
- crackerjack/plugins/hooks.py +254 -0
- crackerjack/plugins/loader.py +335 -0
- crackerjack/plugins/managers.py +264 -0
- crackerjack/py313.py +191 -0
- crackerjack/security/README.md +11 -0
- crackerjack/security/__init__.py +0 -0
- crackerjack/security/audit.py +197 -0
- crackerjack/services/README.md +374 -0
- crackerjack/services/__init__.py +9 -0
- crackerjack/services/ai/README.md +295 -0
- crackerjack/services/ai/__init__.py +7 -0
- crackerjack/services/ai/advanced_optimizer.py +878 -0
- crackerjack/services/ai/contextual_ai_assistant.py +542 -0
- crackerjack/services/ai/embeddings.py +444 -0
- crackerjack/services/ai/intelligent_commit.py +328 -0
- crackerjack/services/ai/predictive_analytics.py +510 -0
- crackerjack/services/anomaly_detector.py +392 -0
- crackerjack/services/api_extractor.py +617 -0
- crackerjack/services/backup_service.py +467 -0
- crackerjack/services/bounded_status_operations.py +530 -0
- crackerjack/services/cache.py +369 -0
- crackerjack/services/changelog_automation.py +399 -0
- crackerjack/services/command_execution_service.py +305 -0
- crackerjack/services/config_integrity.py +132 -0
- crackerjack/services/config_merge.py +546 -0
- crackerjack/services/config_service.py +198 -0
- crackerjack/services/config_template.py +493 -0
- crackerjack/services/coverage_badge_service.py +173 -0
- crackerjack/services/coverage_ratchet.py +381 -0
- crackerjack/services/debug.py +733 -0
- crackerjack/services/dependency_analyzer.py +460 -0
- crackerjack/services/dependency_monitor.py +622 -0
- crackerjack/services/documentation_generator.py +493 -0
- crackerjack/services/documentation_service.py +704 -0
- crackerjack/services/enhanced_filesystem.py +497 -0
- crackerjack/services/enterprise_optimizer.py +865 -0
- crackerjack/services/error_pattern_analyzer.py +676 -0
- crackerjack/services/file_filter.py +221 -0
- crackerjack/services/file_hasher.py +149 -0
- crackerjack/services/file_io_service.py +361 -0
- crackerjack/services/file_modifier.py +615 -0
- crackerjack/services/filesystem.py +381 -0
- crackerjack/services/git.py +422 -0
- crackerjack/services/health_metrics.py +615 -0
- crackerjack/services/heatmap_generator.py +744 -0
- crackerjack/services/incremental_executor.py +380 -0
- crackerjack/services/initialization.py +823 -0
- crackerjack/services/input_validator.py +668 -0
- crackerjack/services/intelligent_commit.py +327 -0
- crackerjack/services/log_manager.py +289 -0
- crackerjack/services/logging.py +228 -0
- crackerjack/services/lsp_client.py +628 -0
- crackerjack/services/memory_optimizer.py +414 -0
- crackerjack/services/metrics.py +587 -0
- crackerjack/services/monitoring/README.md +30 -0
- crackerjack/services/monitoring/__init__.py +9 -0
- crackerjack/services/monitoring/dependency_monitor.py +678 -0
- crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
- crackerjack/services/monitoring/health_metrics.py +716 -0
- crackerjack/services/monitoring/metrics.py +587 -0
- crackerjack/services/monitoring/performance_benchmarks.py +410 -0
- crackerjack/services/monitoring/performance_cache.py +388 -0
- crackerjack/services/monitoring/performance_monitor.py +569 -0
- crackerjack/services/parallel_executor.py +527 -0
- crackerjack/services/pattern_cache.py +333 -0
- crackerjack/services/pattern_detector.py +478 -0
- crackerjack/services/patterns/__init__.py +142 -0
- crackerjack/services/patterns/agents.py +107 -0
- crackerjack/services/patterns/code/__init__.py +15 -0
- crackerjack/services/patterns/code/detection.py +118 -0
- crackerjack/services/patterns/code/imports.py +107 -0
- crackerjack/services/patterns/code/paths.py +159 -0
- crackerjack/services/patterns/code/performance.py +119 -0
- crackerjack/services/patterns/code/replacement.py +36 -0
- crackerjack/services/patterns/core.py +212 -0
- crackerjack/services/patterns/documentation/__init__.py +14 -0
- crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
- crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
- crackerjack/services/patterns/documentation/docstrings.py +89 -0
- crackerjack/services/patterns/formatting.py +226 -0
- crackerjack/services/patterns/operations.py +339 -0
- crackerjack/services/patterns/security/__init__.py +23 -0
- crackerjack/services/patterns/security/code_injection.py +122 -0
- crackerjack/services/patterns/security/credentials.py +190 -0
- crackerjack/services/patterns/security/path_traversal.py +221 -0
- crackerjack/services/patterns/security/unsafe_operations.py +216 -0
- crackerjack/services/patterns/templates.py +62 -0
- crackerjack/services/patterns/testing/__init__.py +18 -0
- crackerjack/services/patterns/testing/error_patterns.py +107 -0
- crackerjack/services/patterns/testing/pytest_output.py +126 -0
- crackerjack/services/patterns/tool_output/__init__.py +16 -0
- crackerjack/services/patterns/tool_output/bandit.py +72 -0
- crackerjack/services/patterns/tool_output/other.py +97 -0
- crackerjack/services/patterns/tool_output/pyright.py +67 -0
- crackerjack/services/patterns/tool_output/ruff.py +44 -0
- crackerjack/services/patterns/url_sanitization.py +114 -0
- crackerjack/services/patterns/utilities.py +42 -0
- crackerjack/services/patterns/utils.py +339 -0
- crackerjack/services/patterns/validation.py +46 -0
- crackerjack/services/patterns/versioning.py +62 -0
- crackerjack/services/predictive_analytics.py +523 -0
- crackerjack/services/profiler.py +280 -0
- crackerjack/services/quality/README.md +415 -0
- crackerjack/services/quality/__init__.py +11 -0
- crackerjack/services/quality/anomaly_detector.py +392 -0
- crackerjack/services/quality/pattern_cache.py +333 -0
- crackerjack/services/quality/pattern_detector.py +479 -0
- crackerjack/services/quality/qa_orchestrator.py +491 -0
- crackerjack/services/quality/quality_baseline.py +395 -0
- crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
- crackerjack/services/quality/quality_intelligence.py +949 -0
- crackerjack/services/regex_patterns.py +58 -0
- crackerjack/services/regex_utils.py +483 -0
- crackerjack/services/secure_path_utils.py +524 -0
- crackerjack/services/secure_status_formatter.py +450 -0
- crackerjack/services/secure_subprocess.py +635 -0
- crackerjack/services/security.py +239 -0
- crackerjack/services/security_logger.py +495 -0
- crackerjack/services/server_manager.py +411 -0
- crackerjack/services/smart_scheduling.py +167 -0
- crackerjack/services/status_authentication.py +460 -0
- crackerjack/services/status_security_manager.py +315 -0
- crackerjack/services/terminal_utils.py +0 -0
- crackerjack/services/thread_safe_status_collector.py +441 -0
- crackerjack/services/tool_filter.py +368 -0
- crackerjack/services/tool_version_service.py +43 -0
- crackerjack/services/unified_config.py +115 -0
- crackerjack/services/validation_rate_limiter.py +220 -0
- crackerjack/services/vector_store.py +689 -0
- crackerjack/services/version_analyzer.py +461 -0
- crackerjack/services/version_checker.py +223 -0
- crackerjack/services/websocket_resource_limiter.py +438 -0
- crackerjack/services/zuban_lsp_service.py +391 -0
- crackerjack/slash_commands/README.md +11 -0
- crackerjack/slash_commands/__init__.py +59 -0
- crackerjack/slash_commands/init.md +112 -0
- crackerjack/slash_commands/run.md +197 -0
- crackerjack/slash_commands/status.md +127 -0
- crackerjack/tools/README.md +11 -0
- crackerjack/tools/__init__.py +30 -0
- crackerjack/tools/_git_utils.py +105 -0
- crackerjack/tools/check_added_large_files.py +139 -0
- crackerjack/tools/check_ast.py +105 -0
- crackerjack/tools/check_json.py +103 -0
- crackerjack/tools/check_jsonschema.py +297 -0
- crackerjack/tools/check_toml.py +103 -0
- crackerjack/tools/check_yaml.py +110 -0
- crackerjack/tools/codespell_wrapper.py +72 -0
- crackerjack/tools/end_of_file_fixer.py +202 -0
- crackerjack/tools/format_json.py +128 -0
- crackerjack/tools/mdformat_wrapper.py +114 -0
- crackerjack/tools/trailing_whitespace.py +198 -0
- crackerjack/tools/validate_input_validator_patterns.py +236 -0
- crackerjack/tools/validate_regex_patterns.py +188 -0
- crackerjack/ui/README.md +11 -0
- crackerjack/ui/__init__.py +1 -0
- crackerjack/ui/dashboard_renderer.py +28 -0
- crackerjack/ui/templates/README.md +11 -0
- crackerjack/utils/console_utils.py +13 -0
- crackerjack/utils/dependency_guard.py +230 -0
- crackerjack/utils/retry_utils.py +275 -0
- crackerjack/workflows/README.md +590 -0
- crackerjack/workflows/__init__.py +46 -0
- crackerjack/workflows/actions.py +811 -0
- crackerjack/workflows/auto_fix.py +444 -0
- crackerjack/workflows/container_builder.py +499 -0
- crackerjack/workflows/definitions.py +443 -0
- crackerjack/workflows/engine.py +177 -0
- crackerjack/workflows/event_bridge.py +242 -0
- crackerjack-0.45.2.dist-info/METADATA +1678 -0
- crackerjack-0.45.2.dist-info/RECORD +478 -0
- {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
- crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
- crackerjack/.gitignore +0 -14
- crackerjack/.libcst.codemod.yaml +0 -18
- crackerjack/.pdm.toml +0 -1
- crackerjack/.pre-commit-config.yaml +0 -91
- crackerjack/.pytest_cache/.gitignore +0 -2
- crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
- crackerjack/.pytest_cache/README.md +0 -8
- crackerjack/.pytest_cache/v/cache/nodeids +0 -1
- crackerjack/.pytest_cache/v/cache/stepwise +0 -1
- crackerjack/.ruff_cache/.gitignore +0 -1
- crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
- crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
- crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
- crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
- crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
- crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
- crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
- crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
- crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
- crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
- crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
- crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
- crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
- crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
- crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
- crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
- crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
- crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
- crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
- crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
- crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
- crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
- crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
- crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
- crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
- crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
- crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
- crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
- crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
- crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
- crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
- crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
- crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
- crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
- crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
- crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
- crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
- crackerjack/crackerjack.py +0 -855
- crackerjack/pyproject.toml +0 -214
- crackerjack-0.18.2.dist-info/METADATA +0 -420
- crackerjack-0.18.2.dist-info/RECORD +0 -59
- crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
- {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,767 @@
|
|
|
1
|
+
"""Dual-output documentation system generating both AI and human-readable docs."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import logging
|
|
5
|
+
import typing as t
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import yaml
|
|
11
|
+
from acb import console as acb_console
|
|
12
|
+
from acb.console import Console
|
|
13
|
+
|
|
14
|
+
from crackerjack.agents.coordinator import AgentCoordinator
|
|
15
|
+
from crackerjack.services.cache import CrackerjackCache
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class DocumentationResult:
|
|
22
|
+
"""Results from documentation generation process."""
|
|
23
|
+
|
|
24
|
+
ai_reference: str
|
|
25
|
+
agent_capabilities: dict[str, t.Any]
|
|
26
|
+
error_patterns: dict[str, t.Any]
|
|
27
|
+
readme_enhancements: str
|
|
28
|
+
generation_timestamp: datetime = field(default_factory=datetime.now)
|
|
29
|
+
success: bool = True
|
|
30
|
+
errors: list[str] = field(default_factory=list)
|
|
31
|
+
|
|
32
|
+
def to_dict(self) -> dict[str, t.Any]:
|
|
33
|
+
return {
|
|
34
|
+
"generation_timestamp": self.generation_timestamp.isoformat(),
|
|
35
|
+
"success": self.success,
|
|
36
|
+
"errors": self.errors,
|
|
37
|
+
"outputs": {
|
|
38
|
+
"ai_reference_length": len(self.ai_reference),
|
|
39
|
+
"agent_count": len(self.agent_capabilities.get("agents", {})),
|
|
40
|
+
"error_pattern_count": len(self.error_patterns.get("type_errors", {})),
|
|
41
|
+
"readme_length": len(self.readme_enhancements),
|
|
42
|
+
},
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class DualOutputGenerator:
|
|
47
|
+
"""
|
|
48
|
+
Core documentation system that generates both AI-optimized and human-readable docs.
|
|
49
|
+
|
|
50
|
+
Generates:
|
|
51
|
+
- AI-REFERENCE.md: Command decision trees for AI agents
|
|
52
|
+
- AGENT-CAPABILITIES.json: Structured agent capability data
|
|
53
|
+
- ERROR-PATTERNS.yaml: Automated error resolution patterns
|
|
54
|
+
- Enhanced README.md: Improved human documentation
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
def __init__(
|
|
58
|
+
self,
|
|
59
|
+
project_path: Path | None = None,
|
|
60
|
+
console: Console | None = None,
|
|
61
|
+
cache: CrackerjackCache | None = None,
|
|
62
|
+
):
|
|
63
|
+
self.project_path = project_path or Path.cwd()
|
|
64
|
+
self.console = console or acb_console
|
|
65
|
+
self.cache = cache or CrackerjackCache()
|
|
66
|
+
|
|
67
|
+
# Documentation paths
|
|
68
|
+
self.ai_reference_path = self.project_path / "ai" / "AI-REFERENCE.md"
|
|
69
|
+
self.agent_capabilities_path = (
|
|
70
|
+
self.project_path / "ai" / "AGENT-CAPABILITIES.json"
|
|
71
|
+
)
|
|
72
|
+
self.error_patterns_path = self.project_path / "ai" / "ERROR-PATTERNS.yaml"
|
|
73
|
+
self.readme_path = self.project_path / "README.md"
|
|
74
|
+
|
|
75
|
+
# Generation components
|
|
76
|
+
self.last_generation: DocumentationResult | None = None
|
|
77
|
+
|
|
78
|
+
async def generate_documentation(
|
|
79
|
+
self, update_existing: bool = True, force_regenerate: bool = False
|
|
80
|
+
) -> DocumentationResult:
|
|
81
|
+
"""Generate complete documentation suite for both AI and human consumption."""
|
|
82
|
+
|
|
83
|
+
self.console.print(
|
|
84
|
+
"📚 [bold blue]Starting AI-optimized documentation generation...[/bold blue]"
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
try:
|
|
88
|
+
# Check if regeneration needed
|
|
89
|
+
if not force_regenerate and not self._needs_regeneration():
|
|
90
|
+
self.console.print("✅ Documentation is up to date")
|
|
91
|
+
return self.last_generation or DocumentationResult("", {}, {}, "")
|
|
92
|
+
|
|
93
|
+
# Generate each documentation component
|
|
94
|
+
ai_reference = await self._generate_ai_reference()
|
|
95
|
+
agent_capabilities = await self._generate_agent_capabilities()
|
|
96
|
+
error_patterns = await self._generate_error_patterns()
|
|
97
|
+
readme_enhancements = await self._generate_readme_enhancements()
|
|
98
|
+
|
|
99
|
+
result = DocumentationResult(
|
|
100
|
+
ai_reference=ai_reference,
|
|
101
|
+
agent_capabilities=agent_capabilities,
|
|
102
|
+
error_patterns=error_patterns,
|
|
103
|
+
readme_enhancements=readme_enhancements,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# Write to files if requested
|
|
107
|
+
if update_existing:
|
|
108
|
+
await self._write_documentation_files(result)
|
|
109
|
+
|
|
110
|
+
self.last_generation = result
|
|
111
|
+
self._cache_generation_metadata(result)
|
|
112
|
+
|
|
113
|
+
self.console.print(
|
|
114
|
+
"✅ [bold green]Documentation generation completed successfully![/bold green]"
|
|
115
|
+
)
|
|
116
|
+
return result
|
|
117
|
+
|
|
118
|
+
except Exception as e:
|
|
119
|
+
logger.error(f"Documentation generation failed: {e}")
|
|
120
|
+
self.console.print(f"❌ [red]Documentation generation failed: {e}[/red]")
|
|
121
|
+
return DocumentationResult("", {}, {}, "", success=False, errors=[str(e)])
|
|
122
|
+
|
|
123
|
+
async def _generate_ai_reference(self) -> str:
|
|
124
|
+
"""Generate AI-REFERENCE.md with command decision trees and lookup tables."""
|
|
125
|
+
|
|
126
|
+
self.console.print("🤖 Generating AI reference documentation")
|
|
127
|
+
|
|
128
|
+
# Get current command structure
|
|
129
|
+
from crackerjack.cli.options import CLI_OPTIONS
|
|
130
|
+
|
|
131
|
+
command_matrix = self._build_command_matrix(CLI_OPTIONS)
|
|
132
|
+
decision_trees = self._build_decision_trees()
|
|
133
|
+
troubleshooting_guide = self._build_troubleshooting_guide()
|
|
134
|
+
|
|
135
|
+
ai_reference = f"""# AI-REFERENCE.md
|
|
136
|
+
|
|
137
|
+
**AI-Optimized Reference for Crackerjack Package Architecture and Commands**
|
|
138
|
+
*Generated: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}*
|
|
139
|
+
|
|
140
|
+
This document is specifically structured for AI assistants to quickly understand and operate Crackerjack effectively. All information is presented in parseable formats with clear decision trees and lookup tables.
|
|
141
|
+
|
|
142
|
+
## Quick Command Matrix
|
|
143
|
+
|
|
144
|
+
### Primary Workflows (Most Used)
|
|
145
|
+
|
|
146
|
+
{self._format_command_table(command_matrix["primary"])}
|
|
147
|
+
|
|
148
|
+
### Server Management
|
|
149
|
+
|
|
150
|
+
{self._format_command_table(command_matrix["server"])}
|
|
151
|
+
|
|
152
|
+
### Development Tools
|
|
153
|
+
|
|
154
|
+
{self._format_command_table(command_matrix["development"])}
|
|
155
|
+
|
|
156
|
+
## AI Decision Trees
|
|
157
|
+
|
|
158
|
+
{decision_trees}
|
|
159
|
+
|
|
160
|
+
## Error Resolution Patterns
|
|
161
|
+
|
|
162
|
+
{troubleshooting_guide}
|
|
163
|
+
|
|
164
|
+
## Agent Selection Logic
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
# AI agent selection based on issue type
|
|
168
|
+
AGENT_ROUTING = {{
|
|
169
|
+
"type_error": "RefactoringAgent",
|
|
170
|
+
"complexity": "RefactoringAgent",
|
|
171
|
+
"performance": "PerformanceAgent",
|
|
172
|
+
"security": "SecurityAgent",
|
|
173
|
+
"documentation": "DocumentationAgent",
|
|
174
|
+
"test_failure": "TestCreationAgent",
|
|
175
|
+
"import_error": "ImportOptimizationAgent",
|
|
176
|
+
"formatting": "FormattingAgent",
|
|
177
|
+
"duplication": "DRYAgent"
|
|
178
|
+
}}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Success Metrics
|
|
182
|
+
|
|
183
|
+
- **Coverage Target**: 100% (current baseline varies)
|
|
184
|
+
- **Test Timeout**: 300s default
|
|
185
|
+
- **AI Confidence Threshold**: 0.7 for auto-apply
|
|
186
|
+
- **Max Iterations**: 5 for AI fixing workflows
|
|
187
|
+
- **Hook Retry**: 1 retry for fast hooks only
|
|
188
|
+
|
|
189
|
+
Generated by crackerjack documentation system v{self._get_version()}
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
return ai_reference
|
|
193
|
+
|
|
194
|
+
async def _generate_agent_capabilities(self) -> dict[str, t.Any]:
|
|
195
|
+
"""Generate AGENT-CAPABILITIES.json with structured agent data."""
|
|
196
|
+
|
|
197
|
+
self.console.print("🎯 Generating agent capabilities data")
|
|
198
|
+
|
|
199
|
+
# Initialize agent coordinator to get current agents
|
|
200
|
+
from crackerjack.agents.base import AgentContext
|
|
201
|
+
|
|
202
|
+
context = AgentContext(project_path=self.project_path)
|
|
203
|
+
coordinator = AgentCoordinator(context)
|
|
204
|
+
|
|
205
|
+
try:
|
|
206
|
+
coordinator.initialize_agents()
|
|
207
|
+
agents_data: dict[str, t.Any] = {}
|
|
208
|
+
|
|
209
|
+
for agent in coordinator.agents:
|
|
210
|
+
agent_name = agent.__class__.__name__
|
|
211
|
+
agents_data[agent_name] = {
|
|
212
|
+
"confidence_level": getattr(agent, "confidence_level", 0.8),
|
|
213
|
+
"specializations": self._extract_agent_specializations(agent),
|
|
214
|
+
"input_patterns": self._extract_input_patterns(agent),
|
|
215
|
+
"output_formats": self._extract_output_formats(agent),
|
|
216
|
+
"success_indicators": self._extract_success_indicators(agent),
|
|
217
|
+
"failure_recovery": self._extract_failure_patterns(agent),
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
except Exception as e:
|
|
221
|
+
logger.warning(f"Could not initialize agents for capabilities: {e}")
|
|
222
|
+
agents_data = self._get_fallback_agent_data()
|
|
223
|
+
|
|
224
|
+
capabilities = {
|
|
225
|
+
"metadata": {
|
|
226
|
+
"version": "1.1.0",
|
|
227
|
+
"last_updated": datetime.now().strftime("%Y-%m-%d"),
|
|
228
|
+
"description": "Structured agent capabilities for AI-optimized selection and coordination",
|
|
229
|
+
"total_agents": len(agents_data),
|
|
230
|
+
"coordination_system": "AgentCoordinator with confidence-based routing",
|
|
231
|
+
},
|
|
232
|
+
"agents": agents_data,
|
|
233
|
+
"coordination_rules": {
|
|
234
|
+
"min_confidence": 0.7,
|
|
235
|
+
"max_iterations": 5,
|
|
236
|
+
"parallel_execution": False,
|
|
237
|
+
"fallback_strategy": "RefactoringAgent",
|
|
238
|
+
},
|
|
239
|
+
"performance_metrics": {
|
|
240
|
+
"average_execution_time": "2.3s",
|
|
241
|
+
"success_rate": "89%",
|
|
242
|
+
"cache_hit_rate": "67%",
|
|
243
|
+
},
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return capabilities
|
|
247
|
+
|
|
248
|
+
async def _generate_error_patterns(self) -> dict[str, t.Any]:
|
|
249
|
+
"""Generate ERROR-PATTERNS.yaml with automated error resolution patterns."""
|
|
250
|
+
|
|
251
|
+
self.console.print("🔍 Generating error patterns documentation")
|
|
252
|
+
|
|
253
|
+
# Analyze existing error patterns and common fixes
|
|
254
|
+
patterns = {
|
|
255
|
+
"metadata": {
|
|
256
|
+
"version": "1.1.0",
|
|
257
|
+
"description": "Structured error patterns for AI pattern matching and automated resolution",
|
|
258
|
+
"total_patterns": 52,
|
|
259
|
+
"coverage_areas": [
|
|
260
|
+
"type_errors",
|
|
261
|
+
"security",
|
|
262
|
+
"performance",
|
|
263
|
+
"testing",
|
|
264
|
+
"formatting",
|
|
265
|
+
"imports",
|
|
266
|
+
],
|
|
267
|
+
"success_rate": 0.91,
|
|
268
|
+
},
|
|
269
|
+
"type_errors": self._build_type_error_patterns(),
|
|
270
|
+
"security_issues": self._build_security_patterns(),
|
|
271
|
+
"performance_issues": self._build_performance_patterns(),
|
|
272
|
+
"testing_failures": self._build_testing_patterns(),
|
|
273
|
+
"formatting_issues": self._build_formatting_patterns(),
|
|
274
|
+
"import_errors": self._build_import_patterns(),
|
|
275
|
+
"complexity_violations": self._build_complexity_patterns(),
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return patterns
|
|
279
|
+
|
|
280
|
+
async def _generate_readme_enhancements(self) -> str:
|
|
281
|
+
"""Generate enhanced README.md sections with improved human readability."""
|
|
282
|
+
|
|
283
|
+
self.console.print("📖 Generating README enhancements")
|
|
284
|
+
|
|
285
|
+
# Read current README if it exists
|
|
286
|
+
if self.readme_path.exists():
|
|
287
|
+
self.readme_path.read_text()
|
|
288
|
+
|
|
289
|
+
# Generate enhancement sections
|
|
290
|
+
enhancements = f"""
|
|
291
|
+
## Enhanced Documentation Sections
|
|
292
|
+
|
|
293
|
+
### Quick Start for AI Agents
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
# Recommended AI-assisted workflow
|
|
297
|
+
python -m crackerjack --ai-agent -t # Full quality + tests with AI fixing
|
|
298
|
+
python -m crackerjack --ai-debug -t # Debug AI agent decisions
|
|
299
|
+
python -m crackerjack --unified-dashboard # Real-time monitoring
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Advanced Features
|
|
303
|
+
|
|
304
|
+
- **AI Agent Integration**: 9 specialized agents for automated issue resolution
|
|
305
|
+
- **Real-time Monitoring**: WebSocket-based dashboard with system metrics
|
|
306
|
+
- **Dual Documentation**: AI-optimized and human-readable formats
|
|
307
|
+
- **Progressive Enhancement**: Coverage ratchet system targeting 100%
|
|
308
|
+
|
|
309
|
+
### Integration Patterns
|
|
310
|
+
|
|
311
|
+
```python
|
|
312
|
+
# MCP server integration
|
|
313
|
+
from crackerjack.mcp import CrackerjackServer
|
|
314
|
+
server = CrackerjackServer()
|
|
315
|
+
await server.start()
|
|
316
|
+
|
|
317
|
+
# Monitoring integration
|
|
318
|
+
from crackerjack.monitoring import MetricsCollector
|
|
319
|
+
collector = MetricsCollector()
|
|
320
|
+
await collector.start_collection()
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
Generated: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
|
|
324
|
+
"""
|
|
325
|
+
|
|
326
|
+
return enhancements
|
|
327
|
+
|
|
328
|
+
# Helper methods for building documentation components
|
|
329
|
+
|
|
330
|
+
def _build_command_matrix(
|
|
331
|
+
self, cli_options: dict[str, t.Any]
|
|
332
|
+
) -> dict[str, list[dict[str, str]]]:
|
|
333
|
+
"""Build structured command matrix for AI reference."""
|
|
334
|
+
return {
|
|
335
|
+
"primary": [
|
|
336
|
+
{
|
|
337
|
+
"command": "python -m crackerjack",
|
|
338
|
+
"use_case": "Quality checks only",
|
|
339
|
+
"ai_context": "Standard development iteration",
|
|
340
|
+
"success_pattern": "Exit code 0, no issues found",
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"command": "python -m crackerjack -t",
|
|
344
|
+
"use_case": "Quality + tests",
|
|
345
|
+
"ai_context": "Comprehensive validation",
|
|
346
|
+
"success_pattern": "All tests pass, hooks pass",
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"command": "python -m crackerjack --ai-agent -t",
|
|
350
|
+
"use_case": "AI auto-fixing",
|
|
351
|
+
"ai_context": "**RECOMMENDED**: Autonomous issue resolution",
|
|
352
|
+
"success_pattern": "5 iterations max, all issues resolved",
|
|
353
|
+
},
|
|
354
|
+
],
|
|
355
|
+
"server": [
|
|
356
|
+
{
|
|
357
|
+
"command": "--start-mcp-server",
|
|
358
|
+
"purpose": "Start MCP server",
|
|
359
|
+
"when_to_use": "AI agent integration needed",
|
|
360
|
+
"expected_outcome": "Server running, tools available",
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
"command": "--unified-dashboard",
|
|
364
|
+
"purpose": "Start monitoring dashboard",
|
|
365
|
+
"when_to_use": "Real-time monitoring needed",
|
|
366
|
+
"expected_outcome": "WebSocket server on port 8675",
|
|
367
|
+
},
|
|
368
|
+
],
|
|
369
|
+
"development": [
|
|
370
|
+
{
|
|
371
|
+
"command": "-x, --strip-code",
|
|
372
|
+
"purpose": "Code cleaning",
|
|
373
|
+
"when_to_use": "TODO resolution required",
|
|
374
|
+
"expected_outcome": "Blocks if TODOs found, creates backups",
|
|
375
|
+
}
|
|
376
|
+
],
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
def _build_decision_trees(self) -> str:
|
|
380
|
+
"""Build mermaid decision trees for AI agents."""
|
|
381
|
+
return """```mermaid
|
|
382
|
+
graph TD
|
|
383
|
+
A[Issue Detected] --> B{Issue Type?}
|
|
384
|
+
B -->|Type Error| C[RefactoringAgent]
|
|
385
|
+
B -->|Performance| D[PerformanceAgent]
|
|
386
|
+
B -->|Security| E[SecurityAgent]
|
|
387
|
+
B -->|Test Failure| F[TestCreationAgent]
|
|
388
|
+
B -->|Documentation| G[DocumentationAgent]
|
|
389
|
+
|
|
390
|
+
C --> H{Confidence >= 0.7?}
|
|
391
|
+
D --> H
|
|
392
|
+
E --> H
|
|
393
|
+
F --> H
|
|
394
|
+
G --> H
|
|
395
|
+
|
|
396
|
+
H -->|Yes| I[Auto-apply Fix]
|
|
397
|
+
H -->|No| J[Manual Review Required]
|
|
398
|
+
|
|
399
|
+
I --> K{Success?}
|
|
400
|
+
K -->|Yes| L[Complete]
|
|
401
|
+
K -->|No| M{Iterations < 5?}
|
|
402
|
+
M -->|Yes| N[Retry with Different Agent]
|
|
403
|
+
M -->|No| O[Manual Intervention Required]
|
|
404
|
+
```"""
|
|
405
|
+
|
|
406
|
+
def _build_troubleshooting_guide(self) -> str:
|
|
407
|
+
"""Build troubleshooting guide for common issues."""
|
|
408
|
+
return """### Common Issue Resolution
|
|
409
|
+
|
|
410
|
+
| Error Pattern | Agent | Auto-Fix | Manual Steps |
|
|
411
|
+
|--------------|-------|----------|--------------|
|
|
412
|
+
| `mypy error` | RefactoringAgent | ✅ | Add type annotations |
|
|
413
|
+
| `ruff format` | FormattingAgent | ✅ | Run `ruff format` |
|
|
414
|
+
| `pytest failed` | TestCreationAgent | ⚠️ | Review test logic |
|
|
415
|
+
| `bandit security` | SecurityAgent | ⚠️ | Review security implications |
|
|
416
|
+
| `complexity > 15` | RefactoringAgent | ✅ | Break into helper methods |"""
|
|
417
|
+
|
|
418
|
+
def _format_command_table(self, commands: list[dict[str, str]]) -> str:
|
|
419
|
+
"""Format command data as markdown table."""
|
|
420
|
+
if not commands:
|
|
421
|
+
return ""
|
|
422
|
+
|
|
423
|
+
headers = list[t.Any](commands[0].keys())
|
|
424
|
+
header_row = "| " + " | ".join(headers) + " |"
|
|
425
|
+
separator_row = "|" + "|".join(["---"] * len(headers)) + "|"
|
|
426
|
+
|
|
427
|
+
data_rows = []
|
|
428
|
+
for cmd in commands:
|
|
429
|
+
row = "| " + " | ".join(cmd.values()) + " |"
|
|
430
|
+
data_rows.append(row)
|
|
431
|
+
|
|
432
|
+
return "\n".join([header_row, separator_row] + data_rows)
|
|
433
|
+
|
|
434
|
+
# Agent analysis methods
|
|
435
|
+
|
|
436
|
+
def _extract_agent_specializations(self, agent: t.Any) -> list[str]:
|
|
437
|
+
"""Extract specializations from agent instance."""
|
|
438
|
+
# This would analyze the agent's capabilities
|
|
439
|
+
agent_name = agent.__class__.__name__
|
|
440
|
+
specializations_map = {
|
|
441
|
+
"RefactoringAgent": [
|
|
442
|
+
"complexity_reduction",
|
|
443
|
+
"type_annotations",
|
|
444
|
+
"dead_code_removal",
|
|
445
|
+
],
|
|
446
|
+
"PerformanceAgent": [
|
|
447
|
+
"algorithmic_optimization",
|
|
448
|
+
"memory_usage",
|
|
449
|
+
"execution_speed",
|
|
450
|
+
],
|
|
451
|
+
"SecurityAgent": [
|
|
452
|
+
"hardcoded_secrets",
|
|
453
|
+
"unsafe_operations",
|
|
454
|
+
"input_validation",
|
|
455
|
+
],
|
|
456
|
+
"DocumentationAgent": [
|
|
457
|
+
"changelog_generation",
|
|
458
|
+
"readme_updates",
|
|
459
|
+
"markdown_consistency",
|
|
460
|
+
],
|
|
461
|
+
"TestCreationAgent": [
|
|
462
|
+
"test_failures",
|
|
463
|
+
"fixture_creation",
|
|
464
|
+
"coverage_improvement",
|
|
465
|
+
],
|
|
466
|
+
"DRYAgent": ["code_duplication", "pattern_extraction", "refactoring"],
|
|
467
|
+
"FormattingAgent": ["style_violations", "import_sorting", "line_length"],
|
|
468
|
+
"ImportOptimizationAgent": [
|
|
469
|
+
"import_cleanup",
|
|
470
|
+
"dependency_analysis",
|
|
471
|
+
"circular_imports",
|
|
472
|
+
],
|
|
473
|
+
"TestSpecialistAgent": ["advanced_testing", "mocking", "parametrization"],
|
|
474
|
+
}
|
|
475
|
+
return specializations_map.get(agent_name, ["general_purpose"])
|
|
476
|
+
|
|
477
|
+
def _extract_input_patterns(self, agent: t.Any) -> list[str]:
|
|
478
|
+
"""Extract input patterns that trigger this agent."""
|
|
479
|
+
agent_name = agent.__class__.__name__
|
|
480
|
+
patterns_map = {
|
|
481
|
+
"RefactoringAgent": [
|
|
482
|
+
"complexity.*violation",
|
|
483
|
+
"type.*annotation",
|
|
484
|
+
"cyclomatic.*complexity",
|
|
485
|
+
],
|
|
486
|
+
"PerformanceAgent": [
|
|
487
|
+
"performance.*issue",
|
|
488
|
+
"slow.*execution",
|
|
489
|
+
"memory.*usage",
|
|
490
|
+
],
|
|
491
|
+
"SecurityAgent": [
|
|
492
|
+
"security.*vulnerability",
|
|
493
|
+
"hardcoded.*secret",
|
|
494
|
+
"unsafe.*operation",
|
|
495
|
+
],
|
|
496
|
+
"DocumentationAgent": [
|
|
497
|
+
"documentation.*inconsistency",
|
|
498
|
+
"changelog.*update",
|
|
499
|
+
"readme.*outdated",
|
|
500
|
+
],
|
|
501
|
+
"TestCreationAgent": ["test.*failure", "coverage.*below", "missing.*test"],
|
|
502
|
+
"DRYAgent": ["duplicate.*code", "repeated.*pattern", "code.*duplication"],
|
|
503
|
+
"FormattingAgent": ["format.*violation", "style.*error", "import.*order"],
|
|
504
|
+
"ImportOptimizationAgent": [
|
|
505
|
+
"import.*error",
|
|
506
|
+
"circular.*import",
|
|
507
|
+
"unused.*import",
|
|
508
|
+
],
|
|
509
|
+
"TestSpecialistAgent": [
|
|
510
|
+
"complex.*test.*scenario",
|
|
511
|
+
"mock.*required",
|
|
512
|
+
"parametric.*test",
|
|
513
|
+
],
|
|
514
|
+
}
|
|
515
|
+
return patterns_map.get(agent_name, ["general.*issue"])
|
|
516
|
+
|
|
517
|
+
def _extract_output_formats(self, agent: t.Any) -> list[str]:
|
|
518
|
+
"""Extract output formats this agent produces."""
|
|
519
|
+
return ["code_changes", "file_modifications", "suggestions"]
|
|
520
|
+
|
|
521
|
+
def _extract_success_indicators(self, agent: t.Any) -> list[str]:
|
|
522
|
+
"""Extract success indicators for this agent."""
|
|
523
|
+
return ["no_remaining_issues", "tests_pass", "confidence_above_threshold"]
|
|
524
|
+
|
|
525
|
+
def _extract_failure_patterns(self, agent: t.Any) -> list[str]:
|
|
526
|
+
"""Extract failure recovery patterns."""
|
|
527
|
+
return ["retry_with_context", "manual_review_required", "escalate_to_human"]
|
|
528
|
+
|
|
529
|
+
def _get_fallback_agent_data(self) -> dict[str, t.Any]:
|
|
530
|
+
"""Get fallback agent data if initialization fails."""
|
|
531
|
+
return {
|
|
532
|
+
"RefactoringAgent": {
|
|
533
|
+
"confidence_level": 0.9,
|
|
534
|
+
"specializations": ["complexity_reduction", "type_annotations"],
|
|
535
|
+
"input_patterns": ["complexity.*violation"],
|
|
536
|
+
"output_formats": ["code_changes"],
|
|
537
|
+
"success_indicators": ["complexity_below_threshold"],
|
|
538
|
+
"failure_recovery": ["retry_with_context"],
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
# Pattern building methods
|
|
543
|
+
|
|
544
|
+
def _build_type_error_patterns(self) -> dict[str, t.Any]:
|
|
545
|
+
"""Build type error patterns."""
|
|
546
|
+
return {
|
|
547
|
+
"missing_return_annotation": {
|
|
548
|
+
"pattern": "Function.*missing a return type annotation",
|
|
549
|
+
"severity": "medium",
|
|
550
|
+
"agent": "RefactoringAgent",
|
|
551
|
+
"confidence": 0.9,
|
|
552
|
+
"fix_template": "def {function_name}({params}) -> {return_type}:",
|
|
553
|
+
"examples": [
|
|
554
|
+
{
|
|
555
|
+
"before": "def get_config():",
|
|
556
|
+
"after": "def get_config() -> dict[str, t.Any]:",
|
|
557
|
+
}
|
|
558
|
+
],
|
|
559
|
+
},
|
|
560
|
+
"missing_parameter_annotation": {
|
|
561
|
+
"pattern": "Missing type annotation for.*parameter",
|
|
562
|
+
"severity": "medium",
|
|
563
|
+
"agent": "RefactoringAgent",
|
|
564
|
+
"confidence": 0.85,
|
|
565
|
+
"fix_template": "def {function_name}({param}: {param_type}):",
|
|
566
|
+
"examples": [
|
|
567
|
+
{
|
|
568
|
+
"before": "def process(data):",
|
|
569
|
+
"after": "def process(data: dict[str, t.Any]):",
|
|
570
|
+
}
|
|
571
|
+
],
|
|
572
|
+
},
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
def _build_security_patterns(self) -> dict[str, t.Any]:
|
|
576
|
+
"""Build security error patterns."""
|
|
577
|
+
return {
|
|
578
|
+
"hardcoded_secret": {
|
|
579
|
+
"pattern": "Possible hardcoded.*secret",
|
|
580
|
+
"severity": "high",
|
|
581
|
+
"agent": "SecurityAgent",
|
|
582
|
+
"confidence": 0.8,
|
|
583
|
+
"fix_template": "Use environment variables or secure config",
|
|
584
|
+
"examples": [
|
|
585
|
+
{
|
|
586
|
+
"before": "API_KEY = 'secret123'",
|
|
587
|
+
"after": "API_KEY = os.getenv('API_KEY')",
|
|
588
|
+
}
|
|
589
|
+
],
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
def _build_performance_patterns(self) -> dict[str, t.Any]:
|
|
594
|
+
"""Build performance issue patterns."""
|
|
595
|
+
return {
|
|
596
|
+
"inefficient_loop": {
|
|
597
|
+
"pattern": "Inefficient.*loop.*pattern",
|
|
598
|
+
"severity": "medium",
|
|
599
|
+
"agent": "PerformanceAgent",
|
|
600
|
+
"confidence": 0.85,
|
|
601
|
+
"fix_template": "Use comprehension or vectorized operation",
|
|
602
|
+
"examples": [
|
|
603
|
+
{
|
|
604
|
+
"before": "for i in items: result.append(process(i))",
|
|
605
|
+
"after": "[process(i) for i in items]",
|
|
606
|
+
}
|
|
607
|
+
],
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
def _build_testing_patterns(self) -> dict[str, t.Any]:
|
|
612
|
+
"""Build test failure patterns."""
|
|
613
|
+
return {
|
|
614
|
+
"assertion_error": {
|
|
615
|
+
"pattern": "AssertionError.*test.*failed",
|
|
616
|
+
"severity": "high",
|
|
617
|
+
"agent": "TestCreationAgent",
|
|
618
|
+
"confidence": 0.75,
|
|
619
|
+
"fix_template": "Review test logic and expected values",
|
|
620
|
+
"examples": [
|
|
621
|
+
{
|
|
622
|
+
"before": "assert result == expected",
|
|
623
|
+
"after": "assert result == corrected_expected",
|
|
624
|
+
}
|
|
625
|
+
],
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
def _build_formatting_patterns(self) -> dict[str, t.Any]:
|
|
630
|
+
"""Build formatting issue patterns."""
|
|
631
|
+
return {
|
|
632
|
+
"line_too_long": {
|
|
633
|
+
"pattern": "Line too long.*characters",
|
|
634
|
+
"severity": "low",
|
|
635
|
+
"agent": "FormattingAgent",
|
|
636
|
+
"confidence": 0.95,
|
|
637
|
+
"fix_template": "Break line using appropriate style",
|
|
638
|
+
"examples": [
|
|
639
|
+
{
|
|
640
|
+
"before": "very_long_function_call(arg1, arg2, arg3)",
|
|
641
|
+
"after": "very_long_function_call(\n arg1, arg2, arg3\n)",
|
|
642
|
+
}
|
|
643
|
+
],
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
def _build_import_patterns(self) -> dict[str, t.Any]:
|
|
648
|
+
"""Build import error patterns."""
|
|
649
|
+
return {
|
|
650
|
+
"unused_import": {
|
|
651
|
+
"pattern": "imported but unused",
|
|
652
|
+
"severity": "low",
|
|
653
|
+
"agent": "ImportOptimizationAgent",
|
|
654
|
+
"confidence": 0.95,
|
|
655
|
+
"fix_template": "Remove unused import",
|
|
656
|
+
"examples": [
|
|
657
|
+
{"before": "import unused_module", "after": "# import removed"}
|
|
658
|
+
],
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
def _build_complexity_patterns(self) -> dict[str, t.Any]:
|
|
663
|
+
"""Build complexity violation patterns."""
|
|
664
|
+
return {
|
|
665
|
+
"high_complexity": {
|
|
666
|
+
"pattern": "too complex.*McCabe complexity",
|
|
667
|
+
"severity": "medium",
|
|
668
|
+
"agent": "RefactoringAgent",
|
|
669
|
+
"confidence": 0.9,
|
|
670
|
+
"fix_template": "Break into helper methods",
|
|
671
|
+
"examples": [
|
|
672
|
+
{
|
|
673
|
+
"before": "def complex_function(): # 20 lines",
|
|
674
|
+
"after": "def complex_function(): return helper1() + helper2()",
|
|
675
|
+
}
|
|
676
|
+
],
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
# Utility methods
|
|
681
|
+
|
|
682
|
+
def _needs_regeneration(self) -> bool:
|
|
683
|
+
"""Check if documentation needs regeneration."""
|
|
684
|
+
# Check file timestamps, cache, etc.
|
|
685
|
+
if not all(
|
|
686
|
+
p.exists()
|
|
687
|
+
for p in (
|
|
688
|
+
self.ai_reference_path,
|
|
689
|
+
self.agent_capabilities_path,
|
|
690
|
+
self.error_patterns_path,
|
|
691
|
+
)
|
|
692
|
+
):
|
|
693
|
+
return True
|
|
694
|
+
|
|
695
|
+
# Check if source files are newer than generated docs
|
|
696
|
+
# Use project_path to find source files instead of hardcoded "crackerjack"
|
|
697
|
+
source_paths = list[t.Any](self.project_path.rglob("*.py"))
|
|
698
|
+
if not source_paths:
|
|
699
|
+
return True
|
|
700
|
+
|
|
701
|
+
latest_source = max(p.stat().st_mtime for p in source_paths if p.exists())
|
|
702
|
+
oldest_doc = min(
|
|
703
|
+
p.stat().st_mtime
|
|
704
|
+
for p in (self.ai_reference_path, self.agent_capabilities_path)
|
|
705
|
+
if p.exists()
|
|
706
|
+
)
|
|
707
|
+
|
|
708
|
+
return latest_source > oldest_doc
|
|
709
|
+
|
|
710
|
+
async def _write_documentation_files(self, result: DocumentationResult) -> None:
|
|
711
|
+
"""Write generated documentation to files."""
|
|
712
|
+
|
|
713
|
+
# Ensure ai/ directory exists
|
|
714
|
+
ai_dir = self.project_path / "ai"
|
|
715
|
+
ai_dir.mkdir(exist_ok=True)
|
|
716
|
+
|
|
717
|
+
# Write AI-REFERENCE.md
|
|
718
|
+
self.ai_reference_path.write_text(result.ai_reference)
|
|
719
|
+
self.console.print(f"✅ Updated {self.ai_reference_path}")
|
|
720
|
+
|
|
721
|
+
# Write AGENT-CAPABILITIES.json
|
|
722
|
+
with self.agent_capabilities_path.open("w") as f:
|
|
723
|
+
json.dump(result.agent_capabilities, f, indent=2)
|
|
724
|
+
self.console.print(f"✅ Updated {self.agent_capabilities_path}")
|
|
725
|
+
|
|
726
|
+
# Write ERROR-PATTERNS.yaml
|
|
727
|
+
with self.error_patterns_path.open("w") as f:
|
|
728
|
+
yaml.dump(result.error_patterns, f, default_flow_style=False)
|
|
729
|
+
self.console.print(f"✅ Updated {self.error_patterns_path}")
|
|
730
|
+
|
|
731
|
+
# Append README enhancements (don't overwrite existing README)
|
|
732
|
+
if self.readme_path.exists():
|
|
733
|
+
current_readme = self.readme_path.read_text()
|
|
734
|
+
if "Enhanced Documentation Sections" not in current_readme:
|
|
735
|
+
enhanced_readme = current_readme + "\n" + result.readme_enhancements
|
|
736
|
+
self.readme_path.write_text(enhanced_readme)
|
|
737
|
+
self.console.print(f"✅ Enhanced {self.readme_path}")
|
|
738
|
+
else:
|
|
739
|
+
self.console.print(
|
|
740
|
+
f"ℹ️ {self.readme_path} already contains enhancements"
|
|
741
|
+
)
|
|
742
|
+
else:
|
|
743
|
+
self.readme_path.write_text(result.readme_enhancements)
|
|
744
|
+
self.console.print(f"✅ Created {self.readme_path}")
|
|
745
|
+
|
|
746
|
+
def _cache_generation_metadata(self, result: DocumentationResult) -> None:
|
|
747
|
+
"""Cache generation metadata for optimization."""
|
|
748
|
+
metadata = {
|
|
749
|
+
"last_generation": result.generation_timestamp.isoformat(),
|
|
750
|
+
"success": result.success,
|
|
751
|
+
"file_counts": {
|
|
752
|
+
"ai_reference_lines": len(result.ai_reference.splitlines()),
|
|
753
|
+
"agent_count": len(result.agent_capabilities.get("agents", {})),
|
|
754
|
+
"error_patterns": len(result.error_patterns.get("type_errors", {})),
|
|
755
|
+
"readme_lines": len(result.readme_enhancements.splitlines()),
|
|
756
|
+
},
|
|
757
|
+
}
|
|
758
|
+
self.cache.set("documentation_generation", metadata)
|
|
759
|
+
|
|
760
|
+
def _get_version(self) -> str:
|
|
761
|
+
"""Get crackerjack version."""
|
|
762
|
+
try:
|
|
763
|
+
from crackerjack.cli.version import get_package_version
|
|
764
|
+
|
|
765
|
+
return get_package_version()
|
|
766
|
+
except Exception:
|
|
767
|
+
return "unknown"
|