ouroboros-ai 0.26.7.dev4__tar.gz → 0.26.7.dev6__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.

Potentially problematic release.


This version of ouroboros-ai might be problematic. Click here for more details.

Files changed (594) hide show
  1. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/PKG-INFO +1 -1
  2. ouroboros_ai-0.26.7.dev6/docs/guides/mcp-bridge.md +93 -0
  3. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/_version.py +2 -2
  4. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/mcp.py +16 -0
  5. ouroboros_ai-0.26.7.dev6/src/ouroboros/mcp/bridge/__init__.py +22 -0
  6. ouroboros_ai-0.26.7.dev6/src/ouroboros/mcp/bridge/bridge.py +88 -0
  7. ouroboros_ai-0.26.7.dev6/src/ouroboros/mcp/bridge/config.py +70 -0
  8. ouroboros_ai-0.26.7.dev6/src/ouroboros/mcp/bridge/factory.py +37 -0
  9. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/server/adapter.py +10 -0
  10. ouroboros_ai-0.26.7.dev6/src/ouroboros/mcp/tools/bridge_mixin.py +52 -0
  11. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/definitions.py +13 -0
  12. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/execution_handlers.py +4 -1
  13. ouroboros_ai-0.26.7.dev6/tests/e2e/mcp_bridge_test_config.yaml +9 -0
  14. ouroboros_ai-0.26.7.dev6/tests/integration/mcp/bridge/test_bridge_server_to_server.py +82 -0
  15. ouroboros_ai-0.26.7.dev6/tests/unit/mcp/bridge/__init__.py +0 -0
  16. ouroboros_ai-0.26.7.dev6/tests/unit/mcp/bridge/test_bridge.py +72 -0
  17. ouroboros_ai-0.26.7.dev6/tests/unit/mcp/bridge/test_config.py +79 -0
  18. ouroboros_ai-0.26.7.dev6/tests/unit/mcp/bridge/test_factory.py +25 -0
  19. ouroboros_ai-0.26.7.dev6/tests/unit/mcp/bridge/test_handler_wiring.py +63 -0
  20. ouroboros_ai-0.26.7.dev6/tests/unit/mcp/bridge/test_stability.py +157 -0
  21. ouroboros_ai-0.26.7.dev6/tests/unit/mcp/tools/test_mcp_manager_wiring.py +145 -0
  22. ouroboros_ai-0.26.7.dev6/tests/unit/pm/__init__.py +0 -0
  23. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.claude/settings.json +0 -0
  24. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.claude-plugin/.mcp.json +0 -0
  25. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.claude-plugin/marketplace.json +0 -0
  26. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.claude-plugin/plugin.json +0 -0
  27. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.env.example +0 -0
  28. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  29. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  30. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  31. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  32. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.github/workflows/dev-publish.yml +0 -0
  33. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.github/workflows/lint.yml +0 -0
  34. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.github/workflows/release.yml +0 -0
  35. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.github/workflows/test.yml +0 -0
  36. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.gitignore +0 -0
  37. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.mcp.json +0 -0
  38. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.ouroboros/mechanical.toml +0 -0
  39. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.pre-commit-config.yaml +0 -0
  40. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/.python-version +0 -0
  41. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/CHANGELOG.md +0 -0
  42. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/CLAUDE.md +0 -0
  43. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/CODE_OF_CONDUCT.md +0 -0
  44. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/CONTRIBUTING.md +0 -0
  45. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/HANDOFF.md +0 -0
  46. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/LICENSE +0 -0
  47. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/README.ko.md +0 -0
  48. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/README.md +0 -0
  49. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/SECURITY.md +0 -0
  50. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/UNINSTALL.md +0 -0
  51. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/cancel.md +0 -0
  52. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/evaluate.md +0 -0
  53. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/evolve.md +0 -0
  54. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/help.md +0 -0
  55. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/interview.md +0 -0
  56. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/ralph.md +0 -0
  57. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/run.md +0 -0
  58. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/seed.md +0 -0
  59. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/setup.md +0 -0
  60. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/status.md +0 -0
  61. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/tutorial.md +0 -0
  62. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/unstuck.md +0 -0
  63. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/commands/welcome.md +0 -0
  64. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/.gitignore +0 -0
  65. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/Cargo.lock +0 -0
  66. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/Cargo.toml +0 -0
  67. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/README.md +0 -0
  68. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/src/db.rs +0 -0
  69. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/src/main.rs +0 -0
  70. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/src/mock.rs +0 -0
  71. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/src/state.rs +0 -0
  72. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  73. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  74. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  75. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  76. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  77. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  78. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/README.md +0 -0
  79. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/api/README.md +0 -0
  80. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/api/core.md +0 -0
  81. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/api/mcp.md +0 -0
  82. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/architecture.md +0 -0
  83. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/cli-reference.md +0 -0
  84. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/config-reference.md +0 -0
  85. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/contributing/architecture-overview.md +0 -0
  86. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/contributing/findings-registry.md +0 -0
  87. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/contributing/issue-quality-policy.md +0 -0
  88. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/contributing/key-patterns.md +0 -0
  89. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/contributing/testing-guide.md +0 -0
  90. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/examples/mcp-config.yaml +0 -0
  91. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/getting-started.md +0 -0
  92. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/guides/evaluation-pipeline.md +0 -0
  93. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/guides/evolution-loop.md +0 -0
  94. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  95. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/guides/seed-authoring.md +0 -0
  96. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/guides/tui-usage.md +0 -0
  97. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/images/PLACEHOLDER_README.md +0 -0
  98. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/images/ouroboros.png +0 -0
  99. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/platform-support.md +0 -0
  100. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/runtime-capability-matrix.md +0 -0
  101. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/runtime-guides/claude-code.md +0 -0
  102. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/docs/runtime-guides/codex.md +0 -0
  103. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/coordinator_test_seed.yaml +0 -0
  104. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/dummy_seed.yaml +0 -0
  105. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/parallel_subac_test_seed.yaml +0 -0
  106. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/subac_test_seed.yaml +0 -0
  107. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/task_manager/README.md +0 -0
  108. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/task_manager/__init__.py +0 -0
  109. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/task_manager/__main__.py +0 -0
  110. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/task_manager/cli.py +0 -0
  111. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/task_manager/models.py +0 -0
  112. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/task_manager/storage.py +0 -0
  113. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/examples/test_display.py +0 -0
  114. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/hooks/hooks.json +0 -0
  115. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/llms-full.txt +0 -0
  116. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/llms.txt +0 -0
  117. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/project-context.md +0 -0
  118. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/pyproject.toml +0 -0
  119. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/scripts/drift-monitor.py +0 -0
  120. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/scripts/install.sh +0 -0
  121. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/scripts/keyword-detector.py +0 -0
  122. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/scripts/mcp-serve.sh +0 -0
  123. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/scripts/ralph-rewind.py +0 -0
  124. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/scripts/ralph.py +0 -0
  125. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/scripts/ralph.sh +0 -0
  126. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/scripts/session-start.py +0 -0
  127. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/scripts/sync-plugin-version.py +0 -0
  128. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/scripts/version-check.py +0 -0
  129. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/brownfield/SKILL.md +0 -0
  130. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/cancel/SKILL.md +0 -0
  131. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/evaluate/SKILL.md +0 -0
  132. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/evolve/SKILL.md +0 -0
  133. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/help/SKILL.md +0 -0
  134. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/interview/SKILL.md +0 -0
  135. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/pm/SKILL.md +0 -0
  136. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/publish/SKILL.md +0 -0
  137. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/qa/SKILL.md +0 -0
  138. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/ralph/SKILL.md +0 -0
  139. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/run/SKILL.md +0 -0
  140. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/seed/SKILL.md +0 -0
  141. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/setup/SKILL.md +0 -0
  142. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/status/SKILL.md +0 -0
  143. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/tutorial/SKILL.md +0 -0
  144. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/unstuck/SKILL.md +0 -0
  145. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/update/SKILL.md +0 -0
  146. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/skills/welcome/SKILL.md +0 -0
  147. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/__init__.py +0 -0
  148. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/__main__.py +0 -0
  149. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/__init__.py +0 -0
  150. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/advocate.md +0 -0
  151. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/analysis-agent.md +0 -0
  152. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/architect.md +0 -0
  153. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/breadth-keeper.md +0 -0
  154. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/code-executor.md +0 -0
  155. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/codebase-explorer.md +0 -0
  156. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  157. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/contrarian.md +0 -0
  158. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/evaluator.md +0 -0
  159. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/hacker.md +0 -0
  160. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/judge.md +0 -0
  161. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/loader.py +0 -0
  162. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/ontologist.md +0 -0
  163. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/ontology-analyst.md +0 -0
  164. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/qa-judge.md +0 -0
  165. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/research-agent.md +0 -0
  166. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/researcher.md +0 -0
  167. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/seed-architect.md +0 -0
  168. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/seed-closer.md +0 -0
  169. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  170. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/simplifier.md +0 -0
  171. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  172. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/__init__.py +0 -0
  173. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/ambiguity.py +0 -0
  174. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/brownfield.py +0 -0
  175. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/explore.py +0 -0
  176. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/interview.py +0 -0
  177. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/pm_completion.py +0 -0
  178. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/pm_document.py +0 -0
  179. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/pm_interview.py +0 -0
  180. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/pm_seed.py +0 -0
  181. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/question_classifier.py +0 -0
  182. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/bigbang/seed_generator.py +0 -0
  183. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/__init__.py +0 -0
  184. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/__init__.py +0 -0
  185. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/cancel.py +0 -0
  186. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/config.py +0 -0
  187. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/init.py +0 -0
  188. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/pm.py +0 -0
  189. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/run.py +0 -0
  190. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/setup.py +0 -0
  191. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/status.py +0 -0
  192. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/tui.py +0 -0
  193. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/commands/uninstall.py +0 -0
  194. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/formatters/__init__.py +0 -0
  195. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/formatters/panels.py +0 -0
  196. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/formatters/progress.py +0 -0
  197. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/formatters/prompting.py +0 -0
  198. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/formatters/tables.py +0 -0
  199. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  200. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/cli/main.py +0 -0
  201. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/codex/__init__.py +0 -0
  202. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/codex/artifacts.py +0 -0
  203. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/codex/ouroboros.md +0 -0
  204. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/codex_permissions.py +0 -0
  205. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/config/__init__.py +0 -0
  206. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/config/loader.py +0 -0
  207. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/config/models.py +0 -0
  208. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/__init__.py +0 -0
  209. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/ac_tree.py +0 -0
  210. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/context.py +0 -0
  211. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/errors.py +0 -0
  212. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/file_lock.py +0 -0
  213. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/git_workflow.py +0 -0
  214. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/initial_context.py +0 -0
  215. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/json_utils.py +0 -0
  216. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/lineage.py +0 -0
  217. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/ontology_aspect.py +0 -0
  218. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/ontology_questions.py +0 -0
  219. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/project_paths.py +0 -0
  220. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/security.py +0 -0
  221. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/seed.py +0 -0
  222. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/text.py +0 -0
  223. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/types.py +0 -0
  224. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/core/worktree.py +0 -0
  225. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/__init__.py +0 -0
  226. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  227. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/consensus.py +0 -0
  228. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/json_utils.py +0 -0
  229. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/languages.py +0 -0
  230. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/mechanical.py +0 -0
  231. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/models.py +0 -0
  232. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/pipeline.py +0 -0
  233. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/semantic.py +0 -0
  234. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/trigger.py +0 -0
  235. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
  236. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/events/__init__.py +0 -0
  237. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/events/base.py +0 -0
  238. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/events/decomposition.py +0 -0
  239. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/events/evaluation.py +0 -0
  240. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/events/interview.py +0 -0
  241. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/events/lineage.py +0 -0
  242. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/events/ontology.py +0 -0
  243. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evolution/__init__.py +0 -0
  244. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evolution/convergence.py +0 -0
  245. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evolution/loop.py +0 -0
  246. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evolution/projector.py +0 -0
  247. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evolution/reflect.py +0 -0
  248. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evolution/regression.py +0 -0
  249. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/evolution/wonder.py +0 -0
  250. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/execution/__init__.py +0 -0
  251. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/execution/atomicity.py +0 -0
  252. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/execution/decomposition.py +0 -0
  253. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/execution/double_diamond.py +0 -0
  254. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/execution/subagent.py +0 -0
  255. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/__init__.py +0 -0
  256. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/client/__init__.py +0 -0
  257. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/client/adapter.py +0 -0
  258. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/client/manager.py +0 -0
  259. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/client/protocol.py +0 -0
  260. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/errors.py +0 -0
  261. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/job_manager.py +0 -0
  262. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/resources/__init__.py +0 -0
  263. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/resources/handlers.py +0 -0
  264. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/server/__init__.py +0 -0
  265. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/server/protocol.py +0 -0
  266. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/server/security.py +0 -0
  267. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/__init__.py +0 -0
  268. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  269. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  270. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  271. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  272. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  273. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  274. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  275. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/qa.py +0 -0
  276. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  277. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/tools/registry.py +0 -0
  278. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/mcp/types.py +0 -0
  279. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/observability/__init__.py +0 -0
  280. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/observability/drift.py +0 -0
  281. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/observability/logging.py +0 -0
  282. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/observability/retrospective.py +0 -0
  283. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/__init__.py +0 -0
  284. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/adapter.py +0 -0
  285. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  286. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  287. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/coordinator.py +0 -0
  288. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  289. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/events.py +0 -0
  290. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  291. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  292. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  293. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/level_context.py +0 -0
  294. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  295. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  296. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  297. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  298. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/runner.py +0 -0
  299. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  300. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  301. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/session.py +0 -0
  302. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  303. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/persistence/__init__.py +0 -0
  304. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/persistence/brownfield.py +0 -0
  305. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/persistence/checkpoint.py +0 -0
  306. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/persistence/event_store.py +0 -0
  307. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  308. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/persistence/migrations/runner.py +0 -0
  309. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  310. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  311. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/persistence/schema.py +0 -0
  312. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/persistence/uow.py +0 -0
  313. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/__init__.py +0 -0
  314. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/agents/__init__.py +0 -0
  315. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/agents/pool.py +0 -0
  316. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/agents/registry.py +0 -0
  317. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  318. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/orchestration/router.py +0 -0
  319. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  320. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/skills/__init__.py +0 -0
  321. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/skills/docs.py +0 -0
  322. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/skills/executor.py +0 -0
  323. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/skills/keywords.py +0 -0
  324. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/plugin/skills/registry.py +0 -0
  325. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/pm/__init__.py +0 -0
  326. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/pm/handoff.py +0 -0
  327. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/pm/renderer.py +0 -0
  328. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/providers/__init__.py +0 -0
  329. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  330. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/providers/base.py +0 -0
  331. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  332. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  333. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  334. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/providers/factory.py +0 -0
  335. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/providers/litellm_adapter.py +0 -0
  336. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/py.typed +0 -0
  337. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/resilience/__init__.py +0 -0
  338. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/resilience/lateral.py +0 -0
  339. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/resilience/stagnation.py +0 -0
  340. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/routing/__init__.py +0 -0
  341. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/routing/complexity.py +0 -0
  342. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/routing/downgrade.py +0 -0
  343. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/routing/escalation.py +0 -0
  344. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/routing/router.py +0 -0
  345. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/routing/tiers.py +0 -0
  346. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/secondary/__init__.py +0 -0
  347. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/secondary/scheduler.py +0 -0
  348. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/secondary/todo_registry.py +0 -0
  349. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/strategies/__init__.py +0 -0
  350. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/strategies/devil_advocate.py +0 -0
  351. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/__init__.py +0 -0
  352. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/app.py +0 -0
  353. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/components/__init__.py +0 -0
  354. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/components/agents_panel.py +0 -0
  355. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/components/event_log.py +0 -0
  356. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/components/progress.py +0 -0
  357. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/components/token_tracker.py +0 -0
  358. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/events.py +0 -0
  359. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/__init__.py +0 -0
  360. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  361. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/dashboard.py +0 -0
  362. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  363. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  364. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/debug.py +0 -0
  365. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/execution.py +0 -0
  366. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  367. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  368. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  369. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/logs.py +0 -0
  370. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/screens/session_selector.py +0 -0
  371. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/widgets/__init__.py +0 -0
  372. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  373. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  374. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  375. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  376. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  377. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  378. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  379. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  380. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/verification/__init__.py +0 -0
  381. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/verification/extractor.py +0 -0
  382. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/verification/models.py +0 -0
  383. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/src/ouroboros/verification/verifier.py +0 -0
  384. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/__init__.py +0 -0
  385. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/conftest.py +0 -0
  386. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/e2e/__init__.py +0 -0
  387. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/e2e/conftest.py +0 -0
  388. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/e2e/test_cli_commands.py +0 -0
  389. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/e2e/test_full_workflow.py +0 -0
  390. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/e2e/test_session_persistence.py +0 -0
  391. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/fixtures/test_atomicity_seed.yml +0 -0
  392. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/__init__.py +0 -0
  393. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/conftest.py +0 -0
  394. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/mcp/__init__.py +0 -0
  395. {ouroboros_ai-0.26.7.dev4/tests/unit/pm → ouroboros_ai-0.26.7.dev6/tests/integration/mcp/bridge}/__init__.py +0 -0
  396. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/mcp/conftest.py +0 -0
  397. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/mcp/test_client_adapter.py +0 -0
  398. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/mcp/test_client_manager.py +0 -0
  399. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/mcp/test_server_adapter.py +0 -0
  400. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/plugin/test_orchestration.py +0 -0
  401. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  402. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/test_codex_skill_fallback.py +0 -0
  403. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/test_codex_skill_smoke.py +0 -0
  404. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/integration/test_entry_point.py +0 -0
  405. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/__init__.py +0 -0
  406. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/agents/__init__.py +0 -0
  407. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/agents/test_loader.py +0 -0
  408. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/__init__.py +0 -0
  409. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_ambiguity.py +0 -0
  410. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_brownfield.py +0 -0
  411. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_classifier_context.py +0 -0
  412. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  413. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_explore.py +0 -0
  414. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_interview.py +0 -0
  415. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_pm_completion.py +0 -0
  416. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  417. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  418. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_pm_interview.py +0 -0
  419. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  420. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  421. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  422. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_question_classifier.py +0 -0
  423. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/bigbang/test_seed_generator.py +0 -0
  424. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/__init__.py +0 -0
  425. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/formatters/__init__.py +0 -0
  426. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/formatters/test_console.py +0 -0
  427. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/formatters/test_panels.py +0 -0
  428. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/formatters/test_progress.py +0 -0
  429. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/formatters/test_prompting.py +0 -0
  430. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/formatters/test_tables.py +0 -0
  431. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  432. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_cancel.py +0 -0
  433. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_config.py +0 -0
  434. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  435. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_init_runtime.py +0 -0
  436. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_main.py +0 -0
  437. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  438. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  439. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_pm.py +0 -0
  440. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_pm_brownfield.py +0 -0
  441. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_pm_completion.py +0 -0
  442. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
  443. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
  444. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_pm_overwrite.py +0 -0
  445. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
  446. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_pm_select_repos.py +0 -0
  447. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_run_qa.py +0 -0
  448. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_setup.py +0 -0
  449. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/cli/test_uninstall.py +0 -0
  450. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/config/__init__.py +0 -0
  451. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/config/test_loader.py +0 -0
  452. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/config/test_models.py +0 -0
  453. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/__init__.py +0 -0
  454. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_ac_tree.py +0 -0
  455. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_context.py +0 -0
  456. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_errors.py +0 -0
  457. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_git_workflow.py +0 -0
  458. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_initial_context.py +0 -0
  459. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_lineage.py +0 -0
  460. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_ontology_aspect.py +0 -0
  461. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_ontology_questions.py +0 -0
  462. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_security.py +0 -0
  463. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_seed.py +0 -0
  464. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_types.py +0 -0
  465. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/core/test_worktree.py +0 -0
  466. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/evaluation/__init__.py +0 -0
  467. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/evaluation/test_consensus.py +0 -0
  468. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/evaluation/test_json_utils.py +0 -0
  469. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/evaluation/test_languages.py +0 -0
  470. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/evaluation/test_mechanical.py +0 -0
  471. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/evaluation/test_models.py +0 -0
  472. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/evaluation/test_semantic.py +0 -0
  473. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/evaluation/test_trigger.py +0 -0
  474. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
  475. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/events/__init__.py +0 -0
  476. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/events/test_base.py +0 -0
  477. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/events/test_decomposition_events.py +0 -0
  478. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/evolution/test_wonder_scope.py +0 -0
  479. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/execution/__init__.py +0 -0
  480. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/execution/test_atomicity.py +0 -0
  481. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/execution/test_decomposition.py +0 -0
  482. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/execution/test_double_diamond.py +0 -0
  483. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/execution/test_subagent_isolation.py +0 -0
  484. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/__init__.py +0 -0
  485. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/client/__init__.py +0 -0
  486. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/client/test_adapter.py +0 -0
  487. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
  488. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/client/test_manager.py +0 -0
  489. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/conftest.py +0 -0
  490. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/server/__init__.py +0 -0
  491. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/server/test_adapter.py +0 -0
  492. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/server/test_security.py +0 -0
  493. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/test_errors.py +0 -0
  494. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/test_job_manager.py +0 -0
  495. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/test_types.py +0 -0
  496. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/__init__.py +0 -0
  497. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/conftest.py +0 -0
  498. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  499. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/test_definitions.py +0 -0
  500. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/test_evaluation_handler.py +0 -0
  501. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  502. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
  503. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  504. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/test_qa_integration.py +0 -0
  505. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
  506. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/mcp/tools/test_registry.py +0 -0
  507. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/observability/__init__.py +0 -0
  508. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/observability/test_drift.py +0 -0
  509. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/observability/test_logging.py +0 -0
  510. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/observability/test_retrospective.py +0 -0
  511. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/__init__.py +0 -0
  512. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_adapter.py +0 -0
  513. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  514. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  515. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  516. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_coordinator.py +0 -0
  517. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  518. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_events.py +0 -0
  519. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  520. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  521. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  522. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_level_context.py +0 -0
  523. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  524. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  525. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  526. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  527. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_runner.py +0 -0
  528. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  529. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  530. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  531. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_session.py +0 -0
  532. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  533. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/persistence/__init__.py +0 -0
  534. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/persistence/test_brownfield_store.py +0 -0
  535. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/persistence/test_checkpoint.py +0 -0
  536. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/persistence/test_event_store.py +0 -0
  537. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/persistence/test_schema.py +0 -0
  538. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/persistence/test_uow.py +0 -0
  539. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/plugin/__init__.py +0 -0
  540. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/plugin/agents/__init__.py +0 -0
  541. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/plugin/agents/test_registry.py +0 -0
  542. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/plugin/orchestration/__init__.py +0 -0
  543. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  544. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/plugin/skills/__init__.py +0 -0
  545. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/plugin/skills/test_keywords.py +0 -0
  546. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/plugin/skills/test_registry.py +0 -0
  547. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/pm/test_renderer.py +0 -0
  548. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/providers/__init__.py +0 -0
  549. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/providers/test_base.py +0 -0
  550. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  551. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  552. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/providers/test_factory.py +0 -0
  553. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/providers/test_litellm_adapter.py +0 -0
  554. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/resilience/__init__.py +0 -0
  555. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/resilience/test_lateral.py +0 -0
  556. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/resilience/test_stagnation.py +0 -0
  557. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/routing/__init__.py +0 -0
  558. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/routing/test_complexity.py +0 -0
  559. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/routing/test_downgrade.py +0 -0
  560. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/routing/test_escalation.py +0 -0
  561. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/routing/test_router.py +0 -0
  562. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/routing/test_tiers.py +0 -0
  563. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/scripts/test_keyword_detector.py +0 -0
  564. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/scripts/test_version_check.py +0 -0
  565. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/secondary/__init__.py +0 -0
  566. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/secondary/test_scheduler.py +0 -0
  567. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/secondary/test_todo_registry.py +0 -0
  568. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_artifact_collector.py +0 -0
  569. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_codex_artifacts.py +0 -0
  570. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_convergence.py +0 -0
  571. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_dashboard.py +0 -0
  572. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_dependencies_configured.py +0 -0
  573. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_evolve_rewind.py +0 -0
  574. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_evolve_step.py +0 -0
  575. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_graceful_shutdown.py +0 -0
  576. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_main_entry_point.py +0 -0
  577. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_module_structure.py +0 -0
  578. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_project_initialization.py +0 -0
  579. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_projector_rewind.py +0 -0
  580. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_ralph_parser.py +0 -0
  581. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_ralph_rewind.py +0 -0
  582. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_regression.py +0 -0
  583. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_tooling_configuration.py +0 -0
  584. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/test_verification.py +0 -0
  585. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/tui/__init__.py +0 -0
  586. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/tui/test_app.py +0 -0
  587. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/tui/test_cancelled_display.py +0 -0
  588. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/tui/test_events.py +0 -0
  589. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/tui/test_lineage_viewer.py +0 -0
  590. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/tui/test_screens.py +0 -0
  591. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/tui/test_session_selector_replay.py +0 -0
  592. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tests/unit/tui/test_widgets.py +0 -0
  593. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/tools/sync_github_project.py +0 -0
  594. {ouroboros_ai-0.26.7.dev4 → ouroboros_ai-0.26.7.dev6}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.26.7.dev4
