devsquad 4.5.17__tar.gz → 4.5.18__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.17 → devsquad-4.5.18}/PKG-INFO +4 -4
- {devsquad-4.5.17 → devsquad-4.5.18}/README.md +3 -3
- {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/PKG-INFO +4 -4
- {devsquad-4.5.17 → devsquad-4.5.18}/pyproject.toml +1 -1
- devsquad-4.5.18/scripts/collaboration/_version.py +2 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ccr_store.py +8 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skill_registry.py +63 -43
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/history_manager.py +10 -1
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/__init__.py +1 -1
- devsquad-4.5.17/scripts/collaboration/_version.py +0 -2
- {devsquad-4.5.17 → devsquad-4.5.18}/LICENSE +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/SOURCES.txt +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/dependency_links.txt +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/entry_points.txt +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/requires.txt +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/top_level.txt +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/models.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/rate_limit.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/routes/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/routes/dispatch.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/routes/lifecycle.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/routes/metrics.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/routes/metrics_gates.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/security.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api_server.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/auth.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/benchmark_async_dispatch.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/benchmark_ponytail_smart.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/benchmark_real_llm.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_async_coverage.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_bandit.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_config_consistency.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_constructor_params.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_dependency_lock.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_dependency_sync.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_dispatcher_size.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_doc_consistency.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_hidden_content.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_module_activation.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_test_pyramid.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_test_quality.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_version_consistency.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli/cli_visual.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_audit.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_backend.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_dispatch.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_doctor.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_lifecycle.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_metrics.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_modules.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_risks.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_sessions.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_utils.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/adaptive_role_selector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/adversarial_verify.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/agent_briefing.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/agent_identity.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ai_semantic_matcher.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/anchor_checker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/anti_rationalization.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/approval_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/artifact_store.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/async_adapter.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/async_coeffect_resolver.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/async_coordinator.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/async_llm_backend.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/audit_logger.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/git_driver.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/loop_controller.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/notes_memory.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/run_state.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/sleep_guard.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/smart_confirmation.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/backend_config.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/backend_paths.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/batch_scheduler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/benchmark_regression_checker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/cache_interface.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/checkpoint_manager.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ci_feedback_adapter.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/cli_command_classifier.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/code_graph_query.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/code_graph_storage.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/code_knowledge_graph.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/code_map_generator.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/coeffect.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/concern_pack_loader.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/confidence_score.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/config_manager.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/connector_framework.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/consensus.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/consensus_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/constants.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/content_cache.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/content_crusher.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/context_compressor.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/coordinator.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dashboard_live_mode.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/debt_collector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dependency_hallucination_checker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/deployment_compliance_checker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_audit.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_component_factory.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_effect.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_hooks.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_lifecycle.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_models.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_performance.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_pre_steps.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_rbac.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_result_assembler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_services.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_base.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_consensus_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_feedback_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_mixins.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_quality_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_services_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_async_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_audit_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_base.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_config.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_error_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_factory.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_intent_mapper.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_lifecycle_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_loop_controller.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_mixins.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_status_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_transaction.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_utils_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dora_metrics_collector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dual_layer_context.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/effect_registry.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/enhanced_worker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/enterprise_feature.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/error_budget_tracker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/event_bus.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/execution_guard.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/feature_usage_tracker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/feedback_control_loop.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/file_bundler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/file_risk_store.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/five_axis_consensus.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/gap_analyzer.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/gather_core.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/gitlab_connector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/host_llm_bridge.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/host_llm_bridge_v2.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/input_validator.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/intent_workflow_mapper.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/judge_agent.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/language_parsers.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/learned_rule_store.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/lifecycle_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/lifecycle_protocol.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/lifecycle_shortcut_adapter.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/lifecycle_shortcut_helpers.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/lifecycle_templates.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_backend.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_cache.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_cache_async.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_cache_base.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_retry.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_retry_async.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_retry_base.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/discovery_probe.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/handoff_adapter.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/independent_evaluator.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/kernel.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/loop_scheduler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/models.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/protocols.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/rollback_strategy.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/unified_memory.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/mce_adapter.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_bridge.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_claw_source.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_forgetting.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_index.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_query.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_serializer.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_types.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/meta_skill_layering.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/micro_task_planner.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/models.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/models_base.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/models_dispatch.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/models_lifecycle.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/module_fiber.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/moka_backend.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/multi_host_adapter.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/multi_level_cache.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/multi_tenant.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/null_providers.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/operation_classifier.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/order_chain_detector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/output_slicer.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/output_validator.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/perf_baseline.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/performance_fingerprint.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/performance_monitor.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/permission_guard.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/plugins/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/plugins/hot_loader.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ponytail_rule_injector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prometheus_metrics.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_base.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_formatting_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_mixins.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_substitution_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_template_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_validation_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_dials.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/protocols.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/quality_calibration_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/quality_probe_slice.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/rbac_engine.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/redesign_auditor.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/redesign_checkers.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/redis_cache.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/report_formatter.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/requirement_tracer.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/retrospective.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/review_checkers.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/risk_register.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/role_matcher.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/role_skill_loader.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/role_specific_mock_backend.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/rule_collector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/scratchpad.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/scratchpad_history_store.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/secret_patterns.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/severity_router.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/similar_task_recommender.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skill_extractor.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skill_provider_builtin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skill_provider_mcp.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skill_storage.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skillifier.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/standardized_role_template.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/task_completion_checker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/task_scale_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/tech_debt_manager.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/test_quality_guard.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/todo_drift_monitor.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/two_stage_review_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_accessibility_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_framework.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_framework_base.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_heuristic_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_journey_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_mixins.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_persona_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/unified_gate_engine.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/usage_tracker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/user_friendly_error.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/verification_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/viewpoint_registry.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/warmup_manager.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/worker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_base.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_lifecycle_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_mixins.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_persistence_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_state_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_transition_mixin.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/yagni_checker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collect_baseline.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collect_trae_traces.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/app.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/auth_views.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/components.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/dag_views.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/dispatch_views.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/i18n.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/lifecycle_views.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/metrics_views.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/state.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/v43_panels.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/generate_benchmark_report.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/generate_quality_decision_report.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/mcp_server.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/perf_baseline.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/deterministic_rule_engine.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/models.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/taste_dials.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/uiux_analyzer.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/uiux_subitems.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/visual_regression.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/scan_pickle_payloads.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/sync_skill_pack.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/utils/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/utils/_find_missing_hints.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/scripts/verify_prometheus_e2e.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/setup.cfg +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/_version.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/dispatch/handler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/intent/handler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/prototype/handler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/registry.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/retrospective/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/retrospective/handler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/review/handler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/security/handler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/teach/handler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/test/__init__.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/skills/test/handler.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_4pt_grid.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_adaptive_role_selector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_adversarial_verify.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_agent_briefing.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_anchor_retrospective.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_anti_rationalization.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_antipattern_bans.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_api_budget_status_endpoint.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_api_security.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_api_server_v362.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_approval_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_artifact_effect_binding.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_artifact_store.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_async_coordinator.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_async_modules.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_audit_logger.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_auth_phase5.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_autonomous.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_backend_config.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_benchmark_ponytail_smart.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cache_interface.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_ccr_store.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_async_coverage.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_bandit.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_config_consistency.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_constructor_params.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_dependency_lock.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_dispatcher_size.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_hidden_content.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_test_pyramid.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_test_quality.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_version_consistency.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_ci_feedback_adapter.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_audit.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_command_classifier.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_deep_v362.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_doctor.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_lifecycle.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_metrics.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_phase5.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_code_knowledge_graph.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_claw_integration_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_context_compressor_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_core_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_dispatcher_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_dispatcher_ux_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_e2e_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_enhanced_e2e_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_llm_cache_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_llm_retry_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_mce_adapter_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_memory_bridge_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_performance_monitor_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_permission_guard_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_prompt_optimization_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_role_mapping_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_skillifier_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_test_quality_guard.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_test_quality_guard_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_upstream_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_warmup_manager_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_confidence_score.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_config_injection.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_consensus_dissent.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_consensus_fatigue.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_consensus_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_content_cache.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_content_crusher.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_coordinator_smart_compression.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dag_views.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dashboard_live_mode.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dashboard_split.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dashboard_ui_e2e.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dashboard_v43_panels.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_data_backup.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_debt_collector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_deep_shallow.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_deletion_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dependency_hallucination_checker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dependency_lock.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_deployment_compliance_checker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_deterministic_rule_engine.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatch_audit.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatch_performance.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatch_rbac.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatch_steps.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatcher_intent_mapper.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatcher_loop_controller.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatcher_mixins.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatcher_phase5_core.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatcher_transaction.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_docker_deployment.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dual_layer_context.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_effect_registry.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_enhanced_worker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_fallback_fuse.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_feedback_control_loop.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_five_axis_consensus.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_flow_standalone.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_full_lifecycle_adapter.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_git_guardrails.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_gitlab_connector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_glossary_loader.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_grilling_mode.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_handoff_redaction.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_history_manager_v362.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_host_bridge_unit.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_host_llm_bridge_v2.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_input_validator_phase5.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_input_validator_sensitive.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_intent_workflow_mapper.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_judge_agent.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_learned_rule_phase4.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_lifecycle_protocol.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_llm_auto_fallback.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_llm_backend_resolve.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_llm_cache_protocol.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_loop_engineering.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_loop_engineering_rollback.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_mcp_server_v362.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_memory_benchmarks.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_meta_skill_layering.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_micro_task_planner.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_moka_backend.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_multi_host_adapter.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_multi_tenant.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_multi_tenant_isolation_e2e.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_no_op_test.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_node_type_separation.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_null_providers.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_oklch_color.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_operation_classifier.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_order_chain_detector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_output_slicer.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_output_validator_prompt_injection.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_perf_baseline.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_perf_baseline_ci_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_performance_benchmarks.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_performance_fingerprint.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_performance_monitor_protocol.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_permission_guard_human_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_permission_guard_phase5.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_phase4_ghost_feature_defense.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_pipeline_step19_20.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_plan_c_unified_architecture.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_plugins_hot_loader.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_ponytail_rule_injector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_production_features.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_prometheus_metrics.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_prompt_dials.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_protocols.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_prototype_skill.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_qa_uiux_visual_regression.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_quick_bonus.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_rate_limit.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_rbac_engine.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_rbac_fail_closed.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_red_capable_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_redesign_auditor.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_redis_cache.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_requirement_tracer.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_retry_jitter_strategies.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_role_skill_loader.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_rule_collector.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_rule_injection_security.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_secret_patterns.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_severity_router.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_similar_task_recommender.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_skill_registry_coverage.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_skill_security.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_sleep_guard.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_standardized_role_template.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_start_script.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_step_node_types.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_suggested_next_steps.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_task_completion_checker.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_task_scale_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_taste_dials.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_tautological_seams.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_teach_skill.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_tech_debt_manager.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_todo_drift_monitor.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_token_budget_compressed_scratchpad.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_triage_label.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_two_stage_review_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_ue_test_framework.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_uiux_subitems.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_usage_tracker_coverage.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_v39_e2e.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_v39_performance.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_v411_security_hardening.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_verification_gate.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_version.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_vertical_slice.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_worker_artifact_integration.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_engine.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_engine_base.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_engine_lifecycle.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_engine_state.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_engine_transition.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_persistence_coverage.py +0 -0
- {devsquad-4.5.17 → devsquad-4.5.18}/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.18
|
|
4
4
|
Summary: Production-Ready Multi-Role AI Task Orchestrator
|
|
5
5
|
Author-email: DevSquad Team <devsquad@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -106,7 +106,7 @@ Dynamic: license-file
|
|
|
106
106
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.10+-blue?logo=python&logoColor=white" />
|
|
107
107
|
<img alt="License" src="https://img.shields.io/badge/License-MIT-green" />
|
|
108
108
|
<img alt="Tests" src="https://img.shields.io/badge/Tests-9400%2B%20passing-brightgreen" />
|
|
109
|
-
<img alt="Version" src="https://img.shields.io/badge/V4.5.
|
|
109
|
+
<img alt="Version" src="https://img.shields.io/badge/V4.5.18-success" />
|
|
110
110
|
<img alt="CI" src="https://img.shields.io/badge/CI-GitHub_Actions-blue?logo=githubactions" />
|
|
111
111
|
<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" />
|
|
112
112
|
<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" />
|
|
@@ -638,7 +638,7 @@ devsquad dispatch -t "Design user authentication system"
|
|
|
638
638
|
```bash
|
|
639
639
|
# Check version
|
|
640
640
|
devsquad --version
|
|
641
|
-
# Expected: devsquad 4.5.
|
|
641
|
+
# Expected: devsquad 4.5.18
|
|
642
642
|
|
|
643
643
|
# Run tests
|
|
644
644
|
pytest tests/ -v --tb=short
|
|
@@ -693,7 +693,7 @@ export DEVSQUAD_OPENAI_API_KEY=sk-...
|
|
|
693
693
|
|
|
694
694
|
### Quick Smoke Test (< 30 seconds)
|
|
695
695
|
```bash
|
|
696
|
-
python3 scripts/cli.py --version # Expected: DevSquad 4.5.
|
|
696
|
+
python3 scripts/cli.py --version # Expected: DevSquad 4.5.18
|
|
697
697
|
python3 scripts/cli.py status # Expected: System ready
|
|
698
698
|
python3 scripts/cli.py roles # Expected: 7 core roles listed
|
|
699
699
|
```
|
|
@@ -10,7 +10,7 @@
|
|
|
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-9400%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.18-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" />
|
|
@@ -542,7 +542,7 @@ devsquad dispatch -t "Design user authentication system"
|
|
|
542
542
|
```bash
|
|
543
543
|
# Check version
|
|
544
544
|
devsquad --version
|
|
545
|
-
# Expected: devsquad 4.5.
|
|
545
|
+
# Expected: devsquad 4.5.18
|
|
546
546
|
|
|
547
547
|
# Run tests
|
|
548
548
|
pytest tests/ -v --tb=short
|
|
@@ -597,7 +597,7 @@ export DEVSQUAD_OPENAI_API_KEY=sk-...
|
|
|
597
597
|
|
|
598
598
|
### Quick Smoke Test (< 30 seconds)
|
|
599
599
|
```bash
|
|
600
|
-
python3 scripts/cli.py --version # Expected: DevSquad 4.5.
|
|
600
|
+
python3 scripts/cli.py --version # Expected: DevSquad 4.5.18
|
|
601
601
|
python3 scripts/cli.py status # Expected: System ready
|
|
602
602
|
python3 scripts/cli.py roles # Expected: 7 core roles listed
|
|
603
603
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devsquad
|
|
3
|
-
Version: 4.5.
|
|
3
|
+
Version: 4.5.18
|
|
4
4
|
Summary: Production-Ready Multi-Role AI Task Orchestrator
|
|
5
5
|
Author-email: DevSquad Team <devsquad@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -106,7 +106,7 @@ Dynamic: license-file
|
|
|
106
106
|
<img alt="Python" src="https://img.shields.io/badge/Python-3.10+-blue?logo=python&logoColor=white" />
|
|
107
107
|
<img alt="License" src="https://img.shields.io/badge/License-MIT-green" />
|
|
108
108
|
<img alt="Tests" src="https://img.shields.io/badge/Tests-9400%2B%20passing-brightgreen" />
|
|
109
|
-
<img alt="Version" src="https://img.shields.io/badge/V4.5.
|
|
109
|
+
<img alt="Version" src="https://img.shields.io/badge/V4.5.18-success" />
|
|
110
110
|
<img alt="CI" src="https://img.shields.io/badge/CI-GitHub_Actions-blue?logo=githubactions" />
|
|
111
111
|
<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" />
|
|
112
112
|
<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" />
|
|
@@ -638,7 +638,7 @@ devsquad dispatch -t "Design user authentication system"
|
|
|
638
638
|
```bash
|
|
639
639
|
# Check version
|
|
640
640
|
devsquad --version
|
|
641
|
-
# Expected: devsquad 4.5.
|
|
641
|
+
# Expected: devsquad 4.5.18
|
|
642
642
|
|
|
643
643
|
# Run tests
|
|
644
644
|
pytest tests/ -v --tb=short
|
|
@@ -693,7 +693,7 @@ export DEVSQUAD_OPENAI_API_KEY=sk-...
|
|
|
693
693
|
|
|
694
694
|
### Quick Smoke Test (< 30 seconds)
|
|
695
695
|
```bash
|
|
696
|
-
python3 scripts/cli.py --version # Expected: DevSquad 4.5.
|
|
696
|
+
python3 scripts/cli.py --version # Expected: DevSquad 4.5.18
|
|
697
697
|
python3 scripts/cli.py status # Expected: System ready
|
|
698
698
|
python3 scripts/cli.py roles # Expected: 7 core roles listed
|
|
699
699
|
```
|
|
@@ -66,7 +66,15 @@ class CCRStore:
|
|
|
66
66
|
str(self._db_path),
|
|
67
67
|
check_same_thread=False,
|
|
68
68
|
)
|
|
69
|
+
# V4.5.18: extend the V4.5.17 PRAGMA profile (originally added for
|
|
70
|
+
# code_graph_storage) to CCR's content-cache store. WAL keeps
|
|
71
|
+
# journal append-only, NORMAL defers fsync to checkpoint (still
|
|
72
|
+
# durable on power-loss for committed transactions), and
|
|
73
|
+
# busy_timeout=5000 makes concurrent store/retrieve calls queue
|
|
74
|
+
# instead of raising immediately when the writer holds the lock.
|
|
69
75
|
conn.execute("PRAGMA journal_mode=WAL")
|
|
76
|
+
conn.execute("PRAGMA synchronous=NORMAL")
|
|
77
|
+
conn.execute("PRAGMA busy_timeout=5000")
|
|
70
78
|
return conn
|
|
71
79
|
|
|
72
80
|
def _init_schema(self) -> None:
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import hashlib
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
|
+
import threading
|
|
5
6
|
from collections.abc import Callable
|
|
6
7
|
from dataclasses import dataclass, field
|
|
7
8
|
from datetime import datetime
|
|
@@ -14,6 +15,15 @@ if TYPE_CHECKING:
|
|
|
14
15
|
logger = logging.getLogger(__name__)
|
|
15
16
|
|
|
16
17
|
|
|
18
|
+
# V4.5.18: reentrant lock protecting the in-memory `skills` / `handlers` dicts
|
|
19
|
+
# and the `_save` iteration. Without it, concurrent register()/unregister()
|
|
20
|
+
# callers can race on `for s in self.skills.values()` inside `_save`,
|
|
21
|
+
# raising `RuntimeError: dictionary changed size during iteration` and
|
|
22
|
+
# causing the integration test
|
|
23
|
+
# `tests/integration/test_skill_registry_integration.py::test_06_concurrent_register_is_thread_safe`
|
|
24
|
+
# to fail intermittently on fast CI runners.
|
|
25
|
+
|
|
26
|
+
|
|
17
27
|
@dataclass
|
|
18
28
|
class SkillEntry:
|
|
19
29
|
skill_id: str = field(
|
|
@@ -89,6 +99,8 @@ class SkillRegistry:
|
|
|
89
99
|
self.storage_path.mkdir(parents=True, exist_ok=True)
|
|
90
100
|
self.skills: dict[str, SkillEntry] = {}
|
|
91
101
|
self.handlers: dict[str, Callable] = {}
|
|
102
|
+
# V4.5.18: reentrant lock guarding skills/handlers mutation + _save iteration.
|
|
103
|
+
self._lock = threading.RLock()
|
|
92
104
|
self._load()
|
|
93
105
|
# V4.5.0: protocol-native skill provider. Default = BuiltinSkillProvider,
|
|
94
106
|
# which wraps the existing import-based registry (100% backward compatible).
|
|
@@ -154,10 +166,11 @@ class SkillRegistry:
|
|
|
154
166
|
"""
|
|
155
167
|
if ".." in skill.skill_id or "/" in skill.skill_id or "\\" in skill.skill_id:
|
|
156
168
|
raise ValueError(f"Invalid skill_id: {skill.skill_id}")
|
|
157
|
-
self.
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
169
|
+
with self._lock:
|
|
170
|
+
self.skills[skill.skill_id] = skill
|
|
171
|
+
if handler:
|
|
172
|
+
self.handlers[skill.skill_id] = handler
|
|
173
|
+
self._save()
|
|
161
174
|
logger.info("Skill registered: %s (%s)", skill.name, skill.skill_id)
|
|
162
175
|
return skill.skill_id
|
|
163
176
|
|
|
@@ -170,12 +183,13 @@ class SkillRegistry:
|
|
|
170
183
|
Returns:
|
|
171
184
|
True when the skill existed and was removed, False otherwise.
|
|
172
185
|
"""
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
186
|
+
with self._lock:
|
|
187
|
+
if skill_id in self.skills:
|
|
188
|
+
del self.skills[skill_id]
|
|
189
|
+
self.handlers.pop(skill_id, None)
|
|
190
|
+
self._save()
|
|
191
|
+
return True
|
|
192
|
+
return False
|
|
179
193
|
|
|
180
194
|
def get(self, skill_id: str) -> SkillEntry | None:
|
|
181
195
|
"""Retrieve a skill entry by id.
|
|
@@ -186,7 +200,8 @@ class SkillRegistry:
|
|
|
186
200
|
Returns:
|
|
187
201
|
The matching SkillEntry, or None when not found.
|
|
188
202
|
"""
|
|
189
|
-
|
|
203
|
+
with self._lock:
|
|
204
|
+
return self.skills.get(skill_id)
|
|
190
205
|
|
|
191
206
|
def execute(self, skill_id: str, **kwargs: Any) -> Any:
|
|
192
207
|
"""Execute a registered skill by id.
|
|
@@ -201,17 +216,18 @@ class SkillRegistry:
|
|
|
201
216
|
Raises:
|
|
202
217
|
ValueError: When the skill or its handler is not found.
|
|
203
218
|
"""
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
219
|
+
with self._lock:
|
|
220
|
+
skill = self.skills.get(skill_id)
|
|
221
|
+
if not skill:
|
|
222
|
+
raise ValueError(f"Skill not found: {skill_id}")
|
|
207
223
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
224
|
+
handler = self.handlers.get(skill_id)
|
|
225
|
+
if not handler:
|
|
226
|
+
raise ValueError(f"No handler for skill: {skill_id}")
|
|
211
227
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
228
|
+
skill.usage_count += 1
|
|
229
|
+
skill.last_used = datetime.now().isoformat()
|
|
230
|
+
self._save()
|
|
215
231
|
|
|
216
232
|
return handler(**kwargs)
|
|
217
233
|
|
|
@@ -227,16 +243,17 @@ class SkillRegistry:
|
|
|
227
243
|
Returns:
|
|
228
244
|
List of matching SkillEntry objects sorted by confidence desc.
|
|
229
245
|
"""
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
246
|
+
with self._lock:
|
|
247
|
+
results = list(self.skills.values())
|
|
248
|
+
if category:
|
|
249
|
+
results = [s for s in results if s.category == category]
|
|
250
|
+
if tags:
|
|
251
|
+
results = [s for s in results if any(t in s.tags for t in tags)]
|
|
252
|
+
if query:
|
|
253
|
+
q = query.lower()
|
|
254
|
+
results = [s for s in results if q in s.name.lower() or q in s.description.lower()]
|
|
255
|
+
results.sort(key=lambda s: s.confidence, reverse=True)
|
|
256
|
+
return results
|
|
240
257
|
|
|
241
258
|
def propose_from_result(
|
|
242
259
|
self, name: str, description: str, category: str = "", confidence: float = 0.0, tags: list[str] | None = None
|
|
@@ -272,10 +289,11 @@ class SkillRegistry:
|
|
|
272
289
|
Returns:
|
|
273
290
|
List of skill dictionaries produced by :meth:`SkillEntry.to_dict`.
|
|
274
291
|
"""
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
292
|
+
with self._lock:
|
|
293
|
+
skills = list(self.skills.values())
|
|
294
|
+
if category:
|
|
295
|
+
skills = [s for s in skills if s.category == category]
|
|
296
|
+
return [s.to_dict() for s in skills]
|
|
279
297
|
|
|
280
298
|
def get_stats(self) -> dict[str, Any]:
|
|
281
299
|
"""Return summary statistics for the registry.
|
|
@@ -284,14 +302,15 @@ class SkillRegistry:
|
|
|
284
302
|
Dictionary with total skill count, per-category counts, and
|
|
285
303
|
the number of skills with registered handlers.
|
|
286
304
|
"""
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
305
|
+
with self._lock:
|
|
306
|
+
categories: dict[str, int] = {}
|
|
307
|
+
for s in self.skills.values():
|
|
308
|
+
categories[s.category] = categories.get(s.category, 0) + 1
|
|
309
|
+
return {
|
|
310
|
+
"total_skills": len(self.skills),
|
|
311
|
+
"categories": categories,
|
|
312
|
+
"with_handlers": len(self.handlers),
|
|
313
|
+
}
|
|
295
314
|
|
|
296
315
|
def _load(self) -> None:
|
|
297
316
|
registry_file = self.storage_path / "registry.json"
|
|
@@ -308,7 +327,8 @@ class SkillRegistry:
|
|
|
308
327
|
def _save(self) -> None:
|
|
309
328
|
registry_file = self.storage_path / "registry.json"
|
|
310
329
|
try:
|
|
311
|
-
|
|
330
|
+
with self._lock:
|
|
331
|
+
data = {"skills": [s.to_dict() for s in self.skills.values()]}
|
|
312
332
|
with open(registry_file, "w", encoding="utf-8") as f:
|
|
313
333
|
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
314
334
|
except (OSError, TypeError, ValueError) as e:
|
|
@@ -79,7 +79,16 @@ class HistoryManager:
|
|
|
79
79
|
"""Get database connection with row factory."""
|
|
80
80
|
conn = sqlite3.connect(self.db_path, check_same_thread=False)
|
|
81
81
|
conn.row_factory = sqlite3.Row
|
|
82
|
-
|
|
82
|
+
# V4.5.18: mirror the V4.5.17 code_graph_storage PRAGMA profile.
|
|
83
|
+
# Default SQLite uses journal=DELETE + full fsync which is ~10x
|
|
84
|
+
# slower per commit and starves the perf gate on cold CI runners
|
|
85
|
+
# when history_manager is forced to record many snapshots in a
|
|
86
|
+
# single test. WAL keeps journal append-only, NORMAL defers fsync
|
|
87
|
+
# to checkpoint boundary, busy_timeout makes concurrent writers
|
|
88
|
+
# wait instead of failing-fast under the 60s pytest-timeout.
|
|
89
|
+
conn.execute("PRAGMA journal_mode=WAL")
|
|
90
|
+
conn.execute("PRAGMA synchronous=NORMAL")
|
|
91
|
+
conn.execute("PRAGMA busy_timeout=5000")
|
|
83
92
|
conn.execute("PRAGMA foreign_keys=ON")
|
|
84
93
|
return conn
|
|
85
94
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dependency_hallucination_checker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|