ouroboros-ai 0.31.2.dev13__tar.gz → 0.31.2.dev14__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 (737) hide show
  1. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/PKG-INFO +1 -1
  2. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/cli-reference.md +19 -3
  3. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/getting-started.md +1 -1
  4. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-guides/codex.md +3 -3
  5. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/_version.py +2 -2
  6. ouroboros_ai-0.31.2.dev14/src/ouroboros/cli/commands/codex.py +35 -0
  7. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/setup.py +67 -16
  8. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/uninstall.py +30 -8
  9. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/main.py +2 -0
  10. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/codex/__init__.py +4 -0
  11. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/codex/artifacts.py +25 -0
  12. ouroboros_ai-0.31.2.dev14/tests/unit/cli/test_codex_command.py +40 -0
  13. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_setup.py +76 -5
  14. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_uninstall.py +31 -0
  15. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.claude/settings.json +0 -0
  16. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.claude-plugin/.mcp.json +0 -0
  17. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.claude-plugin/marketplace.json +0 -0
  18. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.claude-plugin/plugin.json +0 -0
  19. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.env.example +0 -0
  20. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  21. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  22. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  23. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  24. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/workflows/dev-publish.yml +0 -0
  25. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/workflows/lint.yml +0 -0
  26. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/workflows/release.yml +0 -0
  27. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/workflows/test.yml +0 -0
  28. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.gitignore +0 -0
  29. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.mcp.json +0 -0
  30. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.ouroboros/mechanical.toml +0 -0
  31. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
  32. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
  33. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.pre-commit-config.yaml +0 -0
  34. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.python-version +0 -0
  35. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/CHANGELOG.md +0 -0
  36. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/CLAUDE.md +0 -0
  37. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/CODE_OF_CONDUCT.md +0 -0
  38. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/CONTRIBUTING.md +0 -0
  39. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/Code-Review-Claude.md +0 -0
  40. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/Code-Review-Codex.md +0 -0
  41. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/HANDOFF.md +0 -0
  42. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/LICENSE +0 -0
  43. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/README.ko.md +0 -0
  44. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/README.md +0 -0
  45. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/SECURITY.md +0 -0
  46. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/UNINSTALL.md +0 -0
  47. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/cancel.md +0 -0
  48. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/evaluate.md +0 -0
  49. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/evolve.md +0 -0
  50. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/help.md +0 -0
  51. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/interview.md +0 -0
  52. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/ralph.md +0 -0
  53. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/run.md +0 -0
  54. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/seed.md +0 -0
  55. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/setup.md +0 -0
  56. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/status.md +0 -0
  57. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/tutorial.md +0 -0
  58. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/unstuck.md +0 -0
  59. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/welcome.md +0 -0
  60. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/.gitignore +0 -0
  61. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/Cargo.lock +0 -0
  62. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/Cargo.toml +0 -0
  63. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/README.md +0 -0
  64. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/db.rs +0 -0
  65. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/main.rs +0 -0
  66. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/mock.rs +0 -0
  67. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/state.rs +0 -0
  68. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  69. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  70. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  71. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  72. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  73. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  74. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/README.md +0 -0
  75. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/api/README.md +0 -0
  76. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/api/core.md +0 -0
  77. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/api/mcp.md +0 -0
  78. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/architecture.md +0 -0
  79. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/config-reference.md +0 -0
  80. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/agent-os-kernel-terminology.md +0 -0
  81. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/architecture-overview.md +0 -0
  82. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/findings-registry.md +0 -0
  83. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/issue-quality-policy.md +0 -0
  84. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/key-patterns.md +0 -0
  85. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/testing-guide.md +0 -0
  86. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/events.md +0 -0
  87. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/examples/mcp-config.yaml +0 -0
  88. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/examples/workflows/design-code-verify.md +0 -0
  89. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/examples/workflows/research-to-deliverable.md +0 -0
  90. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/evaluation-pipeline.md +0 -0
  91. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/evolution-loop.md +0 -0
  92. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  93. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/mcp-best-practices.md +0 -0
  94. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/mcp-bridge.md +0 -0
  95. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/ooo-skill-dispatch-router.md +0 -0
  96. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/opencode-subagent-bridge.md +0 -0
  97. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/qa-backends.md +0 -0
  98. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/seed-authoring.md +0 -0
  99. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/tui-usage.md +0 -0
  100. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/images/PLACEHOLDER_README.md +0 -0
  101. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/images/ouroboros.png +0 -0
  102. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/platform-support.md +0 -0
  103. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-capability-matrix.md +0 -0
  104. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-guides/claude-code.md +0 -0
  105. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-guides/gemini.md +0 -0
  106. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-guides/hermes.md +0 -0
  107. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-guides/opencode.md +0 -0
  108. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/coordinator_test_seed.yaml +0 -0
  109. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/dummy_seed.yaml +0 -0
  110. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/parallel_subac_test_seed.yaml +0 -0
  111. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/subac_test_seed.yaml +0 -0
  112. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/README.md +0 -0
  113. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/__init__.py +0 -0
  114. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/__main__.py +0 -0
  115. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/cli.py +0 -0
  116. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/models.py +0 -0
  117. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/storage.py +0 -0
  118. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/test_display.py +0 -0
  119. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/hooks/hooks.json +0 -0
  120. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/llms-full.txt +0 -0
  121. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/llms.txt +0 -0
  122. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/project-context.md +0 -0
  123. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/pyproject.toml +0 -0
  124. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/drift-monitor.py +0 -0
  125. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/install.sh +0 -0
  126. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/keyword-detector.py +0 -0
  127. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/mcp-serve.sh +0 -0
  128. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/ralph-rewind.py +0 -0
  129. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/ralph.py +0 -0
  130. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/ralph.sh +0 -0
  131. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/session-start.py +0 -0
  132. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/sync-plugin-version.py +0 -0
  133. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/version-check.py +0 -0
  134. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/brownfield/SKILL.md +0 -0
  135. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/cancel/SKILL.md +0 -0
  136. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/evaluate/SKILL.md +0 -0
  137. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/evolve/SKILL.md +0 -0
  138. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/help/SKILL.md +0 -0
  139. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/interview/SKILL.md +0 -0
  140. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/pm/SKILL.md +0 -0
  141. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/publish/SKILL.md +0 -0
  142. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/qa/SKILL.md +0 -0
  143. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/ralph/SKILL.md +0 -0
  144. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/resume-session/SKILL.md +0 -0
  145. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/run/SKILL.md +0 -0
  146. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/seed/SKILL.md +0 -0
  147. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/setup/SKILL.md +0 -0
  148. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/status/SKILL.md +0 -0
  149. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/tutorial/SKILL.md +0 -0
  150. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/unstuck/SKILL.md +0 -0
  151. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/update/SKILL.md +0 -0
  152. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/welcome/SKILL.md +0 -0
  153. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/__init__.py +0 -0
  154. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/__main__.py +0 -0
  155. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/__init__.py +0 -0
  156. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/advocate.md +0 -0
  157. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/analysis-agent.md +0 -0
  158. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/architect.md +0 -0
  159. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/breadth-keeper.md +0 -0
  160. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/code-executor.md +0 -0
  161. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/codebase-explorer.md +0 -0
  162. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  163. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/contrarian.md +0 -0
  164. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/evaluator.md +0 -0
  165. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/hacker.md +0 -0
  166. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/judge.md +0 -0
  167. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/loader.py +0 -0
  168. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/ontologist.md +0 -0
  169. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/ontology-analyst.md +0 -0
  170. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/qa-judge.md +0 -0
  171. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/research-agent.md +0 -0
  172. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/researcher.md +0 -0
  173. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/seed-architect.md +0 -0
  174. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/seed-closer.md +0 -0
  175. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  176. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/simplifier.md +0 -0
  177. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  178. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/__init__.py +0 -0
  179. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/ambiguity.py +0 -0
  180. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/brownfield.py +0 -0
  181. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/explore.py +0 -0
  182. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/interview.py +0 -0
  183. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/pm_completion.py +0 -0
  184. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/pm_document.py +0 -0
  185. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/pm_interview.py +0 -0
  186. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/pm_seed.py +0 -0
  187. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/question_classifier.py +0 -0
  188. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/seed_generator.py +0 -0
  189. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/claude_permissions.py +0 -0
  190. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/__init__.py +0 -0
  191. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/__init__.py +0 -0
  192. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/cancel.py +0 -0
  193. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/config.py +0 -0
  194. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/detect.py +0 -0
  195. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/init.py +0 -0
  196. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/mcp.py +0 -0
  197. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/mcp_doctor.py +0 -0
  198. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/pm.py +0 -0
  199. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/resume.py +0 -0
  200. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/run.py +0 -0
  201. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/status.py +0 -0
  202. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/tui.py +0 -0
  203. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/__init__.py +0 -0
  204. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/panels.py +0 -0
  205. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/progress.py +0 -0
  206. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/prompting.py +0 -0
  207. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/tables.py +0 -0
  208. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  209. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/jsonc.py +0 -0
  210. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/opencode_config.py +0 -0
  211. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/codex/cli_policy.py +0 -0
  212. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/codex/ouroboros.md +0 -0
  213. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/codex_permissions.py +0 -0
  214. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/config/__init__.py +0 -0
  215. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/config/loader.py +0 -0
  216. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/config/models.py +0 -0
  217. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/__init__.py +0 -0
  218. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/ac_tree.py +0 -0
  219. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/context.py +0 -0
  220. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/directive.py +0 -0
  221. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/errors.py +0 -0
  222. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/file_lock.py +0 -0
  223. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/git_workflow.py +0 -0
  224. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/initial_context.py +0 -0
  225. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/json_utils.py +0 -0
  226. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/lineage.py +0 -0
  227. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/ontology_aspect.py +0 -0
  228. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/ontology_questions.py +0 -0
  229. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/project_paths.py +0 -0
  230. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/retry.py +0 -0
  231. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/security.py +0 -0
  232. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/seed.py +0 -0
  233. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/seed_contract.py +0 -0
  234. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/seed_contract_prompt.py +0 -0
  235. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/text.py +0 -0
  236. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/ttl_cache.py +0 -0
  237. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/types.py +0 -0
  238. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/worktree.py +0 -0
  239. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/__init__.py +0 -0
  240. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  241. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/checklist.py +0 -0
  242. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/consensus.py +0 -0
  243. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/detector.py +0 -0
  244. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/json_utils.py +0 -0
  245. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/languages.py +0 -0
  246. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/mechanical.py +0 -0
  247. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/models.py +0 -0
  248. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/pipeline.py +0 -0
  249. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/semantic.py +0 -0
  250. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/trigger.py +0 -0
  251. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
  252. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/__init__.py +0 -0
  253. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/base.py +0 -0
  254. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/control.py +0 -0
  255. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/decomposition.py +0 -0
  256. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/evaluation.py +0 -0
  257. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/interview.py +0 -0
  258. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/lineage.py +0 -0
  259. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/ontology.py +0 -0
  260. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/__init__.py +0 -0
  261. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/convergence.py +0 -0
  262. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/loop.py +0 -0
  263. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/projector.py +0 -0
  264. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/reflect.py +0 -0
  265. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/regression.py +0 -0
  266. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/wonder.py +0 -0
  267. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/execution/__init__.py +0 -0
  268. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/execution/atomicity.py +0 -0
  269. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/execution/decomposition.py +0 -0
  270. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/execution/double_diamond.py +0 -0
  271. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/execution/subagent.py +0 -0
  272. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/hermes/__init__.py +0 -0
  273. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/hermes/artifacts.py +0 -0
  274. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/__init__.py +0 -0
  275. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/bridge/__init__.py +0 -0
  276. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/bridge/bridge.py +0 -0
  277. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/bridge/config.py +0 -0
  278. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/bridge/factory.py +0 -0
  279. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/client/__init__.py +0 -0
  280. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/client/adapter.py +0 -0
  281. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/client/manager.py +0 -0
  282. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/client/protocol.py +0 -0
  283. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/errors.py +0 -0
  284. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/job_manager.py +0 -0
  285. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/resources/__init__.py +0 -0
  286. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/resources/handlers.py +0 -0
  287. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/server/__init__.py +0 -0
  288. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/server/adapter.py +0 -0
  289. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/server/protocol.py +0 -0
  290. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/server/security.py +0 -0
  291. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/__init__.py +0 -0
  292. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
  293. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
  294. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  295. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
  296. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  297. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  298. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/definitions.py +0 -0
  299. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  300. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  301. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
  302. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  303. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  304. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/qa.py +0 -0
  305. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  306. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/registry.py +0 -0
  307. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/subagent.py +0 -0
  308. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/types.py +0 -0
  309. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/observability/__init__.py +0 -0
  310. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/observability/drift.py +0 -0
  311. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/observability/logging.py +0 -0
  312. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/observability/retrospective.py +0 -0
  313. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/__init__.py +0 -0
  314. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/__init__.py +0 -0
  315. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/opencode-plugin.d.ts +0 -0
  316. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/ouroboros-bridge.test.ts +0 -0
  317. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/ouroboros-bridge.ts +0 -0
  318. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/package.json +0 -0
  319. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/tsconfig.json +0 -0
  320. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/__init__.py +0 -0
  321. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/adapter.py +0 -0
  322. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/capabilities.py +0 -0
  323. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  324. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  325. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/control_plane.py +0 -0
  326. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/coordinator.py +0 -0
  327. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  328. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/events.py +0 -0
  329. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  330. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  331. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/gemini_cli_runtime.py +0 -0
  332. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  333. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/hermes_runtime.py +0 -0
  334. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/level_context.py +0 -0
  335. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  336. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  337. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
  338. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
  339. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  340. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  341. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/policy.py +0 -0
  342. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/rate_limit.py +0 -0
  343. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/runner.py +0 -0
  344. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  345. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  346. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/session.py +0 -0
  347. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  348. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/__init__.py +0 -0
  349. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/brownfield.py +0 -0
  350. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/checkpoint.py +0 -0
  351. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/event_store.py +0 -0
  352. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  353. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/migrations/runner.py +0 -0
  354. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  355. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  356. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/schema.py +0 -0
  357. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/uow.py +0 -0
  358. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/__init__.py +0 -0
  359. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/agents/__init__.py +0 -0
  360. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/agents/pool.py +0 -0
  361. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/agents/registry.py +0 -0
  362. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  363. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/orchestration/router.py +0 -0
  364. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  365. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/skills/__init__.py +0 -0
  366. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/skills/docs.py +0 -0
  367. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/skills/executor.py +0 -0
  368. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/skills/keywords.py +0 -0
  369. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/skills/registry.py +0 -0
  370. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/pm/__init__.py +0 -0
  371. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/pm/handoff.py +0 -0
  372. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/pm/renderer.py +0 -0
  373. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/__init__.py +0 -0
  374. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  375. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/base.py +0 -0
  376. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  377. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  378. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  379. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/factory.py +0 -0
  380. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
  381. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/gemini_event_normalizer.py +0 -0
  382. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/litellm_adapter.py +0 -0
  383. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/opencode_adapter.py +0 -0
  384. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/py.typed +0 -0
  385. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/resilience/__init__.py +0 -0
  386. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/resilience/lateral.py +0 -0
  387. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/resilience/recovery.py +0 -0
  388. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/resilience/stagnation.py +0 -0
  389. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/router/__init__.py +0 -0
  390. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/router/command_parser.py +0 -0
  391. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/router/dispatch.py +0 -0
  392. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/router/registry.py +0 -0
  393. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/router/types.py +0 -0
  394. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/__init__.py +0 -0
  395. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/complexity.py +0 -0
  396. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/downgrade.py +0 -0
  397. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/escalation.py +0 -0
  398. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/router.py +0 -0
  399. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/tiers.py +0 -0
  400. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/sandbox.py +0 -0
  401. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/secondary/__init__.py +0 -0
  402. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/secondary/scheduler.py +0 -0
  403. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/secondary/todo_registry.py +0 -0
  404. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/skills/__init__.py +0 -0
  405. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/skills/artifacts.py +0 -0
  406. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/strategies/__init__.py +0 -0
  407. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/strategies/devil_advocate.py +0 -0
  408. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/__init__.py +0 -0
  409. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/app.py +0 -0
  410. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/components/__init__.py +0 -0
  411. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/components/agents_panel.py +0 -0
  412. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/components/event_log.py +0 -0
  413. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/components/progress.py +0 -0
  414. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/components/token_tracker.py +0 -0
  415. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/events.py +0 -0
  416. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/__init__.py +0 -0
  417. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  418. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/dashboard.py +0 -0
  419. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  420. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  421. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/debug.py +0 -0
  422. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/execution.py +0 -0
  423. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  424. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  425. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  426. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/logs.py +0 -0
  427. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/session_selector.py +0 -0
  428. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/__init__.py +0 -0
  429. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  430. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  431. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  432. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  433. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  434. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  435. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  436. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  437. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/verification/__init__.py +0 -0
  438. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/verification/extractor.py +0 -0
  439. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/verification/models.py +0 -0
  440. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/verification/verifier.py +0 -0
  441. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/__init__.py +0 -0
  442. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/conftest.py +0 -0
  443. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/__init__.py +0 -0
  444. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/conftest.py +0 -0
  445. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
  446. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/test_cli_commands.py +0 -0
  447. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/test_full_workflow.py +0 -0
  448. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/test_session_persistence.py +0 -0
  449. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/fixtures/router/skills/frontmatter-body/run/SKILL.md +0 -0
  450. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/fixtures/test_atomicity_seed.yml +0 -0
  451. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/__init__.py +0 -0
  452. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/conftest.py +0 -0
  453. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/__init__.py +0 -0
  454. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/bridge/__init__.py +0 -0
  455. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
  456. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/conftest.py +0 -0
  457. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/test_client_adapter.py +0 -0
  458. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/test_client_manager.py +0 -0
  459. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/test_server_adapter.py +0 -0
  460. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/plugin/test_orchestration.py +0 -0
  461. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/test_cancel_subprocess_termination.py +0 -0
  462. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  463. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/test_codex_skill_fallback.py +0 -0
  464. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/test_codex_skill_smoke.py +0 -0
  465. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/test_entry_point.py +0 -0
  466. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/test-execution-plan.md +0 -0
  467. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/__init__.py +0 -0
  468. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/agents/__init__.py +0 -0
  469. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/agents/test_loader.py +0 -0
  470. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/__init__.py +0 -0
  471. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_ambiguity.py +0 -0
  472. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_brownfield.py +0 -0
  473. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_classifier_context.py +0 -0
  474. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  475. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_explore.py +0 -0
  476. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_interview.py +0 -0
  477. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_interview_async_io.py +0 -0
  478. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
  479. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
  480. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_completion.py +0 -0
  481. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  482. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  483. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_interview.py +0 -0
  484. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  485. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  486. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  487. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_question_classifier.py +0 -0
  488. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_seed_generator.py +0 -0
  489. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/__init__.py +0 -0
  490. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/commands/test_tui_command.py +0 -0
  491. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/conftest.py +0 -0
  492. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/__init__.py +0 -0
  493. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_console.py +0 -0
  494. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_panels.py +0 -0
  495. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_progress.py +0 -0
  496. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_prompting.py +0 -0
  497. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_tables.py +0 -0
  498. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  499. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_bridge_plugin_hardening.py +0 -0
  500. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_bridge_plugin_lifecycle.py +0 -0
  501. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_cancel.py +0 -0
  502. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_config.py +0 -0
  503. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_doc_commands.py +0 -0
  504. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  505. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_init_runtime.py +0 -0
  506. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_jsonc.py +0 -0
  507. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_main.py +0 -0
  508. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_mcp_doctor.py +0 -0
  509. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  510. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_mcp_shell_env.py +0 -0
  511. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  512. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_mcp_validate_transport_stderr.py +0 -0
  513. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_opencode_config.py +0 -0
  514. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm.py +0 -0
  515. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_brownfield.py +0 -0
  516. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_completion.py +0 -0
  517. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
  518. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
  519. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_overwrite.py +0 -0
  520. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
  521. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_select_repos.py +0 -0
  522. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_resume.py +0 -0
  523. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_run_qa.py +0 -0
  524. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/codex/test_cli_policy.py +0 -0
  525. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/config/__init__.py +0 -0
  526. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/config/test_loader.py +0 -0
  527. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/config/test_loader_env.py +0 -0
  528. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/config/test_models.py +0 -0
  529. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/__init__.py +0 -0
  530. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_ac_tree.py +0 -0
  531. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_context.py +0 -0
  532. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_directive.py +0 -0
  533. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_errors.py +0 -0
  534. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_file_lock.py +0 -0
  535. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_git_workflow.py +0 -0
  536. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_initial_context.py +0 -0
  537. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_lineage.py +0 -0
  538. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_ontology_aspect.py +0 -0
  539. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_ontology_questions.py +0 -0
  540. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_retry.py +0 -0
  541. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_security.py +0 -0
  542. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_seed.py +0 -0
  543. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_ttl_cache.py +0 -0
  544. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_types.py +0 -0
  545. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_worktree.py +0 -0
  546. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/__init__.py +0 -0
  547. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
  548. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_checklist.py +0 -0
  549. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_consensus.py +0 -0
  550. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_detector.py +0 -0
  551. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_json_utils.py +0 -0
  552. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_languages.py +0 -0
  553. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_mechanical.py +0 -0
  554. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_models.py +0 -0
  555. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_pipeline_stage1_reuse.py +0 -0
  556. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
  557. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_review_fixes.py +0 -0
  558. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_semantic.py +0 -0
  559. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_trigger.py +0 -0
  560. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
  561. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
  562. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/events/__init__.py +0 -0
  563. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/events/test_base.py +0 -0
  564. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/events/test_control_events.py +0 -0
  565. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/events/test_decomposition_events.py +0 -0
  566. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evolution/test_wonder_scope.py +0 -0
  567. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/execution/__init__.py +0 -0
  568. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/execution/test_atomicity.py +0 -0
  569. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/execution/test_decomposition.py +0 -0
  570. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/execution/test_double_diamond.py +0 -0
  571. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/execution/test_subagent_isolation.py +0 -0
  572. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/hermes/test_artifacts.py +0 -0
  573. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/__init__.py +0 -0
  574. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/__init__.py +0 -0
  575. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/test_bridge.py +0 -0
  576. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/test_config.py +0 -0
  577. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/test_factory.py +0 -0
  578. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
  579. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/test_stability.py +0 -0
  580. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/client/__init__.py +0 -0
  581. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/client/test_adapter.py +0 -0
  582. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
  583. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/client/test_manager.py +0 -0
  584. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/conftest.py +0 -0
  585. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/server/__init__.py +0 -0
  586. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/server/test_adapter.py +0 -0
  587. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/server/test_security.py +0 -0
  588. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/test_errors.py +0 -0
  589. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/test_job_manager.py +0 -0
  590. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/test_types.py +0 -0
  591. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/__init__.py +0 -0
  592. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/conftest.py +0 -0
  593. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
  594. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
  595. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
  596. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
  597. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
  598. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
  599. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
  600. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
  601. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
  602. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
  603. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
  604. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
  605. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  606. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_checklist_verify.py +0 -0
  607. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_definitions.py +0 -0
  608. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_evaluate_multi_ac.py +0 -0
  609. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_handler_subagent_wiring.py +0 -0
  610. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_interview_done_streak.py +0 -0
  611. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_interview_reopen_seed_ready.py +0 -0
  612. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_lateral_think_handler.py +0 -0
  613. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
  614. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  615. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  616. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
  617. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_registry.py +0 -0
  618. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_round5_fixes.py +0 -0
  619. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_subagent.py +0 -0
  620. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/observability/__init__.py +0 -0
  621. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/observability/test_drift.py +0 -0
  622. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/observability/test_logging.py +0 -0
  623. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/observability/test_retrospective.py +0 -0
  624. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/__init__.py +0 -0
  625. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_adapter.py +0 -0
  626. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_capabilities.py +0 -0
  627. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  628. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  629. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  630. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_control_plane.py +0 -0
  631. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_coordinator.py +0 -0
  632. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  633. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_events.py +0 -0
  634. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  635. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  636. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_gemini_cli_runtime.py +0 -0
  637. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_hermes_runtime.py +0 -0
  638. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  639. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_level_context.py +0 -0
  640. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  641. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  642. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
  643. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  644. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
  645. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
  646. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  647. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_policy.py +0 -0
  648. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_rate_limit.py +0 -0
  649. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_runner.py +0 -0
  650. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  651. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  652. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  653. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_sandbox_class.py +0 -0
  654. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_seed_prompt.py +0 -0
  655. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_session.py +0 -0
  656. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  657. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/__init__.py +0 -0
  658. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/test_brownfield_store.py +0 -0
  659. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/test_checkpoint.py +0 -0
  660. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/test_event_store.py +0 -0
  661. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/test_schema.py +0 -0
  662. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/test_uow.py +0 -0
  663. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/__init__.py +0 -0
  664. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/agents/__init__.py +0 -0
  665. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/agents/test_registry.py +0 -0
  666. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/orchestration/__init__.py +0 -0
  667. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  668. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/skills/__init__.py +0 -0
  669. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/skills/test_keywords.py +0 -0
  670. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/skills/test_registry.py +0 -0
  671. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/pm/__init__.py +0 -0
  672. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/pm/test_renderer.py +0 -0
  673. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/__init__.py +0 -0
  674. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_base.py +0 -0
  675. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  676. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  677. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_factory.py +0 -0
  678. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
  679. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_litellm_adapter.py +0 -0
  680. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_opencode_adapter.py +0 -0
  681. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/resilience/__init__.py +0 -0
  682. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/resilience/test_lateral.py +0 -0
  683. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/resilience/test_recovery.py +0 -0
  684. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/resilience/test_stagnation.py +0 -0
  685. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/__init__.py +0 -0
  686. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_command_parser.py +0 -0
  687. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_dispatch.py +0 -0
  688. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_dispatch_result_shapes.py +0 -0
  689. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_extract_first_argument.py +0 -0
  690. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_invalid_dispatch_input_types.py +0 -0
  691. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_malformed_unknown_dispatch_errors.py +0 -0
  692. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_not_handled_resolution.py +0 -0
  693. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_registry.py +0 -0
  694. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_repository_dispatch_guard.py +0 -0
  695. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_router_resolution_pipeline.py +0 -0
  696. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_typed_frontmatter_fields.py +0 -0
  697. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_valid_dispatch_normalization.py +0 -0
  698. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/__init__.py +0 -0
  699. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/test_complexity.py +0 -0
  700. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/test_downgrade.py +0 -0
  701. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/test_escalation.py +0 -0
  702. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/test_router.py +0 -0
  703. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/test_tiers.py +0 -0
  704. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/scripts/test_keyword_detector.py +0 -0
  705. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/scripts/test_session_start.py +0 -0
  706. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/scripts/test_version_check.py +0 -0
  707. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/secondary/__init__.py +0 -0
  708. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/secondary/test_scheduler.py +0 -0
  709. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/secondary/test_todo_registry.py +0 -0
  710. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/skills/test_skill_artifacts.py +0 -0
  711. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_artifact_collector.py +0 -0
  712. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_codex_artifacts.py +0 -0
  713. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_convergence.py +0 -0
  714. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_dashboard.py +0 -0
  715. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_dependencies_configured.py +0 -0
  716. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_evolve_rewind.py +0 -0
  717. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_evolve_step.py +0 -0
  718. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_graceful_shutdown.py +0 -0
  719. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_main_entry_point.py +0 -0
  720. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_module_structure.py +0 -0
  721. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_project_initialization.py +0 -0
  722. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_projector_rewind.py +0 -0
  723. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_ralph_parser.py +0 -0
  724. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_ralph_rewind.py +0 -0
  725. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_regression.py +0 -0
  726. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_tooling_configuration.py +0 -0
  727. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_verification.py +0 -0
  728. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/__init__.py +0 -0
  729. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_app.py +0 -0
  730. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_cancelled_display.py +0 -0
  731. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_events.py +0 -0
  732. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_lineage_viewer.py +0 -0
  733. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_screens.py +0 -0
  734. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_session_selector_replay.py +0 -0
  735. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_widgets.py +0 -0
  736. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tools/sync_github_project.py +0 -0
  737. {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.31.2.dev13
3
+ Version: 0.31.2.dev14
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
@@ -71,6 +71,7 @@ ouroboros setup [OPTIONS]
71
71
  | `-r, --runtime TEXT` | Runtime backend to configure. Shipped values: `claude`, `codex`, `opencode`. Auto-detected if omitted |
72
72
  | `--opencode-mode TEXT` | OpenCode integration mode: `plugin` (default, recommended — bridge plugin for interactive sessions) or `subprocess` (headless/CI). Mutually exclusive — see [OpenCode runtime guide](runtime-guides/opencode.md#configuration) |
73
73
  | `--non-interactive` | Skip interactive prompts (for scripted installs) |
74
+ | `--mcp-mode TEXT` | Codex MCP config mode: `auto` (default), `preserve`, or `stdio` |
74
75
 
75
76
  **Examples:**
76
77
 
@@ -97,11 +98,11 @@ ouroboros setup --non-interactive
97
98
  - For Codex CLI: sets `orchestrator.codex_cli_path` and `llm.backend: codex` in `~/.ouroboros/config.yaml`
98
99
  - For Codex CLI: installs managed Ouroboros rules into `~/.codex/rules/`
99
100
  - For Codex CLI: installs managed Ouroboros skills into `~/.codex/skills/`
100
- - For Codex CLI: registers the Ouroboros MCP/env block in `~/.codex/config.toml`
101
+ - For Codex CLI: registers the Ouroboros MCP/env block in `~/.codex/config.toml` when absent, refreshes setup-managed stdio blocks, and preserves user-managed URL/custom blocks by default
101
102
  - For OpenCode: registers the Ouroboros MCP server in OpenCode's configuration
102
103
  - For OpenCode (plugin mode): installs the bridge plugin into `<opencode_config_dir>/plugins/ouroboros-bridge/`
103
104
 
104
- > **Codex config split:** put persistent Ouroboros per-role model overrides in `~/.ouroboros/config.yaml` (`clarification.default_model`, `llm.qa_model`, `evaluation.semantic_model`, `consensus.models`, `consensus.advocate_model`, `consensus.devil_model`, `consensus.judge_model`). `~/.codex/config.toml` is only the Codex MCP/env hookup file used by setup.
105
+ > **Codex config split:** put persistent Ouroboros per-role model overrides in `~/.ouroboros/config.yaml` (`clarification.default_model`, `llm.qa_model`, `evaluation.semantic_model`, `consensus.models`, `consensus.advocate_model`, `consensus.devil_model`, `consensus.judge_model`). `~/.codex/config.toml` is only the Codex MCP/env hookup file used by setup. If you run a long-lived URL-based Ouroboros MCP server, setup preserves that user-managed entry in the default `--mcp-mode auto`; use `--mcp-mode stdio` only when you intentionally want setup to replace it.
105
106
 
106
107
  ### Brownfield Subcommands
107
108
 
@@ -423,6 +424,21 @@ ouroboros config validate
423
424
 
424
425
  ---
425
426
 
427
+
428
+ ## `ouroboros codex`
429
+
430
+ Manage Codex-specific Ouroboros integration artifacts.
431
+
432
+ ### `codex refresh`
433
+
434
+ Refresh the packaged Codex-side Ouroboros rules and skills without changing MCP or Ouroboros config files.
435
+
436
+ ```bash
437
+ ouroboros codex refresh
438
+ ```
439
+
440
+ This command updates packaged `~/.codex/rules/ouroboros*.md` and `~/.codex/skills/ouroboros-*` artifacts. It does not modify `~/.codex/config.toml` or `~/.ouroboros/config.yaml`. It intentionally does not prune extra `ouroboros-*` files because prefix ownership can include user-managed artifacts.
441
+
426
442
  ## `ouroboros uninstall`
427
443
 
428
444
  Cleanly remove all Ouroboros configuration from your system. Reverses everything `ouroboros setup` did.
@@ -459,7 +475,7 @@ ouroboros uninstall --keep-data
459
475
 
460
476
  - `ouroboros` entry from `~/.claude/mcp.json`
461
477
  - `[mcp_servers.ouroboros]` section from `~/.codex/config.toml`
462
- - `~/.codex/rules/ouroboros.md` and `~/.codex/skills/ouroboros/`
478
+ - `~/.codex/rules/ouroboros*.md` and `~/.codex/skills/ouroboros-*`
463
479
  - `<!-- ooo:START -->` … `<!-- ooo:END -->` block from `CLAUDE.md`
464
480
  - OpenCode bridge plugin (`<opencode_config_dir>/plugins/ouroboros-bridge/`) and its entry in `opencode.jsonc`
465
481
  - `.ouroboros/` directory in the current project
@@ -172,7 +172,7 @@ consensus:
172
172
  judge_model: gpt-5.4
173
173
  ```
174
174
 
175
- `ouroboros setup --runtime codex` uses `~/.codex/config.toml` only for the Codex MCP/env hookup and installs managed Ouroboros rules/skills into `~/.codex/`.
175
+ `ouroboros setup --runtime codex` uses `~/.codex/config.toml` only for the Codex MCP/env hookup and installs managed Ouroboros rules/skills into `~/.codex/`. Existing URL/custom Ouroboros MCP entries are preserved by default; run `ouroboros codex refresh` when you only need to refresh `~/.codex/rules/ouroboros*.md` and `~/.codex/skills/ouroboros-*`.
176
176
 
177
177
  ### Environment Variables
178
178
 
@@ -112,13 +112,13 @@ Under the hood, `CodexCliRuntime` still talks to the local `codex` executable, b
112
112
  - Records `orchestrator.codex_cli_path` when available
113
113
  - Installs managed Ouroboros rules into `~/.codex/rules/`
114
114
  - Installs managed Ouroboros skills into `~/.codex/skills/`
115
- - Registers the Ouroboros MCP/env hookup in `~/.codex/config.toml`
115
+ - Registers the Ouroboros MCP/env hookup in `~/.codex/config.toml` when absent, refreshes setup-managed stdio blocks, and preserves user-managed URL/custom entries by default
116
116
 
117
- `~/.codex/config.toml` is not where Ouroboros per-role model overrides belong. Keep `clarification`, `qa`, `semantic`, and `consensus` model settings in `~/.ouroboros/config.yaml`.
117
+ `~/.codex/config.toml` is not where Ouroboros per-role model overrides belong. Keep `clarification`, `qa`, `semantic`, and `consensus` model settings in `~/.ouroboros/config.yaml`. If you manage a long-running URL-based Ouroboros MCP server, keep that URL entry in `~/.codex/config.toml`; `ouroboros setup --runtime codex` preserves it by default. Use `--mcp-mode stdio` only when you intentionally want setup to replace the entry with the managed command-spawned server.
118
118
 
119
119
  ### `ooo` Skill Availability on Codex
120
120
 
121
- After running `ouroboros setup --runtime codex`, the bundled `ooo` skills are installed into `~/.codex/skills/` and the routing rules into `~/.codex/rules/`. The table below shows each skill and its CLI equivalent for terminal-only workflows.
121
+ After running `ouroboros setup --runtime codex`, the bundled `ooo` skills are installed into `~/.codex/skills/ouroboros-*` and the routing rules into `~/.codex/rules/`. To refresh only those artifacts after upgrading Ouroboros, run `ouroboros codex refresh`; it does not modify `~/.codex/config.toml` or `~/.ouroboros/config.yaml`. The table below shows each skill and its CLI equivalent for terminal-only workflows.
122
122
 
123
123
  | `ooo` Skill | Codex session | CLI equivalent (Terminal) |
124
124
  |-------------|---------------|--------------------------|
@@ -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.31.2.dev13'
22
- __version_tuple__ = version_tuple = (0, 31, 2, 'dev13')
21
+ __version__ = version = '0.31.2.dev14'
22
+ __version_tuple__ = version_tuple = (0, 31, 2, 'dev14')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -0,0 +1,35 @@
1
+ """Codex CLI integration helper commands."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+
7
+ import typer
8
+
9
+ from ouroboros.cli.formatters.panels import print_error, print_success
10
+ from ouroboros.codex import install_codex_artifacts
11
+
12
+ app = typer.Typer(
13
+ name="codex",
14
+ help="Manage Ouroboros Codex CLI integration artifacts.",
15
+ no_args_is_help=True,
16
+ )
17
+
18
+
19
+ @app.callback()
20
+ def codex() -> None:
21
+ """Manage Ouroboros Codex CLI integration artifacts."""
22
+
23
+
24
+ @app.command("refresh")
25
+ def refresh() -> None:
26
+ """Refresh Codex rules and skills without changing MCP or Ouroboros config."""
27
+ codex_dir = Path.home() / ".codex"
28
+ try:
29
+ result = install_codex_artifacts(codex_dir=codex_dir, prune=False)
30
+ except FileNotFoundError as exc:
31
+ print_error(str(exc))
32
+ raise typer.Exit(1) from exc
33
+
34
+ print_success(f"Installed Codex rules → {result.rules_path}")
35
+ print_success(f"Installed {len(result.skill_paths)} Codex skills → {codex_dir / 'skills'}")
@@ -17,7 +17,7 @@ import json
17
17
  import os
18
18
  from pathlib import Path
19
19
  import shutil
20
- from typing import Annotated
20
+ from typing import Annotated, Literal
21
21
 
22
22
  from rich.prompt import Prompt
23
23
  from rich.table import Table
@@ -206,6 +206,43 @@ _CODEX_MCP_COMMENT_LINES = (
206
206
  "# This file is only for the Codex MCP/env registration block.",
207
207
  )
208
208
 
209
+ CodexMcpMode = Literal["auto", "preserve", "stdio"]
210
+ _CODEX_MCP_ARGS = ["--from", "ouroboros-ai[mcp]", "ouroboros", "mcp", "serve"]
211
+
212
+
213
+ def _normalize_codex_mcp_mode(value: str) -> CodexMcpMode:
214
+ """Validate and normalize the Codex MCP setup mode."""
215
+ normalized = value.lower()
216
+ if normalized not in {"auto", "preserve", "stdio"}:
217
+ print_error("Unsupported Codex MCP mode. Use one of: auto, preserve, stdio.")
218
+ raise typer.Exit(1)
219
+ return normalized # type: ignore[return-value]
220
+
221
+
222
+ def _codex_mcp_entry_from_toml(data: dict[str, object]) -> dict[str, object] | None:
223
+ """Return the parsed Ouroboros Codex MCP entry, if present."""
224
+ mcp_servers = data.get("mcp_servers")
225
+ if not isinstance(mcp_servers, dict):
226
+ return None
227
+ entry = mcp_servers.get("ouroboros")
228
+ return entry if isinstance(entry, dict) else None
229
+
230
+
231
+ def _is_setup_managed_codex_mcp_entry(entry: dict[str, object]) -> bool:
232
+ """Return whether setup may safely replace this Codex MCP entry."""
233
+ if "url" in entry:
234
+ return False
235
+
236
+ command = entry.get("command")
237
+ args = entry.get("args")
238
+ if command != "uvx" or not isinstance(args, list):
239
+ return False
240
+
241
+ # Current setup-managed config and older setup-managed uvx configs both
242
+ # end by launching `ouroboros mcp serve`. Editable/worktree configs often
243
+ # use a direct command path and are intentionally treated as user-managed.
244
+ return len(args) >= 3 and args[-3:] == ["ouroboros", "mcp", "serve"]
245
+
209
246
 
210
247
  def _is_codex_ouroboros_table_header(line: str) -> bool:
211
248
  """Return True when the line starts the managed Codex MCP table."""
@@ -270,21 +307,33 @@ def _upsert_codex_mcp_section(raw: str) -> tuple[str, bool]:
270
307
  return "\n".join(output_lines).rstrip() + "\n", existed_before
271
308
 
272
309
 
273
- def _register_codex_mcp_server() -> None:
310
+ def _register_codex_mcp_server(*, mode: CodexMcpMode = "auto") -> None:
274
311
  """Register the Ouroboros MCP/env hookup in ~/.codex/config.toml."""
275
312
  import tomllib
276
313
 
314
+ if mode == "preserve":
315
+ print_info("Preserved Codex MCP config.")
316
+ return
317
+
277
318
  codex_config = Path.home() / ".codex" / "config.toml"
278
319
  codex_config.parent.mkdir(parents=True, exist_ok=True)
279
320
 
280
321
  if codex_config.exists():
281
322
  raw = codex_config.read_text(encoding="utf-8")
282
323
  try:
283
- tomllib.loads(raw)
324
+ parsed = tomllib.loads(raw)
284
325
  except tomllib.TOMLDecodeError:
285
326
  print_error(f"Could not parse {codex_config} — skipping MCP registration.")
286
327
  return
287
328
 
329
+ entry = _codex_mcp_entry_from_toml(parsed)
330
+ if mode == "auto" and entry is not None and not _is_setup_managed_codex_mcp_entry(entry):
331
+ print_info(
332
+ "Preserved existing user-managed Ouroboros MCP config in "
333
+ f"{codex_config}. Use --mcp-mode stdio to replace it."
334
+ )
335
+ return
336
+
288
337
  updated_raw, existed_before = _upsert_codex_mcp_section(raw)
289
338
  if updated_raw == raw:
290
339
  print_info("Codex MCP server already up to date.")
@@ -308,24 +357,19 @@ def _print_codex_config_guidance(config_path: Path) -> None:
308
357
 
309
358
  def _install_codex_artifacts() -> None:
310
359
  """Install packaged Ouroboros rules and skills into ~/.codex/."""
311
- from ouroboros.codex import install_codex_rules, install_codex_skills
360
+ from ouroboros.codex import install_codex_artifacts
312
361
 
313
362
  codex_dir = Path.home() / ".codex"
314
363
 
315
364
  try:
316
- rules_path = install_codex_rules(codex_dir=codex_dir, prune=True)
317
- print_success(f"Installed Codex rules → {rules_path}")
365
+ result = install_codex_artifacts(codex_dir=codex_dir, prune=True)
366
+ print_success(f"Installed Codex rules → {result.rules_path}")
367
+ print_success(f"Installed {len(result.skill_paths)} Codex skills → {codex_dir / 'skills'}")
318
368
  except FileNotFoundError:
319
- print_error("Could not locate packaged Codex rules.")
320
-
321
- try:
322
- skill_paths = install_codex_skills(codex_dir=codex_dir, prune=True)
323
- print_success(f"Installed {len(skill_paths)} Codex skills → {codex_dir / 'skills'}")
324
- except FileNotFoundError:
325
- print_error("Could not locate packaged Codex skills.")
369
+ print_error("Could not locate packaged Codex rules or skills.")
326
370
 
327
371
 
328
- def _setup_codex(codex_path: str) -> None:
372
+ def _setup_codex(codex_path: str, *, mcp_mode: CodexMcpMode = "auto") -> None:
329
373
  """Configure Ouroboros for the Codex runtime."""
330
374
  from ouroboros.config.loader import create_default_config, ensure_config_dir
331
375
 
@@ -356,7 +400,7 @@ def _setup_codex(codex_path: str) -> None:
356
400
  _install_codex_artifacts()
357
401
 
358
402
  # Register MCP server in Codex config (~/.codex/config.toml)
359
- _register_codex_mcp_server()
403
+ _register_codex_mcp_server(mode=mcp_mode)
360
404
  _print_codex_config_guidance(config_path)
361
405
 
362
406
 
@@ -1264,6 +1308,13 @@ def setup(
1264
1308
  help="OpenCode integration mode (mutually exclusive): plugin (default) or subprocess.",
1265
1309
  ),
1266
1310
  ] = "plugin",
1311
+ mcp_mode: Annotated[
1312
+ str,
1313
+ typer.Option(
1314
+ "--mcp-mode",
1315
+ help="Codex MCP config mode: auto preserves user-managed entries, preserve skips MCP changes, stdio replaces with the managed stdio entry.",
1316
+ ),
1317
+ ] = "auto",
1267
1318
  ) -> None:
1268
1319
  """Set up Ouroboros for your environment.
1269
1320
 
@@ -1357,7 +1408,7 @@ def setup(
1357
1408
  if not codex_path:
1358
1409
  print_error("Codex CLI not found in PATH.")
1359
1410
  raise typer.Exit(1)
1360
- _setup_codex(codex_path)
1411
+ _setup_codex(codex_path, mcp_mode=_normalize_codex_mcp_mode(mcp_mode))
1361
1412
  elif selected in ("opencode", "opencode_cli"):
1362
1413
  opencode_path = available.get("opencode")
1363
1414
  if not opencode_path:
@@ -3,7 +3,7 @@
3
3
  Cleanly reverses everything `ouroboros setup` did:
4
4
  1. MCP server registration (~/.claude/mcp.json, ~/.codex/config.toml)
5
5
  2. CLAUDE.md integration block (<!-- ooo:START --> … <!-- ooo:END -->)
6
- 3. Codex artifacts (~/.codex/rules/ouroboros.md, ~/.codex/skills/ouroboros/)
6
+ 3. Codex artifacts (current packaged rules/skills plus legacy ~/.codex/skills/ouroboros/)
7
7
  4. Data directory (~/.ouroboros/)
8
8
 
9
9
  Does NOT remove:
@@ -33,6 +33,7 @@ from ouroboros.cli.opencode_config import (
33
33
  is_bridge_plugin_entry,
34
34
  opencode_config_dir,
35
35
  )
36
+ from ouroboros.codex import CODEX_RULE_FILENAME, resolve_packaged_codex_assets
36
37
 
37
38
  app = typer.Typer(
38
39
  name="uninstall",
@@ -140,12 +141,28 @@ def _remove_codex_artifacts(dry_run: bool) -> bool:
140
141
  Returns True only if ALL existing artifacts were removed successfully.
141
142
  Returns False if any artifact could not be removed.
142
143
  """
143
- rules_path = Path.home() / ".codex" / "rules" / "ouroboros.md"
144
- skills_path = Path.home() / ".codex" / "skills" / "ouroboros"
144
+ codex_dir = Path.home() / ".codex"
145
+ try:
146
+ with resolve_packaged_codex_assets() as assets:
147
+ managed_relative_paths = set(assets.managed_relative_install_paths)
148
+ except FileNotFoundError:
149
+ managed_relative_paths = {Path("rules") / CODEX_RULE_FILENAME}
150
+ managed_relative_paths.add(Path("skills") / "ouroboros") # legacy setup path
151
+
152
+ rule_paths = [
153
+ codex_dir / relative_path
154
+ for relative_path in managed_relative_paths
155
+ if relative_path.parts[:1] == ("rules",) and (codex_dir / relative_path).exists()
156
+ ]
157
+ skill_paths = [
158
+ codex_dir / relative_path
159
+ for relative_path in managed_relative_paths
160
+ if relative_path.parts[:1] == ("skills",) and (codex_dir / relative_path).exists()
161
+ ]
145
162
  had_work = False
146
163
  all_ok = True
147
164
 
148
- if rules_path.exists():
165
+ for rules_path in rule_paths:
149
166
  had_work = True
150
167
  if dry_run:
151
168
  print_info(f"[dry-run] Would remove {rules_path}")
@@ -157,7 +174,7 @@ def _remove_codex_artifacts(dry_run: bool) -> bool:
157
174
  print_warning(f"Could not remove {rules_path} — skipping.")
158
175
  all_ok = False
159
176
 
160
- if skills_path.exists():
177
+ for skills_path in skill_paths:
161
178
  had_work = True
162
179
  if dry_run:
163
180
  print_info(f"[dry-run] Would remove {skills_path}/")
@@ -430,9 +447,14 @@ def uninstall(
430
447
  except (json.JSONDecodeError, OSError):
431
448
  targets.append(f"OpenCode MCP config ({opencode_config} — may be malformed)")
432
449
 
433
- codex_rules = Path.home() / ".codex" / "rules" / "ouroboros.md"
434
- codex_skills = Path.home() / ".codex" / "skills" / "ouroboros"
435
- if codex_rules.exists() or codex_skills.exists():
450
+ codex_dir = Path.home() / ".codex"
451
+ try:
452
+ with resolve_packaged_codex_assets() as assets:
453
+ managed_relative_paths = set(assets.managed_relative_install_paths)
454
+ except FileNotFoundError:
455
+ managed_relative_paths = {Path("rules") / CODEX_RULE_FILENAME}
456
+ managed_relative_paths.add(Path("skills") / "ouroboros")
457
+ if any((codex_dir / relative_path).exists() for relative_path in managed_relative_paths):
436
458
  targets.append("Codex rules and skills (~/.codex/)")
437
459
 
438
460
  cwd = Path.cwd()
@@ -16,6 +16,7 @@ import typer
16
16
  from ouroboros import __version__
17
17
  from ouroboros.cli.commands import (
18
18
  cancel,
19
+ codex,
19
20
  config,
20
21
  detect,
21
22
  init,
@@ -44,6 +45,7 @@ app.add_typer(run.app, name="run")
44
45
  app.add_typer(config.app, name="config")
45
46
  app.add_typer(status.app, name="status")
46
47
  app.add_typer(cancel.app, name="cancel")
48
+ app.add_typer(codex.app, name="codex")
47
49
  app.add_typer(mcp.app, name="mcp")
48
50
  app.add_typer(setup.app, name="setup")
49
51
  app.add_typer(detect.app, name="detect")
@@ -3,9 +3,11 @@
3
3
  from ouroboros.codex.artifacts import (
4
4
  CODEX_RULE_FILENAME,
5
5
  CODEX_SKILL_NAMESPACE,
6
+ CodexArtifactInstallResult,
6
7
  CodexManagedArtifact,
7
8
  CodexPackagedAssets,
8
9
  CodexPackagedSkill,
10
+ install_codex_artifacts,
9
11
  install_codex_rules,
10
12
  install_codex_skills,
11
13
  load_packaged_codex_rules,
@@ -16,10 +18,12 @@ from ouroboros.codex.artifacts import (
16
18
 
17
19
  __all__ = [
18
20
  "CodexManagedArtifact",
21
+ "CodexArtifactInstallResult",
19
22
  "CodexPackagedAssets",
20
23
  "CodexPackagedSkill",
21
24
  "CODEX_RULE_FILENAME",
22
25
  "CODEX_SKILL_NAMESPACE",
26
+ "install_codex_artifacts",
23
27
  "install_codex_rules",
24
28
  "install_codex_skills",
25
29
  "load_packaged_codex_skill",
@@ -45,6 +45,14 @@ class CodexManagedArtifact:
45
45
  relative_install_path: Path
46
46
 
47
47
 
48
+ @dataclass(frozen=True, slots=True)
49
+ class CodexArtifactInstallResult:
50
+ """Installed Codex artifact paths produced by an artifact refresh."""
51
+
52
+ rules_path: Path
53
+ skill_paths: tuple[Path, ...]
54
+
55
+
48
56
  @dataclass(frozen=True, slots=True)
49
57
  class CodexPackagedAssets:
50
58
  """Resolved packaged skills and the matching Codex rule assets."""
@@ -374,12 +382,29 @@ def install_codex_skills(
374
382
  return tuple(installed_paths)
375
383
 
376
384
 
385
+ def install_codex_artifacts(
386
+ *,
387
+ codex_dir: str | Path | None = None,
388
+ prune: bool = True,
389
+ ) -> CodexArtifactInstallResult:
390
+ """Install or refresh all packaged Ouroboros Codex artifacts.
391
+
392
+ This intentionally only touches managed Codex rules and skills. It does
393
+ not read or write ``~/.codex/config.toml`` or ``~/.ouroboros/config.yaml``.
394
+ """
395
+ rules_path = install_codex_rules(codex_dir=codex_dir, prune=prune)
396
+ skill_paths = install_codex_skills(codex_dir=codex_dir, prune=prune)
397
+ return CodexArtifactInstallResult(rules_path=rules_path, skill_paths=skill_paths)
398
+
399
+
377
400
  __all__ = [
401
+ "CodexArtifactInstallResult",
378
402
  "CodexManagedArtifact",
379
403
  "CodexPackagedAssets",
380
404
  "CodexPackagedSkill",
381
405
  "CODEX_RULE_FILENAME",
382
406
  "CODEX_SKILL_NAMESPACE",
407
+ "install_codex_artifacts",
383
408
  "install_codex_rules",
384
409
  "install_codex_skills",
385
410
  "load_packaged_codex_skill",
@@ -0,0 +1,40 @@
1
+ """Unit tests for Codex integration helper commands."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+ from unittest.mock import patch
7
+
8
+ from typer.testing import CliRunner
9
+
10
+ from ouroboros.cli.commands.codex import app
11
+ from ouroboros.codex import CodexArtifactInstallResult
12
+
13
+ runner = CliRunner()
14
+
15
+
16
+ class TestCodexRefresh:
17
+ """Tests for `ouroboros codex refresh`."""
18
+
19
+ def test_refresh_installs_rules_and_skills_without_config_files(self, tmp_path: Path) -> None:
20
+ rules_path = tmp_path / ".codex" / "rules" / "ouroboros.md"
21
+ skill_paths = (
22
+ tmp_path / ".codex" / "skills" / "ouroboros-interview",
23
+ tmp_path / ".codex" / "skills" / "ouroboros-run",
24
+ )
25
+ result = CodexArtifactInstallResult(rules_path=rules_path, skill_paths=skill_paths)
26
+
27
+ with (
28
+ patch("pathlib.Path.home", return_value=tmp_path),
29
+ patch(
30
+ "ouroboros.cli.commands.codex.install_codex_artifacts", return_value=result
31
+ ) as mock_install,
32
+ ):
33
+ cli_result = runner.invoke(app, ["refresh"])
34
+
35
+ assert cli_result.exit_code == 0
36
+ mock_install.assert_called_once_with(codex_dir=tmp_path / ".codex", prune=False)
37
+ assert "Installed Codex rules" in cli_result.output
38
+ assert "Installed 2 Codex skills" in cli_result.output
39
+ assert not (tmp_path / ".codex" / "config.toml").exists()
40
+ assert not (tmp_path / ".ouroboros" / "config.yaml").exists()
@@ -21,6 +21,7 @@ from ouroboros.cli.commands.setup import (
21
21
  _scan_and_register_repos,
22
22
  _set_default_repo,
23
23
  )
24
+ from ouroboros.codex import CodexArtifactInstallResult
24
25
 
25
26
  # ── Codex setup tests ────────────────────────────────────────────
26
27
 
@@ -84,21 +85,91 @@ class TestCodexSetup:
84
85
  assert 'OUROBOROS_LLM_BACKEND = "codex"' in contents
85
86
  assert "tool_timeout_sec" not in contents
86
87
 
88
+ def test_register_codex_mcp_server_preserves_url_config_by_default(
89
+ self,
90
+ tmp_path: Path,
91
+ ) -> None:
92
+ """URL-based Codex MCP configs are user-managed and preserved in auto mode."""
93
+ codex_config = tmp_path / ".codex" / "config.toml"
94
+ codex_config.parent.mkdir(parents=True)
95
+ codex_config.write_text(
96
+ '[mcp_servers.ouroboros]\nurl = "http://127.0.0.1:12000/mcp"\n',
97
+ encoding="utf-8",
98
+ )
99
+
100
+ with patch("pathlib.Path.home", return_value=tmp_path):
101
+ setup_cmd._register_codex_mcp_server()
102
+
103
+ contents = codex_config.read_text(encoding="utf-8")
104
+ assert 'url = "http://127.0.0.1:12000/mcp"' in contents
105
+ assert 'command = "uvx"' not in contents
106
+ assert "[mcp_servers.ouroboros.env]" not in contents
107
+
108
+ def test_register_codex_mcp_server_preserves_custom_command_by_default(
109
+ self,
110
+ tmp_path: Path,
111
+ ) -> None:
112
+ """Custom command-based Codex MCP configs are preserved in auto mode."""
113
+ codex_config = tmp_path / ".codex" / "config.toml"
114
+ codex_config.parent.mkdir(parents=True)
115
+ codex_config.write_text(
116
+ "[mcp_servers.ouroboros]\n"
117
+ 'command = "/tmp/ouroboros/.venv/bin/ouroboros"\n'
118
+ 'args = ["mcp", "serve"]\n',
119
+ encoding="utf-8",
120
+ )
121
+
122
+ with patch("pathlib.Path.home", return_value=tmp_path):
123
+ setup_cmd._register_codex_mcp_server()
124
+
125
+ contents = codex_config.read_text(encoding="utf-8")
126
+ assert 'command = "/tmp/ouroboros/.venv/bin/ouroboros"' in contents
127
+ assert 'command = "uvx"' not in contents
128
+
129
+ def test_register_codex_mcp_server_stdio_mode_replaces_url_config(
130
+ self,
131
+ tmp_path: Path,
132
+ ) -> None:
133
+ """Explicit stdio mode replaces a user-managed URL config."""
134
+ codex_config = tmp_path / ".codex" / "config.toml"
135
+ codex_config.parent.mkdir(parents=True)
136
+ codex_config.write_text(
137
+ '[mcp_servers.ouroboros]\nurl = "http://127.0.0.1:12000/mcp"\n',
138
+ encoding="utf-8",
139
+ )
140
+
141
+ with patch("pathlib.Path.home", return_value=tmp_path):
142
+ setup_cmd._register_codex_mcp_server(mode="stdio")
143
+
144
+ contents = codex_config.read_text(encoding="utf-8")
145
+ assert 'url = "http://127.0.0.1:12000/mcp"' not in contents
146
+ assert 'command = "uvx"' in contents
147
+ assert "[mcp_servers.ouroboros.env]" in contents
148
+
149
+ def test_register_codex_mcp_server_preserve_mode_does_not_create_config(
150
+ self,
151
+ tmp_path: Path,
152
+ ) -> None:
153
+ """Preserve mode skips MCP config changes entirely."""
154
+ with patch("pathlib.Path.home", return_value=tmp_path):
155
+ setup_cmd._register_codex_mcp_server(mode="preserve")
156
+
157
+ assert not (tmp_path / ".codex" / "config.toml").exists()
158
+
87
159
  def test_install_codex_artifacts_installs_rules_and_skills(self, tmp_path: Path) -> None:
88
160
  """Codex setup should install both managed rules and managed skills."""
89
161
  rules_path = tmp_path / ".codex" / "rules"
90
162
  skill_paths = [tmp_path / ".codex" / "skills" / "evaluate"]
163
+ result = CodexArtifactInstallResult(rules_path, tuple(skill_paths))
91
164
 
92
165
  with (
93
166
  patch("pathlib.Path.home", return_value=tmp_path),
94
- patch("ouroboros.codex.install_codex_rules", return_value=rules_path) as mock_rules,
95
- patch("ouroboros.codex.install_codex_skills", return_value=skill_paths) as mock_skills,
167
+ patch("ouroboros.codex.install_codex_artifacts", return_value=result) as mock_install,
96
168
  patch("ouroboros.cli.commands.setup.print_success") as mock_success,
97
169
  ):
98
170
  setup_cmd._install_codex_artifacts()
99
171
 
100
- mock_rules.assert_called_once()
101
- mock_skills.assert_called_once()
172
+ mock_install.assert_called_once()
102
173
  success_messages = [call.args[0] for call in mock_success.call_args_list]
103
174
  assert any("Installed Codex rules" in message for message in success_messages)
104
175
  assert any("Installed 1 Codex skills" in message for message in success_messages)
@@ -128,7 +199,7 @@ class TestCodexSetup:
128
199
  assert config_dict["orchestrator"]["codex_cli_path"] == "/usr/local/bin/codex"
129
200
  assert config_dict["llm"]["backend"] == "codex"
130
201
  mock_install.assert_called_once_with()
131
- mock_register.assert_called_once_with()
202
+ mock_register.assert_called_once_with(mode="auto")
132
203
 
133
204
  info_messages = [call.args[0] for call in mock_info.call_args_list]
134
205
  assert any("Config saved to" in message for message in info_messages)
@@ -11,6 +11,7 @@ from typer.testing import CliRunner
11
11
  from ouroboros.cli.commands.uninstall import (
12
12
  _remove_claude_mcp,
13
13
  _remove_claude_md_block,
14
+ _remove_codex_artifacts,
14
15
  _remove_codex_mcp,
15
16
  _remove_data_dir,
16
17
  _remove_opencode_bridge_plugin,
@@ -192,6 +193,36 @@ class TestRemoveCodexMcp:
192
193
  assert result is False
193
194
 
194
195
 
196
+ # ── _remove_codex_artifacts ──────────────────────────────────────
197
+
198
+
199
+ class TestRemoveCodexArtifacts:
200
+ """Tests for _remove_codex_artifacts helper."""
201
+
202
+ def test_removes_namespaced_codex_artifacts(self, tmp_path: Path) -> None:
203
+ rules_dir = tmp_path / ".codex" / "rules"
204
+ skills_dir = tmp_path / ".codex" / "skills"
205
+ rules_dir.mkdir(parents=True)
206
+ skills_dir.mkdir(parents=True)
207
+ (rules_dir / "ouroboros.md").write_text("rules", encoding="utf-8")
208
+ (rules_dir / "ouroboros-extra.md").write_text("extra", encoding="utf-8")
209
+ (rules_dir / "other.md").write_text("other", encoding="utf-8")
210
+ (skills_dir / "ouroboros-interview").mkdir()
211
+ (skills_dir / "ouroboros-run").mkdir()
212
+ (skills_dir / "other").mkdir()
213
+
214
+ with patch("pathlib.Path.home", return_value=tmp_path):
215
+ result = _remove_codex_artifacts(dry_run=False)
216
+
217
+ assert result is True
218
+ assert not (rules_dir / "ouroboros.md").exists()
219
+ assert (rules_dir / "ouroboros-extra.md").exists()
220
+ assert (rules_dir / "other.md").exists()
221
+ assert not (skills_dir / "ouroboros-interview").exists()
222
+ assert not (skills_dir / "ouroboros-run").exists()
223
+ assert (skills_dir / "other").exists()
224
+
225
+
195
226
  # ── _remove_claude_md_block ──────────────────────────────────────
196
227
 
197
228