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.
Files changed (524) hide show
  1. {devsquad-4.5.17 → devsquad-4.5.18}/PKG-INFO +4 -4
  2. {devsquad-4.5.17 → devsquad-4.5.18}/README.md +3 -3
  3. {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/PKG-INFO +4 -4
  4. {devsquad-4.5.17 → devsquad-4.5.18}/pyproject.toml +1 -1
  5. devsquad-4.5.18/scripts/collaboration/_version.py +2 -0
  6. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ccr_store.py +8 -0
  7. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skill_registry.py +63 -43
  8. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/history_manager.py +10 -1
  9. {devsquad-4.5.17 → devsquad-4.5.18}/skills/__init__.py +1 -1
  10. devsquad-4.5.17/scripts/collaboration/_version.py +0 -2
  11. {devsquad-4.5.17 → devsquad-4.5.18}/LICENSE +0 -0
  12. {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/SOURCES.txt +0 -0
  13. {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/dependency_links.txt +0 -0
  14. {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/entry_points.txt +0 -0
  15. {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/requires.txt +0 -0
  16. {devsquad-4.5.17 → devsquad-4.5.18}/devsquad.egg-info/top_level.txt +0 -0
  17. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/__init__.py +0 -0
  18. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/__init__.py +0 -0
  19. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/models.py +0 -0
  20. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/rate_limit.py +0 -0
  21. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/routes/__init__.py +0 -0
  22. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/routes/dispatch.py +0 -0
  23. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/routes/lifecycle.py +0 -0
  24. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/routes/metrics.py +0 -0
  25. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/routes/metrics_gates.py +0 -0
  26. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api/security.py +0 -0
  27. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/api_server.py +0 -0
  28. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/auth.py +0 -0
  29. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/benchmark_async_dispatch.py +0 -0
  30. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/benchmark_ponytail_smart.py +0 -0
  31. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/benchmark_real_llm.py +0 -0
  32. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_async_coverage.py +0 -0
  33. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_bandit.py +0 -0
  34. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_config_consistency.py +0 -0
  35. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_constructor_params.py +0 -0
  36. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_dependency_lock.py +0 -0
  37. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_dependency_sync.py +0 -0
  38. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_dispatcher_size.py +0 -0
  39. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_doc_consistency.py +0 -0
  40. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_hidden_content.py +0 -0
  41. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_module_activation.py +0 -0
  42. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_test_pyramid.py +0 -0
  43. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_test_quality.py +0 -0
  44. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/check_version_consistency.py +0 -0
  45. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli/__init__.py +0 -0
  46. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli/cli_visual.py +0 -0
  47. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli.py +0 -0
  48. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_audit.py +0 -0
  49. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_backend.py +0 -0
  50. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_dispatch.py +0 -0
  51. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_doctor.py +0 -0
  52. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_lifecycle.py +0 -0
  53. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_metrics.py +0 -0
  54. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_modules.py +0 -0
  55. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_risks.py +0 -0
  56. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_sessions.py +0 -0
  57. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/cli_utils.py +0 -0
  58. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/__init__.py +0 -0
  59. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/adaptive_role_selector.py +0 -0
  60. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/adversarial_verify.py +0 -0
  61. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/agent_briefing.py +0 -0
  62. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/agent_identity.py +0 -0
  63. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ai_semantic_matcher.py +0 -0
  64. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/anchor_checker.py +0 -0
  65. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/anti_rationalization.py +0 -0
  66. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/approval_gate.py +0 -0
  67. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/artifact_store.py +0 -0
  68. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/async_adapter.py +0 -0
  69. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/async_coeffect_resolver.py +0 -0
  70. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/async_coordinator.py +0 -0
  71. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/async_llm_backend.py +0 -0
  72. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/audit_logger.py +0 -0
  73. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/__init__.py +0 -0
  74. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/git_driver.py +0 -0
  75. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/loop_controller.py +0 -0
  76. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/notes_memory.py +0 -0
  77. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/run_state.py +0 -0
  78. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/sleep_guard.py +0 -0
  79. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/autonomous/smart_confirmation.py +0 -0
  80. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/backend_config.py +0 -0
  81. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/backend_paths.py +0 -0
  82. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/batch_scheduler.py +0 -0
  83. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/benchmark_regression_checker.py +0 -0
  84. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/cache_interface.py +0 -0
  85. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/checkpoint_manager.py +0 -0
  86. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ci_feedback_adapter.py +0 -0
  87. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/cli_command_classifier.py +0 -0
  88. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/code_graph_query.py +0 -0
  89. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/code_graph_storage.py +0 -0
  90. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/code_knowledge_graph.py +0 -0
  91. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/code_map_generator.py +0 -0
  92. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/coeffect.py +0 -0
  93. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/concern_pack_loader.py +0 -0
  94. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/confidence_score.py +0 -0
  95. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/config_manager.py +0 -0
  96. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/connector_framework.py +0 -0
  97. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/consensus.py +0 -0
  98. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/consensus_gate.py +0 -0
  99. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/constants.py +0 -0
  100. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/content_cache.py +0 -0
  101. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/content_crusher.py +0 -0
  102. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/context_compressor.py +0 -0
  103. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/coordinator.py +0 -0
  104. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dashboard_live_mode.py +0 -0
  105. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/debt_collector.py +0 -0
  106. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dependency_hallucination_checker.py +0 -0
  107. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/deployment_compliance_checker.py +0 -0
  108. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_audit.py +0 -0
  109. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_component_factory.py +0 -0
  110. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_effect.py +0 -0
  111. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_hooks.py +0 -0
  112. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_lifecycle.py +0 -0
  113. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_models.py +0 -0
  114. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_performance.py +0 -0
  115. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_pre_steps.py +0 -0
  116. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_rbac.py +0 -0
  117. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_result_assembler.py +0 -0
  118. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_services.py +0 -0
  119. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps.py +0 -0
  120. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_base.py +0 -0
  121. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_consensus_mixin.py +0 -0
  122. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_feedback_mixin.py +0 -0
  123. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_mixins.py +0 -0
  124. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_quality_mixin.py +0 -0
  125. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatch_steps_services_mixin.py +0 -0
  126. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher.py +0 -0
  127. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_async_mixin.py +0 -0
  128. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_audit_mixin.py +0 -0
  129. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_base.py +0 -0
  130. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_config.py +0 -0
  131. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_error_mixin.py +0 -0
  132. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_factory.py +0 -0
  133. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_intent_mapper.py +0 -0
  134. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_lifecycle_mixin.py +0 -0
  135. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_loop_controller.py +0 -0
  136. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_mixins.py +0 -0
  137. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_status_mixin.py +0 -0
  138. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_transaction.py +0 -0
  139. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dispatcher_utils_mixin.py +0 -0
  140. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dora_metrics_collector.py +0 -0
  141. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/dual_layer_context.py +0 -0
  142. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/effect_registry.py +0 -0
  143. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/enhanced_worker.py +0 -0
  144. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/enterprise_feature.py +0 -0
  145. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/error_budget_tracker.py +0 -0
  146. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/event_bus.py +0 -0
  147. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/execution_guard.py +0 -0
  148. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/feature_usage_tracker.py +0 -0
  149. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/feedback_control_loop.py +0 -0
  150. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/file_bundler.py +0 -0
  151. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/file_risk_store.py +0 -0
  152. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/five_axis_consensus.py +0 -0
  153. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/gap_analyzer.py +0 -0
  154. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/gather_core.py +0 -0
  155. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/gitlab_connector.py +0 -0
  156. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/host_llm_bridge.py +0 -0
  157. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/host_llm_bridge_v2.py +0 -0
  158. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/input_validator.py +0 -0
  159. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/intent_workflow_mapper.py +0 -0
  160. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/judge_agent.py +0 -0
  161. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/language_parsers.py +0 -0
  162. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/learned_rule_store.py +0 -0
  163. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/lifecycle_gate.py +0 -0
  164. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/lifecycle_protocol.py +0 -0
  165. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/lifecycle_shortcut_adapter.py +0 -0
  166. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/lifecycle_shortcut_helpers.py +0 -0
  167. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/lifecycle_templates.py +0 -0
  168. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_backend.py +0 -0
  169. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_cache.py +0 -0
  170. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_cache_async.py +0 -0
  171. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_cache_base.py +0 -0
  172. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_retry.py +0 -0
  173. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_retry_async.py +0 -0
  174. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/llm_retry_base.py +0 -0
  175. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/__init__.py +0 -0
  176. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/discovery_probe.py +0 -0
  177. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/handoff_adapter.py +0 -0
  178. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/independent_evaluator.py +0 -0
  179. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/kernel.py +0 -0
  180. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/loop_scheduler.py +0 -0
  181. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/models.py +0 -0
  182. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/protocols.py +0 -0
  183. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/rollback_strategy.py +0 -0
  184. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/loop_engineering/unified_memory.py +0 -0
  185. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/mce_adapter.py +0 -0
  186. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_bridge.py +0 -0
  187. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_claw_source.py +0 -0
  188. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_forgetting.py +0 -0
  189. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_index.py +0 -0
  190. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_query.py +0 -0
  191. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_serializer.py +0 -0
  192. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/memory_types.py +0 -0
  193. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/meta_skill_layering.py +0 -0
  194. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/micro_task_planner.py +0 -0
  195. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/models.py +0 -0
  196. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/models_base.py +0 -0
  197. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/models_dispatch.py +0 -0
  198. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/models_lifecycle.py +0 -0
  199. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/module_fiber.py +0 -0
  200. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/moka_backend.py +0 -0
  201. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/multi_host_adapter.py +0 -0
  202. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/multi_level_cache.py +0 -0
  203. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/multi_tenant.py +0 -0
  204. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/null_providers.py +0 -0
  205. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/operation_classifier.py +0 -0
  206. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/order_chain_detector.py +0 -0
  207. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/output_slicer.py +0 -0
  208. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/output_validator.py +0 -0
  209. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/perf_baseline.py +0 -0
  210. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/performance_fingerprint.py +0 -0
  211. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/performance_monitor.py +0 -0
  212. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/permission_guard.py +0 -0
  213. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/plugins/__init__.py +0 -0
  214. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/plugins/hot_loader.py +0 -0
  215. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ponytail_rule_injector.py +0 -0
  216. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prometheus_metrics.py +0 -0
  217. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler.py +0 -0
  218. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_base.py +0 -0
  219. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_formatting_mixin.py +0 -0
  220. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_mixins.py +0 -0
  221. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_substitution_mixin.py +0 -0
  222. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_template_mixin.py +0 -0
  223. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_assembler_validation_mixin.py +0 -0
  224. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/prompt_dials.py +0 -0
  225. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/protocols.py +0 -0
  226. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/quality_calibration_gate.py +0 -0
  227. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/quality_probe_slice.py +0 -0
  228. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/rbac_engine.py +0 -0
  229. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/redesign_auditor.py +0 -0
  230. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/redesign_checkers.py +0 -0
  231. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/redis_cache.py +0 -0
  232. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/report_formatter.py +0 -0
  233. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/requirement_tracer.py +0 -0
  234. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/retrospective.py +0 -0
  235. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/review_checkers.py +0 -0
  236. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/risk_register.py +0 -0
  237. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/role_matcher.py +0 -0
  238. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/role_skill_loader.py +0 -0
  239. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/role_specific_mock_backend.py +0 -0
  240. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/rule_collector.py +0 -0
  241. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/scratchpad.py +0 -0
  242. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/scratchpad_history_store.py +0 -0
  243. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/secret_patterns.py +0 -0
  244. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/severity_router.py +0 -0
  245. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/similar_task_recommender.py +0 -0
  246. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skill_extractor.py +0 -0
  247. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skill_provider_builtin.py +0 -0
  248. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skill_provider_mcp.py +0 -0
  249. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skill_storage.py +0 -0
  250. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/skillifier.py +0 -0
  251. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/standardized_role_template.py +0 -0
  252. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/task_completion_checker.py +0 -0
  253. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/task_scale_gate.py +0 -0
  254. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/tech_debt_manager.py +0 -0
  255. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/test_quality_guard.py +0 -0
  256. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/todo_drift_monitor.py +0 -0
  257. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/two_stage_review_gate.py +0 -0
  258. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_accessibility_mixin.py +0 -0
  259. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_framework.py +0 -0
  260. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_framework_base.py +0 -0
  261. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_heuristic_mixin.py +0 -0
  262. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_journey_mixin.py +0 -0
  263. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_mixins.py +0 -0
  264. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/ue_test_persona_mixin.py +0 -0
  265. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/unified_gate_engine.py +0 -0
  266. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/usage_tracker.py +0 -0
  267. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/user_friendly_error.py +0 -0
  268. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/verification_gate.py +0 -0
  269. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/viewpoint_registry.py +0 -0
  270. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/warmup_manager.py +0 -0
  271. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/worker.py +0 -0
  272. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine.py +0 -0
  273. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_base.py +0 -0
  274. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_lifecycle_mixin.py +0 -0
  275. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_mixins.py +0 -0
  276. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_persistence_mixin.py +0 -0
  277. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_state_mixin.py +0 -0
  278. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/workflow_engine_transition_mixin.py +0 -0
  279. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collaboration/yagni_checker.py +0 -0
  280. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collect_baseline.py +0 -0
  281. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/collect_trae_traces.py +0 -0
  282. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/__init__.py +0 -0
  283. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/app.py +0 -0
  284. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/auth_views.py +0 -0
  285. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/components.py +0 -0
  286. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/dag_views.py +0 -0
  287. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/dispatch_views.py +0 -0
  288. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/i18n.py +0 -0
  289. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/lifecycle_views.py +0 -0
  290. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/metrics_views.py +0 -0
  291. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/state.py +0 -0
  292. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard/v43_panels.py +0 -0
  293. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/dashboard.py +0 -0
  294. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/generate_benchmark_report.py +0 -0
  295. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/generate_quality_decision_report.py +0 -0
  296. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/mcp_server.py +0 -0
  297. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/perf_baseline.py +0 -0
  298. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/__init__.py +0 -0
  299. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/deterministic_rule_engine.py +0 -0
  300. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/models.py +0 -0
  301. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/taste_dials.py +0 -0
  302. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/uiux_analyzer.py +0 -0
  303. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/uiux_subitems.py +0 -0
  304. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/qa/visual_regression.py +0 -0
  305. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/scan_pickle_payloads.py +0 -0
  306. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/sync_skill_pack.py +0 -0
  307. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/utils/__init__.py +0 -0
  308. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/utils/_find_missing_hints.py +0 -0
  309. {devsquad-4.5.17 → devsquad-4.5.18}/scripts/verify_prometheus_e2e.py +0 -0
  310. {devsquad-4.5.17 → devsquad-4.5.18}/setup.cfg +0 -0
  311. {devsquad-4.5.17 → devsquad-4.5.18}/skills/_version.py +0 -0
  312. {devsquad-4.5.17 → devsquad-4.5.18}/skills/dispatch/handler.py +0 -0
  313. {devsquad-4.5.17 → devsquad-4.5.18}/skills/intent/handler.py +0 -0
  314. {devsquad-4.5.17 → devsquad-4.5.18}/skills/prototype/handler.py +0 -0
  315. {devsquad-4.5.17 → devsquad-4.5.18}/skills/registry.py +0 -0
  316. {devsquad-4.5.17 → devsquad-4.5.18}/skills/retrospective/__init__.py +0 -0
  317. {devsquad-4.5.17 → devsquad-4.5.18}/skills/retrospective/handler.py +0 -0
  318. {devsquad-4.5.17 → devsquad-4.5.18}/skills/review/handler.py +0 -0
  319. {devsquad-4.5.17 → devsquad-4.5.18}/skills/security/handler.py +0 -0
  320. {devsquad-4.5.17 → devsquad-4.5.18}/skills/teach/handler.py +0 -0
  321. {devsquad-4.5.17 → devsquad-4.5.18}/skills/test/__init__.py +0 -0
  322. {devsquad-4.5.17 → devsquad-4.5.18}/skills/test/handler.py +0 -0
  323. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_4pt_grid.py +0 -0
  324. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_adaptive_role_selector.py +0 -0
  325. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_adversarial_verify.py +0 -0
  326. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_agent_briefing.py +0 -0
  327. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_anchor_retrospective.py +0 -0
  328. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_anti_rationalization.py +0 -0
  329. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_antipattern_bans.py +0 -0
  330. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_api_budget_status_endpoint.py +0 -0
  331. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_api_security.py +0 -0
  332. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_api_server_v362.py +0 -0
  333. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_approval_gate.py +0 -0
  334. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_artifact_effect_binding.py +0 -0
  335. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_artifact_store.py +0 -0
  336. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_async_coordinator.py +0 -0
  337. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_async_modules.py +0 -0
  338. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_audit_logger.py +0 -0
  339. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_auth_phase5.py +0 -0
  340. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_autonomous.py +0 -0
  341. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_backend_config.py +0 -0
  342. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_benchmark_ponytail_smart.py +0 -0
  343. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cache_interface.py +0 -0
  344. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_ccr_store.py +0 -0
  345. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_async_coverage.py +0 -0
  346. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_bandit.py +0 -0
  347. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_config_consistency.py +0 -0
  348. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_constructor_params.py +0 -0
  349. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_dependency_lock.py +0 -0
  350. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_dispatcher_size.py +0 -0
  351. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_hidden_content.py +0 -0
  352. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_test_pyramid.py +0 -0
  353. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_test_quality.py +0 -0
  354. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_check_version_consistency.py +0 -0
  355. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_ci_feedback_adapter.py +0 -0
  356. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_audit.py +0 -0
  357. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_command_classifier.py +0 -0
  358. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_deep_v362.py +0 -0
  359. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_doctor.py +0 -0
  360. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_lifecycle.py +0 -0
  361. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_metrics.py +0 -0
  362. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_cli_phase5.py +0 -0
  363. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_code_knowledge_graph.py +0 -0
  364. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_claw_integration_test.py +0 -0
  365. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_context_compressor_test.py +0 -0
  366. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_core_test.py +0 -0
  367. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_dispatcher_test.py +0 -0
  368. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_dispatcher_ux_test.py +0 -0
  369. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_e2e_test.py +0 -0
  370. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_enhanced_e2e_test.py +0 -0
  371. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_llm_cache_test.py +0 -0
  372. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_llm_retry_test.py +0 -0
  373. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_mce_adapter_test.py +0 -0
  374. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_memory_bridge_test.py +0 -0
  375. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_performance_monitor_test.py +0 -0
  376. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_permission_guard_test.py +0 -0
  377. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_prompt_optimization_test.py +0 -0
  378. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_role_mapping_test.py +0 -0
  379. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_skillifier_test.py +0 -0
  380. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_test_quality_guard.py +0 -0
  381. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_test_quality_guard_test.py +0 -0
  382. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_upstream_test.py +0 -0
  383. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_collaboration_warmup_manager_test.py +0 -0
  384. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_confidence_score.py +0 -0
  385. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_config_injection.py +0 -0
  386. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_consensus_dissent.py +0 -0
  387. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_consensus_fatigue.py +0 -0
  388. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_consensus_gate.py +0 -0
  389. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_content_cache.py +0 -0
  390. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_content_crusher.py +0 -0
  391. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_coordinator_smart_compression.py +0 -0
  392. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dag_views.py +0 -0
  393. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dashboard_live_mode.py +0 -0
  394. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dashboard_split.py +0 -0
  395. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dashboard_ui_e2e.py +0 -0
  396. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dashboard_v43_panels.py +0 -0
  397. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_data_backup.py +0 -0
  398. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_debt_collector.py +0 -0
  399. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_deep_shallow.py +0 -0
  400. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_deletion_test.py +0 -0
  401. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dependency_hallucination_checker.py +0 -0
  402. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dependency_lock.py +0 -0
  403. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_deployment_compliance_checker.py +0 -0
  404. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_deterministic_rule_engine.py +0 -0
  405. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatch_audit.py +0 -0
  406. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatch_performance.py +0 -0
  407. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatch_rbac.py +0 -0
  408. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatch_steps.py +0 -0
  409. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatcher_intent_mapper.py +0 -0
  410. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatcher_loop_controller.py +0 -0
  411. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatcher_mixins.py +0 -0
  412. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatcher_phase5_core.py +0 -0
  413. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dispatcher_transaction.py +0 -0
  414. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_docker_deployment.py +0 -0
  415. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_dual_layer_context.py +0 -0
  416. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_effect_registry.py +0 -0
  417. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_enhanced_worker.py +0 -0
  418. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_fallback_fuse.py +0 -0
  419. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_feedback_control_loop.py +0 -0
  420. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_five_axis_consensus.py +0 -0
  421. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_flow_standalone.py +0 -0
  422. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_full_lifecycle_adapter.py +0 -0
  423. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_git_guardrails.py +0 -0
  424. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_gitlab_connector.py +0 -0
  425. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_glossary_loader.py +0 -0
  426. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_grilling_mode.py +0 -0
  427. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_handoff_redaction.py +0 -0
  428. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_history_manager_v362.py +0 -0
  429. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_host_bridge_unit.py +0 -0
  430. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_host_llm_bridge_v2.py +0 -0
  431. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_input_validator_phase5.py +0 -0
  432. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_input_validator_sensitive.py +0 -0
  433. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_intent_workflow_mapper.py +0 -0
  434. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_judge_agent.py +0 -0
  435. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_learned_rule_phase4.py +0 -0
  436. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_lifecycle_protocol.py +0 -0
  437. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_llm_auto_fallback.py +0 -0
  438. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_llm_backend_resolve.py +0 -0
  439. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_llm_cache_protocol.py +0 -0
  440. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_loop_engineering.py +0 -0
  441. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_loop_engineering_rollback.py +0 -0
  442. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_mcp_server_v362.py +0 -0
  443. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_memory_benchmarks.py +0 -0
  444. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_meta_skill_layering.py +0 -0
  445. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_micro_task_planner.py +0 -0
  446. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_moka_backend.py +0 -0
  447. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_multi_host_adapter.py +0 -0
  448. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_multi_tenant.py +0 -0
  449. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_multi_tenant_isolation_e2e.py +0 -0
  450. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_no_op_test.py +0 -0
  451. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_node_type_separation.py +0 -0
  452. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_null_providers.py +0 -0
  453. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_oklch_color.py +0 -0
  454. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_operation_classifier.py +0 -0
  455. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_order_chain_detector.py +0 -0
  456. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_output_slicer.py +0 -0
  457. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_output_validator_prompt_injection.py +0 -0
  458. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_perf_baseline.py +0 -0
  459. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_perf_baseline_ci_gate.py +0 -0
  460. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_performance_benchmarks.py +0 -0
  461. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_performance_fingerprint.py +0 -0
  462. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_performance_monitor_protocol.py +0 -0
  463. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_permission_guard_human_gate.py +0 -0
  464. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_permission_guard_phase5.py +0 -0
  465. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_phase4_ghost_feature_defense.py +0 -0
  466. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_pipeline_step19_20.py +0 -0
  467. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_plan_c_unified_architecture.py +0 -0
  468. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_plugins_hot_loader.py +0 -0
  469. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_ponytail_rule_injector.py +0 -0
  470. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_production_features.py +0 -0
  471. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_prometheus_metrics.py +0 -0
  472. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_prompt_dials.py +0 -0
  473. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_protocols.py +0 -0
  474. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_prototype_skill.py +0 -0
  475. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_qa_uiux_visual_regression.py +0 -0
  476. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_quick_bonus.py +0 -0
  477. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_rate_limit.py +0 -0
  478. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_rbac_engine.py +0 -0
  479. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_rbac_fail_closed.py +0 -0
  480. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_red_capable_gate.py +0 -0
  481. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_redesign_auditor.py +0 -0
  482. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_redis_cache.py +0 -0
  483. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_requirement_tracer.py +0 -0
  484. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_retry_jitter_strategies.py +0 -0
  485. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_role_skill_loader.py +0 -0
  486. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_rule_collector.py +0 -0
  487. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_rule_injection_security.py +0 -0
  488. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_secret_patterns.py +0 -0
  489. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_severity_router.py +0 -0
  490. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_similar_task_recommender.py +0 -0
  491. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_skill_registry_coverage.py +0 -0
  492. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_skill_security.py +0 -0
  493. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_sleep_guard.py +0 -0
  494. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_standardized_role_template.py +0 -0
  495. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_start_script.py +0 -0
  496. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_step_node_types.py +0 -0
  497. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_suggested_next_steps.py +0 -0
  498. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_task_completion_checker.py +0 -0
  499. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_task_scale_gate.py +0 -0
  500. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_taste_dials.py +0 -0
  501. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_tautological_seams.py +0 -0
  502. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_teach_skill.py +0 -0
  503. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_tech_debt_manager.py +0 -0
  504. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_todo_drift_monitor.py +0 -0
  505. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_token_budget_compressed_scratchpad.py +0 -0
  506. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_triage_label.py +0 -0
  507. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_two_stage_review_gate.py +0 -0
  508. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_ue_test_framework.py +0 -0
  509. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_uiux_subitems.py +0 -0
  510. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_usage_tracker_coverage.py +0 -0
  511. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_v39_e2e.py +0 -0
  512. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_v39_performance.py +0 -0
  513. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_v411_security_hardening.py +0 -0
  514. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_verification_gate.py +0 -0
  515. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_version.py +0 -0
  516. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_vertical_slice.py +0 -0
  517. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_worker_artifact_integration.py +0 -0
  518. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_engine.py +0 -0
  519. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_engine_base.py +0 -0
  520. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_engine_lifecycle.py +0 -0
  521. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_engine_state.py +0 -0
  522. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_engine_transition.py +0 -0
  523. {devsquad-4.5.17 → devsquad-4.5.18}/tests/test_workflow_persistence_coverage.py +0 -0
  524. {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.17
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.17-success" />
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.17
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.17
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.17-success" />
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.17
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.17
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.17
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.17-success" />
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.17
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.17
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
  ```
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "devsquad"
7
- version = "4.5.17"
7
+ version = "4.5.18"
8
8
  description = "Production-Ready Multi-Role AI Task Orchestrator"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -0,0 +1,2 @@
1
+ __version__ = "4.5.18"
2
+ __version_info__ = (4, 5, 18)
@@ -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.skills[skill.skill_id] = skill
158
- if handler:
159
- self.handlers[skill.skill_id] = handler
160
- self._save()
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
- if skill_id in self.skills:
174
- del self.skills[skill_id]
175
- self.handlers.pop(skill_id, None)
176
- self._save()
177
- return True
178
- return False
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
- return self.skills.get(skill_id)
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
- skill = self.skills.get(skill_id)
205
- if not skill:
206
- raise ValueError(f"Skill not found: {skill_id}")
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
- handler = self.handlers.get(skill_id)
209
- if not handler:
210
- raise ValueError(f"No handler for skill: {skill_id}")
224
+ handler = self.handlers.get(skill_id)
225
+ if not handler:
226
+ raise ValueError(f"No handler for skill: {skill_id}")
211
227
 
212
- skill.usage_count += 1
213
- skill.last_used = datetime.now().isoformat()
214
- self._save()
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
- results = list(self.skills.values())
231
- if category:
232
- results = [s for s in results if s.category == category]
233
- if tags:
234
- results = [s for s in results if any(t in s.tags for t in tags)]
235
- if query:
236
- q = query.lower()
237
- results = [s for s in results if q in s.name.lower() or q in s.description.lower()]
238
- results.sort(key=lambda s: s.confidence, reverse=True)
239
- return results
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
- skills = list(self.skills.values())
276
- if category:
277
- skills = [s for s in skills if s.category == category]
278
- return [s.to_dict() for s in skills]
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
- categories: dict[str, int] = {}
288
- for s in self.skills.values():
289
- categories[s.category] = categories.get(s.category, 0) + 1
290
- return {
291
- "total_skills": len(self.skills),
292
- "categories": categories,
293
- "with_handlers": len(self.handlers),
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
- data = {"skills": [s.to_dict() for s in self.skills.values()]}
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
- conn.execute("PRAGMA journal_mode=WAL") # Better concurrency
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
 
@@ -1,5 +1,5 @@
1
1
  """
2
- DevSquad V4.5.17 — Layered Sub-Skill Architecture
2
+ DevSquad V4.5.18 — Layered Sub-Skill Architecture
3
3
 
4
4
  This package provides fine-grained, independently usable skills that wrap
5
5
  DevSquad's core modules. Each sub-skill is a thin handler (~50 lines) that
@@ -1,2 +0,0 @@
1
- __version__ = "4.5.17"
2
- __version_info__ = (4, 6, 1)
File without changes
File without changes
File without changes
File without changes