ouroboros-ai 0.26.2.dev35__tar.gz → 0.26.2.dev37__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.dev35 → ouroboros_ai-0.26.2.dev37}/PKG-INFO +10 -19
  2. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/README.ko.md +10 -22
  3. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/README.md +9 -18
  4. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/keyword-detector.py +34 -1
  5. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/help/SKILL.md +20 -0
  6. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/_version.py +2 -2
  7. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/run.py +29 -4
  8. ouroboros_ai-0.26.2.dev37/src/ouroboros/core/project_paths.py +59 -0
  9. ouroboros_ai-0.26.2.dev37/src/ouroboros/evaluation/verification_artifacts.py +464 -0
  10. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/evolution_handlers.py +76 -1
  11. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/execution_handlers.py +46 -4
  12. ouroboros_ai-0.26.2.dev37/tests/unit/cli/test_run_qa.py +214 -0
  13. ouroboros_ai-0.26.2.dev37/tests/unit/evaluation/test_verification_artifacts.py +454 -0
  14. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_qa_integration.py +305 -30
  15. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.claude/settings.json +0 -0
  16. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.claude-plugin/.mcp.json +0 -0
  17. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.claude-plugin/marketplace.json +0 -0
  18. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.claude-plugin/plugin.json +0 -0
  19. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.env.example +0 -0
  20. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  21. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  22. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  23. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  24. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/workflows/dev-publish.yml +0 -0
  25. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/workflows/lint.yml +0 -0
  26. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/workflows/release.yml +0 -0
  27. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.github/workflows/test.yml +0 -0
  28. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.gitignore +0 -0
  29. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.mcp.json +0 -0
  30. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.ouroboros/mechanical.toml +0 -0
  31. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.pre-commit-config.yaml +0 -0
  32. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/.python-version +0 -0
  33. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/CHANGELOG.md +0 -0
  34. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/CLAUDE.md +0 -0
  35. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/CODE_OF_CONDUCT.md +0 -0
  36. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/CONTRIBUTING.md +0 -0
  37. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/HANDOFF.md +0 -0
  38. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/LICENSE +0 -0
  39. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/SECURITY.md +0 -0
  40. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/cancel.md +0 -0
  41. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/evaluate.md +0 -0
  42. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/evolve.md +0 -0
  43. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/help.md +0 -0
  44. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/interview.md +0 -0
  45. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/ralph.md +0 -0
  46. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/run.md +0 -0
  47. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/seed.md +0 -0
  48. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/setup.md +0 -0
  49. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/status.md +0 -0
  50. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/tutorial.md +0 -0
  51. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/unstuck.md +0 -0
  52. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/commands/welcome.md +0 -0
  53. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/.gitignore +0 -0
  54. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/Cargo.lock +0 -0
  55. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/Cargo.toml +0 -0
  56. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/README.md +0 -0
  57. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/db.rs +0 -0
  58. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/main.rs +0 -0
  59. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/mock.rs +0 -0
  60. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/state.rs +0 -0
  61. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  62. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  63. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  64. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  65. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  66. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  67. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/README.md +0 -0
  68. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/api/README.md +0 -0
  69. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/api/core.md +0 -0
  70. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/api/mcp.md +0 -0
  71. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/architecture.md +0 -0
  72. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/cli-reference.md +0 -0
  73. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/config-reference.md +0 -0
  74. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/contributing/architecture-overview.md +0 -0
  75. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/contributing/findings-registry.md +0 -0
  76. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/contributing/issue-quality-policy.md +0 -0
  77. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/contributing/key-patterns.md +0 -0
  78. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/contributing/testing-guide.md +0 -0
  79. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/examples/mcp-config.yaml +0 -0
  80. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/getting-started.md +0 -0
  81. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/guides/evaluation-pipeline.md +0 -0
  82. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/guides/evolution-loop.md +0 -0
  83. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  84. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/guides/seed-authoring.md +0 -0
  85. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/guides/tui-usage.md +0 -0
  86. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/images/PLACEHOLDER_README.md +0 -0
  87. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/images/ouroboros.png +0 -0
  88. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/platform-support.md +0 -0
  89. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/runtime-capability-matrix.md +0 -0
  90. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/runtime-guides/claude-code.md +0 -0
  91. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/docs/runtime-guides/codex.md +0 -0
  92. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/coordinator_test_seed.yaml +0 -0
  93. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/dummy_seed.yaml +0 -0
  94. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/parallel_subac_test_seed.yaml +0 -0
  95. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/subac_test_seed.yaml +0 -0
  96. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/README.md +0 -0
  97. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/__init__.py +0 -0
  98. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/__main__.py +0 -0
  99. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/cli.py +0 -0
  100. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/models.py +0 -0
  101. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/task_manager/storage.py +0 -0
  102. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/examples/test_display.py +0 -0
  103. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/hooks/hooks.json +0 -0
  104. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/llms-full.txt +0 -0
  105. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/llms.txt +0 -0
  106. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/project-context.md +0 -0
  107. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/pyproject.toml +0 -0
  108. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/drift-monitor.py +0 -0
  109. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/install.sh +0 -0
  110. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/mcp-serve.sh +0 -0
  111. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/ralph-rewind.py +0 -0
  112. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/ralph.py +0 -0
  113. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/ralph.sh +0 -0
  114. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/session-start.py +0 -0
  115. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/sync-plugin-version.py +0 -0
  116. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/scripts/version-check.py +0 -0
  117. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/brownfield/SKILL.md +0 -0
  118. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/cancel/SKILL.md +0 -0
  119. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/evaluate/SKILL.md +0 -0
  120. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/evolve/SKILL.md +0 -0
  121. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/interview/SKILL.md +0 -0
  122. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/pm/SKILL.md +0 -0
  123. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/qa/SKILL.md +0 -0
  124. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/ralph/SKILL.md +0 -0
  125. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/run/SKILL.md +0 -0
  126. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/seed/SKILL.md +0 -0
  127. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/setup/SKILL.md +0 -0
  128. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/status/SKILL.md +0 -0
  129. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/tutorial/SKILL.md +0 -0
  130. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/unstuck/SKILL.md +0 -0
  131. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/update/SKILL.md +0 -0
  132. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/skills/welcome/SKILL.md +0 -0
  133. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/__init__.py +0 -0
  134. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/__main__.py +0 -0
  135. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/__init__.py +0 -0
  136. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/advocate.md +0 -0
  137. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/analysis-agent.md +0 -0
  138. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/architect.md +0 -0
  139. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/breadth-keeper.md +0 -0
  140. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/code-executor.md +0 -0
  141. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/codebase-explorer.md +0 -0
  142. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  143. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/contrarian.md +0 -0
  144. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/evaluator.md +0 -0
  145. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/hacker.md +0 -0
  146. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/judge.md +0 -0
  147. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/loader.py +0 -0
  148. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/ontologist.md +0 -0
  149. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/ontology-analyst.md +0 -0
  150. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/qa-judge.md +0 -0
  151. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/research-agent.md +0 -0
  152. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/researcher.md +0 -0
  153. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/seed-architect.md +0 -0
  154. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/seed-closer.md +0 -0
  155. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  156. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/simplifier.md +0 -0
  157. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  158. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/__init__.py +0 -0
  159. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/ambiguity.py +0 -0
  160. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/brownfield.py +0 -0
  161. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/explore.py +0 -0
  162. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/interview.py +0 -0
  163. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/pm_document.py +0 -0
  164. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/pm_interview.py +0 -0
  165. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/pm_seed.py +0 -0
  166. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/question_classifier.py +0 -0
  167. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/bigbang/seed_generator.py +0 -0
  168. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/__init__.py +0 -0
  169. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/__init__.py +0 -0
  170. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/cancel.py +0 -0
  171. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/config.py +0 -0
  172. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/init.py +0 -0
  173. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/mcp.py +0 -0
  174. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/pm.py +0 -0
  175. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/setup.py +0 -0
  176. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/status.py +0 -0
  177. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/commands/tui.py +0 -0
  178. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/formatters/__init__.py +0 -0
  179. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/formatters/panels.py +0 -0
  180. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/formatters/progress.py +0 -0
  181. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/formatters/tables.py +0 -0
  182. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  183. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/cli/main.py +0 -0
  184. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/codex/__init__.py +0 -0
  185. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/codex/artifacts.py +0 -0
  186. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/codex/ouroboros.md +0 -0
  187. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/codex_permissions.py +0 -0
  188. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/config/__init__.py +0 -0
  189. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/config/loader.py +0 -0
  190. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/config/models.py +0 -0
  191. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/__init__.py +0 -0
  192. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/ac_tree.py +0 -0
  193. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/context.py +0 -0
  194. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/errors.py +0 -0
  195. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/file_lock.py +0 -0
  196. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/git_workflow.py +0 -0
  197. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/lineage.py +0 -0
  198. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/ontology_aspect.py +0 -0
  199. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/ontology_questions.py +0 -0
  200. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/security.py +0 -0
  201. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/seed.py +0 -0
  202. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/text.py +0 -0
  203. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/types.py +0 -0
  204. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/core/worktree.py +0 -0
  205. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/__init__.py +0 -0
  206. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  207. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/consensus.py +0 -0
  208. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/json_utils.py +0 -0
  209. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/languages.py +0 -0
  210. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/mechanical.py +0 -0
  211. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/models.py +0 -0
  212. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/pipeline.py +0 -0
  213. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/semantic.py +0 -0
  214. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evaluation/trigger.py +0 -0
  215. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/__init__.py +0 -0
  216. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/base.py +0 -0
  217. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/decomposition.py +0 -0
  218. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/evaluation.py +0 -0
  219. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/interview.py +0 -0
  220. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/lineage.py +0 -0
  221. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/events/ontology.py +0 -0
  222. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/__init__.py +0 -0
  223. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/convergence.py +0 -0
  224. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/loop.py +0 -0
  225. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/projector.py +0 -0
  226. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/reflect.py +0 -0
  227. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/regression.py +0 -0
  228. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/evolution/wonder.py +0 -0
  229. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/execution/__init__.py +0 -0
  230. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/execution/atomicity.py +0 -0
  231. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/execution/decomposition.py +0 -0
  232. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/execution/double_diamond.py +0 -0
  233. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/execution/subagent.py +0 -0
  234. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/__init__.py +0 -0
  235. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/client/__init__.py +0 -0
  236. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/client/adapter.py +0 -0
  237. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/client/manager.py +0 -0
  238. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/client/protocol.py +0 -0
  239. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/errors.py +0 -0
  240. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/job_manager.py +0 -0
  241. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/resources/__init__.py +0 -0
  242. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/resources/handlers.py +0 -0
  243. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/server/__init__.py +0 -0
  244. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/server/adapter.py +0 -0
  245. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/server/protocol.py +0 -0
  246. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/server/security.py +0 -0
  247. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/__init__.py +0 -0
  248. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  249. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  250. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  251. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/definitions.py +0 -0
  252. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  253. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  254. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  255. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/qa.py +0 -0
  256. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  257. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/tools/registry.py +0 -0
  258. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/mcp/types.py +0 -0
  259. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/observability/__init__.py +0 -0
  260. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/observability/drift.py +0 -0
  261. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/observability/logging.py +0 -0
  262. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/observability/retrospective.py +0 -0
  263. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/__init__.py +0 -0
  264. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/adapter.py +0 -0
  265. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  266. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  267. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/coordinator.py +0 -0
  268. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  269. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/events.py +0 -0
  270. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  271. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  272. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  273. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/level_context.py +0 -0
  274. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  275. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  276. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  277. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  278. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/runner.py +0 -0
  279. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  280. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  281. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/session.py +0 -0
  282. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  283. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/__init__.py +0 -0
  284. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/brownfield.py +0 -0
  285. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/checkpoint.py +0 -0
  286. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/event_store.py +0 -0
  287. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  288. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/migrations/runner.py +0 -0
  289. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  290. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  291. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/schema.py +0 -0
  292. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/persistence/uow.py +0 -0
  293. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/__init__.py +0 -0
  294. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/agents/__init__.py +0 -0
  295. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/agents/pool.py +0 -0
  296. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/agents/registry.py +0 -0
  297. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  298. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/orchestration/router.py +0 -0
  299. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  300. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/skills/__init__.py +0 -0
  301. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/skills/docs.py +0 -0
  302. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/skills/executor.py +0 -0
  303. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/skills/keywords.py +0 -0
  304. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/plugin/skills/registry.py +0 -0
  305. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/pm/__init__.py +0 -0
  306. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/pm/renderer.py +0 -0
  307. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/__init__.py +0 -0
  308. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  309. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/base.py +0 -0
  310. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  311. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  312. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  313. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/factory.py +0 -0
  314. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/providers/litellm_adapter.py +0 -0
  315. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/py.typed +0 -0
  316. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/resilience/__init__.py +0 -0
  317. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/resilience/lateral.py +0 -0
  318. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/resilience/stagnation.py +0 -0
  319. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/__init__.py +0 -0
  320. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/complexity.py +0 -0
  321. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/downgrade.py +0 -0
  322. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/escalation.py +0 -0
  323. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/router.py +0 -0
  324. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/routing/tiers.py +0 -0
  325. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/secondary/__init__.py +0 -0
  326. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/secondary/scheduler.py +0 -0
  327. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/secondary/todo_registry.py +0 -0
  328. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/strategies/__init__.py +0 -0
  329. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/strategies/devil_advocate.py +0 -0
  330. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/__init__.py +0 -0
  331. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/app.py +0 -0
  332. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/components/__init__.py +0 -0
  333. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/components/agents_panel.py +0 -0
  334. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/components/event_log.py +0 -0
  335. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/components/progress.py +0 -0
  336. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/components/token_tracker.py +0 -0
  337. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/events.py +0 -0
  338. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/__init__.py +0 -0
  339. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  340. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/dashboard.py +0 -0
  341. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  342. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  343. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/debug.py +0 -0
  344. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/execution.py +0 -0
  345. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  346. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  347. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  348. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/logs.py +0 -0
  349. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/screens/session_selector.py +0 -0
  350. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/__init__.py +0 -0
  351. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  352. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  353. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  354. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  355. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  356. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  357. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  358. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  359. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/verification/__init__.py +0 -0
  360. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/verification/extractor.py +0 -0
  361. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/verification/models.py +0 -0
  362. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/src/ouroboros/verification/verifier.py +0 -0
  363. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/__init__.py +0 -0
  364. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/conftest.py +0 -0
  365. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/e2e/__init__.py +0 -0
  366. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/e2e/conftest.py +0 -0
  367. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/e2e/test_cli_commands.py +0 -0
  368. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/e2e/test_full_workflow.py +0 -0
  369. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/e2e/test_session_persistence.py +0 -0
  370. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/fixtures/test_atomicity_seed.yml +0 -0
  371. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/__init__.py +0 -0
  372. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/conftest.py +0 -0
  373. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/mcp/__init__.py +0 -0
  374. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/mcp/conftest.py +0 -0
  375. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/mcp/test_client_adapter.py +0 -0
  376. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/mcp/test_client_manager.py +0 -0
  377. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/mcp/test_server_adapter.py +0 -0
  378. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/plugin/test_orchestration.py +0 -0
  379. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  380. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/test_codex_skill_fallback.py +0 -0
  381. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/test_codex_skill_smoke.py +0 -0
  382. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/integration/test_entry_point.py +0 -0
  383. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/__init__.py +0 -0
  384. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/agents/__init__.py +0 -0
  385. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/agents/test_loader.py +0 -0
  386. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/__init__.py +0 -0
  387. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_ambiguity.py +0 -0
  388. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_brownfield.py +0 -0
  389. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_classifier_context.py +0 -0
  390. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  391. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_explore.py +0 -0
  392. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_interview.py +0 -0
  393. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  394. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  395. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_interview.py +0 -0
  396. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  397. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  398. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  399. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_question_classifier.py +0 -0
  400. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/bigbang/test_seed_generator.py +0 -0
  401. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/__init__.py +0 -0
  402. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/__init__.py +0 -0
  403. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/test_console.py +0 -0
  404. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/test_panels.py +0 -0
  405. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/test_progress.py +0 -0
  406. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/test_tables.py +0 -0
  407. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  408. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_cancel.py +0 -0
  409. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  410. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_init_runtime.py +0 -0
  411. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_main.py +0 -0
  412. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  413. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  414. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_pm_brownfield.py +0 -0
  415. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_pm_overwrite.py +0 -0
  416. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_pm_select_repos.py +0 -0
  417. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/cli/test_setup.py +0 -0
  418. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/config/__init__.py +0 -0
  419. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/config/test_loader.py +0 -0
  420. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/config/test_models.py +0 -0
  421. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/__init__.py +0 -0
  422. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_ac_tree.py +0 -0
  423. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_context.py +0 -0
  424. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_errors.py +0 -0
  425. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_git_workflow.py +0 -0
  426. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_lineage.py +0 -0
  427. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_ontology_aspect.py +0 -0
  428. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_ontology_questions.py +0 -0
  429. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_security.py +0 -0
  430. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_seed.py +0 -0
  431. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_types.py +0 -0
  432. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/core/test_worktree.py +0 -0
  433. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/__init__.py +0 -0
  434. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_consensus.py +0 -0
  435. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_json_utils.py +0 -0
  436. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_languages.py +0 -0
  437. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_mechanical.py +0 -0
  438. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_models.py +0 -0
  439. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_semantic.py +0 -0
  440. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evaluation/test_trigger.py +0 -0
  441. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/events/__init__.py +0 -0
  442. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/events/test_base.py +0 -0
  443. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/events/test_decomposition_events.py +0 -0
  444. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/evolution/test_wonder_scope.py +0 -0
  445. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/execution/__init__.py +0 -0
  446. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/execution/test_atomicity.py +0 -0
  447. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/execution/test_decomposition.py +0 -0
  448. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/execution/test_double_diamond.py +0 -0
  449. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/execution/test_subagent_isolation.py +0 -0
  450. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/__init__.py +0 -0
  451. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/client/__init__.py +0 -0
  452. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/client/test_adapter.py +0 -0
  453. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/client/test_manager.py +0 -0
  454. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/conftest.py +0 -0
  455. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/server/__init__.py +0 -0
  456. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/server/test_adapter.py +0 -0
  457. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/server/test_security.py +0 -0
  458. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/test_errors.py +0 -0
  459. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/test_job_manager.py +0 -0
  460. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/test_types.py +0 -0
  461. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/__init__.py +0 -0
  462. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/conftest.py +0 -0
  463. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  464. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_definitions.py +0 -0
  465. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  466. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
  467. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  468. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/mcp/tools/test_registry.py +0 -0
  469. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/observability/__init__.py +0 -0
  470. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/observability/test_drift.py +0 -0
  471. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/observability/test_logging.py +0 -0
  472. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/observability/test_retrospective.py +0 -0
  473. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/__init__.py +0 -0
  474. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_adapter.py +0 -0
  475. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  476. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  477. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  478. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_coordinator.py +0 -0
  479. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  480. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_events.py +0 -0
  481. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  482. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  483. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  484. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_level_context.py +0 -0
  485. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  486. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  487. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  488. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  489. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_runner.py +0 -0
  490. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  491. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  492. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  493. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_session.py +0 -0
  494. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  495. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/__init__.py +0 -0
  496. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/test_brownfield_store.py +0 -0
  497. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/test_checkpoint.py +0 -0
  498. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/test_event_store.py +0 -0
  499. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/test_schema.py +0 -0
  500. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/persistence/test_uow.py +0 -0
  501. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/__init__.py +0 -0
  502. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/agents/__init__.py +0 -0
  503. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/agents/test_registry.py +0 -0
  504. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/orchestration/__init__.py +0 -0
  505. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  506. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/skills/__init__.py +0 -0
  507. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/skills/test_keywords.py +0 -0
  508. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/plugin/skills/test_registry.py +0 -0
  509. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/pm/__init__.py +0 -0
  510. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/pm/test_renderer.py +0 -0
  511. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/__init__.py +0 -0
  512. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/test_base.py +0 -0
  513. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  514. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  515. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/test_factory.py +0 -0
  516. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/providers/test_litellm_adapter.py +0 -0
  517. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/resilience/__init__.py +0 -0
  518. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/resilience/test_lateral.py +0 -0
  519. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/resilience/test_stagnation.py +0 -0
  520. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/__init__.py +0 -0
  521. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/test_complexity.py +0 -0
  522. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/test_downgrade.py +0 -0
  523. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/test_escalation.py +0 -0
  524. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/test_router.py +0 -0
  525. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/routing/test_tiers.py +0 -0
  526. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/scripts/test_keyword_detector.py +0 -0
  527. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/scripts/test_version_check.py +0 -0
  528. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/secondary/__init__.py +0 -0
  529. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/secondary/test_scheduler.py +0 -0
  530. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/secondary/test_todo_registry.py +0 -0
  531. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_artifact_collector.py +0 -0
  532. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_codex_artifacts.py +0 -0
  533. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_convergence.py +0 -0
  534. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_dashboard.py +0 -0
  535. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_dependencies_configured.py +0 -0
  536. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_evolve_rewind.py +0 -0
  537. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_evolve_step.py +0 -0
  538. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_graceful_shutdown.py +0 -0
  539. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_main_entry_point.py +0 -0
  540. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_module_structure.py +0 -0
  541. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_project_initialization.py +0 -0
  542. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_projector_rewind.py +0 -0
  543. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_ralph_parser.py +0 -0
  544. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_ralph_rewind.py +0 -0
  545. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_regression.py +0 -0
  546. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_tooling_configuration.py +0 -0
  547. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/test_verification.py +0 -0
  548. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/__init__.py +0 -0
  549. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_app.py +0 -0
  550. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_cancelled_display.py +0 -0
  551. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_events.py +0 -0
  552. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_lineage_viewer.py +0 -0
  553. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_screens.py +0 -0
  554. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_session_selector_replay.py +0 -0
  555. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tests/unit/tui/test_widgets.py +0 -0
  556. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/tools/sync_github_project.py +0 -0
  557. {ouroboros_ai-0.26.2.dev35 → ouroboros_ai-0.26.2.dev37}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.26.2.dev35
