ouroboros-ai 0.31.2.dev11__tar.gz → 0.31.2.dev13__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.dev11 → ouroboros_ai-0.31.2.dev13}/PKG-INFO +1 -1
  2. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/README.md +1 -0
  3. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/architecture.md +6 -0
  4. ouroboros_ai-0.31.2.dev13/docs/contributing/agent-os-kernel-terminology.md +73 -0
  5. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/_version.py +2 -2
  6. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/setup.py +24 -5
  7. ouroboros_ai-0.31.2.dev13/src/ouroboros/cli/opencode_config.py +179 -0
  8. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/ouroboros-bridge.test.ts +10 -2
  9. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/ouroboros-bridge.ts +2 -3
  10. ouroboros_ai-0.31.2.dev13/tests/unit/cli/test_opencode_config.py +244 -0
  11. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_setup.py +39 -0
  12. ouroboros_ai-0.31.2.dev11/src/ouroboros/cli/opencode_config.py +0 -95
  13. ouroboros_ai-0.31.2.dev11/tests/unit/cli/test_opencode_config.py +0 -111
  14. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.claude/settings.json +0 -0
  15. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.claude-plugin/.mcp.json +0 -0
  16. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.claude-plugin/marketplace.json +0 -0
  17. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.claude-plugin/plugin.json +0 -0
  18. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.env.example +0 -0
  19. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  20. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  21. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  22. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  23. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/workflows/dev-publish.yml +0 -0
  24. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/workflows/lint.yml +0 -0
  25. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/workflows/release.yml +0 -0
  26. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.github/workflows/test.yml +0 -0
  27. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.gitignore +0 -0
  28. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.mcp.json +0 -0
  29. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.ouroboros/mechanical.toml +0 -0
  30. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
  31. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
  32. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.pre-commit-config.yaml +0 -0
  33. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/.python-version +0 -0
  34. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/CHANGELOG.md +0 -0
  35. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/CLAUDE.md +0 -0
  36. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/CODE_OF_CONDUCT.md +0 -0
  37. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/CONTRIBUTING.md +0 -0
  38. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/Code-Review-Claude.md +0 -0
  39. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/Code-Review-Codex.md +0 -0
  40. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/HANDOFF.md +0 -0
  41. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/LICENSE +0 -0
  42. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/README.ko.md +0 -0
  43. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/README.md +0 -0
  44. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/SECURITY.md +0 -0
  45. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/UNINSTALL.md +0 -0
  46. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/cancel.md +0 -0
  47. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/evaluate.md +0 -0
  48. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/evolve.md +0 -0
  49. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/help.md +0 -0
  50. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/interview.md +0 -0
  51. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/ralph.md +0 -0
  52. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/run.md +0 -0
  53. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/seed.md +0 -0
  54. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/setup.md +0 -0
  55. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/status.md +0 -0
  56. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/tutorial.md +0 -0
  57. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/unstuck.md +0 -0
  58. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/commands/welcome.md +0 -0
  59. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/.gitignore +0 -0
  60. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/Cargo.lock +0 -0
  61. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/Cargo.toml +0 -0
  62. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/README.md +0 -0
  63. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/db.rs +0 -0
  64. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/main.rs +0 -0
  65. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/mock.rs +0 -0
  66. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/state.rs +0 -0
  67. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  68. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  69. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  70. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  71. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  72. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  73. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/api/README.md +0 -0
  74. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/api/core.md +0 -0
  75. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/api/mcp.md +0 -0
  76. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/cli-reference.md +0 -0
  77. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/config-reference.md +0 -0
  78. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/contributing/architecture-overview.md +0 -0
  79. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/contributing/findings-registry.md +0 -0
  80. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/contributing/issue-quality-policy.md +0 -0
  81. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/contributing/key-patterns.md +0 -0
  82. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/contributing/testing-guide.md +0 -0
  83. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/events.md +0 -0
  84. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/examples/mcp-config.yaml +0 -0
  85. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/examples/workflows/design-code-verify.md +0 -0
  86. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/examples/workflows/research-to-deliverable.md +0 -0
  87. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/getting-started.md +0 -0
  88. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/evaluation-pipeline.md +0 -0
  89. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/evolution-loop.md +0 -0
  90. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  91. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/mcp-best-practices.md +0 -0
  92. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/mcp-bridge.md +0 -0
  93. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/ooo-skill-dispatch-router.md +0 -0
  94. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/opencode-subagent-bridge.md +0 -0
  95. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/qa-backends.md +0 -0
  96. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/seed-authoring.md +0 -0
  97. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/guides/tui-usage.md +0 -0
  98. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/images/PLACEHOLDER_README.md +0 -0
  99. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/images/ouroboros.png +0 -0
  100. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/platform-support.md +0 -0
  101. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-capability-matrix.md +0 -0
  102. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-guides/claude-code.md +0 -0
  103. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-guides/codex.md +0 -0
  104. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-guides/gemini.md +0 -0
  105. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-guides/hermes.md +0 -0
  106. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/docs/runtime-guides/opencode.md +0 -0
  107. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/coordinator_test_seed.yaml +0 -0
  108. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/dummy_seed.yaml +0 -0
  109. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/parallel_subac_test_seed.yaml +0 -0
  110. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/subac_test_seed.yaml +0 -0
  111. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/README.md +0 -0
  112. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/__init__.py +0 -0
  113. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/__main__.py +0 -0
  114. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/cli.py +0 -0
  115. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/models.py +0 -0
  116. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/task_manager/storage.py +0 -0
  117. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/examples/test_display.py +0 -0
  118. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/hooks/hooks.json +0 -0
  119. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/llms-full.txt +0 -0
  120. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/llms.txt +0 -0
  121. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/project-context.md +0 -0
  122. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/pyproject.toml +0 -0
  123. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/drift-monitor.py +0 -0
  124. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/install.sh +0 -0
  125. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/keyword-detector.py +0 -0
  126. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/mcp-serve.sh +0 -0
  127. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/ralph-rewind.py +0 -0
  128. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/ralph.py +0 -0
  129. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/ralph.sh +0 -0
  130. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/session-start.py +0 -0
  131. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/sync-plugin-version.py +0 -0
  132. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/scripts/version-check.py +0 -0
  133. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/brownfield/SKILL.md +0 -0
  134. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/cancel/SKILL.md +0 -0
  135. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/evaluate/SKILL.md +0 -0
  136. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/evolve/SKILL.md +0 -0
  137. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/help/SKILL.md +0 -0
  138. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/interview/SKILL.md +0 -0
  139. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/pm/SKILL.md +0 -0
  140. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/publish/SKILL.md +0 -0
  141. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/qa/SKILL.md +0 -0
  142. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/ralph/SKILL.md +0 -0
  143. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/resume-session/SKILL.md +0 -0
  144. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/run/SKILL.md +0 -0
  145. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/seed/SKILL.md +0 -0
  146. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/setup/SKILL.md +0 -0
  147. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/status/SKILL.md +0 -0
  148. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/tutorial/SKILL.md +0 -0
  149. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/unstuck/SKILL.md +0 -0
  150. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/update/SKILL.md +0 -0
  151. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/skills/welcome/SKILL.md +0 -0
  152. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/__init__.py +0 -0
  153. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/__main__.py +0 -0
  154. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/__init__.py +0 -0
  155. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/advocate.md +0 -0
  156. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/analysis-agent.md +0 -0
  157. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/architect.md +0 -0
  158. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/breadth-keeper.md +0 -0
  159. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/code-executor.md +0 -0
  160. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/codebase-explorer.md +0 -0
  161. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  162. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/contrarian.md +0 -0
  163. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/evaluator.md +0 -0
  164. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/hacker.md +0 -0
  165. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/judge.md +0 -0
  166. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/loader.py +0 -0
  167. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/ontologist.md +0 -0
  168. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/ontology-analyst.md +0 -0
  169. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/qa-judge.md +0 -0
  170. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/research-agent.md +0 -0
  171. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/researcher.md +0 -0
  172. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/seed-architect.md +0 -0
  173. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/seed-closer.md +0 -0
  174. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  175. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/simplifier.md +0 -0
  176. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  177. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/__init__.py +0 -0
  178. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/ambiguity.py +0 -0
  179. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/brownfield.py +0 -0
  180. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/explore.py +0 -0
  181. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/interview.py +0 -0
  182. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/pm_completion.py +0 -0
  183. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/pm_document.py +0 -0
  184. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/pm_interview.py +0 -0
  185. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/pm_seed.py +0 -0
  186. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/question_classifier.py +0 -0
  187. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/bigbang/seed_generator.py +0 -0
  188. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/claude_permissions.py +0 -0
  189. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/__init__.py +0 -0
  190. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/__init__.py +0 -0
  191. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/cancel.py +0 -0
  192. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/config.py +0 -0
  193. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/detect.py +0 -0
  194. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/init.py +0 -0
  195. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/mcp.py +0 -0
  196. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/mcp_doctor.py +0 -0
  197. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/pm.py +0 -0
  198. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/resume.py +0 -0
  199. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/run.py +0 -0
  200. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/status.py +0 -0
  201. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/tui.py +0 -0
  202. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/commands/uninstall.py +0 -0
  203. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/__init__.py +0 -0
  204. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/panels.py +0 -0
  205. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/progress.py +0 -0
  206. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/prompting.py +0 -0
  207. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/tables.py +0 -0
  208. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  209. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/jsonc.py +0 -0
  210. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/cli/main.py +0 -0
  211. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/codex/__init__.py +0 -0
  212. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/codex/artifacts.py +0 -0
  213. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/codex/cli_policy.py +0 -0
  214. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/codex/ouroboros.md +0 -0
  215. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/codex_permissions.py +0 -0
  216. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/config/__init__.py +0 -0
  217. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/config/loader.py +0 -0
  218. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/config/models.py +0 -0
  219. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/__init__.py +0 -0
  220. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/ac_tree.py +0 -0
  221. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/context.py +0 -0
  222. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/directive.py +0 -0
  223. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/errors.py +0 -0
  224. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/file_lock.py +0 -0
  225. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/git_workflow.py +0 -0
  226. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/initial_context.py +0 -0
  227. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/json_utils.py +0 -0
  228. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/lineage.py +0 -0
  229. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/ontology_aspect.py +0 -0
  230. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/ontology_questions.py +0 -0
  231. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/project_paths.py +0 -0
  232. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/retry.py +0 -0
  233. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/security.py +0 -0
  234. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/seed.py +0 -0
  235. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/seed_contract.py +0 -0
  236. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/seed_contract_prompt.py +0 -0
  237. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/text.py +0 -0
  238. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/ttl_cache.py +0 -0
  239. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/types.py +0 -0
  240. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/core/worktree.py +0 -0
  241. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/__init__.py +0 -0
  242. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  243. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/checklist.py +0 -0
  244. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/consensus.py +0 -0
  245. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/detector.py +0 -0
  246. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/json_utils.py +0 -0
  247. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/languages.py +0 -0
  248. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/mechanical.py +0 -0
  249. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/models.py +0 -0
  250. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/pipeline.py +0 -0
  251. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/semantic.py +0 -0
  252. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/trigger.py +0 -0
  253. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
  254. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/__init__.py +0 -0
  255. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/base.py +0 -0
  256. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/control.py +0 -0
  257. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/decomposition.py +0 -0
  258. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/evaluation.py +0 -0
  259. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/interview.py +0 -0
  260. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/lineage.py +0 -0
  261. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/events/ontology.py +0 -0
  262. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/__init__.py +0 -0
  263. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/convergence.py +0 -0
  264. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/loop.py +0 -0
  265. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/projector.py +0 -0
  266. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/reflect.py +0 -0
  267. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/regression.py +0 -0
  268. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/evolution/wonder.py +0 -0
  269. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/execution/__init__.py +0 -0
  270. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/execution/atomicity.py +0 -0
  271. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/execution/decomposition.py +0 -0
  272. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/execution/double_diamond.py +0 -0
  273. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/execution/subagent.py +0 -0
  274. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/hermes/__init__.py +0 -0
  275. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/hermes/artifacts.py +0 -0
  276. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/__init__.py +0 -0
  277. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/bridge/__init__.py +0 -0
  278. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/bridge/bridge.py +0 -0
  279. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/bridge/config.py +0 -0
  280. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/bridge/factory.py +0 -0
  281. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/client/__init__.py +0 -0
  282. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/client/adapter.py +0 -0
  283. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/client/manager.py +0 -0
  284. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/client/protocol.py +0 -0
  285. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/errors.py +0 -0
  286. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/job_manager.py +0 -0
  287. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/resources/__init__.py +0 -0
  288. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/resources/handlers.py +0 -0
  289. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/server/__init__.py +0 -0
  290. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/server/adapter.py +0 -0
  291. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/server/protocol.py +0 -0
  292. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/server/security.py +0 -0
  293. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/__init__.py +0 -0
  294. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
  295. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
  296. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  297. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
  298. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  299. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  300. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/definitions.py +0 -0
  301. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  302. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  303. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
  304. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  305. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  306. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/qa.py +0 -0
  307. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  308. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/registry.py +0 -0
  309. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/tools/subagent.py +0 -0
  310. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/mcp/types.py +0 -0
  311. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/observability/__init__.py +0 -0
  312. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/observability/drift.py +0 -0
  313. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/observability/logging.py +0 -0
  314. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/observability/retrospective.py +0 -0
  315. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/__init__.py +0 -0
  316. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/__init__.py +0 -0
  317. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/opencode-plugin.d.ts +0 -0
  318. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/package.json +0 -0
  319. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/opencode/plugin/tsconfig.json +0 -0
  320. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/__init__.py +0 -0
  321. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/adapter.py +0 -0
  322. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/capabilities.py +0 -0
  323. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  324. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  325. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/control_plane.py +0 -0
  326. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/coordinator.py +0 -0
  327. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  328. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/events.py +0 -0
  329. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  330. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  331. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/gemini_cli_runtime.py +0 -0
  332. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  333. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/hermes_runtime.py +0 -0
  334. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/level_context.py +0 -0
  335. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  336. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  337. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
  338. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
  339. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  340. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  341. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/policy.py +0 -0
  342. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/rate_limit.py +0 -0
  343. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/runner.py +0 -0
  344. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  345. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  346. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/session.py +0 -0
  347. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  348. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/__init__.py +0 -0
  349. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/brownfield.py +0 -0
  350. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/checkpoint.py +0 -0
  351. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/event_store.py +0 -0
  352. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  353. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/migrations/runner.py +0 -0
  354. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  355. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  356. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/schema.py +0 -0
  357. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/persistence/uow.py +0 -0
  358. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/__init__.py +0 -0
  359. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/agents/__init__.py +0 -0
  360. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/agents/pool.py +0 -0
  361. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/agents/registry.py +0 -0
  362. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  363. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/orchestration/router.py +0 -0
  364. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  365. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/skills/__init__.py +0 -0
  366. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/skills/docs.py +0 -0
  367. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/skills/executor.py +0 -0
  368. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/skills/keywords.py +0 -0
  369. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/plugin/skills/registry.py +0 -0
  370. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/pm/__init__.py +0 -0
  371. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/pm/handoff.py +0 -0
  372. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/pm/renderer.py +0 -0
  373. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/__init__.py +0 -0
  374. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  375. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/base.py +0 -0
  376. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  377. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  378. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  379. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/factory.py +0 -0
  380. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
  381. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/gemini_event_normalizer.py +0 -0
  382. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/litellm_adapter.py +0 -0
  383. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/providers/opencode_adapter.py +0 -0
  384. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/py.typed +0 -0
  385. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/resilience/__init__.py +0 -0
  386. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/resilience/lateral.py +0 -0
  387. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/resilience/recovery.py +0 -0
  388. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/resilience/stagnation.py +0 -0
  389. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/router/__init__.py +0 -0
  390. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/router/command_parser.py +0 -0
  391. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/router/dispatch.py +0 -0
  392. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/router/registry.py +0 -0
  393. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/router/types.py +0 -0
  394. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/__init__.py +0 -0
  395. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/complexity.py +0 -0
  396. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/downgrade.py +0 -0
  397. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/escalation.py +0 -0
  398. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/router.py +0 -0
  399. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/routing/tiers.py +0 -0
  400. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/sandbox.py +0 -0
  401. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/secondary/__init__.py +0 -0
  402. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/secondary/scheduler.py +0 -0
  403. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/secondary/todo_registry.py +0 -0
  404. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/skills/__init__.py +0 -0
  405. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/skills/artifacts.py +0 -0
  406. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/strategies/__init__.py +0 -0
  407. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/strategies/devil_advocate.py +0 -0
  408. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/__init__.py +0 -0
  409. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/app.py +0 -0
  410. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/components/__init__.py +0 -0
  411. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/components/agents_panel.py +0 -0
  412. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/components/event_log.py +0 -0
  413. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/components/progress.py +0 -0
  414. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/components/token_tracker.py +0 -0
  415. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/events.py +0 -0
  416. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/__init__.py +0 -0
  417. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  418. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/dashboard.py +0 -0
  419. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  420. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  421. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/debug.py +0 -0
  422. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/execution.py +0 -0
  423. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  424. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  425. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  426. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/logs.py +0 -0
  427. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/screens/session_selector.py +0 -0
  428. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/__init__.py +0 -0
  429. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  430. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  431. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  432. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  433. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  434. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  435. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  436. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  437. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/verification/__init__.py +0 -0
  438. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/verification/extractor.py +0 -0
  439. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/verification/models.py +0 -0
  440. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/src/ouroboros/verification/verifier.py +0 -0
  441. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/__init__.py +0 -0
  442. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/conftest.py +0 -0
  443. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/__init__.py +0 -0
  444. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/conftest.py +0 -0
  445. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
  446. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/test_cli_commands.py +0 -0
  447. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/test_full_workflow.py +0 -0
  448. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/e2e/test_session_persistence.py +0 -0
  449. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/fixtures/router/skills/frontmatter-body/run/SKILL.md +0 -0
  450. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/fixtures/test_atomicity_seed.yml +0 -0
  451. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/__init__.py +0 -0
  452. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/conftest.py +0 -0
  453. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/__init__.py +0 -0
  454. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/bridge/__init__.py +0 -0
  455. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
  456. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/conftest.py +0 -0
  457. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/test_client_adapter.py +0 -0
  458. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/test_client_manager.py +0 -0
  459. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/mcp/test_server_adapter.py +0 -0
  460. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/plugin/test_orchestration.py +0 -0
  461. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/test_cancel_subprocess_termination.py +0 -0
  462. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  463. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/test_codex_skill_fallback.py +0 -0
  464. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/test_codex_skill_smoke.py +0 -0
  465. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/integration/test_entry_point.py +0 -0
  466. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/test-execution-plan.md +0 -0
  467. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/__init__.py +0 -0
  468. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/agents/__init__.py +0 -0
  469. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/agents/test_loader.py +0 -0
  470. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/__init__.py +0 -0
  471. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_ambiguity.py +0 -0
  472. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_brownfield.py +0 -0
  473. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_classifier_context.py +0 -0
  474. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  475. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_explore.py +0 -0
  476. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_interview.py +0 -0
  477. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_interview_async_io.py +0 -0
  478. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
  479. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
  480. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_completion.py +0 -0
  481. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  482. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  483. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_interview.py +0 -0
  484. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  485. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  486. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  487. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_question_classifier.py +0 -0
  488. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/bigbang/test_seed_generator.py +0 -0
  489. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/__init__.py +0 -0
  490. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/commands/test_tui_command.py +0 -0
  491. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/conftest.py +0 -0
  492. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/__init__.py +0 -0
  493. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_console.py +0 -0
  494. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_panels.py +0 -0
  495. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_progress.py +0 -0
  496. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_prompting.py +0 -0
  497. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_tables.py +0 -0
  498. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  499. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_bridge_plugin_hardening.py +0 -0
  500. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_bridge_plugin_lifecycle.py +0 -0
  501. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_cancel.py +0 -0
  502. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_config.py +0 -0
  503. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_doc_commands.py +0 -0
  504. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  505. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_init_runtime.py +0 -0
  506. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_jsonc.py +0 -0
  507. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_main.py +0 -0
  508. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_mcp_doctor.py +0 -0
  509. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  510. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_mcp_shell_env.py +0 -0
  511. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  512. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_mcp_validate_transport_stderr.py +0 -0
  513. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm.py +0 -0
  514. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_brownfield.py +0 -0
  515. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_completion.py +0 -0
  516. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
  517. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
  518. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_overwrite.py +0 -0
  519. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
  520. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_pm_select_repos.py +0 -0
  521. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_resume.py +0 -0
  522. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_run_qa.py +0 -0
  523. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/cli/test_uninstall.py +0 -0
  524. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/codex/test_cli_policy.py +0 -0
  525. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/config/__init__.py +0 -0
  526. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/config/test_loader.py +0 -0
  527. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/config/test_loader_env.py +0 -0
  528. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/config/test_models.py +0 -0
  529. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/__init__.py +0 -0
  530. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_ac_tree.py +0 -0
  531. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_context.py +0 -0
  532. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_directive.py +0 -0
  533. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_errors.py +0 -0
  534. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_file_lock.py +0 -0
  535. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_git_workflow.py +0 -0
  536. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_initial_context.py +0 -0
  537. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_lineage.py +0 -0
  538. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_ontology_aspect.py +0 -0
  539. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_ontology_questions.py +0 -0
  540. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_retry.py +0 -0
  541. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_security.py +0 -0
  542. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_seed.py +0 -0
  543. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_ttl_cache.py +0 -0
  544. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_types.py +0 -0
  545. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/core/test_worktree.py +0 -0
  546. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/__init__.py +0 -0
  547. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
  548. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_checklist.py +0 -0
  549. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_consensus.py +0 -0
  550. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_detector.py +0 -0
  551. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_json_utils.py +0 -0
  552. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_languages.py +0 -0
  553. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_mechanical.py +0 -0
  554. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_models.py +0 -0
  555. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_pipeline_stage1_reuse.py +0 -0
  556. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
  557. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_review_fixes.py +0 -0
  558. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_semantic.py +0 -0
  559. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_trigger.py +0 -0
  560. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
  561. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
  562. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/events/__init__.py +0 -0
  563. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/events/test_base.py +0 -0
  564. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/events/test_control_events.py +0 -0
  565. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/events/test_decomposition_events.py +0 -0
  566. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/evolution/test_wonder_scope.py +0 -0
  567. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/execution/__init__.py +0 -0
  568. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/execution/test_atomicity.py +0 -0
  569. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/execution/test_decomposition.py +0 -0
  570. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/execution/test_double_diamond.py +0 -0
  571. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/execution/test_subagent_isolation.py +0 -0
  572. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/hermes/test_artifacts.py +0 -0
  573. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/__init__.py +0 -0
  574. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/__init__.py +0 -0
  575. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/test_bridge.py +0 -0
  576. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/test_config.py +0 -0
  577. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/test_factory.py +0 -0
  578. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
  579. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/bridge/test_stability.py +0 -0
  580. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/client/__init__.py +0 -0
  581. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/client/test_adapter.py +0 -0
  582. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
  583. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/client/test_manager.py +0 -0
  584. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/conftest.py +0 -0
  585. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/server/__init__.py +0 -0
  586. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/server/test_adapter.py +0 -0
  587. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/server/test_security.py +0 -0
  588. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/test_errors.py +0 -0
  589. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/test_job_manager.py +0 -0
  590. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/test_types.py +0 -0
  591. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/__init__.py +0 -0
  592. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/conftest.py +0 -0
  593. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
  594. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
  595. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
  596. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
  597. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
  598. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
  599. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
  600. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
  601. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
  602. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
  603. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
  604. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
  605. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  606. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_checklist_verify.py +0 -0
  607. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_definitions.py +0 -0
  608. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_evaluate_multi_ac.py +0 -0
  609. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_handler_subagent_wiring.py +0 -0
  610. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_interview_done_streak.py +0 -0
  611. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_interview_reopen_seed_ready.py +0 -0
  612. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_lateral_think_handler.py +0 -0
  613. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
  614. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  615. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  616. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
  617. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_registry.py +0 -0
  618. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_round5_fixes.py +0 -0
  619. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/mcp/tools/test_subagent.py +0 -0
  620. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/observability/__init__.py +0 -0
  621. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/observability/test_drift.py +0 -0
  622. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/observability/test_logging.py +0 -0
  623. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/observability/test_retrospective.py +0 -0
  624. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/__init__.py +0 -0
  625. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_adapter.py +0 -0
  626. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_capabilities.py +0 -0
  627. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  628. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  629. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  630. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_control_plane.py +0 -0
  631. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_coordinator.py +0 -0
  632. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  633. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_events.py +0 -0
  634. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  635. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  636. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_gemini_cli_runtime.py +0 -0
  637. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_hermes_runtime.py +0 -0
  638. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  639. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_level_context.py +0 -0
  640. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  641. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  642. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
  643. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  644. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
  645. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
  646. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  647. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_policy.py +0 -0
  648. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_rate_limit.py +0 -0
  649. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_runner.py +0 -0
  650. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  651. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  652. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  653. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_sandbox_class.py +0 -0
  654. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_seed_prompt.py +0 -0
  655. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_session.py +0 -0
  656. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  657. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/__init__.py +0 -0
  658. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/test_brownfield_store.py +0 -0
  659. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/test_checkpoint.py +0 -0
  660. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/test_event_store.py +0 -0
  661. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/test_schema.py +0 -0
  662. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/persistence/test_uow.py +0 -0
  663. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/__init__.py +0 -0
  664. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/agents/__init__.py +0 -0
  665. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/agents/test_registry.py +0 -0
  666. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/orchestration/__init__.py +0 -0
  667. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  668. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/skills/__init__.py +0 -0
  669. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/skills/test_keywords.py +0 -0
  670. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/plugin/skills/test_registry.py +0 -0
  671. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/pm/__init__.py +0 -0
  672. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/pm/test_renderer.py +0 -0
  673. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/__init__.py +0 -0
  674. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_base.py +0 -0
  675. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  676. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  677. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_factory.py +0 -0
  678. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
  679. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_litellm_adapter.py +0 -0
  680. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/providers/test_opencode_adapter.py +0 -0
  681. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/resilience/__init__.py +0 -0
  682. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/resilience/test_lateral.py +0 -0
  683. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/resilience/test_recovery.py +0 -0
  684. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/resilience/test_stagnation.py +0 -0
  685. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/__init__.py +0 -0
  686. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_command_parser.py +0 -0
  687. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_dispatch.py +0 -0
  688. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_dispatch_result_shapes.py +0 -0
  689. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_extract_first_argument.py +0 -0
  690. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_invalid_dispatch_input_types.py +0 -0
  691. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_malformed_unknown_dispatch_errors.py +0 -0
  692. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_not_handled_resolution.py +0 -0
  693. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_registry.py +0 -0
  694. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_repository_dispatch_guard.py +0 -0
  695. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_router_resolution_pipeline.py +0 -0
  696. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_typed_frontmatter_fields.py +0 -0
  697. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/router/test_valid_dispatch_normalization.py +0 -0
  698. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/__init__.py +0 -0
  699. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/test_complexity.py +0 -0
  700. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/test_downgrade.py +0 -0
  701. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/test_escalation.py +0 -0
  702. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/test_router.py +0 -0
  703. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/routing/test_tiers.py +0 -0
  704. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/scripts/test_keyword_detector.py +0 -0
  705. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/scripts/test_session_start.py +0 -0
  706. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/scripts/test_version_check.py +0 -0
  707. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/secondary/__init__.py +0 -0
  708. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/secondary/test_scheduler.py +0 -0
  709. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/secondary/test_todo_registry.py +0 -0
  710. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/skills/test_skill_artifacts.py +0 -0
  711. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_artifact_collector.py +0 -0
  712. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_codex_artifacts.py +0 -0
  713. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_convergence.py +0 -0
  714. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_dashboard.py +0 -0
  715. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_dependencies_configured.py +0 -0
  716. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_evolve_rewind.py +0 -0
  717. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_evolve_step.py +0 -0
  718. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_graceful_shutdown.py +0 -0
  719. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_main_entry_point.py +0 -0
  720. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_module_structure.py +0 -0
  721. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_project_initialization.py +0 -0
  722. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_projector_rewind.py +0 -0
  723. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_ralph_parser.py +0 -0
  724. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_ralph_rewind.py +0 -0
  725. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_regression.py +0 -0
  726. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_tooling_configuration.py +0 -0
  727. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/test_verification.py +0 -0
  728. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/__init__.py +0 -0
  729. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_app.py +0 -0
  730. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_cancelled_display.py +0 -0
  731. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_events.py +0 -0
  732. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_lineage_viewer.py +0 -0
  733. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_screens.py +0 -0
  734. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_session_selector_replay.py +0 -0
  735. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tests/unit/tui/test_widgets.py +0 -0
  736. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/tools/sync_github_project.py +0 -0
  737. {ouroboros_ai-0.31.2.dev11 → ouroboros_ai-0.31.2.dev13}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.31.2.dev11
