crackerjack 0.37.9__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 +30 -1
- crackerjack/__main__.py +342 -1263
- crackerjack/adapters/README.md +18 -0
- crackerjack/adapters/__init__.py +27 -5
- 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/{rust_tool_manager.py → lsp/_manager.py} +3 -3
- crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
- crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
- 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 +40 -12
- crackerjack/agents/base.py +1 -0
- crackerjack/agents/claude_code_bridge.py +641 -0
- crackerjack/agents/coordinator.py +49 -53
- crackerjack/agents/dry_agent.py +187 -3
- 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 +6 -8
- 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/performance_agent.py +121 -1152
- crackerjack/agents/refactoring_agent.py +156 -655
- crackerjack/agents/semantic_agent.py +479 -0
- crackerjack/agents/semantic_helpers.py +356 -0
- crackerjack/agents/test_creation_agent.py +19 -1605
- crackerjack/api.py +5 -7
- crackerjack/cli/README.md +394 -0
- crackerjack/cli/__init__.py +1 -1
- crackerjack/cli/cache_handlers.py +23 -18
- crackerjack/cli/cache_handlers_enhanced.py +1 -4
- crackerjack/cli/facade.py +70 -8
- 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 +249 -49
- crackerjack/cli/interactive.py +8 -5
- crackerjack/cli/options.py +203 -110
- crackerjack/cli/semantic_handlers.py +292 -0
- crackerjack/cli/version.py +19 -0
- crackerjack/code_cleaner.py +60 -24
- crackerjack/config/README.md +472 -0
- crackerjack/config/__init__.py +256 -0
- crackerjack/config/global_lock_config.py +191 -54
- crackerjack/config/hooks.py +188 -16
- 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/async_workflow_orchestrator.py +79 -53
- crackerjack/core/autofix_coordinator.py +22 -9
- crackerjack/core/container.py +10 -9
- crackerjack/core/enhanced_container.py +9 -9
- crackerjack/core/performance.py +1 -1
- crackerjack/core/performance_monitor.py +5 -3
- crackerjack/core/phase_coordinator.py +1018 -634
- crackerjack/core/proactive_workflow.py +3 -3
- crackerjack/core/retry.py +275 -0
- crackerjack/core/service_watchdog.py +167 -23
- crackerjack/core/session_coordinator.py +187 -382
- crackerjack/core/timeout_manager.py +161 -44
- 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 +1247 -953
- 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/README.md +11 -0
- crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
- crackerjack/documentation/README.md +11 -0
- crackerjack/documentation/ai_templates.py +1 -1
- crackerjack/documentation/dual_output_generator.py +11 -9
- crackerjack/documentation/reference_generator.py +104 -59
- crackerjack/dynamic_config.py +52 -61
- crackerjack/errors.py +1 -1
- 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 +2 -0
- crackerjack/executors/async_hook_executor.py +539 -77
- crackerjack/executors/cached_hook_executor.py +3 -3
- crackerjack/executors/hook_executor.py +967 -102
- crackerjack/executors/hook_lock_manager.py +31 -22
- crackerjack/executors/individual_hook_executor.py +66 -32
- crackerjack/executors/lsp_aware_hook_executor.py +136 -57
- crackerjack/executors/progress_hook_executor.py +282 -0
- crackerjack/executors/tool_proxy.py +23 -7
- crackerjack/hooks/README.md +485 -0
- crackerjack/hooks/lsp_hook.py +8 -9
- crackerjack/intelligence/README.md +557 -0
- crackerjack/interactive.py +37 -10
- crackerjack/managers/README.md +369 -0
- crackerjack/managers/async_hook_manager.py +41 -57
- crackerjack/managers/hook_manager.py +449 -79
- crackerjack/managers/publish_manager.py +81 -36
- crackerjack/managers/test_command_builder.py +290 -12
- crackerjack/managers/test_executor.py +93 -8
- crackerjack/managers/test_manager.py +1082 -75
- crackerjack/managers/test_progress.py +118 -26
- crackerjack/mcp/README.md +374 -0
- crackerjack/mcp/cache.py +25 -2
- crackerjack/mcp/client_runner.py +35 -18
- crackerjack/mcp/context.py +9 -9
- crackerjack/mcp/dashboard.py +24 -8
- crackerjack/mcp/enhanced_progress_monitor.py +34 -23
- crackerjack/mcp/file_monitor.py +27 -6
- crackerjack/mcp/progress_components.py +45 -34
- crackerjack/mcp/progress_monitor.py +6 -9
- crackerjack/mcp/rate_limiter.py +11 -7
- crackerjack/mcp/server.py +2 -0
- crackerjack/mcp/server_core.py +187 -55
- crackerjack/mcp/service_watchdog.py +12 -9
- crackerjack/mcp/task_manager.py +2 -2
- crackerjack/mcp/tools/README.md +27 -0
- crackerjack/mcp/tools/__init__.py +2 -0
- crackerjack/mcp/tools/core_tools.py +75 -52
- crackerjack/mcp/tools/execution_tools.py +87 -31
- crackerjack/mcp/tools/intelligence_tools.py +2 -2
- crackerjack/mcp/tools/proactive_tools.py +1 -1
- crackerjack/mcp/tools/semantic_tools.py +584 -0
- crackerjack/mcp/tools/utility_tools.py +180 -132
- crackerjack/mcp/tools/workflow_executor.py +87 -46
- crackerjack/mcp/websocket/README.md +31 -0
- crackerjack/mcp/websocket/app.py +11 -1
- crackerjack/mcp/websocket/event_bridge.py +188 -0
- crackerjack/mcp/websocket/jobs.py +27 -4
- 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 +16 -2930
- crackerjack/mcp/websocket/server.py +1 -3
- crackerjack/mcp/websocket/websocket_handler.py +107 -6
- crackerjack/models/README.md +308 -0
- crackerjack/models/__init__.py +10 -1
- crackerjack/models/config.py +639 -22
- crackerjack/models/config_adapter.py +6 -6
- crackerjack/models/protocols.py +1167 -23
- crackerjack/models/pydantic_models.py +320 -0
- crackerjack/models/qa_config.py +145 -0
- crackerjack/models/qa_results.py +134 -0
- crackerjack/models/results.py +35 -0
- crackerjack/models/semantic_models.py +258 -0
- crackerjack/models/task.py +19 -3
- crackerjack/models/test_models.py +60 -0
- crackerjack/monitoring/README.md +11 -0
- crackerjack/monitoring/ai_agent_watchdog.py +5 -4
- crackerjack/monitoring/metrics_collector.py +4 -3
- crackerjack/monitoring/regression_prevention.py +4 -3
- crackerjack/monitoring/websocket_server.py +4 -241
- crackerjack/orchestration/README.md +340 -0
- crackerjack/orchestration/__init__.py +43 -0
- crackerjack/orchestration/advanced_orchestrator.py +20 -67
- 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 +13 -6
- crackerjack/orchestration/execution_strategies.py +6 -6
- 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 +1 -1
- crackerjack/plugins/README.md +11 -0
- crackerjack/plugins/hooks.py +3 -2
- crackerjack/plugins/loader.py +3 -3
- crackerjack/plugins/managers.py +1 -1
- crackerjack/py313.py +191 -0
- crackerjack/security/README.md +11 -0
- crackerjack/services/README.md +374 -0
- crackerjack/services/__init__.py +8 -21
- crackerjack/services/ai/README.md +295 -0
- crackerjack/services/ai/__init__.py +7 -0
- crackerjack/services/ai/advanced_optimizer.py +878 -0
- crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
- 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/api_extractor.py +5 -3
- crackerjack/services/bounded_status_operations.py +45 -5
- crackerjack/services/cache.py +249 -318
- crackerjack/services/changelog_automation.py +7 -3
- crackerjack/services/command_execution_service.py +305 -0
- crackerjack/services/config_integrity.py +83 -39
- crackerjack/services/config_merge.py +9 -6
- crackerjack/services/config_service.py +198 -0
- crackerjack/services/config_template.py +13 -26
- crackerjack/services/coverage_badge_service.py +6 -4
- crackerjack/services/coverage_ratchet.py +53 -27
- crackerjack/services/debug.py +18 -7
- crackerjack/services/dependency_analyzer.py +4 -4
- crackerjack/services/dependency_monitor.py +13 -13
- crackerjack/services/documentation_generator.py +4 -2
- crackerjack/services/documentation_service.py +62 -33
- crackerjack/services/enhanced_filesystem.py +81 -27
- crackerjack/services/enterprise_optimizer.py +1 -1
- crackerjack/services/error_pattern_analyzer.py +10 -10
- crackerjack/services/file_filter.py +221 -0
- crackerjack/services/file_hasher.py +5 -7
- crackerjack/services/file_io_service.py +361 -0
- crackerjack/services/file_modifier.py +615 -0
- crackerjack/services/filesystem.py +80 -109
- crackerjack/services/git.py +99 -5
- crackerjack/services/health_metrics.py +4 -6
- crackerjack/services/heatmap_generator.py +12 -3
- crackerjack/services/incremental_executor.py +380 -0
- crackerjack/services/initialization.py +101 -49
- crackerjack/services/log_manager.py +2 -2
- crackerjack/services/logging.py +120 -68
- crackerjack/services/lsp_client.py +12 -12
- crackerjack/services/memory_optimizer.py +27 -22
- 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/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
- crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
- crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
- crackerjack/services/parallel_executor.py +166 -55
- 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 +21 -8
- 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_baseline.py → quality/quality_baseline.py} +163 -2
- crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
- crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
- crackerjack/services/regex_patterns.py +58 -2987
- crackerjack/services/regex_utils.py +55 -29
- crackerjack/services/secure_status_formatter.py +42 -15
- crackerjack/services/secure_subprocess.py +35 -2
- crackerjack/services/security.py +16 -8
- crackerjack/services/server_manager.py +40 -51
- crackerjack/services/smart_scheduling.py +46 -6
- crackerjack/services/status_authentication.py +3 -3
- crackerjack/services/thread_safe_status_collector.py +1 -0
- crackerjack/services/tool_filter.py +368 -0
- crackerjack/services/tool_version_service.py +9 -5
- crackerjack/services/unified_config.py +43 -351
- crackerjack/services/vector_store.py +689 -0
- crackerjack/services/version_analyzer.py +6 -4
- crackerjack/services/version_checker.py +14 -8
- crackerjack/services/zuban_lsp_service.py +5 -4
- crackerjack/slash_commands/README.md +11 -0
- crackerjack/slash_commands/init.md +2 -12
- crackerjack/slash_commands/run.md +84 -50
- 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_regex_patterns.py +7 -3
- crackerjack/ui/README.md +11 -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.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
- crackerjack-0.45.2.dist-info/RECORD +478 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
- crackerjack/managers/test_manager_backup.py +0 -1075
- crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
- crackerjack/mixins/__init__.py +0 -3
- crackerjack/mixins/error_handling.py +0 -145
- crackerjack/services/config.py +0 -358
- crackerjack/ui/server_panels.py +0 -125
- crackerjack-0.37.9.dist-info/RECORD +0 -231
- /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
- /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
crackerjack/py313.py
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
import typing
|
|
3
|
+
from enum import Enum, auto
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Any, Self, TypedDict
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CommandRunner[TReturn]:
|
|
9
|
+
def run_command(self, cmd: list[str], **kwargs: Any) -> TReturn:
|
|
10
|
+
raise NotImplementedError("Subclasses must implement run_command")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CommandResult(TypedDict):
|
|
14
|
+
success: bool
|
|
15
|
+
exit_code: int
|
|
16
|
+
stdout: str
|
|
17
|
+
stderr: str
|
|
18
|
+
command: list[str]
|
|
19
|
+
duration_ms: float
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def process_command_output(result: CommandResult) -> tuple[bool, str]:
|
|
23
|
+
match result:
|
|
24
|
+
case {"success": True, "stdout": stdout} if stdout.strip():
|
|
25
|
+
return (True, stdout)
|
|
26
|
+
case {"success": True}:
|
|
27
|
+
return (True, "Command completed successfully with no output")
|
|
28
|
+
case {"success": False, "exit_code": code, "stderr": stderr} if code == 127:
|
|
29
|
+
return (False, f"Command not found: {stderr}")
|
|
30
|
+
case {"success": False, "exit_code": code} if code > 0:
|
|
31
|
+
return (False, f"Command failed with exit code {code}: {result['stderr']}")
|
|
32
|
+
case _:
|
|
33
|
+
pass
|
|
34
|
+
return (False, "Unknown command result pattern")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class HookStatus(Enum):
|
|
38
|
+
SUCCESS = auto()
|
|
39
|
+
FAILURE = auto()
|
|
40
|
+
SKIPPED = auto()
|
|
41
|
+
ERROR = auto()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class HookResult(TypedDict):
|
|
45
|
+
status: HookStatus
|
|
46
|
+
hook_id: str
|
|
47
|
+
output: str
|
|
48
|
+
files: list[str]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def analyze_hook_result(result: HookResult) -> str:
|
|
52
|
+
match result:
|
|
53
|
+
case {"status": HookStatus.SUCCESS, "hook_id": hook_id}:
|
|
54
|
+
return f"✅ Hook {hook_id} passed successfully"
|
|
55
|
+
case {"status": HookStatus.FAILURE, "hook_id": hook_id, "output": output} if (
|
|
56
|
+
"fixable" in output
|
|
57
|
+
):
|
|
58
|
+
return f"🔧 Hook {hook_id} failed with fixable issues"
|
|
59
|
+
case {"status": HookStatus.FAILURE, "hook_id": hook_id}:
|
|
60
|
+
return f"❌ Hook {hook_id} failed"
|
|
61
|
+
case {"status": HookStatus.SKIPPED, "hook_id": hook_id}:
|
|
62
|
+
return f"⏩ Hook {hook_id} was skipped"
|
|
63
|
+
case {"status": HookStatus.ERROR, "hook_id": hook_id, "output": output}:
|
|
64
|
+
return f"💥 Hook {hook_id} encountered an error: {output}"
|
|
65
|
+
case _:
|
|
66
|
+
pass
|
|
67
|
+
return "Unknown hook result pattern"
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ModernConfigManager:
|
|
71
|
+
def __init__(self, config_path: Path) -> None:
|
|
72
|
+
self.config_path = config_path
|
|
73
|
+
self.config: dict[str, Any] = {}
|
|
74
|
+
|
|
75
|
+
def load(self) -> Self:
|
|
76
|
+
return self
|
|
77
|
+
|
|
78
|
+
def update(self, key: str, value: Any) -> Self:
|
|
79
|
+
self.config[key] = value
|
|
80
|
+
return self
|
|
81
|
+
|
|
82
|
+
def save(self) -> Self:
|
|
83
|
+
return self
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def categorize_file(file_path: Path) -> str:
|
|
87
|
+
path_str = str(file_path)
|
|
88
|
+
name = file_path
|
|
89
|
+
match path_str:
|
|
90
|
+
case s if name.suffix == ".py" and "/ tests /" in s:
|
|
91
|
+
return "Python Test File"
|
|
92
|
+
case s if name.suffix == ".py" and "__init__.py" in name.name:
|
|
93
|
+
return "Python Module Init"
|
|
94
|
+
case s if name.suffix == ".py":
|
|
95
|
+
return "Python Source File"
|
|
96
|
+
case s if name.suffix in {".md", ".rst", ".txt"}:
|
|
97
|
+
return "Documentation File"
|
|
98
|
+
case s if name.stem.startswith(".") or name.name in {
|
|
99
|
+
".gitignore",
|
|
100
|
+
".pre-commit-config.yaml",
|
|
101
|
+
}:
|
|
102
|
+
return "Configuration File"
|
|
103
|
+
case _:
|
|
104
|
+
pass
|
|
105
|
+
return "Unknown File Type"
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def process_hook_results[T: HookResult, R](
|
|
109
|
+
results: list[T],
|
|
110
|
+
success_handler: typing.Callable[[T], R],
|
|
111
|
+
failure_handler: typing.Callable[[T], R],
|
|
112
|
+
) -> list[R]:
|
|
113
|
+
processed_results: list[R] = []
|
|
114
|
+
for result in results:
|
|
115
|
+
if (
|
|
116
|
+
hasattr(result, "__getitem__") # Check if it supports dict-style access
|
|
117
|
+
and typing.cast(dict[str, typing.Any], result).get("status")
|
|
118
|
+
== HookStatus.SUCCESS
|
|
119
|
+
):
|
|
120
|
+
processed_results.append(success_handler(result))
|
|
121
|
+
else:
|
|
122
|
+
processed_results.append(failure_handler(result))
|
|
123
|
+
return processed_results
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class EnhancedCommandRunner:
|
|
127
|
+
def __init__(self, working_dir: Path | None = None) -> None:
|
|
128
|
+
self.working_dir = working_dir
|
|
129
|
+
|
|
130
|
+
def run(self, cmd: list[str], **kwargs: Any) -> CommandResult:
|
|
131
|
+
import time
|
|
132
|
+
|
|
133
|
+
start_time = time.time()
|
|
134
|
+
try:
|
|
135
|
+
process = subprocess.run(
|
|
136
|
+
cmd,
|
|
137
|
+
check=False,
|
|
138
|
+
capture_output=True,
|
|
139
|
+
text=True,
|
|
140
|
+
cwd=self.working_dir,
|
|
141
|
+
**kwargs,
|
|
142
|
+
)
|
|
143
|
+
duration_ms = (time.time() - start_time) * 1000
|
|
144
|
+
return CommandResult(
|
|
145
|
+
success=process.returncode == 0,
|
|
146
|
+
exit_code=process.returncode,
|
|
147
|
+
stdout=process.stdout,
|
|
148
|
+
stderr=process.stderr,
|
|
149
|
+
command=cmd,
|
|
150
|
+
duration_ms=duration_ms,
|
|
151
|
+
)
|
|
152
|
+
except subprocess.SubprocessError as e:
|
|
153
|
+
duration_ms = (time.time() - start_time) * 1000
|
|
154
|
+
return CommandResult(
|
|
155
|
+
success=False,
|
|
156
|
+
exit_code=-1,
|
|
157
|
+
stdout="",
|
|
158
|
+
stderr=str(e),
|
|
159
|
+
command=cmd,
|
|
160
|
+
duration_ms=duration_ms,
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
def handle_result(self, result: CommandResult) -> tuple[bool, str]:
|
|
164
|
+
return process_command_output(result)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def clean_python_code(code: str) -> str:
|
|
168
|
+
lines = code.splitlines()
|
|
169
|
+
cleaned_lines: list[str] = []
|
|
170
|
+
for line in lines:
|
|
171
|
+
match line.strip():
|
|
172
|
+
case "":
|
|
173
|
+
if not cleaned_lines or cleaned_lines[-1].strip():
|
|
174
|
+
cleaned_lines.append("")
|
|
175
|
+
case s if s.startswith(("import ", "from ")):
|
|
176
|
+
cleaned_lines.append(line)
|
|
177
|
+
case s if s.startswith("#"):
|
|
178
|
+
continue
|
|
179
|
+
case s if "#" in s and (
|
|
180
|
+
not any(
|
|
181
|
+
skip in s for skip in ("# noqa", "# type: ", "# pragma", "# skip")
|
|
182
|
+
)
|
|
183
|
+
):
|
|
184
|
+
code_part = line.split("#", 1)[0].rstrip()
|
|
185
|
+
if code_part:
|
|
186
|
+
cleaned_lines.append(code_part)
|
|
187
|
+
case s if s.startswith(('"""', "'''")):
|
|
188
|
+
continue
|
|
189
|
+
case _:
|
|
190
|
+
cleaned_lines.append(line)
|
|
191
|
+
return "\n".join(cleaned_lines)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../README.md>) | [Crackerjack Package](<../README.md>) | [Security](<./README.md>)
|
|
2
|
+
|
|
3
|
+
# Security
|
|
4
|
+
|
|
5
|
+
Security checks, validators, and related utilities.
|
|
6
|
+
|
|
7
|
+
## Related
|
|
8
|
+
|
|
9
|
+
- [Crackerjack Package](<../README.md>) - Parent package
|
|
10
|
+
- [Agents](<../agents/README.md>) - SecurityAgent for automated security fixes
|
|
11
|
+
- [Services](<../services/README.md>) - Security service implementations
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../README.md>) | [CLAUDE.md](../../docs/guides/CLAUDE.md) | [Services](<./README.md>)
|
|
2
|
+
|
|
3
|
+
# Services
|
|
4
|
+
|
|
5
|
+
Service abstractions and provider integrations for infrastructure, quality, monitoring, and AI capabilities.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The services package contains 60+ specialized service modules organized into functional categories. Services handle infrastructure concerns (filesystem, git, config), quality enforcement, monitoring, security, and AI integration. Most services follow ACB patterns with dependency injection and lifecycle management.
|
|
10
|
+
|
|
11
|
+
## Service Categories
|
|
12
|
+
|
|
13
|
+
### Core Infrastructure
|
|
14
|
+
|
|
15
|
+
**Filesystem & File Operations**
|
|
16
|
+
|
|
17
|
+
- `filesystem.py`: Core filesystem operations with path validation
|
|
18
|
+
- `enhanced_filesystem.py`: Advanced filesystem operations with atomic writes
|
|
19
|
+
- `file_modifier.py`: Safe file modification with backup and rollback
|
|
20
|
+
- `file_filter.py`: File filtering and pattern matching
|
|
21
|
+
- `file_hasher.py`: Content hashing for change detection
|
|
22
|
+
- `backup_service.py`: Automated backup creation and management
|
|
23
|
+
|
|
24
|
+
**Version Control**
|
|
25
|
+
|
|
26
|
+
- `git.py`: Git operations (commit, push, status, branch management)
|
|
27
|
+
- `intelligent_commit.py`: AI-powered commit message generation
|
|
28
|
+
- `changelog_automation.py`: Automatic changelog generation from commits
|
|
29
|
+
|
|
30
|
+
**Configuration Management**
|
|
31
|
+
|
|
32
|
+
- `unified_config.py`: Unified configuration loading and validation
|
|
33
|
+
- `config_merge.py`: Intelligent configuration merging for initialization
|
|
34
|
+
- `config_template.py`: Configuration template management and versioning
|
|
35
|
+
- `config_integrity.py`: Configuration validation and integrity checking
|
|
36
|
+
|
|
37
|
+
**Initialization**
|
|
38
|
+
|
|
39
|
+
- `initialization.py`: Project initialization and setup workflows
|
|
40
|
+
|
|
41
|
+
### Quality & Testing
|
|
42
|
+
|
|
43
|
+
**Coverage & Testing**
|
|
44
|
+
|
|
45
|
+
- `coverage_ratchet.py`: Coverage ratchet system (never decrease coverage)
|
|
46
|
+
- `coverage_badge_service.py`: Coverage badge generation and updates
|
|
47
|
+
- `incremental_executor.py`: Incremental test execution
|
|
48
|
+
- `parallel_executor.py`: Parallel test execution with pytest-xdist
|
|
49
|
+
|
|
50
|
+
**Quality Enforcement**
|
|
51
|
+
|
|
52
|
+
- `tool_filter.py`: Quality tool filtering and selection
|
|
53
|
+
- `tool_version_service.py`: Tool version management and compatibility
|
|
54
|
+
- `quality/` subdirectory — Quality-specific services
|
|
55
|
+
|
|
56
|
+
### Security
|
|
57
|
+
|
|
58
|
+
**Input Validation & Security**
|
|
59
|
+
|
|
60
|
+
- `input_validator.py`: Comprehensive input validation framework
|
|
61
|
+
- `validation_rate_limiter.py`: Rate limiting for validation failures
|
|
62
|
+
- `security.py`: Core security utilities and validation
|
|
63
|
+
- `security_logger.py`: Security event logging with severity levels
|
|
64
|
+
- `secure_path_utils.py`: Path traversal prevention and validation
|
|
65
|
+
- `secure_subprocess.py`: Safe subprocess execution without shell injection
|
|
66
|
+
|
|
67
|
+
**Status & Authentication**
|
|
68
|
+
|
|
69
|
+
- `status_security_manager.py`: Security manager for status operations
|
|
70
|
+
- `status_authentication.py`: Authentication for status endpoints
|
|
71
|
+
- `bounded_status_operations.py`: Bounded operations for status queries
|
|
72
|
+
- `thread_safe_status_collector.py`: Thread-safe status data collection
|
|
73
|
+
- `secure_status_formatter.py`: Secure formatting for status output
|
|
74
|
+
|
|
75
|
+
**Resource Management**
|
|
76
|
+
|
|
77
|
+
- `websocket_resource_limiter.py`: WebSocket connection and resource limits
|
|
78
|
+
|
|
79
|
+
### Monitoring & Metrics
|
|
80
|
+
|
|
81
|
+
**Health & Metrics**
|
|
82
|
+
|
|
83
|
+
- `health_metrics.py`: Health metrics collection and reporting
|
|
84
|
+
- `metrics.py`: General metrics tracking and aggregation
|
|
85
|
+
- `profiler.py`: Performance profiling and analysis
|
|
86
|
+
- `dependency_monitor.py`: Dependency health monitoring
|
|
87
|
+
- `monitoring/` subdirectory — Monitoring-specific services
|
|
88
|
+
|
|
89
|
+
**Debugging & Logging**
|
|
90
|
+
|
|
91
|
+
- `debug.py`: Debug utilities and helpers
|
|
92
|
+
- `logging.py`: Structured logging configuration
|
|
93
|
+
- `log_manager.py`: Log file management and rotation
|
|
94
|
+
|
|
95
|
+
### Pattern Analysis & Intelligence
|
|
96
|
+
|
|
97
|
+
**Pattern Detection & Analysis**
|
|
98
|
+
|
|
99
|
+
- `regex_patterns.py`: Centralized regex pattern registry (advanced-grade)
|
|
100
|
+
- `regex_utils.py`: Regex utilities and validation
|
|
101
|
+
- `pattern_detector.py`: Code pattern detection and analysis
|
|
102
|
+
- `pattern_cache.py`: Pattern caching for performance
|
|
103
|
+
- `error_pattern_analyzer.py`: Error pattern analysis and categorization
|
|
104
|
+
|
|
105
|
+
**AI & Intelligence**
|
|
106
|
+
|
|
107
|
+
- `anomaly_detector.py`: Anomaly detection in code and metrics
|
|
108
|
+
- `predictive_analytics.py`: Predictive analytics for quality trends
|
|
109
|
+
- `ai/` subdirectory — AI-specific services
|
|
110
|
+
- `vector_store.py`: Vector storage for semantic search
|
|
111
|
+
|
|
112
|
+
**Analysis & Optimization**
|
|
113
|
+
|
|
114
|
+
- `dependency_analyzer.py`: Dependency graph analysis
|
|
115
|
+
- `version_analyzer.py`: Version compatibility analysis
|
|
116
|
+
- `heatmap_generator.py`: Code complexity heatmap generation
|
|
117
|
+
- `memory_optimizer.py`: Memory usage optimization
|
|
118
|
+
- `enterprise_optimizer.py`: Enterprise-level optimization strategies
|
|
119
|
+
|
|
120
|
+
### Documentation & Code Analysis
|
|
121
|
+
|
|
122
|
+
**Documentation**
|
|
123
|
+
|
|
124
|
+
- `documentation_generator.py`: Automated API documentation generation
|
|
125
|
+
- `documentation_service.py`: Documentation management and updates
|
|
126
|
+
|
|
127
|
+
**Code Intelligence**
|
|
128
|
+
|
|
129
|
+
- `api_extractor.py`: API surface extraction and analysis
|
|
130
|
+
- `smart_scheduling.py`: Intelligent task scheduling
|
|
131
|
+
|
|
132
|
+
### Language Server Protocol (LSP)
|
|
133
|
+
|
|
134
|
+
**LSP Integration**
|
|
135
|
+
|
|
136
|
+
- `lsp_client.py`: Generic LSP client implementation
|
|
137
|
+
- `zuban_lsp_service.py`: Zuban LSP service integration
|
|
138
|
+
- `server_manager.py`: LSP server lifecycle management
|
|
139
|
+
|
|
140
|
+
### Utilities
|
|
141
|
+
|
|
142
|
+
**Cache & Performance**
|
|
143
|
+
|
|
144
|
+
- `cache.py`: General-purpose caching
|
|
145
|
+
- `terminal_utils.py`: Terminal and console utilities
|
|
146
|
+
- `version_checker.py`: Version checking and updates
|
|
147
|
+
|
|
148
|
+
## Architecture
|
|
149
|
+
|
|
150
|
+
### ACB Compliance Status
|
|
151
|
+
|
|
152
|
+
Based on Phase 2-4 refactoring audit:
|
|
153
|
+
|
|
154
|
+
| Category | Compliance | Status | Notes |
|
|
155
|
+
|----------|-----------|--------|-------|
|
|
156
|
+
| Core Infrastructure | 95% | ✅ Excellent | Phase 3 refactored, consistent constructors |
|
|
157
|
+
| Security Services | 95% | ✅ Excellent | Comprehensive validation and logging |
|
|
158
|
+
| Quality Services | 90% | ✅ Good | Coverage ratchet, testing infrastructure |
|
|
159
|
+
| Monitoring Services | 85% | ✅ Good | Health metrics, profiling |
|
|
160
|
+
| LSP Services | 80% | ✅ Good | Server management, client integration |
|
|
161
|
+
| AI Services | 75% | ⚠️ Mixed | Some legacy patterns remain |
|
|
162
|
+
|
|
163
|
+
### Dependency Injection Pattern
|
|
164
|
+
|
|
165
|
+
Most services follow ACB dependency injection:
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
from acb.depends import depends, Inject
|
|
169
|
+
from crackerjack.models.protocols import Console, CrackerjackCache
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
@depends.inject
|
|
173
|
+
class FileSystemService:
|
|
174
|
+
def __init__(
|
|
175
|
+
self,
|
|
176
|
+
console: Inject[Console] = None,
|
|
177
|
+
cache: Inject[CrackerjackCache] = None,
|
|
178
|
+
) -> None:
|
|
179
|
+
self.console = console
|
|
180
|
+
self.cache = cache
|
|
181
|
+
|
|
182
|
+
async def init(self) -> None:
|
|
183
|
+
# Async initialization if needed
|
|
184
|
+
pass
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Usage Examples
|
|
188
|
+
|
|
189
|
+
### Filesystem Operations
|
|
190
|
+
|
|
191
|
+
```python
|
|
192
|
+
from crackerjack.services.filesystem import FileSystemService
|
|
193
|
+
|
|
194
|
+
fs = FileSystemService()
|
|
195
|
+
await fs.init()
|
|
196
|
+
|
|
197
|
+
# Safe file operations
|
|
198
|
+
content = await fs.read_file(Path("config.yaml"))
|
|
199
|
+
await fs.write_file(Path("output.txt"), "data")
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Git Operations
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
from crackerjack.services.git import GitService
|
|
206
|
+
|
|
207
|
+
git = GitService()
|
|
208
|
+
await git.init()
|
|
209
|
+
|
|
210
|
+
# Commit with intelligent message
|
|
211
|
+
await git.commit_changes(
|
|
212
|
+
message="Auto-generated commit message", files=["file1.py", "file2.py"]
|
|
213
|
+
)
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Coverage Ratchet
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
from crackerjack.services.coverage_ratchet import CoverageRatchet
|
|
220
|
+
|
|
221
|
+
ratchet = CoverageRatchet()
|
|
222
|
+
current = 21.6
|
|
223
|
+
baseline = 19.6
|
|
224
|
+
|
|
225
|
+
if ratchet.validate_coverage(current, baseline):
|
|
226
|
+
print("Coverage improved!")
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Security Validation
|
|
230
|
+
|
|
231
|
+
```python
|
|
232
|
+
from crackerjack.services.input_validator import get_input_validator
|
|
233
|
+
|
|
234
|
+
validator = get_input_validator()
|
|
235
|
+
result = validator.validate_command_args("safe_command arg1 arg2")
|
|
236
|
+
|
|
237
|
+
if result.valid:
|
|
238
|
+
# Safe to execute
|
|
239
|
+
execute(result.sanitized_value)
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Pattern Detection
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
from crackerjack.services.regex_patterns import SAFE_PATTERNS
|
|
246
|
+
|
|
247
|
+
# Use centralized, validated patterns
|
|
248
|
+
text = SAFE_PATTERNS["fix_hyphenated_names"].apply(text)
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Service Subdirectories
|
|
252
|
+
|
|
253
|
+
### AI Services (`ai/`)
|
|
254
|
+
|
|
255
|
+
AI-specific services for code analysis and generation:
|
|
256
|
+
|
|
257
|
+
- Claude integration
|
|
258
|
+
- Code generation
|
|
259
|
+
- Semantic analysis
|
|
260
|
+
- See [ai/README.md](<./ai/README.md>)
|
|
261
|
+
|
|
262
|
+
### Monitoring Services (`monitoring/`)
|
|
263
|
+
|
|
264
|
+
Health and performance monitoring:
|
|
265
|
+
|
|
266
|
+
- Real-time metrics
|
|
267
|
+
- Performance tracking
|
|
268
|
+
- Resource monitoring
|
|
269
|
+
- See [monitoring/README.md](<./monitoring/README.md>)
|
|
270
|
+
|
|
271
|
+
### Quality Services (`quality/`)
|
|
272
|
+
|
|
273
|
+
Quality enforcement and tracking:
|
|
274
|
+
|
|
275
|
+
- Quality metrics
|
|
276
|
+
- Standards enforcement
|
|
277
|
+
- Compliance tracking
|
|
278
|
+
- See [quality/README.md](<./quality/README.md>)
|
|
279
|
+
|
|
280
|
+
### Pattern Services (`patterns/`)
|
|
281
|
+
|
|
282
|
+
Pattern detection and analysis:
|
|
283
|
+
|
|
284
|
+
- Code pattern recognition
|
|
285
|
+
- Anti-pattern detection
|
|
286
|
+
- Pattern libraries
|
|
287
|
+
- See [patterns/README.md](./patterns/README.md) (if exists)
|
|
288
|
+
|
|
289
|
+
## Configuration
|
|
290
|
+
|
|
291
|
+
Services use ACB Settings for configuration:
|
|
292
|
+
|
|
293
|
+
```python
|
|
294
|
+
from acb.depends import depends
|
|
295
|
+
from crackerjack.config import CrackerjackSettings
|
|
296
|
+
|
|
297
|
+
settings = depends.get(CrackerjackSettings)
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
Configuration files:
|
|
301
|
+
|
|
302
|
+
- `settings/crackerjack.yaml` — Base configuration
|
|
303
|
+
- `settings/local.yaml` — Local overrides (gitignored)
|
|
304
|
+
|
|
305
|
+
## Security Considerations
|
|
306
|
+
|
|
307
|
+
### Input Validation
|
|
308
|
+
|
|
309
|
+
All user input should be validated through `input_validator.py`:
|
|
310
|
+
|
|
311
|
+
```python
|
|
312
|
+
from crackerjack.services.input_validator import validate_and_sanitize_string
|
|
313
|
+
|
|
314
|
+
try:
|
|
315
|
+
safe_input = validate_and_sanitize_string(user_input)
|
|
316
|
+
# Use safe_input
|
|
317
|
+
except ExecutionError as e:
|
|
318
|
+
# Handle validation failure
|
|
319
|
+
pass
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Path Validation
|
|
323
|
+
|
|
324
|
+
Use `secure_path_utils.py` for all path operations:
|
|
325
|
+
|
|
326
|
+
```python
|
|
327
|
+
from crackerjack.services.secure_path_utils import SecurePathValidator
|
|
328
|
+
|
|
329
|
+
validated_path = SecurePathValidator.validate_file_path(
|
|
330
|
+
user_path, base_directory=project_root
|
|
331
|
+
)
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Subprocess Security
|
|
335
|
+
|
|
336
|
+
Use `secure_subprocess.py` instead of direct subprocess calls:
|
|
337
|
+
|
|
338
|
+
```python
|
|
339
|
+
from crackerjack.services.secure_subprocess import SecureSubprocess
|
|
340
|
+
|
|
341
|
+
result = await SecureSubprocess.run_command(
|
|
342
|
+
["python", "-m", "pytest"], cwd=project_root
|
|
343
|
+
)
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## Best Practices
|
|
347
|
+
|
|
348
|
+
1. **Use DI**: Always use dependency injection via `@depends.inject`
|
|
349
|
+
1. **Import Protocols**: Import from `models/protocols.py`, not concrete classes
|
|
350
|
+
1. **Validate Input**: Use input_validator for all external input
|
|
351
|
+
1. **Secure Paths**: Use SecurePathValidator for path operations
|
|
352
|
+
1. **Centralize Patterns**: Use regex_patterns.py instead of raw regex
|
|
353
|
+
1. **Handle Errors**: Use structured error handling with specific exceptions
|
|
354
|
+
1. **Log Security Events**: Use security_logger for security-relevant operations
|
|
355
|
+
1. **Cache Appropriately**: Use cache service for expensive operations
|
|
356
|
+
1. **Async When Needed**: Use async/await for I/O-bound operations
|
|
357
|
+
1. **Test Thoroughly**: Add tests for all new services
|
|
358
|
+
|
|
359
|
+
## Related
|
|
360
|
+
|
|
361
|
+
- [Adapters](<../adapters/README.md>) — Quality tool adapters that use services
|
|
362
|
+
- [Managers](<../managers/README.md>) — Managers that coordinate services
|
|
363
|
+
- [Orchestration](<../orchestration/README.md>) — Orchestration using services
|
|
364
|
+
- [Config](<../config/README.md>) — ACB Settings integration
|
|
365
|
+
- [SECURITY.md](<../../docs/reference/SECURITY.md>) — Security documentation
|
|
366
|
+
|
|
367
|
+
## Future Enhancements
|
|
368
|
+
|
|
369
|
+
- [ ] Standardize async/sync patterns across all services
|
|
370
|
+
- [ ] Add telemetry and observability
|
|
371
|
+
- [ ] Implement service health checks
|
|
372
|
+
- [ ] Add circuit breaker patterns for external services
|
|
373
|
+
- [ ] Create service benchmarking framework
|
|
374
|
+
- [ ] Develop service plugin system
|
crackerjack/services/__init__.py
CHANGED
|
@@ -1,22 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
from .config import ConfigurationService
|
|
3
|
-
from .file_hasher import FileHasher, SmartFileWatcher
|
|
4
|
-
from .filesystem import FileSystemService
|
|
5
|
-
from .git import GitService
|
|
6
|
-
from .initialization import InitializationService
|
|
7
|
-
from .security import SecurityService
|
|
1
|
+
"""Services for crackerjack.
|
|
8
2
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"FileSystemService",
|
|
17
|
-
"GitService",
|
|
18
|
-
"InMemoryCache",
|
|
19
|
-
"InitializationService",
|
|
20
|
-
"SecurityService",
|
|
21
|
-
"SmartFileWatcher",
|
|
22
|
-
]
|
|
3
|
+
This package contains service classes that provide business logic
|
|
4
|
+
and operations that are used across multiple components.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from crackerjack.services.file_modifier import SafeFileModifier
|
|
8
|
+
|
|
9
|
+
__all__ = ["SafeFileModifier"]
|