devsquad 3.6.6__tar.gz → 3.6.7__tar.gz
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.
- {devsquad-3.6.6 → devsquad-3.6.7}/PKG-INFO +10 -10
- {devsquad-3.6.6 → devsquad-3.6.7}/README.md +9 -9
- {devsquad-3.6.6 → devsquad-3.6.7}/devsquad.egg-info/PKG-INFO +10 -10
- {devsquad-3.6.6 → devsquad-3.6.7}/devsquad.egg-info/SOURCES.txt +14 -8
- {devsquad-3.6.6 → devsquad-3.6.7}/pyproject.toml +2 -6
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/MANUAL_PUBLISHING_GUIDE.md +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/PUBLISHING_GUIDE.md +2 -2
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/api/routes/metrics_gates.py +2 -2
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/api_server.py +17 -10
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/auth.py +13 -7
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/cli.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/__init__.py +11 -0
- devsquad-3.6.7/scripts/collaboration/_version.py +1 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/agent_briefing.py +8 -16
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/async_coordinator.py +38 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/checkpoint_manager.py +18 -20
- devsquad-3.6.7/scripts/collaboration/dispatch_models.py +359 -0
- devsquad-3.6.7/scripts/collaboration/dispatch_performance.py +235 -0
- devsquad-3.6.7/scripts/collaboration/dispatcher.py +2047 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/lifecycle_protocol.py +2 -15
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/llm_cache.py +157 -6
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/memory_bridge.py +2 -2
- devsquad-3.6.7/scripts/collaboration/multi_level_cache.py +703 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/performance_fingerprint.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/redis_cache.py +85 -1
- devsquad-3.6.6/scripts/collaboration/skillifier.py → devsquad-3.6.7/scripts/collaboration/skill_extractor.py +66 -431
- devsquad-3.6.7/scripts/collaboration/skill_storage.py +164 -0
- devsquad-3.6.7/scripts/collaboration/skillifier.py +466 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/workflow_engine.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/dashboard.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/history_manager.py +7 -6
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/mcp_server.py +2 -2
- {devsquad-3.6.6 → devsquad-3.6.7}/skills/__init__.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/skills/dispatch/handler.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/skills/intent/handler.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/skills/registry.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/skills/retrospective/handler.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/skills/review/handler.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/skills/security/handler.py +1 -1
- devsquad-3.6.7/skills/test/__init__.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/skills/test/handler.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_agent_briefing.py +8 -6
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_cli_deep_v362.py +22 -22
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_dispatcher_test.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_dispatcher_phase5_core.py +9 -9
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_history_manager_v362.py +6 -3
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_input_validator_phase5.py +5 -4
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_lifecycle_protocol.py +4 -2
- devsquad-3.6.7/tests/test_mcp_server_v362.py +606 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_permission_guard_phase5.py +49 -45
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_plan_c_unified_architecture.py +1 -1
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_production_features.py +2 -2
- devsquad-3.6.6/scripts/collaboration/_version.py +0 -1
- devsquad-3.6.6/scripts/collaboration/dispatcher.py +0 -1895
- devsquad-3.6.6/tests/test_mcp_server_v362.py +0 -545
- {devsquad-3.6.6 → devsquad-3.6.7}/LICENSE +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/devsquad.egg-info/dependency_links.txt +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/devsquad.egg-info/entry_points.txt +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/devsquad.egg-info/requires.txt +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/devsquad.egg-info/top_level.txt +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/RELEASE_NOTES_V3.6.5.md +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/__init__.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/ai_semantic_matcher.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/alert_manager.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/api/__init__.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/api/models.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/api/routes/__init__.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/api/routes/dispatch.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/api/routes/lifecycle.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/api/routes/metrics.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/cli/__init__.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/cli/cli_visual.py +0 -0
- {devsquad-3.6.6/skills/retrospective → devsquad-3.6.7/scripts/collaboration/_archived}/__init__.py +0 -0
- {devsquad-3.6.6/scripts/collaboration → devsquad-3.6.7/scripts/collaboration/_archived}/adaptive_role_selector_test.py +0 -0
- {devsquad-3.6.6/scripts/collaboration → devsquad-3.6.7/scripts/collaboration/_archived}/async_integration_example.py +0 -0
- {devsquad-3.6.6/scripts → devsquad-3.6.7/scripts/collaboration/_archived}/code_quality.py +0 -0
- {devsquad-3.6.6/scripts/collaboration → devsquad-3.6.7/scripts/collaboration/_archived}/execution_guard_test.py +0 -0
- {devsquad-3.6.6/scripts/collaboration → devsquad-3.6.7/scripts/collaboration/_archived}/feedback_control_loop_test.py +0 -0
- {devsquad-3.6.6/scripts/collaboration → devsquad-3.6.7/scripts/collaboration/_archived}/integration_example.py +0 -0
- {devsquad-3.6.6/scripts/collaboration → devsquad-3.6.7/scripts/collaboration/_archived}/multi_level_cache.py +0 -0
- {devsquad-3.6.6/scripts/collaboration → devsquad-3.6.7/scripts/collaboration/_archived}/similar_task_recommender_test.py +0 -0
- {devsquad-3.6.6/scripts/collaboration → devsquad-3.6.7/scripts/collaboration/_archived}/structured_logging.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/adaptive_role_selector.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/ai_semantic_matcher.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/anchor_checker.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/anti_rationalization.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/async_adapter.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/async_llm_backend.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/audit_logger.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/batch_scheduler.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/cache_interface.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/ci_feedback_adapter.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/code_map_generator.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/concern_pack_loader.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/confidence_score.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/config_loader.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/consensus.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/context_compressor.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/coordinator.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/dual_layer_context.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/enhanced_worker.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/execution_guard.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/feature_usage_tracker.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/feedback_control_loop.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/five_axis_consensus.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/input_validator.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/intent_workflow_mapper.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/language_parsers.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/llm_backend.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/llm_cache_async.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/llm_retry.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/llm_retry_async.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/mce_adapter.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/models.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/multi_tenant.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/null_providers.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/operation_classifier.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/output_slicer.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/performance_monitor.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/permission_guard.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/prometheus_metrics.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/prompt_assembler.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/prompt_variant_generator.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/protocols.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/rbac_engine.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/report_formatter.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/retrospective.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/role_matcher.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/role_template_market.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/rule_collector.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/scratchpad.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/similar_task_recommender.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/skill_registry.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/standardized_role_template.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/task_completion_checker.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/test_quality_guard.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/unified_gate_engine.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/usage_tracker.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/user_friendly_error.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/verification_gate.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/warmup_manager.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/collaboration/worker.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/generate_benchmark_report.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/scripts/verify_v361.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/setup.cfg +0 -0
- {devsquad-3.6.6/skills/test → devsquad-3.6.7/skills/retrospective}/__init__.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_anchor_retrospective.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_anti_rationalization.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_api_server_v362.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_auth_phase5.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_ci_feedback_adapter.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_cli_lifecycle.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_cli_phase5.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_claw_integration_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_context_compressor_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_core_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_dispatcher_ux_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_e2e_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_enhanced_e2e_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_llm_cache_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_llm_retry_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_mce_adapter_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_memory_bridge_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_performance_monitor_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_permission_guard_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_prompt_optimization_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_role_mapping_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_skillifier_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_test_quality_guard.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_test_quality_guard_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_upstream_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_collaboration_warmup_manager_test.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_comprehensive_integration.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_confidence_score.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_config_injection.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_extended_integration.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_final_integration.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_five_axis_consensus.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_full_lifecycle_adapter.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_intent_workflow_mapper.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_llm_cache_protocol.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_null_providers.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_operation_classifier.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_output_slicer.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_performance_fingerprint.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_performance_monitor_protocol.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_protocols.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_quick_bonus.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_rule_injection_security.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_standardized_role_template.py +0 -0
- {devsquad-3.6.6 → devsquad-3.6.7}/tests/test_verification_gate.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsquad
|
|
3
|
-
Version: 3.6.
|
|
3
|
+
Version: 3.6.7
|
|
4
4
|
Summary: Production-Ready Multi-Role AI Task Orchestrator
|
|
5
5
|
Author-email: DevSquad Team <devsquad@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -89,8 +89,8 @@ Dynamic: license-file
|
|
|
89
89
|
<p align="center">
|
|
90
90
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.9+-blue?logo=python&logoColor=white" />
|
|
91
91
|
<img alt="License" src="https://img.shields.io/badge/License-MIT-green" />
|
|
92
|
-
<img alt="Tests" src="https://img.shields.io/badge/Tests-
|
|
93
|
-
<img alt="Version" src="https://img.shields.io/badge/V3.6.
|
|
92
|
+
<img alt="Tests" src="https://img.shields.io/badge/Tests-1855%20passing-brightgreen" />
|
|
93
|
+
<img alt="Version" src="https://img.shields.io/badge/V3.6.7-success" />
|
|
94
94
|
<img alt="CI" src="https://img.shields.io/badge/CI-GitHub_Actions-blue?logo=githubactions" />
|
|
95
95
|
<img alt="Quality" src="https://img.shields.io/badge/Code%20Quality-4.3%2F5%20%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%86-blue" />
|
|
96
96
|
<img alt="Security" src="https://img.shields.io/badge/Security-5%2F5%20%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-success" />
|
|
@@ -151,9 +151,9 @@ devsquad run "设计一个安全的用户认证系统" --roles architect,securit
|
|
|
151
151
|
<details>
|
|
152
152
|
<summary>🔍 点击展开:完整功能介绍与架构详解</summary>
|
|
153
153
|
|
|
154
|
-
## 🚀 V3.6.
|
|
154
|
+
## 🚀 V3.6.7: Redis Cache + Async Dispatch + Dispatcher Refactor
|
|
155
155
|
|
|
156
|
-
**DevSquad V3.6.
|
|
156
|
+
**DevSquad V3.6.7** adds Redis Cache L2 backend for three-tier caching (memory→disk→Redis), async dispatch with `asyncio.gather` for concurrent LLM calls, dispatcher refactored from 788-line monolith into 18 step methods (extracted `dispatch_models.py` and `dispatch_performance.py`), fixed `DispatchResult.to_dict()`/`to_markdown()` missing 5 fields (data loss bug), cleaned up `except:pass` patterns, removed redundant `to_dict()` wrappers, and restored 183 previously xfailed tests — bringing total to 1855 tests passing with CI re-enabled.
|
|
157
157
|
|
|
158
158
|
---
|
|
159
159
|
|
|
@@ -254,7 +254,7 @@ User Task → [InputValidator] → [RoleMatcher] → [Coordinator Orchestration]
|
|
|
254
254
|
|
|
255
255
|
| Module | Purpose | When to Use |
|
|
256
256
|
|--------|---------|------------|
|
|
257
|
-
| **InputValidator** | Security validation +
|
|
257
|
+
| **InputValidator** | Security validation + 40-pattern detection (14 forbidden + 21 prompt injection + 5 suspicious) | Production environments |
|
|
258
258
|
| **VerificationGate** | Mandatory evidence requirements + 7 Red Flags detection | Critical decision scenarios |
|
|
259
259
|
| **AntiRationalizationEngine** | Per-role excuse→rebuttal tables to prevent quality shortcuts | High quality requirements |
|
|
260
260
|
| **TestQualityGuard** | Test quality audit (API validation / anti-pattern detection / dimension coverage) | Pre-release verification |
|
|
@@ -579,11 +579,11 @@ python3 scripts/cli.py roles # Expected: 7 core roles listed
|
|
|
579
579
|
|
|
580
580
|
### Full Test Suite
|
|
581
581
|
```bash
|
|
582
|
-
# Run all tests (
|
|
582
|
+
# Run all tests (1855 tests passing)
|
|
583
583
|
python3 -m pytest tests/ -q --tb=line
|
|
584
584
|
|
|
585
585
|
# With coverage report
|
|
586
|
-
python3 -m pytest tests/ --cov=scripts --cov-report=term-missing
|
|
586
|
+
python3 -m pytest tests/ --cov=scripts --cov-report=term-missing
|
|
587
587
|
```
|
|
588
588
|
|
|
589
589
|
### Test Layering Strategy
|
|
@@ -596,7 +596,7 @@ python3 -m pytest tests/ --cov=scripts --cov-report=term-missing --cov-fail-unde
|
|
|
596
596
|
| **P2** | Integration & E2E | Full lifecycle dispatch, cross-module integration | ~200 |
|
|
597
597
|
| **P3** | Unit per Module | Core dispatcher, RoleMapping, MCEAdapter, LLM backends | ~400+ |
|
|
598
598
|
|
|
599
|
-
**Total:
|
|
599
|
+
**Total: 1855 tests**
|
|
600
600
|
|
|
601
601
|
Run by priority:
|
|
602
602
|
```bash
|
|
@@ -660,6 +660,6 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
660
660
|
|
|
661
661
|
---
|
|
662
662
|
|
|
663
|
-
*Last updated: 2026-
|
|
663
|
+
*Last updated: 2026-06-07 | Version: V3.6.7*
|
|
664
664
|
|
|
665
665
|
</details>
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
<p align="center">
|
|
10
10
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.9+-blue?logo=python&logoColor=white" />
|
|
11
11
|
<img alt="License" src="https://img.shields.io/badge/License-MIT-green" />
|
|
12
|
-
<img alt="Tests" src="https://img.shields.io/badge/Tests-
|
|
13
|
-
<img alt="Version" src="https://img.shields.io/badge/V3.6.
|
|
12
|
+
<img alt="Tests" src="https://img.shields.io/badge/Tests-1855%20passing-brightgreen" />
|
|
13
|
+
<img alt="Version" src="https://img.shields.io/badge/V3.6.7-success" />
|
|
14
14
|
<img alt="CI" src="https://img.shields.io/badge/CI-GitHub_Actions-blue?logo=githubactions" />
|
|
15
15
|
<img alt="Quality" src="https://img.shields.io/badge/Code%20Quality-4.3%2F5%20%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%86-blue" />
|
|
16
16
|
<img alt="Security" src="https://img.shields.io/badge/Security-5%2F5%20%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-success" />
|
|
@@ -71,9 +71,9 @@ devsquad run "设计一个安全的用户认证系统" --roles architect,securit
|
|
|
71
71
|
<details>
|
|
72
72
|
<summary>🔍 点击展开:完整功能介绍与架构详解</summary>
|
|
73
73
|
|
|
74
|
-
## 🚀 V3.6.
|
|
74
|
+
## 🚀 V3.6.7: Redis Cache + Async Dispatch + Dispatcher Refactor
|
|
75
75
|
|
|
76
|
-
**DevSquad V3.6.
|
|
76
|
+
**DevSquad V3.6.7** adds Redis Cache L2 backend for three-tier caching (memory→disk→Redis), async dispatch with `asyncio.gather` for concurrent LLM calls, dispatcher refactored from 788-line monolith into 18 step methods (extracted `dispatch_models.py` and `dispatch_performance.py`), fixed `DispatchResult.to_dict()`/`to_markdown()` missing 5 fields (data loss bug), cleaned up `except:pass` patterns, removed redundant `to_dict()` wrappers, and restored 183 previously xfailed tests — bringing total to 1855 tests passing with CI re-enabled.
|
|
77
77
|
|
|
78
78
|
---
|
|
79
79
|
|
|
@@ -174,7 +174,7 @@ User Task → [InputValidator] → [RoleMatcher] → [Coordinator Orchestration]
|
|
|
174
174
|
|
|
175
175
|
| Module | Purpose | When to Use |
|
|
176
176
|
|--------|---------|------------|
|
|
177
|
-
| **InputValidator** | Security validation +
|
|
177
|
+
| **InputValidator** | Security validation + 40-pattern detection (14 forbidden + 21 prompt injection + 5 suspicious) | Production environments |
|
|
178
178
|
| **VerificationGate** | Mandatory evidence requirements + 7 Red Flags detection | Critical decision scenarios |
|
|
179
179
|
| **AntiRationalizationEngine** | Per-role excuse→rebuttal tables to prevent quality shortcuts | High quality requirements |
|
|
180
180
|
| **TestQualityGuard** | Test quality audit (API validation / anti-pattern detection / dimension coverage) | Pre-release verification |
|
|
@@ -499,11 +499,11 @@ python3 scripts/cli.py roles # Expected: 7 core roles listed
|
|
|
499
499
|
|
|
500
500
|
### Full Test Suite
|
|
501
501
|
```bash
|
|
502
|
-
# Run all tests (
|
|
502
|
+
# Run all tests (1855 tests passing)
|
|
503
503
|
python3 -m pytest tests/ -q --tb=line
|
|
504
504
|
|
|
505
505
|
# With coverage report
|
|
506
|
-
python3 -m pytest tests/ --cov=scripts --cov-report=term-missing
|
|
506
|
+
python3 -m pytest tests/ --cov=scripts --cov-report=term-missing
|
|
507
507
|
```
|
|
508
508
|
|
|
509
509
|
### Test Layering Strategy
|
|
@@ -516,7 +516,7 @@ python3 -m pytest tests/ --cov=scripts --cov-report=term-missing --cov-fail-unde
|
|
|
516
516
|
| **P2** | Integration & E2E | Full lifecycle dispatch, cross-module integration | ~200 |
|
|
517
517
|
| **P3** | Unit per Module | Core dispatcher, RoleMapping, MCEAdapter, LLM backends | ~400+ |
|
|
518
518
|
|
|
519
|
-
**Total:
|
|
519
|
+
**Total: 1855 tests**
|
|
520
520
|
|
|
521
521
|
Run by priority:
|
|
522
522
|
```bash
|
|
@@ -580,6 +580,6 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
580
580
|
|
|
581
581
|
---
|
|
582
582
|
|
|
583
|
-
*Last updated: 2026-
|
|
583
|
+
*Last updated: 2026-06-07 | Version: V3.6.7*
|
|
584
584
|
|
|
585
585
|
</details>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsquad
|
|
3
|
-
Version: 3.6.
|
|
3
|
+
Version: 3.6.7
|
|
4
4
|
Summary: Production-Ready Multi-Role AI Task Orchestrator
|
|
5
5
|
Author-email: DevSquad Team <devsquad@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -89,8 +89,8 @@ Dynamic: license-file
|
|
|
89
89
|
<p align="center">
|
|
90
90
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.9+-blue?logo=python&logoColor=white" />
|
|
91
91
|
<img alt="License" src="https://img.shields.io/badge/License-MIT-green" />
|
|
92
|
-
<img alt="Tests" src="https://img.shields.io/badge/Tests-
|
|
93
|
-
<img alt="Version" src="https://img.shields.io/badge/V3.6.
|
|
92
|
+
<img alt="Tests" src="https://img.shields.io/badge/Tests-1855%20passing-brightgreen" />
|
|
93
|
+
<img alt="Version" src="https://img.shields.io/badge/V3.6.7-success" />
|
|
94
94
|
<img alt="CI" src="https://img.shields.io/badge/CI-GitHub_Actions-blue?logo=githubactions" />
|
|
95
95
|
<img alt="Quality" src="https://img.shields.io/badge/Code%20Quality-4.3%2F5%20%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%86-blue" />
|
|
96
96
|
<img alt="Security" src="https://img.shields.io/badge/Security-5%2F5%20%E2%98%85%E2%98%85%E2%98%85%E2%98%85%E2%98%85-success" />
|
|
@@ -151,9 +151,9 @@ devsquad run "设计一个安全的用户认证系统" --roles architect,securit
|
|
|
151
151
|
<details>
|
|
152
152
|
<summary>🔍 点击展开:完整功能介绍与架构详解</summary>
|
|
153
153
|
|
|
154
|
-
## 🚀 V3.6.
|
|
154
|
+
## 🚀 V3.6.7: Redis Cache + Async Dispatch + Dispatcher Refactor
|
|
155
155
|
|
|
156
|
-
**DevSquad V3.6.
|
|
156
|
+
**DevSquad V3.6.7** adds Redis Cache L2 backend for three-tier caching (memory→disk→Redis), async dispatch with `asyncio.gather` for concurrent LLM calls, dispatcher refactored from 788-line monolith into 18 step methods (extracted `dispatch_models.py` and `dispatch_performance.py`), fixed `DispatchResult.to_dict()`/`to_markdown()` missing 5 fields (data loss bug), cleaned up `except:pass` patterns, removed redundant `to_dict()` wrappers, and restored 183 previously xfailed tests — bringing total to 1855 tests passing with CI re-enabled.
|
|
157
157
|
|
|
158
158
|
---
|
|
159
159
|
|
|
@@ -254,7 +254,7 @@ User Task → [InputValidator] → [RoleMatcher] → [Coordinator Orchestration]
|
|
|
254
254
|
|
|
255
255
|
| Module | Purpose | When to Use |
|
|
256
256
|
|--------|---------|------------|
|
|
257
|
-
| **InputValidator** | Security validation +
|
|
257
|
+
| **InputValidator** | Security validation + 40-pattern detection (14 forbidden + 21 prompt injection + 5 suspicious) | Production environments |
|
|
258
258
|
| **VerificationGate** | Mandatory evidence requirements + 7 Red Flags detection | Critical decision scenarios |
|
|
259
259
|
| **AntiRationalizationEngine** | Per-role excuse→rebuttal tables to prevent quality shortcuts | High quality requirements |
|
|
260
260
|
| **TestQualityGuard** | Test quality audit (API validation / anti-pattern detection / dimension coverage) | Pre-release verification |
|
|
@@ -579,11 +579,11 @@ python3 scripts/cli.py roles # Expected: 7 core roles listed
|
|
|
579
579
|
|
|
580
580
|
### Full Test Suite
|
|
581
581
|
```bash
|
|
582
|
-
# Run all tests (
|
|
582
|
+
# Run all tests (1855 tests passing)
|
|
583
583
|
python3 -m pytest tests/ -q --tb=line
|
|
584
584
|
|
|
585
585
|
# With coverage report
|
|
586
|
-
python3 -m pytest tests/ --cov=scripts --cov-report=term-missing
|
|
586
|
+
python3 -m pytest tests/ --cov=scripts --cov-report=term-missing
|
|
587
587
|
```
|
|
588
588
|
|
|
589
589
|
### Test Layering Strategy
|
|
@@ -596,7 +596,7 @@ python3 -m pytest tests/ --cov=scripts --cov-report=term-missing --cov-fail-unde
|
|
|
596
596
|
| **P2** | Integration & E2E | Full lifecycle dispatch, cross-module integration | ~200 |
|
|
597
597
|
| **P3** | Unit per Module | Core dispatcher, RoleMapping, MCEAdapter, LLM backends | ~400+ |
|
|
598
598
|
|
|
599
|
-
**Total:
|
|
599
|
+
**Total: 1855 tests**
|
|
600
600
|
|
|
601
601
|
Run by priority:
|
|
602
602
|
```bash
|
|
@@ -660,6 +660,6 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
660
660
|
|
|
661
661
|
---
|
|
662
662
|
|
|
663
|
-
*Last updated: 2026-
|
|
663
|
+
*Last updated: 2026-06-07 | Version: V3.6.7*
|
|
664
664
|
|
|
665
665
|
</details>
|
|
@@ -16,7 +16,6 @@ scripts/alert_manager.py
|
|
|
16
16
|
scripts/api_server.py
|
|
17
17
|
scripts/auth.py
|
|
18
18
|
scripts/cli.py
|
|
19
|
-
scripts/code_quality.py
|
|
20
19
|
scripts/dashboard.py
|
|
21
20
|
scripts/generate_benchmark_report.py
|
|
22
21
|
scripts/history_manager.py
|
|
@@ -34,14 +33,12 @@ scripts/cli/cli_visual.py
|
|
|
34
33
|
scripts/collaboration/__init__.py
|
|
35
34
|
scripts/collaboration/_version.py
|
|
36
35
|
scripts/collaboration/adaptive_role_selector.py
|
|
37
|
-
scripts/collaboration/adaptive_role_selector_test.py
|
|
38
36
|
scripts/collaboration/agent_briefing.py
|
|
39
37
|
scripts/collaboration/ai_semantic_matcher.py
|
|
40
38
|
scripts/collaboration/anchor_checker.py
|
|
41
39
|
scripts/collaboration/anti_rationalization.py
|
|
42
40
|
scripts/collaboration/async_adapter.py
|
|
43
41
|
scripts/collaboration/async_coordinator.py
|
|
44
|
-
scripts/collaboration/async_integration_example.py
|
|
45
42
|
scripts/collaboration/async_llm_backend.py
|
|
46
43
|
scripts/collaboration/audit_logger.py
|
|
47
44
|
scripts/collaboration/batch_scheduler.py
|
|
@@ -55,17 +52,16 @@ scripts/collaboration/config_loader.py
|
|
|
55
52
|
scripts/collaboration/consensus.py
|
|
56
53
|
scripts/collaboration/context_compressor.py
|
|
57
54
|
scripts/collaboration/coordinator.py
|
|
55
|
+
scripts/collaboration/dispatch_models.py
|
|
56
|
+
scripts/collaboration/dispatch_performance.py
|
|
58
57
|
scripts/collaboration/dispatcher.py
|
|
59
58
|
scripts/collaboration/dual_layer_context.py
|
|
60
59
|
scripts/collaboration/enhanced_worker.py
|
|
61
60
|
scripts/collaboration/execution_guard.py
|
|
62
|
-
scripts/collaboration/execution_guard_test.py
|
|
63
61
|
scripts/collaboration/feature_usage_tracker.py
|
|
64
62
|
scripts/collaboration/feedback_control_loop.py
|
|
65
|
-
scripts/collaboration/feedback_control_loop_test.py
|
|
66
63
|
scripts/collaboration/five_axis_consensus.py
|
|
67
64
|
scripts/collaboration/input_validator.py
|
|
68
|
-
scripts/collaboration/integration_example.py
|
|
69
65
|
scripts/collaboration/intent_workflow_mapper.py
|
|
70
66
|
scripts/collaboration/language_parsers.py
|
|
71
67
|
scripts/collaboration/lifecycle_protocol.py
|
|
@@ -98,11 +94,11 @@ scripts/collaboration/role_template_market.py
|
|
|
98
94
|
scripts/collaboration/rule_collector.py
|
|
99
95
|
scripts/collaboration/scratchpad.py
|
|
100
96
|
scripts/collaboration/similar_task_recommender.py
|
|
101
|
-
scripts/collaboration/
|
|
97
|
+
scripts/collaboration/skill_extractor.py
|
|
102
98
|
scripts/collaboration/skill_registry.py
|
|
99
|
+
scripts/collaboration/skill_storage.py
|
|
103
100
|
scripts/collaboration/skillifier.py
|
|
104
101
|
scripts/collaboration/standardized_role_template.py
|
|
105
|
-
scripts/collaboration/structured_logging.py
|
|
106
102
|
scripts/collaboration/task_completion_checker.py
|
|
107
103
|
scripts/collaboration/test_quality_guard.py
|
|
108
104
|
scripts/collaboration/unified_gate_engine.py
|
|
@@ -112,6 +108,16 @@ scripts/collaboration/verification_gate.py
|
|
|
112
108
|
scripts/collaboration/warmup_manager.py
|
|
113
109
|
scripts/collaboration/worker.py
|
|
114
110
|
scripts/collaboration/workflow_engine.py
|
|
111
|
+
scripts/collaboration/_archived/__init__.py
|
|
112
|
+
scripts/collaboration/_archived/adaptive_role_selector_test.py
|
|
113
|
+
scripts/collaboration/_archived/async_integration_example.py
|
|
114
|
+
scripts/collaboration/_archived/code_quality.py
|
|
115
|
+
scripts/collaboration/_archived/execution_guard_test.py
|
|
116
|
+
scripts/collaboration/_archived/feedback_control_loop_test.py
|
|
117
|
+
scripts/collaboration/_archived/integration_example.py
|
|
118
|
+
scripts/collaboration/_archived/multi_level_cache.py
|
|
119
|
+
scripts/collaboration/_archived/similar_task_recommender_test.py
|
|
120
|
+
scripts/collaboration/_archived/structured_logging.py
|
|
115
121
|
skills/__init__.py
|
|
116
122
|
skills/registry.py
|
|
117
123
|
skills/dispatch/handler.py
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "devsquad"
|
|
7
|
-
version = "3.6.
|
|
7
|
+
version = "3.6.7"
|
|
8
8
|
description = "Production-Ready Multi-Role AI Task Orchestrator"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -158,7 +158,7 @@ module = "tests.*"
|
|
|
158
158
|
disallow_untyped_defs = false
|
|
159
159
|
|
|
160
160
|
[tool.pytest.ini_options]
|
|
161
|
-
testpaths = ["tests"
|
|
161
|
+
testpaths = ["tests"]
|
|
162
162
|
python_files = ["test_*.py", "*_test.py"]
|
|
163
163
|
python_classes = ["Test*"]
|
|
164
164
|
python_functions = ["test_*"]
|
|
@@ -166,10 +166,6 @@ addopts = [
|
|
|
166
166
|
"-v",
|
|
167
167
|
"--tb=short",
|
|
168
168
|
"--strict-markers",
|
|
169
|
-
"--cov=scripts",
|
|
170
|
-
"--cov-report=term-missing",
|
|
171
|
-
"--cov-report=html:htmlcov",
|
|
172
|
-
"--cov-fail-under=80",
|
|
173
169
|
]
|
|
174
170
|
markers = [
|
|
175
171
|
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
4. **更新 Description** 为以下内容:
|
|
28
28
|
|
|
29
29
|
```
|
|
30
|
-
🚀 DevSquad V3.6.6 - Enterprise Multi-Role AI Task Orchestrator | 7-Agent Collaboration | RBAC | Audit Log | E2E Tested |
|
|
30
|
+
🚀 DevSquad V3.6.6 - Enterprise Multi-Role AI Task Orchestrator | 7-Agent Collaboration | RBAC | Audit Log | E2E Tested | 1672 Tests | PyPI Ready
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
5. **添加 Topics** (在 Topics 输入框中,用逗号或回车分隔):
|
|
@@ -76,7 +76,7 @@ curl -X PATCH \
|
|
|
76
76
|
3. 滚动到 "About" 区域
|
|
77
77
|
4. 更新 Description 为:
|
|
78
78
|
```
|
|
79
|
-
🚀 DevSquad V3.6.6 - Enterprise Multi-Role AI Task Orchestrator | 7-Agent Collaboration | RBAC | Audit Log | E2E Tested |
|
|
79
|
+
🚀 DevSquad V3.6.6 - Enterprise Multi-Role AI Task Orchestrator | 7-Agent Collaboration | RBAC | Audit Log | E2E Tested | 1672 Tests | PyPI Ready
|
|
80
80
|
```
|
|
81
81
|
5. 添加 Topics (最多20个):
|
|
82
82
|
```
|
|
@@ -174,7 +174,7 @@ Great news! DevSquad V3.6.6 is now available with major enterprise features:
|
|
|
174
174
|
🆕 What's New:
|
|
175
175
|
• Enterprise Security: RBAC + Audit Logging + PII Masking
|
|
176
176
|
• Performance Boost: 2x faster with AsyncIO + Redis cache
|
|
177
|
-
• Quality Assurance:
|
|
177
|
+
• Quality Assurance: 16 User Journey E2E tests (100% pass rate)
|
|
178
178
|
• Code Quality: Full logging migration + pre-commit hooks
|
|
179
179
|
|
|
180
180
|
📦 Upgrade Today:
|
|
@@ -330,7 +330,7 @@ async def health_check():
|
|
|
330
330
|
|
|
331
331
|
return HealthCheck(
|
|
332
332
|
status=overall_status,
|
|
333
|
-
version="3.6.
|
|
333
|
+
version="3.6.7",
|
|
334
334
|
uptime_seconds=round(uptime, 2),
|
|
335
335
|
components=components,
|
|
336
336
|
timestamp=datetime.now(),
|
|
@@ -340,7 +340,7 @@ async def health_check():
|
|
|
340
340
|
logger.error(f"Health check failed: {e}")
|
|
341
341
|
return HealthCheck(
|
|
342
342
|
status="unhealthy",
|
|
343
|
-
version="3.6.
|
|
343
|
+
version="3.6.7",
|
|
344
344
|
uptime_seconds=time.time() - _start_time,
|
|
345
345
|
components={"error": str(e)},
|
|
346
346
|
timestamp=datetime.now(),
|
|
@@ -83,10 +83,10 @@ app = FastAPI(
|
|
|
83
83
|
|
|
84
84
|
---
|
|
85
85
|
|
|
86
|
-
**Version**: 3.6.
|
|
86
|
+
**Version**: 3.6.7
|
|
87
87
|
**Base URL**: `/api/v1`
|
|
88
88
|
""",
|
|
89
|
-
version="3.6.
|
|
89
|
+
version="3.6.7",
|
|
90
90
|
docs_url="/docs", # Swagger UI
|
|
91
91
|
redoc_url="/redoc", # ReDoc
|
|
92
92
|
openapi_url="/openapi.json", # OpenAPI spec
|
|
@@ -102,13 +102,20 @@ app = FastAPI(
|
|
|
102
102
|
)
|
|
103
103
|
|
|
104
104
|
# Add CORS middleware
|
|
105
|
-
#
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
]
|
|
105
|
+
# ⚠️ Do NOT use wildcard "*" with allow_credentials=True (CORS spec violation)
|
|
106
|
+
# Configure allowed origins explicitly; use env var DEVSQUAD_CORS_ORIGINS in production
|
|
107
|
+
import os as _os
|
|
108
|
+
|
|
109
|
+
_cors_origins_str = _os.environ.get("DEVSQUAD_CORS_ORIGINS", "")
|
|
110
|
+
if _cors_origins_str:
|
|
111
|
+
allowed_origins = [o.strip() for o in _cors_origins_str.split(",") if o.strip()]
|
|
112
|
+
else:
|
|
113
|
+
# Development defaults only - no wildcard with credentials
|
|
114
|
+
allowed_origins = [
|
|
115
|
+
"http://localhost:8501", # DevSquad Dashboard
|
|
116
|
+
"http://localhost:8000", # API Server
|
|
117
|
+
"http://localhost:3000", # Frontend dev server
|
|
118
|
+
]
|
|
112
119
|
|
|
113
120
|
app.add_middleware(
|
|
114
121
|
CORSMiddleware,
|
|
@@ -211,7 +218,7 @@ async def root():
|
|
|
211
218
|
"""
|
|
212
219
|
return {
|
|
213
220
|
"name": "DevSquad API",
|
|
214
|
-
"version": "3.6.
|
|
221
|
+
"version": "3.6.7",
|
|
215
222
|
"description": "Production REST API for DevSquad multi-agent collaboration",
|
|
216
223
|
"documentation": {"swagger_ui": "/docs", "redoc": "/redoc", "openapi_spec": "/openapi.json"},
|
|
217
224
|
"endpoints": {
|
|
@@ -221,15 +221,21 @@ class AuthManager:
|
|
|
221
221
|
import streamlit as st
|
|
222
222
|
|
|
223
223
|
if not self.auth_enabled:
|
|
224
|
-
# Authentication disabled, set default
|
|
224
|
+
# Authentication disabled, set default viewer user (NOT admin!)
|
|
225
|
+
# ⚠️ Without auth, grant minimum privilege only.
|
|
226
|
+
# If admin access is needed, enable authentication.
|
|
225
227
|
if "user" not in st.session_state:
|
|
226
228
|
st.session_state.user = User(
|
|
227
|
-
username="
|
|
228
|
-
email="
|
|
229
|
-
name="
|
|
230
|
-
role=UserRole.
|
|
229
|
+
username="anonymous",
|
|
230
|
+
email="anonymous@devsquad.local",
|
|
231
|
+
name="Anonymous Viewer",
|
|
232
|
+
role=UserRole.VIEWER,
|
|
231
233
|
authenticated_at=datetime.now(),
|
|
232
|
-
session_id="
|
|
234
|
+
session_id="no_auth_mode",
|
|
235
|
+
)
|
|
236
|
+
_logger.warning(
|
|
237
|
+
"Auth disabled: granting VIEWER role (not admin). "
|
|
238
|
+
"Enable authentication for admin access."
|
|
233
239
|
)
|
|
234
240
|
return
|
|
235
241
|
|
|
@@ -445,7 +451,7 @@ def create_demo_credentials():
|
|
|
445
451
|
_logger.info("=" * 50)
|
|
446
452
|
for username, info in demo_users.items():
|
|
447
453
|
_logger.info("Username: %s, Role: %s", username, info["role"])
|
|
448
|
-
|
|
454
|
+
# ⚠️ Do NOT log password hashes (even partial) - security risk
|
|
449
455
|
|
|
450
456
|
_logger.info("\n" + "=" * 50)
|
|
451
457
|
_logger.info("⚠️ Set passwords via environment variables:")
|
|
@@ -17,7 +17,7 @@ import os
|
|
|
17
17
|
import sys
|
|
18
18
|
|
|
19
19
|
if sys.version_info < (3, 9):
|
|
20
|
-
|
|
20
|
+
print("Error: DevSquad requires Python 3.9+. Current: %s" % sys.version, file=sys.stderr)
|
|
21
21
|
sys.exit(1)
|
|
22
22
|
|
|
23
23
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
|
|
@@ -90,6 +90,12 @@ from .llm_retry import (
|
|
|
90
90
|
retry_with_fallback,
|
|
91
91
|
)
|
|
92
92
|
|
|
93
|
+
# Async LLM Retry exports
|
|
94
|
+
from .llm_retry_async import AsyncLLMRetryManager
|
|
95
|
+
|
|
96
|
+
# Multi-Level Cache exports
|
|
97
|
+
from .multi_level_cache import MemoryCacheBackend, MultiLevelCacheCoordinator
|
|
98
|
+
|
|
93
99
|
# Data models exports
|
|
94
100
|
from .models import (
|
|
95
101
|
ROLE_WEIGHTS,
|
|
@@ -146,6 +152,9 @@ __all__ = [
|
|
|
146
152
|
"CacheEntry",
|
|
147
153
|
"get_llm_cache",
|
|
148
154
|
"reset_cache",
|
|
155
|
+
# Multi-Level Cache
|
|
156
|
+
"MultiLevelCacheCoordinator",
|
|
157
|
+
"MemoryCacheBackend",
|
|
149
158
|
# Retry
|
|
150
159
|
"LLMRetryManager",
|
|
151
160
|
"RetryConfig",
|
|
@@ -154,6 +163,8 @@ __all__ = [
|
|
|
154
163
|
"CircuitBreakerError",
|
|
155
164
|
"get_retry_manager",
|
|
156
165
|
"retry_with_fallback",
|
|
166
|
+
# Async Retry
|
|
167
|
+
"AsyncLLMRetryManager",
|
|
157
168
|
# Monitor
|
|
158
169
|
"PerformanceMonitor",
|
|
159
170
|
"PerformanceMetric",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "3.6.7"
|
|
@@ -58,10 +58,6 @@ class BriefingSection:
|
|
|
58
58
|
timestamp: float = field(default_factory=lambda: datetime.now().timestamp())
|
|
59
59
|
metadata: dict[str, Any] = field(default_factory=dict)
|
|
60
60
|
|
|
61
|
-
def to_dict(self) -> dict[str, Any]:
|
|
62
|
-
"""Convert to dictionary"""
|
|
63
|
-
return asdict(self)
|
|
64
|
-
|
|
65
61
|
|
|
66
62
|
@dataclass
|
|
67
63
|
class AgentContext:
|
|
@@ -73,10 +69,6 @@ class AgentContext:
|
|
|
73
69
|
preferences: dict[str, Any] = field(default_factory=dict)
|
|
74
70
|
history: list[dict[str, Any]] = field(default_factory=list)
|
|
75
71
|
|
|
76
|
-
def to_dict(self) -> dict[str, Any]:
|
|
77
|
-
"""Convert to dictionary"""
|
|
78
|
-
return asdict(self)
|
|
79
|
-
|
|
80
72
|
|
|
81
73
|
class AgentBriefing:
|
|
82
74
|
"""
|
|
@@ -302,8 +294,8 @@ class AgentBriefing:
|
|
|
302
294
|
stack.setdefault("Database", []).append("SQLite")
|
|
303
295
|
if "pyyaml" in content.lower() or "yaml" in content.lower():
|
|
304
296
|
stack.setdefault("Config", []).append("YAML")
|
|
305
|
-
except
|
|
306
|
-
|
|
297
|
+
except (OSError, UnicodeDecodeError) as e:
|
|
298
|
+
logger.debug("Could not read %s for tech stack detection: %s", pyproject, e)
|
|
307
299
|
|
|
308
300
|
dockerfile = root / "Dockerfile"
|
|
309
301
|
if dockerfile.exists():
|
|
@@ -508,8 +500,8 @@ class AgentBriefing:
|
|
|
508
500
|
briefing_data = {
|
|
509
501
|
"agent_role": self.agent_role,
|
|
510
502
|
"project_context": self.project_context,
|
|
511
|
-
"agent_context": self.agent_context
|
|
512
|
-
"sections": {title: section
|
|
503
|
+
"agent_context": asdict(self.agent_context),
|
|
504
|
+
"sections": {title: asdict(section) for title, section in self.sections.items()},
|
|
513
505
|
"exported_at": datetime.now().isoformat(),
|
|
514
506
|
}
|
|
515
507
|
|
|
@@ -540,8 +532,8 @@ class AgentBriefing:
|
|
|
540
532
|
briefing_data = {
|
|
541
533
|
"agent_role": self.agent_role,
|
|
542
534
|
"project_context": self.project_context,
|
|
543
|
-
"agent_context": self.agent_context
|
|
544
|
-
"sections": {title: section
|
|
535
|
+
"agent_context": asdict(self.agent_context),
|
|
536
|
+
"sections": {title: asdict(section) for title, section in self.sections.items()},
|
|
545
537
|
"updated_at": datetime.now().isoformat(),
|
|
546
538
|
}
|
|
547
539
|
|
|
@@ -589,11 +581,11 @@ def get_agent_briefing(
|
|
|
589
581
|
|
|
590
582
|
def reset_briefings() -> None:
|
|
591
583
|
"""Reset all briefing instances (for testing)"""
|
|
592
|
-
global _briefing_instances
|
|
584
|
+
global _briefing_instances # noqa: F824
|
|
593
585
|
_briefing_instances.clear()
|
|
594
586
|
|
|
595
587
|
|
|
596
|
-
__version__ = "3.6.
|
|
588
|
+
__version__ = "3.6.7"
|
|
597
589
|
__all__ = [
|
|
598
590
|
"AgentBriefing",
|
|
599
591
|
"BriefingSection",
|
|
@@ -144,6 +144,7 @@ class AsyncCoordinator:
|
|
|
144
144
|
briefing_mode: bool = True,
|
|
145
145
|
task_timeout: Optional[float] = None,
|
|
146
146
|
max_concurrency: int = MAX_CONCURRENCY,
|
|
147
|
+
enable_retry: bool = False,
|
|
147
148
|
) -> None:
|
|
148
149
|
"""
|
|
149
150
|
Initialize AsyncCoordinator.
|
|
@@ -158,6 +159,8 @@ class AsyncCoordinator:
|
|
|
158
159
|
briefing_mode: Enable inter-Agent briefing handoff
|
|
159
160
|
task_timeout: Per-task timeout in seconds (None=no limit)
|
|
160
161
|
max_concurrency: Maximum concurrent workers
|
|
162
|
+
enable_retry: Enable AsyncLLMRetryManager for LLM calls with
|
|
163
|
+
exponential backoff, circuit breaker, and fallback support
|
|
161
164
|
"""
|
|
162
165
|
self.scratchpad = scratchpad or Scratchpad(persist_dir=persist_dir)
|
|
163
166
|
self.consensus = ConsensusEngine()
|
|
@@ -181,6 +184,19 @@ class AsyncCoordinator:
|
|
|
181
184
|
self.max_concurrency = max_concurrency
|
|
182
185
|
self._semaphore: Optional[asyncio.Semaphore] = None
|
|
183
186
|
|
|
187
|
+
# Retry support
|
|
188
|
+
self.enable_retry = enable_retry
|
|
189
|
+
self._retry_manager: Optional[Any] = None
|
|
190
|
+
if enable_retry:
|
|
191
|
+
try:
|
|
192
|
+
from .llm_retry_async import AsyncLLMRetryManager
|
|
193
|
+
self._retry_manager = AsyncLLMRetryManager()
|
|
194
|
+
logger.info("AsyncLLMRetryManager enabled for AsyncCoordinator")
|
|
195
|
+
except Exception as e:
|
|
196
|
+
logger.warning("AsyncLLMRetryManager init failed: %s", e)
|
|
197
|
+
self.enable_retry = False
|
|
198
|
+
self._retry_manager = None
|
|
199
|
+
|
|
184
200
|
async def _get_semaphore(self) -> asyncio.Semaphore:
|
|
185
201
|
if self._semaphore is None:
|
|
186
202
|
self._semaphore = asyncio.Semaphore(self.max_concurrency)
|
|
@@ -434,7 +450,10 @@ class AsyncCoordinator:
|
|
|
434
450
|
self._inject_briefing_to_worker(worker)
|
|
435
451
|
|
|
436
452
|
try:
|
|
437
|
-
|
|
453
|
+
if self.enable_retry and self._retry_manager is not None:
|
|
454
|
+
result = await self._execute_with_retry(async_worker, task)
|
|
455
|
+
else:
|
|
456
|
+
result = await async_worker.execute(task)
|
|
438
457
|
if self.briefing_mode:
|
|
439
458
|
self._collect_briefing_from_worker(worker)
|
|
440
459
|
return result
|
|
@@ -475,6 +494,24 @@ class AsyncCoordinator:
|
|
|
475
494
|
)
|
|
476
495
|
return self._async_workers[worker_id]
|
|
477
496
|
|
|
497
|
+
async def _execute_with_retry(
|
|
498
|
+
self, async_worker: AsyncWorkerWrapper, task: TaskDefinition
|
|
499
|
+
) -> WorkerResult:
|
|
500
|
+
"""Execute a worker task with retry and fallback via AsyncLLMRetryManager."""
|
|
501
|
+
from .llm_retry_async import RetryConfig
|
|
502
|
+
|
|
503
|
+
config = RetryConfig(max_retries=3, initial_delay=1.0, max_delay=60.0)
|
|
504
|
+
current_backend = getattr(self.llm_backend, "backend_name", None)
|
|
505
|
+
|
|
506
|
+
return await self._retry_manager.retry_with_fallback(
|
|
507
|
+
func=async_worker.execute,
|
|
508
|
+
args=(task,),
|
|
509
|
+
kwargs={},
|
|
510
|
+
config=config,
|
|
511
|
+
fallback_backends=None,
|
|
512
|
+
current_backend=current_backend,
|
|
513
|
+
)
|
|
514
|
+
|
|
478
515
|
def _buffer_worker_messages(
|
|
479
516
|
self, batch_results: List[WorkerResult]
|
|
480
517
|
) -> None:
|