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,299 @@
|
|
|
1
|
+
import typing as t
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from types import TracebackType
|
|
4
|
+
|
|
5
|
+
if t.TYPE_CHECKING:
|
|
6
|
+
import asyncio
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AsyncCleanupProtocol(t.Protocol):
|
|
11
|
+
async def cleanup(self) -> None: ...
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class SyncCleanupProtocol(t.Protocol):
|
|
15
|
+
def cleanup(self) -> None: ...
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ResourceLifecycleProtocol(t.Protocol):
|
|
19
|
+
async def initialize(self) -> None: ...
|
|
20
|
+
|
|
21
|
+
async def cleanup(self) -> None: ...
|
|
22
|
+
|
|
23
|
+
def is_initialized(self) -> bool: ...
|
|
24
|
+
|
|
25
|
+
def is_closed(self) -> bool: ...
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class AsyncContextProtocol(t.Protocol):
|
|
29
|
+
async def __aenter__(self) -> t.Self: ...
|
|
30
|
+
|
|
31
|
+
async def __aexit__(
|
|
32
|
+
self,
|
|
33
|
+
exc_type: type[BaseException] | None,
|
|
34
|
+
exc_val: BaseException | None,
|
|
35
|
+
exc_tb: TracebackType | None,
|
|
36
|
+
) -> None: ...
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ResourceManagerProtocol(t.Protocol):
|
|
40
|
+
def register_resource(self, resource: AsyncCleanupProtocol) -> None: ...
|
|
41
|
+
|
|
42
|
+
def register_cleanup_callback(
|
|
43
|
+
self, callback: t.Callable[[], t.Awaitable[None]]
|
|
44
|
+
) -> None: ...
|
|
45
|
+
|
|
46
|
+
async def cleanup_all(self) -> None: ...
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class FileResourceProtocol(t.Protocol):
|
|
50
|
+
@property
|
|
51
|
+
def path(self) -> "Path": ...
|
|
52
|
+
|
|
53
|
+
def exists(self) -> bool: ...
|
|
54
|
+
|
|
55
|
+
async def cleanup(self) -> None: ...
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class ProcessResourceProtocol(t.Protocol):
|
|
59
|
+
@property
|
|
60
|
+
def pid(self) -> int: ...
|
|
61
|
+
|
|
62
|
+
def is_running(self) -> bool: ...
|
|
63
|
+
|
|
64
|
+
async def cleanup(self) -> None: ...
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class TaskResourceProtocol(t.Protocol):
|
|
68
|
+
@property
|
|
69
|
+
def task(self) -> "asyncio.Task[t.Any]": ...
|
|
70
|
+
|
|
71
|
+
def is_done(self) -> bool: ...
|
|
72
|
+
|
|
73
|
+
def is_cancelled(self) -> bool: ...
|
|
74
|
+
|
|
75
|
+
async def cleanup(self) -> None: ...
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class NetworkResourceProtocol(t.Protocol):
|
|
79
|
+
@property
|
|
80
|
+
def is_connected(self) -> bool: ...
|
|
81
|
+
|
|
82
|
+
async def disconnect(self) -> None: ...
|
|
83
|
+
|
|
84
|
+
async def cleanup(self) -> None: ...
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class CacheResourceProtocol(t.Protocol):
|
|
88
|
+
def clear(self) -> None: ...
|
|
89
|
+
|
|
90
|
+
def get_size(self) -> int: ...
|
|
91
|
+
|
|
92
|
+
async def cleanup(self) -> None: ...
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class AbstractManagedResource(ABC):
|
|
96
|
+
def __init__(self) -> None:
|
|
97
|
+
self._initialized = False
|
|
98
|
+
self._closed = False
|
|
99
|
+
|
|
100
|
+
@abstractmethod
|
|
101
|
+
async def _do_initialize(self) -> None:
|
|
102
|
+
pass
|
|
103
|
+
|
|
104
|
+
@abstractmethod
|
|
105
|
+
async def _do_cleanup(self) -> None:
|
|
106
|
+
pass
|
|
107
|
+
|
|
108
|
+
async def initialize(self) -> None:
|
|
109
|
+
if self._initialized:
|
|
110
|
+
return
|
|
111
|
+
|
|
112
|
+
try:
|
|
113
|
+
await self._do_initialize()
|
|
114
|
+
self._initialized = True
|
|
115
|
+
except Exception:
|
|
116
|
+
self._closed = True
|
|
117
|
+
raise
|
|
118
|
+
|
|
119
|
+
async def cleanup(self) -> None:
|
|
120
|
+
if self._closed:
|
|
121
|
+
return
|
|
122
|
+
|
|
123
|
+
self._closed = True
|
|
124
|
+
try:
|
|
125
|
+
await self._do_cleanup()
|
|
126
|
+
except Exception:
|
|
127
|
+
import logging
|
|
128
|
+
|
|
129
|
+
logging.getLogger(__name__).warning(
|
|
130
|
+
f"Error during cleanup of {self.__class__.__name__}", exc_info=True
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
def is_initialized(self) -> bool:
|
|
134
|
+
return self._initialized
|
|
135
|
+
|
|
136
|
+
def is_closed(self) -> bool:
|
|
137
|
+
return self._closed
|
|
138
|
+
|
|
139
|
+
async def __aenter__(self) -> t.Self:
|
|
140
|
+
await self.initialize()
|
|
141
|
+
return self
|
|
142
|
+
|
|
143
|
+
async def __aexit__(
|
|
144
|
+
self,
|
|
145
|
+
exc_type: type[BaseException] | None,
|
|
146
|
+
exc_val: BaseException | None,
|
|
147
|
+
exc_tb: TracebackType | None,
|
|
148
|
+
) -> None:
|
|
149
|
+
await self.cleanup()
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class AbstractFileResource(AbstractManagedResource):
|
|
153
|
+
def __init__(self, path: "Path") -> None:
|
|
154
|
+
super().__init__()
|
|
155
|
+
self._path = path
|
|
156
|
+
|
|
157
|
+
@property
|
|
158
|
+
def path(self) -> "Path":
|
|
159
|
+
return self._path
|
|
160
|
+
|
|
161
|
+
def exists(self) -> bool:
|
|
162
|
+
return self._path.exists()
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class AbstractProcessResource(AbstractManagedResource):
|
|
166
|
+
def __init__(self, pid: int) -> None:
|
|
167
|
+
super().__init__()
|
|
168
|
+
self._pid = pid
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def pid(self) -> int:
|
|
172
|
+
return self._pid
|
|
173
|
+
|
|
174
|
+
def is_running(self) -> bool:
|
|
175
|
+
try:
|
|
176
|
+
import os
|
|
177
|
+
|
|
178
|
+
os.kill(self._pid, 0)
|
|
179
|
+
return True
|
|
180
|
+
except (OSError, ProcessLookupError):
|
|
181
|
+
return False
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class AbstractTaskResource(AbstractManagedResource):
|
|
185
|
+
def __init__(self, task: "asyncio.Task[t.Any]") -> None:
|
|
186
|
+
super().__init__()
|
|
187
|
+
self._task = task
|
|
188
|
+
|
|
189
|
+
@property
|
|
190
|
+
def task(self) -> "asyncio.Task[t.Any]":
|
|
191
|
+
return self._task
|
|
192
|
+
|
|
193
|
+
def is_done(self) -> bool:
|
|
194
|
+
return self._task.done()
|
|
195
|
+
|
|
196
|
+
def is_cancelled(self) -> bool:
|
|
197
|
+
return self._task.cancelled()
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
class AbstractNetworkResource(AbstractManagedResource):
|
|
201
|
+
def __init__(self) -> None:
|
|
202
|
+
super().__init__()
|
|
203
|
+
self._connected = False
|
|
204
|
+
|
|
205
|
+
@property
|
|
206
|
+
def is_connected(self) -> bool:
|
|
207
|
+
return self._connected and not self._closed
|
|
208
|
+
|
|
209
|
+
async def disconnect(self) -> None:
|
|
210
|
+
if self._connected:
|
|
211
|
+
self._connected = False
|
|
212
|
+
await self._do_disconnect()
|
|
213
|
+
|
|
214
|
+
@abstractmethod
|
|
215
|
+
async def _do_disconnect(self) -> None:
|
|
216
|
+
pass
|
|
217
|
+
|
|
218
|
+
async def _do_cleanup(self) -> None:
|
|
219
|
+
await self.disconnect()
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def with_resource_cleanup(
|
|
223
|
+
resource_attr: str,
|
|
224
|
+
) -> t.Callable[..., t.Callable[..., t.Awaitable[t.Any]]]:
|
|
225
|
+
def decorator(
|
|
226
|
+
func: t.Callable[..., t.Awaitable[t.Any]],
|
|
227
|
+
) -> t.Callable[..., t.Awaitable[t.Any]]:
|
|
228
|
+
async def wrapper(self: t.Any, *args: t.Any, **kwargs: t.Any) -> t.Any:
|
|
229
|
+
resource = getattr(self, resource_attr, None)
|
|
230
|
+
try:
|
|
231
|
+
return await func(self, *args, **kwargs)
|
|
232
|
+
finally:
|
|
233
|
+
if resource and hasattr(resource, "cleanup"):
|
|
234
|
+
await resource.cleanup()
|
|
235
|
+
|
|
236
|
+
return wrapper
|
|
237
|
+
|
|
238
|
+
return decorator
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def ensure_initialized(
|
|
242
|
+
resource_attr: str,
|
|
243
|
+
) -> t.Callable[..., t.Callable[..., t.Awaitable[t.Any]]]:
|
|
244
|
+
def decorator(
|
|
245
|
+
func: t.Callable[..., t.Awaitable[t.Any]],
|
|
246
|
+
) -> t.Callable[..., t.Awaitable[t.Any]]:
|
|
247
|
+
async def wrapper(self: t.Any, *args: t.Any, **kwargs: t.Any) -> t.Any:
|
|
248
|
+
resource = getattr(self, resource_attr, None)
|
|
249
|
+
if resource and hasattr(resource, "initialize"):
|
|
250
|
+
await resource.initialize()
|
|
251
|
+
return await func(self, *args, **kwargs)
|
|
252
|
+
|
|
253
|
+
return wrapper
|
|
254
|
+
|
|
255
|
+
return decorator
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
class HealthCheckProtocol(t.Protocol):
|
|
259
|
+
async def health_check(self) -> dict[str, t.Any]: ...
|
|
260
|
+
|
|
261
|
+
def is_healthy(self) -> bool: ...
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class MonitorableResourceProtocol(t.Protocol):
|
|
265
|
+
def get_metrics(self) -> dict[str, t.Any]: ...
|
|
266
|
+
|
|
267
|
+
def get_status(self) -> str: ...
|
|
268
|
+
|
|
269
|
+
async def health_check(self) -> dict[str, t.Any]: ...
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
class ResourceFactoryProtocol(t.Protocol):
|
|
273
|
+
async def create_resource(self, **kwargs: t.Any) -> AsyncCleanupProtocol: ...
|
|
274
|
+
|
|
275
|
+
def get_resource_type(self) -> str: ...
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
class PooledResourceProtocol(t.Protocol):
|
|
279
|
+
async def acquire(self) -> AsyncCleanupProtocol: ...
|
|
280
|
+
|
|
281
|
+
async def release(self, resource: AsyncCleanupProtocol) -> None: ...
|
|
282
|
+
|
|
283
|
+
def get_pool_size(self) -> int: ...
|
|
284
|
+
|
|
285
|
+
def get_active_count(self) -> int: ...
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
class ResourceErrorProtocol(t.Protocol):
|
|
289
|
+
def handle_error(self, error: Exception) -> bool: ...
|
|
290
|
+
|
|
291
|
+
def should_retry(self, error: Exception) -> bool: ...
|
|
292
|
+
|
|
293
|
+
def get_retry_delay(self, attempt: int) -> float: ...
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
class FallbackResourceProtocol(t.Protocol):
|
|
297
|
+
async def get_fallback(self) -> AsyncCleanupProtocol | None: ...
|
|
298
|
+
|
|
299
|
+
def has_fallback(self) -> bool: ...
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import typing as t
|
|
2
|
+
from dataclasses import dataclass, field
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@dataclass
|
|
6
|
+
class ExecutionResult:
|
|
7
|
+
operation_id: str
|
|
8
|
+
success: bool
|
|
9
|
+
duration_seconds: float
|
|
10
|
+
output: str = ""
|
|
11
|
+
error: str = ""
|
|
12
|
+
exit_code: int = 0
|
|
13
|
+
metadata: dict[str, t.Any] = field(default_factory=dict[str, t.Any])
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class ParallelExecutionResult:
|
|
18
|
+
group_name: str
|
|
19
|
+
total_operations: int
|
|
20
|
+
successful_operations: int
|
|
21
|
+
failed_operations: int
|
|
22
|
+
total_duration_seconds: float
|
|
23
|
+
results: list[ExecutionResult]
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def success_rate(self) -> float:
|
|
27
|
+
return (
|
|
28
|
+
self.successful_operations / self.total_operations
|
|
29
|
+
if self.total_operations > 0
|
|
30
|
+
else 0.0
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def overall_success(self) -> bool:
|
|
35
|
+
return self.failed_operations == 0
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"""Semantic search data models for crackerjack vector store functionality."""
|
|
2
|
+
|
|
3
|
+
import typing as t
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, ConfigDict, Field, field_serializer
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EmbeddingVector(BaseModel):
|
|
11
|
+
"""Represents a single embedding vector with metadata."""
|
|
12
|
+
|
|
13
|
+
file_path: Path = Field(..., description="Path to the source file")
|
|
14
|
+
chunk_id: str = Field(..., description="Unique identifier for this chunk")
|
|
15
|
+
content: str = Field(..., description="The text content that was embedded")
|
|
16
|
+
embedding: list[float] = Field(
|
|
17
|
+
..., description="The numerical vector representation"
|
|
18
|
+
)
|
|
19
|
+
created_at: datetime = Field(
|
|
20
|
+
default_factory=datetime.now, description="Creation timestamp"
|
|
21
|
+
)
|
|
22
|
+
file_hash: str = Field(
|
|
23
|
+
..., description="Hash of the source file for change detection"
|
|
24
|
+
)
|
|
25
|
+
start_line: int = Field(..., description="Starting line number in the source file")
|
|
26
|
+
end_line: int = Field(..., description="Ending line number in the source file")
|
|
27
|
+
file_type: str = Field(..., description="File extension or type identifier")
|
|
28
|
+
|
|
29
|
+
model_config = ConfigDict(ser_json_timedelta="iso8601")
|
|
30
|
+
|
|
31
|
+
@field_serializer("file_path")
|
|
32
|
+
def serialize_path(self, value: Path) -> str:
|
|
33
|
+
"""Serialize Path to string."""
|
|
34
|
+
return str(value)
|
|
35
|
+
|
|
36
|
+
@field_serializer("created_at")
|
|
37
|
+
def serialize_datetime(self, value: datetime) -> str:
|
|
38
|
+
"""Serialize datetime to ISO format."""
|
|
39
|
+
return value.isoformat()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class SearchResult(BaseModel):
|
|
43
|
+
"""Represents a semantic search result with similarity score."""
|
|
44
|
+
|
|
45
|
+
file_path: Path = Field(..., description="Path to the matching file")
|
|
46
|
+
chunk_id: str = Field(..., description="Identifier of the matching chunk")
|
|
47
|
+
content: str = Field(..., description="The matching text content")
|
|
48
|
+
similarity_score: float = Field(
|
|
49
|
+
..., ge=0.0, le=1.0, description="Similarity score (0-1)"
|
|
50
|
+
)
|
|
51
|
+
start_line: int = Field(..., description="Starting line number")
|
|
52
|
+
end_line: int = Field(..., description="Ending line number")
|
|
53
|
+
file_type: str = Field(..., description="File type identifier")
|
|
54
|
+
context_lines: list[str] = Field(
|
|
55
|
+
default_factory=list, description="Surrounding context lines"
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
@field_serializer("file_path")
|
|
59
|
+
def serialize_path(self, value: Path) -> str:
|
|
60
|
+
"""Serialize Path to string."""
|
|
61
|
+
return str(value)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class IndexStats(BaseModel):
|
|
65
|
+
"""Statistics about the semantic index."""
|
|
66
|
+
|
|
67
|
+
total_files: int = Field(..., description="Total number of indexed files")
|
|
68
|
+
total_chunks: int = Field(..., description="Total number of text chunks")
|
|
69
|
+
index_size_mb: float = Field(..., description="Index size in megabytes")
|
|
70
|
+
last_updated: datetime = Field(..., description="Last index update timestamp")
|
|
71
|
+
file_types: dict[str, int] = Field(
|
|
72
|
+
default_factory=dict, description="Count by file type"
|
|
73
|
+
)
|
|
74
|
+
embedding_model: str = Field(..., description="Name of the embedding model used")
|
|
75
|
+
avg_chunk_size: float = Field(..., description="Average chunk size in characters")
|
|
76
|
+
|
|
77
|
+
@field_serializer("last_updated")
|
|
78
|
+
def serialize_datetime(self, value: datetime) -> str:
|
|
79
|
+
"""Serialize datetime to ISO format."""
|
|
80
|
+
return value.isoformat()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class SearchQuery(BaseModel):
|
|
84
|
+
"""Represents a semantic search query with parameters."""
|
|
85
|
+
|
|
86
|
+
query: str = Field(..., min_length=1, description="The search query text")
|
|
87
|
+
max_results: int = Field(
|
|
88
|
+
default=10, ge=1, le=100, description="Maximum number of results"
|
|
89
|
+
)
|
|
90
|
+
min_similarity: float = Field(
|
|
91
|
+
default=0.3, ge=0.0, le=1.0, description="Minimum similarity threshold"
|
|
92
|
+
)
|
|
93
|
+
file_types: list[str] = Field(
|
|
94
|
+
default_factory=list, description="Filter by file types"
|
|
95
|
+
)
|
|
96
|
+
include_context: bool = Field(
|
|
97
|
+
default=True, description="Include surrounding context lines"
|
|
98
|
+
)
|
|
99
|
+
context_lines: int = Field(
|
|
100
|
+
default=3, ge=0, le=10, description="Number of context lines"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
model_config = ConfigDict(validate_assignment=True)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class IndexingProgress(BaseModel):
|
|
107
|
+
"""Progress information for indexing operations."""
|
|
108
|
+
|
|
109
|
+
current_file: Path = Field(..., description="Currently processing file")
|
|
110
|
+
files_processed: int = Field(..., ge=0, description="Number of files processed")
|
|
111
|
+
total_files: int = Field(..., ge=0, description="Total files to process")
|
|
112
|
+
chunks_created: int = Field(..., ge=0, description="Number of chunks created")
|
|
113
|
+
elapsed_time: float = Field(..., ge=0.0, description="Elapsed time in seconds")
|
|
114
|
+
estimated_remaining: float | None = Field(
|
|
115
|
+
default=None, description="Estimated remaining time in seconds"
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
@property
|
|
119
|
+
def progress_percentage(self) -> float:
|
|
120
|
+
"""Calculate progress as a percentage."""
|
|
121
|
+
if self.total_files == 0:
|
|
122
|
+
return 0.0
|
|
123
|
+
return min(100.0, (self.files_processed / self.total_files) * 100.0)
|
|
124
|
+
|
|
125
|
+
@field_serializer("current_file")
|
|
126
|
+
def serialize_path(self, value: Path) -> str:
|
|
127
|
+
"""Serialize Path to string."""
|
|
128
|
+
return str(value)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class SemanticConfig(BaseModel):
|
|
132
|
+
"""Configuration for semantic search functionality."""
|
|
133
|
+
|
|
134
|
+
embedding_model: str = Field(
|
|
135
|
+
default="all-MiniLM-L6-v2", description="Sentence transformer model name"
|
|
136
|
+
)
|
|
137
|
+
chunk_size: int = Field(
|
|
138
|
+
default=500, ge=100, le=2000, description="Maximum characters per chunk"
|
|
139
|
+
)
|
|
140
|
+
chunk_overlap: int = Field(
|
|
141
|
+
default=50, ge=0, le=500, description="Overlap between chunks"
|
|
142
|
+
)
|
|
143
|
+
max_search_results: int = Field(
|
|
144
|
+
default=10, ge=1, le=100, description="Maximum number of search results"
|
|
145
|
+
)
|
|
146
|
+
similarity_threshold: float = Field(
|
|
147
|
+
default=0.7, ge=0.0, le=1.0, description="Minimum similarity threshold"
|
|
148
|
+
)
|
|
149
|
+
embedding_dimension: int = Field(
|
|
150
|
+
default=384, ge=128, le=1024, description="Embedding vector dimension"
|
|
151
|
+
)
|
|
152
|
+
max_file_size_mb: int = Field(
|
|
153
|
+
default=10, ge=1, le=100, description="Maximum file size to process"
|
|
154
|
+
)
|
|
155
|
+
excluded_patterns: list[str] = Field(
|
|
156
|
+
default_factory=lambda: [
|
|
157
|
+
"*.pyc",
|
|
158
|
+
"*.pyo",
|
|
159
|
+
"*.pyd",
|
|
160
|
+
"__pycache__/*",
|
|
161
|
+
".git/*",
|
|
162
|
+
".venv/*",
|
|
163
|
+
"*.log",
|
|
164
|
+
"*.tmp",
|
|
165
|
+
],
|
|
166
|
+
description="File patterns to exclude from indexing",
|
|
167
|
+
)
|
|
168
|
+
included_extensions: list[str] = Field(
|
|
169
|
+
default_factory=lambda: [
|
|
170
|
+
".py",
|
|
171
|
+
".md",
|
|
172
|
+
".txt",
|
|
173
|
+
".yml",
|
|
174
|
+
".yaml",
|
|
175
|
+
".json",
|
|
176
|
+
".toml",
|
|
177
|
+
".ini",
|
|
178
|
+
".cfg",
|
|
179
|
+
".sh",
|
|
180
|
+
".js",
|
|
181
|
+
".ts",
|
|
182
|
+
".html",
|
|
183
|
+
".css",
|
|
184
|
+
".sql",
|
|
185
|
+
],
|
|
186
|
+
description="File extensions to include in indexing",
|
|
187
|
+
)
|
|
188
|
+
cache_embeddings: bool = Field(default=True, description="Cache embeddings to disk")
|
|
189
|
+
cache_ttl_hours: int = Field(
|
|
190
|
+
default=24, ge=1, le=168, description="Cache time-to-live in hours"
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
model_config = ConfigDict(validate_assignment=True)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
class FileChangeEvent(BaseModel):
|
|
197
|
+
"""Represents a file system change event for incremental indexing."""
|
|
198
|
+
|
|
199
|
+
file_path: Path = Field(..., description="Path to the changed file")
|
|
200
|
+
event_type: t.Literal["created", "modified", "deleted"] = Field(
|
|
201
|
+
..., description="Type of change"
|
|
202
|
+
)
|
|
203
|
+
timestamp: datetime = Field(
|
|
204
|
+
default_factory=datetime.now, description="When the change occurred"
|
|
205
|
+
)
|
|
206
|
+
file_hash: str | None = Field(
|
|
207
|
+
default=None, description="New file hash if available"
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
@field_serializer("file_path")
|
|
211
|
+
def serialize_path(self, value: Path) -> str:
|
|
212
|
+
"""Serialize Path to string."""
|
|
213
|
+
return str(value)
|
|
214
|
+
|
|
215
|
+
@field_serializer("timestamp")
|
|
216
|
+
def serialize_datetime(self, value: datetime) -> str:
|
|
217
|
+
"""Serialize datetime to ISO format."""
|
|
218
|
+
return value.isoformat()
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class SemanticContext(BaseModel):
|
|
222
|
+
"""Context information for AI agents using semantic search."""
|
|
223
|
+
|
|
224
|
+
query: str = Field(..., description="The query that generated this context")
|
|
225
|
+
related_files: list[SearchResult] = Field(
|
|
226
|
+
..., description="Semantically related files"
|
|
227
|
+
)
|
|
228
|
+
patterns: list[str] = Field(
|
|
229
|
+
default_factory=list, description="Identified code patterns"
|
|
230
|
+
)
|
|
231
|
+
suggestions: list[str] = Field(
|
|
232
|
+
default_factory=list, description="AI-generated suggestions"
|
|
233
|
+
)
|
|
234
|
+
confidence: float = Field(
|
|
235
|
+
..., ge=0.0, le=1.0, description="Confidence in the context relevance"
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
# Type aliases for better code readability
|
|
240
|
+
EmbeddingMatrix = list[list[float]]
|
|
241
|
+
SimilarityMatrix = list[list[float]]
|
|
242
|
+
FilePathSet = set[Path]
|
|
243
|
+
ChunkMapping = dict[str, EmbeddingVector]
|
|
244
|
+
|
|
245
|
+
__all__ = [
|
|
246
|
+
"EmbeddingVector",
|
|
247
|
+
"SearchResult",
|
|
248
|
+
"IndexStats",
|
|
249
|
+
"SearchQuery",
|
|
250
|
+
"IndexingProgress",
|
|
251
|
+
"SemanticConfig",
|
|
252
|
+
"FileChangeEvent",
|
|
253
|
+
"SemanticContext",
|
|
254
|
+
"EmbeddingMatrix",
|
|
255
|
+
"SimilarityMatrix",
|
|
256
|
+
"FilePathSet",
|
|
257
|
+
"ChunkMapping",
|
|
258
|
+
]
|