3
+ Version: 0.26.7.dev6
4
4
  Summary: Specification-first workflow engine for AI coding agents. Works with Claude Code and Codex CLI.
5
5
  Author-email: Q00 <jqyu.lee@gmail.com>
6
6
  License-File: LICENSE
@@ -0,0 +1,93 @@
1
+ # MCP Bridge — Server-to-Server Communication
2
+
3
+ ## Overview
4
+
5
+ The MCP Bridge module enables an MCP server (like Ouroboros) to connect to and
6
+ consume tools from other MCP servers during execution. This solves the problem
7
+ where `execute_seed` runs in isolation without access to external MCP tools.
8
+
9
+ ## Architecture
10
+
11
+ ```
12
+ Claude Session (Host)
13
+ │
14
+ └── Ouroboros MCP Server
15
+ │
16
+ ├── MCPBridge
17
+ │ └── MCPClientManager
18
+ │ ├── openchrome MCP
19
+ │ ├── filesystem MCP
20
+ │ └── database MCP
21
+ │
22
+ └── ExecuteSeedHandler
23
+ └── OrchestratorRunner (merged tools)
24
+ └── Child Agent (native + external tools)
25
+ ```
26
+
27
+ ## Quick Start
28
+
29
+ ### 1. Create config file
30
+
31
+ Create `~/.ouroboros/mcp_servers.yaml`:
32
+
33
+ ```yaml
34
+ mcp_servers:
35
+ - name: openchrome
36
+ transport: stdio
37
+ command: npx
38
+ args: ["-y", "openchrome-mcp@latest", "serve", "--auto-launch"]
39
+
40
+ connection:
41
+ timeout_seconds: 30
42
+ retry_attempts: 3
43
+ ```
44
+
45
+ ### 2. Start MCP server
46
+
47
+ ```bash
48
+ ouroboros mcp serve
49
+ # Output: MCP Bridge: 1/1 upstream server(s) connected
50
+ ```
51
+
52
+ ### 3. Execute seed with external tools
53
+
54
+ The child agent now has access to all upstream MCP tools during execution.
55
+
56
+ ## Python API
57
+
58
+ ### MCPBridge
59
+
60
+ ```python
61
+ from ouroboros.mcp.bridge import MCPBridge, MCPBridgeConfig
62
+
63
+ # Async context manager
64
+ async with MCPBridge.from_config_file(Path("mcp.yaml")) as bridge:
65
+ tools = await bridge.manager.list_all_tools()
66
+
67
+ # Manual lifecycle
68
+ bridge = MCPBridge.from_config(config)
69
+ await bridge.connect()
70
+ await bridge.disconnect()
71
+ ```
72
+
73
+ ### Factory Functions
74
+
75
+ ```python
76
+ from ouroboros.mcp.bridge import create_bridge_from_env
77
+
78
+ bridge = create_bridge_from_env() # Auto-discovers config
79
+ if bridge:
80
+ await bridge.connect()
81
+ ```
82
+
83
+ ## Config Discovery
84
+
85
+ Checked in order:
86
+ 1. `$OUROBOROS_MCP_CONFIG` environment variable
87
+ 2. `~/.ouroboros/mcp_servers.yaml`
88
+ 3. `{cwd}/.ouroboros/mcp_servers.yaml`
89
+
90
+ ## Known Limitations
91
+
92
+ - Evolution loop (`evolve_step`) does not yet pass the bridge manager
93
+ - No dynamic server addition after initial connection
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.26.7.dev4'
22
- __version_tuple__ = version_tuple = (0, 26, 7, 'dev4')
21
+ __version__ = version = '0.26.7.dev6'
22
+ __version_tuple__ = version_tuple = (0, 26, 7, 'dev6')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -155,6 +155,21 @@ async def _run_mcp_server(
155
155
  # Auto-cleanup is best-effort — don't prevent server from starting
156
156
  _stderr_console.print(f"[yellow]Warning: auto-cleanup failed: {e}[/yellow]")
157
157
 
158
+ # Auto-discover and connect MCP bridge for server-to-server communication
159
+ from ouroboros.mcp.bridge import create_bridge_from_env
160
+
161
+ mcp_bridge = create_bridge_from_env(cwd=Path.cwd())
162
+ if mcp_bridge is not None:
163
+ try:
164
+ results = await mcp_bridge.connect()
165
+ connected = sum(1 for r in results.values() if r.is_ok)
166
+ _stderr_console.print(
167
+ f"[blue]MCP Bridge: {connected}/{len(results)} upstream server(s) connected[/blue]"
168
+ )
169
+ except Exception as e:
170
+ _stderr_console.print(f"[yellow]MCP Bridge connection failed: {e}[/yellow]")
171
+ mcp_bridge = None
172
+
158
173
  # Create server with all tools pre-registered via dependency injection.
159
174
  # Do NOT re-register OUROBOROS_TOOLS here — create_ouroboros_server already
160
175
  # registers handlers with proper dependencies (event_store, llm_adapter, etc.).
@@ -164,6 +179,7 @@ async def _run_mcp_server(
164
179
  event_store=event_store,
165
180
  runtime_backend=runtime_backend,
166
181
  llm_backend=llm_backend,
182
+ mcp_bridge=mcp_bridge,
167
183
  )
168
184
 
169
185
  tool_count = len(server.info.tools)
@@ -0,0 +1,22 @@
1
+ """MCP Bridge — Reusable server-to-server communication layer.
2
+
3
+ This module provides a lifecycle-managed bridge that allows an MCP server
4
+ to connect to and consume tools from other MCP servers during execution.
5
+ """
6
+
7
+ from ouroboros.mcp.bridge.bridge import MCPBridge
8
+ from ouroboros.mcp.bridge.config import MCPBridgeConfig, load_bridge_config
9
+ from ouroboros.mcp.bridge.factory import (
10
+ create_bridge,
11
+ create_bridge_from_config_file,
12
+ create_bridge_from_env,
13
+ )
14
+
15
+ __all__ = [
16
+ "MCPBridge",
17
+ "MCPBridgeConfig",
18
+ "create_bridge",
19
+ "create_bridge_from_config_file",
20
+ "create_bridge_from_env",
21
+ "load_bridge_config",
22
+ ]
@@ -0,0 +1,88 @@
1
+ """MCPBridge — lifecycle-managed server-to-server MCP connections."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass, field
6
+ from pathlib import Path
7
+ from typing import Any
8
+
9
+ from ouroboros.core.types import Result
10
+ from ouroboros.mcp.bridge.config import MCPBridgeConfig, load_bridge_config
11
+ from ouroboros.mcp.client.manager import MCPClientManager
12
+ from ouroboros.mcp.types import MCPServerInfo
13
+ from ouroboros.observability.logging import get_logger
14
+
15
+ log = get_logger(__name__)
16
+
17
+
18
+ @dataclass
19
+ class MCPBridge:
20
+ """Manages the lifecycle of server-to-server MCP connections."""
21
+
22
+ config: MCPBridgeConfig
23
+ _manager: MCPClientManager = field(init=False, repr=False)
24
+ _connected: bool = field(default=False, init=False, repr=False)
25
+
26
+ def __post_init__(self) -> None:
27
+ self._manager = MCPClientManager(
28
+ max_retries=self.config.retry_attempts,
29
+ health_check_interval=self.config.health_check_interval,
30
+ default_timeout=self.config.timeout_seconds,
31
+ )
32
+
33
+ @classmethod
34
+ def from_config(cls, config: MCPBridgeConfig) -> MCPBridge:
35
+ return cls(config=config)
36
+
37
+ @classmethod
38
+ def from_config_file(cls, path: Path) -> MCPBridge:
39
+ result = load_bridge_config(path)
40
+ if result.is_err:
41
+ raise ValueError(f"Failed to load bridge config from {path}: {result.error}")
42
+ return cls(config=result.value)
43
+
44
+ @property
45
+ def manager(self) -> MCPClientManager:
46
+ return self._manager
47
+
48
+ @property
49
+ def is_connected(self) -> bool:
50
+ return self._connected
51
+
52
+ @property
53
+ def tool_prefix(self) -> str:
54
+ return self.config.tool_prefix
55
+
56
+ async def connect(self) -> dict[str, Result[MCPServerInfo, Any]]:
57
+ if self._connected:
58
+ log.warning("bridge.already_connected")
59
+ return {}
60
+ for server_config in self.config.servers:
61
+ await self._manager.add_server(server_config)
62
+ results = await self._manager.connect_all()
63
+ connected_count = sum(1 for r in results.values() if r.is_ok)
64
+ log.info(
65
+ "bridge.connected",
66
+ connected=connected_count,
67
+ total=len(results),
68
+ servers=list(results.keys()),
69
+ )
70
+ self._connected = True
71
+ return results
72
+
73
+ async def disconnect(self) -> None:
74
+ if not self._connected:
75
+ return
76
+ await self._manager.disconnect_all()
77
+ self._connected = False
78
+ log.info("bridge.disconnected")
79
+
80
+ async def close(self) -> None:
81
+ await self.disconnect()
82
+
83
+ async def __aenter__(self) -> MCPBridge:
84
+ await self.connect()
85
+ return self
86
+
87
+ async def __aexit__(self, *exc: object) -> None:
88
+ await self.disconnect()
@@ -0,0 +1,70 @@
1
+ """Bridge configuration for MCP server-to-server communication."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass, field
6
+ import os
7
+ from pathlib import Path
8
+
9
+ from ouroboros.core.types import Result
10
+ from ouroboros.mcp.errors import MCPClientError
11
+ from ouroboros.mcp.types import MCPServerConfig
12
+ from ouroboros.observability.logging import get_logger
13
+
14
+ log = get_logger(__name__)
15
+
16
+ _ENV_VAR = "OUROBOROS_MCP_CONFIG"
17
+ _HOME_CONFIG = Path.home() / ".ouroboros" / "mcp_servers.yaml"
18
+
19
+
20
+ @dataclass(frozen=True, slots=True)
21
+ class MCPBridgeConfig:
22
+ """Configuration for an MCP bridge."""
23
+
24
+ servers: tuple[MCPServerConfig, ...] = field(default_factory=tuple)
25
+ timeout_seconds: float = 30.0
26
+ retry_attempts: int = 3
27
+ health_check_interval: float = 60.0
28
+ tool_prefix: str = ""
29
+
30
+
31
+ def discover_config(cwd: Path | None = None) -> Path | None:
32
+ """Auto-discover bridge configuration file."""
33
+ env_path = os.environ.get(_ENV_VAR)
34
+ if env_path:
35
+ p = Path(env_path)
36
+ if p.is_file():
37
+ log.info("bridge.config.discovered", source="env", path=str(p))
38
+ return p
39
+
40
+ if _HOME_CONFIG.is_file():
41
+ log.info("bridge.config.discovered", source="home", path=str(_HOME_CONFIG))
42
+ return _HOME_CONFIG
43
+
44
+ if cwd is not None:
45
+ cwd_config = cwd / ".ouroboros" / "mcp_servers.yaml"
46
+ if cwd_config.is_file():
47
+ log.info("bridge.config.discovered", source="cwd", path=str(cwd_config))
48
+ return cwd_config
49
+
50
+ return None
51
+
52
+
53
+ def load_bridge_config(config_path: Path) -> Result[MCPBridgeConfig, MCPClientError]:
54
+ """Load bridge configuration from a YAML file."""
55
+ from ouroboros.orchestrator.mcp_config import load_mcp_config
56
+
57
+ result = load_mcp_config(config_path)
58
+ if result.is_err:
59
+ return Result.err(MCPClientError(f"Failed to load bridge config: {result.error}"))
60
+
61
+ client_config = result.value
62
+ return Result.ok(
63
+ MCPBridgeConfig(
64
+ servers=client_config.servers,
65
+ timeout_seconds=client_config.connection.timeout_seconds,
66
+ retry_attempts=client_config.connection.retry_attempts,
67
+ health_check_interval=client_config.connection.health_check_interval,
68
+ tool_prefix=client_config.tool_prefix,
69
+ )
70
+ )
@@ -0,0 +1,37 @@
1
+ """Convenience factories for creating MCP bridges."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+
7
+ from ouroboros.mcp.bridge.bridge import MCPBridge
8
+ from ouroboros.mcp.bridge.config import MCPBridgeConfig, discover_config, load_bridge_config
9
+ from ouroboros.observability.logging import get_logger
10
+
11
+ log = get_logger(__name__)
12
+
13
+
14
+ async def create_bridge(config: MCPBridgeConfig) -> MCPBridge:
15
+ bridge = MCPBridge.from_config(config)
16
+ await bridge.connect()
17
+ return bridge
18
+
19
+
20
+ async def create_bridge_from_config_file(path: Path) -> MCPBridge:
21
+ bridge = MCPBridge.from_config_file(path)
22
+ await bridge.connect()
23
+ return bridge
24
+
25
+
26
+ def create_bridge_from_env(cwd: Path | None = None) -> MCPBridge | None:
27
+ config_path = discover_config(cwd)
28
+ if config_path is None:
29
+ return None
30
+ result = load_bridge_config(config_path)
31
+ if result.is_err:
32
+ log.warning(
33
+ "bridge.factory.config_load_failed", path=str(config_path), error=str(result.error)
34
+ )
35
+ return None
36
+ log.info("bridge.factory.created_from_env", config_path=str(config_path))
37
+ return MCPBridge.from_config(result.value)
@@ -569,6 +569,7 @@ def create_ouroboros_server(
569
569
  state_dir: Any | None = None,
570
570
  runtime_backend: str | None = None,
571
571
  llm_backend: str | None = None,
572
+ mcp_bridge: Any | None = None,
572
573
  ) -> MCPServerAdapter:
573
574
  """Create an Ouroboros MCP server with all tools and dependencies wired.
574
575
 
@@ -1239,6 +1240,15 @@ def create_ouroboros_server(
1239
1240
  # The server owns the shared event store lifecycle
1240
1241
  server.register_owned_resource(event_store)
1241
1242
 
1243
+ # Inject bridge into all BridgeAwareMixin handlers (loop-based auto-discovery)
1244
+ if mcp_bridge is not None:
1245
+ from ouroboros.mcp.tools.bridge_mixin import inject_bridge
1246
+
1247
+ injected = [type(h).__name__ for h in tool_handlers if inject_bridge(h, mcp_bridge)]
1248
+ if injected:
1249
+ log.info("mcp.bridge.injected", handlers=injected)
1250
+ server.register_owned_resource(mcp_bridge)
1251
+
1242
1252
  # Register all tools with the server
1243
1253
  for handler in tool_handlers:
1244
1254
  server.register_tool(handler)
@@ -0,0 +1,52 @@
1
+ """BridgeAwareMixin for MCP tool handlers that need external MCP access.
2
+
3
+ Handlers that inherit from this mixin will automatically receive
4
+ an MCPClientManager reference when an MCPBridge is configured,
5
+ via loop-based injection in the composition root.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from dataclasses import dataclass, field
11
+ from typing import Any
12
+
13
+
14
+ @dataclass
15
+ class BridgeAwareMixin:
16
+ """Mixin for handlers that need access to external MCP servers.
17
+
18
+ Provides ``mcp_manager`` and ``mcp_tool_prefix`` fields that are
19
+ injected by the composition root when an MCPBridge is configured.
20
+ Both fields default to None/"" so handlers work without a bridge.
21
+
22
+ Usage::
23
+
24
+ @dataclass
25
+ class MyHandler(BridgeAwareMixin):
26
+ other_field: str = ""
27
+
28
+ async def handle(self, arguments):
29
+ if self.mcp_manager:
30
+ tools = await self.mcp_manager.list_all_tools()
31
+ """
32
+
33
+ mcp_manager: Any | None = field(default=None, repr=False)
34
+ mcp_tool_prefix: str = ""
35
+
36
+
37
+ def inject_bridge(handler: object, bridge: object | None) -> bool:
38
+ """Inject bridge manager into a BridgeAwareMixin handler.
39
+
40
+ Args:
41
+ handler: A tool handler, possibly BridgeAwareMixin.
42
+ bridge: An MCPBridge instance (must have .manager and .tool_prefix).
43
+
44
+ Returns:
45
+ True if injection was performed, False otherwise.
46
+ """
47
+ if bridge is None or not isinstance(handler, BridgeAwareMixin):
48
+ return False
49
+
50
+ handler.mcp_manager = getattr(bridge, "manager", None)
51
+ handler.mcp_tool_prefix = getattr(bridge, "tool_prefix", "")
52
+ return True
@@ -4,6 +4,7 @@ This module re-exports all handler classes from their dedicated modules
4
4
  and provides the :func:`get_ouroboros_tools` factory that assembles
5
5
  the default handler tuple for MCP registration.
6
6
 
7
+
7
8
  Handler modules:
8
9
  - execution_handlers: ExecuteSeedHandler, StartExecuteSeedHandler
9
10
  - query_handlers: SessionStatusHandler, QueryEventsHandler, ACDashboardHandler
@@ -60,11 +61,15 @@ def execute_seed_handler(
60
61
  *,
61
62
  runtime_backend: str | None = None,
62
63
  llm_backend: str | None = None,
64
+ mcp_manager: object | None = None,
65
+ mcp_tool_prefix: str = "",
63
66
  ) -> ExecuteSeedHandler:
64
67
  """Create an ExecuteSeedHandler instance."""
65
68
  return ExecuteSeedHandler(
66
69
  agent_runtime_backend=runtime_backend,
67
70
  llm_backend=llm_backend,
71
+ mcp_manager=mcp_manager,
72
+ mcp_tool_prefix=mcp_tool_prefix,
68
73
  )
69
74
 
70
75
 
@@ -72,11 +77,15 @@ def start_execute_seed_handler(
72
77
  *,
73
78
  runtime_backend: str | None = None,
74
79
  llm_backend: str | None = None,
80
+ mcp_manager: object | None = None,
81
+ mcp_tool_prefix: str = "",
75
82
  ) -> StartExecuteSeedHandler:
76
83
  """Create a StartExecuteSeedHandler instance."""
77
84
  execute_handler = ExecuteSeedHandler(
78
85
  agent_runtime_backend=runtime_backend,
79
86
  llm_backend=llm_backend,
87
+ mcp_manager=mcp_manager,
88
+ mcp_tool_prefix=mcp_tool_prefix,
80
89
  )
81
90
  return StartExecuteSeedHandler(execute_handler=execute_handler)
82
91
 
@@ -192,11 +201,15 @@ def get_ouroboros_tools(
192
201
  *,
193
202
  runtime_backend: str | None = None,
194
203
  llm_backend: str | None = None,
204
+ mcp_manager: object | None = None,
205
+ mcp_tool_prefix: str = "",
195
206
  ) -> OuroborosToolHandlers:
196
207
  """Create the default set of Ouroboros MCP tool handlers."""
197
208
  execute_seed = ExecuteSeedHandler(
198
209
  agent_runtime_backend=runtime_backend,
199
210
  llm_backend=llm_backend,
211
+ mcp_manager=mcp_manager,
212
+ mcp_tool_prefix=mcp_tool_prefix,
200
213
  )
201
214
  return (
202
215
  execute_seed,
@@ -32,6 +32,7 @@ from ouroboros.core.worktree import (
32
32
  from ouroboros.evaluation.verification_artifacts import build_verification_artifacts
33
33
  from ouroboros.mcp.errors import MCPServerError, MCPToolError
34
34
  from ouroboros.mcp.job_manager import JobLinks, JobManager
35
+ from ouroboros.mcp.tools.bridge_mixin import BridgeAwareMixin
35
36
  from ouroboros.mcp.types import (
36
37
  ContentType,
37
38
  MCPContentItem,
@@ -97,7 +98,7 @@ def _extract_inherited_effective_tools(arguments: dict[str, Any]) -> list[str] |
97
98
 
98
99
 
99
100
  @dataclass
100
- class ExecuteSeedHandler:
101
+ class ExecuteSeedHandler(BridgeAwareMixin):
101
102
  """Handler for the execute_seed tool.
102
103
 
103
104
  Executes a seed (task specification) in the Ouroboros system.
@@ -394,6 +395,8 @@ class ExecuteSeedHandler:
394
395
  adapter=agent_adapter,
395
396
  event_store=event_store,
396
397
  console=console,
398
+ mcp_manager=self.mcp_manager,
399
+ mcp_tool_prefix=self.mcp_tool_prefix,
397
400
  debug=False,
398
401
  enable_decomposition=True,
399
402
  inherited_runtime_handle=inherited_runtime_handle,
@@ -0,0 +1,9 @@
1
+ mcp_servers:
2
+ - name: openchrome
3
+ transport: stdio
4
+ command: npx
5
+ args: ["--prefer-online", "-y", "openchrome-mcp@latest", "serve", "--auto-launch"]
6
+
7
+ connection:
8
+ timeout_seconds: 30
9
+ retry_attempts: 2
@@ -0,0 +1,82 @@
1
+ """Integration tests for MCP server-to-server communication via bridge."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from unittest.mock import AsyncMock, patch
6
+
7
+ import pytest
8
+
9
+ from ouroboros.core.types import Result
10
+ from ouroboros.mcp.bridge.bridge import MCPBridge
11
+ from ouroboros.mcp.bridge.config import MCPBridgeConfig
12
+ from ouroboros.mcp.client.manager import MCPClientManager
13
+ from ouroboros.mcp.types import MCPServerConfig, TransportType
14
+
15
+
16
+ class TestMCPBridgeReusability:
17
+ def test_bridge_config_accepts_multiple_servers(self):
18
+ config = MCPBridgeConfig(
19
+ servers=(
20
+ MCPServerConfig(
21
+ name="calc", transport=TransportType.STDIO, command="echo", args=("1",)
22
+ ),
23
+ MCPServerConfig(
24
+ name="greet", transport=TransportType.STDIO, command="echo", args=("2",)
25
+ ),
26
+ ),
27
+ tool_prefix="upstream_",
28
+ )
29
+ assert len(config.servers) == 2
30
+
31
+ def test_bridge_creates_manager(self):
32
+ config = MCPBridgeConfig(
33
+ servers=(
34
+ MCPServerConfig(name="a", transport=TransportType.STDIO, command="echo", args=()),
35
+ ),
36
+ )
37
+ bridge = MCPBridge.from_config(config)
38
+ assert isinstance(bridge.manager, MCPClientManager)
39
+
40
+ @pytest.mark.asyncio
41
+ async def test_lifecycle_with_multiple_configs(self):
42
+ config = MCPBridgeConfig(
43
+ servers=(
44
+ MCPServerConfig(
45
+ name="s1", transport=TransportType.STDIO, command="echo", args=("1",)
46
+ ),
47
+ MCPServerConfig(
48
+ name="s2", transport=TransportType.STDIO, command="echo", args=("2",)
49
+ ),
50
+ ),
51
+ )
52
+ bridge = MCPBridge.from_config(config)
53
+ with (
54
+ patch.object(bridge._manager, "add_server", new_callable=AsyncMock) as ma,
55
+ patch.object(
56
+ bridge._manager,
57
+ "connect_all",
58
+ new_callable=AsyncMock,
59
+ return_value={"s1": Result.ok(None), "s2": Result.ok(None)},
60
+ ),
61
+ ):
62
+ results = await bridge.connect()
63
+ assert len(results) == 2
64
+ assert ma.call_count == 2
65
+ with patch.object(bridge._manager, "disconnect_all", new_callable=AsyncMock):
66
+ await bridge.disconnect()
67
+
68
+
69
+ class TestBridgeToProviderIntegration:
70
+ def test_manager_compatible_with_tool_provider(self):
71
+ from ouroboros.orchestrator.mcp_tools import MCPToolProvider
72
+
73
+ bridge = MCPBridge.from_config(MCPBridgeConfig())
74
+ provider = MCPToolProvider(bridge.manager)
75
+ assert provider is not None
76
+
77
+ def test_manager_with_prefix(self):
78
+ from ouroboros.orchestrator.mcp_tools import MCPToolProvider
79
+
80
+ bridge = MCPBridge.from_config(MCPBridgeConfig(tool_prefix="ext_"))
81
+ provider = MCPToolProvider(bridge.manager, tool_prefix=bridge.tool_prefix)
82
+ assert provider._tool_prefix == "ext_"