ouroboros-ai 0.26.2.dev37__tar.gz → 0.26.2.dev38__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 (557) hide show
  1. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/PKG-INFO +1 -1
  2. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/install.sh +5 -7
  3. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/pm/SKILL.md +20 -1
  4. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/setup/SKILL.md +39 -10
  5. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/update/SKILL.md +31 -9
  6. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/_version.py +2 -2
  7. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/setup.py +100 -52
  8. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_setup.py +164 -0
  9. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.claude/settings.json +0 -0
  10. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.claude-plugin/.mcp.json +0 -0
  11. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.claude-plugin/marketplace.json +0 -0
  12. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.claude-plugin/plugin.json +0 -0
  13. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.env.example +0 -0
  14. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  15. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  16. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  17. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  18. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/workflows/dev-publish.yml +0 -0
  19. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/workflows/lint.yml +0 -0
  20. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/workflows/release.yml +0 -0
  21. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.github/workflows/test.yml +0 -0
  22. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.gitignore +0 -0
  23. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.mcp.json +0 -0
  24. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.ouroboros/mechanical.toml +0 -0
  25. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.pre-commit-config.yaml +0 -0
  26. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/.python-version +0 -0
  27. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/CHANGELOG.md +0 -0
  28. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/CLAUDE.md +0 -0
  29. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/CODE_OF_CONDUCT.md +0 -0
  30. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/CONTRIBUTING.md +0 -0
  31. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/HANDOFF.md +0 -0
  32. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/LICENSE +0 -0
  33. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/README.ko.md +0 -0
  34. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/README.md +0 -0
  35. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/SECURITY.md +0 -0
  36. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/cancel.md +0 -0
  37. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/evaluate.md +0 -0
  38. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/evolve.md +0 -0
  39. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/help.md +0 -0
  40. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/interview.md +0 -0
  41. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/ralph.md +0 -0
  42. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/run.md +0 -0
  43. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/seed.md +0 -0
  44. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/setup.md +0 -0
  45. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/status.md +0 -0
  46. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/tutorial.md +0 -0
  47. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/unstuck.md +0 -0
  48. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/commands/welcome.md +0 -0
  49. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/.gitignore +0 -0
  50. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/Cargo.lock +0 -0
  51. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/Cargo.toml +0 -0
  52. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/README.md +0 -0
  53. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/db.rs +0 -0
  54. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/main.rs +0 -0
  55. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/mock.rs +0 -0
  56. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/state.rs +0 -0
  57. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  58. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  59. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  60. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  61. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  62. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  63. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/README.md +0 -0
  64. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/api/README.md +0 -0
  65. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/api/core.md +0 -0
  66. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/api/mcp.md +0 -0
  67. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/architecture.md +0 -0
  68. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/cli-reference.md +0 -0
  69. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/config-reference.md +0 -0
  70. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/contributing/architecture-overview.md +0 -0
  71. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/contributing/findings-registry.md +0 -0
  72. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/contributing/issue-quality-policy.md +0 -0
  73. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/contributing/key-patterns.md +0 -0
  74. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/contributing/testing-guide.md +0 -0
  75. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/examples/mcp-config.yaml +0 -0
  76. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/getting-started.md +0 -0
  77. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/guides/evaluation-pipeline.md +0 -0
  78. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/guides/evolution-loop.md +0 -0
  79. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  80. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/guides/seed-authoring.md +0 -0
  81. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/guides/tui-usage.md +0 -0
  82. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/images/PLACEHOLDER_README.md +0 -0
  83. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/images/ouroboros.png +0 -0
  84. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/platform-support.md +0 -0
  85. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/runtime-capability-matrix.md +0 -0
  86. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/runtime-guides/claude-code.md +0 -0
  87. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/docs/runtime-guides/codex.md +0 -0
  88. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/coordinator_test_seed.yaml +0 -0
  89. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/dummy_seed.yaml +0 -0
  90. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/parallel_subac_test_seed.yaml +0 -0
  91. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/subac_test_seed.yaml +0 -0
  92. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/README.md +0 -0
  93. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/__init__.py +0 -0
  94. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/__main__.py +0 -0
  95. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/cli.py +0 -0
  96. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/models.py +0 -0
  97. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/storage.py +0 -0
  98. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/examples/test_display.py +0 -0
  99. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/hooks/hooks.json +0 -0
  100. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/llms-full.txt +0 -0
  101. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/llms.txt +0 -0
  102. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/project-context.md +0 -0
  103. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/pyproject.toml +0 -0
  104. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/drift-monitor.py +0 -0
  105. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/keyword-detector.py +0 -0
  106. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/mcp-serve.sh +0 -0
  107. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/ralph-rewind.py +0 -0
  108. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/ralph.py +0 -0
  109. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/ralph.sh +0 -0
  110. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/session-start.py +0 -0
  111. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/sync-plugin-version.py +0 -0
  112. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/scripts/version-check.py +0 -0
  113. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/brownfield/SKILL.md +0 -0
  114. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/cancel/SKILL.md +0 -0
  115. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/evaluate/SKILL.md +0 -0
  116. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/evolve/SKILL.md +0 -0
  117. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/help/SKILL.md +0 -0
  118. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/interview/SKILL.md +0 -0
  119. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/qa/SKILL.md +0 -0
  120. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/ralph/SKILL.md +0 -0
  121. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/run/SKILL.md +0 -0
  122. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/seed/SKILL.md +0 -0
  123. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/status/SKILL.md +0 -0
  124. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/tutorial/SKILL.md +0 -0
  125. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/unstuck/SKILL.md +0 -0
  126. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/skills/welcome/SKILL.md +0 -0
  127. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/__init__.py +0 -0
  128. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/__main__.py +0 -0
  129. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/__init__.py +0 -0
  130. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/advocate.md +0 -0
  131. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/analysis-agent.md +0 -0
  132. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/architect.md +0 -0
  133. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/breadth-keeper.md +0 -0
  134. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/code-executor.md +0 -0
  135. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/codebase-explorer.md +0 -0
  136. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  137. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/contrarian.md +0 -0
  138. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/evaluator.md +0 -0
  139. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/hacker.md +0 -0
  140. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/judge.md +0 -0
  141. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/loader.py +0 -0
  142. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/ontologist.md +0 -0
  143. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/ontology-analyst.md +0 -0
  144. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/qa-judge.md +0 -0
  145. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/research-agent.md +0 -0
  146. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/researcher.md +0 -0
  147. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/seed-architect.md +0 -0
  148. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/seed-closer.md +0 -0
  149. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  150. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/simplifier.md +0 -0
  151. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  152. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/__init__.py +0 -0
  153. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/ambiguity.py +0 -0
  154. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/brownfield.py +0 -0
  155. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/explore.py +0 -0
  156. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/interview.py +0 -0
  157. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/pm_document.py +0 -0
  158. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/pm_interview.py +0 -0
  159. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/pm_seed.py +0 -0
  160. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/question_classifier.py +0 -0
  161. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/seed_generator.py +0 -0
  162. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/__init__.py +0 -0
  163. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/__init__.py +0 -0
  164. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/cancel.py +0 -0
  165. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/config.py +0 -0
  166. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/init.py +0 -0
  167. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/mcp.py +0 -0
  168. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/pm.py +0 -0
  169. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/run.py +0 -0
  170. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/status.py +0 -0
  171. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/tui.py +0 -0
  172. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/__init__.py +0 -0
  173. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/panels.py +0 -0
  174. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/progress.py +0 -0
  175. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/tables.py +0 -0
  176. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  177. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/main.py +0 -0
  178. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex/__init__.py +0 -0
  179. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex/artifacts.py +0 -0
  180. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex/ouroboros.md +0 -0
  181. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex_permissions.py +0 -0
  182. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/config/__init__.py +0 -0
  183. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/config/loader.py +0 -0
  184. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/config/models.py +0 -0
  185. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/__init__.py +0 -0
  186. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/ac_tree.py +0 -0
  187. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/context.py +0 -0
  188. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/errors.py +0 -0
  189. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/file_lock.py +0 -0
  190. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/git_workflow.py +0 -0
  191. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/lineage.py +0 -0
  192. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/ontology_aspect.py +0 -0
  193. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/ontology_questions.py +0 -0
  194. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/project_paths.py +0 -0
  195. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/security.py +0 -0
  196. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/seed.py +0 -0
  197. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/text.py +0 -0
  198. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/types.py +0 -0
  199. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/worktree.py +0 -0
  200. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/__init__.py +0 -0
  201. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  202. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/consensus.py +0 -0
  203. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/json_utils.py +0 -0
  204. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/languages.py +0 -0
  205. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/mechanical.py +0 -0
  206. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/models.py +0 -0
  207. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/pipeline.py +0 -0
  208. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/semantic.py +0 -0
  209. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/trigger.py +0 -0
  210. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
  211. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/__init__.py +0 -0
  212. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/base.py +0 -0
  213. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/decomposition.py +0 -0
  214. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/evaluation.py +0 -0
  215. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/interview.py +0 -0
  216. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/lineage.py +0 -0
  217. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/ontology.py +0 -0
  218. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/__init__.py +0 -0
  219. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/convergence.py +0 -0
  220. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/loop.py +0 -0
  221. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/projector.py +0 -0
  222. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/reflect.py +0 -0
  223. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/regression.py +0 -0
  224. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/wonder.py +0 -0
  225. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/__init__.py +0 -0
  226. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/atomicity.py +0 -0
  227. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/decomposition.py +0 -0
  228. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/double_diamond.py +0 -0
  229. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/subagent.py +0 -0
  230. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/__init__.py +0 -0
  231. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/__init__.py +0 -0
  232. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/adapter.py +0 -0
  233. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/manager.py +0 -0
  234. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/protocol.py +0 -0
  235. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/errors.py +0 -0
  236. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/job_manager.py +0 -0
  237. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/resources/__init__.py +0 -0
  238. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/resources/handlers.py +0 -0
  239. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/__init__.py +0 -0
  240. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/adapter.py +0 -0
  241. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/protocol.py +0 -0
  242. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/security.py +0 -0
  243. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/__init__.py +0 -0
  244. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  245. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  246. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  247. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/definitions.py +0 -0
  248. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  249. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  250. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
  251. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  252. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  253. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/qa.py +0 -0
  254. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  255. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/registry.py +0 -0
  256. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/types.py +0 -0
  257. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/__init__.py +0 -0
  258. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/drift.py +0 -0
  259. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/logging.py +0 -0
  260. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/retrospective.py +0 -0
  261. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/__init__.py +0 -0
  262. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/adapter.py +0 -0
  263. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  264. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  265. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/coordinator.py +0 -0
  266. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  267. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/events.py +0 -0
  268. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  269. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  270. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  271. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/level_context.py +0 -0
  272. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  273. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  274. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  275. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  276. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/runner.py +0 -0
  277. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  278. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  279. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/session.py +0 -0
  280. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  281. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/__init__.py +0 -0
  282. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/brownfield.py +0 -0
  283. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/checkpoint.py +0 -0
  284. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/event_store.py +0 -0
  285. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  286. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/runner.py +0 -0
  287. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  288. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  289. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/schema.py +0 -0
  290. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/uow.py +0 -0
  291. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/__init__.py +0 -0
  292. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/agents/__init__.py +0 -0
  293. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/agents/pool.py +0 -0
  294. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/agents/registry.py +0 -0
  295. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  296. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/orchestration/router.py +0 -0
  297. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  298. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/__init__.py +0 -0
  299. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/docs.py +0 -0
  300. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/executor.py +0 -0
  301. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/keywords.py +0 -0
  302. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/registry.py +0 -0
  303. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/pm/__init__.py +0 -0
  304. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/pm/renderer.py +0 -0
  305. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/__init__.py +0 -0
  306. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  307. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/base.py +0 -0
  308. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  309. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  310. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  311. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/factory.py +0 -0
  312. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/litellm_adapter.py +0 -0
  313. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/py.typed +0 -0
  314. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/resilience/__init__.py +0 -0
  315. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/resilience/lateral.py +0 -0
  316. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/resilience/stagnation.py +0 -0
  317. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/__init__.py +0 -0
  318. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/complexity.py +0 -0
  319. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/downgrade.py +0 -0
  320. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/escalation.py +0 -0
  321. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/router.py +0 -0
  322. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/tiers.py +0 -0
  323. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/secondary/__init__.py +0 -0
  324. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/secondary/scheduler.py +0 -0
  325. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/secondary/todo_registry.py +0 -0
  326. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/strategies/__init__.py +0 -0
  327. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/strategies/devil_advocate.py +0 -0
  328. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/__init__.py +0 -0
  329. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/app.py +0 -0
  330. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/__init__.py +0 -0
  331. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/agents_panel.py +0 -0
  332. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/event_log.py +0 -0
  333. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/progress.py +0 -0
  334. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/token_tracker.py +0 -0
  335. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/events.py +0 -0
  336. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/__init__.py +0 -0
  337. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  338. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/dashboard.py +0 -0
  339. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  340. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  341. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/debug.py +0 -0
  342. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/execution.py +0 -0
  343. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  344. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  345. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  346. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/logs.py +0 -0
  347. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/session_selector.py +0 -0
  348. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/__init__.py +0 -0
  349. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  350. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  351. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  352. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  353. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  354. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  355. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  356. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  357. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/__init__.py +0 -0
  358. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/extractor.py +0 -0
  359. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/models.py +0 -0
  360. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/verifier.py +0 -0
  361. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/__init__.py +0 -0
  362. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/conftest.py +0 -0
  363. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/e2e/__init__.py +0 -0
  364. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/e2e/conftest.py +0 -0
  365. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/e2e/test_cli_commands.py +0 -0
  366. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/e2e/test_full_workflow.py +0 -0
  367. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/e2e/test_session_persistence.py +0 -0
  368. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/fixtures/test_atomicity_seed.yml +0 -0
  369. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/__init__.py +0 -0
  370. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/conftest.py +0 -0
  371. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/__init__.py +0 -0
  372. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/conftest.py +0 -0
  373. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/test_client_adapter.py +0 -0
  374. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/test_client_manager.py +0 -0
  375. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/test_server_adapter.py +0 -0
  376. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/plugin/test_orchestration.py +0 -0
  377. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  378. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_codex_skill_fallback.py +0 -0
  379. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_codex_skill_smoke.py +0 -0
  380. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_entry_point.py +0 -0
  381. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/__init__.py +0 -0
  382. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/agents/__init__.py +0 -0
  383. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/agents/test_loader.py +0 -0
  384. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/__init__.py +0 -0
  385. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_ambiguity.py +0 -0
  386. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_brownfield.py +0 -0
  387. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_classifier_context.py +0 -0
  388. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  389. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_explore.py +0 -0
  390. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_interview.py +0 -0
  391. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  392. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  393. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_interview.py +0 -0
  394. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  395. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  396. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  397. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_question_classifier.py +0 -0
  398. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_seed_generator.py +0 -0
  399. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/__init__.py +0 -0
  400. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/__init__.py +0 -0
  401. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_console.py +0 -0
  402. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_panels.py +0 -0
  403. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_progress.py +0 -0
  404. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_tables.py +0 -0
  405. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  406. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_cancel.py +0 -0
  407. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  408. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_init_runtime.py +0 -0
  409. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_main.py +0 -0
  410. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  411. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  412. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_pm_brownfield.py +0 -0
  413. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_pm_overwrite.py +0 -0
  414. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_pm_select_repos.py +0 -0
  415. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_run_qa.py +0 -0
  416. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/config/__init__.py +0 -0
  417. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/config/test_loader.py +0 -0
  418. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/config/test_models.py +0 -0
  419. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/__init__.py +0 -0
  420. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_ac_tree.py +0 -0
  421. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_context.py +0 -0
  422. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_errors.py +0 -0
  423. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_git_workflow.py +0 -0
  424. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_lineage.py +0 -0
  425. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_ontology_aspect.py +0 -0
  426. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_ontology_questions.py +0 -0
  427. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_security.py +0 -0
  428. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_seed.py +0 -0
  429. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_types.py +0 -0
  430. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_worktree.py +0 -0
  431. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/__init__.py +0 -0
  432. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_consensus.py +0 -0
  433. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_json_utils.py +0 -0
  434. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_languages.py +0 -0
  435. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_mechanical.py +0 -0
  436. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_models.py +0 -0
  437. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_semantic.py +0 -0
  438. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_trigger.py +0 -0
  439. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
  440. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/events/__init__.py +0 -0
  441. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/events/test_base.py +0 -0
  442. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/events/test_decomposition_events.py +0 -0
  443. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/evolution/test_wonder_scope.py +0 -0
  444. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/__init__.py +0 -0
  445. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_atomicity.py +0 -0
  446. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_decomposition.py +0 -0
  447. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_double_diamond.py +0 -0
  448. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_subagent_isolation.py +0 -0
  449. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/__init__.py +0 -0
  450. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/client/__init__.py +0 -0
  451. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/client/test_adapter.py +0 -0
  452. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/client/test_manager.py +0 -0
  453. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/conftest.py +0 -0
  454. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/server/__init__.py +0 -0
  455. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/server/test_adapter.py +0 -0
  456. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/server/test_security.py +0 -0
  457. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/test_errors.py +0 -0
  458. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/test_job_manager.py +0 -0
  459. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/test_types.py +0 -0
  460. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/__init__.py +0 -0
  461. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/conftest.py +0 -0
  462. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  463. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_definitions.py +0 -0
  464. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  465. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
  466. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  467. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_qa_integration.py +0 -0
  468. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_registry.py +0 -0
  469. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/__init__.py +0 -0
  470. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/test_drift.py +0 -0
  471. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/test_logging.py +0 -0
  472. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/test_retrospective.py +0 -0
  473. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/__init__.py +0 -0
  474. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_adapter.py +0 -0
  475. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  476. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  477. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  478. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_coordinator.py +0 -0
  479. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  480. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_events.py +0 -0
  481. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  482. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  483. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  484. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_level_context.py +0 -0
  485. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  486. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  487. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  488. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  489. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runner.py +0 -0
  490. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  491. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  492. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  493. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_session.py +0 -0
  494. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  495. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/__init__.py +0 -0
  496. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_brownfield_store.py +0 -0
  497. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_checkpoint.py +0 -0
  498. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_event_store.py +0 -0
  499. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_schema.py +0 -0
  500. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_uow.py +0 -0
  501. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/__init__.py +0 -0
  502. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/agents/__init__.py +0 -0
  503. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/agents/test_registry.py +0 -0
  504. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/orchestration/__init__.py +0 -0
  505. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  506. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/skills/__init__.py +0 -0
  507. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/skills/test_keywords.py +0 -0
  508. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/skills/test_registry.py +0 -0
  509. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/pm/__init__.py +0 -0
  510. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/pm/test_renderer.py +0 -0
  511. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/__init__.py +0 -0
  512. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_base.py +0 -0
  513. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  514. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  515. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_factory.py +0 -0
  516. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_litellm_adapter.py +0 -0
  517. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/resilience/__init__.py +0 -0
  518. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/resilience/test_lateral.py +0 -0
  519. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/resilience/test_stagnation.py +0 -0
  520. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/__init__.py +0 -0
  521. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_complexity.py +0 -0
  522. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_downgrade.py +0 -0
  523. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_escalation.py +0 -0
  524. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_router.py +0 -0
  525. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_tiers.py +0 -0
  526. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/scripts/test_keyword_detector.py +0 -0
  527. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/scripts/test_version_check.py +0 -0
  528. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/secondary/__init__.py +0 -0
  529. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/secondary/test_scheduler.py +0 -0
  530. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/secondary/test_todo_registry.py +0 -0
  531. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_artifact_collector.py +0 -0
  532. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_codex_artifacts.py +0 -0
  533. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_convergence.py +0 -0
  534. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_dashboard.py +0 -0
  535. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_dependencies_configured.py +0 -0
  536. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_evolve_rewind.py +0 -0
  537. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_evolve_step.py +0 -0
  538. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_graceful_shutdown.py +0 -0
  539. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_main_entry_point.py +0 -0
  540. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_module_structure.py +0 -0
  541. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_project_initialization.py +0 -0
  542. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_projector_rewind.py +0 -0
  543. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_ralph_parser.py +0 -0
  544. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_ralph_rewind.py +0 -0
  545. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_regression.py +0 -0
  546. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_tooling_configuration.py +0 -0
  547. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_verification.py +0 -0
  548. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/__init__.py +0 -0
  549. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_app.py +0 -0
  550. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_cancelled_display.py +0 -0
  551. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_events.py +0 -0
  552. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_lineage_viewer.py +0 -0
  553. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_screens.py +0 -0
  554. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_session_selector_replay.py +0 -0
  555. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_widgets.py +0 -0
  556. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/tools/sync_github_project.py +0 -0
  557. {ouroboros_ai-0.26.2.dev37 → ouroboros_ai-0.26.2.dev38}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.26.2.dev37
