ouroboros-ai 0.29.3.dev5__tar.gz → 0.29.3.dev6__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 (716) hide show
  1. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/CLAUDE.md +1 -0
  2. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/PKG-INFO +1 -1
  3. ouroboros_ai-0.29.3.dev6/skills/resume/SKILL.md +116 -0
  4. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/_version.py +2 -2
  5. ouroboros_ai-0.29.3.dev6/src/ouroboros/cli/commands/resume.py +333 -0
  6. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/main.py +2 -0
  7. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/event_store.py +90 -16
  8. ouroboros_ai-0.29.3.dev6/tests/unit/cli/test_doc_commands.py +187 -0
  9. ouroboros_ai-0.29.3.dev6/tests/unit/cli/test_resume.py +660 -0
  10. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.claude/settings.json +0 -0
  11. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.claude-plugin/.mcp.json +0 -0
  12. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.claude-plugin/marketplace.json +0 -0
  13. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.claude-plugin/plugin.json +0 -0
  14. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.env.example +0 -0
  15. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  16. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  17. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  18. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  19. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/workflows/dev-publish.yml +0 -0
  20. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/workflows/lint.yml +0 -0
  21. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/workflows/release.yml +0 -0
  22. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.github/workflows/test.yml +0 -0
  23. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.gitignore +0 -0
  24. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.mcp.json +0 -0
  25. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.ouroboros/mechanical.toml +0 -0
  26. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
  27. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
  28. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.pre-commit-config.yaml +0 -0
  29. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/.python-version +0 -0
  30. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/CHANGELOG.md +0 -0
  31. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/CODE_OF_CONDUCT.md +0 -0
  32. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/CONTRIBUTING.md +0 -0
  33. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/Code-Review-Claude.md +0 -0
  34. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/Code-Review-Codex.md +0 -0
  35. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/HANDOFF.md +0 -0
  36. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/LICENSE +0 -0
  37. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/README.ko.md +0 -0
  38. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/README.md +0 -0
  39. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/SECURITY.md +0 -0
  40. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/UNINSTALL.md +0 -0
  41. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/cancel.md +0 -0
  42. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/evaluate.md +0 -0
  43. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/evolve.md +0 -0
  44. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/help.md +0 -0
  45. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/interview.md +0 -0
  46. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/ralph.md +0 -0
  47. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/run.md +0 -0
  48. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/seed.md +0 -0
  49. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/setup.md +0 -0
  50. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/status.md +0 -0
  51. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/tutorial.md +0 -0
  52. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/unstuck.md +0 -0
  53. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/commands/welcome.md +0 -0
  54. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/.gitignore +0 -0
  55. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/Cargo.lock +0 -0
  56. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/Cargo.toml +0 -0
  57. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/README.md +0 -0
  58. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/db.rs +0 -0
  59. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/main.rs +0 -0
  60. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/mock.rs +0 -0
  61. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/state.rs +0 -0
  62. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
  63. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/execution.rs +0 -0
  64. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
  65. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/logs.rs +0 -0
  66. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/mod.rs +0 -0
  67. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
  68. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/README.md +0 -0
  69. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/api/README.md +0 -0
  70. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/api/core.md +0 -0
  71. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/api/mcp.md +0 -0
  72. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/architecture.md +0 -0
  73. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/cli-reference.md +0 -0
  74. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/config-reference.md +0 -0
  75. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/contributing/architecture-overview.md +0 -0
  76. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/contributing/findings-registry.md +0 -0
  77. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/contributing/issue-quality-policy.md +0 -0
  78. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/contributing/key-patterns.md +0 -0
  79. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/contributing/testing-guide.md +0 -0
  80. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/events.md +0 -0
  81. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/examples/mcp-config.yaml +0 -0
  82. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/getting-started.md +0 -0
  83. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/evaluation-pipeline.md +0 -0
  84. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/evolution-loop.md +0 -0
  85. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
  86. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/mcp-bridge.md +0 -0
  87. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/ooo-skill-dispatch-router.md +0 -0
  88. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/opencode-subagent-bridge.md +0 -0
  89. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/seed-authoring.md +0 -0
  90. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/guides/tui-usage.md +0 -0
  91. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/images/PLACEHOLDER_README.md +0 -0
  92. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/images/ouroboros.png +0 -0
  93. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/platform-support.md +0 -0
  94. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/runtime-capability-matrix.md +0 -0
  95. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/claude-code.md +0 -0
  96. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/codex.md +0 -0
  97. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/hermes.md +0 -0
  98. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/docs/runtime-guides/opencode.md +0 -0
  99. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/coordinator_test_seed.yaml +0 -0
  100. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/dummy_seed.yaml +0 -0
  101. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/parallel_subac_test_seed.yaml +0 -0
  102. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/subac_test_seed.yaml +0 -0
  103. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/README.md +0 -0
  104. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/__init__.py +0 -0
  105. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/__main__.py +0 -0
  106. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/cli.py +0 -0
  107. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/models.py +0 -0
  108. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/task_manager/storage.py +0 -0
  109. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/examples/test_display.py +0 -0
  110. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/hooks/hooks.json +0 -0
  111. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/llms-full.txt +0 -0
  112. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/llms.txt +0 -0
  113. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/project-context.md +0 -0
  114. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/pyproject.toml +0 -0
  115. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/drift-monitor.py +0 -0
  116. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/install.sh +0 -0
  117. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/keyword-detector.py +0 -0
  118. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/mcp-serve.sh +0 -0
  119. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/ralph-rewind.py +0 -0
  120. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/ralph.py +0 -0
  121. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/ralph.sh +0 -0
  122. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/session-start.py +0 -0
  123. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/sync-plugin-version.py +0 -0
  124. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/scripts/version-check.py +0 -0
  125. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/brownfield/SKILL.md +0 -0
  126. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/cancel/SKILL.md +0 -0
  127. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/evaluate/SKILL.md +0 -0
  128. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/evolve/SKILL.md +0 -0
  129. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/help/SKILL.md +0 -0
  130. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/interview/SKILL.md +0 -0
  131. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/pm/SKILL.md +0 -0
  132. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/publish/SKILL.md +0 -0
  133. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/qa/SKILL.md +0 -0
  134. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/ralph/SKILL.md +0 -0
  135. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/run/SKILL.md +0 -0
  136. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/seed/SKILL.md +0 -0
  137. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/setup/SKILL.md +0 -0
  138. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/status/SKILL.md +0 -0
  139. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/tutorial/SKILL.md +0 -0
  140. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/unstuck/SKILL.md +0 -0
  141. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/update/SKILL.md +0 -0
  142. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/skills/welcome/SKILL.md +0 -0
  143. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/__init__.py +0 -0
  144. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/__main__.py +0 -0
  145. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/__init__.py +0 -0
  146. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/advocate.md +0 -0
  147. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/analysis-agent.md +0 -0
  148. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/architect.md +0 -0
  149. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/breadth-keeper.md +0 -0
  150. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/code-executor.md +0 -0
  151. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/codebase-explorer.md +0 -0
  152. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/consensus-reviewer.md +0 -0
  153. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/contrarian.md +0 -0
  154. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/evaluator.md +0 -0
  155. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/hacker.md +0 -0
  156. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/judge.md +0 -0
  157. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/loader.py +0 -0
  158. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/ontologist.md +0 -0
  159. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/ontology-analyst.md +0 -0
  160. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/qa-judge.md +0 -0
  161. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/research-agent.md +0 -0
  162. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/researcher.md +0 -0
  163. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/seed-architect.md +0 -0
  164. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/seed-closer.md +0 -0
  165. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/semantic-evaluator.md +0 -0
  166. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/simplifier.md +0 -0
  167. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/agents/socratic-interviewer.md +0 -0
  168. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/__init__.py +0 -0
  169. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/ambiguity.py +0 -0
  170. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/brownfield.py +0 -0
  171. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/explore.py +0 -0
  172. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/interview.py +0 -0
  173. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_completion.py +0 -0
  174. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_document.py +0 -0
  175. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_interview.py +0 -0
  176. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/pm_seed.py +0 -0
  177. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/question_classifier.py +0 -0
  178. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/bigbang/seed_generator.py +0 -0
  179. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/claude_permissions.py +0 -0
  180. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/__init__.py +0 -0
  181. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/__init__.py +0 -0
  182. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/cancel.py +0 -0
  183. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/config.py +0 -0
  184. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/detect.py +0 -0
  185. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/init.py +0 -0
  186. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/mcp.py +0 -0
  187. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/mcp_doctor.py +0 -0
  188. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/pm.py +0 -0
  189. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/run.py +0 -0
  190. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/setup.py +0 -0
  191. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/status.py +0 -0
  192. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/tui.py +0 -0
  193. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/commands/uninstall.py +0 -0
  194. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/__init__.py +0 -0
  195. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/panels.py +0 -0
  196. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/progress.py +0 -0
  197. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/prompting.py +0 -0
  198. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/tables.py +0 -0
  199. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
  200. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/jsonc.py +0 -0
  201. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/cli/opencode_config.py +0 -0
  202. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/__init__.py +0 -0
  203. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/artifacts.py +0 -0
  204. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/cli_policy.py +0 -0
  205. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex/ouroboros.md +0 -0
  206. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/codex_permissions.py +0 -0
  207. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/config/__init__.py +0 -0
  208. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/config/loader.py +0 -0
  209. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/config/models.py +0 -0
  210. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/__init__.py +0 -0
  211. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ac_tree.py +0 -0
  212. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/context.py +0 -0
  213. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/errors.py +0 -0
  214. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/file_lock.py +0 -0
  215. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/git_workflow.py +0 -0
  216. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/initial_context.py +0 -0
  217. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/json_utils.py +0 -0
  218. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/lineage.py +0 -0
  219. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ontology_aspect.py +0 -0
  220. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ontology_questions.py +0 -0
  221. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/project_paths.py +0 -0
  222. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/retry.py +0 -0
  223. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/security.py +0 -0
  224. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/seed.py +0 -0
  225. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/text.py +0 -0
  226. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/ttl_cache.py +0 -0
  227. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/types.py +0 -0
  228. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/core/worktree.py +0 -0
  229. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/__init__.py +0 -0
  230. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/artifact_collector.py +0 -0
  231. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/checklist.py +0 -0
  232. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/consensus.py +0 -0
  233. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/detector.py +0 -0
  234. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/json_utils.py +0 -0
  235. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/languages.py +0 -0
  236. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/mechanical.py +0 -0
  237. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/models.py +0 -0
  238. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/pipeline.py +0 -0
  239. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/semantic.py +0 -0
  240. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/trigger.py +0 -0
  241. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
  242. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/__init__.py +0 -0
  243. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/base.py +0 -0
  244. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/decomposition.py +0 -0
  245. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/evaluation.py +0 -0
  246. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/interview.py +0 -0
  247. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/lineage.py +0 -0
  248. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/events/ontology.py +0 -0
  249. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/__init__.py +0 -0
  250. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/convergence.py +0 -0
  251. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/loop.py +0 -0
  252. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/projector.py +0 -0
  253. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/reflect.py +0 -0
  254. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/regression.py +0 -0
  255. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/evolution/wonder.py +0 -0
  256. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/__init__.py +0 -0
  257. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/atomicity.py +0 -0
  258. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/decomposition.py +0 -0
  259. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/double_diamond.py +0 -0
  260. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/execution/subagent.py +0 -0
  261. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/hermes/__init__.py +0 -0
  262. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/hermes/artifacts.py +0 -0
  263. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/__init__.py +0 -0
  264. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/__init__.py +0 -0
  265. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/bridge.py +0 -0
  266. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/config.py +0 -0
  267. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/bridge/factory.py +0 -0
  268. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/__init__.py +0 -0
  269. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/adapter.py +0 -0
  270. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/manager.py +0 -0
  271. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/client/protocol.py +0 -0
  272. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/errors.py +0 -0
  273. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/job_manager.py +0 -0
  274. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/resources/__init__.py +0 -0
  275. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/resources/handlers.py +0 -0
  276. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/__init__.py +0 -0
  277. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/adapter.py +0 -0
  278. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/protocol.py +0 -0
  279. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/server/security.py +0 -0
  280. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/__init__.py +0 -0
  281. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
  282. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
  283. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
  284. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
  285. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
  286. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/dashboard.py +0 -0
  287. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/definitions.py +0 -0
  288. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
  289. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
  290. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
  291. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
  292. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
  293. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/qa.py +0 -0
  294. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
  295. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/registry.py +0 -0
  296. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/tools/subagent.py +0 -0
  297. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/mcp/types.py +0 -0
  298. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/__init__.py +0 -0
  299. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/drift.py +0 -0
  300. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/logging.py +0 -0
  301. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/observability/retrospective.py +0 -0
  302. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/__init__.py +0 -0
  303. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/__init__.py +0 -0
  304. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/opencode-plugin.d.ts +0 -0
  305. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/ouroboros-bridge.test.ts +0 -0
  306. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/ouroboros-bridge.ts +0 -0
  307. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/package.json +0 -0
  308. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/opencode/plugin/tsconfig.json +0 -0
  309. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/__init__.py +0 -0
  310. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/adapter.py +0 -0
  311. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/capabilities.py +0 -0
  312. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
  313. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
  314. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/control_plane.py +0 -0
  315. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/coordinator.py +0 -0
  316. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
  317. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/events.py +0 -0
  318. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
  319. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
  320. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/heartbeat.py +0 -0
  321. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/hermes_runtime.py +0 -0
  322. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/level_context.py +0 -0
  323. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/mcp_config.py +0 -0
  324. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
  325. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
  326. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
  327. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
  328. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
  329. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/policy.py +0 -0
  330. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/rate_limit.py +0 -0
  331. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/runner.py +0 -0
  332. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
  333. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
  334. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/session.py +0 -0
  335. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/orchestrator/workflow_state.py +0 -0
  336. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/__init__.py +0 -0
  337. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/brownfield.py +0 -0
  338. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/checkpoint.py +0 -0
  339. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/__init__.py +0 -0
  340. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/runner.py +0 -0
  341. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
  342. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
  343. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/schema.py +0 -0
  344. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/persistence/uow.py +0 -0
  345. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/__init__.py +0 -0
  346. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/agents/__init__.py +0 -0
  347. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/agents/pool.py +0 -0
  348. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/agents/registry.py +0 -0
  349. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
  350. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/orchestration/router.py +0 -0
  351. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
  352. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/__init__.py +0 -0
  353. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/docs.py +0 -0
  354. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/executor.py +0 -0
  355. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/keywords.py +0 -0
  356. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/plugin/skills/registry.py +0 -0
  357. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/pm/__init__.py +0 -0
  358. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/pm/handoff.py +0 -0
  359. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/pm/renderer.py +0 -0
  360. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/__init__.py +0 -0
  361. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/anthropic_adapter.py +0 -0
  362. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/base.py +0 -0
  363. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/claude_code_adapter.py +0 -0
  364. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
  365. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/codex_cli_stream.py +0 -0
  366. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/factory.py +0 -0
  367. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
  368. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/litellm_adapter.py +0 -0
  369. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/providers/opencode_adapter.py +0 -0
  370. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/py.typed +0 -0
  371. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/__init__.py +0 -0
  372. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/lateral.py +0 -0
  373. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/recovery.py +0 -0
  374. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/resilience/stagnation.py +0 -0
  375. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/__init__.py +0 -0
  376. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/command_parser.py +0 -0
  377. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/dispatch.py +0 -0
  378. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/registry.py +0 -0
  379. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/router/types.py +0 -0
  380. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/__init__.py +0 -0
  381. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/complexity.py +0 -0
  382. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/downgrade.py +0 -0
  383. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/escalation.py +0 -0
  384. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/router.py +0 -0
  385. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/routing/tiers.py +0 -0
  386. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/sandbox.py +0 -0
  387. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/secondary/__init__.py +0 -0
  388. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/secondary/scheduler.py +0 -0
  389. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/secondary/todo_registry.py +0 -0
  390. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/skills/__init__.py +0 -0
  391. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/skills/artifacts.py +0 -0
  392. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/strategies/__init__.py +0 -0
  393. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/strategies/devil_advocate.py +0 -0
  394. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/__init__.py +0 -0
  395. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/app.py +0 -0
  396. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/__init__.py +0 -0
  397. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/agents_panel.py +0 -0
  398. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/event_log.py +0 -0
  399. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/progress.py +0 -0
  400. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/components/token_tracker.py +0 -0
  401. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/events.py +0 -0
  402. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/__init__.py +0 -0
  403. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
  404. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/dashboard.py +0 -0
  405. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
  406. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
  407. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/debug.py +0 -0
  408. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/execution.py +0 -0
  409. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
  410. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
  411. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
  412. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/logs.py +0 -0
  413. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/screens/session_selector.py +0 -0
  414. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/__init__.py +0 -0
  415. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
  416. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
  417. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
  418. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
  419. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
  420. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
  421. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
  422. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
  423. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/__init__.py +0 -0
  424. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/extractor.py +0 -0
  425. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/models.py +0 -0
  426. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/src/ouroboros/verification/verifier.py +0 -0
  427. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/__init__.py +0 -0
  428. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/conftest.py +0 -0
  429. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/__init__.py +0 -0
  430. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/conftest.py +0 -0
  431. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
  432. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/test_cli_commands.py +0 -0
  433. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/test_full_workflow.py +0 -0
  434. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/e2e/test_session_persistence.py +0 -0
  435. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/fixtures/router/skills/frontmatter-body/run/SKILL.md +0 -0
  436. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/fixtures/test_atomicity_seed.yml +0 -0
  437. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/__init__.py +0 -0
  438. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/conftest.py +0 -0
  439. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/__init__.py +0 -0
  440. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/bridge/__init__.py +0 -0
  441. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
  442. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/conftest.py +0 -0
  443. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/test_client_adapter.py +0 -0
  444. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/test_client_manager.py +0 -0
  445. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/mcp/test_server_adapter.py +0 -0
  446. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/plugin/test_orchestration.py +0 -0
  447. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
  448. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_codex_skill_fallback.py +0 -0
  449. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_codex_skill_smoke.py +0 -0
  450. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/integration/test_entry_point.py +0 -0
  451. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/test-execution-plan.md +0 -0
  452. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/__init__.py +0 -0
  453. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/agents/__init__.py +0 -0
  454. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/agents/test_loader.py +0 -0
  455. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/__init__.py +0 -0
  456. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_ambiguity.py +0 -0
  457. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_brownfield.py +0 -0
  458. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_classifier_context.py +0 -0
  459. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_decide_later_items.py +0 -0
  460. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_explore.py +0 -0
  461. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview.py +0 -0
  462. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview_async_io.py +0 -0
  463. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
  464. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
  465. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_completion.py +0 -0
  466. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
  467. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
  468. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_interview.py +0 -0
  469. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
  470. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
  471. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
  472. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_question_classifier.py +0 -0
  473. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/bigbang/test_seed_generator.py +0 -0
  474. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/__init__.py +0 -0
  475. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/commands/test_tui_command.py +0 -0
  476. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/conftest.py +0 -0
  477. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/__init__.py +0 -0
  478. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_console.py +0 -0
  479. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_panels.py +0 -0
  480. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_progress.py +0 -0
  481. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_prompting.py +0 -0
  482. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_tables.py +0 -0
  483. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
  484. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_bridge_plugin_hardening.py +0 -0
  485. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_bridge_plugin_lifecycle.py +0 -0
  486. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_cancel.py +0 -0
  487. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_config.py +0 -0
  488. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
  489. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_init_runtime.py +0 -0
  490. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_jsonc.py +0 -0
  491. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_main.py +0 -0
  492. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_doctor.py +0 -0
  493. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
  494. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_shell_env.py +0 -0
  495. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
  496. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_mcp_validate_transport_stderr.py +0 -0
  497. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_opencode_config.py +0 -0
  498. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm.py +0 -0
  499. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_brownfield.py +0 -0
  500. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_completion.py +0 -0
  501. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
  502. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
  503. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_overwrite.py +0 -0
  504. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
  505. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_pm_select_repos.py +0 -0
  506. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_run_qa.py +0 -0
  507. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_setup.py +0 -0
  508. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/cli/test_uninstall.py +0 -0
  509. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/codex/test_cli_policy.py +0 -0
  510. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/__init__.py +0 -0
  511. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/test_loader.py +0 -0
  512. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/test_loader_env.py +0 -0
  513. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/config/test_models.py +0 -0
  514. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/__init__.py +0 -0
  515. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ac_tree.py +0 -0
  516. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_context.py +0 -0
  517. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_errors.py +0 -0
  518. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_file_lock.py +0 -0
  519. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_git_workflow.py +0 -0
  520. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_initial_context.py +0 -0
  521. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_lineage.py +0 -0
  522. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ontology_aspect.py +0 -0
  523. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ontology_questions.py +0 -0
  524. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_retry.py +0 -0
  525. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_security.py +0 -0
  526. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_seed.py +0 -0
  527. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_ttl_cache.py +0 -0
  528. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_types.py +0 -0
  529. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/core/test_worktree.py +0 -0
  530. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/__init__.py +0 -0
  531. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
  532. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_checklist.py +0 -0
  533. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_consensus.py +0 -0
  534. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_detector.py +0 -0
  535. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_json_utils.py +0 -0
  536. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_languages.py +0 -0
  537. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_mechanical.py +0 -0
  538. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_models.py +0 -0
  539. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_pipeline_stage1_reuse.py +0 -0
  540. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
  541. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_review_fixes.py +0 -0
  542. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_semantic.py +0 -0
  543. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_trigger.py +0 -0
  544. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
  545. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
  546. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/events/__init__.py +0 -0
  547. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/events/test_base.py +0 -0
  548. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/events/test_decomposition_events.py +0 -0
  549. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/evolution/test_wonder_scope.py +0 -0
  550. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/__init__.py +0 -0
  551. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_atomicity.py +0 -0
  552. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_decomposition.py +0 -0
  553. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_double_diamond.py +0 -0
  554. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/execution/test_subagent_isolation.py +0 -0
  555. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/hermes/test_artifacts.py +0 -0
  556. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/__init__.py +0 -0
  557. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/__init__.py +0 -0
  558. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_bridge.py +0 -0
  559. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_config.py +0 -0
  560. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_factory.py +0 -0
  561. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
  562. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/bridge/test_stability.py +0 -0
  563. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/__init__.py +0 -0
  564. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/test_adapter.py +0 -0
  565. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
  566. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/client/test_manager.py +0 -0
  567. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/conftest.py +0 -0
  568. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/server/__init__.py +0 -0
  569. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/server/test_adapter.py +0 -0
  570. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/server/test_security.py +0 -0
  571. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/test_errors.py +0 -0
  572. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/test_job_manager.py +0 -0
  573. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/test_types.py +0 -0
  574. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/__init__.py +0 -0
  575. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/conftest.py +0 -0
  576. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
  577. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
  578. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
  579. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
  580. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
  581. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
  582. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
  583. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
  584. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
  585. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
  586. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
  587. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
  588. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
  589. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_checklist_verify.py +0 -0
  590. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_definitions.py +0 -0
  591. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_evaluate_multi_ac.py +0 -0
  592. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_handler_subagent_wiring.py +0 -0
  593. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_lateral_think_handler.py +0 -0
  594. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
  595. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
  596. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
  597. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
  598. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_registry.py +0 -0
  599. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_round5_fixes.py +0 -0
  600. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/mcp/tools/test_subagent.py +0 -0
  601. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/__init__.py +0 -0
  602. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/test_drift.py +0 -0
  603. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/test_logging.py +0 -0
  604. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/observability/test_retrospective.py +0 -0
  605. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/__init__.py +0 -0
  606. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_adapter.py +0 -0
  607. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_capabilities.py +0 -0
  608. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
  609. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
  610. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
  611. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_control_plane.py +0 -0
  612. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_coordinator.py +0 -0
  613. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
  614. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_events.py +0 -0
  615. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
  616. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
  617. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_hermes_runtime.py +0 -0
  618. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
  619. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_level_context.py +0 -0
  620. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_mcp_config.py +0 -0
  621. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
  622. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
  623. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
  624. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
  625. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
  626. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
  627. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_policy.py +0 -0
  628. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_rate_limit.py +0 -0
  629. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runner.py +0 -0
  630. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
  631. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
  632. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
  633. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_sandbox_class.py +0 -0
  634. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_session.py +0 -0
  635. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/orchestrator/test_workflow_state.py +0 -0
  636. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/__init__.py +0 -0
  637. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_brownfield_store.py +0 -0
  638. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_checkpoint.py +0 -0
  639. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_event_store.py +0 -0
  640. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_schema.py +0 -0
  641. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/persistence/test_uow.py +0 -0
  642. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/__init__.py +0 -0
  643. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/agents/__init__.py +0 -0
  644. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/agents/test_registry.py +0 -0
  645. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/orchestration/__init__.py +0 -0
  646. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
  647. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/skills/__init__.py +0 -0
  648. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/skills/test_keywords.py +0 -0
  649. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/plugin/skills/test_registry.py +0 -0
  650. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/pm/__init__.py +0 -0
  651. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/pm/test_renderer.py +0 -0
  652. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/__init__.py +0 -0
  653. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_base.py +0 -0
  654. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_claude_code_adapter.py +0 -0
  655. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
  656. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_factory.py +0 -0
  657. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
  658. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_litellm_adapter.py +0 -0
  659. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/providers/test_opencode_adapter.py +0 -0
  660. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/__init__.py +0 -0
  661. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/test_lateral.py +0 -0
  662. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/test_recovery.py +0 -0
  663. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/resilience/test_stagnation.py +0 -0
  664. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/__init__.py +0 -0
  665. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_command_parser.py +0 -0
  666. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_dispatch.py +0 -0
  667. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_dispatch_result_shapes.py +0 -0
  668. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_extract_first_argument.py +0 -0
  669. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_invalid_dispatch_input_types.py +0 -0
  670. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_malformed_unknown_dispatch_errors.py +0 -0
  671. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_not_handled_resolution.py +0 -0
  672. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_registry.py +0 -0
  673. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_repository_dispatch_guard.py +0 -0
  674. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_router_resolution_pipeline.py +0 -0
  675. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_typed_frontmatter_fields.py +0 -0
  676. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/router/test_valid_dispatch_normalization.py +0 -0
  677. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/__init__.py +0 -0
  678. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_complexity.py +0 -0
  679. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_downgrade.py +0 -0
  680. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_escalation.py +0 -0
  681. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_router.py +0 -0
  682. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/routing/test_tiers.py +0 -0
  683. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/scripts/test_keyword_detector.py +0 -0
  684. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/scripts/test_session_start.py +0 -0
  685. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/scripts/test_version_check.py +0 -0
  686. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/secondary/__init__.py +0 -0
  687. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/secondary/test_scheduler.py +0 -0
  688. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/secondary/test_todo_registry.py +0 -0
  689. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/skills/test_skill_artifacts.py +0 -0
  690. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_artifact_collector.py +0 -0
  691. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_codex_artifacts.py +0 -0
  692. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_convergence.py +0 -0
  693. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_dashboard.py +0 -0
  694. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_dependencies_configured.py +0 -0
  695. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_evolve_rewind.py +0 -0
  696. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_evolve_step.py +0 -0
  697. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_graceful_shutdown.py +0 -0
  698. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_main_entry_point.py +0 -0
  699. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_module_structure.py +0 -0
  700. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_project_initialization.py +0 -0
  701. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_projector_rewind.py +0 -0
  702. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_ralph_parser.py +0 -0
  703. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_ralph_rewind.py +0 -0
  704. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_regression.py +0 -0
  705. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_tooling_configuration.py +0 -0
  706. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/test_verification.py +0 -0
  707. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/__init__.py +0 -0
  708. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_app.py +0 -0
  709. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_cancelled_display.py +0 -0
  710. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_events.py +0 -0
  711. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_lineage_viewer.py +0 -0
  712. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_screens.py +0 -0
  713. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_session_selector_replay.py +0 -0
  714. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tests/unit/tui/test_widgets.py +0 -0
  715. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/tools/sync_github_project.py +0 -0
  716. {ouroboros_ai-0.29.3.dev5 → ouroboros_ai-0.29.3.dev6}/uv.lock +0 -0
