ouroboros-ai 0.26.7.dev5__tar.gz → 0.26.7.dev7__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.dev5 → ouroboros_ai-0.26.7.dev7}/PKG-INFO +1 -1
  2. ouroboros_ai-0.26.7.dev7/docs/guides/mcp-bridge.md +93 -0
  3. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/_version.py +2 -2
  4. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/mcp.py +16 -0
  5. ouroboros_ai-0.26.7.dev7/src/ouroboros/mcp/bridge/__init__.py +22 -0
  6. ouroboros_ai-0.26.7.dev7/src/ouroboros/mcp/bridge/bridge.py +88 -0
  7. ouroboros_ai-0.26.7.dev7/src/ouroboros/mcp/bridge/config.py +70 -0
  8. ouroboros_ai-0.26.7.dev7/src/ouroboros/mcp/bridge/factory.py +37 -0
  9. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/server/adapter.py +8 -0
  10. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/definitions.py +13 -0
  11. ouroboros_ai-0.26.7.dev7/tests/e2e/mcp_bridge_test_config.yaml +9 -0
  12. ouroboros_ai-0.26.7.dev7/tests/integration/mcp/bridge/test_bridge_server_to_server.py +82 -0
  13. ouroboros_ai-0.26.7.dev7/tests/unit/mcp/bridge/__init__.py +0 -0
  14. ouroboros_ai-0.26.7.dev7/tests/unit/mcp/bridge/test_bridge.py +72 -0
  15. ouroboros_ai-0.26.7.dev7/tests/unit/mcp/bridge/test_config.py +79 -0
  16. ouroboros_ai-0.26.7.dev7/tests/unit/mcp/bridge/test_factory.py +25 -0
  17. ouroboros_ai-0.26.7.dev7/tests/unit/mcp/bridge/test_handler_wiring.py +63 -0
  18. ouroboros_ai-0.26.7.dev7/tests/unit/mcp/bridge/test_stability.py +157 -0
  19. ouroboros_ai-0.26.7.dev7/tests/unit/pm/__init__.py +0 -0
  20. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.claude/settings.json +0 -0
  21. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.claude-plugin/.mcp.json +0 -0
  22. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.claude-plugin/marketplace.json +0 -0
  23. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.claude-plugin/plugin.json +0 -0
  24. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.env.example +0 -0
  25. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  26. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  27. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  28. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  29. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.github/workflows/dev-publish.yml +0 -0
  30. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.github/workflows/lint.yml +0 -0
  31. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.github/workflows/release.yml +0 -0
  32. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.github/workflows/test.yml +0 -0
  33. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.gitignore +0 -0
  34. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.mcp.json +0 -0
  35. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.ouroboros/mechanical.toml +0 -0
  36. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.pre-commit-config.yaml +0 -0
  37. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/.python-version +0 -0
  38. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/CHANGELOG.md +0 -0
  39. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/CLAUDE.md +0 -0
  40. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/CODE_OF_CONDUCT.md +0 -0
  41. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/CONTRIBUTING.md +0 -0
  42. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/HANDOFF.md +0 -0
  43. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/LICENSE +0 -0
  44. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/README.ko.md +0 -0
  45. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/README.md +0 -0
  46. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/SECURITY.md +0 -0
  47. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/UNINSTALL.md +0 -0
  48. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/cancel.md +0 -0
  49. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/evaluate.md +0 -0
  50. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/evolve.md +0 -0
  51. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/help.md +0 -0
  52. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/interview.md +0 -0
  53. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/ralph.md +0 -0
  54. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/run.md +0 -0
  55. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/seed.md +0 -0
  56. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/setup.md +0 -0
  57. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/status.md +0 -0
  58. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/tutorial.md +0 -0
  59. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/unstuck.md +0 -0
  60. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/commands/welcome.md +0 -0
  61. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/.gitignore +0 -0
  62. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/Cargo.lock +0 -0
  63. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/Cargo.toml +0 -0
  64. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/README.md +0 -0
  65. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/src/db.rs +0 -0
  66. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/src/main.rs +0 -0
  67. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/src/mock.rs +0 -0
  68. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/src/state.rs +0 -0
  69. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  70. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  71. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  72. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  73. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  74. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  75. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/README.md +0 -0
  76. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/api/README.md +0 -0
  77. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/api/core.md +0 -0
  78. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/api/mcp.md +0 -0
  79. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/architecture.md +0 -0
  80. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/cli-reference.md +0 -0
  81. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/config-reference.md +0 -0
  82. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/contributing/architecture-overview.md +0 -0
  83. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/contributing/findings-registry.md +0 -0
  84. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/contributing/issue-quality-policy.md +0 -0
  85. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/contributing/key-patterns.md +0 -0
  86. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/contributing/testing-guide.md +0 -0
  87. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/examples/mcp-config.yaml +0 -0
  88. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/getting-started.md +0 -0
  89. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/guides/evaluation-pipeline.md +0 -0
  90. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/guides/evolution-loop.md +0 -0
  91. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  92. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/guides/seed-authoring.md +0 -0
  93. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/guides/tui-usage.md +0 -0
  94. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/images/PLACEHOLDER_README.md +0 -0
  95. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/images/ouroboros.png +0 -0
  96. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/platform-support.md +0 -0
  97. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/runtime-capability-matrix.md +0 -0
  98. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/runtime-guides/claude-code.md +0 -0
  99. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/docs/runtime-guides/codex.md +0 -0
  100. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/coordinator_test_seed.yaml +0 -0
  101. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/dummy_seed.yaml +0 -0
  102. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/parallel_subac_test_seed.yaml +0 -0
  103. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/subac_test_seed.yaml +0 -0
  104. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/task_manager/README.md +0 -0
  105. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/task_manager/__init__.py +0 -0
  106. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/task_manager/__main__.py +0 -0
  107. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/task_manager/cli.py +0 -0
  108. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/task_manager/models.py +0 -0
  109. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/task_manager/storage.py +0 -0
  110. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/examples/test_display.py +0 -0
  111. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/hooks/hooks.json +0 -0
  112. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/llms-full.txt +0 -0
  113. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/llms.txt +0 -0
  114. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/project-context.md +0 -0
  115. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/pyproject.toml +0 -0
  116. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/scripts/drift-monitor.py +0 -0
  117. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/scripts/install.sh +0 -0
  118. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/scripts/keyword-detector.py +0 -0
  119. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/scripts/mcp-serve.sh +0 -0
  120. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/scripts/ralph-rewind.py +0 -0
  121. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/scripts/ralph.py +0 -0
  122. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/scripts/ralph.sh +0 -0
  123. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/scripts/session-start.py +0 -0
  124. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/scripts/sync-plugin-version.py +0 -0
  125. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/scripts/version-check.py +0 -0
  126. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/brownfield/SKILL.md +0 -0
  127. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/cancel/SKILL.md +0 -0
  128. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/evaluate/SKILL.md +0 -0
  129. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/evolve/SKILL.md +0 -0
  130. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/help/SKILL.md +0 -0
  131. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/interview/SKILL.md +0 -0
  132. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/pm/SKILL.md +0 -0
  133. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/publish/SKILL.md +0 -0
  134. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/qa/SKILL.md +0 -0
  135. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/ralph/SKILL.md +0 -0
  136. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/run/SKILL.md +0 -0
  137. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/seed/SKILL.md +0 -0
  138. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/setup/SKILL.md +0 -0
  139. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/status/SKILL.md +0 -0
  140. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/tutorial/SKILL.md +0 -0
  141. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/unstuck/SKILL.md +0 -0
  142. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/update/SKILL.md +0 -0
  143. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/skills/welcome/SKILL.md +0 -0
  144. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/__init__.py +0 -0
  145. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/__main__.py +0 -0
  146. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/__init__.py +0 -0
  147. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/advocate.md +0 -0
  148. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/analysis-agent.md +0 -0
  149. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/architect.md +0 -0
  150. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/breadth-keeper.md +0 -0
  151. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/code-executor.md +0 -0
  152. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/codebase-explorer.md +0 -0
  153. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  154. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/contrarian.md +0 -0
  155. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/evaluator.md +0 -0
  156. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/hacker.md +0 -0
  157. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/judge.md +0 -0
  158. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/loader.py +0 -0
  159. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/ontologist.md +0 -0
  160. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/ontology-analyst.md +0 -0
  161. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/qa-judge.md +0 -0
  162. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/research-agent.md +0 -0
  163. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/researcher.md +0 -0
  164. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/seed-architect.md +0 -0
  165. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/seed-closer.md +0 -0
  166. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  167. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/simplifier.md +0 -0
  168. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  169. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/__init__.py +0 -0
  170. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/ambiguity.py +0 -0
  171. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/brownfield.py +0 -0
  172. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/explore.py +0 -0
  173. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/interview.py +0 -0
  174. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/pm_completion.py +0 -0
  175. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/pm_document.py +0 -0
  176. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/pm_interview.py +0 -0
  177. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/pm_seed.py +0 -0
  178. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/question_classifier.py +0 -0
  179. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/bigbang/seed_generator.py +0 -0
  180. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/__init__.py +0 -0
  181. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/__init__.py +0 -0
  182. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/cancel.py +0 -0
  183. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/config.py +0 -0
  184. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/init.py +0 -0
  185. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/pm.py +0 -0
  186. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/run.py +0 -0
  187. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/setup.py +0 -0
  188. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/status.py +0 -0
  189. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/tui.py +0 -0
  190. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/commands/uninstall.py +0 -0
  191. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/formatters/__init__.py +0 -0
  192. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/formatters/panels.py +0 -0
  193. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/formatters/progress.py +0 -0
  194. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/formatters/prompting.py +0 -0
  195. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/formatters/tables.py +0 -0
  196. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  197. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/cli/main.py +0 -0
  198. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/codex/__init__.py +0 -0
  199. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/codex/artifacts.py +0 -0
  200. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/codex/ouroboros.md +0 -0
  201. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/codex_permissions.py +0 -0
  202. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/config/__init__.py +0 -0
  203. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/config/loader.py +0 -0
  204. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/config/models.py +0 -0
  205. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/__init__.py +0 -0
  206. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/ac_tree.py +0 -0
  207. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/context.py +0 -0
  208. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/errors.py +0 -0
  209. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/file_lock.py +0 -0
  210. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/git_workflow.py +0 -0
  211. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/initial_context.py +0 -0
  212. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/json_utils.py +0 -0
  213. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/lineage.py +0 -0
  214. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/ontology_aspect.py +0 -0
  215. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/ontology_questions.py +0 -0
  216. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/project_paths.py +0 -0
  217. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/security.py +0 -0
  218. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/seed.py +0 -0
  219. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/text.py +0 -0
  220. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/types.py +0 -0
  221. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/core/worktree.py +0 -0
  222. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/__init__.py +0 -0
  223. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  224. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/consensus.py +0 -0
  225. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/json_utils.py +0 -0
  226. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/languages.py +0 -0
  227. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/mechanical.py +0 -0
  228. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/models.py +0 -0
  229. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/pipeline.py +0 -0
  230. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/semantic.py +0 -0
  231. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/trigger.py +0 -0
  232. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
  233. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/events/__init__.py +0 -0
  234. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/events/base.py +0 -0
  235. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/events/decomposition.py +0 -0
  236. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/events/evaluation.py +0 -0
  237. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/events/interview.py +0 -0
  238. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/events/lineage.py +0 -0
  239. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/events/ontology.py +0 -0
  240. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evolution/__init__.py +0 -0
  241. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evolution/convergence.py +0 -0
  242. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evolution/loop.py +0 -0
  243. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evolution/projector.py +0 -0
  244. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evolution/reflect.py +0 -0
  245. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evolution/regression.py +0 -0
  246. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/evolution/wonder.py +0 -0
  247. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/execution/__init__.py +0 -0
  248. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/execution/atomicity.py +0 -0
  249. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/execution/decomposition.py +0 -0
  250. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/execution/double_diamond.py +0 -0
  251. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/execution/subagent.py +0 -0
  252. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/__init__.py +0 -0
  253. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/client/__init__.py +0 -0
  254. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/client/adapter.py +0 -0
  255. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/client/manager.py +0 -0
  256. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/client/protocol.py +0 -0
  257. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/errors.py +0 -0
  258. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/job_manager.py +0 -0
  259. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/resources/__init__.py +0 -0
  260. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/resources/handlers.py +0 -0
  261. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/server/__init__.py +0 -0
  262. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/server/protocol.py +0 -0
  263. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/server/security.py +0 -0
  264. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/__init__.py +0 -0
  265. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  266. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
  267. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  268. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  269. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  270. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  271. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
  272. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  273. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  274. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/qa.py +0 -0
  275. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  276. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/tools/registry.py +0 -0
  277. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/mcp/types.py +0 -0
  278. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/observability/__init__.py +0 -0
  279. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/observability/drift.py +0 -0
  280. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/observability/logging.py +0 -0
  281. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/observability/retrospective.py +0 -0
  282. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/__init__.py +0 -0
  283. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/adapter.py +0 -0
  284. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  285. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  286. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/coordinator.py +0 -0
  287. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  288. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/events.py +0 -0
  289. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  290. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  291. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  292. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/level_context.py +0 -0
  293. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  294. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  295. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  296. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  297. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/runner.py +0 -0
  298. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  299. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  300. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/session.py +0 -0
  301. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  302. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/persistence/__init__.py +0 -0
  303. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/persistence/brownfield.py +0 -0
  304. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/persistence/checkpoint.py +0 -0
  305. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/persistence/event_store.py +0 -0
  306. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  307. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/persistence/migrations/runner.py +0 -0
  308. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  309. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  310. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/persistence/schema.py +0 -0
  311. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/persistence/uow.py +0 -0
  312. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/__init__.py +0 -0
  313. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/agents/__init__.py +0 -0
  314. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/agents/pool.py +0 -0
  315. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/agents/registry.py +0 -0
  316. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  317. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/orchestration/router.py +0 -0
  318. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  319. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/skills/__init__.py +0 -0
  320. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/skills/docs.py +0 -0
  321. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/skills/executor.py +0 -0
  322. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/skills/keywords.py +0 -0
  323. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/plugin/skills/registry.py +0 -0
  324. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/pm/__init__.py +0 -0
  325. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/pm/handoff.py +0 -0
  326. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/pm/renderer.py +0 -0
  327. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/providers/__init__.py +0 -0
  328. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  329. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/providers/base.py +0 -0
  330. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  331. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  332. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  333. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/providers/factory.py +0 -0
  334. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/providers/litellm_adapter.py +0 -0
  335. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/py.typed +0 -0
  336. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/resilience/__init__.py +0 -0
  337. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/resilience/lateral.py +0 -0
  338. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/resilience/stagnation.py +0 -0
  339. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/routing/__init__.py +0 -0
  340. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/routing/complexity.py +0 -0
  341. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/routing/downgrade.py +0 -0
  342. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/routing/escalation.py +0 -0
  343. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/routing/router.py +0 -0
  344. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/routing/tiers.py +0 -0
  345. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/secondary/__init__.py +0 -0
  346. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/secondary/scheduler.py +0 -0
  347. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/secondary/todo_registry.py +0 -0
  348. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/strategies/__init__.py +0 -0
  349. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/strategies/devil_advocate.py +0 -0
  350. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/__init__.py +0 -0
  351. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/app.py +0 -0
  352. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/components/__init__.py +0 -0
  353. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/components/agents_panel.py +0 -0
  354. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/components/event_log.py +0 -0
  355. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/components/progress.py +0 -0
  356. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/components/token_tracker.py +0 -0
  357. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/events.py +0 -0
  358. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/__init__.py +0 -0
  359. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  360. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/dashboard.py +0 -0
  361. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  362. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  363. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/debug.py +0 -0
  364. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/execution.py +0 -0
  365. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  366. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  367. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  368. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/logs.py +0 -0
  369. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/screens/session_selector.py +0 -0
  370. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/widgets/__init__.py +0 -0
  371. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  372. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  373. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  374. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  375. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  376. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  377. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  378. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  379. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/verification/__init__.py +0 -0
  380. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/verification/extractor.py +0 -0
  381. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/verification/models.py +0 -0
  382. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/src/ouroboros/verification/verifier.py +0 -0
  383. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/__init__.py +0 -0
  384. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/conftest.py +0 -0
  385. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/e2e/__init__.py +0 -0
  386. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/e2e/conftest.py +0 -0
  387. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/e2e/test_cli_commands.py +0 -0
  388. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/e2e/test_full_workflow.py +0 -0
  389. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/e2e/test_session_persistence.py +0 -0
  390. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/fixtures/test_atomicity_seed.yml +0 -0
  391. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/__init__.py +0 -0
  392. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/conftest.py +0 -0
  393. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/mcp/__init__.py +0 -0
  394. {ouroboros_ai-0.26.7.dev5/tests/unit/pm → ouroboros_ai-0.26.7.dev7/tests/integration/mcp/bridge}/__init__.py +0 -0
  395. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/mcp/conftest.py +0 -0
  396. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/mcp/test_client_adapter.py +0 -0
  397. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/mcp/test_client_manager.py +0 -0
  398. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/mcp/test_server_adapter.py +0 -0
  399. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/plugin/test_orchestration.py +0 -0
  400. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  401. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/test_codex_skill_fallback.py +0 -0
  402. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/test_codex_skill_smoke.py +0 -0
  403. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/integration/test_entry_point.py +0 -0
  404. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/__init__.py +0 -0
  405. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/agents/__init__.py +0 -0
  406. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/agents/test_loader.py +0 -0
  407. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/__init__.py +0 -0
  408. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_ambiguity.py +0 -0
  409. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_brownfield.py +0 -0
  410. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_classifier_context.py +0 -0
  411. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  412. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_explore.py +0 -0
  413. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_interview.py +0 -0
  414. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_pm_completion.py +0 -0
  415. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  416. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  417. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_pm_interview.py +0 -0
  418. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  419. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  420. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  421. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_question_classifier.py +0 -0
  422. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/bigbang/test_seed_generator.py +0 -0
  423. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/__init__.py +0 -0
  424. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/formatters/__init__.py +0 -0
  425. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/formatters/test_console.py +0 -0
  426. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/formatters/test_panels.py +0 -0
  427. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/formatters/test_progress.py +0 -0
  428. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/formatters/test_prompting.py +0 -0
  429. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/formatters/test_tables.py +0 -0
  430. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  431. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_cancel.py +0 -0
  432. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_config.py +0 -0
  433. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  434. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_init_runtime.py +0 -0
  435. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_main.py +0 -0
  436. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  437. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  438. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_pm.py +0 -0
  439. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_pm_brownfield.py +0 -0
  440. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_pm_completion.py +0 -0
  441. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
  442. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
  443. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_pm_overwrite.py +0 -0
  444. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
  445. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_pm_select_repos.py +0 -0
  446. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_run_qa.py +0 -0
  447. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_setup.py +0 -0
  448. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/cli/test_uninstall.py +0 -0
  449. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/config/__init__.py +0 -0
  450. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/config/test_loader.py +0 -0
  451. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/config/test_models.py +0 -0
  452. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/__init__.py +0 -0
  453. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_ac_tree.py +0 -0
  454. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_context.py +0 -0
  455. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_errors.py +0 -0
  456. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_git_workflow.py +0 -0
  457. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_initial_context.py +0 -0
  458. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_lineage.py +0 -0
  459. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_ontology_aspect.py +0 -0
  460. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_ontology_questions.py +0 -0
  461. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_security.py +0 -0
  462. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_seed.py +0 -0
  463. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_types.py +0 -0
  464. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/core/test_worktree.py +0 -0
  465. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/evaluation/__init__.py +0 -0
  466. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/evaluation/test_consensus.py +0 -0
  467. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/evaluation/test_json_utils.py +0 -0
  468. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/evaluation/test_languages.py +0 -0
  469. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/evaluation/test_mechanical.py +0 -0
  470. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/evaluation/test_models.py +0 -0
  471. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/evaluation/test_semantic.py +0 -0
  472. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/evaluation/test_trigger.py +0 -0
  473. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
  474. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/events/__init__.py +0 -0
  475. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/events/test_base.py +0 -0
  476. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/events/test_decomposition_events.py +0 -0
  477. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/evolution/test_wonder_scope.py +0 -0
  478. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/execution/__init__.py +0 -0
  479. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/execution/test_atomicity.py +0 -0
  480. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/execution/test_decomposition.py +0 -0
  481. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/execution/test_double_diamond.py +0 -0
  482. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/execution/test_subagent_isolation.py +0 -0
  483. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/__init__.py +0 -0
  484. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/client/__init__.py +0 -0
  485. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/client/test_adapter.py +0 -0
  486. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
  487. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/client/test_manager.py +0 -0
  488. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/conftest.py +0 -0
  489. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/server/__init__.py +0 -0
  490. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/server/test_adapter.py +0 -0
  491. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/server/test_security.py +0 -0
  492. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/test_errors.py +0 -0
  493. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/test_job_manager.py +0 -0
  494. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/test_types.py +0 -0
  495. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/__init__.py +0 -0
  496. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/conftest.py +0 -0
  497. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  498. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/test_definitions.py +0 -0
  499. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/test_evaluation_handler.py +0 -0
  500. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
  501. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  502. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
  503. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  504. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/test_qa_integration.py +0 -0
  505. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
  506. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/mcp/tools/test_registry.py +0 -0
  507. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/observability/__init__.py +0 -0
  508. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/observability/test_drift.py +0 -0
  509. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/observability/test_logging.py +0 -0
  510. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/observability/test_retrospective.py +0 -0
  511. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/__init__.py +0 -0
  512. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_adapter.py +0 -0
  513. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  514. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  515. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  516. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_coordinator.py +0 -0
  517. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  518. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_events.py +0 -0
  519. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  520. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  521. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  522. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_level_context.py +0 -0
  523. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  524. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  525. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  526. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  527. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_runner.py +0 -0
  528. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  529. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  530. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  531. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_session.py +0 -0
  532. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  533. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/persistence/__init__.py +0 -0
  534. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/persistence/test_brownfield_store.py +0 -0
  535. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/persistence/test_checkpoint.py +0 -0
  536. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/persistence/test_event_store.py +0 -0
  537. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/persistence/test_schema.py +0 -0
  538. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/persistence/test_uow.py +0 -0
  539. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/plugin/__init__.py +0 -0
  540. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/plugin/agents/__init__.py +0 -0
  541. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/plugin/agents/test_registry.py +0 -0
  542. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/plugin/orchestration/__init__.py +0 -0
  543. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  544. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/plugin/skills/__init__.py +0 -0
  545. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/plugin/skills/test_keywords.py +0 -0
  546. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/plugin/skills/test_registry.py +0 -0
  547. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/pm/test_renderer.py +0 -0
  548. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/providers/__init__.py +0 -0
  549. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/providers/test_base.py +0 -0
  550. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  551. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  552. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/providers/test_factory.py +0 -0
  553. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/providers/test_litellm_adapter.py +0 -0
  554. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/resilience/__init__.py +0 -0
  555. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/resilience/test_lateral.py +0 -0
  556. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/resilience/test_stagnation.py +0 -0
  557. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/routing/__init__.py +0 -0
  558. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/routing/test_complexity.py +0 -0
  559. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/routing/test_downgrade.py +0 -0
  560. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/routing/test_escalation.py +0 -0
  561. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/routing/test_router.py +0 -0
  562. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/routing/test_tiers.py +0 -0
  563. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/scripts/test_keyword_detector.py +0 -0
  564. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/scripts/test_version_check.py +0 -0
  565. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/secondary/__init__.py +0 -0
  566. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/secondary/test_scheduler.py +0 -0
  567. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/secondary/test_todo_registry.py +0 -0
  568. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_artifact_collector.py +0 -0
  569. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_codex_artifacts.py +0 -0
  570. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_convergence.py +0 -0
  571. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_dashboard.py +0 -0
  572. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_dependencies_configured.py +0 -0
  573. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_evolve_rewind.py +0 -0
  574. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_evolve_step.py +0 -0
  575. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_graceful_shutdown.py +0 -0
  576. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_main_entry_point.py +0 -0
  577. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_module_structure.py +0 -0
  578. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_project_initialization.py +0 -0
  579. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_projector_rewind.py +0 -0
  580. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_ralph_parser.py +0 -0
  581. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_ralph_rewind.py +0 -0
  582. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_regression.py +0 -0
  583. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_tooling_configuration.py +0 -0
  584. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/test_verification.py +0 -0
  585. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/tui/__init__.py +0 -0
  586. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/tui/test_app.py +0 -0
  587. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/tui/test_cancelled_display.py +0 -0
  588. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/tui/test_events.py +0 -0
  589. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/tui/test_lineage_viewer.py +0 -0
  590. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/tui/test_screens.py +0 -0
  591. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/tui/test_session_selector_replay.py +0 -0
  592. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tests/unit/tui/test_widgets.py +0 -0
  593. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/tools/sync_github_project.py +0 -0
  594. {ouroboros_ai-0.26.7.dev5 → ouroboros_ai-0.26.7.dev7}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.26.7.dev5
3
+ Version: 0.26.7.dev7
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.dev5'
22
- __version_tuple__ = version_tuple = (0, 26, 7, 'dev5')
21
+ __version__ = version = '0.26.7.dev7'
22
+ __version_tuple__ = version_tuple = (0, 26, 7, 'dev7')
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)
@@ -753,10 +753,18 @@ def create_ouroboros_server(
753
753
  cwd=task_cwd or Path.cwd(),
754
754
  llm_backend=llm_backend,
755
755
  )
756
+ _evo_mcp_manager = mcp_bridge.manager if mcp_bridge is not None else None
757
+ _evo_mcp_prefix = (
758
+ mcp_bridge.tool_prefix
759
+ if mcp_bridge is not None and hasattr(mcp_bridge, "tool_prefix")
760
+ else ""
761
+ )
756
762
  evolution_runner = OrchestratorRunner(
757
763
  adapter=runner_adapter,
758
764
  event_store=event_store,
759
765
  console=Console(stderr=True),
766
+ mcp_manager=_evo_mcp_manager,
767
+ mcp_tool_prefix=_evo_mcp_prefix,
760
768
  debug=False,
761
769
  enable_decomposition=True,
762
770
  )
@@ -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,
@@ -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_"
@@ -0,0 +1,72 @@
1
+ """Tests for MCPBridge lifecycle management."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from unittest.mock import AsyncMock, patch
6
+
7
+ import pytest
8
+
9
+ from ouroboros.mcp.bridge.bridge import MCPBridge
10
+ from ouroboros.mcp.bridge.config import MCPBridgeConfig
11
+ from ouroboros.mcp.types import MCPServerConfig, TransportType
12
+
13
+
14
+ @pytest.fixture
15
+ def sample_config() -> MCPBridgeConfig:
16
+ return MCPBridgeConfig(
17
+ servers=(
18
+ MCPServerConfig(
19
+ name="test-server", transport=TransportType.STDIO, command="echo", args=("hello",)
20
+ ),
21
+ ),
22
+ timeout_seconds=5.0,
23
+ retry_attempts=1,
24
+ tool_prefix="test_",
25
+ )
26
+
27
+
28
+ class TestMCPBridge:
29
+ def test_from_config(self, sample_config):
30
+ bridge = MCPBridge.from_config(sample_config)
31
+ assert bridge.config is sample_config
32
+ assert not bridge.is_connected
33
+ assert bridge.tool_prefix == "test_"
34
+
35
+ @pytest.mark.asyncio
36
+ async def test_connect_disconnect(self, sample_config):
37
+ bridge = MCPBridge.from_config(sample_config)
38
+ with (
39
+ patch.object(bridge._manager, "add_server", new_callable=AsyncMock),
40
+ patch.object(bridge._manager, "connect_all", new_callable=AsyncMock, return_value={}),
41
+ ):
42
+ await bridge.connect()
43
+ assert bridge.is_connected
44
+ with patch.object(bridge._manager, "disconnect_all", new_callable=AsyncMock):
45
+ await bridge.disconnect()
46
+ assert not bridge.is_connected
47
+
48
+ @pytest.mark.asyncio
49
+ async def test_double_connect_warns(self, sample_config):
50
+ bridge = MCPBridge.from_config(sample_config)
51
+ bridge._connected = True
52
+ assert await bridge.connect() == {}
53
+
54
+ @pytest.mark.asyncio
55
+ async def test_context_manager(self, sample_config):
56
+ bridge = MCPBridge.from_config(sample_config)
57
+ with (
58
+ patch.object(bridge, "connect", new_callable=AsyncMock) as mc,
59
+ patch.object(bridge, "disconnect", new_callable=AsyncMock) as md,
60
+ ):
61
+ async with bridge as b:
62
+ assert b is bridge
63
+ mc.assert_called_once()
64
+ md.assert_called_once()
65
+
66
+ def test_from_config_file_valid(self, tmp_path):
67
+ f = tmp_path / "mcp.yaml"
68
+ f.write_text(
69
+ "mcp_servers:\n - name: fs\n transport: stdio\n command: echo\n args: ['test']\n"
70
+ )
71
+ bridge = MCPBridge.from_config_file(f)
72
+ assert len(bridge.config.servers) == 1
@@ -0,0 +1,79 @@
1
+ """Tests for MCPBridgeConfig and config discovery."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+
7
+ import pytest
8
+
9
+ from ouroboros.mcp.bridge.config import MCPBridgeConfig, discover_config, load_bridge_config
10
+
11
+
12
+ class TestMCPBridgeConfig:
13
+ def test_default_values(self):
14
+ config = MCPBridgeConfig()
15
+ assert config.servers == ()
16
+ assert config.timeout_seconds == 30.0
17
+ assert config.retry_attempts == 3
18
+ assert config.tool_prefix == ""
19
+
20
+ def test_frozen(self):
21
+ config = MCPBridgeConfig()
22
+ with pytest.raises(AttributeError):
23
+ config.timeout_seconds = 10.0
24
+
25
+ def test_custom_values(self):
26
+ config = MCPBridgeConfig(timeout_seconds=10.0, retry_attempts=5, tool_prefix="upstream_")
27
+ assert config.timeout_seconds == 10.0
28
+ assert config.retry_attempts == 5
29
+ assert config.tool_prefix == "upstream_"
30
+
31
+
32
+ class TestDiscoverConfig:
33
+ def test_env_var_takes_precedence(self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
34
+ config_file = tmp_path / "custom.yaml"
35
+ config_file.write_text("mcp_servers: []")
36
+ monkeypatch.setenv("OUROBOROS_MCP_CONFIG", str(config_file))
37
+ assert discover_config() == config_file
38
+
39
+ def test_cwd_config(self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
40
+ monkeypatch.delenv("OUROBOROS_MCP_CONFIG", raising=False)
41
+ cwd_config = tmp_path / ".ouroboros" / "mcp_servers.yaml"
42
+ cwd_config.parent.mkdir(parents=True)
43
+ cwd_config.write_text("mcp_servers: []")
44
+ assert discover_config(cwd=tmp_path) == cwd_config
45
+
46
+
47
+ class TestLoadBridgeConfig:
48
+ def test_load_valid_config(self, tmp_path: Path):
49
+ config_file = tmp_path / "mcp.yaml"
50
+ config_file.write_text(
51
+ "mcp_servers:\n - name: test\n transport: stdio\n command: echo\n args: ['hi']\nconnection:\n timeout_seconds: 15\n retry_attempts: 2\n"
52
+ )
53
+ result = load_bridge_config(config_file)
54
+ assert result.is_ok
55
+ assert len(result.value.servers) == 1
56
+ assert result.value.timeout_seconds == 15.0
57
+
58
+ def test_load_preserves_tool_prefix_and_health_check(self, tmp_path: Path):
59
+ config_file = tmp_path / "mcp.yaml"
60
+ config_file.write_text(
61
+ "mcp_servers:\n"
62
+ " - name: test\n"
63
+ " transport: stdio\n"
64
+ " command: echo\n"
65
+ " args: ['hi']\n"
66
+ "tool_prefix: upstream_\n"
67
+ "connection:\n"
68
+ " timeout_seconds: 10\n"
69
+ " retry_attempts: 1\n"
70
+ " health_check_interval: 45.0\n"
71
+ )
72
+ result = load_bridge_config(config_file)
73
+ assert result.is_ok
74
+ assert result.value.tool_prefix == "upstream_"
75
+ assert result.value.health_check_interval == 45.0
76
+
77
+ def test_load_nonexistent_file(self, tmp_path: Path):
78
+ result = load_bridge_config(tmp_path / "nonexistent.yaml")
79
+ assert result.is_err