3
+ Version: 0.31.2.dev13
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
@@ -48,6 +48,7 @@ replayable execution contract on your choice of runtime backend.
48
48
 
49
49
  - [Contributing Guide](../CONTRIBUTING.md) - How to set up, code, test, and submit PRs
50
50
  - [Architecture for Contributors](./contributing/architecture-overview.md) - How modules connect
51
+ - [Agent OS Kernel Terminology](./contributing/agent-os-kernel-terminology.md) - Locked vocabulary for `AgentRuntimeContext`, `ControlPlane`, `ControlContract`, `Directive`, `ControlBus`, and `IOJournal`
51
52
  - [Testing Guide](./contributing/testing-guide.md) - Writing and running tests
52
53
  - [Key Patterns](./contributing/key-patterns.md) - Result type, immutability, event sourcing, protocols
53
54
  - [Findings Registry](./contributing/findings-registry.md) - Documentation audit findings registry
@@ -4,6 +4,12 @@
4
4
 
5
5
  Ouroboros is a **specification-first AI workflow engine** that transforms vague ideas into validated specifications before execution. Built on event sourcing with a rich TUI interface, it provides complete lifecycle management from requirements to evaluation.
6
6
 
7
+ Agent OS terminology is intentionally locked so kernel-level PRs do not blur
8
+ runtime context, control contracts, transport, and observability. See
9
+ [Agent OS Kernel Terminology](./contributing/agent-os-kernel-terminology.md)
10
+ for the canonical meanings of `AgentRuntimeContext`, `ControlPlane`,
11
+ `ControlContract`, `Directive`, `ControlBus`, and `IOJournal`.
12
+
7
13
  ```
8
14
  ┌─────────────────────────────────────────────────────────────────────────────────────────────────────┐
9
15
  │ OUROBOROS ARCHITECTURE │
@@ -0,0 +1,73 @@
1
+ # Agent OS Kernel Terminology
2
+
3
+ This document locks the kernel-level vocabulary for the Agent OS workstream.
4
+ It exists so review comments and stacked PRs use the same words for runtime
5
+ context, control decisions, transport, and journaled observability.
6
+
7
+ ## Locked Terms
8
+
9
+ | Term | Layer | Definition | Naming Rule |
10
+ |------|-------|------------|-------------|
11
+ | `AgentRuntimeContext` | Runtime context | The per-agent execution envelope. It carries stable runtime dependencies and capabilities such as event storage, runtime backend identity, LLM backend identity, MCP bridge access, and control surfaces. | Use when describing what an agent process is allowed to see or use during a run. |
12
+ | `ControlPlane` | Kernel control layer | The top-level conceptual layer for workflow control. It owns the vocabulary, contracts, routing rules, and transport surfaces that tell a runtime what should happen next. | Use for the architecture layer. Do not use `ControlBus` as the top-level concept. |
13
+ | `ControlContract` | Control invariant layer | The stable schema and behavioral contract for control messages: allowed directives, terminal semantics, retry budgets, timeout behavior, resume invariants, and required journaling. | Use when a PR defines or changes an invariant that consumers must obey. |
14
+ | `Directive` | Control vocabulary | The small, stable action alphabet emitted by decision sites, for example `CONTINUE`, `RETRY`, `WAIT`, `CANCEL`, and `CONVERGE`. | Use for the actual command value. Do not introduce local synonyms when an existing directive carries the meaning. |
15
+ | `ControlBus` | Control transport | The in-process publish/subscribe implementation that delivers control events or directives to subscribers. It is a transport inside the `ControlPlane`, not the plane itself. | Use only for the implementation that dispatches messages. |
16
+ | `IOJournal` | Observability journal | The durable record of external I/O, including paired LLM and tool call events. It explains what the runtime asked, what came back, and whether a call failed. | Use for the event-backed I/O log. Avoid treating ad hoc logs or stdout as the journal. |
17
+
18
+ ## Layering
19
+
20
+ The intended relationship is:
21
+
22
+ ```text
23
+ AgentRuntimeContext
24
+ -> exposes ControlPlane and runtime capabilities to a running agent
25
+
26
+ ControlPlane
27
+ -> governed by ControlContract
28
+ -> emits Directive values
29
+ -> may use ControlBus as an in-process transport
30
+ -> persists durable decisions through control.* events
31
+
32
+ IOJournal
33
+ -> records external LLM/tool I/O alongside control decisions
34
+ ```
35
+
36
+ In OS terms, `AgentRuntimeContext` is the process execution envelope,
37
+ `ControlPlane` is the kernel control layer, `ControlContract` is the syscall
38
+ contract, `Directive` is the command vocabulary, `ControlBus` is one local
39
+ delivery mechanism, and `IOJournal` is the replayable black box.
40
+
41
+ ## Control Contract Invariants
42
+
43
+ The following invariants should guide Agent OS PR review:
44
+
45
+ - Terminal directives are terminal. After `CANCEL` or `CONVERGE`, a runtime
46
+ must not start new work for the same execution unless a new contract ID or
47
+ explicit rerun is allocated.
48
+ - Retry behavior belongs to the control contract. `RETRY` must respect the
49
+ owning retry budget and must be journaled with enough context to explain why
50
+ the retry happened.
51
+ - `WAIT` means no forward progress until the awaited input, timeout, or queued
52
+ event arrives.
53
+ - Resume must preserve the original execution envelope: runtime backend, LLM
54
+ backend, working directory, MCP bridge capability, and user-selected safety
55
+ options must not silently change.
56
+ - Every durable control decision must be reconstructable from the event store.
57
+ Reactive delivery through `ControlBus` is not a substitute for persistence.
58
+ - External I/O that influences a decision must be reconstructable from the
59
+ `IOJournal`, using paired request/return events when possible.
60
+
61
+ ## Review Guidance
62
+
63
+ When reviewing Agent OS PRs:
64
+
65
+ - Ask whether the change belongs to context, contract, vocabulary, transport,
66
+ or journal.
67
+ - Prefer `ControlPlane` for architecture discussions and `ControlBus` only for
68
+ the in-process pub/sub implementation.
69
+ - Treat `ControlContract` changes as compatibility-sensitive, even when the
70
+ code diff is small.
71
+ - Treat `IOJournal` gaps as observability bugs when they prevent replaying why
72
+ a control decision happened.
73
+ - Treat resume drift as a control-contract bug, not a CLI polish issue.
@@ -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.dev11'
22
- __version_tuple__ = version_tuple = (0, 31, 2, 'dev11')
21
+ __version__ = version = '0.31.2.dev13'
22
+ __version_tuple__ = version_tuple = (0, 31, 2, 'dev13')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -12,7 +12,9 @@ Also provides brownfield repository management subcommands:
12
12
  from __future__ import annotations
13
13
 
14
14
  import asyncio
15
+ from contextlib import contextmanager
15
16
  import json
17
+ import os
16
18
  from pathlib import Path
17
19
  import shutil
18
20
  from typing import Annotated
@@ -718,6 +720,21 @@ def _detect_opencode_mcp_command() -> dict[str, list[str]] | None:
718
720
  # this file keeps its historic `_BRIDGE_PLUGIN_*` naming.
719
721
 
720
722
 
723
+ @contextmanager
724
+ def _temporary_opencode_cli_path(opencode_path: str):
725
+ """Expose the setup-selected OpenCode CLI path to config-dir discovery."""
726
+ key = "OUROBOROS_OPENCODE_CLI_PATH"
727
+ previous = os.environ.get(key)
728
+ os.environ[key] = opencode_path
729
+ try:
730
+ yield
731
+ finally:
732
+ if previous is None:
733
+ os.environ.pop(key, None)
734
+ else:
735
+ os.environ[key] = previous
736
+
737
+
721
738
  def _bridge_plugin_source_text() -> str | None:
722
739
  """Return the bridge plugin TypeScript source, or ``None`` when missing.
723
740
 
@@ -778,7 +795,7 @@ def _install_opencode_bridge_plugin() -> bool:
778
795
  Writes to the platform-appropriate OpenCode plugins directory:
779
796
 
780
797
  * Linux: ``~/.config/opencode/plugins/ouroboros-bridge/``
781
- * macOS: ``~/Library/Application Support/OpenCode/plugins/ouroboros-bridge/``
798
+ * macOS: ``~/.config/opencode/plugins/ouroboros-bridge/`` (or the directory reported by ``opencode debug paths``)
782
799
  * Windows: ``%APPDATA%\\OpenCode\\plugins\\ouroboros-bridge\\``
783
800
 
784
801
  Robustness:
@@ -1003,7 +1020,8 @@ def _setup_opencode(opencode_path: str, mode: str = "plugin") -> bool:
1003
1020
 
1004
1021
  # Mutual-exclusion cleanup: remove plugin-mode artifacts so both
1005
1022
  # paths are not active simultaneously (duplicate dispatch).
1006
- _cleanup_plugin_artifacts()
1023
+ with _temporary_opencode_cli_path(opencode_path):
1024
+ _cleanup_plugin_artifacts()
1007
1025
 
1008
1026
  print_success(f"Configured OpenCode subprocess runtime (CLI: {opencode_path})")
1009
1027
  print_info(f"Config saved to: {config_path}")
@@ -1013,9 +1031,10 @@ def _setup_opencode(opencode_path: str, mode: str = "plugin") -> bool:
1013
1031
  # if ALL steps succeed (fail-closed). Without this, a failed bridge install
1014
1032
  # leaves the user in plugin mode without a working bridge — subsequent runs
1015
1033
  # take the plugin dispatch path and silently break.
1016
- _install_ok = _install_opencode_bridge_plugin()
1017
- _mcp_ok = _ensure_opencode_mcp_entry()
1018
- _plugin_ok = _ensure_opencode_plugin_entry()
1034
+ with _temporary_opencode_cli_path(opencode_path):
1035
+ _install_ok = _install_opencode_bridge_plugin()
1036
+ _mcp_ok = _ensure_opencode_mcp_entry()
1037
+ _plugin_ok = _ensure_opencode_plugin_entry()
1019
1038
 
1020
1039
  if not (_install_ok and _mcp_ok and _plugin_ok):
1021
1040
  failed = []
@@ -0,0 +1,179 @@
1
+ """Shared helpers for locating the OpenCode configuration file.
2
+
3
+ Both :mod:`~ouroboros.cli.commands.setup` and
4
+ :mod:`~ouroboros.cli.commands.uninstall` need to find the same config file;
5
+ centralising the logic here avoids duplication and keeps the ``PermissionError``
6
+ / ``OSError`` guard in one place.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import os
12
+ from pathlib import Path
13
+ import subprocess
14
+ import sys
15
+
16
+ import yaml
17
+
18
+
19
+ def _expand_config_dir(raw: str) -> Path:
20
+ """Expand an OpenCode config directory string into a :class:`Path`."""
21
+ return Path(raw).expanduser()
22
+
23
+
24
+ def _configured_opencode_cli_path() -> Path | None:
25
+ """Return the setup-selected OpenCode CLI path when one is persisted.
26
+
27
+ Path discovery must be stable across setup, cleanup, and uninstall. Do not
28
+ fall back to whichever ``opencode`` happens to be on ``PATH`` here: machines
29
+ can have several OpenCode installs, and uninstall should target the same
30
+ install tree that setup recorded.
31
+ """
32
+ for key in ("OUROBOROS_OPENCODE_CLI_PATH", "OPENCODE_CLI_PATH"):
33
+ raw = os.environ.get(key, "").strip()
34
+ if raw:
35
+ return Path(raw).expanduser()
36
+
37
+ config_path = Path.home() / ".ouroboros" / "config.yaml"
38
+ try:
39
+ config = yaml.safe_load(config_path.read_text(encoding="utf-8")) or {}
40
+ except (OSError, yaml.YAMLError):
41
+ return None
42
+ if not isinstance(config, dict):
43
+ return None
44
+ orchestrator = config.get("orchestrator")
45
+ if not isinstance(orchestrator, dict):
46
+ return None
47
+ raw = orchestrator.get("opencode_cli_path")
48
+ if not isinstance(raw, str) or not raw.strip():
49
+ return None
50
+ return Path(raw.strip()).expanduser()
51
+
52
+
53
+ def _debug_paths_config_dir() -> Path | None:
54
+ """Return ``opencode debug paths`` config dir when the CLI reports one.
55
+
56
+ Current OpenCode releases expose the authoritative runtime directories via
57
+ ``opencode debug paths``. Querying it first avoids baking version-specific
58
+ platform assumptions into Ouroboros. Any failure falls back to deterministic
59
+ local resolution so setup still works on machines without OpenCode on PATH.
60
+ """
61
+ opencode = _configured_opencode_cli_path()
62
+ if not opencode:
63
+ return None
64
+ try:
65
+ result = subprocess.run(
66
+ [str(opencode), "debug", "paths"],
67
+ capture_output=True,
68
+ check=False,
69
+ text=True,
70
+ timeout=5,
71
+ )
72
+ except (FileNotFoundError, OSError, subprocess.TimeoutExpired):
73
+ return None
74
+ if result.returncode != 0:
75
+ return None
76
+ for line in result.stdout.splitlines():
77
+ parts = line.split(None, 1)
78
+ if len(parts) == 2 and parts[0] == "config":
79
+ return _expand_config_dir(parts[1])
80
+ return None
81
+
82
+
83
+ def opencode_config_dir() -> Path:
84
+ """Return the active OpenCode global config directory.
85
+
86
+ Resolution order:
87
+
88
+ 1. ``OPENCODE_CONFIG_DIR`` when explicitly set.
89
+ 2. ``opencode debug paths`` ``config`` value when the CLI is available.
90
+ 3. XDG-style default (``$XDG_CONFIG_HOME/opencode`` or
91
+ ``~/.config/opencode``) on macOS/Linux/other Unix platforms.
92
+ 4. Windows roaming config directory for Windows.
93
+
94
+ Older Ouroboros releases wrote macOS config under
95
+ ``~/Library/Application Support/OpenCode``. Current OpenCode releases use
96
+ XDG config paths on macOS too, so that legacy directory is intentionally not
97
+ the default unless OpenCode itself reports it through ``debug paths``.
98
+ """
99
+ explicit = os.environ.get("OPENCODE_CONFIG_DIR")
100
+ if explicit:
101
+ return _expand_config_dir(explicit)
102
+
103
+ reported = _debug_paths_config_dir()
104
+ if reported is not None:
105
+ return reported
106
+
107
+ if sys.platform == "win32":
108
+ appdata = os.environ.get("APPDATA") or str(Path.home() / "AppData" / "Roaming")
109
+ return Path(appdata) / "OpenCode"
110
+
111
+ xdg = os.environ.get("XDG_CONFIG_HOME") or str(Path.home() / ".config")
112
+ return Path(xdg) / "opencode"
113
+
114
+
115
+ def find_opencode_config(*, allow_default: bool = True) -> Path | None:
116
+ """Locate the existing OpenCode config file.
117
+
118
+ OpenCode checks (in order): ``opencode.jsonc``, ``opencode.json`` —
119
+ both inside :func:`opencode_config_dir`.
120
+
121
+ Args:
122
+ allow_default: When ``True`` (setup path), return
123
+ ``<config_dir>/opencode.json`` as a default for new
124
+ installations if neither file exists. When ``False``
125
+ (uninstall path), return ``None`` so the caller can skip
126
+ cleanly when no config is present.
127
+
128
+ Returns:
129
+ The first existing config path, the default path (when
130
+ *allow_default* is ``True``), or ``None``.
131
+ """
132
+ explicit_config = os.environ.get("OPENCODE_CONFIG")
133
+ if explicit_config:
134
+ config_path = Path(explicit_config).expanduser()
135
+ if allow_default or config_path.exists():
136
+ return config_path
137
+ return None
138
+
139
+ config_dir = opencode_config_dir()
140
+ for name in ("opencode.jsonc", "opencode.json"):
141
+ candidate = config_dir / name
142
+ try:
143
+ if candidate.exists():
144
+ return candidate
145
+ except OSError:
146
+ continue
147
+ return (config_dir / "opencode.json") if allow_default else None
148
+
149
+
150
+ # ── Bridge-plugin identity ───────────────────────────────────────
151
+ # Canonical subdirectory + filename of the OpenCode bridge plugin.
152
+ # Shared by setup (install + dedupe) and uninstall (tail-match removal)
153
+ # so both paths agree on what counts as "a bridge-plugin entry".
154
+ BRIDGE_PLUGIN_SUBDIR: tuple[str, str] = ("plugins", "ouroboros-bridge")
155
+ BRIDGE_PLUGIN_FILENAME: str = "ouroboros-bridge.ts"
156
+
157
+
158
+ def is_bridge_plugin_entry(entry: object) -> bool:
159
+ """Return ``True`` when *entry* refers to any bridge-plugin install.
160
+
161
+ Matches by directory-tail (``plugins/ouroboros-bridge``) + basename
162
+ (``ouroboros-bridge.ts``) rather than exact string equality — catches
163
+ stale entries from XDG reshuffles, Windows mixed separators, legacy
164
+ install paths, and sudo/root migrations. Setup uses this for dedupe;
165
+ uninstall uses it to remove stale entries, not just the exact
166
+ canonical path for this machine's current config layout.
167
+ """
168
+ if not isinstance(entry, str) or not entry:
169
+ return False
170
+ # Normalise path separators so Windows entries (``\``) compare equal.
171
+ normalised = entry.replace("\\", "/")
172
+ parts = [p for p in normalised.split("/") if p]
173
+ if len(parts) < 3:
174
+ return False
175
+ return (
176
+ parts[-1] == BRIDGE_PLUGIN_FILENAME
177
+ and parts[-2] == BRIDGE_PLUGIN_SUBDIR[1]
178
+ and parts[-3] == BRIDGE_PLUGIN_SUBDIR[0]
179
+ )
@@ -64,10 +64,18 @@ describe("cfg — platform config dir", () => {
64
64
  expect(cfg()).toBe("/home/u/.config/opencode")
65
65
  })