@@ -32,6 +32,7 @@ When the user types any of these commands, read the corresponding SKILL.md file
32
32
  | `ooo pm` or `ooo pm ...` | Read `skills/pm/SKILL.md` and follow it |
33
33
  | `ooo brownfield` or `ooo brownfield ...` | Read `skills/brownfield/SKILL.md` and follow it |
34
34
  | `ooo publish` or `ooo publish ...` | Read `skills/publish/SKILL.md` and follow it |
35
+ | `ooo resume` | Read `skills/resume/SKILL.md` and follow it |
35
36
 
36
37
  **Important**: Do NOT use the Skill tool. Read the file with the Read tool and execute its instructions directly.
37
38
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ouroboros-ai
3
- Version: 0.29.3.dev5
3
+ Version: 0.29.3.dev6
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
@@ -0,0 +1,116 @@
1
+ ---
2
+ name: resume
3
+ description: "List in-flight sessions and show the commands needed to re-attach after MCP disconnect"
4
+ ---
5
+
6
+ # /ouroboros:resume
7
+
8
+ Recover in-flight sessions after an unexpected MCP server disconnect.
9
+
10
+ ## Usage
11
+
12
+ ```
13
+ ooo resume
14
+ ooo resume --all
15
+ ```
16
+
17
+ **Trigger keywords:** "resume session", "re-attach", "mcp disconnected", "lost session", "in-flight"
18
+
19
+ ## How It Works
20
+
21
+ `ooo resume` reads the EventStore directly (no MCP server required) and lists
22
+ every session that is still in a `running` or `paused` state. The command is
23
+ strictly read-only — it never creates the data directory, never writes
24
+ schema, and never appends events. Its job is to surface the identifiers you
25
+ need to re-attach.
26
+
27
+ - `ooo resume` shows the 20 most recent active sessions.
28
+ - `ooo resume --all` shows every active session.
29
+
30
+ ## Instructions
31
+
32
+ When the user invokes this skill:
33
+
34
+ 1. Run the CLI command:
35
+
36
+ ```
37
+ ouroboros resume
38
+ ```
39
+
40
+ This reads `~/.ouroboros/ouroboros.db` directly — the MCP server does **not**
41
+ need to be running.
42
+
43
+ 2. If sessions are listed, enter the number of the session you want to work
44
+ with. The command prints both the `session_id` and the `exec_id`, along
45
+ with the two re-attach paths.
46
+
47
+ 3. Pick the right re-attach path:
48
+
49
+ - **Inspect only** (read-only interactive monitor):
50
+
51
+ ```
52
+ ouroboros tui monitor
53
+ ```
54
+
55
+ Launches the TUI and lets you pick the session to inspect. The
56
+ `ouroboros status execution <exec_id>` command is *registered* but its
57
+ handler is still a placeholder in `src/ouroboros/cli/commands/status.py`
58
+ (it only prints "Would show details for execution: …"), so it is
59
+ intentionally not surfaced here. Follow-up tracked as a separate issue.
60
+
61
+ - **Resume execution** (requires the original seed file):
62
+
63
+ ```
64
+ ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>
65
+ ```
66
+
67
+ ## Exit codes
68
+
69
+ | Code | Meaning |
70
+ |------|---------|
71
+ | `0` | Success — sessions listed, or no sessions found |
72
+ | `1` | Invalid user selection (non-numeric or out-of-range) |
73
+ | `2` | EventStore exists but could not be opened or read |
74
+
75
+ ## Fallback (No sessions found)
76
+
77
+ If the command reports "No in-flight sessions found", the execution either
78
+ completed, failed, was cancelled, or the EventStore has never been created.
79
+ To browse historical sessions interactively, use the TUI monitor:
80
+
81
+ ```
82
+ ouroboros tui monitor
83
+ ```
84
+
85
+ ## Example
86
+
87
+ ```
88
+ User: ooo resume
89
+
90
+ ┌─────────────────────── In-Flight Sessions ───────────────────────┐
91
+ │ # Session ID Execution ID Status Started │
92
+ │ 1 sess-abc123 exec-xyz789 running 2026-04-15 │
93
+ └───────────────────────────────────────────────────────────────────┘
94
+
95
+ Enter number to re-attach (1-1), or 'q' to quit: 1
96
+
97
+ ╭─ Re-attach ────────────────────────────────────────────────────────────────╮
98
+ │ Session ID: sess-abc123 │
99
+ │ Execution ID: exec-xyz789 │
100
+ │ │
101
+ │ Inspect (read-only interactive monitor): │
102
+ │ ouroboros tui monitor │
103
+ │ │
104
+ │ Resume execution (requires the original seed file): │
105
+ │ ouroboros run workflow --orchestrator --resume sess-abc123 seed-001 │
106
+ ╰────────────────────────────────────────────────────────────────────────────╯
107
+ ```
108
+
109
+ ## Next Steps
110
+
111
+ After you have the identifiers:
112
+
113
+ - `ouroboros tui monitor` — launch the TUI and pick the session to inspect
114
+ - `ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>` — resume execution
115
+ - `ooo evaluate` — evaluate results once the execution completes
116
+ - `ooo cancel execution <exec_id>` — cancel if the session is stuck
@@ -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.29.3.dev5'
22
- __version_tuple__ = version_tuple = (0, 29, 3, 'dev5')
21
+ __version__ = version = '0.29.3.dev6'
22
+ __version_tuple__ = version_tuple = (0, 29, 3, 'dev6')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -0,0 +1,333 @@
1
+ """Resume command for Ouroboros.
2
+
3
+ List in-flight sessions directly from the EventStore (no MCP dependency).
4
+ The command is intentionally read-only: it never creates the data directory,
5
+ never writes schema, and never appends events. Read-only is enforced at the
6
+ SQLite connection layer via ``EventStore(..., read_only=True)`` so even
7
+ unexpected write paths fail fast with ``attempt to write a readonly
8
+ database``. Its only job is to surface the identifiers a user needs to
9
+ re-attach (inspect with ``ouroboros tui monitor`` or resume execution with
10
+ ``ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>``).
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import asyncio
16
+ import os
17
+ from pathlib import Path
18
+ from typing import Annotated
19
+
20
+ import typer
21
+
22
+ from ouroboros.cli.formatters import console
23
+ from ouroboros.cli.formatters.panels import print_error, print_info, print_success
24
+ from ouroboros.cli.formatters.tables import create_table, print_table
25
+
26
+ app = typer.Typer(
27
+ name="resume",
28
+ help="List in-flight sessions and re-attach after MCP disconnect.",
29
+ invoke_without_command=True,
30
+ )
31
+
32
+
33
+ # Default cap on rows shown when many stale sessions accumulate. The user can
34
+ # opt into the full list with ``--all``.
35
+ DEFAULT_DISPLAY_LIMIT = 20
36
+
37
+ # Exit code surfaced when the EventStore exists but is unreadable. Pinned so
38
+ # users/scripts can branch on it (distinct from the happy "no sessions" path
39
+ # which exits 0).
40
+ EXIT_CORRUPTED_DB = 2
41
+
42
+
43
+ def _default_db_path() -> str:
44
+ """Return the canonical SQLite path used by the running CLI."""
45
+ return os.path.expanduser("~/.ouroboros/ouroboros.db")
46
+
47
+
48
+ async def _get_event_store(db_path: str | None = None):
49
+ """Open the EventStore read-only.
50
+
51
+ Returns ``None`` if the database file does not exist. Intentionally does
52
+ not create ``~/.ouroboros/`` or run ``metadata.create_all`` — this command
53
+ is a recovery tool and must not mutate user state. Read-only is enforced
54
+ at the SQLite connection layer via ``EventStore(..., read_only=True)``
55
+ so any accidental write path raises
56
+ ``sqlite3.OperationalError: attempt to write a readonly database``.
57
+ """
58
+ from ouroboros.persistence.event_store import EventStore
59
+
60
+ resolved = db_path or _default_db_path()
61
+ if not Path(resolved).exists():
62
+ return None
63
+
64
+ event_store = EventStore(
65
+ f"sqlite+aiosqlite:///{resolved}",
66
+ read_only=True,
67
+ )
68
+ try:
69
+ await event_store.initialize()
70
+ except Exception:
71
+ # Ensure the partially constructed engine is disposed before we bail
72
+ # out — otherwise the outer ``finally`` cannot close it (the variable
73
+ # was never bound in the caller).
74
+ try:
75
+ await event_store.close()
76
+ finally:
77
+ raise
78
+ return event_store
79
+
80
+
81
+ def _is_active_snapshot(snapshot) -> bool:
82
+ """Return True when a snapshot is plausibly running or paused.
83
+
84
+ Terminal ``status_event_type`` values short-circuit the expensive replay.
85
+ Non-terminal or progress-only snapshots fall through to reconstruction.
86
+ """
87
+ terminal = {
88
+ "orchestrator.session.completed",
89
+ "orchestrator.session.failed",
90
+ "orchestrator.session.cancelled",
91
+ }
92
+ return snapshot.status_event_type not in terminal
93
+
94
+
95
+ async def _get_in_flight_sessions(event_store, limit: int | None = DEFAULT_DISPLAY_LIMIT) -> list:
96
+ """Return running or paused session trackers, most-recent-first.
97
+
98
+ Uses ``get_session_activity_snapshots`` to narrow candidates without
99
+ replaying every event for every session, then reconstructs only the
100
+ snapshots whose latest status is non-terminal.
101
+ """
102
+ from ouroboros.orchestrator.session import SessionRepository, SessionStatus
103
+
104
+ repo = SessionRepository(event_store)
105
+
106
+ try:
107
+ snapshots = await event_store.get_session_activity_snapshots()
108
+ except AttributeError:
109
+ # Older EventStore builds may lack the snapshot helper. Fall back to
110
+ # the full replay path so the command still works.
111
+ return await _get_in_flight_sessions_fallback(event_store)
112
+
113
+ candidates = [s for s in snapshots if _is_active_snapshot(s)]
114
+
115
+ def _activity_key(snapshot) -> str:
116
+ return str(snapshot.last_activity or snapshot.start_time or "")
117
+
118
+ candidates.sort(key=_activity_key, reverse=True)
119
+
120
+ in_flight: list = []
121
+ for snapshot in candidates:
122
+ result = await repo.reconstruct_session(snapshot.session_id)
123
+ if result.is_err:
124
+ continue
125
+ tracker = result.value
126
+ if tracker.status in (SessionStatus.RUNNING, SessionStatus.PAUSED):
127
+ in_flight.append(tracker)
128
+ if limit is not None and len(in_flight) >= limit:
129
+ break
130
+
131
+ return in_flight
132
+
133
+
134
+ async def _get_in_flight_sessions_fallback(event_store) -> list:
135
+ """Legacy path: replay every session. Retained only for API compatibility."""
136
+ from ouroboros.orchestrator.session import SessionRepository, SessionStatus
137
+
138
+ repo = SessionRepository(event_store)
139
+ session_events = await event_store.get_all_sessions()
140
+ if not session_events:
141
+ return []
142
+
143
+ seen: set[str] = set()
144
+ in_flight: list = []
145
+ for event in session_events:
146
+ session_id = event.aggregate_id
147
+ if session_id in seen:
148
+ continue
149
+ seen.add(session_id)
150
+ result = await repo.reconstruct_session(session_id)
151
+ if result.is_err:
152
+ continue
153
+ tracker = result.value
154
+ if tracker.status in (SessionStatus.RUNNING, SessionStatus.PAUSED):
155
+ in_flight.append(tracker)
156
+ return in_flight
157
+
158
+
159
+ def _display_sessions(sessions: list) -> None:
160
+ """Render in-flight sessions in a numbered table."""
161
+ table = create_table("In-Flight Sessions")
162
+ table.add_column("#", style="bold", no_wrap=True, justify="right")
163
+ table.add_column("Session ID", style="cyan", no_wrap=True)
164
+ table.add_column("Execution ID", style="dim")
165
+ table.add_column("Seed ID", style="dim")
166
+ table.add_column("Status", justify="center")
167
+ table.add_column("Started", style="dim")
168
+
169
+ for idx, tracker in enumerate(sessions, 1):
170
+ status = tracker.status.value
171
+ status_style = "success" if status == "running" else "warning"
172
+ table.add_row(
173
+ str(idx),
174
+ tracker.session_id,
175
+ tracker.execution_id or "-",
176
+ tracker.seed_id or "-",
177
+ f"[{status_style}]{status}[/]",
178
+ tracker.start_time.isoformat(),
179
+ )
180
+
181
+ print_table(table)
182
+
183
+
184
+ def _format_reattach_guidance(tracker) -> str:
185
+ """Build the post-selection guidance block.
186
+
187
+ Prints two commands, matching the real CLI contracts:
188
+
189
+ - Inspect: ``ouroboros tui monitor`` (functional TUI; select the session)
190
+ - Resume: ``ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>``
191
+
192
+ ``run workflow --resume`` takes a *session_id* (not an execution_id) and
193
+ also requires the seed file, so both identifiers are surfaced explicitly.
194
+
195
+ Note: ``ouroboros status execution <exec_id>`` is *registered* but its
196
+ implementation is still a placeholder (see src/ouroboros/cli/commands/status.py),
197
+ so we deliberately do not surface it as an inspection path — it would
198
+ print misleading "Would show details" output.
199
+ """
200
+ exec_id = tracker.execution_id or "<unknown>"
201
+ seed_hint = tracker.seed_id or "<seed.yaml>"
202
+
203
+ inspect_line = "ouroboros tui monitor"
204
+ resume_line = f"ouroboros run workflow --orchestrator --resume {tracker.session_id} {seed_hint}"
205
+
206
+ lines = [
207
+ f"Session ID: [bold cyan]{tracker.session_id}[/]",
208
+ f"Execution ID: [bold cyan]{exec_id}[/]",
209
+ "",
210
+ "[bold]Inspect[/] (read-only interactive monitor):",
211
+ f" {inspect_line}",
212
+ "",
213
+ "[bold]Resume execution[/] (requires the original seed file):",
214
+ f" {resume_line}",
215
+ ]
216
+ if not tracker.seed_id:
217
+ lines.append(
218
+ "[dim]Seed ID was not recorded for this session — replace "
219
+ "<seed.yaml> with the original seed path.[/]"
220
+ )
221
+ return "\n".join(lines)
222
+
223
+
224
+ async def _interactive_resume(show_all: bool = False) -> int:
225
+ """List in-flight sessions and prompt the user to pick one to re-attach.
226
+
227
+ Returns the integer exit code the CLI should emit so callers can pin
228
+ distinct codes for missing DB vs. corrupted DB vs. happy path.
229
+ """
230
+ limit = None if show_all else DEFAULT_DISPLAY_LIMIT
231
+
232
+ try:
233
+ event_store = await _get_event_store()
234
+ except Exception as exc: # noqa: BLE001 — surface any open error verbatim
235
+ print_error(f"Failed to open EventStore: {exc}")
236
+ return EXIT_CORRUPTED_DB
237
+
238
+ if event_store is None:
239
+ print_info("No in-flight sessions found.", "Resume")
240
+ console.print(
241
+ "[dim]EventStore does not exist yet. "
242
+ "Sessions appear here after the MCP server has started at least one run.[/]"
243
+ )
244
+ return 0
245
+
246
+ try:
247
+ try:
248
+ sessions = await _get_in_flight_sessions(event_store, limit=limit)
249
+ except Exception as exc: # noqa: BLE001
250
+ print_error(f"Failed to read EventStore: {exc}")
251
+ return EXIT_CORRUPTED_DB
252
+ finally:
253
+ await event_store.close()
254
+
255
+ if not sessions:
256
+ print_info("No in-flight sessions found.", "Resume")
257
+ console.print(
258
+ "[dim]Sessions appear here when the MCP server was disconnected mid-execution.[/]"
259
+ )
260
+ return 0
261
+
262
+ _display_sessions(sessions)
263
+ console.print()
264
+
265
+ choice = typer.prompt(
266
+ f"Enter number to re-attach (1-{len(sessions)}), or 'q' to quit",
267
+ default="q",
268
+ )
269
+
270
+ if choice.strip().lower() == "q":
271
+ print_info("No session selected.", "Resume")
272
+ return 0
273
+
274
+ try:
275
+ index = int(choice) - 1
276
+ except ValueError:
277
+ print_error(f"Invalid selection: {choice!r}")
278
+ return 1
279
+
280
+ if index < 0 or index >= len(sessions):
281
+ print_error(f"Selection out of range: {choice}. Expected 1-{len(sessions)}.")
282
+ return 1
283
+
284
+ selected = sessions[index]
285
+ print_success(_format_reattach_guidance(selected), "Re-attach")
286
+ return 0
287
+
288
+
289
+ @app.callback(invoke_without_command=True)
290
+ def resume(
291
+ ctx: typer.Context,
292
+ show_all: Annotated[
293
+ bool,
294
+ typer.Option(
295
+ "--all",
296
+ "-a",
297
+ help=(
298
+ f"Show every in-flight session instead of the most recent {DEFAULT_DISPLAY_LIMIT}."
299
+ ),
300
+ ),
301
+ ] = False,
302
+ ) -> None:
303
+ """List in-flight sessions and get re-attach instructions.
304
+
305
+ Reads the EventStore directly — no MCP server required. Use this command
306
+ after an unexpected MCP disconnect to recover the session/execution IDs
307
+ and re-attach.
308
+
309
+ Re-attach paths surfaced after selection:
310
+
311
+ # Inspect (interactive monitor — the `status execution` placeholder is
312
+ # not wired up yet)
313
+ ouroboros tui monitor
314
+
315
+ # Resume execution (requires the original seed file)
316
+ ouroboros run workflow --orchestrator --resume <session_id> <seed.yaml>
317
+
318
+ Examples:
319
+
320
+ # Interactive: list in-flight sessions and pick one
321
+ ouroboros resume
322
+
323
+ # Show every stale active session, not just the 20 most recent
324
+ ouroboros resume --all
325
+ """
326
+ if ctx.invoked_subcommand is not None:
327
+ return
328
+ exit_code = asyncio.run(_interactive_resume(show_all=show_all))
329
+ if exit_code != 0:
330
+ raise typer.Exit(exit_code)
331
+
332
+
333
+ __all__ = ["app"]
@@ -21,6 +21,7 @@ from ouroboros.cli.commands import (
21
21
  init,
22
22
  mcp,
23
23
  pm,
24
+ resume,
24
25
  run,
25
26
  setup,
26
27
  status,
@@ -48,6 +49,7 @@ app.add_typer(setup.app, name="setup")
48
49
  app.add_typer(detect.app, name="detect")
49
50
  app.add_typer(tui.app, name="tui")
50
51
  app.add_typer(pm.app, name="pm")
52
+ app.add_typer(resume.app, name="resume")
51
53
  app.add_typer(uninstall.app, name="uninstall")
52
54
 
53
55
 
@@ -90,21 +90,64 @@ class EventStore:
90
90
  await store.close()
91
91
  """
