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,356 @@
|
|
|
1
|
+
"""Semantic enhancement helpers for AI agents.
|
|
2
|
+
|
|
3
|
+
This module provides shared utilities for integrating semantic search
|
|
4
|
+
capabilities into existing agents, enabling them to discover related
|
|
5
|
+
code patterns and make more informed decisions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import typing as t
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from ..models.semantic_models import SearchQuery, SemanticConfig
|
|
13
|
+
from ..services.vector_store import VectorStore
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class SemanticInsight:
|
|
18
|
+
"""Container for semantic analysis results."""
|
|
19
|
+
|
|
20
|
+
query: str
|
|
21
|
+
related_patterns: list[dict[str, t.Any]]
|
|
22
|
+
similarity_threshold: float
|
|
23
|
+
total_matches: int
|
|
24
|
+
high_confidence_matches: int
|
|
25
|
+
session_id: str | None = None
|
|
26
|
+
timestamp: str | None = None
|
|
27
|
+
|
|
28
|
+
def to_session_data(self) -> dict[str, t.Any]:
|
|
29
|
+
"""Convert insight to session-storable data."""
|
|
30
|
+
return {
|
|
31
|
+
"query": self.query,
|
|
32
|
+
"related_patterns": self.related_patterns[:3], # Limit for storage
|
|
33
|
+
"similarity_threshold": self.similarity_threshold,
|
|
34
|
+
"total_matches": self.total_matches,
|
|
35
|
+
"high_confidence_matches": self.high_confidence_matches,
|
|
36
|
+
"session_id": self.session_id,
|
|
37
|
+
"timestamp": self.timestamp,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class SemanticEnhancer:
|
|
42
|
+
"""Helper class to add semantic capabilities to existing agents."""
|
|
43
|
+
|
|
44
|
+
def __init__(self, project_path: Path) -> None:
|
|
45
|
+
self.project_path = project_path
|
|
46
|
+
self._vector_store: VectorStore | None = None
|
|
47
|
+
self._config = self._create_semantic_config()
|
|
48
|
+
self._session_insights: dict[str, SemanticInsight] = {}
|
|
49
|
+
|
|
50
|
+
@staticmethod
|
|
51
|
+
def _create_semantic_config() -> SemanticConfig:
|
|
52
|
+
"""Create semantic search configuration."""
|
|
53
|
+
return SemanticConfig(
|
|
54
|
+
embedding_model="sentence-transformers/all-MiniLM-L6-v2",
|
|
55
|
+
chunk_size=512,
|
|
56
|
+
chunk_overlap=50,
|
|
57
|
+
max_search_results=10,
|
|
58
|
+
similarity_threshold=0.7,
|
|
59
|
+
embedding_dimension=384,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
def _get_vector_store(self) -> VectorStore:
|
|
63
|
+
"""Get or create vector store instance."""
|
|
64
|
+
if self._vector_store is None:
|
|
65
|
+
db_path = self._get_persistent_db_path()
|
|
66
|
+
self._vector_store = VectorStore(self._config, db_path=db_path)
|
|
67
|
+
return self._vector_store
|
|
68
|
+
|
|
69
|
+
def _get_persistent_db_path(self) -> Path:
|
|
70
|
+
"""Get the path to the persistent semantic search database."""
|
|
71
|
+
db_path = self.project_path / ".crackerjack" / "semantic_index.db"
|
|
72
|
+
db_path.parent.mkdir(exist_ok=True)
|
|
73
|
+
return db_path
|
|
74
|
+
|
|
75
|
+
async def find_similar_patterns(
|
|
76
|
+
self,
|
|
77
|
+
query: str,
|
|
78
|
+
current_file: Path | None = None,
|
|
79
|
+
min_similarity: float = 0.6,
|
|
80
|
+
max_results: int = 5,
|
|
81
|
+
) -> SemanticInsight:
|
|
82
|
+
"""Find similar code patterns using semantic search.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
query: Search query (code snippet, function signature, or description)
|
|
86
|
+
current_file: File to exclude from results (to avoid self-matches)
|
|
87
|
+
min_similarity: Minimum similarity threshold (0.0-1.0)
|
|
88
|
+
max_results: Maximum number of results to return
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
SemanticInsight with related patterns and analysis
|
|
92
|
+
"""
|
|
93
|
+
vector_store = self._get_vector_store()
|
|
94
|
+
|
|
95
|
+
search_query = SearchQuery(
|
|
96
|
+
query=query,
|
|
97
|
+
max_results=max_results,
|
|
98
|
+
min_similarity=min_similarity,
|
|
99
|
+
file_types=["py"],
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
try:
|
|
103
|
+
results = vector_store.search(search_query)
|
|
104
|
+
|
|
105
|
+
# Filter out results from current file if specified
|
|
106
|
+
if current_file:
|
|
107
|
+
results = [
|
|
108
|
+
result for result in results if result.file_path != current_file
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
# Categorize results by confidence
|
|
112
|
+
high_confidence = [
|
|
113
|
+
result for result in results if result.similarity_score >= 0.8
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
# Convert to pattern format
|
|
117
|
+
patterns = [
|
|
118
|
+
{
|
|
119
|
+
"file_path": str(result.file_path),
|
|
120
|
+
"content": result.content[:300], # Truncate for readability
|
|
121
|
+
"similarity_score": result.similarity_score,
|
|
122
|
+
"lines": f"{result.start_line}-{result.end_line}",
|
|
123
|
+
"file_type": result.file_type,
|
|
124
|
+
"confidence_level": "high"
|
|
125
|
+
if result.similarity_score >= 0.8
|
|
126
|
+
else "medium",
|
|
127
|
+
}
|
|
128
|
+
for result in results
|
|
129
|
+
]
|
|
130
|
+
|
|
131
|
+
return SemanticInsight(
|
|
132
|
+
query=query,
|
|
133
|
+
related_patterns=patterns,
|
|
134
|
+
similarity_threshold=min_similarity,
|
|
135
|
+
total_matches=len(patterns),
|
|
136
|
+
high_confidence_matches=len(high_confidence),
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
except Exception:
|
|
140
|
+
# Return empty insight on error
|
|
141
|
+
return SemanticInsight(
|
|
142
|
+
query=query,
|
|
143
|
+
related_patterns=[],
|
|
144
|
+
similarity_threshold=min_similarity,
|
|
145
|
+
total_matches=0,
|
|
146
|
+
high_confidence_matches=0,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
async def find_duplicate_patterns(
|
|
150
|
+
self, code_snippet: str, current_file: Path | None = None
|
|
151
|
+
) -> SemanticInsight:
|
|
152
|
+
"""Find potential code duplicates using semantic similarity.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
code_snippet: Code snippet to find duplicates for
|
|
156
|
+
current_file: File to exclude from results
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
SemanticInsight focused on potential duplicates
|
|
160
|
+
"""
|
|
161
|
+
insight = await self.find_similar_patterns(
|
|
162
|
+
query=code_snippet,
|
|
163
|
+
current_file=current_file,
|
|
164
|
+
min_similarity=0.75, # Higher threshold for duplicates
|
|
165
|
+
max_results=8,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# Store insight for session continuity
|
|
169
|
+
await self.store_insight_to_session(insight, "DuplicateDetection")
|
|
170
|
+
return insight
|
|
171
|
+
|
|
172
|
+
async def find_refactoring_opportunities(
|
|
173
|
+
self, function_signature: str, current_file: Path | None = None
|
|
174
|
+
) -> SemanticInsight:
|
|
175
|
+
"""Find similar functions for refactoring opportunities.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
function_signature: Function signature or description
|
|
179
|
+
current_file: File to exclude from results
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
SemanticInsight focused on refactoring opportunities
|
|
183
|
+
"""
|
|
184
|
+
return await self.find_similar_patterns(
|
|
185
|
+
query=function_signature,
|
|
186
|
+
current_file=current_file,
|
|
187
|
+
min_similarity=0.6,
|
|
188
|
+
max_results=6,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
async def find_implementation_examples(
|
|
192
|
+
self, pattern_description: str, current_file: Path | None = None
|
|
193
|
+
) -> SemanticInsight:
|
|
194
|
+
"""Find implementation examples for a given pattern.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
pattern_description: Description of the pattern to find
|
|
198
|
+
current_file: File to exclude from results
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
SemanticInsight with implementation examples
|
|
202
|
+
"""
|
|
203
|
+
return await self.find_similar_patterns(
|
|
204
|
+
query=pattern_description,
|
|
205
|
+
current_file=current_file,
|
|
206
|
+
min_similarity=0.5, # Lower threshold for broader examples
|
|
207
|
+
max_results=10,
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
def enhance_recommendations(
|
|
211
|
+
self,
|
|
212
|
+
base_recommendations: list[str],
|
|
213
|
+
semantic_insight: SemanticInsight,
|
|
214
|
+
) -> list[str]:
|
|
215
|
+
"""Enhance existing recommendations with semantic insights.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
base_recommendations: Original agent recommendations
|
|
219
|
+
semantic_insight: Semantic analysis results
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
Enhanced recommendations including semantic insights
|
|
223
|
+
"""
|
|
224
|
+
enhanced = base_recommendations.copy()
|
|
225
|
+
|
|
226
|
+
if semantic_insight.total_matches > 0:
|
|
227
|
+
# Add semantic-based recommendations
|
|
228
|
+
if semantic_insight.high_confidence_matches > 0:
|
|
229
|
+
enhanced.append(
|
|
230
|
+
f"Semantic analysis found {semantic_insight.high_confidence_matches} "
|
|
231
|
+
f"highly similar patterns - consider consolidation"
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
# Add pattern discovery insights
|
|
235
|
+
if semantic_insight.total_matches >= 3:
|
|
236
|
+
enhanced.append(
|
|
237
|
+
f"Found {semantic_insight.total_matches} related patterns "
|
|
238
|
+
f"across codebase - review for consistency"
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
# Add specific file references for high-confidence matches
|
|
242
|
+
high_conf_files = {
|
|
243
|
+
pattern["file_path"]
|
|
244
|
+
for pattern in semantic_insight.related_patterns
|
|
245
|
+
if pattern["confidence_level"] == "high"
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if high_conf_files:
|
|
249
|
+
file_list = ", ".join(Path(f).name for f in sorted(high_conf_files)[:3])
|
|
250
|
+
if len(high_conf_files) > 3:
|
|
251
|
+
file_list += f" (+{len(high_conf_files) - 3} more)"
|
|
252
|
+
|
|
253
|
+
enhanced.append(f"Similar implementations found in: {file_list}")
|
|
254
|
+
|
|
255
|
+
return enhanced
|
|
256
|
+
|
|
257
|
+
def get_semantic_context_summary(self, insight: SemanticInsight) -> str:
|
|
258
|
+
"""Generate a summary of semantic context for logging.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
insight: Semantic analysis results
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
Human-readable summary string
|
|
265
|
+
"""
|
|
266
|
+
if insight.total_matches == 0:
|
|
267
|
+
return "No similar patterns found in semantic analysis"
|
|
268
|
+
|
|
269
|
+
high_conf_pct = (
|
|
270
|
+
insight.high_confidence_matches / insight.total_matches * 100
|
|
271
|
+
if insight.total_matches > 0
|
|
272
|
+
else 0
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
return (
|
|
276
|
+
f"Semantic context: {insight.total_matches} similar patterns found "
|
|
277
|
+
f"({insight.high_confidence_matches} high-confidence, {high_conf_pct:.0f}%)"
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
async def store_insight_to_session(
|
|
281
|
+
self, insight: SemanticInsight, agent_type: str
|
|
282
|
+
) -> bool:
|
|
283
|
+
"""Store semantic insight to session for continuity.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
insight: Semantic insight to store
|
|
287
|
+
agent_type: Type of agent storing the insight
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
True if stored successfully, False otherwise
|
|
291
|
+
"""
|
|
292
|
+
try:
|
|
293
|
+
# Create a unique session key for this insight
|
|
294
|
+
session_key = f"{agent_type}_{hash(insight.query)}"
|
|
295
|
+
|
|
296
|
+
# Store in local cache
|
|
297
|
+
self._session_insights[session_key] = insight
|
|
298
|
+
|
|
299
|
+
return True
|
|
300
|
+
except Exception:
|
|
301
|
+
return False
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
def create_semantic_enhancer(project_path: Path) -> SemanticEnhancer:
|
|
305
|
+
"""Factory function to create a semantic enhancer.
|
|
306
|
+
|
|
307
|
+
Args:
|
|
308
|
+
project_path: Path to the project root
|
|
309
|
+
|
|
310
|
+
Returns:
|
|
311
|
+
Configured SemanticEnhancer instance
|
|
312
|
+
"""
|
|
313
|
+
return SemanticEnhancer(project_path)
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
async def get_session_enhanced_recommendations(
|
|
317
|
+
base_recommendations: list[str], agent_type: str, project_path: Path
|
|
318
|
+
) -> list[str]:
|
|
319
|
+
"""Get enhanced recommendations based on session insights.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
base_recommendations: Original recommendations
|
|
323
|
+
agent_type: Type of agent requesting enhancements
|
|
324
|
+
project_path: Path to the project root
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
Enhanced recommendations with session context
|
|
328
|
+
"""
|
|
329
|
+
try:
|
|
330
|
+
enhancer = create_semantic_enhancer(project_path)
|
|
331
|
+
|
|
332
|
+
# Try to find stored insights for this agent type
|
|
333
|
+
session_insights = [
|
|
334
|
+
insight
|
|
335
|
+
for key, insight in enhancer._session_insights.items()
|
|
336
|
+
if key.startswith(agent_type)
|
|
337
|
+
]
|
|
338
|
+
|
|
339
|
+
if not session_insights:
|
|
340
|
+
return base_recommendations
|
|
341
|
+
|
|
342
|
+
enhanced = base_recommendations.copy()
|
|
343
|
+
|
|
344
|
+
# Add session-based recommendations
|
|
345
|
+
total_patterns = sum(insight.total_matches for insight in session_insights)
|
|
346
|
+
if total_patterns > 5:
|
|
347
|
+
enhanced.append(
|
|
348
|
+
f"Session context: {total_patterns} similar patterns found "
|
|
349
|
+
"across recent analyses - consider broader refactoring"
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
return enhanced
|
|
353
|
+
|
|
354
|
+
except Exception:
|
|
355
|
+
# Fallback to original recommendations on error
|
|
356
|
+
return base_recommendations
|