devsquad 3.9.2__tar.gz → 4.0.0__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.9.2 → devsquad-4.0.0}/PKG-INFO +23 -10
- {devsquad-3.9.2 → devsquad-4.0.0}/README.md +17 -9
- {devsquad-3.9.2 → devsquad-4.0.0}/devsquad.egg-info/PKG-INFO +23 -10
- {devsquad-3.9.2 → devsquad-4.0.0}/devsquad.egg-info/SOURCES.txt +53 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/devsquad.egg-info/requires.txt +6 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/pyproject.toml +9 -1
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/api/routes/dispatch.py +41 -0
- devsquad-4.0.0/scripts/benchmark_ponytail_smart.py +435 -0
- devsquad-4.0.0/scripts/collaboration/_version.py +1 -0
- devsquad-4.0.0/scripts/collaboration/adversarial_verify.py +374 -0
- devsquad-4.0.0/scripts/collaboration/autonomous/__init__.py +39 -0
- devsquad-4.0.0/scripts/collaboration/autonomous/git_driver.py +167 -0
- devsquad-4.0.0/scripts/collaboration/autonomous/loop_controller.py +535 -0
- devsquad-4.0.0/scripts/collaboration/autonomous/notes_memory.py +105 -0
- devsquad-4.0.0/scripts/collaboration/autonomous/run_state.py +120 -0
- devsquad-4.0.0/scripts/collaboration/autonomous/sleep_guard.py +166 -0
- devsquad-4.0.0/scripts/collaboration/autonomous/smart_confirmation.py +179 -0
- devsquad-4.0.0/scripts/collaboration/ccr_store.py +253 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/consensus.py +26 -0
- devsquad-4.0.0/scripts/collaboration/content_crusher.py +327 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/context_compressor.py +62 -4
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/coordinator.py +236 -5
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_component_factory.py +102 -1
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_steps.py +2 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_steps_base.py +1 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_steps_quality_mixin.py +42 -2
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatcher.py +292 -1
- devsquad-4.0.0/scripts/collaboration/learned_rule_store.py +201 -0
- devsquad-4.0.0/scripts/collaboration/loop_engineering/__init__.py +52 -0
- devsquad-4.0.0/scripts/collaboration/loop_engineering/discovery_probe.py +51 -0
- devsquad-4.0.0/scripts/collaboration/loop_engineering/handoff_adapter.py +47 -0
- devsquad-4.0.0/scripts/collaboration/loop_engineering/independent_evaluator.py +57 -0
- devsquad-4.0.0/scripts/collaboration/loop_engineering/kernel.py +211 -0
- devsquad-4.0.0/scripts/collaboration/loop_engineering/loop_scheduler.py +62 -0
- devsquad-4.0.0/scripts/collaboration/loop_engineering/models.py +123 -0
- devsquad-4.0.0/scripts/collaboration/loop_engineering/protocols.py +74 -0
- devsquad-4.0.0/scripts/collaboration/loop_engineering/unified_memory.py +59 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/models.py +3 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/models_base.py +195 -0
- devsquad-4.0.0/scripts/collaboration/plugins/__init__.py +23 -0
- devsquad-4.0.0/scripts/collaboration/plugins/hot_loader.py +509 -0
- devsquad-4.0.0/scripts/collaboration/ponytail_rule_injector.py +108 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/prompt_assembler.py +29 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/prompt_assembler_base.py +17 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/prompt_assembler_formatting_mixin.py +35 -3
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/retrospective.py +79 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/scratchpad.py +65 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/dashboard/app.py +4 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/dashboard/components.py +2 -0
- devsquad-4.0.0/scripts/dashboard/dag_views.py +386 -0
- devsquad-4.0.0/scripts/qa/__init__.py +25 -0
- devsquad-4.0.0/scripts/qa/models.py +71 -0
- devsquad-4.0.0/scripts/qa/uiux_analyzer.py +530 -0
- devsquad-4.0.0/scripts/qa/visual_regression.py +178 -0
- devsquad-4.0.0/tests/test_adversarial_verify.py +416 -0
- devsquad-4.0.0/tests/test_api_budget_status_endpoint.py +85 -0
- devsquad-4.0.0/tests/test_autonomous.py +1459 -0
- devsquad-4.0.0/tests/test_benchmark_ponytail_smart.py +164 -0
- devsquad-4.0.0/tests/test_ccr_marker_integration.py +203 -0
- devsquad-4.0.0/tests/test_ccr_store.py +281 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_dispatcher_test.py +2 -1
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_prompt_optimization_test.py +3 -1
- devsquad-4.0.0/tests/test_content_crusher.py +398 -0
- devsquad-4.0.0/tests/test_coordinator_budget_ccr_integration.py +328 -0
- devsquad-4.0.0/tests/test_coordinator_smart_compression.py +331 -0
- devsquad-4.0.0/tests/test_dag_views.py +310 -0
- devsquad-4.0.0/tests/test_dashboard_ui_e2e.py +367 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_docker_deployment.py +1 -1
- devsquad-4.0.0/tests/test_learned_rule_phase4.py +280 -0
- devsquad-4.0.0/tests/test_loop_engineering.py +346 -0
- devsquad-4.0.0/tests/test_phase4_ghost_feature_defense.py +470 -0
- devsquad-4.0.0/tests/test_plugins_hot_loader.py +660 -0
- devsquad-4.0.0/tests/test_ponytail_rule_injector.py +267 -0
- devsquad-4.0.0/tests/test_qa_integration.py +111 -0
- devsquad-4.0.0/tests/test_qa_uiux_visual_regression.py +574 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_rate_limit.py +1 -1
- devsquad-4.0.0/tests/test_skill_registry_coverage.py +426 -0
- devsquad-4.0.0/tests/test_sleep_guard.py +224 -0
- devsquad-4.0.0/tests/test_token_budget_compressed_scratchpad.py +323 -0
- devsquad-4.0.0/tests/test_usage_tracker_coverage.py +453 -0
- devsquad-4.0.0/tests/test_v4_integration.py +177 -0
- devsquad-4.0.0/tests/test_workflow_persistence_coverage.py +327 -0
- devsquad-3.9.2/scripts/collaboration/_version.py +0 -1
- {devsquad-3.9.2 → devsquad-4.0.0}/LICENSE +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/devsquad.egg-info/dependency_links.txt +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/devsquad.egg-info/entry_points.txt +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/devsquad.egg-info/top_level.txt +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/__init__.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/api/__init__.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/api/models.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/api/rate_limit.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/api/routes/__init__.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/api/routes/lifecycle.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/api/routes/metrics.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/api/routes/metrics_gates.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/api/security.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/api_server.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/auth.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/benchmark_async_dispatch.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/benchmark_real_llm.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/check_version_consistency.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/cli/__init__.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/cli/cli_visual.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/cli.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/cli_dispatch.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/cli_lifecycle.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/cli_utils.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/__init__.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/adaptive_role_selector.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/agent_briefing.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/ai_semantic_matcher.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/anchor_checker.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/anti_rationalization.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/async_adapter.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/async_coordinator.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/async_llm_backend.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/audit_logger.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/batch_scheduler.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/cache_interface.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/checkpoint_manager.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/ci_feedback_adapter.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/code_graph_query.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/code_graph_storage.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/code_knowledge_graph.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/code_map_generator.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/concern_pack_loader.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/confidence_score.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/consensus_gate.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/constants.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/content_cache.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_audit.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_hooks.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_lifecycle.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_models.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_performance.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_pre_steps.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_rbac.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_result_assembler.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_services.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_steps_consensus_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_steps_feedback_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatch_steps_services_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatcher_async_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatcher_audit_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatcher_base.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatcher_error_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatcher_factory.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatcher_lifecycle_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatcher_status_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dispatcher_utils_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/dual_layer_context.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/enhanced_worker.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/enterprise_feature.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/event_bus.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/execution_guard.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/feature_usage_tracker.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/feedback_control_loop.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/five_axis_consensus.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/input_validator.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/intent_workflow_mapper.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/judge_agent.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/language_parsers.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/lifecycle_gate.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/lifecycle_protocol.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/lifecycle_shortcut_adapter.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/lifecycle_shortcut_helpers.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/lifecycle_templates.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/llm_backend.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/llm_cache.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/llm_cache_async.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/llm_cache_base.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/llm_retry.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/llm_retry_async.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/llm_retry_base.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/mce_adapter.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/memory_bridge.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/memory_claw_source.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/memory_forgetting.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/memory_index.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/memory_query.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/memory_serializer.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/memory_types.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/micro_task_planner.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/models_dispatch.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/models_lifecycle.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/multi_host_adapter.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/multi_level_cache.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/multi_tenant.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/null_providers.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/operation_classifier.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/output_slicer.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/performance_fingerprint.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/performance_monitor.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/permission_guard.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/prometheus_metrics.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/prompt_assembler_substitution_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/prompt_assembler_template_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/prompt_assembler_validation_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/prompt_dials.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/protocols.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/rbac_engine.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/redesign_auditor.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/redesign_checkers.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/redis_cache.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/report_formatter.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/review_checkers.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/role_matcher.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/role_skill_loader.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/rule_collector.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/secret_patterns.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/severity_router.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/similar_task_recommender.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/skill_extractor.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/skill_registry.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/skill_storage.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/skillifier.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/standardized_role_template.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/task_completion_checker.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/tech_debt_manager.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/test_quality_guard.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/two_stage_review_gate.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/ue_test_accessibility_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/ue_test_framework.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/ue_test_framework_base.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/ue_test_heuristic_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/ue_test_journey_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/ue_test_persona_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/unified_gate_engine.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/usage_tracker.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/user_friendly_error.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/verification_gate.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/warmup_manager.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/worker.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/workflow_engine.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/workflow_engine_base.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/workflow_engine_lifecycle_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/workflow_engine_persistence_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/workflow_engine_state_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/workflow_engine_transition_mixin.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/collaboration/yagni_checker.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/dashboard/__init__.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/dashboard/auth_views.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/dashboard/dispatch_views.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/dashboard/lifecycle_views.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/dashboard/metrics_views.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/dashboard/state.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/dashboard.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/generate_benchmark_report.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/history_manager.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/mcp_server.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/utils/__init__.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/scripts/utils/_find_missing_hints.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/setup.cfg +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/skills/__init__.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/skills/dispatch/handler.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/skills/intent/handler.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/skills/registry.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/skills/retrospective/__init__.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/skills/retrospective/handler.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/skills/review/handler.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/skills/security/handler.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/skills/test/__init__.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/skills/test/handler.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_agent_briefing.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_anchor_retrospective.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_anti_rationalization.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_api_security.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_api_server_v362.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_async_modules.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_audit_logger.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_auth_phase5.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_ci_feedback_adapter.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_cli_deep_v362.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_cli_lifecycle.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_cli_phase5.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_code_knowledge_graph.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_claw_integration_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_context_compressor_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_core_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_dispatcher_ux_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_e2e_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_enhanced_e2e_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_llm_cache_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_llm_retry_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_mce_adapter_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_memory_bridge_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_performance_monitor_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_permission_guard_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_role_mapping_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_skillifier_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_test_quality_guard.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_test_quality_guard_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_upstream_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_collaboration_warmup_manager_test.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_comprehensive_integration.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_confidence_score.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_config_injection.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_consensus_gate.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_content_cache.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_dashboard_split.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_data_backup.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_dependency_lock.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_dispatch_audit.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_dispatch_rbac.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_dispatcher_phase5_core.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_extended_integration.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_final_integration.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_five_axis_consensus.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_full_lifecycle_adapter.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_history_manager_v362.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_input_validator_phase5.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_intent_workflow_mapper.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_judge_agent.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_lifecycle_protocol.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_llm_auto_fallback.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_llm_cache_protocol.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_mcp_server_v362.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_memory_benchmarks.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_micro_task_planner.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_multi_host_adapter.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_multi_tenant.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_node_type_separation.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_null_providers.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_operation_classifier.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_output_slicer.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_performance_benchmarks.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_performance_fingerprint.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_performance_monitor_protocol.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_permission_guard_phase5.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_pipeline_step19_20.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_plan_c_unified_architecture.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_production_features.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_prompt_dials.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_protocols.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_quick_bonus.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_rbac_engine.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_rbac_fail_closed.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_redesign_auditor.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_retry_jitter_strategies.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_role_skill_loader.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_rule_injection_security.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_severity_router.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_skill_security.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_standardized_role_template.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_start_script.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_step_node_types.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_suggested_next_steps.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_tech_debt_manager.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_two_stage_review_gate.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_ue_test_framework.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_v38_integration.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_v39_e2e.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_v39_integration.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_v39_performance.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_verification_gate.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_version.py +0 -0
- {devsquad-3.9.2 → devsquad-4.0.0}/tests/test_yagni_checker.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsquad
|
|
3
|
-
Version:
|
|
3
|
+
Version: 4.0.0
|
|
4
4
|
Summary: Production-Ready Multi-Role AI Task Orchestrator
|
|
5
5
|
Author-email: DevSquad Team <devsquad@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -48,6 +48,8 @@ Requires-Dist: streamlit>=1.28.0; extra == "visualization"
|
|
|
48
48
|
Requires-Dist: jupyter>=1.0; extra == "visualization"
|
|
49
49
|
Provides-Extra: alerts
|
|
50
50
|
Requires-Dist: slack-sdk>=3.21.0; extra == "alerts"
|
|
51
|
+
Provides-Extra: qa
|
|
52
|
+
Requires-Dist: Pillow>=10.0.0; extra == "qa"
|
|
51
53
|
Provides-Extra: dev
|
|
52
54
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
53
55
|
Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
|
|
@@ -56,6 +58,7 @@ Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
|
56
58
|
Requires-Dist: mypy>=1.0; extra == "dev"
|
|
57
59
|
Requires-Dist: black>=23.0; extra == "dev"
|
|
58
60
|
Requires-Dist: flake8>=6.0; extra == "dev"
|
|
61
|
+
Requires-Dist: httpx2>=2.5.0; extra == "dev"
|
|
59
62
|
Provides-Extra: all
|
|
60
63
|
Requires-Dist: openai>=1.0; extra == "all"
|
|
61
64
|
Requires-Dist: anthropic>=0.18; extra == "all"
|
|
@@ -69,6 +72,7 @@ Requires-Dist: pydantic>=2.0; extra == "all"
|
|
|
69
72
|
Requires-Dist: streamlit>=1.28.0; extra == "all"
|
|
70
73
|
Requires-Dist: jupyter>=1.0; extra == "all"
|
|
71
74
|
Requires-Dist: slack-sdk>=3.21.0; extra == "all"
|
|
75
|
+
Requires-Dist: Pillow>=10.0.0; extra == "all"
|
|
72
76
|
Requires-Dist: pytest>=7.0; extra == "all"
|
|
73
77
|
Requires-Dist: pytest-asyncio>=0.21; extra == "all"
|
|
74
78
|
Requires-Dist: pytest-cov>=4.1; extra == "all"
|
|
@@ -76,6 +80,7 @@ Requires-Dist: ruff>=0.4.0; extra == "all"
|
|
|
76
80
|
Requires-Dist: mypy>=1.0; extra == "all"
|
|
77
81
|
Requires-Dist: black>=23.0; extra == "all"
|
|
78
82
|
Requires-Dist: flake8>=6.0; extra == "all"
|
|
83
|
+
Requires-Dist: httpx2>=2.5.0; extra == "all"
|
|
79
84
|
Dynamic: license-file
|
|
80
85
|
|
|
81
86
|
# DevSquad — Multi-Role AI Task Orchestrator
|
|
@@ -83,14 +88,14 @@ Dynamic: license-file
|
|
|
83
88
|
<p align="center">
|
|
84
89
|
<strong>🎯 把「单个 AI 助手」升级成「7 人 AI 专业团队」</strong>
|
|
85
90
|
<br>
|
|
86
|
-
<em>One task → Multi-role AI collaboration → One conclusion |
|
|
91
|
+
<em>One task → Multi-role AI collaboration → One conclusion | V4.0.0 Enterprise Ready</em>
|
|
87
92
|
</p>
|
|
88
93
|
|
|
89
94
|
<p align="center">
|
|
90
95
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.10+-blue?logo=python&logoColor=white" />
|
|
91
96
|
<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/
|
|
97
|
+
<img alt="Tests" src="https://img.shields.io/badge/Tests-3400%2B%20passing-brightgreen" />
|
|
98
|
+
<img alt="Version" src="https://img.shields.io/badge/V4.0.0-success" />
|
|
94
99
|
<img alt="CI" src="https://img.shields.io/badge/CI-GitHub_Actions-blue?logo=githubactions" />
|
|
95
100
|
<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
101
|
<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 +156,17 @@ devsquad run "设计一个安全的用户认证系统" --roles architect,securit
|
|
|
151
156
|
<details>
|
|
152
157
|
<summary>🔍 点击展开:完整功能介绍与架构详解</summary>
|
|
153
158
|
|
|
154
|
-
## 🚀
|
|
159
|
+
## 🚀 V4.0.0: Loop Engineering + UI/UX 巡检 + Adversarial 验证 + DAG 可视化 + Autonomous + 插件热加载
|
|
155
160
|
|
|
156
|
-
**DevSquad
|
|
161
|
+
**DevSquad V4.0.0** 借鉴上游 TraeMultiAgentSkill v2.7 理念,新增 6 个特性(P1-P3),全面接入 dispatch pipeline,无幽灵功能:
|
|
162
|
+
- **P1-1 Loop Engineering**: Discovery → Handoff → Verification → Persistence → Scheduling 五步闭环
|
|
163
|
+
- **P1-2 UI/UX 巡检**: 4 维度审计(a11y/interaction/layout/ux)+ PIL 像素 diff 视觉回归
|
|
164
|
+
- **P2-1 Adversarial 验证**: 红队攻击 + 蓝队防御 + 裁判仲裁三阶段对抗验证
|
|
165
|
+
- **P2-2 DAG 可视化**: Mermaid / JSON / DOT 三种格式依赖图可视化
|
|
166
|
+
- **P3-1 Autonomous**: plan → dev → verify → fix 4 阶段自主迭代,复用 LoopKernel,不绕过共识门
|
|
167
|
+
- **P3-2 插件热加载**: 三种加载路径 + 路径穿越三层防护 + reload 回滚 + 审计日志
|
|
168
|
+
|
|
169
|
+
3400+ tests passing。
|
|
157
170
|
|
|
158
171
|
---
|
|
159
172
|
|
|
@@ -223,7 +236,7 @@ DEVSQUAD_API_PORT=9000 ./scripts/start.sh
|
|
|
223
236
|
./scripts/start.sh --help
|
|
224
237
|
```
|
|
225
238
|
|
|
226
|
-
`start.sh` is the unified entry point introduced in V3.9.2 (P0-2). It validates the environment, initializes the database, builds the frontend, and starts the service in one command. Use `requirements.lock` alongside it for reproducible builds (`pip install -r requirements.lock`).
|
|
239
|
+
`start.sh` is the unified entry point introduced in V3.9.2 (P0-2). It validates the environment, initializes the database, builds the frontend, and starts the service in one command. Use `requirements.lock` alongside it for reproducible builds (`pip install -r requirements.lock`). V4.0.0 adds Loop Engineering, UI/UX 巡检, Adversarial 验证, DAG 可视化, Autonomous, and 插件热加载.
|
|
227
240
|
|
|
228
241
|
---
|
|
229
242
|
|
|
@@ -537,7 +550,7 @@ devsquad dispatch -t "Design user authentication system"
|
|
|
537
550
|
```bash
|
|
538
551
|
# Check version
|
|
539
552
|
devsquad --version
|
|
540
|
-
# Expected: devsquad
|
|
553
|
+
# Expected: devsquad 4.0.0
|
|
541
554
|
|
|
542
555
|
# Run tests
|
|
543
556
|
pytest tests/ -v --tb=short
|
|
@@ -592,7 +605,7 @@ export DEVSQUAD_OPENAI_API_KEY=sk-...
|
|
|
592
605
|
|
|
593
606
|
### Quick Smoke Test (< 30 seconds)
|
|
594
607
|
```bash
|
|
595
|
-
python3 scripts/cli.py --version # Expected: DevSquad
|
|
608
|
+
python3 scripts/cli.py --version # Expected: DevSquad 4.0.0
|
|
596
609
|
python3 scripts/cli.py status # Expected: System ready
|
|
597
610
|
python3 scripts/cli.py roles # Expected: 7 core roles listed
|
|
598
611
|
```
|
|
@@ -680,6 +693,6 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
680
693
|
|
|
681
694
|
---
|
|
682
695
|
|
|
683
|
-
*Last updated: 2026-
|
|
696
|
+
*Last updated: 2026-07-07 | Version: V4.0.0*
|
|
684
697
|
|
|
685
698
|
</details>
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<strong>🎯 把「单个 AI 助手」升级成「7 人 AI 专业团队」</strong>
|
|
5
5
|
<br>
|
|
6
|
-
<em>One task → Multi-role AI collaboration → One conclusion |
|
|
6
|
+
<em>One task → Multi-role AI collaboration → One conclusion | V4.0.0 Enterprise Ready</em>
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
10
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.10+-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/
|
|
12
|
+
<img alt="Tests" src="https://img.shields.io/badge/Tests-3400%2B%20passing-brightgreen" />
|
|
13
|
+
<img alt="Version" src="https://img.shields.io/badge/V4.0.0-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,17 @@ devsquad run "设计一个安全的用户认证系统" --roles architect,securit
|
|
|
71
71
|
<details>
|
|
72
72
|
<summary>🔍 点击展开:完整功能介绍与架构详解</summary>
|
|
73
73
|
|
|
74
|
-
## 🚀
|
|
74
|
+
## 🚀 V4.0.0: Loop Engineering + UI/UX 巡检 + Adversarial 验证 + DAG 可视化 + Autonomous + 插件热加载
|
|
75
75
|
|
|
76
|
-
**DevSquad
|
|
76
|
+
**DevSquad V4.0.0** 借鉴上游 TraeMultiAgentSkill v2.7 理念,新增 6 个特性(P1-P3),全面接入 dispatch pipeline,无幽灵功能:
|
|
77
|
+
- **P1-1 Loop Engineering**: Discovery → Handoff → Verification → Persistence → Scheduling 五步闭环
|
|
78
|
+
- **P1-2 UI/UX 巡检**: 4 维度审计(a11y/interaction/layout/ux)+ PIL 像素 diff 视觉回归
|
|
79
|
+
- **P2-1 Adversarial 验证**: 红队攻击 + 蓝队防御 + 裁判仲裁三阶段对抗验证
|
|
80
|
+
- **P2-2 DAG 可视化**: Mermaid / JSON / DOT 三种格式依赖图可视化
|
|
81
|
+
- **P3-1 Autonomous**: plan → dev → verify → fix 4 阶段自主迭代,复用 LoopKernel,不绕过共识门
|
|
82
|
+
- **P3-2 插件热加载**: 三种加载路径 + 路径穿越三层防护 + reload 回滚 + 审计日志
|
|
83
|
+
|
|
84
|
+
3400+ tests passing。
|
|
77
85
|
|
|
78
86
|
---
|
|
79
87
|
|
|
@@ -143,7 +151,7 @@ DEVSQUAD_API_PORT=9000 ./scripts/start.sh
|
|
|
143
151
|
./scripts/start.sh --help
|
|
144
152
|
```
|
|
145
153
|
|
|
146
|
-
`start.sh` is the unified entry point introduced in V3.9.2 (P0-2). It validates the environment, initializes the database, builds the frontend, and starts the service in one command. Use `requirements.lock` alongside it for reproducible builds (`pip install -r requirements.lock`).
|
|
154
|
+
`start.sh` is the unified entry point introduced in V3.9.2 (P0-2). It validates the environment, initializes the database, builds the frontend, and starts the service in one command. Use `requirements.lock` alongside it for reproducible builds (`pip install -r requirements.lock`). V4.0.0 adds Loop Engineering, UI/UX 巡检, Adversarial 验证, DAG 可视化, Autonomous, and 插件热加载.
|
|
147
155
|
|
|
148
156
|
---
|
|
149
157
|
|
|
@@ -457,7 +465,7 @@ devsquad dispatch -t "Design user authentication system"
|
|
|
457
465
|
```bash
|
|
458
466
|
# Check version
|
|
459
467
|
devsquad --version
|
|
460
|
-
# Expected: devsquad
|
|
468
|
+
# Expected: devsquad 4.0.0
|
|
461
469
|
|
|
462
470
|
# Run tests
|
|
463
471
|
pytest tests/ -v --tb=short
|
|
@@ -512,7 +520,7 @@ export DEVSQUAD_OPENAI_API_KEY=sk-...
|
|
|
512
520
|
|
|
513
521
|
### Quick Smoke Test (< 30 seconds)
|
|
514
522
|
```bash
|
|
515
|
-
python3 scripts/cli.py --version # Expected: DevSquad
|
|
523
|
+
python3 scripts/cli.py --version # Expected: DevSquad 4.0.0
|
|
516
524
|
python3 scripts/cli.py status # Expected: System ready
|
|
517
525
|
python3 scripts/cli.py roles # Expected: 7 core roles listed
|
|
518
526
|
```
|
|
@@ -600,6 +608,6 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
600
608
|
|
|
601
609
|
---
|
|
602
610
|
|
|
603
|
-
*Last updated: 2026-
|
|
611
|
+
*Last updated: 2026-07-07 | Version: V4.0.0*
|
|
604
612
|
|
|
605
613
|
</details>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsquad
|
|
3
|
-
Version:
|
|
3
|
+
Version: 4.0.0
|
|
4
4
|
Summary: Production-Ready Multi-Role AI Task Orchestrator
|
|
5
5
|
Author-email: DevSquad Team <devsquad@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -48,6 +48,8 @@ Requires-Dist: streamlit>=1.28.0; extra == "visualization"
|
|
|
48
48
|
Requires-Dist: jupyter>=1.0; extra == "visualization"
|
|
49
49
|
Provides-Extra: alerts
|
|
50
50
|
Requires-Dist: slack-sdk>=3.21.0; extra == "alerts"
|
|
51
|
+
Provides-Extra: qa
|
|
52
|
+
Requires-Dist: Pillow>=10.0.0; extra == "qa"
|
|
51
53
|
Provides-Extra: dev
|
|
52
54
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
53
55
|
Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
|
|
@@ -56,6 +58,7 @@ Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
|
56
58
|
Requires-Dist: mypy>=1.0; extra == "dev"
|
|
57
59
|
Requires-Dist: black>=23.0; extra == "dev"
|
|
58
60
|
Requires-Dist: flake8>=6.0; extra == "dev"
|
|
61
|
+
Requires-Dist: httpx2>=2.5.0; extra == "dev"
|
|
59
62
|
Provides-Extra: all
|
|
60
63
|
Requires-Dist: openai>=1.0; extra == "all"
|
|
61
64
|
Requires-Dist: anthropic>=0.18; extra == "all"
|
|
@@ -69,6 +72,7 @@ Requires-Dist: pydantic>=2.0; extra == "all"
|
|
|
69
72
|
Requires-Dist: streamlit>=1.28.0; extra == "all"
|
|
70
73
|
Requires-Dist: jupyter>=1.0; extra == "all"
|
|
71
74
|
Requires-Dist: slack-sdk>=3.21.0; extra == "all"
|
|
75
|
+
Requires-Dist: Pillow>=10.0.0; extra == "all"
|
|
72
76
|
Requires-Dist: pytest>=7.0; extra == "all"
|
|
73
77
|
Requires-Dist: pytest-asyncio>=0.21; extra == "all"
|
|
74
78
|
Requires-Dist: pytest-cov>=4.1; extra == "all"
|
|
@@ -76,6 +80,7 @@ Requires-Dist: ruff>=0.4.0; extra == "all"
|
|
|
76
80
|
Requires-Dist: mypy>=1.0; extra == "all"
|
|
77
81
|
Requires-Dist: black>=23.0; extra == "all"
|
|
78
82
|
Requires-Dist: flake8>=6.0; extra == "all"
|
|
83
|
+
Requires-Dist: httpx2>=2.5.0; extra == "all"
|
|
79
84
|
Dynamic: license-file
|
|
80
85
|
|
|
81
86
|
# DevSquad — Multi-Role AI Task Orchestrator
|
|
@@ -83,14 +88,14 @@ Dynamic: license-file
|
|
|
83
88
|
<p align="center">
|
|
84
89
|
<strong>🎯 把「单个 AI 助手」升级成「7 人 AI 专业团队」</strong>
|
|
85
90
|
<br>
|
|
86
|
-
<em>One task → Multi-role AI collaboration → One conclusion |
|
|
91
|
+
<em>One task → Multi-role AI collaboration → One conclusion | V4.0.0 Enterprise Ready</em>
|
|
87
92
|
</p>
|
|
88
93
|
|
|
89
94
|
<p align="center">
|
|
90
95
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.10+-blue?logo=python&logoColor=white" />
|
|
91
96
|
<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/
|
|
97
|
+
<img alt="Tests" src="https://img.shields.io/badge/Tests-3400%2B%20passing-brightgreen" />
|
|
98
|
+
<img alt="Version" src="https://img.shields.io/badge/V4.0.0-success" />
|
|
94
99
|
<img alt="CI" src="https://img.shields.io/badge/CI-GitHub_Actions-blue?logo=githubactions" />
|
|
95
100
|
<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
101
|
<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 +156,17 @@ devsquad run "设计一个安全的用户认证系统" --roles architect,securit
|
|
|
151
156
|
<details>
|
|
152
157
|
<summary>🔍 点击展开:完整功能介绍与架构详解</summary>
|
|
153
158
|
|
|
154
|
-
## 🚀
|
|
159
|
+
## 🚀 V4.0.0: Loop Engineering + UI/UX 巡检 + Adversarial 验证 + DAG 可视化 + Autonomous + 插件热加载
|
|
155
160
|
|
|
156
|
-
**DevSquad
|
|
161
|
+
**DevSquad V4.0.0** 借鉴上游 TraeMultiAgentSkill v2.7 理念,新增 6 个特性(P1-P3),全面接入 dispatch pipeline,无幽灵功能:
|
|
162
|
+
- **P1-1 Loop Engineering**: Discovery → Handoff → Verification → Persistence → Scheduling 五步闭环
|
|
163
|
+
- **P1-2 UI/UX 巡检**: 4 维度审计(a11y/interaction/layout/ux)+ PIL 像素 diff 视觉回归
|
|
164
|
+
- **P2-1 Adversarial 验证**: 红队攻击 + 蓝队防御 + 裁判仲裁三阶段对抗验证
|
|
165
|
+
- **P2-2 DAG 可视化**: Mermaid / JSON / DOT 三种格式依赖图可视化
|
|
166
|
+
- **P3-1 Autonomous**: plan → dev → verify → fix 4 阶段自主迭代,复用 LoopKernel,不绕过共识门
|
|
167
|
+
- **P3-2 插件热加载**: 三种加载路径 + 路径穿越三层防护 + reload 回滚 + 审计日志
|
|
168
|
+
|
|
169
|
+
3400+ tests passing。
|
|
157
170
|
|
|
158
171
|
---
|
|
159
172
|
|
|
@@ -223,7 +236,7 @@ DEVSQUAD_API_PORT=9000 ./scripts/start.sh
|
|
|
223
236
|
./scripts/start.sh --help
|
|
224
237
|
```
|
|
225
238
|
|
|
226
|
-
`start.sh` is the unified entry point introduced in V3.9.2 (P0-2). It validates the environment, initializes the database, builds the frontend, and starts the service in one command. Use `requirements.lock` alongside it for reproducible builds (`pip install -r requirements.lock`).
|
|
239
|
+
`start.sh` is the unified entry point introduced in V3.9.2 (P0-2). It validates the environment, initializes the database, builds the frontend, and starts the service in one command. Use `requirements.lock` alongside it for reproducible builds (`pip install -r requirements.lock`). V4.0.0 adds Loop Engineering, UI/UX 巡检, Adversarial 验证, DAG 可视化, Autonomous, and 插件热加载.
|
|
227
240
|
|
|
228
241
|
---
|
|
229
242
|
|
|
@@ -537,7 +550,7 @@ devsquad dispatch -t "Design user authentication system"
|
|
|
537
550
|
```bash
|
|
538
551
|
# Check version
|
|
539
552
|
devsquad --version
|
|
540
|
-
# Expected: devsquad
|
|
553
|
+
# Expected: devsquad 4.0.0
|
|
541
554
|
|
|
542
555
|
# Run tests
|
|
543
556
|
pytest tests/ -v --tb=short
|
|
@@ -592,7 +605,7 @@ export DEVSQUAD_OPENAI_API_KEY=sk-...
|
|
|
592
605
|
|
|
593
606
|
### Quick Smoke Test (< 30 seconds)
|
|
594
607
|
```bash
|
|
595
|
-
python3 scripts/cli.py --version # Expected: DevSquad
|
|
608
|
+
python3 scripts/cli.py --version # Expected: DevSquad 4.0.0
|
|
596
609
|
python3 scripts/cli.py status # Expected: System ready
|
|
597
610
|
python3 scripts/cli.py roles # Expected: 7 core roles listed
|
|
598
611
|
```
|
|
@@ -680,6 +693,6 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
680
693
|
|
|
681
694
|
---
|
|
682
695
|
|
|
683
|
-
*Last updated: 2026-
|
|
696
|
+
*Last updated: 2026-07-07 | Version: V4.0.0*
|
|
684
697
|
|
|
685
698
|
</details>
|
|
@@ -11,6 +11,7 @@ scripts/__init__.py
|
|
|
11
11
|
scripts/api_server.py
|
|
12
12
|
scripts/auth.py
|
|
13
13
|
scripts/benchmark_async_dispatch.py
|
|
14
|
+
scripts/benchmark_ponytail_smart.py
|
|
14
15
|
scripts/benchmark_real_llm.py
|
|
15
16
|
scripts/check_version_consistency.py
|
|
16
17
|
scripts/cli.py
|
|
@@ -35,6 +36,7 @@ scripts/cli/cli_visual.py
|
|
|
35
36
|
scripts/collaboration/__init__.py
|
|
36
37
|
scripts/collaboration/_version.py
|
|
37
38
|
scripts/collaboration/adaptive_role_selector.py
|
|
39
|
+
scripts/collaboration/adversarial_verify.py
|
|
38
40
|
scripts/collaboration/agent_briefing.py
|
|
39
41
|
scripts/collaboration/ai_semantic_matcher.py
|
|
40
42
|
scripts/collaboration/anchor_checker.py
|
|
@@ -45,6 +47,7 @@ scripts/collaboration/async_llm_backend.py
|
|
|
45
47
|
scripts/collaboration/audit_logger.py
|
|
46
48
|
scripts/collaboration/batch_scheduler.py
|
|
47
49
|
scripts/collaboration/cache_interface.py
|
|
50
|
+
scripts/collaboration/ccr_store.py
|
|
48
51
|
scripts/collaboration/checkpoint_manager.py
|
|
49
52
|
scripts/collaboration/ci_feedback_adapter.py
|
|
50
53
|
scripts/collaboration/code_graph_query.py
|
|
@@ -57,6 +60,7 @@ scripts/collaboration/consensus.py
|
|
|
57
60
|
scripts/collaboration/consensus_gate.py
|
|
58
61
|
scripts/collaboration/constants.py
|
|
59
62
|
scripts/collaboration/content_cache.py
|
|
63
|
+
scripts/collaboration/content_crusher.py
|
|
60
64
|
scripts/collaboration/context_compressor.py
|
|
61
65
|
scripts/collaboration/coordinator.py
|
|
62
66
|
scripts/collaboration/dispatch_audit.py
|
|
@@ -96,6 +100,7 @@ scripts/collaboration/input_validator.py
|
|
|
96
100
|
scripts/collaboration/intent_workflow_mapper.py
|
|
97
101
|
scripts/collaboration/judge_agent.py
|
|
98
102
|
scripts/collaboration/language_parsers.py
|
|
103
|
+
scripts/collaboration/learned_rule_store.py
|
|
99
104
|
scripts/collaboration/lifecycle_gate.py
|
|
100
105
|
scripts/collaboration/lifecycle_protocol.py
|
|
101
106
|
scripts/collaboration/lifecycle_shortcut_adapter.py
|
|
@@ -130,6 +135,7 @@ scripts/collaboration/output_slicer.py
|
|
|
130
135
|
scripts/collaboration/performance_fingerprint.py
|
|
131
136
|
scripts/collaboration/performance_monitor.py
|
|
132
137
|
scripts/collaboration/permission_guard.py
|
|
138
|
+
scripts/collaboration/ponytail_rule_injector.py
|
|
133
139
|
scripts/collaboration/prometheus_metrics.py
|
|
134
140
|
scripts/collaboration/prompt_assembler.py
|
|
135
141
|
scripts/collaboration/prompt_assembler_base.py
|
|
@@ -181,14 +187,37 @@ scripts/collaboration/workflow_engine_persistence_mixin.py
|
|
|
181
187
|
scripts/collaboration/workflow_engine_state_mixin.py
|
|
182
188
|
scripts/collaboration/workflow_engine_transition_mixin.py
|
|
183
189
|
scripts/collaboration/yagni_checker.py
|
|
190
|
+
scripts/collaboration/autonomous/__init__.py
|
|
191
|
+
scripts/collaboration/autonomous/git_driver.py
|
|
192
|
+
scripts/collaboration/autonomous/loop_controller.py
|
|
193
|
+
scripts/collaboration/autonomous/notes_memory.py
|
|
194
|
+
scripts/collaboration/autonomous/run_state.py
|
|
195
|
+
scripts/collaboration/autonomous/sleep_guard.py
|
|
196
|
+
scripts/collaboration/autonomous/smart_confirmation.py
|
|
197
|
+
scripts/collaboration/loop_engineering/__init__.py
|
|
198
|
+
scripts/collaboration/loop_engineering/discovery_probe.py
|
|
199
|
+
scripts/collaboration/loop_engineering/handoff_adapter.py
|
|
200
|
+
scripts/collaboration/loop_engineering/independent_evaluator.py
|
|
201
|
+
scripts/collaboration/loop_engineering/kernel.py
|
|
202
|
+
scripts/collaboration/loop_engineering/loop_scheduler.py
|
|
203
|
+
scripts/collaboration/loop_engineering/models.py
|
|
204
|
+
scripts/collaboration/loop_engineering/protocols.py
|
|
205
|
+
scripts/collaboration/loop_engineering/unified_memory.py
|
|
206
|
+
scripts/collaboration/plugins/__init__.py
|
|
207
|
+
scripts/collaboration/plugins/hot_loader.py
|
|
184
208
|
scripts/dashboard/__init__.py
|
|
185
209
|
scripts/dashboard/app.py
|
|
186
210
|
scripts/dashboard/auth_views.py
|
|
187
211
|
scripts/dashboard/components.py
|
|
212
|
+
scripts/dashboard/dag_views.py
|
|
188
213
|
scripts/dashboard/dispatch_views.py
|
|
189
214
|
scripts/dashboard/lifecycle_views.py
|
|
190
215
|
scripts/dashboard/metrics_views.py
|
|
191
216
|
scripts/dashboard/state.py
|
|
217
|
+
scripts/qa/__init__.py
|
|
218
|
+
scripts/qa/models.py
|
|
219
|
+
scripts/qa/uiux_analyzer.py
|
|
220
|
+
scripts/qa/visual_regression.py
|
|
192
221
|
scripts/utils/__init__.py
|
|
193
222
|
scripts/utils/_find_missing_hints.py
|
|
194
223
|
skills/__init__.py
|
|
@@ -201,14 +230,20 @@ skills/review/handler.py
|
|
|
201
230
|
skills/security/handler.py
|
|
202
231
|
skills/test/__init__.py
|
|
203
232
|
skills/test/handler.py
|
|
233
|
+
tests/test_adversarial_verify.py
|
|
204
234
|
tests/test_agent_briefing.py
|
|
205
235
|
tests/test_anchor_retrospective.py
|
|
206
236
|
tests/test_anti_rationalization.py
|
|
237
|
+
tests/test_api_budget_status_endpoint.py
|
|
207
238
|
tests/test_api_security.py
|
|
208
239
|
tests/test_api_server_v362.py
|
|
209
240
|
tests/test_async_modules.py
|
|
210
241
|
tests/test_audit_logger.py
|
|
211
242
|
tests/test_auth_phase5.py
|
|
243
|
+
tests/test_autonomous.py
|
|
244
|
+
tests/test_benchmark_ponytail_smart.py
|
|
245
|
+
tests/test_ccr_marker_integration.py
|
|
246
|
+
tests/test_ccr_store.py
|
|
212
247
|
tests/test_ci_feedback_adapter.py
|
|
213
248
|
tests/test_cli_deep_v362.py
|
|
214
249
|
tests/test_cli_lifecycle.py
|
|
@@ -239,7 +274,12 @@ tests/test_confidence_score.py
|
|
|
239
274
|
tests/test_config_injection.py
|
|
240
275
|
tests/test_consensus_gate.py
|
|
241
276
|
tests/test_content_cache.py
|
|
277
|
+
tests/test_content_crusher.py
|
|
278
|
+
tests/test_coordinator_budget_ccr_integration.py
|
|
279
|
+
tests/test_coordinator_smart_compression.py
|
|
280
|
+
tests/test_dag_views.py
|
|
242
281
|
tests/test_dashboard_split.py
|
|
282
|
+
tests/test_dashboard_ui_e2e.py
|
|
243
283
|
tests/test_data_backup.py
|
|
244
284
|
tests/test_dependency_lock.py
|
|
245
285
|
tests/test_dispatch_audit.py
|
|
@@ -254,9 +294,11 @@ tests/test_history_manager_v362.py
|
|
|
254
294
|
tests/test_input_validator_phase5.py
|
|
255
295
|
tests/test_intent_workflow_mapper.py
|
|
256
296
|
tests/test_judge_agent.py
|
|
297
|
+
tests/test_learned_rule_phase4.py
|
|
257
298
|
tests/test_lifecycle_protocol.py
|
|
258
299
|
tests/test_llm_auto_fallback.py
|
|
259
300
|
tests/test_llm_cache_protocol.py
|
|
301
|
+
tests/test_loop_engineering.py
|
|
260
302
|
tests/test_mcp_server_v362.py
|
|
261
303
|
tests/test_memory_benchmarks.py
|
|
262
304
|
tests/test_micro_task_planner.py
|
|
@@ -270,11 +312,16 @@ tests/test_performance_benchmarks.py
|
|
|
270
312
|
tests/test_performance_fingerprint.py
|
|
271
313
|
tests/test_performance_monitor_protocol.py
|
|
272
314
|
tests/test_permission_guard_phase5.py
|
|
315
|
+
tests/test_phase4_ghost_feature_defense.py
|
|
273
316
|
tests/test_pipeline_step19_20.py
|
|
274
317
|
tests/test_plan_c_unified_architecture.py
|
|
318
|
+
tests/test_plugins_hot_loader.py
|
|
319
|
+
tests/test_ponytail_rule_injector.py
|
|
275
320
|
tests/test_production_features.py
|
|
276
321
|
tests/test_prompt_dials.py
|
|
277
322
|
tests/test_protocols.py
|
|
323
|
+
tests/test_qa_integration.py
|
|
324
|
+
tests/test_qa_uiux_visual_regression.py
|
|
278
325
|
tests/test_quick_bonus.py
|
|
279
326
|
tests/test_rate_limit.py
|
|
280
327
|
tests/test_rbac_engine.py
|
|
@@ -284,18 +331,24 @@ tests/test_retry_jitter_strategies.py
|
|
|
284
331
|
tests/test_role_skill_loader.py
|
|
285
332
|
tests/test_rule_injection_security.py
|
|
286
333
|
tests/test_severity_router.py
|
|
334
|
+
tests/test_skill_registry_coverage.py
|
|
287
335
|
tests/test_skill_security.py
|
|
336
|
+
tests/test_sleep_guard.py
|
|
288
337
|
tests/test_standardized_role_template.py
|
|
289
338
|
tests/test_start_script.py
|
|
290
339
|
tests/test_step_node_types.py
|
|
291
340
|
tests/test_suggested_next_steps.py
|
|
292
341
|
tests/test_tech_debt_manager.py
|
|
342
|
+
tests/test_token_budget_compressed_scratchpad.py
|
|
293
343
|
tests/test_two_stage_review_gate.py
|
|
294
344
|
tests/test_ue_test_framework.py
|
|
345
|
+
tests/test_usage_tracker_coverage.py
|
|
295
346
|
tests/test_v38_integration.py
|
|
296
347
|
tests/test_v39_e2e.py
|
|
297
348
|
tests/test_v39_integration.py
|
|
298
349
|
tests/test_v39_performance.py
|
|
350
|
+
tests/test_v4_integration.py
|
|
299
351
|
tests/test_verification_gate.py
|
|
300
352
|
tests/test_version.py
|
|
353
|
+
tests/test_workflow_persistence_coverage.py
|
|
301
354
|
tests/test_yagni_checker.py
|
|
@@ -19,6 +19,7 @@ pydantic>=2.0
|
|
|
19
19
|
streamlit>=1.28.0
|
|
20
20
|
jupyter>=1.0
|
|
21
21
|
slack-sdk>=3.21.0
|
|
22
|
+
Pillow>=10.0.0
|
|
22
23
|
pytest>=7.0
|
|
23
24
|
pytest-asyncio>=0.21
|
|
24
25
|
pytest-cov>=4.1
|
|
@@ -26,6 +27,7 @@ ruff>=0.4.0
|
|
|
26
27
|
mypy>=1.0
|
|
27
28
|
black>=23.0
|
|
28
29
|
flake8>=6.0
|
|
30
|
+
httpx2>=2.5.0
|
|
29
31
|
|
|
30
32
|
[anthropic]
|
|
31
33
|
anthropic>=0.18
|
|
@@ -46,6 +48,7 @@ ruff>=0.4.0
|
|
|
46
48
|
mypy>=1.0
|
|
47
49
|
black>=23.0
|
|
48
50
|
flake8>=6.0
|
|
51
|
+
httpx2>=2.5.0
|
|
49
52
|
|
|
50
53
|
[mcp]
|
|
51
54
|
mcp>=0.9
|
|
@@ -57,6 +60,9 @@ prometheus-client>=0.19
|
|
|
57
60
|
[openai]
|
|
58
61
|
openai>=1.0
|
|
59
62
|
|
|
63
|
+
[qa]
|
|
64
|
+
Pillow>=10.0.0
|
|
65
|
+
|
|
60
66
|
[visualization]
|
|
61
67
|
streamlit>=1.28.0
|
|
62
68
|
jupyter>=1.0
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "devsquad"
|
|
7
|
-
version = "
|
|
7
|
+
version = "4.0.0"
|
|
8
8
|
description = "Production-Ready Multi-Role AI Task Orchestrator"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -56,6 +56,9 @@ visualization = [
|
|
|
56
56
|
alerts = [
|
|
57
57
|
"slack-sdk>=3.21.0",
|
|
58
58
|
]
|
|
59
|
+
qa = [
|
|
60
|
+
"Pillow>=10.0.0",
|
|
61
|
+
]
|
|
59
62
|
dev = [
|
|
60
63
|
"pytest>=7.0",
|
|
61
64
|
"pytest-asyncio>=0.21",
|
|
@@ -64,6 +67,7 @@ dev = [
|
|
|
64
67
|
"mypy>=1.0",
|
|
65
68
|
"black>=23.0",
|
|
66
69
|
"flake8>=6.0",
|
|
70
|
+
"httpx2>=2.5.0",
|
|
67
71
|
]
|
|
68
72
|
all = [
|
|
69
73
|
"openai>=1.0",
|
|
@@ -78,6 +82,7 @@ all = [
|
|
|
78
82
|
"streamlit>=1.28.0",
|
|
79
83
|
"jupyter>=1.0",
|
|
80
84
|
"slack-sdk>=3.21.0",
|
|
85
|
+
"Pillow>=10.0.0",
|
|
81
86
|
"pytest>=7.0",
|
|
82
87
|
"pytest-asyncio>=0.21",
|
|
83
88
|
"pytest-cov>=4.1",
|
|
@@ -85,6 +90,7 @@ all = [
|
|
|
85
90
|
"mypy>=1.0",
|
|
86
91
|
"black>=23.0",
|
|
87
92
|
"flake8>=6.0",
|
|
93
|
+
"httpx2>=2.5.0",
|
|
88
94
|
]
|
|
89
95
|
|
|
90
96
|
[project.scripts]
|
|
@@ -160,6 +166,7 @@ norecursedirs = []
|
|
|
160
166
|
python_files = ["test_*.py", "*_test.py"]
|
|
161
167
|
python_classes = ["Test*"]
|
|
162
168
|
python_functions = ["test_*"]
|
|
169
|
+
asyncio_mode = "auto"
|
|
163
170
|
addopts = [
|
|
164
171
|
"-v",
|
|
165
172
|
"--tb=short",
|
|
@@ -172,6 +179,7 @@ markers = [
|
|
|
172
179
|
"benchmark: performance benchmark tests",
|
|
173
180
|
"unit: marks tests as unit tests",
|
|
174
181
|
"smoke: marks tests as release smoke tests",
|
|
182
|
+
"asyncio: async tests using pytest-asyncio",
|
|
175
183
|
]
|
|
176
184
|
filterwarnings = [
|
|
177
185
|
"ignore::DeprecationWarning",
|
|
@@ -434,3 +434,44 @@ async def list_roles(
|
|
|
434
434
|
except Exception as e:
|
|
435
435
|
logger.error("Unexpected error listing roles: %s", e, exc_info=True)
|
|
436
436
|
raise HTTPException(status_code=500, detail=f"Failed to retrieve roles: {str(e)}") from None
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
@router.get(
|
|
440
|
+
"/api/v1/budget/status",
|
|
441
|
+
summary="Token Budget Status / Token 预算状态",
|
|
442
|
+
description="""
|
|
443
|
+
V3.10.0 Phase 3 — Live token budget status for dashboard/Prometheus polling.
|
|
444
|
+
|
|
445
|
+
Returns the Coordinator's current ``used_input_tokens`` against the
|
|
446
|
+
configured ``TokenBudget`` thresholds (warning_ratio defaults to 0.8).
|
|
447
|
+
When no budget is configured, returns ``{"configured": false}``.
|
|
448
|
+
|
|
449
|
+
Fields:
|
|
450
|
+
- configured: bool — whether a TokenBudget is attached
|
|
451
|
+
- total_input_budget / per_role_input_budget / output_budget
|
|
452
|
+
- warning_ratio / warning_threshold
|
|
453
|
+
- used_input_tokens / remaining_input_tokens
|
|
454
|
+
- is_warning / is_exceeded — gate flags for alerting
|
|
455
|
+
""",
|
|
456
|
+
)
|
|
457
|
+
async def get_budget_status(
|
|
458
|
+
user_id: str = Depends(require_permission("AUDIT_READ")),
|
|
459
|
+
) -> dict[str, Any]:
|
|
460
|
+
"""Return live token budget status for monitoring/alerting."""
|
|
461
|
+
try:
|
|
462
|
+
dispatcher = _get_dispatcher()
|
|
463
|
+
coordinator = getattr(dispatcher, "coordinator", None)
|
|
464
|
+
if coordinator is None:
|
|
465
|
+
return {"configured": False, "reason": "coordinator_unavailable"}
|
|
466
|
+
status = coordinator.get_budget_status()
|
|
467
|
+
if status is None:
|
|
468
|
+
return {"configured": False, "reason": "no_token_budget_attached"}
|
|
469
|
+
return {"configured": True, **status}
|
|
470
|
+
except HTTPException:
|
|
471
|
+
raise
|
|
472
|
+
except (ImportError, RuntimeError) as e:
|
|
473
|
+
logger.error("Failed to query budget status: %s", e)
|
|
474
|
+
raise HTTPException(status_code=503, detail=f"Budget status unavailable: {str(e)}") from None
|
|
475
|
+
except Exception as e:
|
|
476
|
+
logger.error("Unexpected error querying budget status: %s", e, exc_info=True)
|
|
477
|
+
raise HTTPException(status_code=500, detail=f"Failed to query budget: {str(e)}") from None
|