92
92
 
93
- def __init__(self, database_url: str | None = None) -> None:
93
+ def __init__(
94
+ self,
95
+ database_url: str | None = None,
96
+ *,
97
+ read_only: bool = False,
98
+ ) -> None:
94
99
  """Initialize EventStore with database URL.
95
100
 
96
101
  Args:
97
102
  database_url: SQLAlchemy database URL.
98
103
  For async SQLite: "sqlite+aiosqlite:///path/to/db.sqlite"
99
104
  If not provided, defaults to ~/.ouroboros/ouroboros.db
105
+ read_only: When True, open the underlying SQLite database in true
106
+ read-only mode by rewriting the URL into the ``file:<path>?mode=ro&uri=true``
107
+ form and passing ``connect_args={"uri": True}`` to aiosqlite.
108
+ This enforces the read-only contract at the connection layer
109
+ so *any* accidental write path (including library/future code
110
+ paths we don't control) fails fast with
111
+ ``sqlite3.OperationalError: attempt to write a readonly database``.
112
+ Callers that opt in should also skip schema creation by calling
113
+ ``initialize(create_schema=False)`` — this is the default when
114
+ ``read_only=True``. ``read_only`` is a no-op for non-SQLite URLs.
100
115
  """
101
116
  if database_url is None:
102
117
  db_path = Path.home() / ".ouroboros" / "ouroboros.db"
103
- db_path.parent.mkdir(parents=True, exist_ok=True)
118
+ if not read_only:
119
+ db_path.parent.mkdir(parents=True, exist_ok=True)
104
120
  database_url = f"sqlite+aiosqlite:///{db_path}"
121
+
122
+ self._read_only = read_only
123
+ if read_only:
124
+ database_url = self._coerce_to_readonly_url(database_url)
105
125
  self._database_url = database_url
106
126
  self._engine: AsyncEngine | None = None
107
127
 
128
+ @staticmethod
129
+ def _coerce_to_readonly_url(database_url: str) -> str:
130
+ """Rewrite a plain aiosqlite URL into a ``mode=ro`` URI form.
131
+
132
+ Leaves non-SQLite URLs untouched. Already-URI forms (starting with
133
+ ``file:``) are returned as-is so explicit callers keep full control.
134
+ """
135
+ prefix = "sqlite+aiosqlite:///"
136
+ if not database_url.startswith(prefix):
137
+ return database_url
138
+
139
+ path_part = database_url[len(prefix) :]
140
+ if path_part.startswith("file:"):
141
+ # Caller already provided a URI form — respect it verbatim.
142
+ return database_url
143
+
144
+ # ``:memory:`` has no filesystem and cannot be opened read-only
145
+ # meaningfully; leave it alone.
146
+ if path_part in (":memory:", ""):
147
+ return database_url
148
+
149
+ return f"{prefix}file:{path_part}?mode=ro&uri=true"
150
+
108
151
  def _raise_invalid_append_input(
109
152
  self,
110
153
  event: object,
@@ -133,34 +176,65 @@ class EventStore:
133
176
  details=details,
134
177
  )
135
178
 
136
- async def initialize(self) -> None:
179
+ async def initialize(self, *, create_schema: bool | None = None) -> None:
137
180
  """Initialize the database connection and create tables if needed.
138
181
 
139
182
  This method is idempotent - calling it multiple times is safe.
140
183
 
184
+ Args:
185
+ create_schema: When True run ``metadata.create_all`` so missing
186
+ tables are created. Read-only consumers (for example diagnostic
187
+ CLI commands that must not mutate the store) can pass ``False``
188
+ to skip schema creation entirely. When ``None`` (default), the
189
+ value follows ``read_only``: stores constructed with
190
+ ``read_only=True`` skip schema creation and all others create
191
+ it, preserving the prior default behaviour.
192
+
141
193
  For aiosqlite, uses StaticPool (default) which maintains a single
142
194
  connection. This avoids connection accumulation while supporting
143
195
  :memory: databases in tests.
144
196
  """
197
+ if create_schema is None:
198
+ create_schema = not self._read_only
199
+
200
+ if self._read_only and create_schema:
201
+ raise PersistenceError(
202
+ "Cannot create schema on a read-only EventStore.",
203
+ operation="initialize",
204
+ details={"read_only": True},
205
+ )
206
+
145
207
  if self._engine is None:
208
+ connect_args: dict[str, object] = {"timeout": 30}
209
+ if self._read_only:
210
+ # aiosqlite forwards unknown kwargs to sqlite3.connect — the
211
+ # ``uri=True`` flag is what turns the ``file:...?mode=ro`` form
212
+ # into a real read-only connection.
213
+ connect_args["uri"] = True
214
+
146
215
  self._engine = create_async_engine(
147
216
  self._database_url,
148
217
  echo=False,
149
- connect_args={"timeout": 30},
218
+ connect_args=connect_args,
150
219
  )