66
66
 
67
- test("darwin uses Library/Application Support", () => {
67
+ test("darwin uses XDG-style config path", () => {
68
68
  process.env.HOME = "/Users/u"
69
+ delete process.env.XDG_CONFIG_HOME
70
+ Object.defineProperty(process, "platform", { value: "darwin" })
71
+ expect(cfg()).toBe("/Users/u/.config/opencode")
72
+ })
73
+
74
+ test("OPENCODE_CONFIG_DIR overrides platform defaults", () => {
75
+ process.env.HOME = "/Users/u"
76
+ process.env.OPENCODE_CONFIG_DIR = "/custom/opencode"
69
77
  Object.defineProperty(process, "platform", { value: "darwin" })
70
- expect(cfg()).toBe("/Users/u/Library/Application Support/OpenCode")
78
+ expect(cfg()).toBe("/custom/opencode")
71
79
  })
72
80
 
73
81
  test("win32 uses APPDATA when present", () => {
@@ -6,10 +6,10 @@ import { randomBytes } from "crypto"
6
6
  // Platform-aware opencode config dir
7
7
  export function cfg(): string {
8
8
  const home = process.env.HOME ?? process.env.USERPROFILE ?? "/tmp"
9
+ if (process.env.OPENCODE_CONFIG_DIR)
10
+ return process.env.OPENCODE_CONFIG_DIR
9
11
  if (process.platform === "win32")
10
12
  return join(process.env.APPDATA ?? join(home, "AppData", "Roaming"), "OpenCode")
11
- if (process.platform === "darwin")
12
- return join(home, "Library", "Application Support", "OpenCode")
13
13
  return join(process.env.XDG_CONFIG_HOME ?? join(home, ".config"), "opencode")
14
14
  }
15
15
 
@@ -557,4 +557,3 @@ export default {
557
557
 
558
558
  // Test-only exports for mocked-client coverage.
559
559
  export { resolveMid as _resolveMid, dispatch as _dispatch, patch as _patch, sleep as _sleep, PATCH_RETRIES as _PATCH_RETRIES, RESOLVE_RETRIES as _RESOLVE_RETRIES }
560
-
@@ -0,0 +1,244 @@
1
+ """Unit tests for the shared opencode_config helper.
2
+
3
+ All tests patch ``opencode_config_dir`` directly so they are
4
+ platform-agnostic — no reliance on Linux-specific XDG paths.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from pathlib import Path
10
+ from types import SimpleNamespace
11
+ from unittest.mock import patch
12
+
13
+ import pytest
14
+
15
+ from ouroboros.cli.opencode_config import find_opencode_config, opencode_config_dir
16
+
17
+ _OCD = "ouroboros.cli.opencode_config.opencode_config_dir"
18
+
19
+
20
+ class TestFindOpencodeConfig:
21
+ """Tests for find_opencode_config()."""
22
+
23
+ def test_prefers_jsonc_over_json(self, tmp_path: Path) -> None:
24
+ """opencode.jsonc takes priority over opencode.json when both exist."""
25
+ config_dir = tmp_path / "opencode"
26
+ config_dir.mkdir()
27
+ jsonc = config_dir / "opencode.jsonc"
28
+ json_ = config_dir / "opencode.json"
29
+ jsonc.write_text("{}")
30
+ json_.write_text("{}")
31
+
32
+ with patch(_OCD, return_value=config_dir):
33
+ result = find_opencode_config(allow_default=True)
34
+
35
+ assert result == jsonc
36
+
37
+ def test_falls_back_to_json_when_no_jsonc(self, tmp_path: Path) -> None:
38
+ """Returns opencode.json when only that file exists."""
39
+ config_dir = tmp_path / "opencode"
40
+ config_dir.mkdir()
41
+ json_ = config_dir / "opencode.json"
42
+ json_.write_text("{}")
43
+
44
+ with patch(_OCD, return_value=config_dir):
45
+ result = find_opencode_config(allow_default=True)
46
+
47
+ assert result == json_
48
+
49
+ def test_allow_default_true_returns_default_when_missing(self, tmp_path: Path) -> None:
50
+ """Returns default opencode.json path when no config exists and allow_default=True."""
51
+ config_dir = tmp_path / "opencode"
52
+ config_dir.mkdir()
53
+
54
+ with patch(_OCD, return_value=config_dir):
55
+ result = find_opencode_config(allow_default=True)
56
+
57
+ assert result == config_dir / "opencode.json"
58
+ assert result is not None
59
+
60
+ def test_allow_default_false_returns_none_when_missing(self, tmp_path: Path) -> None:
61
+ """Returns None when no config exists and allow_default=False."""
62
+ config_dir = tmp_path / "opencode"
63
+ config_dir.mkdir()
64
+
65
+ with patch(_OCD, return_value=config_dir):
66
+ result = find_opencode_config(allow_default=False)
67
+
68
+ assert result is None
69
+
70
+ def test_allow_default_false_returns_existing_file(self, tmp_path: Path) -> None:
71
+ """Returns existing file even when allow_default=False."""
72
+ config_dir = tmp_path / "opencode"
73
+ config_dir.mkdir()
74
+ jsonc = config_dir / "opencode.jsonc"
75
+ jsonc.write_text("{}")
76
+
77
+ with patch(_OCD, return_value=config_dir):
78
+ result = find_opencode_config(allow_default=False)
79
+
80
+ assert result == jsonc
81
+
82
+ def test_oserror_on_candidate_is_skipped(self, tmp_path: Path) -> None:
83
+ """OSError on exists() check is silently skipped — fallback continues."""
84
+ config_dir = tmp_path / "opencode"
85
+ config_dir.mkdir()
86
+ json_ = config_dir / "opencode.json"
87
+ json_.write_text("{}")
88
+
89
+ original_exists = Path.exists
90
+
91
+ def patched_exists(self: Path) -> bool:
92
+ if self.name == "opencode.jsonc":
93
+ raise OSError("permission denied")
94
+ return original_exists(self)
95
+
96
+ with (
97
+ patch(_OCD, return_value=config_dir),
98
+ patch.object(Path, "exists", patched_exists),
99
+ ):
100
+ result = find_opencode_config(allow_default=True)
101
+
102
+ # jsonc errored, falls through to json which exists
103
+ assert result == json_
104
+
105
+ def test_returns_jsonc_path_type(self, tmp_path: Path) -> None:
106
+ """Return value is always a Path instance (not str)."""
107
+ config_dir = tmp_path / "opencode"
108
+ config_dir.mkdir()
109
+ (config_dir / "opencode.jsonc").write_text("{}")
110
+
111
+ with patch(_OCD, return_value=config_dir):
112
+ result = find_opencode_config(allow_default=True)
113
+
114
+ assert isinstance(result, Path)
115
+
116
+ def test_honors_opencode_config_file_env(
117
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
118
+ ) -> None:
119
+ """OPENCODE_CONFIG points setup at an explicit config file."""
120
+ explicit = tmp_path / "custom" / "opencode.json"
121
+ monkeypatch.setenv("OPENCODE_CONFIG", str(explicit))
122
+
123
+ result = find_opencode_config(allow_default=True)
124
+
125
+ assert result == explicit
126
+
127
+ def test_opencode_config_file_env_requires_existing_when_no_default(
128
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
129
+ ) -> None:
130
+ """Uninstall-style lookup ignores a missing OPENCODE_CONFIG file."""
131
+ explicit = tmp_path / "missing.json"
132
+ monkeypatch.setenv("OPENCODE_CONFIG", str(explicit))
133
+
134
+ result = find_opencode_config(allow_default=False)
135
+
136
+ assert result is None
137
+
138
+
139
+ class TestOpencodeConfigDir:
140
+ """Tests for active OpenCode config-directory resolution."""
141
+
142
+ def test_honors_opencode_config_dir_env(
143
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
144
+ ) -> None:
145
+ """OPENCODE_CONFIG_DIR is the strongest explicit directory override."""
146
+ custom = tmp_path / "custom-opencode"
147
+ monkeypatch.setenv("OPENCODE_CONFIG_DIR", str(custom))
148
+
149
+ result = opencode_config_dir()
150
+
151
+ assert result == custom
152
+
153
+ def test_uses_debug_paths_config_when_available(
154
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
155
+ ) -> None:
156
+ """The OpenCode CLI-reported config dir is authoritative."""
157
+ reported = tmp_path / ".config" / "opencode"
158
+ monkeypatch.delenv("OPENCODE_CONFIG_DIR", raising=False)
159
+ monkeypatch.setenv("OUROBOROS_OPENCODE_CLI_PATH", "/bin/opencode")
160
+ monkeypatch.delenv("OPENCODE_CLI_PATH", raising=False)
161
+
162
+ completed = SimpleNamespace(
163
+ returncode=0,
164
+ stdout=f"home {tmp_path}\nconfig {reported}\nstate {tmp_path / '.state'}\n",
165
+ )
166
+ with patch("ouroboros.cli.opencode_config.subprocess.run", return_value=completed) as run:
167
+ result = opencode_config_dir()
168
+
169
+ assert result == reported
170
+ run.assert_called_once()
171
+ assert run.call_args.args[0][:3] == ["/bin/opencode", "debug", "paths"]
172
+
173
+ def test_uses_persisted_opencode_cli_path_for_debug_paths(
174
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
175
+ ) -> None:
176
+ """Post-setup cleanup/uninstall use the configured OpenCode binary."""
177
+ reported = tmp_path / "active" / "opencode"
178
+ config_dir = tmp_path / ".ouroboros"
179
+ config_dir.mkdir()
180
+ (config_dir / "config.yaml").write_text(
181
+ "orchestrator:\n opencode_cli_path: /configured/bin/opencode\n",
182
+ encoding="utf-8",
183
+ )
184
+ monkeypatch.delenv("OPENCODE_CONFIG_DIR", raising=False)
185
+ monkeypatch.delenv("OUROBOROS_OPENCODE_CLI_PATH", raising=False)
186
+ monkeypatch.delenv("OPENCODE_CLI_PATH", raising=False)
187
+
188
+ completed = SimpleNamespace(returncode=0, stdout=f"config {reported}\n")
189
+ with (
190
+ patch("pathlib.Path.home", return_value=tmp_path),
191
+ patch("ouroboros.cli.opencode_config.subprocess.run", return_value=completed) as run,
192
+ ):
193
+ result = opencode_config_dir()
194
+
195
+ assert result == reported
196
+ assert run.call_args.args[0][:3] == ["/configured/bin/opencode", "debug", "paths"]
197
+
198
+ def test_does_not_query_path_opencode_without_configured_cli(
199
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
200
+ ) -> None:
201
+ """Avoid targeting a different OpenCode install from PATH after setup."""
202
+ monkeypatch.delenv("OPENCODE_CONFIG_DIR", raising=False)
203
+ monkeypatch.delenv("OUROBOROS_OPENCODE_CLI_PATH", raising=False)
204
+ monkeypatch.delenv("OPENCODE_CLI_PATH", raising=False)
205
+ monkeypatch.delenv("XDG_CONFIG_HOME", raising=False)
206
+
207
+ with (
208
+ patch("pathlib.Path.home", return_value=tmp_path),
209
+ patch("ouroboros.cli.opencode_config.subprocess.run") as run,
210
+ ):
211
+ result = opencode_config_dir()
212
+
213
+ assert result == tmp_path / ".config" / "opencode"
214
+ run.assert_not_called()
215
+
216
+ def test_darwin_defaults_to_xdg_config_path(
217
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
218
+ ) -> None:
219
+ """Modern OpenCode uses XDG config on macOS, not Application Support."""
220
+ monkeypatch.delenv("OPENCODE_CONFIG_DIR", raising=False)
221
+ monkeypatch.delenv("XDG_CONFIG_HOME", raising=False)
222
+
223
+ with (
224
+ patch("ouroboros.cli.opencode_config.sys.platform", "darwin"),
225
+ patch("pathlib.Path.home", return_value=tmp_path),
226
+ ):
227
+ result = opencode_config_dir()
228
+
229
+ assert result == tmp_path / ".config" / "opencode"
230
+
231
+ def test_darwin_honors_xdg_config_home(
232
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
233
+ ) -> None:
234
+ """XDG_CONFIG_HOME applies on macOS as it does on Linux."""
235
+ xdg = tmp_path / "xdg"
236
+ monkeypatch.delenv("OPENCODE_CONFIG_DIR", raising=False)
237
+ monkeypatch.setenv("XDG_CONFIG_HOME", str(xdg))
238
+
239
+ with (
240
+ patch("ouroboros.cli.opencode_config.sys.platform", "darwin"),
241
+ ):
242
+ result = opencode_config_dir()
243
+
244
+ assert result == xdg / "opencode"