3
+ Version: 0.26.2.dev37
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
@@ -78,26 +78,12 @@ Description-Content-Type: text/markdown
78
78
 
79
79
  ---
80
80
 
81
- > **Security Notice (2026-03-24): LiteLLM PyPI Supply Chain Attack**
81
+ > **New: PM Mode** — `ooo pm` generates a PRD through a guided PM-focused interview.
82
+ > Ouroboros now supports product management workflows: stakeholder alignment, user story mapping, and structured PRD generation — all driven by the same Socratic engine.
82
83
  >
83
- > LiteLLM versions **1.82.7** and **1.82.8** on PyPI contained a malicious `.pth` file that auto-executes on every Python startup, exfiltrating environment variables, API keys, and credentials to an external server.
84
- >
85
- > **What we did:** Ouroboros now pins LiteLLM to **`<=1.82.6`** (safe versions only) as an optional dependency. LiteLLM is no longer a core dependency — it is only installed when you explicitly opt in via `pip install ouroboros-ai[litellm]`.
86
- >
87
- > **If you previously installed litellm 1.82.7 or 1.82.8**, the malicious `.pth` file may still be on your system even after upgrading. Clean up manually:
88
- >
89
- > ```bash
90
- > # 1. Find and delete the malicious file
91
- > find / -name "litellm_init.pth" 2>/dev/null
92
- >
93
- > # 2. Clean package manager caches
94
- > uv cache clean litellm # if using uv
95
- > pip cache purge # if using pip
96
- >
97
- > # 3. Rotate ALL credentials that were on your system during the exposure window
98
84
  > ```