151
220
 
152
- # Enable WAL mode and set busy timeout on every new connection
153
- @event.listens_for(self._engine.sync_engine, "connect")
154
- def _set_sqlite_pragmas(dbapi_conn, _connection_record):
155
- cursor = dbapi_conn.cursor()
156
- cursor.execute("PRAGMA journal_mode=WAL")
157
- cursor.execute("PRAGMA synchronous=NORMAL")
158
- cursor.execute("PRAGMA busy_timeout=30000")
159
- cursor.close()
160
-
161
- # Create all tables defined in metadata
162
- async with self._engine.begin() as conn:
163
- await conn.run_sync(metadata.create_all)
221
+ # Enable WAL mode and set busy timeout on every new connection.
222
+ # Skipped for read-only consumers: ``PRAGMA journal_mode=WAL`` is
223
+ # itself a write and would trip SQLite's read-only guard.
224
+ if not self._read_only:
225
+
226
+ @event.listens_for(self._engine.sync_engine, "connect")
227
+ def _set_sqlite_pragmas(dbapi_conn, _connection_record):
228
+ cursor = dbapi_conn.cursor()
229
+ cursor.execute("PRAGMA journal_mode=WAL")
230
+ cursor.execute("PRAGMA synchronous=NORMAL")
231
+ cursor.execute("PRAGMA busy_timeout=30000")
232
+ cursor.close()
233
+
234
+ # Create all tables defined in metadata (skipped for read-only consumers)
235
+ if create_schema:
236
+ async with self._engine.begin() as conn:
237
+ await conn.run_sync(metadata.create_all)
164
238
 
165
239
  async def append(self, event: BaseEvent) -> None:
166
240
  """Append an event to the store.