devsquad 4.5.4__tar.gz → 4.5.5__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.4 → devsquad-4.5.5}/PKG-INFO +3 -3
- {devsquad-4.5.4 → devsquad-4.5.5}/README.md +2 -2
- {devsquad-4.5.4 → devsquad-4.5.5}/devsquad.egg-info/PKG-INFO +3 -3
- {devsquad-4.5.4 → devsquad-4.5.5}/devsquad.egg-info/SOURCES.txt +8 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/pyproject.toml +1 -1
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_module_activation.py +75 -4
- devsquad-4.5.5/scripts/collaboration/_version.py +1 -0
- devsquad-4.5.5/scripts/collaboration/dispatcher_intent_mapper.py +238 -0
- devsquad-4.5.5/scripts/collaboration/dispatcher_loop_controller.py +252 -0
- devsquad-4.5.5/scripts/collaboration/dispatcher_transaction.py +416 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/host_llm_bridge.py +26 -3
- devsquad-4.5.5/scripts/collaboration/host_llm_bridge_v2.py +502 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/__init__.py +1 -1
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_artifact_effect_binding.py +1 -4
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_backend_config.py +1 -3
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_cli_audit.py +1 -3
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_cli_doctor.py +1 -3
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_cli_metrics.py +2 -3
- devsquad-4.5.5/tests/test_dispatcher_intent_mapper.py +132 -0
- devsquad-4.5.5/tests/test_dispatcher_loop_controller.py +115 -0
- devsquad-4.5.5/tests/test_dispatcher_transaction.py +246 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_effect_registry.py +0 -2
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_fallback_fuse.py +3 -4
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_gitlab_connector.py +1 -1
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_host_bridge_unit.py +0 -1
- devsquad-4.5.5/tests/test_host_llm_bridge_v2.py +297 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_moka_backend.py +4 -3
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_perf_baseline.py +2 -3
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_perf_baseline_ci_gate.py +1 -3
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_worker_artifact_integration.py +1 -2
- devsquad-4.5.4/scripts/collaboration/_version.py +0 -1
- {devsquad-4.5.4 → devsquad-4.5.5}/LICENSE +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/devsquad.egg-info/dependency_links.txt +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/devsquad.egg-info/entry_points.txt +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/devsquad.egg-info/requires.txt +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/devsquad.egg-info/top_level.txt +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/api/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/api/models.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/api/rate_limit.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/api/routes/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/api/routes/dispatch.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/api/routes/lifecycle.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/api/routes/metrics.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/api/routes/metrics_gates.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/api/security.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/api_server.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/auth.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/benchmark_async_dispatch.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/benchmark_ponytail_smart.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/benchmark_real_llm.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_async_coverage.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_config_consistency.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_constructor_params.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_dependency_lock.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_dependency_sync.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_doc_consistency.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_hidden_content.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_test_pyramid.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_test_quality.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/check_version_consistency.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli/cli_visual.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli_audit.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli_backend.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli_dispatch.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli_doctor.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli_lifecycle.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli_metrics.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli_modules.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli_sessions.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/cli_utils.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/adaptive_role_selector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/adversarial_verify.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/agent_briefing.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/agent_identity.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ai_semantic_matcher.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/anchor_checker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/anti_rationalization.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/approval_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/artifact_store.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/async_adapter.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/async_coordinator.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/async_llm_backend.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/audit_logger.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/autonomous/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/autonomous/git_driver.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/autonomous/loop_controller.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/autonomous/notes_memory.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/autonomous/run_state.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/autonomous/sleep_guard.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/autonomous/smart_confirmation.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/backend_config.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/backend_paths.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/batch_scheduler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/benchmark_regression_checker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/cache_interface.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ccr_store.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/checkpoint_manager.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ci_feedback_adapter.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/cli_command_classifier.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/code_graph_query.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/code_graph_storage.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/code_knowledge_graph.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/code_map_generator.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/coeffect.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/concern_pack_loader.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/confidence_score.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/config_manager.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/connector_framework.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/consensus.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/consensus_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/constants.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/content_cache.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/content_crusher.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/context_compressor.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/coordinator.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dashboard_live_mode.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/debt_collector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dependency_hallucination_checker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/deployment_compliance_checker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_audit.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_component_factory.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_effect.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_hooks.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_lifecycle.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_models.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_performance.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_pre_steps.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_rbac.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_result_assembler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_services.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_steps.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_steps_base.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_steps_consensus_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_steps_feedback_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_steps_mixins.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_steps_quality_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatch_steps_services_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher_async_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher_audit_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher_base.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher_config.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher_error_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher_factory.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher_lifecycle_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher_mixins.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher_status_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dispatcher_utils_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dora_metrics_collector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/dual_layer_context.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/effect_registry.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/enhanced_worker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/enterprise_feature.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/error_budget_tracker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/event_bus.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/execution_guard.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/feature_usage_tracker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/feedback_control_loop.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/file_bundler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/five_axis_consensus.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/gap_analyzer.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/gitlab_connector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/input_validator.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/intent_workflow_mapper.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/judge_agent.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/language_parsers.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/learned_rule_store.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/lifecycle_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/lifecycle_protocol.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/lifecycle_shortcut_adapter.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/lifecycle_shortcut_helpers.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/lifecycle_templates.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/llm_backend.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/llm_cache.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/llm_cache_async.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/llm_cache_base.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/llm_retry.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/llm_retry_async.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/llm_retry_base.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/loop_engineering/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/loop_engineering/discovery_probe.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/loop_engineering/handoff_adapter.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/loop_engineering/independent_evaluator.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/loop_engineering/kernel.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/loop_engineering/loop_scheduler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/loop_engineering/models.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/loop_engineering/protocols.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/loop_engineering/rollback_strategy.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/loop_engineering/unified_memory.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/mce_adapter.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/memory_bridge.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/memory_claw_source.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/memory_forgetting.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/memory_index.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/memory_query.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/memory_serializer.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/memory_types.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/meta_skill_layering.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/micro_task_planner.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/models.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/models_base.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/models_dispatch.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/models_lifecycle.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/module_fiber.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/moka_backend.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/multi_host_adapter.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/multi_level_cache.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/multi_tenant.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/null_providers.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/operation_classifier.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/order_chain_detector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/output_slicer.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/output_validator.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/perf_baseline.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/performance_fingerprint.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/performance_monitor.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/permission_guard.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/plugins/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/plugins/hot_loader.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ponytail_rule_injector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/prometheus_metrics.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/prompt_assembler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/prompt_assembler_base.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/prompt_assembler_formatting_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/prompt_assembler_mixins.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/prompt_assembler_substitution_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/prompt_assembler_template_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/prompt_assembler_validation_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/prompt_dials.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/protocols.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/quality_calibration_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/quality_probe_slice.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/rbac_engine.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/redesign_auditor.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/redesign_checkers.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/redis_cache.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/report_formatter.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/requirement_tracer.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/retrospective.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/review_checkers.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/risk_register.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/role_matcher.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/role_skill_loader.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/role_specific_mock_backend.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/rule_collector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/scratchpad.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/scratchpad_history_store.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/secret_patterns.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/severity_router.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/similar_task_recommender.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/skill_extractor.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/skill_provider_builtin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/skill_provider_mcp.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/skill_registry.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/skill_storage.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/skillifier.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/standardized_role_template.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/task_completion_checker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/task_scale_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/tech_debt_manager.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/test_quality_guard.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/todo_drift_monitor.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/two_stage_review_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ue_test_accessibility_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ue_test_framework.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ue_test_framework_base.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ue_test_heuristic_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ue_test_journey_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ue_test_mixins.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/ue_test_persona_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/unified_gate_engine.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/usage_tracker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/user_friendly_error.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/verification_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/viewpoint_registry.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/warmup_manager.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/worker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/workflow_engine.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/workflow_engine_base.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/workflow_engine_lifecycle_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/workflow_engine_mixins.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/workflow_engine_persistence_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/workflow_engine_state_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/workflow_engine_transition_mixin.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collaboration/yagni_checker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/collect_baseline.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/app.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/auth_views.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/components.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/dag_views.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/dispatch_views.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/i18n.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/lifecycle_views.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/metrics_views.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/state.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard/v43_panels.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/dashboard.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/generate_benchmark_report.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/generate_quality_decision_report.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/history_manager.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/mcp_server.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/qa/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/qa/deterministic_rule_engine.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/qa/models.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/qa/taste_dials.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/qa/uiux_analyzer.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/qa/uiux_subitems.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/qa/visual_regression.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/scan_pickle_payloads.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/utils/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/scripts/utils/_find_missing_hints.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/setup.cfg +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/_version.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/dispatch/handler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/intent/handler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/prototype/handler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/registry.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/retrospective/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/retrospective/handler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/review/handler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/security/handler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/teach/handler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/test/__init__.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/skills/test/handler.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_4pt_grid.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_adaptive_role_selector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_adversarial_verify.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_agent_briefing.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_anchor_retrospective.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_anti_rationalization.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_antipattern_bans.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_api_budget_status_endpoint.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_api_security.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_api_server_v362.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_approval_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_artifact_store.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_async_coordinator.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_async_modules.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_audit_logger.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_auth_phase5.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_autonomous.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_benchmark_ponytail_smart.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_cache_interface.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_ccr_store.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_check_async_coverage.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_check_config_consistency.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_check_constructor_params.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_check_dependency_lock.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_check_hidden_content.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_check_test_pyramid.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_check_test_quality.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_check_version_consistency.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_ci_feedback_adapter.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_cli_command_classifier.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_cli_deep_v362.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_cli_lifecycle.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_cli_phase5.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_code_knowledge_graph.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_claw_integration_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_context_compressor_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_core_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_dispatcher_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_dispatcher_ux_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_e2e_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_enhanced_e2e_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_llm_cache_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_llm_retry_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_mce_adapter_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_memory_bridge_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_performance_monitor_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_permission_guard_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_prompt_optimization_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_role_mapping_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_skillifier_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_test_quality_guard.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_test_quality_guard_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_upstream_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_collaboration_warmup_manager_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_confidence_score.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_config_injection.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_consensus_dissent.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_consensus_fatigue.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_consensus_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_content_cache.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_content_crusher.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_coordinator_smart_compression.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dag_views.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dashboard_live_mode.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dashboard_split.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dashboard_ui_e2e.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dashboard_v43_panels.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_data_backup.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_debt_collector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_deep_shallow.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_deletion_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dependency_hallucination_checker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dependency_lock.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_deployment_compliance_checker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_deterministic_rule_engine.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dispatch_audit.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dispatch_performance.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dispatch_rbac.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dispatch_steps.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dispatcher_mixins.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dispatcher_phase5_core.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_docker_deployment.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_dual_layer_context.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_enhanced_worker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_feedback_control_loop.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_five_axis_consensus.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_flow_standalone.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_full_lifecycle_adapter.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_git_guardrails.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_glossary_loader.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_grilling_mode.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_handoff_redaction.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_history_manager_v362.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_input_validator_phase5.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_input_validator_sensitive.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_intent_workflow_mapper.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_judge_agent.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_learned_rule_phase4.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_lifecycle_protocol.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_llm_auto_fallback.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_llm_backend_resolve.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_llm_cache_protocol.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_loop_engineering.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_loop_engineering_rollback.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_mcp_server_v362.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_memory_benchmarks.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_meta_skill_layering.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_micro_task_planner.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_multi_host_adapter.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_multi_tenant.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_multi_tenant_isolation_e2e.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_no_op_test.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_node_type_separation.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_null_providers.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_oklch_color.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_operation_classifier.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_order_chain_detector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_output_slicer.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_output_validator_prompt_injection.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_performance_benchmarks.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_performance_fingerprint.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_performance_monitor_protocol.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_permission_guard_human_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_permission_guard_phase5.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_phase4_ghost_feature_defense.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_pipeline_step19_20.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_plan_c_unified_architecture.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_plugins_hot_loader.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_ponytail_rule_injector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_production_features.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_prometheus_metrics.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_prompt_dials.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_protocols.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_prototype_skill.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_qa_uiux_visual_regression.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_quick_bonus.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_rate_limit.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_rbac_engine.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_rbac_fail_closed.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_red_capable_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_redesign_auditor.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_redis_cache.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_requirement_tracer.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_retry_jitter_strategies.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_role_skill_loader.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_rule_collector.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_rule_injection_security.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_secret_patterns.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_severity_router.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_similar_task_recommender.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_skill_registry_coverage.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_skill_security.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_sleep_guard.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_standardized_role_template.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_start_script.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_step_node_types.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_suggested_next_steps.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_task_completion_checker.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_task_scale_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_taste_dials.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_tautological_seams.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_teach_skill.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_tech_debt_manager.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_todo_drift_monitor.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_token_budget_compressed_scratchpad.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_triage_label.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_two_stage_review_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_ue_test_framework.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_uiux_subitems.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_usage_tracker_coverage.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_v39_e2e.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_v39_performance.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_v411_security_hardening.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_verification_gate.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_version.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_vertical_slice.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_workflow_engine.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_workflow_engine_base.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_workflow_engine_lifecycle.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_workflow_engine_state.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_workflow_engine_transition.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/tests/test_workflow_persistence_coverage.py +0 -0
- {devsquad-4.5.4 → devsquad-4.5.5}/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.5
|
|
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.
|
|
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) | V4.4.0 (5 enhancement modules)</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.5-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.
|
|
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) | V4.4.0 (5 enhancement modules)</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.5-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.5
|
|
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.
|
|
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) | V4.4.0 (5 enhancement modules)</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.5-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" />
|
|
@@ -121,9 +121,12 @@ scripts/collaboration/dispatcher_base.py
|
|
|
121
121
|
scripts/collaboration/dispatcher_config.py
|
|
122
122
|
scripts/collaboration/dispatcher_error_mixin.py
|
|
123
123
|
scripts/collaboration/dispatcher_factory.py
|
|
124
|
+
scripts/collaboration/dispatcher_intent_mapper.py
|
|
124
125
|
scripts/collaboration/dispatcher_lifecycle_mixin.py
|
|
126
|
+
scripts/collaboration/dispatcher_loop_controller.py
|
|
125
127
|
scripts/collaboration/dispatcher_mixins.py
|
|
126
128
|
scripts/collaboration/dispatcher_status_mixin.py
|
|
129
|
+
scripts/collaboration/dispatcher_transaction.py
|
|
127
130
|
scripts/collaboration/dispatcher_utils_mixin.py
|
|
128
131
|
scripts/collaboration/dora_metrics_collector.py
|
|
129
132
|
scripts/collaboration/dual_layer_context.py
|
|
@@ -140,6 +143,7 @@ scripts/collaboration/five_axis_consensus.py
|
|
|
140
143
|
scripts/collaboration/gap_analyzer.py
|
|
141
144
|
scripts/collaboration/gitlab_connector.py
|
|
142
145
|
scripts/collaboration/host_llm_bridge.py
|
|
146
|
+
scripts/collaboration/host_llm_bridge_v2.py
|
|
143
147
|
scripts/collaboration/input_validator.py
|
|
144
148
|
scripts/collaboration/intent_workflow_mapper.py
|
|
145
149
|
scripts/collaboration/judge_agent.py
|
|
@@ -387,8 +391,11 @@ tests/test_dispatch_audit.py
|
|
|
387
391
|
tests/test_dispatch_performance.py
|
|
388
392
|
tests/test_dispatch_rbac.py
|
|
389
393
|
tests/test_dispatch_steps.py
|
|
394
|
+
tests/test_dispatcher_intent_mapper.py
|
|
395
|
+
tests/test_dispatcher_loop_controller.py
|
|
390
396
|
tests/test_dispatcher_mixins.py
|
|
391
397
|
tests/test_dispatcher_phase5_core.py
|
|
398
|
+
tests/test_dispatcher_transaction.py
|
|
392
399
|
tests/test_docker_deployment.py
|
|
393
400
|
tests/test_dual_layer_context.py
|
|
394
401
|
tests/test_effect_registry.py
|
|
@@ -405,6 +412,7 @@ tests/test_grilling_mode.py
|
|
|
405
412
|
tests/test_handoff_redaction.py
|
|
406
413
|
tests/test_history_manager_v362.py
|
|
407
414
|
tests/test_host_bridge_unit.py
|
|
415
|
+
tests/test_host_llm_bridge_v2.py
|
|
408
416
|
tests/test_input_validator_phase5.py
|
|
409
417
|
tests/test_input_validator_sensitive.py
|
|
410
418
|
tests/test_intent_workflow_mapper.py
|
|
@@ -130,9 +130,23 @@ def main() -> int:
|
|
|
130
130
|
from scripts.collaboration.artifact_store import (
|
|
131
131
|
get_call_counter as as_call_counter,
|
|
132
132
|
)
|
|
133
|
+
|
|
134
|
+
# V4.5.5 P12.4 modules — touch counters in main scope
|
|
135
|
+
from scripts.collaboration.dispatcher_intent_mapper import (
|
|
136
|
+
get_call_counter_er as _get_intent_counter_er,
|
|
137
|
+
)
|
|
138
|
+
from scripts.collaboration.dispatcher_loop_controller import (
|
|
139
|
+
get_call_counter_er as _get_loop_counter_er,
|
|
140
|
+
)
|
|
141
|
+
from scripts.collaboration.dispatcher_transaction import (
|
|
142
|
+
get_call_counter_er as _get_tx_counter_er,
|
|
143
|
+
)
|
|
133
144
|
from scripts.collaboration.effect_registry import (
|
|
134
145
|
get_call_count as er_call_count,
|
|
135
146
|
)
|
|
147
|
+
from scripts.collaboration.host_llm_bridge_v2 import (
|
|
148
|
+
get_call_counter_er as _get_call_counter_er_v2,
|
|
149
|
+
)
|
|
136
150
|
|
|
137
151
|
# V4.5.4 P12.3 modules — touch counters in main scope
|
|
138
152
|
from scripts.collaboration.module_fiber import (
|
|
@@ -145,13 +159,16 @@ def main() -> int:
|
|
|
145
159
|
# V4.5.4 P12.3 activation
|
|
146
160
|
_activate_v454_modules()
|
|
147
161
|
|
|
162
|
+
# V4.5.5 P12.4 activation (4 new modules)
|
|
163
|
+
_activate_v455_modules()
|
|
164
|
+
|
|
148
165
|
counters = {
|
|
149
166
|
"TaskScaleGate": tsg(),
|
|
150
|
-
"OrderChainDetector": ocd(),
|
|
151
|
-
"BackendPath": bp(),
|
|
152
167
|
"PerfBaseline": pb(),
|
|
153
|
-
"
|
|
154
|
-
|
|
168
|
+
"HostLLMBridge": hbb(),
|
|
169
|
+
"BackendPaths": bp(),
|
|
170
|
+
"TaskScaleGate_dual": tsg(),
|
|
171
|
+
"OrderChainDetector": ocd(),
|
|
155
172
|
"MokaAIBackend_P12.1.1": mok(),
|
|
156
173
|
"GitLabConnector_P12.1.3": glc(),
|
|
157
174
|
"BackendConfig_P12.1.5": bcc(),
|
|
@@ -163,6 +180,11 @@ def main() -> int:
|
|
|
163
180
|
"ModuleFiber_P12.3.1": get_call_counter_er(),
|
|
164
181
|
"CoeffectResolver_P12.3.2": get_call_counter_er(), # shared counter
|
|
165
182
|
"ModulesCLI_P12.3.3": get_call_counter_er(), # shared counter
|
|
183
|
+
# V4.5.5 P12.4 modules
|
|
184
|
+
"HostLLMBridgeV2_P12.4.1": _get_call_counter_er_v2(),
|
|
185
|
+
"DispatcherTransaction_P12.4.2": _get_tx_counter_er(),
|
|
186
|
+
"IntentWorkflowMapper_P12.4.3": _get_intent_counter_er(),
|
|
187
|
+
"DispatchLoopController_P12.4.4": _get_loop_counter_er(),
|
|
166
188
|
}
|
|
167
189
|
|
|
168
190
|
print("V4.5.4 Anti-Ghost Verification")
|
|
@@ -221,6 +243,55 @@ def _activate_v454_modules() -> None:
|
|
|
221
243
|
_cms_local(Namespace(registry=reg, format="text", module=None))
|
|
222
244
|
|
|
223
245
|
|
|
246
|
+
def _activate_v455_modules() -> None:
|
|
247
|
+
"""Exercise V4.5.5 P12.4 modules to bump their anti-ghost counters.
|
|
248
|
+
|
|
249
|
+
Touches:
|
|
250
|
+
- HostLLMBridgeV2_P12.4.1 — create_request (writes marker)
|
|
251
|
+
- DispatcherTransaction_P12.4.2 — begin + commit
|
|
252
|
+
- IntentWorkflowMapper_P12.4.3 — resolve one workflow
|
|
253
|
+
- DispatchLoopController_P12.4.4 — should_stop call
|
|
254
|
+
"""
|
|
255
|
+
# P12.4.1: HostLLMBridgeV2 — create_request
|
|
256
|
+
import tempfile as _tf
|
|
257
|
+
|
|
258
|
+
from scripts.collaboration.dispatcher_intent_mapper import IntentWorkflowMapper
|
|
259
|
+
from scripts.collaboration.dispatcher_loop_controller import (
|
|
260
|
+
DispatchLoopController,
|
|
261
|
+
IterationKind,
|
|
262
|
+
IterationResult,
|
|
263
|
+
)
|
|
264
|
+
from scripts.collaboration.dispatcher_transaction import (
|
|
265
|
+
DispatchTransaction,
|
|
266
|
+
TransactionRegistry,
|
|
267
|
+
)
|
|
268
|
+
from scripts.collaboration.host_llm_bridge_v2 import HostLLMBridgeV2
|
|
269
|
+
with _tf.TemporaryDirectory() as tmpdir:
|
|
270
|
+
bridge = HostLLMBridgeV2(bridge_dir=tmpdir)
|
|
271
|
+
bridge.create_request(
|
|
272
|
+
agent_type="anti-ghost",
|
|
273
|
+
task="anti-ghost check v2",
|
|
274
|
+
context={},
|
|
275
|
+
prompt="v2 test prompt",
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
# P12.4.2: DispatcherTransaction — full lifecycle
|
|
279
|
+
tx = DispatchTransaction(tx_id="anti-ghost-tx")
|
|
280
|
+
tx.register_module("m1", lambda: None, lambda: None)
|
|
281
|
+
tx.begin()
|
|
282
|
+
tx.commit()
|
|
283
|
+
|
|
284
|
+
# P12.4.3: IntentWorkflowMapper — resolve one workflow
|
|
285
|
+
mapper = IntentWorkflowMapper()
|
|
286
|
+
mapper.resolve("design", "zh")
|
|
287
|
+
|
|
288
|
+
# P12.4.4: DispatchLoopController — should_stop call
|
|
289
|
+
ctrl = DispatchLoopController()
|
|
290
|
+
ctrl.should_stop(IterationResult(IterationKind.SUCCESS))
|
|
291
|
+
# Also verify the registry helper is importable
|
|
292
|
+
_ = TransactionRegistry()
|
|
293
|
+
|
|
294
|
+
|
|
224
295
|
def _activate_v453_modules() -> None:
|
|
225
296
|
"""Exercise V4.5.3 P12.2 modules to bump their anti-ghost counters."""
|
|
226
297
|
from scripts.cli_audit import get_call_counter as au_call_counter
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "4.5.5"
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Intent Workflow Mapper (V4.5.5 P4-P5 Wave 2).
|
|
3
|
+
|
|
4
|
+
6 intents × 3 languages lazy-loadable workflow resolver.
|
|
5
|
+
|
|
6
|
+
设计原则:
|
|
7
|
+
- V4.5.3 lesson #7: best-effort try/except (unknown intent → default workflow)
|
|
8
|
+
- V4.5.3 lesson #8: global state + lock pattern (_call_counter_er)
|
|
9
|
+
- Security: 路径白名单 + safe_load 防 YAML 注入
|
|
10
|
+
|
|
11
|
+
Anti-Ghost: _intent_call_counter_er 递增 on resolve().
|
|
12
|
+
"""
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import importlib
|
|
16
|
+
import logging
|
|
17
|
+
import threading
|
|
18
|
+
from contextlib import suppress
|
|
19
|
+
from dataclasses import dataclass
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Any, ClassVar
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
# ---------------------------------------------------------------------------
|
|
26
|
+
# Anti-Ghost counter (V4.5.3 lesson #4 naming unified)
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
_intent_call_counter_er: int = 0
|
|
29
|
+
_intent_counter_lock = threading.Lock()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _inc_call_counter_er() -> None:
|
|
33
|
+
"""Increment IntentWorkflowMapper activation counter (thread-safe)."""
|
|
34
|
+
global _intent_call_counter_er
|
|
35
|
+
with _intent_counter_lock:
|
|
36
|
+
_intent_call_counter_er += 1
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def get_call_counter_er() -> int:
|
|
40
|
+
"""Return activation counter for Anti-Ghost verification."""
|
|
41
|
+
return _intent_call_counter_er
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# ---------------------------------------------------------------------------
|
|
45
|
+
# Supported Intents / Languages
|
|
46
|
+
# ---------------------------------------------------------------------------
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
SUPPORTED_INTENTS: tuple[str, ...] = (
|
|
50
|
+
"design", # 架构设计
|
|
51
|
+
"dev", # 功能开发
|
|
52
|
+
"test", # 测试设计
|
|
53
|
+
"audit", # 代码审查
|
|
54
|
+
"optimize", # 性能优化
|
|
55
|
+
"document", # 文档生成
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
SUPPORTED_LANGS: tuple[str, ...] = ("zh", "en", "ja")
|
|
59
|
+
|
|
60
|
+
DEFAULT_INTENT = "dev"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class IntentError(ValueError):
|
|
64
|
+
"""Raised on invalid intent/lang combo."""
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# ---------------------------------------------------------------------------
|
|
68
|
+
# Workflow Metadata
|
|
69
|
+
# ---------------------------------------------------------------------------
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@dataclass(frozen=True, slots=True)
|
|
73
|
+
class IntentWorkflow:
|
|
74
|
+
"""Resolved workflow metadata."""
|
|
75
|
+
|
|
76
|
+
intent: str
|
|
77
|
+
lang: str
|
|
78
|
+
workflow_module: str
|
|
79
|
+
workflow_class: str
|
|
80
|
+
is_default: bool = False
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# ---------------------------------------------------------------------------
|
|
84
|
+
# Mapper
|
|
85
|
+
# ---------------------------------------------------------------------------
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class IntentWorkflowMapper:
|
|
89
|
+
"""Intent → workflow lazy resolver (Security: path whitelist)."""
|
|
90
|
+
|
|
91
|
+
DEFAULT_WORKFLOWS: ClassVar[dict[str, dict[str, str]]] = {
|
|
92
|
+
"design": {
|
|
93
|
+
"zh": "scripts.workflows.intent_design_zh.DesignWorkflow",
|
|
94
|
+
"en": "scripts.workflows.intent_design_en.DesignWorkflow",
|
|
95
|
+
"ja": "scripts.workflows.intent_design_ja.DesignWorkflow",
|
|
96
|
+
},
|
|
97
|
+
"dev": {
|
|
98
|
+
"zh": "scripts.workflows.intent_dev_zh.DevWorkflow",
|
|
99
|
+
"en": "scripts.workflows.intent_dev_en.DevWorkflow",
|
|
100
|
+
"ja": "scripts.workflows.intent_dev_ja.DevWorkflow",
|
|
101
|
+
},
|
|
102
|
+
"test": {
|
|
103
|
+
"zh": "scripts.workflows.intent_test_zh.TestWorkflow",
|
|
104
|
+
"en": "scripts.workflows.intent_test_en.TestWorkflow",
|
|
105
|
+
"ja": "scripts.workflows.intent_test_ja.TestWorkflow",
|
|
106
|
+
},
|
|
107
|
+
"audit": {
|
|
108
|
+
"zh": "scripts.workflows.intent_audit_zh.AuditWorkflow",
|
|
109
|
+
"en": "scripts.workflows.intent_audit_en.AuditWorkflow",
|
|
110
|
+
"ja": "scripts.workflows.intent_audit_ja.AuditWorkflow",
|
|
111
|
+
},
|
|
112
|
+
"optimize": {
|
|
113
|
+
"zh": "scripts.workflows.intent_optimize_zh.OptimizeWorkflow",
|
|
114
|
+
"en": "scripts.workflows.intent_optimize_en.OptimizeWorkflow",
|
|
115
|
+
"ja": "scripts.workflows.intent_optimize_ja.OptimizeWorkflow",
|
|
116
|
+
},
|
|
117
|
+
"document": {
|
|
118
|
+
"zh": "scripts.workflows.intent_document_zh.DocumentWorkflow",
|
|
119
|
+
"en": "scripts.workflows.intent_document_en.DocumentWorkflow",
|
|
120
|
+
"ja": "scripts.workflows.intent_document_ja.DocumentWorkflow",
|
|
121
|
+
},
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
__slots__ = ("_cache", "_lock", "_registered_workflows")
|
|
125
|
+
|
|
126
|
+
def __init__(self, workflows_dir: str | Path | None = None) -> None: # noqa: ARG002
|
|
127
|
+
_inc_call_counter_er()
|
|
128
|
+
# workflows_dir parameter reserved for future YAML-based registry
|
|
129
|
+
# (Security: path whitelist)
|
|
130
|
+
self._cache: dict[tuple[str, str], IntentWorkflow] = {}
|
|
131
|
+
self._lock = threading.Lock()
|
|
132
|
+
# Default to built-in workflows (Security: path whitelist)
|
|
133
|
+
self._registered_workflows: dict[str, dict[str, str]] = {
|
|
134
|
+
intent: dict(langs) for intent, langs in self.DEFAULT_WORKFLOWS.items()
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
def resolve(self, intent: str, lang: str = "zh") -> IntentWorkflow:
|
|
138
|
+
"""Resolve intent+lang to workflow metadata (lazy load).
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
intent: One of SUPPORTED_INTENTS.
|
|
142
|
+
lang: One of SUPPORTED_LANGS.
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
IntentWorkflow (metadata only, not yet imported).
|
|
146
|
+
|
|
147
|
+
Raises:
|
|
148
|
+
IntentError: If lang not supported.
|
|
149
|
+
"""
|
|
150
|
+
_inc_call_counter_er()
|
|
151
|
+
if lang not in SUPPORTED_LANGS:
|
|
152
|
+
raise IntentError(f"unsupported lang: {lang}")
|
|
153
|
+
# Normalize unknown intent to default (V4.5.3 lesson #7 best-effort)
|
|
154
|
+
normalized_intent = intent if intent in SUPPORTED_INTENTS else DEFAULT_INTENT
|
|
155
|
+
cache_key = (normalized_intent, lang)
|
|
156
|
+
with self._lock:
|
|
157
|
+
if cache_key in self._cache:
|
|
158
|
+
return self._cache[cache_key]
|
|
159
|
+
# Build metadata
|
|
160
|
+
workflows_for_intent = self._registered_workflows.get(
|
|
161
|
+
normalized_intent, self._registered_workflows[DEFAULT_INTENT],
|
|
162
|
+
)
|
|
163
|
+
dotted_path = workflows_for_intent.get(lang, workflows_for_intent["zh"])
|
|
164
|
+
module_path, _, class_name = dotted_path.rpartition(".")
|
|
165
|
+
is_default = normalized_intent != intent or normalized_intent == DEFAULT_INTENT
|
|
166
|
+
workflow = IntentWorkflow(
|
|
167
|
+
intent=normalized_intent,
|
|
168
|
+
lang=lang,
|
|
169
|
+
workflow_module=module_path,
|
|
170
|
+
workflow_class=class_name,
|
|
171
|
+
is_default=is_default,
|
|
172
|
+
)
|
|
173
|
+
with self._lock:
|
|
174
|
+
self._cache[cache_key] = workflow
|
|
175
|
+
return workflow
|
|
176
|
+
|
|
177
|
+
def _load_workflow(self, intent: str, lang: str) -> Any:
|
|
178
|
+
"""Lazy import the workflow module + return the class.
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
The workflow class (not instance).
|
|
182
|
+
|
|
183
|
+
Raises:
|
|
184
|
+
IntentError: If module/class cannot be imported.
|
|
185
|
+
"""
|
|
186
|
+
wf = self.resolve(intent, lang)
|
|
187
|
+
try:
|
|
188
|
+
module = importlib.import_module(wf.workflow_module)
|
|
189
|
+
return getattr(module, wf.workflow_class)
|
|
190
|
+
except (ImportError, AttributeError) as exc:
|
|
191
|
+
raise IntentError(
|
|
192
|
+
f"failed to load workflow {wf.workflow_module}.{wf.workflow_class}: {exc}"
|
|
193
|
+
) from exc
|
|
194
|
+
|
|
195
|
+
def list_workflows(self) -> list[IntentWorkflow]:
|
|
196
|
+
"""List all registered workflows (cached + uncached)."""
|
|
197
|
+
result = []
|
|
198
|
+
for intent in SUPPORTED_INTENTS:
|
|
199
|
+
for lang in SUPPORTED_LANGS:
|
|
200
|
+
with suppress(IntentError):
|
|
201
|
+
result.append(self.resolve(intent, lang))
|
|
202
|
+
return result
|
|
203
|
+
|
|
204
|
+
def register_workflow(
|
|
205
|
+
self,
|
|
206
|
+
intent: str,
|
|
207
|
+
lang: str,
|
|
208
|
+
workflow_module: str,
|
|
209
|
+
workflow_class: str,
|
|
210
|
+
) -> None:
|
|
211
|
+
"""Register a custom workflow (overrides default).
|
|
212
|
+
|
|
213
|
+
Security: workflow_module must be in registered set, not arbitrary path.
|
|
214
|
+
"""
|
|
215
|
+
if intent not in SUPPORTED_INTENTS:
|
|
216
|
+
raise IntentError(f"unknown intent: {intent}")
|
|
217
|
+
if lang not in SUPPORTED_LANGS:
|
|
218
|
+
raise IntentError(f"unsupported lang: {lang}")
|
|
219
|
+
# Security: validate workflow_module doesn't contain path traversal
|
|
220
|
+
if ".." in workflow_module or workflow_module.startswith("."):
|
|
221
|
+
raise IntentError(f"invalid module path: {workflow_module}")
|
|
222
|
+
with self._lock:
|
|
223
|
+
self._registered_workflows.setdefault(intent, {})[lang] = (
|
|
224
|
+
f"{workflow_module}.{workflow_class}"
|
|
225
|
+
)
|
|
226
|
+
self._cache.pop((intent, lang), None)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
__all__ = [
|
|
230
|
+
"IntentWorkflowMapper",
|
|
231
|
+
"IntentWorkflow",
|
|
232
|
+
"SUPPORTED_INTENTS",
|
|
233
|
+
"SUPPORTED_LANGS",
|
|
234
|
+
"DEFAULT_INTENT",
|
|
235
|
+
"IntentError",
|
|
236
|
+
"get_call_counter_er",
|
|
237
|
+
"_inc_call_counter_er",
|
|
238
|
+
]
|