99
- >
100
- > References: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [DSPy mitigation](https://github.com/stanfordnlp/dspy/commit/66e33399bf29)
85
+ > > ooo pm "I want to build a notification system"
86
+ > ```
101
87
 
102
88
  ---
103
89
 
@@ -148,6 +134,7 @@ Then run `ooo setup` inside a Claude Code session.
148
134
  ```bash
149
135
  pip install ouroboros-ai # base
150
136
  pip install ouroboros-ai[claude] # + Claude Code deps
137
+ pip install ouroboros-ai[litellm] # + LiteLLM multi-provider
151
138
  pip install ouroboros-ai[all] # everything
152
139
  ouroboros setup # configure runtime
153
140
  ```
@@ -259,6 +246,10 @@ Inside AI coding agent sessions, use `ooo <cmd>` skills. From the terminal, use
259
246
  | `ooo ralph` | *(via MCP)* | Persistent loop until verified |
260
247
  | `ooo tutorial` | *(interactive)* | Interactive hands-on learning |
261
248
  | `ooo help` | `ouroboros --help` | Full reference |
249
+ | `ooo pm` | *(via MCP)* | PM-focused interview + PRD generation |
250
+ | `ooo qa` | *(via skill)* | General-purpose QA verdict for any artifact |
251
+ | `ooo update` | `ouroboros update` | Check for updates + upgrade to latest |
252
+ | `ooo brownfield` | *(via skill)* | Scan and manage brownfield repo defaults |
262
253
 
263
254
  > Not all skills have direct CLI equivalents. Some (`evaluate`, `evolve`, `unstuck`, `ralph`) are available through agent skills or MCP tools only.
264
255
 
@@ -37,30 +37,12 @@
37
37
 
38
38
  ---
39
39
 
40
- > **보안 공지 (2026-03-24): LiteLLM PyPI 공급망 공격**
40
+ > **New: PM 모드** — `ooo pm`으로 소크라테스식 PM 인터뷰를 통해 PRD를 자동 생성할 수 있습니다.
41
+ > 이해관계자 정렬, 유저 스토리 매핑, 구조화된 PRD 생성까지 — 같은 소크라테스 엔진이 제품 관리 워크플로우도 지원합니다.
41
42
  >
42
- > LiteLLM 1.82.7 / 1.82.8 버전에 악성 `.pth` 파일이 포함되어 배포되었습니다. 이 파일은 `import` 없이도 **Python 시작 시 자동 실행**되며, 환경변수, API 키, SSH 키, 클라우드 크레덴셜을 외부 서버로 전송합니다.
43
- >
44
- > **영향 범위:** 2026년 3월 23일 이후에 아래 중 하나라도 해당되면 감염 가능성이 있습니다:
45
- > - Ouroboros를 신규 설치 (`pip install ouroboros-ai`, `uv tool install ouroboros-ai`)
46
- > - 기존 설치를 업그레이드 (`pip install --upgrade ouroboros-ai`)
47
- >
48
- > 두 경우 모두 `litellm>=1.80.0` 의존성이 악성 버전 1.82.7/1.82.8로 resolve됩니다. 그 이전에 설치하고 재설치/업그레이드하지 않았다면 안전합니다.
49
- >
50
- > **Ouroboros는 litellm 의존성을 완전 제거했습니다** (v0.25.2 stable / v0.26.0b7 beta). 단, **Ouroboros를 업데이트하면 의존성 목록에서 litellm이 빠질 뿐, 이미 설치된 litellm 패키지와 악성 `.pth` 파일은 그대로 남아있습니다.** 수동 정리가 필요합니다:
51
- >
52
- > ```bash
53
- > # 1. 악성 파일 찾기 — 결과가 나오면 즉시 삭제
54
- > find / -name "litellm_init.pth" 2>/dev/null
55
- >
56
- > # 2. 패키지 매니저 캐시 정리
57
- > uv cache clean litellm # uv 사용자
58
- > pip cache purge # pip 사용자
59
- >
60
- > # 3. 노출 기간 동안 시스템에 있던 모든 크레덴셜 로테이션
61
43
  > ```
62
- >
63
- > 참고: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [분석 보고서](https://futuresearch.ai/blog/litellm-pypi-supply-chain-attack/)
44
+ > > ooo pm "알림 시스템을 만들고 싶어"
45
+ > ```
64
46
 
65
47
  ---
66
48
 
@@ -136,6 +118,7 @@ Claude Code 세션 안에서 `ooo setup` 실행.
136
118
  ```bash
137
119
  pip install ouroboros-ai # 기본
138
120
  pip install ouroboros-ai[claude] # + Claude Code 의존성
121
+ pip install ouroboros-ai[litellm] # + LiteLLM 멀티 프로바이더
139
122
  pip install ouroboros-ai[all] # 전부
140
123
  ouroboros setup # 런타임 설정
141
124
  ```
@@ -283,6 +266,11 @@ Gen 3: {Task, Priority, Status, DueDate} → similarity 1.00 → CONVERGED
283
266
  | `ooo ralph` | 검증될 때까지 계속 도는 루프 |
284
267
  | `ooo tutorial` | 대화형 실습 |
285
268
  | `ooo help` | 전체 참조 |
269
+ | `ooo pm` | PM 인터뷰 + PRD 생성 |
270
+ | `ooo qa` | 범용 QA 판정 |
271
+ | `ooo cancel` | 멈춘 실행 취소 |
272
+ | `ooo update` | 최신 버전 확인 + 업그레이드 |
273
+ | `ooo brownfield` | 기존 저장소 스캔 + 기본값 관리 |
286
274
 
287
275
  ---
288
276
 
@@ -38,26 +38,12 @@
38
38
 
39
39
  ---
40
40
 
41
- > **Security Notice (2026-03-24): LiteLLM PyPI Supply Chain Attack**
41
+ > **New: PM Mode** — `ooo pm` generates a PRD through a guided PM-focused interview.
42
+ > Ouroboros now supports product management workflows: stakeholder alignment, user story mapping, and structured PRD generation — all driven by the same Socratic engine.
42
43
  >
43
- > LiteLLM versions **1.82.7** and **1.82.8** on PyPI contained a malicious `.pth` file that auto-executes on every Python startup, exfiltrating environment variables, API keys, and credentials to an external server.
44
- >
45
- > **What we did:** Ouroboros now pins LiteLLM to **`<=1.82.6`** (safe versions only) as an optional dependency. LiteLLM is no longer a core dependency — it is only installed when you explicitly opt in via `pip install ouroboros-ai[litellm]`.
46
- >
47
- > **If you previously installed litellm 1.82.7 or 1.82.8**, the malicious `.pth` file may still be on your system even after upgrading. Clean up manually:
48
- >
49
- > ```bash
50
- > # 1. Find and delete the malicious file
51
- > find / -name "litellm_init.pth" 2>/dev/null
52
- >
53
- > # 2. Clean package manager caches
54
- > uv cache clean litellm # if using uv
55
- > pip cache purge # if using pip
56
- >
57
- > # 3. Rotate ALL credentials that were on your system during the exposure window
58
44
  > ```
59
- >
60
- > References: [LiteLLM #24512](https://github.com/BerriAI/litellm/issues/24512) · [Ouroboros #195](https://github.com/Q00/ouroboros/issues/195) · [DSPy mitigation](https://github.com/stanfordnlp/dspy/commit/66e33399bf29)
45
+ > > ooo pm "I want to build a notification system"
46
+ > ```
61
47
 
62
48
  ---
63
49
 
@@ -108,6 +94,7 @@ Then run `ooo setup` inside a Claude Code session.
108
94
  ```bash
109
95
  pip install ouroboros-ai # base
110
96
  pip install ouroboros-ai[claude] # + Claude Code deps
97
+ pip install ouroboros-ai[litellm] # + LiteLLM multi-provider
111
98
  pip install ouroboros-ai[all] # everything
112
99
  ouroboros setup # configure runtime
113
100
  ```
@@ -219,6 +206,10 @@ Inside AI coding agent sessions, use `ooo <cmd>` skills. From the terminal, use
219
206
  | `ooo ralph` | *(via MCP)* | Persistent loop until verified |
220
207
  | `ooo tutorial` | *(interactive)* | Interactive hands-on learning |
221
208
  | `ooo help` | `ouroboros --help` | Full reference |
209
+ | `ooo pm` | *(via MCP)* | PM-focused interview + PRD generation |
210
+ | `ooo qa` | *(via skill)* | General-purpose QA verdict for any artifact |
211
+ | `ooo update` | `ouroboros update` | Check for updates + upgrade to latest |
212
+ | `ooo brownfield` | *(via skill)* | Scan and manage brownfield repo defaults |
222
213
 
223
214
  > Not all skills have direct CLI equivalents. Some (`evaluate`, `evolve`, `unstuck`, `ralph`) are available through agent skills or MCP tools only.
224
215
 
@@ -19,7 +19,11 @@ import sys
19
19
 
20
20
  # Skills that work without MCP setup (bypass the setup gate)
21
21
  # qa has a built-in fallback that adopts the qa-judge agent directly
22
- SETUP_BYPASS_SKILLS = ["/ouroboros:setup", "/ouroboros:help", "/ouroboros:qa"]
22
+ SETUP_BYPASS_SKILLS = [
23
+ "/ouroboros:setup",
24
+ "/ouroboros:help",
25
+ "/ouroboros:qa",
26
+ ]
23
27
 
24
28
  # Keyword → skill mapping
25
29
  # "ooo <cmd>" prefix always works; natural language keywords also supported
@@ -37,9 +41,22 @@ KEYWORD_MAP = [
37
41
  {"patterns": ["ooo welcome"], "skill": "/ouroboros:welcome"},
38
42
  {"patterns": ["ooo setup"], "skill": "/ouroboros:setup"},
39
43
  {"patterns": ["ooo help"], "skill": "/ouroboros:help"},
44
+ {"patterns": ["ooo pm", "ooo prd"], "skill": "/ouroboros:pm"},
40
45
  {"patterns": ["ooo qa", "qa check", "quality check"], "skill": "/ouroboros:qa"},
46
+ {"patterns": ["ooo cancel", "ooo abort"], "skill": "/ouroboros:cancel"},
41
47
  {"patterns": ["ooo update", "ooo upgrade"], "skill": "/ouroboros:update"},
48
+ {"patterns": ["ooo brownfield"], "skill": "/ouroboros:brownfield"},
42
49
  # Natural language triggers
50
+ # PM triggers must precede generic interview to avoid "pm interview" being shadowed
51
+ {
52
+ "patterns": [
53
+ "write prd",
54
+ "pm interview",
55
+ "product requirements",
56
+ "create prd",
57
+ ],
58
+ "skill": "/ouroboros:pm",
59
+ },
43
60
  {
44
61
  "patterns": [
45
62
  "interview me",
@@ -97,6 +114,22 @@ KEYWORD_MAP = [
97
114
  "patterns": ["update ouroboros", "upgrade ouroboros"],
98
115
  "skill": "/ouroboros:update",
99
116
  },
117
+ {
118
+ "patterns": [
119
+ "cancel execution",
120
+ "stop job",
121
+ "kill stuck",
122
+ "abort execution",
123
+ ],
124
+ "skill": "/ouroboros:cancel",
125
+ },
126
+ {
127
+ "patterns": [
128
+ "brownfield defaults",
129
+ "brownfield scan",
130
+ ],
131
+ "skill": "/ouroboros:brownfield",
132
+ },
100
133
  ]
101
134
 
102
135
 
@@ -41,6 +41,11 @@ Ouroboros is a **requirement crystallization engine** for AI workflows. It trans
41
41
  | `ooo welcome` | First-touch welcome guide | Plugin |
42
42
  | `ooo tutorial` | Interactive hands-on learning | Plugin |
43
43
  | `ooo help` | This reference guide | Plugin |
44
+ | `ooo pm` | PM-focused interview + PRD generation | MCP |
45
+ | `ooo qa` | General-purpose QA verdict for any artifact | Plugin |
46
+ | `ooo cancel` | Cancel stuck or orphaned executions | CLI |
47
+ | `ooo update` | Check for updates + upgrade to latest | Plugin |
48
+ | `ooo brownfield` | Scan and manage brownfield repo defaults | MCP |
44
49
 
45
50
  ### Evolutionary Loop
46
51
 
@@ -63,6 +68,16 @@ Ouroboros is a **requirement crystallization engine** for AI workflows. It trans
63
68
  | "think sideways", "i'm stuck", "break through", "lateral thinking" | `ooo unstuck` |
64
69
  | "am I drifting?", "drift check", "session status" | `ooo status` |
65
70
 
71
+ ### Utility Triggers
72
+
73
+ | Phrase | Triggers |
74
+ |--------|----------|
75
+ | "write prd", "pm interview", "product requirements", "create prd" | `ooo pm` |
76
+ | "qa check", "quality check" | `ooo qa` |
77
+ | "cancel execution", "stop job", "kill stuck", "abort execution" | `ooo cancel` |
78
+ | "update ouroboros", "upgrade ouroboros" | `ooo update` |
79
+ | "brownfield defaults", "brownfield scan" | `ooo brownfield` |
80
+
66
81
  ### Loop Triggers
67
82
 
68
83
  | Phrase | Triggers |
@@ -86,6 +101,11 @@ Ouroboros is a **requirement crystallization engine** for AI workflows. It trans
86
101
  | `/ouroboros:setup` | Installation wizard | Plugin |
87
102
  | `/ouroboros:tutorial` | Interactive hands-on learning | Plugin |
88
103
  | `/ouroboros:help` | This guide | Plugin |
104
+ | `/ouroboros:pm` | PM-focused interview + PRD generation | MCP |
105
+ | `/ouroboros:qa` | General-purpose QA verdict for any artifact | Plugin |
106
+ | `/ouroboros:cancel` | Cancel stuck or orphaned executions | CLI |
107
+ | `/ouroboros:update` | Check for updates + upgrade to latest | Plugin |
108
+ | `/ouroboros:brownfield` | Scan and manage brownfield repo defaults | MCP |
89
109
 
90
110
  ### Loop Skills
91
111
 
@@ -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.dev35'
22
- __version_tuple__ = version_tuple = (0, 26, 2, 'dev35')
21
+ __version__ = version = '0.26.2.dev37'
22
+ __version_tuple__ = version_tuple = (0, 26, 2, 'dev37')
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
  }
@@ -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