ouroboros-ai 0.26.2.dev36__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.dev36 → ouroboros_ai-0.26.2.dev38}/PKG-INFO +1 -1
  2. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/scripts/install.sh +5 -7
  3. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/pm/SKILL.md +20 -1
  4. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/setup/SKILL.md +39 -10
  5. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/update/SKILL.md +31 -9
  6. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/_version.py +2 -2
  7. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/run.py +29 -4
  8. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/setup.py +100 -52
  9. ouroboros_ai-0.26.2.dev38/src/ouroboros/core/project_paths.py +59 -0
  10. ouroboros_ai-0.26.2.dev38/src/ouroboros/evaluation/verification_artifacts.py +464 -0
  11. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/evolution_handlers.py +76 -1
  12. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/execution_handlers.py +46 -4
  13. ouroboros_ai-0.26.2.dev38/tests/unit/cli/test_run_qa.py +214 -0
  14. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_setup.py +164 -0
  15. ouroboros_ai-0.26.2.dev38/tests/unit/evaluation/test_verification_artifacts.py +454 -0
  16. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_qa_integration.py +305 -30
  17. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.claude/settings.json +0 -0
  18. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.claude-plugin/.mcp.json +0 -0
  19. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.claude-plugin/marketplace.json +0 -0
  20. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.claude-plugin/plugin.json +0 -0
  21. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.env.example +0 -0
  22. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  23. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  24. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  25. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  26. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.github/workflows/dev-publish.yml +0 -0
  27. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.github/workflows/lint.yml +0 -0
  28. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.github/workflows/release.yml +0 -0
  29. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.github/workflows/test.yml +0 -0
  30. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.gitignore +0 -0
  31. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.mcp.json +0 -0
  32. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.ouroboros/mechanical.toml +0 -0
  33. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.pre-commit-config.yaml +0 -0
  34. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/.python-version +0 -0
  35. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/CHANGELOG.md +0 -0
  36. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/CLAUDE.md +0 -0
  37. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/CODE_OF_CONDUCT.md +0 -0
  38. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/CONTRIBUTING.md +0 -0
  39. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/HANDOFF.md +0 -0
  40. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/LICENSE +0 -0
  41. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/README.ko.md +0 -0
  42. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/README.md +0 -0
  43. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/SECURITY.md +0 -0
  44. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/cancel.md +0 -0
  45. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/evaluate.md +0 -0
  46. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/evolve.md +0 -0
  47. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/help.md +0 -0
  48. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/interview.md +0 -0
  49. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/ralph.md +0 -0
  50. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/run.md +0 -0
  51. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/seed.md +0 -0
  52. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/setup.md +0 -0
  53. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/status.md +0 -0
  54. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/tutorial.md +0 -0
  55. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/unstuck.md +0 -0
  56. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/commands/welcome.md +0 -0
  57. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/.gitignore +0 -0
  58. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/Cargo.lock +0 -0
  59. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/Cargo.toml +0 -0
  60. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/README.md +0 -0
  61. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/db.rs +0 -0
  62. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/main.rs +0 -0
  63. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/mock.rs +0 -0
  64. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/state.rs +0 -0
  65. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  66. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  67. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  68. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  69. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  70. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  71. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/README.md +0 -0
  72. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/api/README.md +0 -0
  73. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/api/core.md +0 -0
  74. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/api/mcp.md +0 -0
  75. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/architecture.md +0 -0
  76. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/cli-reference.md +0 -0
  77. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/config-reference.md +0 -0
  78. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/contributing/architecture-overview.md +0 -0
  79. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/contributing/findings-registry.md +0 -0
  80. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/contributing/issue-quality-policy.md +0 -0
  81. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/contributing/key-patterns.md +0 -0
  82. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/contributing/testing-guide.md +0 -0
  83. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/examples/mcp-config.yaml +0 -0
  84. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/getting-started.md +0 -0
  85. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/guides/evaluation-pipeline.md +0 -0
  86. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/guides/evolution-loop.md +0 -0
  87. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  88. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/guides/seed-authoring.md +0 -0
  89. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/guides/tui-usage.md +0 -0
  90. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/images/PLACEHOLDER_README.md +0 -0
  91. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/images/ouroboros.png +0 -0
  92. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/platform-support.md +0 -0
  93. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/runtime-capability-matrix.md +0 -0
  94. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/runtime-guides/claude-code.md +0 -0
  95. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/docs/runtime-guides/codex.md +0 -0
  96. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/coordinator_test_seed.yaml +0 -0
  97. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/dummy_seed.yaml +0 -0
  98. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/parallel_subac_test_seed.yaml +0 -0
  99. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/subac_test_seed.yaml +0 -0
  100. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/README.md +0 -0
  101. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/__init__.py +0 -0
  102. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/__main__.py +0 -0
  103. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/cli.py +0 -0
  104. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/models.py +0 -0
  105. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/task_manager/storage.py +0 -0
  106. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/examples/test_display.py +0 -0
  107. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/hooks/hooks.json +0 -0
  108. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/llms-full.txt +0 -0
  109. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/llms.txt +0 -0
  110. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/project-context.md +0 -0
  111. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/pyproject.toml +0 -0
  112. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/scripts/drift-monitor.py +0 -0
  113. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/scripts/keyword-detector.py +0 -0
  114. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/scripts/mcp-serve.sh +0 -0
  115. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/scripts/ralph-rewind.py +0 -0
  116. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/scripts/ralph.py +0 -0
  117. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/scripts/ralph.sh +0 -0
  118. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/scripts/session-start.py +0 -0
  119. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/scripts/sync-plugin-version.py +0 -0
  120. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/scripts/version-check.py +0 -0
  121. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/brownfield/SKILL.md +0 -0
  122. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/cancel/SKILL.md +0 -0
  123. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/evaluate/SKILL.md +0 -0
  124. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/evolve/SKILL.md +0 -0
  125. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/help/SKILL.md +0 -0
  126. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/interview/SKILL.md +0 -0
  127. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/qa/SKILL.md +0 -0
  128. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/ralph/SKILL.md +0 -0
  129. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/run/SKILL.md +0 -0
  130. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/seed/SKILL.md +0 -0
  131. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/status/SKILL.md +0 -0
  132. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/tutorial/SKILL.md +0 -0
  133. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/unstuck/SKILL.md +0 -0
  134. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/skills/welcome/SKILL.md +0 -0
  135. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/__init__.py +0 -0
  136. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/__main__.py +0 -0
  137. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/__init__.py +0 -0
  138. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/advocate.md +0 -0
  139. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/analysis-agent.md +0 -0
  140. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/architect.md +0 -0
  141. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/breadth-keeper.md +0 -0
  142. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/code-executor.md +0 -0
  143. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/codebase-explorer.md +0 -0
  144. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  145. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/contrarian.md +0 -0
  146. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/evaluator.md +0 -0
  147. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/hacker.md +0 -0
  148. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/judge.md +0 -0
  149. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/loader.py +0 -0
  150. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/ontologist.md +0 -0
  151. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/ontology-analyst.md +0 -0
  152. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/qa-judge.md +0 -0
  153. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/research-agent.md +0 -0
  154. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/researcher.md +0 -0
  155. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/seed-architect.md +0 -0
  156. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/seed-closer.md +0 -0
  157. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  158. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/simplifier.md +0 -0
  159. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  160. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/__init__.py +0 -0
  161. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/ambiguity.py +0 -0
  162. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/brownfield.py +0 -0
  163. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/explore.py +0 -0
  164. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/interview.py +0 -0
  165. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/pm_document.py +0 -0
  166. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/pm_interview.py +0 -0
  167. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/pm_seed.py +0 -0
  168. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/question_classifier.py +0 -0
  169. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/bigbang/seed_generator.py +0 -0
  170. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/__init__.py +0 -0
  171. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/__init__.py +0 -0
  172. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/cancel.py +0 -0
  173. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/config.py +0 -0
  174. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/init.py +0 -0
  175. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/mcp.py +0 -0
  176. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/pm.py +0 -0
  177. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/status.py +0 -0
  178. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/commands/tui.py +0 -0
  179. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/__init__.py +0 -0
  180. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/panels.py +0 -0
  181. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/progress.py +0 -0
  182. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/tables.py +0 -0
  183. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  184. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/cli/main.py +0 -0
  185. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex/__init__.py +0 -0
  186. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex/artifacts.py +0 -0
  187. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex/ouroboros.md +0 -0
  188. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/codex_permissions.py +0 -0
  189. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/config/__init__.py +0 -0
  190. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/config/loader.py +0 -0
  191. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/config/models.py +0 -0
  192. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/__init__.py +0 -0
  193. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/ac_tree.py +0 -0
  194. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/context.py +0 -0
  195. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/errors.py +0 -0
  196. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/file_lock.py +0 -0
  197. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/git_workflow.py +0 -0
  198. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/lineage.py +0 -0
  199. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/ontology_aspect.py +0 -0
  200. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/ontology_questions.py +0 -0
  201. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/security.py +0 -0
  202. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/seed.py +0 -0
  203. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/text.py +0 -0
  204. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/types.py +0 -0
  205. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/core/worktree.py +0 -0
  206. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/__init__.py +0 -0
  207. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  208. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/consensus.py +0 -0
  209. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/json_utils.py +0 -0
  210. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/languages.py +0 -0
  211. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/mechanical.py +0 -0
  212. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/models.py +0 -0
  213. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/pipeline.py +0 -0
  214. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/semantic.py +0 -0
  215. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evaluation/trigger.py +0 -0
  216. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/__init__.py +0 -0
  217. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/base.py +0 -0
  218. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/decomposition.py +0 -0
  219. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/evaluation.py +0 -0
  220. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/interview.py +0 -0
  221. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/lineage.py +0 -0
  222. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/events/ontology.py +0 -0
  223. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/__init__.py +0 -0
  224. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/convergence.py +0 -0
  225. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/loop.py +0 -0
  226. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/projector.py +0 -0
  227. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/reflect.py +0 -0
  228. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/regression.py +0 -0
  229. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/evolution/wonder.py +0 -0
  230. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/__init__.py +0 -0
  231. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/atomicity.py +0 -0
  232. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/decomposition.py +0 -0
  233. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/double_diamond.py +0 -0
  234. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/execution/subagent.py +0 -0
  235. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/__init__.py +0 -0
  236. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/__init__.py +0 -0
  237. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/adapter.py +0 -0
  238. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/manager.py +0 -0
  239. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/client/protocol.py +0 -0
  240. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/errors.py +0 -0
  241. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/job_manager.py +0 -0
  242. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/resources/__init__.py +0 -0
  243. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/resources/handlers.py +0 -0
  244. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/__init__.py +0 -0
  245. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/adapter.py +0 -0
  246. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/protocol.py +0 -0
  247. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/server/security.py +0 -0
  248. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/__init__.py +0 -0
  249. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  250. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  251. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  252. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/definitions.py +0 -0
  253. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  254. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  255. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  256. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/qa.py +0 -0
  257. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  258. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/tools/registry.py +0 -0
  259. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/mcp/types.py +0 -0
  260. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/__init__.py +0 -0
  261. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/drift.py +0 -0
  262. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/logging.py +0 -0
  263. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/observability/retrospective.py +0 -0
  264. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/__init__.py +0 -0
  265. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/adapter.py +0 -0
  266. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  267. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  268. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/coordinator.py +0 -0
  269. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  270. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/events.py +0 -0
  271. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  272. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  273. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  274. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/level_context.py +0 -0
  275. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  276. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  277. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  278. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  279. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/runner.py +0 -0
  280. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  281. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  282. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/session.py +0 -0
  283. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  284. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/__init__.py +0 -0
  285. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/brownfield.py +0 -0
  286. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/checkpoint.py +0 -0
  287. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/event_store.py +0 -0
  288. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  289. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/runner.py +0 -0
  290. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  291. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  292. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/schema.py +0 -0
  293. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/persistence/uow.py +0 -0
  294. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/__init__.py +0 -0
  295. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/agents/__init__.py +0 -0
  296. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/agents/pool.py +0 -0
  297. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/agents/registry.py +0 -0
  298. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  299. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/orchestration/router.py +0 -0
  300. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  301. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/__init__.py +0 -0
  302. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/docs.py +0 -0
  303. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/executor.py +0 -0
  304. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/keywords.py +0 -0
  305. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/plugin/skills/registry.py +0 -0
  306. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/pm/__init__.py +0 -0
  307. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/pm/renderer.py +0 -0
  308. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/__init__.py +0 -0
  309. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  310. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/base.py +0 -0
  311. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  312. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  313. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  314. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/factory.py +0 -0
  315. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/providers/litellm_adapter.py +0 -0
  316. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/py.typed +0 -0
  317. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/resilience/__init__.py +0 -0
  318. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/resilience/lateral.py +0 -0
  319. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/resilience/stagnation.py +0 -0
  320. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/__init__.py +0 -0
  321. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/complexity.py +0 -0
  322. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/downgrade.py +0 -0
  323. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/escalation.py +0 -0
  324. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/router.py +0 -0
  325. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/routing/tiers.py +0 -0
  326. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/secondary/__init__.py +0 -0
  327. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/secondary/scheduler.py +0 -0
  328. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/secondary/todo_registry.py +0 -0
  329. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/strategies/__init__.py +0 -0
  330. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/strategies/devil_advocate.py +0 -0
  331. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/__init__.py +0 -0
  332. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/app.py +0 -0
  333. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/__init__.py +0 -0
  334. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/agents_panel.py +0 -0
  335. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/event_log.py +0 -0
  336. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/progress.py +0 -0
  337. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/components/token_tracker.py +0 -0
  338. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/events.py +0 -0
  339. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/__init__.py +0 -0
  340. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  341. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/dashboard.py +0 -0
  342. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  343. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  344. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/debug.py +0 -0
  345. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/execution.py +0 -0
  346. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  347. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  348. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  349. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/logs.py +0 -0
  350. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/screens/session_selector.py +0 -0
  351. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/__init__.py +0 -0
  352. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  353. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  354. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  355. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  356. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  357. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  358. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  359. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  360. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/__init__.py +0 -0
  361. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/extractor.py +0 -0
  362. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/models.py +0 -0
  363. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/src/ouroboros/verification/verifier.py +0 -0
  364. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/__init__.py +0 -0
  365. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/conftest.py +0 -0
  366. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/e2e/__init__.py +0 -0
  367. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/e2e/conftest.py +0 -0
  368. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/e2e/test_cli_commands.py +0 -0
  369. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/e2e/test_full_workflow.py +0 -0
  370. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/e2e/test_session_persistence.py +0 -0
  371. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/fixtures/test_atomicity_seed.yml +0 -0
  372. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/__init__.py +0 -0
  373. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/conftest.py +0 -0
  374. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/__init__.py +0 -0
  375. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/conftest.py +0 -0
  376. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/test_client_adapter.py +0 -0
  377. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/test_client_manager.py +0 -0
  378. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/mcp/test_server_adapter.py +0 -0
  379. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/plugin/test_orchestration.py +0 -0
  380. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  381. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_codex_skill_fallback.py +0 -0
  382. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_codex_skill_smoke.py +0 -0
  383. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/integration/test_entry_point.py +0 -0
  384. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/__init__.py +0 -0
  385. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/agents/__init__.py +0 -0
  386. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/agents/test_loader.py +0 -0
  387. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/__init__.py +0 -0
  388. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_ambiguity.py +0 -0
  389. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_brownfield.py +0 -0
  390. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_classifier_context.py +0 -0
  391. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  392. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_explore.py +0 -0
  393. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_interview.py +0 -0
  394. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  395. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  396. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_interview.py +0 -0
  397. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  398. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  399. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  400. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_question_classifier.py +0 -0
  401. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/bigbang/test_seed_generator.py +0 -0
  402. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/__init__.py +0 -0
  403. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/__init__.py +0 -0
  404. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_console.py +0 -0
  405. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_panels.py +0 -0
  406. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_progress.py +0 -0
  407. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_tables.py +0 -0
  408. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  409. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_cancel.py +0 -0
  410. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  411. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_init_runtime.py +0 -0
  412. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_main.py +0 -0
  413. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  414. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  415. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_pm_brownfield.py +0 -0
  416. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_pm_overwrite.py +0 -0
  417. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/cli/test_pm_select_repos.py +0 -0
  418. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/config/__init__.py +0 -0
  419. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/config/test_loader.py +0 -0
  420. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/config/test_models.py +0 -0
  421. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/__init__.py +0 -0
  422. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_ac_tree.py +0 -0
  423. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_context.py +0 -0
  424. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_errors.py +0 -0
  425. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_git_workflow.py +0 -0
  426. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_lineage.py +0 -0
  427. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_ontology_aspect.py +0 -0
  428. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_ontology_questions.py +0 -0
  429. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_security.py +0 -0
  430. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_seed.py +0 -0
  431. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_types.py +0 -0
  432. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/core/test_worktree.py +0 -0
  433. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/__init__.py +0 -0
  434. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_consensus.py +0 -0
  435. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_json_utils.py +0 -0
  436. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_languages.py +0 -0
  437. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_mechanical.py +0 -0
  438. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_models.py +0 -0
  439. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_semantic.py +0 -0
  440. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/evaluation/test_trigger.py +0 -0
  441. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/events/__init__.py +0 -0
  442. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/events/test_base.py +0 -0
  443. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/events/test_decomposition_events.py +0 -0
  444. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/evolution/test_wonder_scope.py +0 -0
  445. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/__init__.py +0 -0
  446. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_atomicity.py +0 -0
  447. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_decomposition.py +0 -0
  448. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_double_diamond.py +0 -0
  449. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/execution/test_subagent_isolation.py +0 -0
  450. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/__init__.py +0 -0
  451. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/client/__init__.py +0 -0
  452. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/client/test_adapter.py +0 -0
  453. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/client/test_manager.py +0 -0
  454. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/conftest.py +0 -0
  455. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/server/__init__.py +0 -0
  456. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/server/test_adapter.py +0 -0
  457. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/server/test_security.py +0 -0
  458. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/test_errors.py +0 -0
  459. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/test_job_manager.py +0 -0
  460. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/test_types.py +0 -0
  461. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/__init__.py +0 -0
  462. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/conftest.py +0 -0
  463. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  464. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_definitions.py +0 -0
  465. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  466. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
  467. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  468. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/mcp/tools/test_registry.py +0 -0
  469. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/__init__.py +0 -0
  470. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/test_drift.py +0 -0
  471. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/test_logging.py +0 -0
  472. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/observability/test_retrospective.py +0 -0
  473. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/__init__.py +0 -0
  474. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_adapter.py +0 -0
  475. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  476. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  477. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  478. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_coordinator.py +0 -0
  479. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  480. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_events.py +0 -0
  481. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  482. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  483. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  484. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_level_context.py +0 -0
  485. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  486. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  487. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  488. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  489. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runner.py +0 -0
  490. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  491. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  492. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  493. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_session.py +0 -0
  494. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  495. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/__init__.py +0 -0
  496. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_brownfield_store.py +0 -0
  497. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_checkpoint.py +0 -0
  498. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_event_store.py +0 -0
  499. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_schema.py +0 -0
  500. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/persistence/test_uow.py +0 -0
  501. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/__init__.py +0 -0
  502. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/agents/__init__.py +0 -0
  503. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/agents/test_registry.py +0 -0
  504. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/orchestration/__init__.py +0 -0
  505. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  506. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/skills/__init__.py +0 -0
  507. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/skills/test_keywords.py +0 -0
  508. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/plugin/skills/test_registry.py +0 -0
  509. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/pm/__init__.py +0 -0
  510. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/pm/test_renderer.py +0 -0
  511. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/__init__.py +0 -0
  512. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_base.py +0 -0
  513. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  514. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  515. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_factory.py +0 -0
  516. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/providers/test_litellm_adapter.py +0 -0
  517. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/resilience/__init__.py +0 -0
  518. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/resilience/test_lateral.py +0 -0
  519. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/resilience/test_stagnation.py +0 -0
  520. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/__init__.py +0 -0
  521. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_complexity.py +0 -0
  522. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_downgrade.py +0 -0
  523. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_escalation.py +0 -0
  524. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_router.py +0 -0
  525. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/routing/test_tiers.py +0 -0
  526. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/scripts/test_keyword_detector.py +0 -0
  527. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/scripts/test_version_check.py +0 -0
  528. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/secondary/__init__.py +0 -0
  529. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/secondary/test_scheduler.py +0 -0
  530. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/secondary/test_todo_registry.py +0 -0
  531. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_artifact_collector.py +0 -0
  532. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_codex_artifacts.py +0 -0
  533. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_convergence.py +0 -0
  534. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_dashboard.py +0 -0
  535. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_dependencies_configured.py +0 -0
  536. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_evolve_rewind.py +0 -0
  537. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_evolve_step.py +0 -0
  538. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_graceful_shutdown.py +0 -0
  539. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_main_entry_point.py +0 -0
  540. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_module_structure.py +0 -0
  541. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_project_initialization.py +0 -0
  542. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_projector_rewind.py +0 -0
  543. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_ralph_parser.py +0 -0
  544. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_ralph_rewind.py +0 -0
  545. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_regression.py +0 -0
  546. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_tooling_configuration.py +0 -0
  547. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/test_verification.py +0 -0
  548. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/__init__.py +0 -0
  549. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_app.py +0 -0
  550. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_cancelled_display.py +0 -0
  551. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_events.py +0 -0
  552. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_lineage_viewer.py +0 -0
  553. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_screens.py +0 -0
  554. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_session_selector_replay.py +0 -0
  555. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tests/unit/tui/test_widgets.py +0 -0
  556. {ouroboros_ai-0.26.2.dev36 → ouroboros_ai-0.26.2.dev38}/tools/sync_github_project.py +0 -0
  557. {ouroboros_ai-0.26.2.dev36 → 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.dev36
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.dev36'
22
- __version_tuple__ = version_tuple = (0, 26, 2, 'dev36')
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
@@ -20,6 +20,7 @@ if TYPE_CHECKING:
20
20
 
21
21
  from ouroboros.cli.formatters import console
22
22
  from ouroboros.cli.formatters.panels import print_error, print_info, print_success, print_warning
23
+ from ouroboros.core.project_paths import resolve_seed_project_path
23
24
  from ouroboros.core.security import InputValidator
24
25
  from ouroboros.core.worktree import (
25
26
  TaskWorkspace,
@@ -27,6 +28,7 @@ from ouroboros.core.worktree import (
27
28
  maybe_prepare_task_workspace,
28
29
  maybe_restore_task_workspace,
29
30
  )
31
+ from ouroboros.evaluation.verification_artifacts import build_verification_artifacts
30
32
 
31
33
 
32
34
  class _DefaultWorkflowGroup(typer.core.TyperGroup):
@@ -101,6 +103,12 @@ def _load_seed_from_yaml(seed_file: Path) -> dict[str, Any]:
101
103
  raise typer.Exit(1) from e
102
104
 
103
105
 
106
+ def _resolve_cli_project_dir(seed: "Seed", seed_file: Path) -> Path:
107
+ """Resolve the project directory for CLI execution and verification."""
108
+ stable_base = seed_file.parent.resolve()
109
+ return resolve_seed_project_path(seed, stable_base=stable_base) or stable_base
110
+
111
+
104
112
  async def _initialize_mcp_manager(
105
113
  config_path: Path,
106
114
  tool_prefix: str, # noqa: ARG001
@@ -218,6 +226,7 @@ async def _run_orchestrator(
218
226
  event_store = EventStore(f"sqlite+aiosqlite:///{db_path}")
219
227
  await event_store.initialize()
220
228
 
229
+ project_dir = _resolve_cli_project_dir(seed, seed_file)
221
230
  session_repo = SessionRepository(event_store)
222
231
  workspace: TaskWorkspace | None = None
223
232
  execution_id: str | None = None
@@ -235,14 +244,14 @@ async def _run_orchestrator(
235
244
  workspace = maybe_restore_task_workspace(
236
245
  resume_session,
237
246
  persisted,
238
- fallback_source_cwd=Path.cwd(),
247
+ fallback_source_cwd=project_dir,
239
248
  )
240
249
  session_id_for_run = resume_session
241
250
  execution_id = reconstructed.value.execution_id
242
251
  else:
243
252
  session_id_for_run = f"orch_{uuid4().hex[:12]}"
244
253
  execution_id = f"exec_{uuid4().hex[:12]}"
245
- workspace = maybe_prepare_task_workspace(Path.cwd(), session_id_for_run)
254
+ workspace = maybe_prepare_task_workspace(project_dir, session_id_for_run)
246
255
  except WorktreeError as e:
247
256
  print_error(f"Task workspace error: {e.message}")
248
257
  raise typer.Exit(1) from e
@@ -253,7 +262,7 @@ async def _run_orchestrator(
253
262
 
254
263
  adapter = create_agent_runtime(
255
264
  backend=runtime_backend,
256
- cwd=Path(workspace.effective_cwd) if workspace else Path.cwd(),
265
+ cwd=Path(workspace.effective_cwd) if workspace else project_dir,
257
266
  )
258
267
  runner = OrchestratorRunner(
259
268
  adapter,
@@ -301,12 +310,28 @@ async def _run_orchestrator(
301
310
  print_info("Running post-execution QA...")
302
311
  qa_handler = QAHandler()
303
312
  quality_bar = _derive_quality_bar(seed)
313
+ execution_artifact = _get_verification_artifact(res.summary, res.final_message)
314
+ verification_working_dir = (
315
+ Path(workspace.effective_cwd) if workspace is not None else project_dir
316
+ )
317
+ try:
318
+ verification = await build_verification_artifacts(
319
+ res.execution_id,
320
+ execution_artifact,
321
+ verification_working_dir,
322
+ )
323
+ artifact = verification.artifact
324
+ reference = verification.reference
325
+ except Exception as e:
326
+ artifact = execution_artifact
327
+ reference = f"Verification artifact generation failed: {e}"
304
328
 
305
329
  qa_result = await qa_handler.handle(
306
330
  {
307
- "artifact": _get_verification_artifact(res.summary, res.final_message),
331
+ "artifact": artifact,
308
332
  "artifact_type": "test_output",
309
333
  "quality_bar": quality_bar,
334
+ "reference": reference,
310
335
  "seed_content": yaml.dump(seed_data, default_flow_style=False),
311
336
  "pass_threshold": 0.80,
312
337
  }
@@ -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}")
@@ -0,0 +1,59 @@
1
+ """Helpers for resolving project directories from seed and runtime context."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+
9
+ def resolve_path_against_base(raw_path: str | Path | None, *, stable_base: Path) -> Path | None:
10
+ """Resolve a path against a stable base directory."""
11
+ if raw_path is None:
12
+ return None
13
+
14
+ candidate = Path(raw_path).expanduser()
15
+ if candidate.is_absolute():
16
+ return candidate.resolve()
17
+ return (stable_base / candidate).resolve()
18
+
19
+
20
+ def project_path_candidates_from_seed(seed: Any) -> tuple[str, ...]:
21
+ """Extract likely project directories from seed metadata and brownfield refs."""
22
+ if seed is None:
23
+ return ()
24
+
25
+ candidates: list[str] = []
26
+ seed_meta = getattr(seed, "metadata", None)
27
+ if seed_meta is not None:
28
+ project_dir = getattr(seed_meta, "project_dir", None) or getattr(
29
+ seed_meta,
30
+ "working_directory",
31
+ None,
32
+ )
33
+ if isinstance(project_dir, str) and project_dir:
34
+ candidates.append(project_dir)
35
+
36
+ brownfield_context = getattr(seed, "brownfield_context", None)
37
+ context_references = getattr(brownfield_context, "context_references", ()) or ()
38
+
39
+ for reference in context_references:
40
+ path = getattr(reference, "path", None)
41
+ role = getattr(reference, "role", None)
42
+ if isinstance(path, str) and path and role == "primary":
43
+ candidates.append(path)
44
+
45
+ for reference in context_references:
46
+ path = getattr(reference, "path", None)
47
+ if isinstance(path, str) and path and path not in candidates:
48
+ candidates.append(path)
49
+
50
+ return tuple(candidates)
51
+
52
+
53
+ def resolve_seed_project_path(seed: Any, *, stable_base: Path) -> Path | None:
54
+ """Resolve the highest-priority project path encoded in a seed."""
55
+ for candidate in project_path_candidates_from_seed(seed):
56
+ resolved = resolve_path_against_base(candidate, stable_base=stable_base)
57
+ if resolved is not None:
58
+ return resolved
59
+ return None