devsquad 4.5.5__tar.gz → 4.5.8__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-4.5.5 → devsquad-4.5.8}/PKG-INFO +3 -3
- {devsquad-4.5.5 → devsquad-4.5.8}/README.md +2 -2
- {devsquad-4.5.5 → devsquad-4.5.8}/devsquad.egg-info/PKG-INFO +3 -3
- {devsquad-4.5.5 → devsquad-4.5.8}/devsquad.egg-info/SOURCES.txt +3 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/pyproject.toml +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_module_activation.py +202 -22
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_test_quality.py +22 -8
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli.py +8 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli_audit.py +8 -8
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli_backend.py +4 -4
- devsquad-4.5.8/scripts/cli_risks.py +503 -0
- devsquad-4.5.8/scripts/collaboration/_version.py +1 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/agent_identity.py +7 -7
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/approval_gate.py +11 -11
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/artifact_store.py +12 -12
- devsquad-4.5.8/scripts/collaboration/async_coeffect_resolver.py +260 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/backend_config.py +9 -9
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/backend_paths.py +9 -9
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/checkpoint_manager.py +5 -5
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/connector_framework.py +15 -15
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dependency_hallucination_checker.py +6 -6
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_hooks.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher.py +8 -8
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_intent_mapper.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_loop_controller.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_transaction.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dora_metrics_collector.py +11 -11
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/effect_registry.py +12 -12
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/error_budget_tracker.py +13 -13
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/file_bundler.py +4 -4
- devsquad-4.5.8/scripts/collaboration/file_risk_store.py +416 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/gap_analyzer.py +15 -15
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/gitlab_connector.py +15 -15
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/host_llm_bridge.py +9 -9
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/host_llm_bridge_v2.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/llm_backend.py +2 -4
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/models_dispatch.py +13 -13
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/module_fiber.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/moka_backend.py +8 -8
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/order_chain_detector.py +10 -10
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/perf_baseline.py +16 -16
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/protocols.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/quality_calibration_gate.py +3 -3
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/quality_probe_slice.py +3 -3
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/report_formatter.py +5 -5
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/risk_register.py +89 -18
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/role_specific_mock_backend.py +3 -3
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/scratchpad_history_store.py +11 -11
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/skill_provider_builtin.py +6 -6
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/skill_provider_mcp.py +6 -6
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/task_scale_gate.py +12 -12
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/test_quality_guard.py +39 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/viewpoint_registry.py +11 -11
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collect_baseline.py +7 -8
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/__init__.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_api_security.py +24 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_api_server_v362.py +27 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_approval_gate.py +16 -16
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_artifact_effect_binding.py +3 -3
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_artifact_store.py +15 -15
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_backend_config.py +2 -2
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_check_test_quality.py +12 -3
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_cli_audit.py +5 -5
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_cli_doctor.py +5 -5
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_test_quality_guard_test.py +25 -4
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dependency_hallucination_checker.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dispatcher_intent_mapper.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dispatcher_loop_controller.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dispatcher_transaction.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_effect_registry.py +2 -2
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_fallback_fuse.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_gitlab_connector.py +5 -5
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_host_bridge_unit.py +9 -9
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_host_llm_bridge_v2.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_moka_backend.py +12 -12
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_order_chain_detector.py +5 -5
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_perf_baseline.py +5 -5
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_perf_baseline_ci_gate.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_prometheus_metrics.py +1 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_rate_limit.py +24 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_task_scale_gate.py +5 -5
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_worker_artifact_integration.py +5 -5
- devsquad-4.5.5/scripts/collaboration/_version.py +0 -1
- {devsquad-4.5.5 → devsquad-4.5.8}/LICENSE +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/devsquad.egg-info/dependency_links.txt +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/devsquad.egg-info/entry_points.txt +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/devsquad.egg-info/requires.txt +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/devsquad.egg-info/top_level.txt +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/api/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/api/models.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/api/rate_limit.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/api/routes/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/api/routes/dispatch.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/api/routes/lifecycle.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/api/routes/metrics.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/api/routes/metrics_gates.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/api/security.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/api_server.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/auth.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/benchmark_async_dispatch.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/benchmark_ponytail_smart.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/benchmark_real_llm.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_async_coverage.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_config_consistency.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_constructor_params.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_dependency_lock.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_dependency_sync.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_doc_consistency.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_hidden_content.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_test_pyramid.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/check_version_consistency.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli/cli_visual.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli_dispatch.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli_doctor.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli_lifecycle.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli_metrics.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli_modules.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli_sessions.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/cli_utils.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/adaptive_role_selector.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/adversarial_verify.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/agent_briefing.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ai_semantic_matcher.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/anchor_checker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/anti_rationalization.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/async_adapter.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/async_coordinator.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/async_llm_backend.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/audit_logger.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/autonomous/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/autonomous/git_driver.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/autonomous/loop_controller.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/autonomous/notes_memory.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/autonomous/run_state.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/autonomous/sleep_guard.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/autonomous/smart_confirmation.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/batch_scheduler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/benchmark_regression_checker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/cache_interface.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ccr_store.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ci_feedback_adapter.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/cli_command_classifier.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/code_graph_query.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/code_graph_storage.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/code_knowledge_graph.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/code_map_generator.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/coeffect.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/concern_pack_loader.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/confidence_score.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/config_manager.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/consensus.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/consensus_gate.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/constants.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/content_cache.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/content_crusher.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/context_compressor.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/coordinator.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dashboard_live_mode.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/debt_collector.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/deployment_compliance_checker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_audit.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_component_factory.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_effect.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_lifecycle.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_models.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_performance.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_pre_steps.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_rbac.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_result_assembler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_services.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_steps.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_steps_base.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_steps_consensus_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_steps_feedback_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_steps_mixins.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_steps_quality_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatch_steps_services_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_async_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_audit_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_base.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_config.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_error_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_factory.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_lifecycle_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_mixins.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_status_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dispatcher_utils_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/dual_layer_context.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/enhanced_worker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/enterprise_feature.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/event_bus.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/execution_guard.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/feature_usage_tracker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/feedback_control_loop.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/five_axis_consensus.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/input_validator.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/intent_workflow_mapper.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/judge_agent.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/language_parsers.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/learned_rule_store.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/lifecycle_gate.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/lifecycle_protocol.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/lifecycle_shortcut_adapter.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/lifecycle_shortcut_helpers.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/lifecycle_templates.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/llm_cache.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/llm_cache_async.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/llm_cache_base.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/llm_retry.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/llm_retry_async.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/llm_retry_base.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/loop_engineering/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/loop_engineering/discovery_probe.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/loop_engineering/handoff_adapter.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/loop_engineering/independent_evaluator.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/loop_engineering/kernel.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/loop_engineering/loop_scheduler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/loop_engineering/models.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/loop_engineering/protocols.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/loop_engineering/rollback_strategy.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/loop_engineering/unified_memory.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/mce_adapter.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/memory_bridge.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/memory_claw_source.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/memory_forgetting.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/memory_index.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/memory_query.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/memory_serializer.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/memory_types.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/meta_skill_layering.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/micro_task_planner.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/models.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/models_base.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/models_lifecycle.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/multi_host_adapter.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/multi_level_cache.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/multi_tenant.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/null_providers.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/operation_classifier.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/output_slicer.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/output_validator.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/performance_fingerprint.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/performance_monitor.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/permission_guard.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/plugins/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/plugins/hot_loader.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ponytail_rule_injector.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/prometheus_metrics.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/prompt_assembler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/prompt_assembler_base.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/prompt_assembler_formatting_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/prompt_assembler_mixins.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/prompt_assembler_substitution_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/prompt_assembler_template_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/prompt_assembler_validation_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/prompt_dials.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/rbac_engine.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/redesign_auditor.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/redesign_checkers.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/redis_cache.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/requirement_tracer.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/retrospective.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/review_checkers.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/role_matcher.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/role_skill_loader.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/rule_collector.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/scratchpad.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/secret_patterns.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/severity_router.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/similar_task_recommender.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/skill_extractor.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/skill_registry.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/skill_storage.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/skillifier.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/standardized_role_template.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/task_completion_checker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/tech_debt_manager.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/todo_drift_monitor.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/two_stage_review_gate.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ue_test_accessibility_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ue_test_framework.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ue_test_framework_base.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ue_test_heuristic_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ue_test_journey_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ue_test_mixins.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/ue_test_persona_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/unified_gate_engine.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/usage_tracker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/user_friendly_error.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/verification_gate.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/warmup_manager.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/worker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/workflow_engine.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/workflow_engine_base.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/workflow_engine_lifecycle_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/workflow_engine_mixins.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/workflow_engine_persistence_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/workflow_engine_state_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/workflow_engine_transition_mixin.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/collaboration/yagni_checker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/app.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/auth_views.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/components.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/dag_views.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/dispatch_views.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/i18n.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/lifecycle_views.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/metrics_views.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/state.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard/v43_panels.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/dashboard.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/generate_benchmark_report.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/generate_quality_decision_report.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/history_manager.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/mcp_server.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/qa/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/qa/deterministic_rule_engine.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/qa/models.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/qa/taste_dials.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/qa/uiux_analyzer.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/qa/uiux_subitems.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/qa/visual_regression.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/scan_pickle_payloads.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/utils/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/scripts/utils/_find_missing_hints.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/setup.cfg +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/_version.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/dispatch/handler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/intent/handler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/prototype/handler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/registry.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/retrospective/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/retrospective/handler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/review/handler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/security/handler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/teach/handler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/test/__init__.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/skills/test/handler.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_4pt_grid.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_adaptive_role_selector.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_adversarial_verify.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_agent_briefing.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_anchor_retrospective.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_anti_rationalization.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_antipattern_bans.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_api_budget_status_endpoint.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_async_coordinator.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_async_modules.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_audit_logger.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_auth_phase5.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_autonomous.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_benchmark_ponytail_smart.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_cache_interface.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_ccr_store.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_check_async_coverage.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_check_config_consistency.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_check_constructor_params.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_check_dependency_lock.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_check_hidden_content.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_check_test_pyramid.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_check_version_consistency.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_ci_feedback_adapter.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_cli_command_classifier.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_cli_deep_v362.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_cli_lifecycle.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_cli_metrics.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_cli_phase5.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_code_knowledge_graph.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_claw_integration_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_context_compressor_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_core_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_dispatcher_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_dispatcher_ux_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_e2e_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_enhanced_e2e_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_llm_cache_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_llm_retry_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_mce_adapter_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_memory_bridge_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_performance_monitor_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_permission_guard_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_prompt_optimization_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_role_mapping_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_skillifier_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_test_quality_guard.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_upstream_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_collaboration_warmup_manager_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_confidence_score.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_config_injection.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_consensus_dissent.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_consensus_fatigue.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_consensus_gate.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_content_cache.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_content_crusher.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_coordinator_smart_compression.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dag_views.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dashboard_live_mode.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dashboard_split.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dashboard_ui_e2e.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dashboard_v43_panels.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_data_backup.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_debt_collector.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_deep_shallow.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_deletion_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dependency_lock.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_deployment_compliance_checker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_deterministic_rule_engine.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dispatch_audit.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dispatch_performance.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dispatch_rbac.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dispatch_steps.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dispatcher_mixins.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dispatcher_phase5_core.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_docker_deployment.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_dual_layer_context.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_enhanced_worker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_feedback_control_loop.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_five_axis_consensus.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_flow_standalone.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_full_lifecycle_adapter.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_git_guardrails.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_glossary_loader.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_grilling_mode.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_handoff_redaction.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_history_manager_v362.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_input_validator_phase5.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_input_validator_sensitive.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_intent_workflow_mapper.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_judge_agent.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_learned_rule_phase4.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_lifecycle_protocol.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_llm_auto_fallback.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_llm_backend_resolve.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_llm_cache_protocol.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_loop_engineering.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_loop_engineering_rollback.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_mcp_server_v362.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_memory_benchmarks.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_meta_skill_layering.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_micro_task_planner.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_multi_host_adapter.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_multi_tenant.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_multi_tenant_isolation_e2e.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_no_op_test.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_node_type_separation.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_null_providers.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_oklch_color.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_operation_classifier.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_output_slicer.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_output_validator_prompt_injection.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_performance_benchmarks.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_performance_fingerprint.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_performance_monitor_protocol.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_permission_guard_human_gate.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_permission_guard_phase5.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_phase4_ghost_feature_defense.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_pipeline_step19_20.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_plan_c_unified_architecture.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_plugins_hot_loader.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_ponytail_rule_injector.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_production_features.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_prompt_dials.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_protocols.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_prototype_skill.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_qa_uiux_visual_regression.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_quick_bonus.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_rbac_engine.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_rbac_fail_closed.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_red_capable_gate.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_redesign_auditor.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_redis_cache.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_requirement_tracer.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_retry_jitter_strategies.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_role_skill_loader.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_rule_collector.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_rule_injection_security.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_secret_patterns.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_severity_router.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_similar_task_recommender.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_skill_registry_coverage.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_skill_security.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_sleep_guard.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_standardized_role_template.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_start_script.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_step_node_types.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_suggested_next_steps.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_task_completion_checker.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_taste_dials.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_tautological_seams.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_teach_skill.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_tech_debt_manager.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_todo_drift_monitor.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_token_budget_compressed_scratchpad.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_triage_label.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_two_stage_review_gate.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_ue_test_framework.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_uiux_subitems.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_usage_tracker_coverage.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_v39_e2e.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_v39_performance.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_v411_security_hardening.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_verification_gate.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_version.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_vertical_slice.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_workflow_engine.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_workflow_engine_base.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_workflow_engine_lifecycle.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_workflow_engine_state.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_workflow_engine_transition.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_workflow_persistence_coverage.py +0 -0
- {devsquad-4.5.5 → devsquad-4.5.8}/tests/test_yagni_checker.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsquad
|
|
3
|
-
Version: 4.5.
|
|
3
|
+
Version: 4.5.8
|
|
4
4
|
Summary: Production-Ready Multi-Role AI Task Orchestrator
|
|
5
5
|
Author-email: DevSquad Team <devsquad@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -96,14 +96,14 @@ Dynamic: license-file
|
|
|
96
96
|
<p align="center">
|
|
97
97
|
<strong>🎯 把「单个 AI 助手」升级成「7 人 AI 专业团队」</strong>
|
|
98
98
|
<br>
|
|
99
|
-
<em>One task → Multi-role AI collaboration → One conclusion | V4.5.5 (Module Fiber + Coeffect: 6-state FSM + topological activation + modules CLI) | V4.5.3 (Artifacts + Effect — ArtifactStore + DispatchEffect + EffectRegistry + Audit CLI) | V4.5.2 (Experience polish: MOKA + Metrics + GitLab + Doctor + BackendConfig) | V4.5.0 (cross-session continuity + protocol-native skills)
|
|
99
|
+
<em>One task → Multi-role AI collaboration → One conclusion | V4.5.8 (FileRiskStore persistence + risks add/assess/mitigate/close + exposure filters) | V4.5.7 (Coeffect Async + Risk Register UX CLI) | V4.5.6 (Module Fiber + Coeffect: 6-state FSM + topological activation + modules CLI) | V4.5.3 (Artifacts + Effect — ArtifactStore + DispatchEffect + EffectRegistry + Audit CLI) | V4.5.2 (Experience polish: MOKA + Metrics + GitLab + Doctor + BackendConfig) | V4.5.0 (cross-session continuity + protocol-native skills)</em>
|
|
100
100
|
</p>
|
|
101
101
|
|
|
102
102
|
<p align="center">
|
|
103
103
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.10+-blue?logo=python&logoColor=white" />
|
|
104
104
|
<img alt="License" src="https://img.shields.io/badge/License-MIT-green" />
|
|
105
105
|
<img alt="Tests" src="https://img.shields.io/badge/Tests-8996%2B%20passing-brightgreen" />
|
|
106
|
-
<img alt="Version" src="https://img.shields.io/badge/V4.5.
|
|
106
|
+
<img alt="Version" src="https://img.shields.io/badge/V4.5.8-success" />
|
|
107
107
|
<img alt="CI" src="https://img.shields.io/badge/CI-GitHub_Actions-blue?logo=githubactions" />
|
|
108
108
|
<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" />
|
|
109
109
|
<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" />
|
|
@@ -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 | V4.5.5 (Module Fiber + Coeffect: 6-state FSM + topological activation + modules CLI) | V4.5.3 (Artifacts + Effect — ArtifactStore + DispatchEffect + EffectRegistry + Audit CLI) | V4.5.2 (Experience polish: MOKA + Metrics + GitLab + Doctor + BackendConfig) | V4.5.0 (cross-session continuity + protocol-native skills)
|
|
6
|
+
<em>One task → Multi-role AI collaboration → One conclusion | V4.5.8 (FileRiskStore persistence + risks add/assess/mitigate/close + exposure filters) | V4.5.7 (Coeffect Async + Risk Register UX CLI) | V4.5.6 (Module Fiber + Coeffect: 6-state FSM + topological activation + modules CLI) | V4.5.3 (Artifacts + Effect — ArtifactStore + DispatchEffect + EffectRegistry + Audit CLI) | V4.5.2 (Experience polish: MOKA + Metrics + GitLab + Doctor + BackendConfig) | V4.5.0 (cross-session continuity + protocol-native skills)</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
12
|
<img alt="Tests" src="https://img.shields.io/badge/Tests-8996%2B%20passing-brightgreen" />
|
|
13
|
-
<img alt="Version" src="https://img.shields.io/badge/V4.5.
|
|
13
|
+
<img alt="Version" src="https://img.shields.io/badge/V4.5.8-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" />
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsquad
|
|
3
|
-
Version: 4.5.
|
|
3
|
+
Version: 4.5.8
|
|
4
4
|
Summary: Production-Ready Multi-Role AI Task Orchestrator
|
|
5
5
|
Author-email: DevSquad Team <devsquad@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -96,14 +96,14 @@ Dynamic: license-file
|
|
|
96
96
|
<p align="center">
|
|
97
97
|
<strong>🎯 把「单个 AI 助手」升级成「7 人 AI 专业团队」</strong>
|
|
98
98
|
<br>
|
|
99
|
-
<em>One task → Multi-role AI collaboration → One conclusion | V4.5.5 (Module Fiber + Coeffect: 6-state FSM + topological activation + modules CLI) | V4.5.3 (Artifacts + Effect — ArtifactStore + DispatchEffect + EffectRegistry + Audit CLI) | V4.5.2 (Experience polish: MOKA + Metrics + GitLab + Doctor + BackendConfig) | V4.5.0 (cross-session continuity + protocol-native skills)
|
|
99
|
+
<em>One task → Multi-role AI collaboration → One conclusion | V4.5.8 (FileRiskStore persistence + risks add/assess/mitigate/close + exposure filters) | V4.5.7 (Coeffect Async + Risk Register UX CLI) | V4.5.6 (Module Fiber + Coeffect: 6-state FSM + topological activation + modules CLI) | V4.5.3 (Artifacts + Effect — ArtifactStore + DispatchEffect + EffectRegistry + Audit CLI) | V4.5.2 (Experience polish: MOKA + Metrics + GitLab + Doctor + BackendConfig) | V4.5.0 (cross-session continuity + protocol-native skills)</em>
|
|
100
100
|
</p>
|
|
101
101
|
|
|
102
102
|
<p align="center">
|
|
103
103
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.10+-blue?logo=python&logoColor=white" />
|
|
104
104
|
<img alt="License" src="https://img.shields.io/badge/License-MIT-green" />
|
|
105
105
|
<img alt="Tests" src="https://img.shields.io/badge/Tests-8996%2B%20passing-brightgreen" />
|
|
106
|
-
<img alt="Version" src="https://img.shields.io/badge/V4.5.
|
|
106
|
+
<img alt="Version" src="https://img.shields.io/badge/V4.5.8-success" />
|
|
107
107
|
<img alt="CI" src="https://img.shields.io/badge/CI-GitHub_Actions-blue?logo=githubactions" />
|
|
108
108
|
<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" />
|
|
109
109
|
<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" />
|
|
@@ -32,6 +32,7 @@ scripts/cli_doctor.py
|
|
|
32
32
|
scripts/cli_lifecycle.py
|
|
33
33
|
scripts/cli_metrics.py
|
|
34
34
|
scripts/cli_modules.py
|
|
35
|
+
scripts/cli_risks.py
|
|
35
36
|
scripts/cli_sessions.py
|
|
36
37
|
scripts/cli_utils.py
|
|
37
38
|
scripts/collect_baseline.py
|
|
@@ -64,6 +65,7 @@ scripts/collaboration/anti_rationalization.py
|
|
|
64
65
|
scripts/collaboration/approval_gate.py
|
|
65
66
|
scripts/collaboration/artifact_store.py
|
|
66
67
|
scripts/collaboration/async_adapter.py
|
|
68
|
+
scripts/collaboration/async_coeffect_resolver.py
|
|
67
69
|
scripts/collaboration/async_coordinator.py
|
|
68
70
|
scripts/collaboration/async_llm_backend.py
|
|
69
71
|
scripts/collaboration/audit_logger.py
|
|
@@ -139,6 +141,7 @@ scripts/collaboration/execution_guard.py
|
|
|
139
141
|
scripts/collaboration/feature_usage_tracker.py
|
|
140
142
|
scripts/collaboration/feedback_control_loop.py
|
|
141
143
|
scripts/collaboration/file_bundler.py
|
|
144
|
+
scripts/collaboration/file_risk_store.py
|
|
142
145
|
scripts/collaboration/five_axis_consensus.py
|
|
143
146
|
scripts/collaboration/gap_analyzer.py
|
|
144
147
|
scripts/collaboration/gitlab_connector.py
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""
|
|
3
3
|
check_module_activation.py — V4.5.3 Anti-Ghost CI gate.
|
|
4
4
|
|
|
5
|
-
Verifies that all V4.5.3 modules'
|
|
5
|
+
Verifies that all V4.5.3 modules' _call_counter_er is > 0 after a representative
|
|
6
6
|
dispatch. Used by CI to block releases of ghost modules.
|
|
7
7
|
|
|
8
8
|
V4.5.2 P12.1: Extended to include:
|
|
@@ -21,6 +21,10 @@ V4.5.4 P12.3: Extended to include:
|
|
|
21
21
|
- CoeffectResolver (P12.3.2)
|
|
22
22
|
- ModulesCLI (P12.3.3)
|
|
23
23
|
|
|
24
|
+
V4.5.8: Extended to include:
|
|
25
|
+
- FileRiskStore (file-backed risk persistence)
|
|
26
|
+
- CliRisks mutators (add/mitigate/close/list --min-exposure)
|
|
27
|
+
|
|
24
28
|
Usage:
|
|
25
29
|
python3 scripts/check_module_activation.py
|
|
26
30
|
CI: python3 scripts/check_module_activation.py || exit 1
|
|
@@ -36,7 +40,7 @@ sys.path.insert(0, ".")
|
|
|
36
40
|
|
|
37
41
|
|
|
38
42
|
def main() -> int:
|
|
39
|
-
"""Check all V4.5.2 modules'
|
|
43
|
+
"""Check all V4.5.2 modules' _call_counter_er > 0.
|
|
40
44
|
|
|
41
45
|
Returns:
|
|
42
46
|
0 if all modules activated (anti-ghost pass).
|
|
@@ -49,24 +53,24 @@ def main() -> int:
|
|
|
49
53
|
resolve_backend,
|
|
50
54
|
)
|
|
51
55
|
from scripts.collaboration.backend_paths import classify_error
|
|
52
|
-
from scripts.collaboration.backend_paths import
|
|
56
|
+
from scripts.collaboration.backend_paths import get_call_counter_er as bp
|
|
53
57
|
from scripts.collaboration.gitlab_connector import GitLabConnector
|
|
54
58
|
from scripts.collaboration.gitlab_connector import get_call_count as glc
|
|
55
|
-
from scripts.collaboration.host_llm_bridge import
|
|
59
|
+
from scripts.collaboration.host_llm_bridge import get_call_counter_er as hbb
|
|
56
60
|
|
|
57
61
|
# V4.5.2 P12.1 modules
|
|
58
62
|
from scripts.collaboration.moka_backend import MokaAIBackend
|
|
59
63
|
|
|
60
64
|
# V4.5.2 P12.1 modules
|
|
61
|
-
from scripts.collaboration.moka_backend import
|
|
65
|
+
from scripts.collaboration.moka_backend import get_call_counter_er as mok
|
|
62
66
|
from scripts.collaboration.order_chain_detector import OrderChainDetector
|
|
63
|
-
from scripts.collaboration.order_chain_detector import
|
|
67
|
+
from scripts.collaboration.order_chain_detector import get_call_counter_er as ocd
|
|
64
68
|
from scripts.collaboration.perf_baseline import PerfSampleCollector
|
|
65
|
-
from scripts.collaboration.perf_baseline import
|
|
69
|
+
from scripts.collaboration.perf_baseline import get_call_counter_er as pb
|
|
66
70
|
|
|
67
71
|
# Activate each module (representative call)
|
|
68
72
|
from scripts.collaboration.task_scale_gate import TaskScaleGate
|
|
69
|
-
from scripts.collaboration.task_scale_gate import
|
|
73
|
+
from scripts.collaboration.task_scale_gate import get_call_counter_er as tsg
|
|
70
74
|
|
|
71
75
|
TaskScaleGate().decide("anti-ghost check")
|
|
72
76
|
OrderChainDetector().detect("anti-ghost check")
|
|
@@ -111,7 +115,7 @@ def main() -> int:
|
|
|
111
115
|
create_backend("mock") # C path
|
|
112
116
|
bridge = HostLLMBridge(bridge_dir=None)
|
|
113
117
|
# Directly invoke create_request — this is the only path that bumps
|
|
114
|
-
#
|
|
118
|
+
# _call_counter_er in production code (generate() calls it internally).
|
|
115
119
|
with contextlib.suppress(OSError, ValueError):
|
|
116
120
|
# Bridge dir may not exist; the counter bump happens BEFORE that.
|
|
117
121
|
bridge.create_request(
|
|
@@ -126,12 +130,18 @@ def main() -> int:
|
|
|
126
130
|
os.environ[k] = v
|
|
127
131
|
|
|
128
132
|
# V4.5.3 P12.2 modules — touch counters in main scope so they survive module-level imports
|
|
129
|
-
from scripts.cli_audit import
|
|
133
|
+
from scripts.cli_audit import get_call_counter_er as au_call_counter_er
|
|
134
|
+
|
|
135
|
+
# V4.5.7 P12.5 modules — touch counters in main scope
|
|
136
|
+
from scripts.cli_risks import get_call_counter_er as _get_cli_risks_counter_er
|
|
130
137
|
from scripts.collaboration.artifact_store import (
|
|
131
|
-
|
|
138
|
+
get_call_counter_er as as_call_counter_er,
|
|
139
|
+
)
|
|
140
|
+
from scripts.collaboration.async_coeffect_resolver import (
|
|
141
|
+
get_call_counter_er as _get_async_coeffect_counter_er,
|
|
132
142
|
)
|
|
133
143
|
|
|
134
|
-
# V4.5.
|
|
144
|
+
# V4.5.6 P12.4 modules — touch counters in main scope
|
|
135
145
|
from scripts.collaboration.dispatcher_intent_mapper import (
|
|
136
146
|
get_call_counter_er as _get_intent_counter_er,
|
|
137
147
|
)
|
|
@@ -159,9 +169,20 @@ def main() -> int:
|
|
|
159
169
|
# V4.5.4 P12.3 activation
|
|
160
170
|
_activate_v454_modules()
|
|
161
171
|
|
|
162
|
-
# V4.5.
|
|
172
|
+
# V4.5.6 P12.4 activation (4 new modules)
|
|
163
173
|
_activate_v455_modules()
|
|
164
174
|
|
|
175
|
+
# V4.5.8 modules — touch counters in main scope
|
|
176
|
+
from scripts.collaboration.file_risk_store import (
|
|
177
|
+
get_call_counter_er as _get_file_risk_store_counter_er,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
# V4.5.7 P12.5 activation (2 new modules)
|
|
181
|
+
_activate_v457_modules()
|
|
182
|
+
|
|
183
|
+
# V4.5.8 activation (FileRiskStore + CliRisks mutators)
|
|
184
|
+
_activate_v458_modules()
|
|
185
|
+
|
|
165
186
|
counters = {
|
|
166
187
|
"TaskScaleGate": tsg(),
|
|
167
188
|
"PerfBaseline": pb(),
|
|
@@ -173,21 +194,27 @@ def main() -> int:
|
|
|
173
194
|
"GitLabConnector_P12.1.3": glc(),
|
|
174
195
|
"BackendConfig_P12.1.5": bcc(),
|
|
175
196
|
# V4.5.3 P12.2 modules
|
|
176
|
-
"ArtifactStore_P12.2.1":
|
|
197
|
+
"ArtifactStore_P12.2.1": as_call_counter_er(),
|
|
177
198
|
"EffectRegistry_P12.2.4": er_call_count(),
|
|
178
|
-
"AuditCLI_P12.2.6":
|
|
199
|
+
"AuditCLI_P12.2.6": au_call_counter_er(),
|
|
179
200
|
# V4.5.4 P12.3 modules
|
|
180
201
|
"ModuleFiber_P12.3.1": get_call_counter_er(),
|
|
181
202
|
"CoeffectResolver_P12.3.2": get_call_counter_er(), # shared counter
|
|
182
203
|
"ModulesCLI_P12.3.3": get_call_counter_er(), # shared counter
|
|
183
|
-
# V4.5.
|
|
204
|
+
# V4.5.6 P12.4 modules
|
|
184
205
|
"HostLLMBridgeV2_P12.4.1": _get_call_counter_er_v2(),
|
|
185
206
|
"DispatcherTransaction_P12.4.2": _get_tx_counter_er(),
|
|
186
207
|
"IntentWorkflowMapper_P12.4.3": _get_intent_counter_er(),
|
|
187
208
|
"DispatchLoopController_P12.4.4": _get_loop_counter_er(),
|
|
209
|
+
# V4.5.7 P12.5 modules
|
|
210
|
+
"AsyncCoeffectResolver_P12.5.1": _get_async_coeffect_counter_er(),
|
|
211
|
+
"CliRisks_P12.5.2": _get_cli_risks_counter_er(),
|
|
212
|
+
# V4.5.8 modules
|
|
213
|
+
"FileRiskStore_V458.1": _get_file_risk_store_counter_er(),
|
|
214
|
+
"CliRisksMutators_V458.2": _get_cli_risks_counter_er(),
|
|
188
215
|
}
|
|
189
216
|
|
|
190
|
-
print("V4.5.
|
|
217
|
+
print("V4.5.8 Anti-Ghost Verification")
|
|
191
218
|
print("=" * 60)
|
|
192
219
|
failed = []
|
|
193
220
|
for name, count in counters.items():
|
|
@@ -203,10 +230,130 @@ def main() -> int:
|
|
|
203
230
|
print(f" - {name}")
|
|
204
231
|
return 1
|
|
205
232
|
|
|
206
|
-
print("All V4.5.
|
|
233
|
+
print("All V4.5.8 modules activated. Anti-ghost gate PASSED.")
|
|
207
234
|
return 0
|
|
208
235
|
|
|
209
236
|
|
|
237
|
+
def _activate_v458_modules() -> None:
|
|
238
|
+
"""Exercise V4.5.8 modules to bump their anti-ghost counters.
|
|
239
|
+
|
|
240
|
+
Touches:
|
|
241
|
+
- FileRiskStore — items_to_payload + transaction write + load
|
|
242
|
+
round-trip + lock_timeout lock acquisition failure
|
|
243
|
+
- CliRisks mutators — add + mitigate + close (no approval) +
|
|
244
|
+
list --min-exposure filtering
|
|
245
|
+
"""
|
|
246
|
+
import io
|
|
247
|
+
import tempfile
|
|
248
|
+
from argparse import Namespace
|
|
249
|
+
from contextlib import redirect_stdout
|
|
250
|
+
from pathlib import Path
|
|
251
|
+
|
|
252
|
+
# Wave 1: FileRiskStore — full persistence round-trip
|
|
253
|
+
from scripts.collaboration.file_risk_store import (
|
|
254
|
+
FileRiskStore,
|
|
255
|
+
RiskStoreLockError,
|
|
256
|
+
)
|
|
257
|
+
from scripts.collaboration.risk_register import (
|
|
258
|
+
ResponseStrategy,
|
|
259
|
+
RiskItem,
|
|
260
|
+
RiskStatus,
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
264
|
+
root = Path(tmpdir)
|
|
265
|
+
store = FileRiskStore(root=root, lock_timeout=1.0)
|
|
266
|
+
item = RiskItem(
|
|
267
|
+
id="R-AG-1",
|
|
268
|
+
description="anti-ghost V4.5.8 risk",
|
|
269
|
+
probability=0.4,
|
|
270
|
+
impact=0.5,
|
|
271
|
+
response_strategy=ResponseStrategy.MITIGATE,
|
|
272
|
+
owner="anti-ghost",
|
|
273
|
+
status=RiskStatus.OPEN,
|
|
274
|
+
category="technical",
|
|
275
|
+
)
|
|
276
|
+
payload = store.items_to_payload("default", [item])
|
|
277
|
+
with store.transaction("default") as tx:
|
|
278
|
+
tx["items"] = payload["items"]
|
|
279
|
+
loaded = store.load("default")
|
|
280
|
+
assert loaded["version"] == 1
|
|
281
|
+
assert loaded["items"][0]["id"] == "R-AG-1"
|
|
282
|
+
|
|
283
|
+
# Lock timeout: a second store with lock_timeout=0.1 must fail while
|
|
284
|
+
# the transaction above holds the cross-process lock.
|
|
285
|
+
holder = FileRiskStore(root=root, lock_timeout=5.0)
|
|
286
|
+
with holder.transaction("default"):
|
|
287
|
+
tight = FileRiskStore(root=root, lock_timeout=0.1)
|
|
288
|
+
try:
|
|
289
|
+
tight.load("default")
|
|
290
|
+
except RiskStoreLockError:
|
|
291
|
+
pass
|
|
292
|
+
else:
|
|
293
|
+
raise AssertionError("expected RiskStoreLockError after 0.1s timeout")
|
|
294
|
+
|
|
295
|
+
# Wave 2+3: CliRisks mutators — add → mitigate → close → list filter
|
|
296
|
+
from scripts.cli_risks import (
|
|
297
|
+
cmd_risks_add,
|
|
298
|
+
cmd_risks_close,
|
|
299
|
+
cmd_risks_list,
|
|
300
|
+
cmd_risks_mitigate,
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
304
|
+
root = str(Path(tmpdir) / "risks")
|
|
305
|
+
buf = io.StringIO()
|
|
306
|
+
with redirect_stdout(buf):
|
|
307
|
+
add_rc = cmd_risks_add(Namespace(
|
|
308
|
+
description="anti-ghost CLI risk",
|
|
309
|
+
probability=0.6,
|
|
310
|
+
impact=0.5,
|
|
311
|
+
category="technical",
|
|
312
|
+
owner="anti-ghost",
|
|
313
|
+
register_id="default",
|
|
314
|
+
root=root,
|
|
315
|
+
))
|
|
316
|
+
assert add_rc == 0
|
|
317
|
+
|
|
318
|
+
# Recover the risk id from the persisted store.
|
|
319
|
+
reader = FileRiskStore(root=root)
|
|
320
|
+
risk_id = next(iter(reader.payload_to_items(reader.load("default"))))
|
|
321
|
+
|
|
322
|
+
with redirect_stdout(buf):
|
|
323
|
+
assert cmd_risks_mitigate(Namespace(
|
|
324
|
+
risk_id=risk_id,
|
|
325
|
+
strategy="mitigate",
|
|
326
|
+
owner="devops",
|
|
327
|
+
plan="anti-ghost plan",
|
|
328
|
+
register_id="default",
|
|
329
|
+
root=root,
|
|
330
|
+
)) == 0
|
|
331
|
+
|
|
332
|
+
# Close WITHOUT approval (require_approval=False → no gate).
|
|
333
|
+
with redirect_stdout(buf):
|
|
334
|
+
assert cmd_risks_close(Namespace(
|
|
335
|
+
risk_id=risk_id,
|
|
336
|
+
require_approval=False,
|
|
337
|
+
register_id="default",
|
|
338
|
+
root=root,
|
|
339
|
+
)) == 0
|
|
340
|
+
|
|
341
|
+
# --min-exposure filter: high threshold hides every row, zero shows it.
|
|
342
|
+
buf_hidden, buf_visible = io.StringIO(), io.StringIO()
|
|
343
|
+
with redirect_stdout(buf_hidden):
|
|
344
|
+
assert cmd_risks_list(Namespace(
|
|
345
|
+
register_id="default", root=root, format="md",
|
|
346
|
+
min_exposure=0.99, severity=None, category=None, limit=None,
|
|
347
|
+
)) == 0
|
|
348
|
+
assert "(none)" in buf_hidden.getvalue()
|
|
349
|
+
with redirect_stdout(buf_visible):
|
|
350
|
+
assert cmd_risks_list(Namespace(
|
|
351
|
+
register_id="default", root=root, format="md",
|
|
352
|
+
min_exposure=0.0, severity=None, category=None, limit=None,
|
|
353
|
+
)) == 0
|
|
354
|
+
assert "`R-" in buf_visible.getvalue()
|
|
355
|
+
|
|
356
|
+
|
|
210
357
|
def _activate_v454_modules() -> None:
|
|
211
358
|
"""Exercise V4.5.4 P12.3 modules to bump their anti-ghost counters.
|
|
212
359
|
|
|
@@ -244,7 +391,7 @@ def _activate_v454_modules() -> None:
|
|
|
244
391
|
|
|
245
392
|
|
|
246
393
|
def _activate_v455_modules() -> None:
|
|
247
|
-
"""Exercise V4.5.
|
|
394
|
+
"""Exercise V4.5.6 P12.4 modules to bump their anti-ghost counters.
|
|
248
395
|
|
|
249
396
|
Touches:
|
|
250
397
|
- HostLLMBridgeV2_P12.4.1 — create_request (writes marker)
|
|
@@ -292,9 +439,42 @@ def _activate_v455_modules() -> None:
|
|
|
292
439
|
_ = TransactionRegistry()
|
|
293
440
|
|
|
294
441
|
|
|
442
|
+
def _activate_v457_modules() -> None:
|
|
443
|
+
"""Exercise V4.5.7 P12.5 modules to bump their anti-ghost counters.
|
|
444
|
+
|
|
445
|
+
Touches:
|
|
446
|
+
- AsyncCoeffectResolver_P12.5.1 — sync bridge resolve() with executor
|
|
447
|
+
- CliRisks_P12.5.2 — add_risk + cmd_risks_list
|
|
448
|
+
"""
|
|
449
|
+
from argparse import Namespace
|
|
450
|
+
|
|
451
|
+
# P12.5.1: AsyncCoeffectResolver — sync bridge round-trip
|
|
452
|
+
from scripts.collaboration.async_coeffect_resolver import (
|
|
453
|
+
AsyncCoeffectResolver,
|
|
454
|
+
CoeffectRequest,
|
|
455
|
+
CoeffectState,
|
|
456
|
+
)
|
|
457
|
+
|
|
458
|
+
resolver = AsyncCoeffectResolver()
|
|
459
|
+
result = resolver.resolve(
|
|
460
|
+
CoeffectRequest(
|
|
461
|
+
name="anti-ghost",
|
|
462
|
+
payload={"executor": lambda: 42},
|
|
463
|
+
)
|
|
464
|
+
)
|
|
465
|
+
assert result.state == CoeffectState.COMPLETED
|
|
466
|
+
assert result.value == 42
|
|
467
|
+
|
|
468
|
+
# P12.5.2: CliRisks — add + list round-trip (in-process store)
|
|
469
|
+
from scripts.cli_risks import add_risk, cmd_risks_list
|
|
470
|
+
|
|
471
|
+
add_risk("anti-ghost verification risk", probability=0.1, impact=0.1)
|
|
472
|
+
cmd_risks_list(Namespace(format="md", severity=None, limit=None))
|
|
473
|
+
|
|
474
|
+
|
|
295
475
|
def _activate_v453_modules() -> None:
|
|
296
476
|
"""Exercise V4.5.3 P12.2 modules to bump their anti-ghost counters."""
|
|
297
|
-
from scripts.cli_audit import
|
|
477
|
+
from scripts.cli_audit import get_call_counter_er as au_call_counter_er
|
|
298
478
|
from scripts.collaboration.artifact_store import (
|
|
299
479
|
ArtifactStore,
|
|
300
480
|
)
|
|
@@ -322,8 +502,8 @@ def _activate_v453_modules() -> None:
|
|
|
322
502
|
reg.apply(WriteFileEffect(), effect_ctx)
|
|
323
503
|
reg.pending_count()
|
|
324
504
|
|
|
325
|
-
# P12.2.6: AuditCLI — exercise
|
|
326
|
-
_ =
|
|
505
|
+
# P12.2.6: AuditCLI — exercise get_call_counter_er (cmd_audit is imported above)
|
|
506
|
+
_ = au_call_counter_er()
|
|
327
507
|
# Exercise cmd_audit once to bump counter
|
|
328
508
|
from argparse import Namespace
|
|
329
509
|
|
|
@@ -36,11 +36,14 @@ def scan_test_file(detector: AntiPatternDetector, test_file: Path) -> list[Quali
|
|
|
36
36
|
|
|
37
37
|
Lines containing ``# noqa: test-quality`` are skipped (false positive
|
|
38
38
|
suppression, e.g., string literals that contain anti-pattern text as
|
|
39
|
-
test fixtures for the detector itself).
|
|
39
|
+
test fixtures for the detector itself). The detection logic checks both
|
|
40
|
+
the matched line AND the next 5 lines for noqa — because ``detect_in_source``
|
|
41
|
+
flags the matched line by its own index, but for fixture strings the actual
|
|
42
|
+
``noqa`` directive may live on an inner line of the multi-line literal.
|
|
40
43
|
|
|
41
44
|
Args:
|
|
42
45
|
detector: AntiPatternDetector instance.
|
|
43
|
-
test_file:
|
|
46
|
+
test_file: File path used for reporting issue locations.
|
|
44
47
|
|
|
45
48
|
Returns:
|
|
46
49
|
List of QualityIssue found in the file.
|
|
@@ -51,23 +54,34 @@ def scan_test_file(detector: AntiPatternDetector, test_file: Path) -> list[Quali
|
|
|
51
54
|
print(f" WARN: cannot read {test_file}: {exc}", file=sys.stderr)
|
|
52
55
|
return []
|
|
53
56
|
issues = detector.detect_in_source(source, str(test_file))
|
|
54
|
-
# Filter out noqa-suppressed issues
|
|
57
|
+
# Filter out noqa-suppressed issues (check the matched line AND the next 5
|
|
58
|
+
# lines, since fixture strings can span multiple lines).
|
|
55
59
|
return [i for i in issues if not _is_noqa_suppressed(source, i.line)]
|
|
56
60
|
|
|
57
61
|
|
|
58
62
|
def _is_noqa_suppressed(source: str, line_no: int) -> bool:
|
|
59
|
-
"""Check if a line has
|
|
63
|
+
"""Check if a line or any of the next 5 lines has ``# noqa: test-quality``.
|
|
64
|
+
|
|
65
|
+
For multi-line fixture strings (e.g., ``code = "@lru_cache\ndef ...``), the
|
|
66
|
+
detector flags line 1 of the literal but the ``noqa`` directive may be on
|
|
67
|
+
the same or following line within the literal. We allow suppression on
|
|
68
|
+
line_no OR line_no+1..line_no+5 to handle these cases.
|
|
60
69
|
|
|
61
70
|
Args:
|
|
62
71
|
source: Full source code text.
|
|
63
|
-
line_no: 1-based line
|
|
72
|
+
line_no: 1-based line index of the matched anti-pattern.
|
|
64
73
|
|
|
65
74
|
Returns:
|
|
66
|
-
True if
|
|
75
|
+
True if ``# noqa: test-quality`` appears on any of the 6 lines.
|
|
67
76
|
"""
|
|
68
77
|
lines = source.split("\n")
|
|
69
|
-
|
|
70
|
-
|
|
78
|
+
# V4.5.6 W2: extend noqa detection to 8 lines so multi-line fixture strings
|
|
79
|
+
# with noqa on a non-immediate line are suppressed (test_07 has @lru_cache
|
|
80
|
+
# on line 1 of fixture but noqa on line 2 of literal).
|
|
81
|
+
for offset in range(0, 8): # noqa: test-quality
|
|
82
|
+
idx = line_no - 1 + offset
|
|
83
|
+
if 0 <= idx < len(lines) and "# noqa: test-quality" in lines[idx]:
|
|
84
|
+
return True
|
|
71
85
|
return False
|
|
72
86
|
|
|
73
87
|
|
|
@@ -507,6 +507,10 @@ Environment Variables (API keys are read from env vars only, never command line)
|
|
|
507
507
|
# V4.5.4 P12.3.3: devsquad modules CLI (status/graph/retry)
|
|
508
508
|
register_modules_subparser(subparsers)
|
|
509
509
|
|
|
510
|
+
# V4.5.7 P12.5.2: devsquad risks CLI (list/show/clear/export)
|
|
511
|
+
from scripts.cli_risks import register_risks_subparser
|
|
512
|
+
register_risks_subparser(subparsers)
|
|
513
|
+
|
|
510
514
|
# V4.5.0 SessionResume CLI (PRD §10.1.2): `sessions` subcommand group
|
|
511
515
|
p_sessions = subparsers.add_parser(
|
|
512
516
|
"sessions", aliases=["sess"], help="List/show dispatch sessions (SessionResume V4.5.0)"
|
|
@@ -612,6 +616,10 @@ Environment Variables (API keys are read from env vars only, never command line)
|
|
|
612
616
|
return cmd_roles(args)
|
|
613
617
|
elif args.command in ("sessions", "sess"):
|
|
614
618
|
return cmd_sessions(args)
|
|
619
|
+
elif args.command in ("risks", "risk"):
|
|
620
|
+
if hasattr(args, "func") and callable(args.func):
|
|
621
|
+
return args.func(args)
|
|
622
|
+
return 1
|
|
615
623
|
elif args.command == "doctor":
|
|
616
624
|
return cmd_doctor(args)
|
|
617
625
|
elif args.command == "backend":
|
|
@@ -12,7 +12,7 @@ Exposes DispatchAuditLogger as a CLI subcommand:
|
|
|
12
12
|
Sensitive fields (api_key, password, secret, token) in details dict are
|
|
13
13
|
auto-redacted in text output.
|
|
14
14
|
|
|
15
|
-
Anti-ghost:
|
|
15
|
+
Anti-ghost: get_call_counter_er() exposed.
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
18
|
from __future__ import annotations
|
|
@@ -31,20 +31,20 @@ sys.path.insert(0, ".")
|
|
|
31
31
|
|
|
32
32
|
# ---------- Anti-ghost counter ----------
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
_call_counter_er: int = 0
|
|
35
35
|
_call_counter_lock = threading.Lock()
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
def
|
|
39
|
-
global
|
|
38
|
+
def _inc_call_counter_er() -> None:
|
|
39
|
+
global _call_counter_er
|
|
40
40
|
with _call_counter_lock:
|
|
41
|
-
|
|
41
|
+
_call_counter_er += 1
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
def
|
|
44
|
+
def get_call_counter_er() -> int:
|
|
45
45
|
"""Return current anti-ghost counter value."""
|
|
46
46
|
with _call_counter_lock:
|
|
47
|
-
return
|
|
47
|
+
return _call_counter_er
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
# ---------- Sensitive field redaction ----------
|
|
@@ -193,7 +193,7 @@ def cmd_audit(args: argparse.Namespace) -> int:
|
|
|
193
193
|
Returns:
|
|
194
194
|
Exit code (0 success, 1 verify failure).
|
|
195
195
|
"""
|
|
196
|
-
|
|
196
|
+
_inc_call_counter_er()
|
|
197
197
|
entries = _load_entries(args.db_path)
|
|
198
198
|
if args.event_type:
|
|
199
199
|
entries = [e for e in entries if e.get("event_type") == args.event_type]
|
|
@@ -19,7 +19,7 @@ from typing import Any
|
|
|
19
19
|
|
|
20
20
|
from scripts.collaboration.backend_config import (
|
|
21
21
|
VALID_BACKENDS,
|
|
22
|
-
|
|
22
|
+
_inc_call_counter_er,
|
|
23
23
|
resolve_backend,
|
|
24
24
|
save_backend_config,
|
|
25
25
|
)
|
|
@@ -34,7 +34,7 @@ def cmd_backend_set(args: Any) -> int:
|
|
|
34
34
|
Returns:
|
|
35
35
|
Exit code (0 on success).
|
|
36
36
|
"""
|
|
37
|
-
|
|
37
|
+
_inc_call_counter_er()
|
|
38
38
|
provider = args.provider
|
|
39
39
|
project = getattr(args, "project", False)
|
|
40
40
|
|
|
@@ -63,7 +63,7 @@ def cmd_backend_get(args: Any) -> int:
|
|
|
63
63
|
Returns:
|
|
64
64
|
Exit code (0).
|
|
65
65
|
"""
|
|
66
|
-
|
|
66
|
+
_inc_call_counter_er()
|
|
67
67
|
project = getattr(args, "project", False)
|
|
68
68
|
backend = resolve_backend(prefer_project=project)
|
|
69
69
|
print(f"Current backend: {backend}")
|
|
@@ -79,7 +79,7 @@ def cmd_backend_list(args: Any) -> int:
|
|
|
79
79
|
Returns:
|
|
80
80
|
Exit code (0).
|
|
81
81
|
"""
|
|
82
|
-
|
|
82
|
+
_inc_call_counter_er()
|
|
83
83
|
current = resolve_backend()
|
|
84
84
|
print("Available LLM backends:")
|
|
85
85
|
for backend in sorted(VALID_BACKENDS):
|