3
+ Version: 0.26.2.dev38
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
@@ -140,11 +140,9 @@ if [ "$HAS_UV" = true ]; then
140
140
  elif [ "$HAS_PIPX" = true ]; then
141
141
  INSTALL_METHOD="pipx"
142
142
  if [ -n "$PRE_FLAG" ]; then
143
- pipx install --pip-args='--pre' "$INSTALL_SPEC" 2>/dev/null \
144
- || pipx upgrade --pip-args='--pre' "$INSTALL_SPEC"
143
+ pipx install --force --pip-args='--pre' "$INSTALL_SPEC"
145
144
  else
146
- pipx install "$INSTALL_SPEC" 2>/dev/null \
147
- || pipx upgrade "$INSTALL_SPEC"
145
+ pipx install --force "$INSTALL_SPEC"
148
146
  fi
149
147
  else
150
148
  INSTALL_METHOD="pip"
@@ -184,11 +182,11 @@ if command -v claude &>/dev/null; then
184
182
 
185
183
  # MCP command matches the installer that actually ran in step 3
186
184
  if [ "$INSTALL_METHOD" = "uv" ]; then
187
- OUROBOROS_ENTRY='{"command":"uvx","args":["--from","ouroboros-ai[claude]","ouroboros","mcp","serve"],"timeout":600}'
185
+ OUROBOROS_ENTRY='{"command":"uvx","args":["--from","ouroboros-ai[claude]","ouroboros","mcp","serve"]}'
188
186
  elif [ "$INSTALL_METHOD" = "pipx" ]; then
189
- OUROBOROS_ENTRY='{"command":"ouroboros","args":["mcp","serve"],"timeout":600}'
187
+ OUROBOROS_ENTRY='{"command":"ouroboros","args":["mcp","serve"]}'
190
188
  else
191
- OUROBOROS_ENTRY='{"command":"python3","args":["-m","ouroboros","mcp","serve"],"timeout":600}'
189
+ OUROBOROS_ENTRY='{"command":"python3","args":["-m","ouroboros","mcp","serve"]}'
192
190
  fi
193
191
 
194
192
  # Find a working Python: system python3, or uv-managed python
@@ -15,7 +15,26 @@ PM-focused Socratic interview that produces a Product Requirements Document.
15
15
  ToolSearch query: "+ouroboros pm_interview"
16
16
  ```
17
17
 
18
- If not found → tell user to run `ooo setup` first. Stop.
18
+ If not found → **diagnose before telling user to run setup**:
19
+
20
+ 1. Check if MCP is already configured:
21
+ ```bash
22
+ grep -q '"ouroboros"' ~/.claude/mcp.json 2>/dev/null && echo "CONFIGURED" || echo "NOT_CONFIGURED"
23
+ ```
24
+
25
+ 2. **If NOT_CONFIGURED** → tell user to run `ooo setup` first. Stop.
26
+
27
+ 3. **If CONFIGURED** → MCP is registered but the server isn't connecting. Do NOT tell the user to run `ooo setup` again. Instead show:
28
+ ```
29
+ Ouroboros MCP is configured but not connected.
30
+
31
+ Try these steps in order:
32
+ 1. Restart Claude Code (Cmd+Shift+P → "Reload Window" or close/reopen terminal)
33
+ 2. Check MCP status: type /mcp in Claude Code
34
+ 3. If ouroboros shows "error", try: ooo update
35
+ 4. If still failing, re-run: ooo setup
36
+ ```
37
+ Stop.
19
38
 
20
39
  ### Step 2: Start Interview
21
40
 
@@ -123,16 +123,44 @@ Runtime backend [✓] Detected
123
123
 
124
124
  | Environment | Mode | Action |
125
125
  |:------------|:-----|:-------|
126
- | uvx + uv Python >= 3.12 | **Ready** | Proceed to MCP registration |
127
- | System Python >= 3.12 | **Ready** | Proceed to MCP registration |
126
+ | uvx + Python >= 3.12 | **Ready** | Proceed to MCP registration (uvx mode — extras always included) |
127
+ | No uvx + `ouroboros` binary in PATH | **Check deps** | Verify `[claude]` extras, then proceed (binary mode) |
128
+ | No uvx + Python >= 3.12 + `python3 -m ouroboros` works | **Check deps** | Verify `[claude]` extras, then proceed (pip mode) |
128
129
  | uvx + Python < 3.12 only | **Install needed** | Run `uv python install 3.12` then proceed |
129
- | No uvx | **Install needed** | Run `curl -LsSf https://astral.sh/uv/install.sh \| sh` then `uv python install 3.12` |
130
+ | No uvx + no ouroboros binary + no pip package | **Install needed** | Install uv first, then proceed |
130
131
 
131
- **IMPORTANT**: If Python >= 3.12 is not available, DO NOT skip to "Plugin-Only mode". Guide the user to install the prerequisites. MCP is required for the full Ouroboros experience.
132
+ **For binary/pip modes — verify `[claude]` extras are installed:**
133
+
134
+ Check method depends on how ouroboros was installed:
135
+ ```bash
136
+ # Detect install method
137
+ pipx list 2>/dev/null | grep -q ouroboros && echo "PIPX" || echo "NOT_PIPX"
138
+ ```
139
+
140
+ - **pipx users** (binary mode, installed via pipx):
141
+ ```bash
142
+ pipx runpip ouroboros-ai show claude-agent-sdk 2>/dev/null && echo "DEPS_OK" || echo "DEPS_MISSING"
143
+ ```
144
+ If `DEPS_MISSING`: `pipx install --force ouroboros-ai[claude]`
145
+
146
+ - **pip users** (pip mode):
147
+ ```bash
148
+ python3 -c "import claude_agent_sdk" 2>/dev/null && echo "DEPS_OK" || echo "DEPS_MISSING"
149
+ ```
150
+ If `DEPS_MISSING`: `python3 -m pip install ouroboros-ai[claude]`
151
+
152
+ If deps are missing and the user doesn't want to fix manually, recommend uvx:
153
+ ```
154
+ Or install uvx (recommended — handles deps automatically):
155
+ curl -LsSf https://astral.sh/uv/install.sh | sh
156
+ Then re-run: ooo setup
157
+ ```
158
+
159
+ **IMPORTANT**: The MCP server requires one of: (1) uvx, (2) ouroboros binary in PATH, or (3) ouroboros pip-installed. For options 2 and 3, the `[claude]` extra must also be installed. If none are available, guide the user to install uv — do NOT write a non-working fallback to mcp.json.
132
160
 
133
161
  **If prerequisites are missing, show:**
134
162
  ```
135
- Ouroboros requires Python >= 3.12 for the MCP server.
163
+ Ouroboros requires uvx (recommended) or the ouroboros package installed.
136
164
 
137
165
  Quick install (< 1 minute):
138
166
  curl -LsSf https://astral.sh/uv/install.sh | sh
@@ -173,12 +201,13 @@ This enables:
173
201
 
174
202
  **Automatically create or update `~/.claude/mcp.json`** (user-level, works across all projects).
175
203
 
176
- Choose the MCP command based on how ouroboros is installed:
177
- - If `uvx` is available: `{"command": "uvx", "args": ["--from", "ouroboros-ai[claude]", "ouroboros", "mcp", "serve"], "timeout": 600}`
178
- - If `ouroboros` binary is in PATH (pipx install): `{"command": "ouroboros", "args": ["mcp", "serve"], "timeout": 600}`
179
- - Fallback (pip install): `{"command": "python3", "args": ["-m", "ouroboros", "mcp", "serve"], "timeout": 600}`
204
+ Choose the MCP command based on how ouroboros is installed (check in order):
205
+ 1. If `which uvx` succeeds: `{"command": "uvx", "args": ["--from", "ouroboros-ai[claude]", "ouroboros", "mcp", "serve"]}`
206
+ 2. If `which ouroboros` succeeds: `{"command": "ouroboros", "args": ["mcp", "serve"]}`
207
+ 3. If `python3 -c "import ouroboros"` succeeds: `{"command": "python3", "args": ["-m", "ouroboros", "mcp", "serve"]}`
208
+ 4. If none of the above → **do NOT write to mcp.json**. Instead show the prerequisites message from Step 1 and stop.
180
209
 
181
- If `~/.claude/mcp.json` already exists, merge intelligently (preserve other servers).
210
+ If `~/.claude/mcp.json` already exists, read it, **always overwrite the `ouroboros` key** with the entry above (to fix stale args from older versions), and preserve all other server entries.
182
211
 
183
212
  **Celebration Checkpoint 2:**
184
213
  ```
@@ -80,38 +80,46 @@ When the user invokes this skill:
80
80
 
81
81
  4. **Run update** (if user chose to update):
82
82
 
83
- a. **Update PyPI package** — detect the original install method and use the same one:
83
+ a. **Update PyPI package** — detect the original install method and preserve `[claude]` extras:
84
84
 
85
- Check which installer was used (in priority order):
85
+ Check which installer was used:
86
86
  ```bash
87
87
  uv tool list 2>/dev/null | grep -q ouroboros && echo "uv"
88
88
  pipx list 2>/dev/null | grep -q ouroboros && echo "pipx"
89
89
  ```
90
90
 
91
+ > This skill runs inside Claude Code, so always use `ouroboros-ai[claude]`
92
+ > (includes `claude-agent-sdk` and `anthropic` required for MCP tools).
93
+
91
94
  - If installed via **uv tool** (most common with install.sh):
92
95
  ```bash
93
96
  # For pre-release targets:
94
- uv tool install --upgrade --prerelease=allow ouroboros-ai
97
+ uv tool install --upgrade --prerelease=allow ouroboros-ai[claude]
95
98
  # For stable targets:
96
- uv tool install --upgrade ouroboros-ai
99
+ uv tool install --upgrade ouroboros-ai[claude]
97
100
  ```
98
101
 
99
102
  - If installed via **pipx**:
103
+ > `pipx upgrade` cannot add extras to an existing venv — use `install --force` to reinstall with extras.
100
104
  ```bash
101
105
  # For pre-release targets:
102
- pipx upgrade --pip-args='--pre' ouroboros-ai
106
+ pipx install --force --pip-args='--pre' ouroboros-ai[claude]
103
107
  # For stable targets:
104
- pipx upgrade ouroboros-ai
108
+ pipx install --force ouroboros-ai[claude]
105
109
  ```
106
110
 
107
111
  - If installed via **pip** (fallback):
108
112
  ```bash
109
113
  # For pre-release targets:
110
- python3 -m pip install --upgrade --pre ouroboros-ai
114
+ python3 -m pip install --upgrade --pre ouroboros-ai[claude]
111
115
  # For stable targets:
112
- python3 -m pip install --upgrade ouroboros-ai
116
+ python3 -m pip install --upgrade ouroboros-ai[claude]
113
117
  ```
114
118
 
119
+ > **Note**: The `[claude]` extra is critical — it installs `claude-agent-sdk` and
120
+ > `anthropic` which are required for MCP tool execution. Omitting it causes MCP
121
+ > tools to fail silently at call time.
122
+
115
123
  b. **Update runtime integration**:
116
124
 
117
125
  For Claude Code:
@@ -125,7 +133,21 @@ When the user invokes this skill:
125
133
  ouroboros setup --runtime codex --non-interactive
126
134
  ```
127
135
 
128
- c. **Verify and update CLAUDE.md version marker**:
136
+ c. **Refresh MCP server config** (fixes stale args from older versions):
137
+
138
+ Run the same setup command used in step b to ensure MCP config is current:
139
+
140
+ For Claude Code:
141
+ ```bash
142
+ ouroboros setup --runtime claude --non-interactive
143
+ ```
144
+
145
+ For Codex CLI (already handled by step b above — skip this step).
146
+
147
+ This ensures `~/.claude/mcp.json` has the latest MCP command and args
148
+ (e.g., `ouroboros-ai[claude]` extras). Skips if already up to date.
149
+
150
+ d. **Verify and update CLAUDE.md version marker**:
129
151
  ```bash
130
152
  NEW_VERSION=$(ouroboros --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+[a-z0-9.]*')
131
153
  echo "Installed: v$NEW_VERSION"
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.26.2.dev37'
22
- __version_tuple__ = version_tuple = (0, 26, 2, 'dev37')
21
+ __version__ = version = '0.26.2.dev38'
22
+ __version_tuple__ = version_tuple = (0, 26, 2, 'dev38')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -32,6 +32,101 @@ from ouroboros.cli.formatters.panels import (
32
32
  )
33
33
  from ouroboros.persistence.brownfield import BrownfieldStore
34
34
 
35
+ # Canonical MCP args for Claude Code uvx installs — single source of truth.
36
+ _CLAUDE_UVX_ARGS: list[str] = [
37
+ "--from",
38
+ "ouroboros-ai[claude]",
39
+ "ouroboros",
40
+ "mcp",
41
+ "serve",
42
+ ]
43
+
44
+
45
+ def _detect_mcp_entry() -> dict[str, object] | None:
46
+ """Build the correct MCP entry based on how ouroboros is installed.
47
+
48
+ Priority: uvx > ouroboros binary > python3 -m ouroboros (verified).
49
+ Returns None if no working method is found.
50
+ Matches the contract in install.sh and skills/setup/SKILL.md.
51
+ """
52
+ if shutil.which("uvx"):
53
+ return {"command": "uvx", "args": list(_CLAUDE_UVX_ARGS)}
54
+ if shutil.which("ouroboros"):
55
+ return {"command": "ouroboros", "args": ["mcp", "serve"]}
56
+ # Only use python3 fallback if ouroboros is actually importable
57
+ import subprocess
58
+
59
+ try:
60
+ subprocess.run(
61
+ ["python3", "-c", "import ouroboros"],
62
+ capture_output=True,
63
+ timeout=10,
64
+ check=True,
65
+ )
66
+ except (subprocess.CalledProcessError, FileNotFoundError, subprocess.TimeoutExpired):
67
+ return None
68
+ return {"command": "python3", "args": ["-m", "ouroboros", "mcp", "serve"]}
69
+
70
+
71
+ def _ensure_claude_mcp_entry() -> None:
72
+ """Ensure ~/.claude/mcp.json has a correct ouroboros MCP entry.
73
+
74
+ Creates the entry if missing (detecting install method), updates stale
75
+ uvx args (e.g. ouroboros-ai without [claude] extras), and removes the
76
+ legacy timeout key. Skips the file write when nothing changed.
77
+ """
78
+ mcp_config_path = Path.home() / ".claude" / "mcp.json"
79
+ mcp_config_path.parent.mkdir(parents=True, exist_ok=True)
80
+
81
+ mcp_data: dict = {}
82
+ if mcp_config_path.exists():
83
+ mcp_data = json.loads(mcp_config_path.read_text())
84
+
85
+ mcp_data.setdefault("mcpServers", {})
86
+
87
+ existing = mcp_data["mcpServers"].get("ouroboros")
88
+ detected = _detect_mcp_entry()
89
+ needs_write = False
90
+
91
+ if existing is None:
92
+ if detected is None:
93
+ print_warning(
94
+ "Cannot register MCP server: no working ouroboros installation found.\n"
95
+ "Install with: curl -LsSf https://astral.sh/uv/install.sh | sh"
96
+ )
97
+ return
98
+ mcp_data["mcpServers"]["ouroboros"] = detected
99
+ needs_write = True
100
+ print_success("Registered MCP server in ~/.claude/mcp.json")
101
+ else:
102
+ # Remove legacy timeout key
103
+ if "timeout" in existing:
104
+ del existing["timeout"]
105
+ needs_write = True
106
+ print_info("Removed legacy MCP timeout override.")
107
+
108
+ # Update entry to match currently detected install method, but only
109
+ # for known standard commands. Custom entries (docker, nix, etc.) are
110
+ # left untouched so we don't break user-managed configurations.
111
+ _KNOWN_COMMANDS = {"uvx", "ouroboros", "python3", "python"}
112
+ if detected is not None and existing.get("command") in _KNOWN_COMMANDS:
113
+ if (
114
+ existing.get("command") != detected["command"]
115
+ or existing.get("args") != detected["args"]
116
+ ):
117
+ existing["command"] = detected["command"]
118
+ existing["args"] = detected["args"]
119
+ needs_write = True
120
+ print_info("Updated MCP server entry to match current install method.")
121
+
122
+ if not needs_write:
123
+ print_info("MCP server already registered.")
124
+
125
+ if needs_write:
126
+ with mcp_config_path.open("w") as f:
127
+ json.dump(mcp_data, f, indent=2)
128
+
129
+
35
130
  app = typer.Typer(
36
131
  name="setup",
37
132
  help="Set up Ouroboros for your environment.",
@@ -227,32 +322,9 @@ def _setup_codex(codex_path: str) -> None:
227
322
  _register_codex_mcp_server()
228
323
  _print_codex_config_guidance(config_path)
229
324
 
230
- # Also register MCP server for Codex users who also have Claude Code
231
- mcp_config_path = Path.home() / ".claude" / "mcp.json"
232
- if mcp_config_path.exists() or (Path.home() / ".claude").is_dir():
233
- mcp_config_path.parent.mkdir(parents=True, exist_ok=True)
234
-
235
- mcp_data: dict = {}
236
- if mcp_config_path.exists():
237
- mcp_data = json.loads(mcp_config_path.read_text())
238
-
239
- mcp_data.setdefault("mcpServers", {})
240
- entry = mcp_data["mcpServers"].get("ouroboros", {})
241
- if not entry:
242
- entry = {
243
- "command": "uvx",
244
- "args": ["--from", "ouroboros-ai", "ouroboros", "mcp", "serve"],
245
- }
246
- removed_timeout = entry.pop("timeout", None) is not None
247
- mcp_data["mcpServers"]["ouroboros"] = entry
248
-
249
- with mcp_config_path.open("w") as f:
250
- json.dump(mcp_data, f, indent=2)
251
-
252
- if removed_timeout:
253
- print_info("Removed legacy Claude MCP timeout override.")
254
- else:
255
- print_info("Updated Claude MCP server config.")
325
+ # Also register/fix MCP server for Codex users who also have Claude Code
326
+ if (Path.home() / ".claude").is_dir():
327
+ _ensure_claude_mcp_entry()
256
328
 
257
329
 
258
330
  def _setup_claude(claude_path: str) -> None:
@@ -279,32 +351,8 @@ def _setup_claude(claude_path: str) -> None:
279
351
  with config_path.open("w") as f:
280
352
  yaml.dump(config_dict, f, default_flow_style=False, sort_keys=False)
281
353
 
282
- # Register MCP server in ~/.claude/mcp.json
283
- mcp_config_path = Path.home() / ".claude" / "mcp.json"
284
- mcp_config_path.parent.mkdir(parents=True, exist_ok=True)
285
-
286
- mcp_data: dict = {}
287
- if mcp_config_path.exists():
288
- mcp_data = json.loads(mcp_config_path.read_text())
289
-
290
- mcp_data.setdefault("mcpServers", {})
291
- if "ouroboros" not in mcp_data["mcpServers"]:
292
- mcp_data["mcpServers"]["ouroboros"] = {
293
- "command": "uvx",
294
- "args": ["--from", "ouroboros-ai", "ouroboros", "mcp", "serve"],
295
- }
296
- with mcp_config_path.open("w") as f:
297
- json.dump(mcp_data, f, indent=2)
298
- print_success("Registered MCP server in ~/.claude/mcp.json")
299
- else:
300
- entry = mcp_data["mcpServers"]["ouroboros"]
301
- if "timeout" in entry:
302
- del entry["timeout"]
303
- with mcp_config_path.open("w") as f:
304
- json.dump(mcp_data, f, indent=2)
305
- print_info("Removed legacy MCP timeout override.")
306
- else:
307
- print_info("MCP server already registered.")
354
+ # Register/fix MCP server in ~/.claude/mcp.json
355
+ _ensure_claude_mcp_entry()
308
356
 
309
357
  print_success(f"Configured Claude Code runtime (CLI: {claude_path})")
310
358
  print_info(f"Config saved to: {config_path}")
@@ -264,9 +264,173 @@ class TestClaudeSetup:
264
264
  config_dict = yaml.safe_load(config_path.read_text(encoding="utf-8"))
265
265
 
266
266
  assert "timeout" not in claude_mcp["mcpServers"]["ouroboros"]
267
+ # Stale args (ouroboros-ai without [claude]) should be updated
268
+ assert claude_mcp["mcpServers"]["ouroboros"]["args"] == [
269
+ "--from",
270
+ "ouroboros-ai[claude]",
271
+ "ouroboros",
272
+ "mcp",
273
+ "serve",
274
+ ]
267
275
  assert config_dict["orchestrator"]["runtime_backend"] == "claude"
268
276
  assert config_dict["llm"]["backend"] == "claude"
269
277
 
278
+ @pytest.mark.parametrize(
279
+ "which_side_effect, expected_cmd, expected_args",
280
+ [
281
+ # uvx available → uvx entry with [claude] extras
282
+ (
283
+ lambda cmd: "/usr/local/bin/uvx" if cmd == "uvx" else None,
284
+ "uvx",
285
+ ["--from", "ouroboros-ai[claude]", "ouroboros", "mcp", "serve"],
286
+ ),
287
+ # no uvx, ouroboros binary available → binary entry
288
+ (
289
+ lambda cmd: "/usr/local/bin/ouroboros" if cmd == "ouroboros" else None,
290
+ "ouroboros",
291
+ ["mcp", "serve"],
292
+ ),
293
+ # no uvx, no binary → python3 -m fallback
294
+ (
295
+ lambda _cmd: None,
296
+ "python3",
297
+ ["-m", "ouroboros", "mcp", "serve"],
298
+ ),
299
+ ],
300
+ ids=["uvx", "pipx-binary", "pip-fallback"],
301
+ )
302
+ def test_setup_claude_creates_new_entry_per_install_method(
303
+ self,
304
+ tmp_path: Path,
305
+ which_side_effect,
306
+ expected_cmd: str,
307
+ expected_args: list[str],
308
+ ) -> None:
309
+ """New MCP entry command/args should match the detected install method."""
310
+ config_dir = tmp_path / ".ouroboros"
311
+ config_dir.mkdir()
312
+ config_path = config_dir / "config.yaml"
313
+ config_path.write_text("{}", encoding="utf-8")
314
+
315
+ claude_dir = tmp_path / ".claude"
316
+ claude_dir.mkdir()
317
+ claude_config = claude_dir / "mcp.json"
318
+ claude_config.write_text(json.dumps({"mcpServers": {}}), encoding="utf-8")
319
+
320
+ with (
321
+ patch("pathlib.Path.home", return_value=tmp_path),
322
+ patch("ouroboros.config.loader.ensure_config_dir", return_value=config_dir),
323
+ patch("ouroboros.cli.commands.setup.shutil.which", side_effect=which_side_effect),
324
+ ):
325
+ setup_cmd._setup_claude("/usr/local/bin/claude")
326
+
327
+ claude_mcp = json.loads(claude_config.read_text(encoding="utf-8"))
328
+ entry = claude_mcp["mcpServers"]["ouroboros"]
329
+ assert entry["command"] == expected_cmd
330
+ assert entry["args"] == expected_args
331
+
332
+ def test_setup_claude_preserves_custom_command(self, tmp_path: Path) -> None:
333
+ """Custom (non-standard) MCP command should not be overwritten."""
334
+ config_dir = tmp_path / ".ouroboros"
335
+ config_dir.mkdir()
336
+ config_path = config_dir / "config.yaml"
337
+ config_path.write_text("{}", encoding="utf-8")
338
+
339
+ custom_args = ["run", "--rm", "ouroboros-mcp"]
340
+ claude_dir = tmp_path / ".claude"
341
+ claude_dir.mkdir()
342
+ claude_config = claude_dir / "mcp.json"
343
+ claude_config.write_text(
344
+ json.dumps(
345
+ {
346
+ "mcpServers": {
347
+ "ouroboros": {
348
+ "command": "docker",
349
+ "args": custom_args,
350
+ }
351
+ }
352
+ }
353
+ ),
354
+ encoding="utf-8",
355
+ )
356
+
357
+ with (
358
+ patch("pathlib.Path.home", return_value=tmp_path),
359
+ patch("ouroboros.config.loader.ensure_config_dir", return_value=config_dir),
360
+ ):
361
+ setup_cmd._setup_claude("/usr/local/bin/claude")
362
+
363
+ claude_mcp = json.loads(claude_config.read_text(encoding="utf-8"))
364
+ # Custom command (docker) should be left untouched
365
+ assert claude_mcp["mcpServers"]["ouroboros"]["command"] == "docker"
366
+ assert claude_mcp["mcpServers"]["ouroboros"]["args"] == custom_args
367
+
368
+ def test_setup_claude_updates_stale_standard_entry(self, tmp_path: Path) -> None:
369
+ """Stale standard entry (e.g. python3) should be updated to detected method."""
370
+ config_dir = tmp_path / ".ouroboros"
371
+ config_dir.mkdir()
372
+ config_path = config_dir / "config.yaml"
373
+ config_path.write_text("{}", encoding="utf-8")
374
+
375
+ claude_dir = tmp_path / ".claude"
376
+ claude_dir.mkdir()
377
+ claude_config = claude_dir / "mcp.json"
378
+ claude_config.write_text(
379
+ json.dumps(
380
+ {
381
+ "mcpServers": {
382
+ "ouroboros": {
383
+ "command": "python3",
384
+ "args": ["-m", "ouroboros", "mcp", "serve"],
385
+ }
386
+ }
387
+ }
388
+ ),
389
+ encoding="utf-8",
390
+ )
391
+
392
+ # Simulate uvx now being available
393
+ with (
394
+ patch("pathlib.Path.home", return_value=tmp_path),
395
+ patch("ouroboros.config.loader.ensure_config_dir", return_value=config_dir),
396
+ patch(
397
+ "ouroboros.cli.commands.setup.shutil.which",
398
+ side_effect=lambda cmd: "/usr/local/bin/uvx" if cmd == "uvx" else None,
399
+ ),
400
+ ):
401
+ setup_cmd._setup_claude("/usr/local/bin/claude")
402
+
403
+ claude_mcp = json.loads(claude_config.read_text(encoding="utf-8"))
404
+ # Should be updated from python3 to uvx
405
+ assert claude_mcp["mcpServers"]["ouroboros"]["command"] == "uvx"
406
+ assert "ouroboros-ai[claude]" in str(claude_mcp["mcpServers"]["ouroboros"]["args"])
407
+
408
+ def test_setup_claude_skips_write_when_args_already_current(self, tmp_path: Path) -> None:
409
+ """No file write when args are already up to date."""
410
+ config_dir = tmp_path / ".ouroboros"
411
+ config_dir.mkdir()
412
+ config_path = config_dir / "config.yaml"
413
+ config_path.write_text("{}", encoding="utf-8")
414
+
415
+ current_args = ["--from", "ouroboros-ai[claude]", "ouroboros", "mcp", "serve"]
416
+ claude_dir = tmp_path / ".claude"
417
+ claude_dir.mkdir()
418
+ claude_config = claude_dir / "mcp.json"
419
+ claude_config.write_text(
420
+ json.dumps({"mcpServers": {"ouroboros": {"command": "uvx", "args": current_args}}}),
421
+ encoding="utf-8",
422
+ )
423
+ mtime_before = claude_config.stat().st_mtime
424
+
425
+ with (
426
+ patch("pathlib.Path.home", return_value=tmp_path),
427
+ patch("ouroboros.config.loader.ensure_config_dir", return_value=config_dir),
428
+ ):
429
+ setup_cmd._setup_claude("/usr/local/bin/claude")
430
+
431
+ # File should not be rewritten when nothing changed
432
+ assert claude_config.stat().st_mtime == mtime_before
433
+
270
434
 
271
435
  # ── Brownfield helper function tests ─────────────────────────────
272
436