ouroboros-ai 0.28.1.dev2__tar.gz → 0.28.1.dev4__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 (659) hide show
  1. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/CONTRIBUTING.md +3 -3
  2. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/PKG-INFO +3 -3
  3. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/README.md +2 -2
  4. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/config-reference.md +18 -1
  5. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/findings-registry.md +3 -2
  6. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/getting-started.md +3 -3
  7. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/runtime-capability-matrix.md +1 -1
  8. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/runtime-guides/codex.md +2 -2
  9. ouroboros_ai-0.28.1.dev4/docs/runtime-guides/opencode.md +284 -0
  10. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/_version.py +2 -2
  11. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/mcp.py +60 -0
  12. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/server/adapter.py +3 -1
  13. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/channel_workflow_handler.py +2 -0
  14. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/definitions.py +2 -0
  15. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/openclaw/store.py +1 -1
  16. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/test_server_adapter.py +1 -1
  17. ouroboros_ai-0.28.1.dev2/docs/runtime-guides/opencode.md +0 -165
  18. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.claude/settings.json +0 -0
  19. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.claude-plugin/.mcp.json +0 -0
  20. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.claude-plugin/marketplace.json +0 -0
  21. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.claude-plugin/plugin.json +0 -0
  22. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.env.example +0 -0
  23. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  24. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  25. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  26. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  27. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/workflows/dev-publish.yml +0 -0
  28. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/workflows/lint.yml +0 -0
  29. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/workflows/release.yml +0 -0
  30. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/workflows/test.yml +0 -0
  31. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.gitignore +0 -0
  32. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.mcp.json +0 -0
  33. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.ouroboros/mechanical.toml +0 -0
  34. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
  35. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
  36. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.pre-commit-config.yaml +0 -0
  37. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.python-version +0 -0
  38. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/CHANGELOG.md +0 -0
  39. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/CLAUDE.md +0 -0
  40. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/CODE_OF_CONDUCT.md +0 -0
  41. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/HANDOFF.md +0 -0
  42. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/LICENSE +0 -0
  43. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/README.ko.md +0 -0
  44. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/SECURITY.md +0 -0
  45. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/UNINSTALL.md +0 -0
  46. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/cancel.md +0 -0
  47. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/evaluate.md +0 -0
  48. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/evolve.md +0 -0
  49. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/help.md +0 -0
  50. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/interview.md +0 -0
  51. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/ralph.md +0 -0
  52. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/run.md +0 -0
  53. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/seed.md +0 -0
  54. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/setup.md +0 -0
  55. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/status.md +0 -0
  56. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/tutorial.md +0 -0
  57. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/unstuck.md +0 -0
  58. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/welcome.md +0 -0
  59. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/.gitignore +0 -0
  60. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/Cargo.lock +0 -0
  61. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/Cargo.toml +0 -0
  62. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/README.md +0 -0
  63. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/db.rs +0 -0
  64. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/main.rs +0 -0
  65. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/mock.rs +0 -0
  66. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/state.rs +0 -0
  67. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  68. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  69. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  70. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  71. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  72. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  73. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/README.md +0 -0
  74. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/api/README.md +0 -0
  75. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/api/core.md +0 -0
  76. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/api/mcp.md +0 -0
  77. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/architecture.md +0 -0
  78. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/assets/openclaw-ooo.png +0 -0
  79. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/cli-reference.md +0 -0
  80. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/architecture-overview.md +0 -0
  81. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/issue-quality-policy.md +0 -0
  82. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/key-patterns.md +0 -0
  83. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/openclaw-current-baseline.md +0 -0
  84. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/testing-guide.md +0 -0
  85. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/examples/mcp-config.yaml +0 -0
  86. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/evaluation-pipeline.md +0 -0
  87. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/evolution-loop.md +0 -0
  88. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  89. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/mcp-bridge.md +0 -0
  90. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/openclaw-channel-workflow.md +0 -0
  91. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/seed-authoring.md +0 -0
  92. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/tui-usage.md +0 -0
  93. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/images/PLACEHOLDER_README.md +0 -0
  94. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/images/ouroboros.png +0 -0
  95. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/platform-support.md +0 -0
  96. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/runtime-guides/claude-code.md +0 -0
  97. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/coordinator_test_seed.yaml +0 -0
  98. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/dummy_seed.yaml +0 -0
  99. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/parallel_subac_test_seed.yaml +0 -0
  100. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/subac_test_seed.yaml +0 -0
  101. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/README.md +0 -0
  102. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/__init__.py +0 -0
  103. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/__main__.py +0 -0
  104. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/cli.py +0 -0
  105. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/models.py +0 -0
  106. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/storage.py +0 -0
  107. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/test_display.py +0 -0
  108. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/hooks/hooks.json +0 -0
  109. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/llms-full.txt +0 -0
  110. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/llms.txt +0 -0
  111. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/project-context.md +0 -0
  112. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/pyproject.toml +0 -0
  113. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/drift-monitor.py +0 -0
  114. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/install.sh +0 -0
  115. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/keyword-detector.py +0 -0
  116. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/mcp-serve.sh +0 -0
  117. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/ralph-rewind.py +0 -0
  118. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/ralph.py +0 -0
  119. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/ralph.sh +0 -0
  120. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/session-start.py +0 -0
  121. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/sync-plugin-version.py +0 -0
  122. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/version-check.py +0 -0
  123. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/brownfield/SKILL.md +0 -0
  124. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/cancel/SKILL.md +0 -0
  125. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/evaluate/SKILL.md +0 -0
  126. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/evolve/SKILL.md +0 -0
  127. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/help/SKILL.md +0 -0
  128. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/interview/SKILL.md +0 -0
  129. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/openclaw/SKILL.md +0 -0
  130. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/pm/SKILL.md +0 -0
  131. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/publish/SKILL.md +0 -0
  132. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/qa/SKILL.md +0 -0
  133. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/ralph/SKILL.md +0 -0
  134. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/run/SKILL.md +0 -0
  135. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/seed/SKILL.md +0 -0
  136. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/setup/SKILL.md +0 -0
  137. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/status/SKILL.md +0 -0
  138. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/tutorial/SKILL.md +0 -0
  139. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/unstuck/SKILL.md +0 -0
  140. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/update/SKILL.md +0 -0
  141. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/welcome/SKILL.md +0 -0
  142. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/__init__.py +0 -0
  143. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/__main__.py +0 -0
  144. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/__init__.py +0 -0
  145. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/advocate.md +0 -0
  146. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/analysis-agent.md +0 -0
  147. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/architect.md +0 -0
  148. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/breadth-keeper.md +0 -0
  149. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/code-executor.md +0 -0
  150. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/codebase-explorer.md +0 -0
  151. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  152. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/contrarian.md +0 -0
  153. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/evaluator.md +0 -0
  154. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/hacker.md +0 -0
  155. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/judge.md +0 -0
  156. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/loader.py +0 -0
  157. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/ontologist.md +0 -0
  158. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/ontology-analyst.md +0 -0
  159. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/qa-judge.md +0 -0
  160. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/research-agent.md +0 -0
  161. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/researcher.md +0 -0
  162. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/seed-architect.md +0 -0
  163. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/seed-closer.md +0 -0
  164. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  165. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/simplifier.md +0 -0
  166. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  167. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/__init__.py +0 -0
  168. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/ambiguity.py +0 -0
  169. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/brownfield.py +0 -0
  170. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/explore.py +0 -0
  171. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/interview.py +0 -0
  172. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/pm_completion.py +0 -0
  173. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/pm_document.py +0 -0
  174. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/pm_interview.py +0 -0
  175. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/pm_seed.py +0 -0
  176. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/question_classifier.py +0 -0
  177. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/seed_generator.py +0 -0
  178. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/__init__.py +0 -0
  179. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/__init__.py +0 -0
  180. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/cancel.py +0 -0
  181. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/config.py +0 -0
  182. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/init.py +0 -0
  183. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/pm.py +0 -0
  184. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/run.py +0 -0
  185. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/setup.py +0 -0
  186. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/status.py +0 -0
  187. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/tui.py +0 -0
  188. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/uninstall.py +0 -0
  189. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/__init__.py +0 -0
  190. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/panels.py +0 -0
  191. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/progress.py +0 -0
  192. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/prompting.py +0 -0
  193. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/tables.py +0 -0
  194. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  195. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/jsonc.py +0 -0
  196. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/main.py +0 -0
  197. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/codex/__init__.py +0 -0
  198. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/codex/artifacts.py +0 -0
  199. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/codex/ouroboros.md +0 -0
  200. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/codex_permissions.py +0 -0
  201. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/config/__init__.py +0 -0
  202. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/config/loader.py +0 -0
  203. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/config/models.py +0 -0
  204. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/__init__.py +0 -0
  205. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/ac_tree.py +0 -0
  206. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/context.py +0 -0
  207. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/errors.py +0 -0
  208. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/file_lock.py +0 -0
  209. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/git_workflow.py +0 -0
  210. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/initial_context.py +0 -0
  211. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/json_utils.py +0 -0
  212. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/lineage.py +0 -0
  213. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/ontology_aspect.py +0 -0
  214. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/ontology_questions.py +0 -0
  215. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/project_paths.py +0 -0
  216. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/retry.py +0 -0
  217. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/security.py +0 -0
  218. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/seed.py +0 -0
  219. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/text.py +0 -0
  220. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/ttl_cache.py +0 -0
  221. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/types.py +0 -0
  222. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/worktree.py +0 -0
  223. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/__init__.py +0 -0
  224. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  225. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/consensus.py +0 -0
  226. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/json_utils.py +0 -0
  227. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/languages.py +0 -0
  228. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/mechanical.py +0 -0
  229. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/models.py +0 -0
  230. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/pipeline.py +0 -0
  231. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/semantic.py +0 -0
  232. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/trigger.py +0 -0
  233. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
  234. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/__init__.py +0 -0
  235. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/base.py +0 -0
  236. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/decomposition.py +0 -0
  237. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/evaluation.py +0 -0
  238. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/interview.py +0 -0
  239. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/lineage.py +0 -0
  240. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/ontology.py +0 -0
  241. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/__init__.py +0 -0
  242. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/convergence.py +0 -0
  243. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/loop.py +0 -0
  244. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/projector.py +0 -0
  245. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/reflect.py +0 -0
  246. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/regression.py +0 -0
  247. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/wonder.py +0 -0
  248. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/execution/__init__.py +0 -0
  249. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/execution/atomicity.py +0 -0
  250. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/execution/decomposition.py +0 -0
  251. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/execution/double_diamond.py +0 -0
  252. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/execution/subagent.py +0 -0
  253. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/__init__.py +0 -0
  254. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/bridge/__init__.py +0 -0
  255. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/bridge/bridge.py +0 -0
  256. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/bridge/config.py +0 -0
  257. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/bridge/factory.py +0 -0
  258. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/client/__init__.py +0 -0
  259. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/client/adapter.py +0 -0
  260. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/client/manager.py +0 -0
  261. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/client/protocol.py +0 -0
  262. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/errors.py +0 -0
  263. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/job_manager.py +0 -0
  264. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/resources/__init__.py +0 -0
  265. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/resources/handlers.py +0 -0
  266. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/server/__init__.py +0 -0
  267. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/server/protocol.py +0 -0
  268. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/server/security.py +0 -0
  269. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/__init__.py +0 -0
  270. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
  271. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
  272. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  273. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
  274. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  275. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  276. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  277. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  278. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
  279. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  280. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  281. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/qa.py +0 -0
  282. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  283. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/registry.py +0 -0
  284. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/types.py +0 -0
  285. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/observability/__init__.py +0 -0
  286. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/observability/drift.py +0 -0
  287. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/observability/logging.py +0 -0
  288. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/observability/retrospective.py +0 -0
  289. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/openclaw/__init__.py +0 -0
  290. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/openclaw/responses.py +0 -0
  291. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/openclaw/runtime.py +0 -0
  292. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/openclaw/workflow.py +0 -0
  293. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/__init__.py +0 -0
  294. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/adapter.py +0 -0
  295. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/capabilities.py +0 -0
  296. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  297. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  298. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/control_plane.py +0 -0
  299. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/coordinator.py +0 -0
  300. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  301. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/events.py +0 -0
  302. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  303. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  304. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  305. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/level_context.py +0 -0
  306. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  307. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  308. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
  309. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
  310. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  311. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  312. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/policy.py +0 -0
  313. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/runner.py +0 -0
  314. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  315. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  316. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/session.py +0 -0
  317. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  318. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/__init__.py +0 -0
  319. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/brownfield.py +0 -0
  320. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/checkpoint.py +0 -0
  321. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/event_store.py +0 -0
  322. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  323. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/migrations/runner.py +0 -0
  324. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  325. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  326. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/schema.py +0 -0
  327. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/uow.py +0 -0
  328. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/__init__.py +0 -0
  329. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/agents/__init__.py +0 -0
  330. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/agents/pool.py +0 -0
  331. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/agents/registry.py +0 -0
  332. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  333. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/orchestration/router.py +0 -0
  334. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  335. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/skills/__init__.py +0 -0
  336. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/skills/docs.py +0 -0
  337. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/skills/executor.py +0 -0
  338. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/skills/keywords.py +0 -0
  339. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/skills/registry.py +0 -0
  340. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/pm/__init__.py +0 -0
  341. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/pm/handoff.py +0 -0
  342. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/pm/renderer.py +0 -0
  343. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/__init__.py +0 -0
  344. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  345. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/base.py +0 -0
  346. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  347. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  348. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  349. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/factory.py +0 -0
  350. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
  351. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/litellm_adapter.py +0 -0
  352. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/opencode_adapter.py +0 -0
  353. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/py.typed +0 -0
  354. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/resilience/__init__.py +0 -0
  355. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/resilience/lateral.py +0 -0
  356. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/resilience/stagnation.py +0 -0
  357. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/__init__.py +0 -0
  358. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/complexity.py +0 -0
  359. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/downgrade.py +0 -0
  360. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/escalation.py +0 -0
  361. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/router.py +0 -0
  362. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/tiers.py +0 -0
  363. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/secondary/__init__.py +0 -0
  364. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/secondary/scheduler.py +0 -0
  365. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/secondary/todo_registry.py +0 -0
  366. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/strategies/__init__.py +0 -0
  367. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/strategies/devil_advocate.py +0 -0
  368. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/__init__.py +0 -0
  369. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/app.py +0 -0
  370. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/components/__init__.py +0 -0
  371. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/components/agents_panel.py +0 -0
  372. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/components/event_log.py +0 -0
  373. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/components/progress.py +0 -0
  374. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/components/token_tracker.py +0 -0
  375. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/events.py +0 -0
  376. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/__init__.py +0 -0
  377. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  378. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/dashboard.py +0 -0
  379. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  380. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  381. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/debug.py +0 -0
  382. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/execution.py +0 -0
  383. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  384. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  385. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  386. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/logs.py +0 -0
  387. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/session_selector.py +0 -0
  388. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/__init__.py +0 -0
  389. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  390. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  391. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  392. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  393. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  394. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  395. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  396. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  397. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/verification/__init__.py +0 -0
  398. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/verification/extractor.py +0 -0
  399. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/verification/models.py +0 -0
  400. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/verification/verifier.py +0 -0
  401. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/__init__.py +0 -0
  402. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/conftest.py +0 -0
  403. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/__init__.py +0 -0
  404. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/conftest.py +0 -0
  405. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
  406. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/test_cli_commands.py +0 -0
  407. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/test_full_workflow.py +0 -0
  408. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/test_session_persistence.py +0 -0
  409. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/fixtures/test_atomicity_seed.yml +0 -0
  410. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/__init__.py +0 -0
  411. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/conftest.py +0 -0
  412. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/__init__.py +0 -0
  413. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/bridge/__init__.py +0 -0
  414. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
  415. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/conftest.py +0 -0
  416. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/test_client_adapter.py +0 -0
  417. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/test_client_manager.py +0 -0
  418. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/plugin/test_orchestration.py +0 -0
  419. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  420. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/test_codex_skill_fallback.py +0 -0
  421. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/test_codex_skill_smoke.py +0 -0
  422. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/test_entry_point.py +0 -0
  423. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/__init__.py +0 -0
  424. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/agents/__init__.py +0 -0
  425. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/agents/test_loader.py +0 -0
  426. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/__init__.py +0 -0
  427. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_ambiguity.py +0 -0
  428. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_brownfield.py +0 -0
  429. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_classifier_context.py +0 -0
  430. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  431. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_explore.py +0 -0
  432. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_interview.py +0 -0
  433. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_interview_async_io.py +0 -0
  434. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
  435. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
  436. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_completion.py +0 -0
  437. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  438. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  439. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_interview.py +0 -0
  440. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  441. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  442. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  443. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_question_classifier.py +0 -0
  444. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_seed_generator.py +0 -0
  445. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/__init__.py +0 -0
  446. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/commands/test_tui_command.py +0 -0
  447. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/__init__.py +0 -0
  448. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_console.py +0 -0
  449. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_panels.py +0 -0
  450. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_progress.py +0 -0
  451. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_prompting.py +0 -0
  452. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_tables.py +0 -0
  453. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  454. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_cancel.py +0 -0
  455. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_config.py +0 -0
  456. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  457. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_init_runtime.py +0 -0
  458. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_jsonc.py +0 -0
  459. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_main.py +0 -0
  460. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  461. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  462. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm.py +0 -0
  463. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_brownfield.py +0 -0
  464. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_completion.py +0 -0
  465. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
  466. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
  467. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_overwrite.py +0 -0
  468. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
  469. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_select_repos.py +0 -0
  470. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_run_qa.py +0 -0
  471. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_setup.py +0 -0
  472. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_uninstall.py +0 -0
  473. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/config/__init__.py +0 -0
  474. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/config/test_loader.py +0 -0
  475. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/config/test_loader_env.py +0 -0
  476. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/config/test_models.py +0 -0
  477. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/__init__.py +0 -0
  478. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_ac_tree.py +0 -0
  479. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_context.py +0 -0
  480. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_errors.py +0 -0
  481. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_file_lock.py +0 -0
  482. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_git_workflow.py +0 -0
  483. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_initial_context.py +0 -0
  484. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_lineage.py +0 -0
  485. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_ontology_aspect.py +0 -0
  486. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_ontology_questions.py +0 -0
  487. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_retry.py +0 -0
  488. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_security.py +0 -0
  489. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_seed.py +0 -0
  490. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_ttl_cache.py +0 -0
  491. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_types.py +0 -0
  492. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_worktree.py +0 -0
  493. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/__init__.py +0 -0
  494. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
  495. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_consensus.py +0 -0
  496. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_json_utils.py +0 -0
  497. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_languages.py +0 -0
  498. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_mechanical.py +0 -0
  499. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_models.py +0 -0
  500. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
  501. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_review_fixes.py +0 -0
  502. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_semantic.py +0 -0
  503. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_trigger.py +0 -0
  504. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
  505. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
  506. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/events/__init__.py +0 -0
  507. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/events/test_base.py +0 -0
  508. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/events/test_decomposition_events.py +0 -0
  509. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evolution/test_wonder_scope.py +0 -0
  510. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/execution/__init__.py +0 -0
  511. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/execution/test_atomicity.py +0 -0
  512. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/execution/test_decomposition.py +0 -0
  513. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/execution/test_double_diamond.py +0 -0
  514. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/execution/test_subagent_isolation.py +0 -0
  515. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/__init__.py +0 -0
  516. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/__init__.py +0 -0
  517. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/test_bridge.py +0 -0
  518. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/test_config.py +0 -0
  519. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/test_factory.py +0 -0
  520. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
  521. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/test_stability.py +0 -0
  522. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/client/__init__.py +0 -0
  523. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/client/test_adapter.py +0 -0
  524. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
  525. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/client/test_manager.py +0 -0
  526. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/conftest.py +0 -0
  527. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/server/__init__.py +0 -0
  528. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/server/test_adapter.py +0 -0
  529. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/server/test_security.py +0 -0
  530. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/test_errors.py +0 -0
  531. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/test_job_manager.py +0 -0
  532. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/test_types.py +0 -0
  533. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/__init__.py +0 -0
  534. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/conftest.py +0 -0
  535. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
  536. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
  537. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
  538. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
  539. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
  540. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
  541. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
  542. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
  543. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
  544. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
  545. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
  546. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
  547. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  548. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_channel_workflow_handler.py +0 -0
  549. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_definitions.py +0 -0
  550. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_evaluation_handler.py +0 -0
  551. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_interview_parallel_scoring.py +0 -0
  552. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_interview_scoring_guard.py +0 -0
  553. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
  554. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  555. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
  556. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  557. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_qa_integration.py +0 -0
  558. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
  559. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_registry.py +0 -0
  560. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_traceback_reporting.py +0 -0
  561. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/observability/__init__.py +0 -0
  562. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/observability/test_drift.py +0 -0
  563. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/observability/test_logging.py +0 -0
  564. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/observability/test_retrospective.py +0 -0
  565. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/openclaw/test_workflow.py +0 -0
  566. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/__init__.py +0 -0
  567. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_adapter.py +0 -0
  568. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_capabilities.py +0 -0
  569. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  570. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  571. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  572. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_control_plane.py +0 -0
  573. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_coordinator.py +0 -0
  574. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  575. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_events.py +0 -0
  576. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  577. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  578. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  579. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_level_context.py +0 -0
  580. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  581. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  582. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
  583. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  584. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
  585. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
  586. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  587. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_policy.py +0 -0
  588. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_runner.py +0 -0
  589. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  590. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  591. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  592. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_session.py +0 -0
  593. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  594. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/__init__.py +0 -0
  595. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/test_brownfield_store.py +0 -0
  596. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/test_checkpoint.py +0 -0
  597. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/test_event_store.py +0 -0
  598. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/test_schema.py +0 -0
  599. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/test_uow.py +0 -0
  600. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/__init__.py +0 -0
  601. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/agents/__init__.py +0 -0
  602. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/agents/test_registry.py +0 -0
  603. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/orchestration/__init__.py +0 -0
  604. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  605. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/skills/__init__.py +0 -0
  606. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/skills/test_keywords.py +0 -0
  607. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/skills/test_registry.py +0 -0
  608. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/pm/__init__.py +0 -0
  609. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/pm/test_renderer.py +0 -0
  610. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/__init__.py +0 -0
  611. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_base.py +0 -0
  612. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  613. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  614. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_factory.py +0 -0
  615. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
  616. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_litellm_adapter.py +0 -0
  617. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_opencode_adapter.py +0 -0
  618. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/resilience/__init__.py +0 -0
  619. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/resilience/test_lateral.py +0 -0
  620. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/resilience/test_stagnation.py +0 -0
  621. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/__init__.py +0 -0
  622. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/test_complexity.py +0 -0
  623. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/test_downgrade.py +0 -0
  624. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/test_escalation.py +0 -0
  625. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/test_router.py +0 -0
  626. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/test_tiers.py +0 -0
  627. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/scripts/test_keyword_detector.py +0 -0
  628. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/scripts/test_session_start.py +0 -0
  629. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/scripts/test_version_check.py +0 -0
  630. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/secondary/__init__.py +0 -0
  631. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/secondary/test_scheduler.py +0 -0
  632. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/secondary/test_todo_registry.py +0 -0
  633. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_artifact_collector.py +0 -0
  634. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_codex_artifacts.py +0 -0
  635. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_convergence.py +0 -0
  636. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_dashboard.py +0 -0
  637. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_dependencies_configured.py +0 -0
  638. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_evolve_rewind.py +0 -0
  639. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_evolve_step.py +0 -0
  640. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_graceful_shutdown.py +0 -0
  641. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_main_entry_point.py +0 -0
  642. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_module_structure.py +0 -0
  643. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_project_initialization.py +0 -0
  644. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_projector_rewind.py +0 -0
  645. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_ralph_parser.py +0 -0
  646. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_ralph_rewind.py +0 -0
  647. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_regression.py +0 -0
  648. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_tooling_configuration.py +0 -0
  649. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_verification.py +0 -0
  650. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/__init__.py +0 -0
  651. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_app.py +0 -0
  652. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_cancelled_display.py +0 -0
  653. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_events.py +0 -0
  654. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_lineage_viewer.py +0 -0
  655. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_screens.py +0 -0
  656. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_session_selector_replay.py +0 -0
  657. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_widgets.py +0 -0
  658. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tools/sync_github_project.py +0 -0
  659. {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/uv.lock +0 -0
@@ -551,7 +551,7 @@ Changes under `src/ouroboros/orchestrator/` affect runtime behavior documentatio
551
551
  | `runtime_factory.py` | `docs/runtime-capability-matrix.md`, `docs/runtime-guides/claude-code.md`, `docs/runtime-guides/codex.md` — if a backend is added, removed, or changes its `NotImplementedError` status |
552
552
  | `adapter.py` (`ClaudeAgentAdapter`) | `docs/runtime-guides/claude-code.md` — permission modes, session flow |
553
553
  | `codex_cli_runtime.py` (`CodexCliRuntime`) | `docs/runtime-guides/codex.md` — permission modes, `--runtime codex` behavior |
554
- | `opencode_runtime.py` (`OpenCodeRuntime`) | `docs/runtime-capability-matrix.md` — mark `[Not yet available]` until `NotImplementedError` is removed; `docs/runtime-guides/` — create guide only when fully shipped |
554
+ | `opencode_runtime.py` (`OpenCodeRuntime`) | `docs/runtime-capability-matrix.md`, `docs/runtime-guides/opencode.md` — permission modes, `--runtime opencode` behavior |
555
555
  | `runner.py` (`OrchestratorRunner`) | `docs/architecture.md` — orchestration lifecycle; `docs/getting-started.md` — session ID output, resume flow |
556
556
  | `parallel_executor.py` | `docs/cli-reference.md` — `--sequential` flag behavior; `docs/architecture.md` — parallel execution strategy |
557
557
  | `coordinator.py` (`LevelCoordinator`) | `docs/architecture.md` — inter-level conflict resolution and coordinator review gate |
@@ -563,7 +563,7 @@ Changes under `src/ouroboros/orchestrator/` affect runtime behavior documentatio
563
563
  | `command_dispatcher.py` | `docs/architecture.md` — command dispatch model |
564
564
  | `level_context.py` | `docs/architecture.md` — level context description |
565
565
 
566
- **Runtime availability rule**: If `create_agent_runtime()` raises `NotImplementedError` for a backend, that backend **must not** appear in docs as a working option. Currently `opencode` is unimplemented — it must be marked `[Not yet available]` wherever documented.
566
+ **Runtime availability rule**: If `create_agent_runtime()` raises `NotImplementedError` for a backend, that backend **must not** appear in docs as a working option. All three backends (`claude`, `codex`, `opencode`) are fully implemented and documented.
567
567
 
568
568
  ---
569
569
 
@@ -703,7 +703,7 @@ To catch doc drift during development, reviewers should check:
703
703
 
704
704
  1. **Flag parity**: Run `ouroboros <cmd> --help` and compare every flag to `docs/cli-reference.md`. Any mismatch is a documentation bug.
705
705
  2. **Placeholder honesty**: If a command's implementation body is `# Placeholder implementation`, the corresponding doc entry must say `[Placeholder — not yet implemented]`.
706
- 3. **Runtime parity**: `claude` and `codex` are the only fully-implemented backends. Any doc that lists `opencode` without a `[Not yet available]` marker is incorrect.
706
+ 3. **Runtime parity**: `claude`, `codex`, and `opencode` are all fully-implemented backends. Any doc that lists a backend as available must have a corresponding runtime guide in `docs/runtime-guides/`.
707
707
  4. **Config key drift**: After any change to `src/ouroboros/config/models.py`, grep for the changed key name across `docs/` to find stale references.
708
708
  5. **TUI key bindings**: If `screens/*.py` `BINDINGS` arrays change, verify `docs/guides/tui-usage.md` reflects the new keys.
709
709
  6. **Skills registry drift**: If a new `skills/*.yaml` file is added, check that `docs/runtime-guides/codex.md` or the relevant guide mentions it.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.28.1.dev2
3
+ Version: 0.28.1.dev4
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
@@ -119,7 +119,7 @@ curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.
119
119
  > ooo interview "I want to build a task management CLI"
120
120
  ```
121
121
 
122
- > Works with Claude Code and Codex CLI. The installer detects your runtime, registers the MCP server, and installs skills automatically.
122
+ > Works with Claude Code, Codex CLI, and OpenCode. The installer detects Claude Code and Codex CLI automatically and registers the MCP server. For OpenCode, run `ouroboros setup --runtime opencode` after installation.
123
123
 
124
124
  <details>
125
125
  <summary><strong>Other install methods</strong></summary>
@@ -143,7 +143,7 @@ ouroboros setup # configure runtime
143
143
 
144
144
  Legacy compatibility: `ouroboros-ai[dashboard]` is still accepted as a compatibility alias while extras migrate.
145
145
 
146
- See runtime guides: [Claude Code](./docs/runtime-guides/claude-code.md) · [Codex CLI](./docs/runtime-guides/codex.md)
146
+ See runtime guides: [Claude Code](./docs/runtime-guides/claude-code.md) · [Codex CLI](./docs/runtime-guides/codex.md) · [OpenCode](./docs/runtime-guides/opencode.md)
147
147
 
148
148
  Chat platform integration (OpenClaw / Slack / Discord):
149
149
  ```bash
@@ -80,7 +80,7 @@ curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.
80
80
  > ooo interview "I want to build a task management CLI"
81
81
  ```
82
82
 
83
- > Works with Claude Code and Codex CLI. The installer detects your runtime, registers the MCP server, and installs skills automatically.
83
+ > Works with Claude Code, Codex CLI, and OpenCode. The installer detects Claude Code and Codex CLI automatically and registers the MCP server. For OpenCode, run `ouroboros setup --runtime opencode` after installation.
84
84
 
85
85
  <details>
86
86
  <summary><strong>Other install methods</strong></summary>
@@ -104,7 +104,7 @@ ouroboros setup # configure runtime
104
104
 
105
105
  Legacy compatibility: `ouroboros-ai[dashboard]` is still accepted as a compatibility alias while extras migrate.
106
106
 
107
- See runtime guides: [Claude Code](./docs/runtime-guides/claude-code.md) · [Codex CLI](./docs/runtime-guides/codex.md)
107
+ See runtime guides: [Claude Code](./docs/runtime-guides/claude-code.md) · [Codex CLI](./docs/runtime-guides/codex.md) · [OpenCode](./docs/runtime-guides/opencode.md)
108
108
 
109
109
  Chat platform integration (OpenClaw / Slack / Discord):
110
110
  ```bash
@@ -1,6 +1,6 @@
1
1
  <!--
2
2
  doc_metadata:
3
- runtime_scope: [local, claude, codex]
3
+ runtime_scope: [local, claude, codex, opencode]
4
4
  -->
5
5
 
6
6
  # Configuration Reference
@@ -537,6 +537,23 @@ consensus:
537
537
 
538
538
  This is the recommended Ouroboros-side pattern for Codex users. Keep `~/.codex/config.toml` limited to the MCP/env block created by setup.
539
539
 
540
+ ### OpenCode Runtime
541
+
542
+ ```yaml
543
+ # ~/.ouroboros/config.yaml
544
+ orchestrator:
545
+ runtime_backend: opencode
546
+ opencode_cli_path: /usr/local/bin/opencode # omit if opencode is already on PATH
547
+
548
+ llm:
549
+ backend: opencode
550
+
551
+ logging:
552
+ level: info
553
+ ```
554
+
555
+ OpenCode supports multiple model providers (Anthropic, OpenAI, Google, and others). Model selection is configured in OpenCode itself (`~/.config/opencode/opencode.json`), not in `config.yaml`. The `orchestrator.opencode_permission_mode` defaults to `bypassPermissions` since OpenCode runs non-interactively via `opencode run --format json`. The `llm.opencode_permission_mode` defaults to `acceptEdits`, but the factory forces `bypassPermissions` for interview/seed use cases to avoid CLI sandbox blocking.
556
+
540
557
  ### Full Config Skeleton
541
558
 
542
559
  ```yaml
@@ -630,7 +630,7 @@ findings:
630
630
  - docs/guides/cli-usage.md
631
631
  code_deps:
632
632
  - src/ouroboros/cli/commands/setup.py
633
- resolution_ref: "cli-audit-findings.md#F-12; fixed in this generation"
633
+ resolution_ref: "cli-audit-findings.md#F-12; fixed in this generation. OpenCode runtime fully implemented in PR #324."
634
634
 
635
635
  - id: FIND-025
636
636
  claim_id: CLM-025
@@ -870,7 +870,8 @@ findings:
870
870
  resolution_ref: >-
871
871
  runtime-capability-crosscheck.md#Sec2;
872
872
  fix: "(opencode is in the CLI enum but out of scope)" note added to all
873
- --runtime/--llm-backend option descriptions in cli-reference.md
873
+ --runtime/--llm-backend option descriptions in cli-reference.md.
874
+ OpenCode runtime fully implemented in PR #324 — out-of-scope notes no longer apply.
874
875
 
875
876
  - id: FIND-040
876
877
  claim_id: CLM-040
@@ -115,7 +115,7 @@ uv run ouroboros --version # verify CLI
115
115
  | Claude Code (`ooo`) | Claude Code with plugin support |
116
116
  | Standalone CLI (`ouroboros`) | Python >= 3.12, API key (Anthropic or OpenAI) |
117
117
  | Codex CLI backend | Python >= 3.12, `npm install -g @openai/codex`, OpenAI API key with access to GPT-5.4 |
118
- | OpenCode backend | Python >= 3.12, `opencode` on PATH, API key for your configured provider |
118
+ | OpenCode backend | Python >= 3.12, `opencode` on PATH, provider configured in OpenCode |
119
119
 
120
120
  ---
121
121
 
@@ -198,7 +198,7 @@ Inside a Claude Code session:
198
198
  ooo interview "I want to build a personal finance tracker"
199
199
  ```
200
200
 
201
- > **CLI note:** The standalone CLI does not have an `interview` command. Use `ooo interview` inside Claude Code, or use MCP tools to run interviews.
201
+ > **CLI note:** You can also run interviews from the terminal with `ouroboros init start --llm-backend <backend> "your idea"` (where `<backend>` is `claude_code`, `codex`, `opencode`, or `litellm`). For in-agent `ooo interview` usage: Claude Code works out-of-the-box; Codex CLI and OpenCode require `ouroboros setup --runtime <codex|opencode>` first to register the MCP server.
202
202
 
203
203
  The Socratic Interviewer asks clarifying questions:
204
204
  - "What platforms do you want to track?" (Bank accounts, credit cards, investments)
@@ -289,7 +289,7 @@ ooo interview "Add real-time notifications to the chat app"
289
289
  ooo run
290
290
  ```
291
291
 
292
- > **Terminal users:** The standalone CLI does not have an `interview` command. Generate seeds via `ooo interview` in Claude Code or via MCP tools, then run with `ouroboros run <seed_file>`.
292
+ > **Terminal users:** Run interviews from the terminal with `ouroboros init start --llm-backend <backend> "your idea"`, then execute with `ouroboros run workflow <seed_file>`. (Separate from in-agent `ooo` usage; terminal flows don't require MCP registration.)
293
293
 
294
294
  ---
295
295
 
@@ -91,7 +91,7 @@ The runtime backend affects:
91
91
 
92
92
  ## Choosing a Runtime
93
93
 
94
- The table below covers the two currently shipped backends. Because Ouroboros uses a pluggable `AgentRuntime` protocol, teams can register additional backends without modifying the core engine.
94
+ The table below covers the three currently shipped backends. Because Ouroboros uses a pluggable `AgentRuntime` protocol, teams can register additional backends without modifying the core engine.
95
95
 
96
96
  | If you... | Consider |
97
97
  |-----------|----------|
@@ -125,11 +125,11 @@ After running `ouroboros setup --runtime codex`, the bundled `ooo` skills are in
125
125
  | `ooo interview` | Yes | `ouroboros init start --llm-backend codex "your idea"` |
126
126
  | `ooo seed` | Yes | *(bundled in `ouroboros init start`)* |
127
127
  | `ooo run` | Yes | `ouroboros run workflow --runtime codex seed.yaml` |
128
- | `ooo status` | Yes | `ouroboros status execution <session_id>` |
128
+ | `ooo status` | Yes | `ouroboros status execution <execution_id>` |
129
129
  | `ooo evaluate` | Yes | *(MCP only)* |
130
130
  | `ooo evolve` | Yes | *(MCP only)* |
131
131
  | `ooo ralph` | Yes | *(MCP only)* |
132
- | `ooo cancel` | Yes | `ouroboros cancel execution <session_id>` |
132
+ | `ooo cancel` | Yes | `ouroboros cancel execution <execution_id>` |
133
133
  | `ooo unstuck` | Yes | *(MCP only)* |
134
134
  | `ooo tutorial` | Yes | *(MCP only)* |
135
135
  | `ooo welcome` | Yes | *(MCP only)* |
@@ -0,0 +1,284 @@
1
+ <!--
2
+ doc_metadata:
3
+ runtime_scope: [opencode]
4
+ -->
5
+
6
+ # Running Ouroboros with OpenCode
7
+
8
+ > For installation and first-run onboarding, see [Getting Started](../getting-started.md).
9
+
10
+ Ouroboros can use **OpenCode** as a runtime backend. [OpenCode](https://opencode.ai) is an open-source AI coding agent that supports multiple model providers (Anthropic, OpenAI, Google, and others) through its own provider management. In Ouroboros, the OpenCode backend is presented as a **session-oriented runtime** with the same specification-first workflow harness (acceptance criteria, evaluation principles, deterministic exit conditions).
11
+
12
+ No additional Python SDK is required beyond the base `ouroboros-ai` package.
13
+
14
+ > **Model recommendation:** OpenCode supports any model available through your configured provider. For best results with Ouroboros workflows, use a frontier-class model (Claude Opus, GPT-5.4, or equivalent) that handles multi-step agentic coding tasks well.
15
+
16
+ ## Prerequisites
17
+
18
+ - **OpenCode** installed, configured, and on your `PATH` (see [install steps](#installing-opencode) below)
19
+ - A **provider configured in OpenCode** (run `opencode` and complete the first-run setup, or use `opencode providers auth <provider>`)
20
+ - **Python >= 3.12**
21
+
22
+ > **Note:** OpenCode manages its own provider authentication. You do not need to set `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` environment variables for Ouroboros — OpenCode handles provider credentials internally via its own configuration at `~/.config/opencode/opencode.json`.
23
+
24
+ ## Installing OpenCode
25
+
26
+ OpenCode is distributed as a standalone binary. Install via the official installer script or npm:
27
+
28
+ ```bash
29
+ # Recommended: official installer
30
+ curl -fsSL https://opencode.ai/install | bash
31
+
32
+ # Alternative: npm
33
+ npm i -g opencode-ai@latest
34
+ ```
35
+
36
+ Verify the installation:
37
+
38
+ ```bash
39
+ opencode --version
40
+ ```
41
+
42
+ After install, run `opencode` once to complete first-run provider setup (select a provider and authenticate).
43
+
44
+ For alternative install methods, see the [OpenCode documentation](https://opencode.ai/docs).
45
+
46
+ ## Installing Ouroboros
47
+
48
+ > For all installation options (pip, one-liner, from source) and first-run onboarding, see **[Getting Started](../getting-started.md)**.
49
+ > The base `ouroboros-ai` package includes the OpenCode runtime adapter — no extras are required.
50
+
51
+ ## Platform Notes
52
+
53
+ The OpenCode runtime adapter has been developed and tested on Linux. Other platforms may work but have not been verified with the Ouroboros integration.
54
+
55
+ | Platform | Status | Notes |
56
+ |----------|--------|-------|
57
+ | Linux (x86_64/ARM64) | Tested | Primary development and testing platform |
58
+ | macOS (ARM/Intel) | Untested | Expected to work — OpenCode supports macOS natively |
59
+ | Windows (WSL 2) | Untested | Expected to work via WSL 2 — not verified with Ouroboros |
60
+ | Windows (native) | Untested | Not recommended — subprocess and path handling may have issues |
61
+
62
+ > If you test on macOS or Windows and encounter issues, please report them.
63
+
64
+ ## Configuration
65
+
66
+ To select OpenCode as the runtime backend, set the following in your Ouroboros configuration:
67
+
68
+ ```yaml
69
+ orchestrator:
70
+ runtime_backend: opencode
71
+ ```
72
+
73
+ Or pass the backend on the command line:
74
+
75
+ ```bash
76
+ uv run ouroboros run workflow --runtime opencode ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
77
+ ```
78
+
79
+ ### Where OpenCode users configure what
80
+
81
+ Use `~/.ouroboros/config.yaml` for Ouroboros runtime settings (backend selection, permission mode, CLI path).
82
+
83
+ Use `~/.config/opencode/opencode.json` (OpenCode's own config) for provider/model selection, MCP servers, and tool permissions. `ouroboros setup --runtime opencode` writes the Ouroboros MCP server entry into this file automatically.
84
+
85
+ ```yaml
86
+ # ~/.ouroboros/config.yaml
87
+ orchestrator:
88
+ runtime_backend: opencode
89
+ opencode_cli_path: /usr/local/bin/opencode # omit if opencode is already on PATH
90
+
91
+ llm:
92
+ backend: opencode
93
+ ```
94
+
95
+ Model selection for OpenCode-backed workflows is configured in OpenCode itself, not in `config.yaml`. The `orchestrator.opencode_permission_mode` defaults to `bypassPermissions` since OpenCode runs non-interactively via `opencode run --format json`.
96
+
97
+ ### Setup
98
+
99
+ Run the setup command to auto-configure:
100
+
101
+ ```bash
102
+ ouroboros setup --runtime opencode
103
+ ```
104
+
105
+ This:
106
+
107
+ - Detects the `opencode` binary on your `PATH` and records it as `orchestrator.opencode_cli_path`
108
+ - Writes `orchestrator.runtime_backend: opencode` and `llm.backend: opencode` to `~/.ouroboros/config.yaml`
109
+ - Registers the Ouroboros MCP server in OpenCode's configuration file (`~/.config/opencode/opencode.json`). Note: The setup process rewrites the file as plain JSON and removes comments (the file supports JSONC format initially, but setup normalizes to JSON for compatibility).
110
+
111
+ ### `ooo` Skill Availability on OpenCode
112
+
113
+ After running `ouroboros setup --runtime opencode`, the Ouroboros MCP server is registered in OpenCode's config. The `ooo` skills are available via MCP tool dispatch within OpenCode sessions.
114
+
115
+ | `ooo` Skill | OpenCode session | CLI equivalent (Terminal) |
116
+ |-------------|------------------|--------------------------|
117
+ | `ooo interview` | Yes | `ouroboros init start --llm-backend opencode "your idea"` |
118
+ | `ooo seed` | Yes | *(bundled in `ouroboros init start`)* |
119
+ | `ooo run` | Yes | `ouroboros run workflow --runtime opencode seed.yaml` |
120
+ | `ooo status` | Yes | `ouroboros status execution <execution_id>` |
121
+ | `ooo evaluate` | Yes | *(MCP only)* |
122
+ | `ooo evolve` | Yes | *(MCP only)* |
123
+ | `ooo ralph` | Yes | *(MCP only)* |
124
+ | `ooo cancel` | Yes | `ouroboros cancel execution <execution_id>` |
125
+ | `ooo unstuck` | Yes | *(MCP only)* |
126
+ | `ooo tutorial` | Yes | *(MCP only)* |
127
+ | `ooo welcome` | Yes | *(MCP only)* |
128
+ | `ooo update` | Yes | `pip install --upgrade ouroboros-ai` |
129
+ | `ooo help` | Yes | `ouroboros --help` |
130
+ | `ooo qa` | Yes | *(MCP only)* |
131
+ | `ooo setup` | Yes | `ouroboros setup --runtime opencode` |
132
+ | `ooo publish` | Yes | *(no direct `ouroboros publish` subcommand; skill/runtime flow uses `gh` CLI)* |
133
+
134
+ > **Note on `ooo seed` vs `ooo interview`:** These are two distinct skills with separate roles. `ooo interview` runs a Socratic Q&A session and returns a `session_id`. `ooo seed` accepts that `session_id` and generates a structured Seed YAML (with ambiguity scoring). From the terminal, both steps are performed in a single `ouroboros init start` invocation.
135
+
136
+ ## Quick Start
137
+
138
+ > For the full first-run onboarding flow (interview -> seed -> execute), see **[Getting Started](../getting-started.md)**.
139
+
140
+ ### Verify Installation
141
+
142
+ ```bash
143
+ opencode --version
144
+ ouroboros --help
145
+ ```
146
+
147
+ ## How It Works
148
+
149
+ ```
150
+ +-----------------+ +------------------+ +-----------------+
151
+ | Seed YAML | --> | Orchestrator | --> | OpenCode |
152
+ | (your task) | | (runtime_factory)| | (runtime) |
153
+ +-----------------+ +------------------+ +-----------------+
154
+ |
155
+ v
156
+ +------------------+
157
+ | Tools Available |
158
+ | - Read |
159
+ | - Write |
160
+ | - Edit |
161
+ | - Bash |
162
+ | - Glob |
163
+ | - Grep |
164
+ +------------------+
165
+ ```
166
+
167
+ The `OpenCodeRuntime` adapter launches `opencode run --format json` as a subprocess for each task execution. The orchestrator pipes the prompt via stdin and parses the structured JSON event stream from stdout.
168
+
169
+ > For a side-by-side comparison of all runtime backends, see the [runtime capability matrix](../runtime-capability-matrix.md).
170
+
171
+ ## OpenCode-Specific Strengths
172
+
173
+ - **Multi-provider support** -- use Anthropic, OpenAI, Google, or other providers through a single runtime
174
+ - **Built-in provider management** -- OpenCode handles its own authentication and provider configuration, no env var setup required
175
+ - **Rich tool access** -- full suite of file, shell, and search tools (same surface as Claude Code)
176
+ - **Native MCP integration** -- OpenCode has built-in MCP server support
177
+ - **Open-source** -- fully open-source, allowing inspection and contribution
178
+ - **Session-aware runtime** -- Ouroboros preserves OpenCode session handles and resume state across workflow steps via `--session` flag
179
+
180
+ ## Runtime Differences
181
+
182
+ OpenCode, Claude Code, and Codex CLI are independent runtime backends with different tool sets, permission models, and provider ecosystems. The same Seed file works with all three, but execution paths may differ.
183
+
184
+ | Aspect | OpenCode | Claude Code | Codex CLI |
185
+ |--------|----------|-------------|-----------|
186
+ | What it is | Ouroboros session runtime backed by OpenCode subprocess | Anthropic's agentic coding tool | Ouroboros session runtime backed by Codex CLI transport |
187
+ | Authentication | Managed by OpenCode (`opencode providers auth`) | Max Plan subscription | OpenAI API key |
188
+ | Model | Any model supported by configured provider | Claude (via claude-agent-sdk) | GPT-5.4 with medium reasoning effort (recommended) |
189
+ | Tool surface | Read, Write, Edit, Bash, Glob, Grep | Read, Write, Edit, Bash, Glob, Grep | Codex-native tools (file I/O, shell) |
190
+ | Session model | Session-aware via `--session` flag and runtime handles | Native Claude session context | Session-aware via runtime handles, resume IDs, and skill dispatch |
191
+ | Transport | Subprocess (`opencode run --format json`), prompt via stdin | Claude Agent SDK (direct API) | Subprocess (`codex` executable) |
192
+ | Cost model | Provider API usage charges | Included in Max Plan subscription | OpenAI API usage charges |
193
+ | Tested platforms | Linux | Linux, macOS | Linux, macOS |
194
+
195
+ > **Note:** The Ouroboros workflow model (Seed files, acceptance criteria, evaluation principles) is identical across runtimes. However, because OpenCode, Claude Code, and Codex CLI have different underlying agent capabilities, tool access, and provider ecosystems, they may produce different execution paths and results for the same Seed file.
196
+
197
+ ## CLI Options
198
+
199
+ ### Workflow Commands
200
+
201
+ ```bash
202
+ # Execute workflow (OpenCode runtime)
203
+ # Seeds generated by ouroboros init are saved to ~/.ouroboros/seeds/seed_{id}.yaml
204
+ uv run ouroboros run workflow --runtime opencode ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
205
+
206
+ # Debug output (show logs and agent output)
207
+ uv run ouroboros run workflow --runtime opencode --debug ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
208
+
209
+ # Resume a previous session
210
+ uv run ouroboros run workflow --runtime opencode --resume <session_id> ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
211
+ ```
212
+
213
+ ## Seed File Reference
214
+
215
+ | Field | Required | Description |
216
+ |-------|----------|-------------|
217
+ | `goal` | Yes | Primary objective |
218
+ | `task_type` | No | Execution strategy: `code` (default), `research`, or `analysis` |
219
+ | `constraints` | No | Hard constraints to satisfy |
220
+ | `acceptance_criteria` | No | Specific success criteria |
221
+ | `ontology_schema` | Yes | Output structure definition |
222
+ | `evaluation_principles` | No | Principles for evaluation |
223
+ | `exit_conditions` | No | Termination conditions |
224
+ | `metadata.ambiguity_score` | Yes | Must be <= 0.2 |
225
+
226
+ ## Known Limitations
227
+
228
+ ### Session pollution
229
+
230
+ Each task execution via `opencode run` creates a visible session in OpenCode's session history. Long-running workflows with many orchestrator steps will accumulate sessions. A future phase will reparent these sessions under the caller to prevent polluting the session picker (see [#331](https://github.com/Q00/ouroboros/issues/331)).
231
+
232
+ ### No interactive mode
233
+
234
+ The adapter uses `opencode run --format json` (non-interactive). Features that require interactive OpenCode sessions (e.g., manual approval prompts) are not available during Ouroboros execution.
235
+
236
+ ### Permission mode not wired to CLI
237
+
238
+ OpenCode's `opencode run` command does not expose a `--permission-mode` flag. The `opencode_permission_mode` config value is stored for forward compatibility but is not currently passed to the subprocess. OpenCode runs non-interactively by default, so there is no approval dialogue to bypass.
239
+
240
+ ## Troubleshooting
241
+
242
+ ### OpenCode not found
243
+
244
+ Ensure `opencode` is installed and available on your `PATH`:
245
+
246
+ ```bash
247
+ which opencode
248
+ ```
249
+
250
+ If not installed:
251
+
252
+ ```bash
253
+ curl -fsSL https://opencode.ai/install | bash
254
+ ```
255
+
256
+ ### Provider not configured
257
+
258
+ If OpenCode reports a provider error, ensure you have completed first-run setup:
259
+
260
+ ```bash
261
+ opencode # interactive first-run setup
262
+ # or
263
+ opencode providers auth anthropic # configure a specific provider
264
+ ```
265
+
266
+ OpenCode manages its own provider credentials — you do not need to set `ANTHROPIC_API_KEY` or similar environment variables for the Ouroboros integration.
267
+
268
+ ### "Providers: warning" in health check
269
+
270
+ This is normal when using the orchestrator runtime backends. The warning refers to LiteLLM providers, which are not used in orchestrator mode.
271
+
272
+ ### "EventStore not initialized"
273
+
274
+ The database will be created automatically at `~/.ouroboros/ouroboros.db`.
275
+
276
+ ## Cost
277
+
278
+ Using OpenCode as the runtime backend incurs API charges from your configured provider. Costs depend on:
279
+
280
+ - Provider and model selected in OpenCode's configuration
281
+ - Task complexity and token usage
282
+ - Number of tool calls and iterations
283
+
284
+ Refer to your provider's pricing page for current rates.
@@ -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.28.1.dev2'
22
- __version_tuple__ = version_tuple = (0, 28, 1, 'dev2')
21
+ __version__ = version = '0.28.1.dev4'
22
+ __version_tuple__ = version_tuple = (0, 28, 1, 'dev4')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -7,8 +7,11 @@ from __future__ import annotations
7
7
 
8
8
  import asyncio
9
9
  from enum import Enum
10
+ import json
10
11
  import os
11
12
  from pathlib import Path
13
+ import subprocess
14
+ import sys
12
15
  from typing import Annotated
13
16
 
14
17
  from rich.console import Console
@@ -98,6 +101,60 @@ def _check_stale_instance() -> bool:
98
101
  return True
99
102
 
100
103
 
104
+ def _ensure_shell_env(*, timeout: float = 10.0) -> None:
105
+ """Load login-shell environment when launched outside a login shell.
106
+
107
+ When a gateway process (e.g., OpenClaw) spawns ``ouroboros mcp serve``,
108
+ the child inherits only a minimal environment. This sources the user's
109
+ shell profile to recover PATH, ANTHROPIC_API_KEY, etc.
110
+
111
+ Uses JSON serialization to avoid multiline env value parsing issues.
112
+ Avoids the ``-i`` (interactive) flag which hangs on oh-my-zsh/p10k.
113
+ """
114
+ # Fast path: if key indicators are already present, skip
115
+ if os.environ.get("ANTHROPIC_API_KEY"):
116
+ return
117
+
118
+ shell = os.environ.get("SHELL", "/bin/zsh" if sys.platform == "darwin" else "/bin/bash")
119
+ shell_name = Path(shell).name
120
+
121
+ # Dump env as JSON — unambiguous, handles multiline values
122
+ dump_cmd = 'python3 -c "import os,json,sys; json.dump(dict(os.environ), sys.stdout)"'
123
+
124
+ if shell_name == "zsh":
125
+ cmd = [shell, "-l", "-c", f"[[ -f ~/.zshrc ]] && source ~/.zshrc 2>/dev/null; {dump_cmd}"]
126
+ elif shell_name == "bash":
127
+ cmd = [shell, "-l", "-c", f"[[ -f ~/.bashrc ]] && source ~/.bashrc 2>/dev/null; {dump_cmd}"]
128
+ else:
129
+ cmd = [shell, "-l", "-c", dump_cmd]
130
+
131
+ try:
132
+ result = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
133
+ except (FileNotFoundError, subprocess.TimeoutExpired, OSError) as e:
134
+ _stderr_console.print(f"[yellow]Warning: shell env load failed: {e}[/yellow]")
135
+ return
136
+
137
+ if result.returncode != 0:
138
+ return
139
+
140
+ try:
141
+ env = json.loads(result.stdout)
142
+ except json.JSONDecodeError:
143
+ _stderr_console.print("[yellow]Warning: could not parse shell env output[/yellow]")
144
+ return
145
+
146
+ current_path_dirs = set(os.environ.get("PATH", "").split(os.pathsep))
147
+ for key, val in env.items():
148
+ if key == "PATH":
149
+ new_dirs = [d for d in val.split(os.pathsep) if d and d not in current_path_dirs]
150
+ if new_dirs:
151
+ os.environ["PATH"] = (
152
+ os.pathsep.join(new_dirs) + os.pathsep + os.environ.get("PATH", "")
153
+ )
154
+ elif key not in os.environ:
155
+ os.environ[key] = val
156
+
157
+
101
158
  app = typer.Typer(
102
159
  name="mcp",
103
160
  help="MCP (Model Context Protocol) server commands.",
@@ -123,6 +180,9 @@ async def _run_mcp_server(
123
180
  runtime_backend: Optional orchestrator runtime backend override.
124
181
  llm_backend: Optional LLM-only backend override.
125
182
  """
183
+ # Ensure login-shell environment is available (critical for gateway-spawned processes)
184
+ _ensure_shell_env()
185
+
126
186
  from ouroboros.mcp.server.adapter import create_ouroboros_server, validate_transport
127
187
  from ouroboros.orchestrator.session import SessionRepository
128
188
  from ouroboros.persistence.event_store import EventStore
@@ -1257,7 +1257,8 @@ def create_ouroboros_server(
1257
1257
  validator=_evolution_validator,
1258
1258
  )
1259
1259
  job_manager = JobManager(event_store)
1260
- openclaw_db_path = state_dir / "openclaw.db"
1260
+ cwd = Path.cwd()
1261
+ openclaw_db_path = Path.home() / ".ouroboros" / "ouroboros.db"
1261
1262
  workflow_manager = ChannelWorkflowManager(openclaw_db_path)
1262
1263
  repo_registry = ChannelRepoRegistry(openclaw_db_path)
1263
1264
 
@@ -1327,6 +1328,7 @@ def create_ouroboros_server(
1327
1328
  ChannelWorkflowHandler(
1328
1329
  workflow_manager=workflow_manager,
1329
1330
  repo_registry=repo_registry,
1331
+ default_repo=str(cwd) if str(cwd) != "/" else None,
1330
1332
  interview_handler=InterviewHandler(
1331
1333
  interview_engine=interview_engine,
1332
1334
  event_store=event_store,
@@ -44,6 +44,7 @@ class ChannelWorkflowHandler:
44
44
  job_status_handler: JobStatusHandler | None = field(default=None, repr=False)
45
45
  job_wait_handler: JobWaitHandler | None = field(default=None, repr=False)
46
46
  job_result_handler: JobResultHandler | None = field(default=None, repr=False)
47
+ default_repo: str | None = field(default=None, repr=False)
47
48
 
48
49
  def __post_init__(self) -> None:
49
50
  self._workflow_manager = self.workflow_manager or ChannelWorkflowManager()
@@ -348,6 +349,7 @@ class ChannelWorkflowHandler:
348
349
  arguments.get("repo")
349
350
  or self._repo_registry.get(channel)
350
351
  or (active.repo if active else None)
352
+ or self.default_repo
351
353
  )
352
354
  if not isinstance(repo, str) or not repo.strip():
353
355
  return Result.err(
@@ -152,6 +152,7 @@ def channel_workflow_handler(
152
152
  job_wait_handler: JobWaitHandler | None = None,
153
153
  job_status_handler: JobStatusHandler | None = None,
154
154
  job_result_handler: JobResultHandler | None = None,
155
+ default_repo: str | None = None,
155
156
  ) -> ChannelWorkflowHandler:
156
157
  """Create a ChannelWorkflowHandler instance.
157
158
 
@@ -171,6 +172,7 @@ def channel_workflow_handler(
171
172
  job_wait_handler=job_wait_handler or JobWaitHandler(),
172
173
  job_status_handler=job_status_handler or JobStatusHandler(),
173
174
  job_result_handler=job_result_handler or JobResultHandler(),
175
+ default_repo=default_repo,
174
176
  )
175
177
 
176
178
 
@@ -11,7 +11,7 @@ from typing import Any
11
11
 
12
12
  def default_openclaw_db_path() -> Path:
13
13
  """Return the default SQLite database path for OpenClaw workflow state."""
14
- return Path.cwd() / ".ouroboros" / "openclaw.db"
14
+ return Path.home() / ".ouroboros" / "ouroboros.db"
15
15
 
16
16
 
17
17
  class OpenClawStateStore:
@@ -590,7 +590,7 @@ class TestCreateOuroborosServer:
590
590
  assert status_result.is_ok
591
591
  assert "Channel Workflow Summary" in status_result.value.text_content
592
592
  assert str(tmp_path / "repo") in status_result.value.text_content
593
- assert (tmp_path / "data" / "openclaw.db").exists()
593
+ assert (Path.home() / ".ouroboros" / "ouroboros.db").exists()
594
594
 
595
595
 
596
596
  class TestMCPServerAdapterConcurrency: