ouroboros-ai 0.27.2.dev2__tar.gz → 0.27.3.dev1__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.
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.claude-plugin/marketplace.json +1 -1
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.claude-plugin/plugin.json +1 -1
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/PKG-INFO +1 -1
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/cli-reference.md +17 -17
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/config-reference.md +1 -3
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/getting-started.md +13 -10
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/runtime-capability-matrix.md +32 -29
- ouroboros_ai-0.27.3.dev1/docs/runtime-guides/opencode.md +165 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/setup/SKILL.md +1 -1
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/_version.py +2 -2
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/init.py +4 -2
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/mcp.py +8 -6
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/run.py +2 -1
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/setup.py +213 -6
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/uninstall.py +54 -0
- ouroboros_ai-0.27.3.dev1/src/ouroboros/cli/jsonc.py +93 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/__init__.py +12 -18
- ouroboros_ai-0.27.3.dev1/src/ouroboros/orchestrator/opencode_event_normalizer.py +414 -0
- ouroboros_ai-0.27.3.dev1/src/ouroboros/orchestrator/opencode_runtime.py +1547 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/runtime_factory.py +10 -6
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/providers/__init__.py +5 -5
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/providers/factory.py +15 -10
- ouroboros_ai-0.27.3.dev1/src/ouroboros/providers/opencode_adapter.py +660 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/mcp/test_server_adapter.py +14 -3
- ouroboros_ai-0.27.3.dev1/tests/unit/cli/test_jsonc.py +141 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_pm_runtime_adapter.py +2 -4
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_setup.py +451 -0
- ouroboros_ai-0.27.3.dev1/tests/unit/orchestrator/test_opencode_runtime.py +781 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_runtime_factory.py +16 -53
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/providers/test_factory.py +15 -25
- ouroboros_ai-0.27.3.dev1/tests/unit/providers/test_opencode_adapter.py +515 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.claude/settings.json +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.claude-plugin/.mcp.json +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.env.example +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.gitignore +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.mcp.json +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.ouroboros/mechanical.toml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/.python-version +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/CLAUDE.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/CODE_OF_CONDUCT.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/CONTRIBUTING.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/HANDOFF.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/LICENSE +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/README.ko.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/README.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/SECURITY.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/UNINSTALL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/cancel.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/evolve.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/help.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/interview.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/ralph.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/run.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/seed.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/setup.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/status.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/commands/welcome.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/README.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/api/README.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/api/core.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/architecture.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/contributing/findings-registry.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/contributing/issue-quality-policy.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/guides/evaluation-pipeline.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/guides/evolution-loop.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/guides/mcp-bridge.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/guides/seed-authoring.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/images/PLACEHOLDER_README.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/platform-support.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/runtime-guides/claude-code.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/docs/runtime-guides/codex.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/examples/test_display.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/llms-full.txt +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/llms.txt +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/project-context.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/pyproject.toml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/scripts/install.sh +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/scripts/keyword-detector.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/scripts/mcp-serve.sh +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/scripts/sync-plugin-version.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/brownfield/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/help/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/pm/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/publish/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/update/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/breadth-keeper.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/seed-closer.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/ambiguity.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/brownfield.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/pm_completion.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/pm_document.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/pm_interview.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/pm_seed.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/question_classifier.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/pm.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/formatters/prompting.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/cli/main.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/codex/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/codex/artifacts.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/codex/ouroboros.md +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/codex_permissions.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/initial_context.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/json_utils.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/project_paths.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/retry.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/ttl_cache.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/core/worktree.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evolution/loop.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/bridge/bridge.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/bridge/config.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/bridge/factory.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/server/adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/definitions.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/capabilities.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/control_plane.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/heartbeat.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/policy.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/runner.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/session.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/persistence/brownfield.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/persistence/event_store.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/pm/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/pm/handoff.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/pm/renderer.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/providers/codex_cli_stream.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/screens/session_selector.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/conftest.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/e2e/test_cli_commands.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/conftest.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/test_codex_skill_fallback.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/test_codex_skill_smoke.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_ambiguity.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_brownfield.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_classifier_context.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_decide_later_items.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_interview_async_io.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_pm_completion.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_pm_interview.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_question_classifier.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/commands/test_tui_command.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/formatters/test_prompting.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_config.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_init_runtime.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_main.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_pm.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_pm_brownfield.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_pm_completion.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_pm_overwrite.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_pm_select_repos.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_run_qa.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/cli/test_uninstall.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/config/test_loader_env.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_context.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_file_lock.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_initial_context.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_lineage.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_retry.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_ttl_cache.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/core/test_worktree.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_json_utils.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_review_fixes.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/evolution/test_wonder_scope.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/bridge/test_bridge.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/bridge/test_config.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/bridge/test_factory.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/bridge/test_stability.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/conftest.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_evaluation_handler.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_interview_parallel_scoring.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_interview_scoring_guard.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_qa_integration.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/mcp/tools/test_traceback_reporting.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_capabilities.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_control_plane.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_policy.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_runner.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_session.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/persistence/test_brownfield_store.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/persistence/test_event_store.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/plugin/skills/test_keywords.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/pm/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/pm/test_renderer.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/providers/test_litellm_adapter.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_artifact_collector.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_codex_artifacts.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_dependencies_configured.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_graceful_shutdown.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/tui/test_session_selector_replay.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/tools/sync_github_project.py +0 -0
- {ouroboros_ai-0.27.2.dev2 → ouroboros_ai-0.27.3.dev1}/uv.lock +0 -0
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{
|
|
11
11
|
"name": "ouroboros",
|
|
12
12
|
"description": "Transform vague ideas into validated seed specifications through Socratic questioning and ontological analysis",
|
|
13
|
-
"version": "0.27.
|
|
13
|
+
"version": "0.27.2",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "Q00",
|
|
16
16
|
"email": "jqyu.lee@gmail.com"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
doc_metadata:
|
|
3
|
-
runtime_scope: [local, claude, codex]
|
|
3
|
+
runtime_scope: [local, claude, codex, opencode]
|
|
4
4
|
-->
|
|
5
5
|
|
|
6
6
|
# CLI Reference
|
|
@@ -56,7 +56,7 @@ ouroboros [OPTIONS] COMMAND [ARGS]...
|
|
|
56
56
|
Detect available runtime backends and configure Ouroboros for your environment.
|
|
57
57
|
|
|
58
58
|
Ouroboros supports multiple runtime backends via a pluggable `AgentRuntime` protocol. The `setup` command auto-detects
|
|
59
|
-
which runtimes are available in your PATH (currently: Claude Code, Codex CLI) and
|
|
59
|
+
which runtimes are available in your PATH (currently: Claude Code, Codex CLI, OpenCode) and
|
|
60
60
|
configures `orchestrator.runtime_backend` accordingly. Additional runtimes can be registered
|
|
61
61
|
by implementing the protocol — see [Architecture](architecture.md#how-to-add-a-new-runtime-adapter).
|
|
62
62
|
|
|
@@ -68,7 +68,7 @@ ouroboros setup [OPTIONS]
|
|
|
68
68
|
|
|
69
69
|
| Option | Description |
|
|
70
70
|
|--------|-------------|
|
|
71
|
-
| `-r, --runtime TEXT` | Runtime backend to configure. Shipped values: `claude`, `codex`. Auto-detected if omitted |
|
|
71
|
+
| `-r, --runtime TEXT` | Runtime backend to configure. Shipped values: `claude`, `codex`, `opencode`. Auto-detected if omitted |
|
|
72
72
|
| `--non-interactive` | Skip interactive prompts (for scripted installs) |
|
|
73
73
|
|
|
74
74
|
**Examples:**
|
|
@@ -97,11 +97,10 @@ ouroboros setup --non-interactive
|
|
|
97
97
|
- For Codex CLI: installs managed Ouroboros rules into `~/.codex/rules/`
|
|
98
98
|
- For Codex CLI: installs managed Ouroboros skills into `~/.codex/skills/`
|
|
99
99
|
- For Codex CLI: registers the Ouroboros MCP/env block in `~/.codex/config.toml`
|
|
100
|
+
- For OpenCode: registers the Ouroboros MCP server in OpenCode's configuration
|
|
100
101
|
|
|
101
102
|
> **Codex config split:** put persistent Ouroboros per-role model overrides in `~/.ouroboros/config.yaml` (`clarification.default_model`, `llm.qa_model`, `evaluation.semantic_model`, `consensus.models`, `consensus.advocate_model`, `consensus.devil_model`, `consensus.judge_model`). `~/.codex/config.toml` is only the Codex MCP/env hookup file used by setup.
|
|
102
103
|
|
|
103
|
-
> **`opencode` caveat:** `setup` detects the `opencode` binary in PATH but cannot configure it — if `opencode` is your only installed runtime, `setup` exits with `Error: Unsupported runtime: opencode`. The `opencode` runtime backend is **not yet implemented** (`runtime_factory.py` raises `NotImplementedError`). It is planned for a future release.
|
|
104
|
-
|
|
105
104
|
---
|
|
106
105
|
|
|
107
106
|
## `ouroboros init`
|
|
@@ -132,8 +131,8 @@ ouroboros init [start] [OPTIONS] [CONTEXT]
|
|
|
132
131
|
| `-r, --resume TEXT` | Resume an existing interview by ID |
|
|
133
132
|
| `--state-dir DIRECTORY` | Custom directory for interview state files |
|
|
134
133
|
| `-o, --orchestrator` | Use Claude Code for the interview/seed flow; combine with `--runtime` to choose the workflow handoff backend |
|
|
135
|
-
| `--runtime TEXT` | Agent runtime backend for the workflow execution step after seed generation. Shipped values: `claude`, `codex
|
|
136
|
-
| `--llm-backend TEXT` | LLM backend for interview, ambiguity scoring, and seed generation (`claude_code`, `litellm`, `codex
|
|
134
|
+
| `--runtime TEXT` | Agent runtime backend for the workflow execution step after seed generation. Shipped values: `claude`, `codex`, `opencode`. Custom adapters registered in `runtime_factory.py` are also accepted. |
|
|
135
|
+
| `--llm-backend TEXT` | LLM backend for interview, ambiguity scoring, and seed generation (`claude_code`, `litellm`, `codex`, `opencode`) |
|
|
137
136
|
| `-d, --debug` | Show verbose logs including debug messages |
|
|
138
137
|
|
|
139
138
|
**Examples:**
|
|
@@ -209,7 +208,7 @@ ouroboros run [workflow] [OPTIONS] SEED_FILE
|
|
|
209
208
|
| Option | Description |
|
|
210
209
|
|--------|-------------|
|
|
211
210
|
| `-o/-O, --orchestrator/--no-orchestrator` | Use the agent-runtime orchestrator for execution (default: enabled) |
|
|
212
|
-
| `--runtime TEXT` | Agent runtime backend override (`claude`, `codex`). Uses configured default if omitted
|
|
211
|
+
| `--runtime TEXT` | Agent runtime backend override (`claude`, `codex`, `opencode`). Uses configured default if omitted |
|
|
213
212
|
| `-r, --resume TEXT` | Resume a previous orchestrator session by ID |
|
|
214
213
|
| `--mcp-config PATH` | Path to MCP client configuration YAML file |
|
|
215
214
|
| `--mcp-tool-prefix TEXT` | Prefix to add to all MCP tool names (e.g., `mcp_`) |
|
|
@@ -352,7 +351,7 @@ ouroboros config backend [BACKEND]
|
|
|
352
351
|
|
|
353
352
|
| Argument | Description |
|
|
354
353
|
|----------|-------------|
|
|
355
|
-
| `BACKEND` | Backend to switch to: `claude` or `codex`. Omit to show current |
|
|
354
|
+
| `BACKEND` | Backend to switch to: `claude` or `codex`. Omit to show current. For `opencode`, use `ouroboros setup` instead |
|
|
356
355
|
|
|
357
356
|
**Examples:**
|
|
358
357
|
|
|
@@ -631,8 +630,8 @@ ouroboros mcp serve [OPTIONS]
|
|
|
631
630
|
| `-p, --port INTEGER` | Port to bind to (default: 8080) |
|
|
632
631
|
| `-t, --transport TEXT` | Transport type: `stdio` or `sse` (default: stdio) |
|
|
633
632
|
| `--db TEXT` | Path to the EventStore database file |
|
|
634
|
-
| `--runtime TEXT` |
|
|
635
|
-
| `--llm-backend TEXT` | LLM backend for interview/seed/evaluation tools (`claude_code`, `litellm`, `codex
|
|
633
|
+
| `--runtime TEXT` | Agent runtime backend for orchestrator-driven tools (`claude`, `codex`, `opencode`). Affects which tool variants are instantiated |
|
|
634
|
+
| `--llm-backend TEXT` | LLM backend for interview/seed/evaluation tools (`claude_code`, `litellm`, `codex`, `opencode`). Affects which tool variants are instantiated |
|
|
636
635
|
|
|
637
636
|
**Examples:**
|
|
638
637
|
|
|
@@ -689,7 +688,7 @@ If Ouroboros is installed directly (not via `uvx`), use:
|
|
|
689
688
|
|
|
690
689
|
```yaml
|
|
691
690
|
orchestrator:
|
|
692
|
-
runtime_backend: claude # or "codex"
|
|
691
|
+
runtime_backend: claude # or "codex" or "opencode"
|
|
693
692
|
```
|
|
694
693
|
|
|
695
694
|
Override per-session with the `OUROBOROS_AGENT_RUNTIME` environment variable if needed.
|
|
@@ -706,8 +705,8 @@ ouroboros mcp info [OPTIONS]
|
|
|
706
705
|
|
|
707
706
|
| Option | Description |
|
|
708
707
|
|--------|-------------|
|
|
709
|
-
| `--runtime TEXT` | Agent runtime backend for orchestrator-driven tools (`claude`, `codex`). Affects which tool variants are instantiated |
|
|
710
|
-
| `--llm-backend TEXT` | LLM backend for interview/seed/evaluation tools (`claude_code`, `litellm`, `codex`). Affects which tool variants are instantiated |
|
|
708
|
+
| `--runtime TEXT` | Agent runtime backend for orchestrator-driven tools (`claude`, `codex`, `opencode`). Affects which tool variants are instantiated |
|
|
709
|
+
| `--llm-backend TEXT` | LLM backend for interview/seed/evaluation tools (`claude_code`, `litellm`, `codex`, `opencode`). Affects which tool variants are instantiated |
|
|
711
710
|
|
|
712
711
|
**Available Tools:**
|
|
713
712
|
|
|
@@ -722,7 +721,7 @@ ouroboros mcp info [OPTIONS]
|
|
|
722
721
|
## Typical Workflows
|
|
723
722
|
|
|
724
723
|
> For first-time setup and the complete onboarding flow, see **[Getting Started](getting-started.md)**.
|
|
725
|
-
> For runtime-specific configuration, see the [Claude Code](runtime-guides/claude-code.md)
|
|
724
|
+
> For runtime-specific configuration, see the [Claude Code](runtime-guides/claude-code.md), [Codex CLI](runtime-guides/codex.md), and [OpenCode](runtime-guides/opencode.md) runtime guides.
|
|
726
725
|
|
|
727
726
|
### Cancelling Stuck Executions
|
|
728
727
|
|
|
@@ -745,11 +744,12 @@ The table below covers the most commonly used variables. For the full list — i
|
|
|
745
744
|
| `ANTHROPIC_API_KEY` | — | Anthropic API key for Claude models |
|
|
746
745
|
| `OPENAI_API_KEY` | — | OpenAI API key for LiteLLM / Codex CLI |
|
|
747
746
|
| `OPENROUTER_API_KEY` | — | OpenRouter API key for consensus and LiteLLM |
|
|
748
|
-
| `OUROBOROS_AGENT_RUNTIME` | `orchestrator.runtime_backend` | Override the runtime backend (`claude`, `codex`) |
|
|
749
|
-
| `OUROBOROS_AGENT_PERMISSION_MODE` | `orchestrator.permission_mode` | Permission mode for
|
|
747
|
+
| `OUROBOROS_AGENT_RUNTIME` | `orchestrator.runtime_backend` | Override the runtime backend (`claude`, `codex`, `opencode`) |
|
|
748
|
+
| `OUROBOROS_AGENT_PERMISSION_MODE` | `orchestrator.permission_mode` | Permission mode for Claude Code / Codex runtimes (no-op for OpenCode) |
|
|
750
749
|
| `OUROBOROS_LLM_BACKEND` | `llm.backend` | Override the LLM-only flow backend |
|
|
751
750
|
| `OUROBOROS_CLI_PATH` | `orchestrator.cli_path` | Path to the Claude CLI binary |
|
|
752
751
|
| `OUROBOROS_CODEX_CLI_PATH` | `orchestrator.codex_cli_path` | Path to the Codex CLI binary |
|
|
752
|
+
| `OUROBOROS_OPENCODE_CLI_PATH` | `orchestrator.opencode_cli_path` | Path to the OpenCode CLI binary |
|
|
753
753
|
|
|
754
754
|
---
|
|
755
755
|
|
|
@@ -75,7 +75,7 @@ Controls how Ouroboros launches and communicates with the agent runtime backend.
|
|
|
75
75
|
|
|
76
76
|
```yaml
|
|
77
77
|
orchestrator:
|
|
78
|
-
runtime_backend: claude # "claude" | "codex" | "opencode"
|
|
78
|
+
runtime_backend: claude # "claude" | "codex" | "opencode"
|
|
79
79
|
permission_mode: acceptEdits # "default" | "acceptEdits" | "bypassPermissions"
|
|
80
80
|
opencode_permission_mode: bypassPermissions
|
|
81
81
|
cli_path: null # Path to Claude CLI binary; null = use SDK default
|
|
@@ -94,8 +94,6 @@ orchestrator:
|
|
|
94
94
|
| `opencode_cli_path` | `string \| null` | `null` | Absolute path to the OpenCode CLI binary (`~` is expanded). When `null`, resolved from `PATH` at runtime. Overridable via `OUROBOROS_OPENCODE_CLI_PATH`. |
|
|
95
95
|
| `default_max_turns` | `int >= 1` | `10` | Default maximum number of turns per agent execution task. |
|
|
96
96
|
|
|
97
|
-
> **OpenCode scope note:** The `opencode` runtime backend is **not yet implemented** — setting `runtime_backend: opencode` will raise `NotImplementedError` at runtime. The `opencode_*` options are listed here for forward-compatibility; support is planned for a future release.
|
|
98
|
-
|
|
99
97
|
---
|
|
100
98
|
|
|
101
99
|
## `llm`
|
|
@@ -35,7 +35,7 @@ That's it. `ooo interview` runs a Socratic interview that auto-generates a seed
|
|
|
35
35
|
|
|
36
36
|
### Alternative: Standalone CLI (`ouroboros`)
|
|
37
37
|
|
|
38
|
-
Use this path if you prefer a standalone terminal workflow, or are using a non-Claude runtime (e.g., Codex CLI).
|
|
38
|
+
Use this path if you prefer a standalone terminal workflow, or are using a non-Claude runtime (e.g., Codex CLI, OpenCode).
|
|
39
39
|
|
|
40
40
|
**Requires Python >= 3.12.**
|
|
41
41
|
|
|
@@ -114,6 +114,7 @@ uv run ouroboros --version # verify CLI
|
|
|
114
114
|
| Claude Code (`ooo`) | Claude Code with plugin support |
|
|
115
115
|
| Standalone CLI (`ouroboros`) | Python >= 3.12, API key (Anthropic or OpenAI) |
|
|
116
116
|
| Codex CLI backend | Python >= 3.12, `npm install -g @openai/codex`, OpenAI API key with access to GPT-5.4 |
|
|
117
|
+
| OpenCode backend | Python >= 3.12, `opencode` on PATH, API key for your configured provider |
|
|
117
118
|
|
|
118
119
|
---
|
|
119
120
|
|
|
@@ -137,7 +138,7 @@ export OPENAI_API_KEY="your-openai-key"
|
|
|
137
138
|
|
|
138
139
|
```yaml
|
|
139
140
|
orchestrator:
|
|
140
|
-
runtime_backend: claude # claude | codex
|
|
141
|
+
runtime_backend: claude # claude | codex | opencode
|
|
141
142
|
|
|
142
143
|
llm:
|
|
143
144
|
backend: claude_code # claude_code | codex | litellm
|
|
@@ -293,20 +294,21 @@ ooo run
|
|
|
293
294
|
|
|
294
295
|
## Choosing a Runtime Backend
|
|
295
296
|
|
|
296
|
-
Ouroboros delegates code execution to a pluggable runtime backend.
|
|
297
|
+
Ouroboros delegates code execution to a pluggable runtime backend. Three ship out of the box:
|
|
297
298
|
|
|
298
|
-
| | Claude Code | Codex CLI |
|
|
299
|
-
|
|
300
|
-
| **Best for** | Claude Code users; subscription billing | OpenAI ecosystem; pay-per-token billing |
|
|
301
|
-
| **Install** | `pip install ouroboros-ai[claude]` | `pip install ouroboros-ai` + `npm install -g @openai/codex` |
|
|
302
|
-
| **Skill shortcuts** | `ooo` inside Claude Code | `ooo` after `ouroboros setup --runtime codex` installs managed Codex skills |
|
|
303
|
-
| **Config value** | `claude` | `codex` |
|
|
299
|
+
| | Claude Code | Codex CLI | OpenCode |
|
|
300
|
+
|---|---|---|---|
|
|
301
|
+
| **Best for** | Claude Code users; subscription billing | OpenAI ecosystem; pay-per-token billing | Multi-provider flexibility; open-source tooling |
|
|
302
|
+
| **Install** | `pip install ouroboros-ai[claude]` | `pip install ouroboros-ai` + `npm install -g @openai/codex` | `pip install ouroboros-ai` + `opencode` on PATH |
|
|
303
|
+
| **Skill shortcuts** | `ooo` inside Claude Code | `ooo` after `ouroboros setup --runtime codex` installs managed Codex skills | `ooo` after `ouroboros setup --runtime opencode` |
|
|
304
|
+
| **Config value** | `claude` | `codex` | `opencode` |
|
|
304
305
|
|
|
305
|
-
|
|
306
|
+
All three backends run the same core workflow engine (seed execution, TUI). However, user-facing commands still differ: Claude Code has native in-session `ooo` workflows, while Codex CLI and OpenCode rely on `ouroboros setup --runtime <backend>` to configure the integration. The `ouroboros` CLI remains the most universal terminal path, and some advanced operations are still MCP/Claude-only.
|
|
306
307
|
|
|
307
308
|
For backend-specific configuration:
|
|
308
309
|
- [Claude Code runtime guide](runtime-guides/claude-code.md)
|
|
309
310
|
- [Codex CLI runtime guide](runtime-guides/codex.md)
|
|
311
|
+
- [OpenCode runtime guide](runtime-guides/opencode.md)
|
|
310
312
|
|
|
311
313
|
---
|
|
312
314
|
|
|
@@ -405,5 +407,6 @@ ouroboros cancel execution <session_id>
|
|
|
405
407
|
- [Configuration Reference](config-reference.md) -- all config keys and defaults
|
|
406
408
|
- [Claude Code runtime guide](runtime-guides/claude-code.md) -- backend-specific setup
|
|
407
409
|
- [Codex CLI runtime guide](runtime-guides/codex.md) -- backend-specific setup
|
|
410
|
+
- [OpenCode runtime guide](runtime-guides/opencode.md) -- backend-specific setup
|
|
408
411
|
|
|
409
412
|
Need help? Open an issue on [GitHub](https://github.com/Q00/ouroboros/issues).
|
|
@@ -13,7 +13,7 @@ The runtime backend is selected via the `orchestrator.runtime_backend` config ke
|
|
|
13
13
|
|
|
14
14
|
```yaml
|
|
15
15
|
orchestrator:
|
|
16
|
-
runtime_backend: claude # Supported values: claude | codex
|
|
16
|
+
runtime_backend: claude # Supported values: claude | codex | opencode
|
|
17
17
|
# The runtime abstraction layer also accepts custom
|
|
18
18
|
# adapters registered in runtime_factory.py
|
|
19
19
|
```
|
|
@@ -26,7 +26,7 @@ ouroboros run workflow --runtime codex seed.yaml
|
|
|
26
26
|
|
|
27
27
|
You can also override the configured backend with the `OUROBOROS_AGENT_RUNTIME` environment variable.
|
|
28
28
|
|
|
29
|
-
> **Extensibility:** Ouroboros uses a pluggable `AgentRuntime` protocol. Claude Code
|
|
29
|
+
> **Extensibility:** Ouroboros uses a pluggable `AgentRuntime` protocol. Claude Code, Codex CLI, and OpenCode are the three shipped backends; additional runtimes can be registered by implementing the protocol and extending `runtime_factory.py`. See [Architecture — How to add a new runtime adapter](architecture.md#how-to-add-a-new-runtime-adapter).
|
|
30
30
|
|
|
31
31
|
## Capability Matrix
|
|
32
32
|
|
|
@@ -34,39 +34,39 @@ You can also override the configured backend with the `OUROBOROS_AGENT_RUNTIME`
|
|
|
34
34
|
|
|
35
35
|
These capabilities are part of the Ouroboros core engine and work the same way regardless of runtime backend.
|
|
36
36
|
|
|
37
|
-
| Capability | Claude Code | Codex CLI | Notes |
|
|
38
|
-
|
|
39
|
-
| Seed file parsing | Yes | Yes | Same YAML schema, same validation |
|
|
40
|
-
| Acceptance criteria tree | Yes | Yes | Structured AC decomposition |
|
|
41
|
-
| Evaluation principles | Yes | Yes | Weighted scoring against principles |
|
|
42
|
-
| Exit conditions | Yes | Yes | Deterministic termination logic |
|
|
43
|
-
| Event sourcing (SQLite) | Yes | Yes | Full event log, replay support |
|
|
44
|
-
| Checkpoint / resume | Yes | Yes | `--resume <session_id>` |
|
|
45
|
-
| TUI dashboard | Yes | Yes | Textual-based progress view |
|
|
46
|
-
| Interview (Socratic seed creation) | Yes | Yes | `ouroboros init start ...` with the appropriate LLM backend |
|
|
47
|
-
| Dry-run validation | Yes | Yes | `--dry-run` validates without executing |
|
|
37
|
+
| Capability | Claude Code | Codex CLI | OpenCode | Notes |
|
|
38
|
+
|------------|:-----------:|:---------:|:--------:|-------|
|
|
39
|
+
| Seed file parsing | Yes | Yes | Yes | Same YAML schema, same validation |
|
|
40
|
+
| Acceptance criteria tree | Yes | Yes | Yes | Structured AC decomposition |
|
|
41
|
+
| Evaluation principles | Yes | Yes | Yes | Weighted scoring against principles |
|
|
42
|
+
| Exit conditions | Yes | Yes | Yes | Deterministic termination logic |
|
|
43
|
+
| Event sourcing (SQLite) | Yes | Yes | Yes | Full event log, replay support |
|
|
44
|
+
| Checkpoint / resume | Yes | Yes | Yes | `--resume <session_id>` |
|
|
45
|
+
| TUI dashboard | Yes | Yes | Yes | Textual-based progress view |
|
|
46
|
+
| Interview (Socratic seed creation) | Yes | Yes | Yes | `ouroboros init start ...` with the appropriate LLM backend |
|
|
47
|
+
| Dry-run validation | Yes | Yes | Yes | `--dry-run` validates without executing |
|
|
48
48
|
|
|
49
49
|
### Runtime Layer (differs by backend)
|
|
50
50
|
|
|
51
51
|
These capabilities depend on the runtime backend's native features and execution model.
|
|
52
52
|
|
|
53
|
-
| Capability | Claude Code | Codex CLI | Notes |
|
|
54
|
-
|
|
55
|
-
| **Authentication** | Max Plan subscription | OpenAI API key | No API key needed for Claude Code |
|
|
56
|
-
| **Underlying model** | Claude (Anthropic) | GPT-5.4+ (OpenAI) | Model choice follows the runtime |
|
|
57
|
-
| **Tool surface** | Read, Write, Edit, Bash, Glob, Grep | Codex-native tool set | Different tool implementations; same task outcomes |
|
|
58
|
-
| **Sandbox / permissions** | Claude Code permission system | Codex sandbox model | Each runtime manages its own safety boundaries |
|
|
59
|
-
| **Cost model** | Included in Max Plan | Per-token API charges | See [OpenAI pricing](https://openai.com/pricing) for Codex costs |
|
|
53
|
+
| Capability | Claude Code | Codex CLI | OpenCode | Notes |
|
|
54
|
+
|------------|:-----------:|:---------:|:--------:|-------|
|
|
55
|
+
| **Authentication** | Max Plan subscription | OpenAI API key | Provider API keys (configured in OpenCode) | No API key needed for Claude Code |
|
|
56
|
+
| **Underlying model** | Claude (Anthropic) | GPT-5.4+ (OpenAI) | Provider-dependent (OpenCode supports multiple providers) | Model choice follows the runtime |
|
|
57
|
+
| **Tool surface** | Read, Write, Edit, Bash, Glob, Grep | Codex-native tool set | Read, Write, Edit, Bash, Glob, Grep | Different tool implementations; same task outcomes |
|
|
58
|
+
| **Sandbox / permissions** | Claude Code permission system | Codex sandbox model | OpenCode permission system | Each runtime manages its own safety boundaries |
|
|
59
|
+
| **Cost model** | Included in Max Plan | Per-token API charges | Depends on configured provider | See [OpenAI pricing](https://openai.com/pricing) for Codex costs |
|
|
60
60
|
|
|
61
61
|
### Integration Surface (UX differences)
|
|
62
62
|
|
|
63
|
-
| Aspect | Claude Code | Codex CLI |
|
|
64
|
-
|
|
65
|
-
| **Primary UX** | In-session skills and MCP server | Session-oriented Ouroboros runtime over Codex CLI transport |
|
|
66
|
-
| **Skill shortcuts (`ooo`)** | Yes -- skills loaded into Claude Code session | Yes -- after `ouroboros setup --runtime codex` installs managed skills into `~/.codex/skills/`, rules into `~/.codex/rules/`, and the MCP/env hookup into `~/.codex/config.toml`. Keep role-specific Ouroboros model overrides in `~/.ouroboros/config.yaml` |
|
|
67
|
-
| **MCP integration** | Native MCP server support | Deterministic skill/MCP dispatch through the Ouroboros Codex adapter |
|
|
68
|
-
| **Session context** | Shares Claude Code session context | Preserved via runtime handles, native session IDs, and resume support |
|
|
69
|
-
| **Install extras** | `ouroboros-ai[claude]` | `ouroboros-ai` (base package) + `codex` on PATH |
|
|
63
|
+
| Aspect | Claude Code | Codex CLI | OpenCode |
|
|
64
|
+
|--------|-------------|-----------|----------|
|
|
65
|
+
| **Primary UX** | In-session skills and MCP server | Session-oriented Ouroboros runtime over Codex CLI transport | MCP server integration |
|
|
66
|
+
| **Skill shortcuts (`ooo`)** | Yes -- skills loaded into Claude Code session | Yes -- after `ouroboros setup --runtime codex` installs managed skills into `~/.codex/skills/`, rules into `~/.codex/rules/`, and the MCP/env hookup into `~/.codex/config.toml`. Keep role-specific Ouroboros model overrides in `~/.ouroboros/config.yaml` | Yes -- after `ouroboros setup --runtime opencode` |
|
|
67
|
+
| **MCP integration** | Native MCP server support | Deterministic skill/MCP dispatch through the Ouroboros Codex adapter | Native MCP server support |
|
|
68
|
+
| **Session context** | Shares Claude Code session context | Preserved via runtime handles, native session IDs, and resume support | Session IDs + resume via `--session` |
|
|
69
|
+
| **Install extras** | `ouroboros-ai[claude]` | `ouroboros-ai` (base package) + `codex` on PATH | `ouroboros-ai` (base package) + `opencode` on PATH |
|
|
70
70
|
|
|
71
71
|
## What Stays the Same
|
|
72
72
|
|
|
@@ -97,15 +97,18 @@ The table below covers the two currently shipped backends. Because Ouroboros use
|
|
|
97
97
|
|-----------|----------|
|
|
98
98
|
| Have a Claude Code Max Plan and want zero API key setup | Claude Code (`runtime_backend: claude`) |
|
|
99
99
|
| Want a Codex-backed Ouroboros session instead of a Claude Code session | Codex CLI (`runtime_backend: codex`) |
|
|
100
|
+
| Want to use OpenCode with multiple model providers | OpenCode (`runtime_backend: opencode`) |
|
|
100
101
|
| Want to use Anthropic's Claude models | Claude Code |
|
|
101
102
|
| Want to use OpenAI's GPT models | Codex CLI |
|
|
102
|
-
|
|
|
103
|
-
|
|
|
103
|
+
| Want to use multiple providers via a single runtime | OpenCode |
|
|
104
|
+
| Need MCP server integration | Claude Code or OpenCode |
|
|
105
|
+
| Want minimal Python dependencies | Codex CLI or OpenCode (base package only) |
|
|
104
106
|
| Want to integrate a custom or third-party AI coding agent | Implement the `AgentRuntime` protocol and register it in `runtime_factory.py` |
|
|
105
107
|
|
|
106
108
|
## Further Reading
|
|
107
109
|
|
|
108
110
|
- [Claude Code runtime guide](runtime-guides/claude-code.md)
|
|
109
111
|
- [Codex CLI runtime guide](runtime-guides/codex.md)
|
|
112
|
+
- [OpenCode runtime guide](runtime-guides/opencode.md)
|
|
110
113
|
- [Platform support matrix](platform-support.md) (OS and Python version compatibility)
|
|
111
114
|
- [Architecture overview](architecture.md) — including [How to add a new runtime adapter](architecture.md#how-to-add-a-new-runtime-adapter)
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
doc_metadata:
|
|
3
|
+
runtime_scope: [opencode]
|
|
4
|
+
-->
|
|
5
|
+
|
|
6
|
+
# Running Ouroboros with OpenCode
|
|
7
|
+
|
|
8
|
+
> For installation and first-run onboarding, see [Getting Started](../getting-started.md).
|
|
9
|
+
|
|
10
|
+
Ouroboros can use **OpenCode** as a runtime backend. [OpenCode](https://opencode.ai) is an open-source AI coding agent that supports multiple model providers (Anthropic, OpenAI, Google, and others). In Ouroboros, the OpenCode backend is presented as a **session-oriented runtime** with the same specification-first workflow harness (acceptance criteria, evaluation principles, deterministic exit conditions).
|
|
11
|
+
|
|
12
|
+
No additional Python SDK is required beyond the base `ouroboros-ai` package.
|
|
13
|
+
|
|
14
|
+
## Prerequisites
|
|
15
|
+
|
|
16
|
+
- **OpenCode** installed and on your `PATH` (see [install steps](#installing-opencode) below)
|
|
17
|
+
- An **API key** for your configured provider (e.g., `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`)
|
|
18
|
+
- **Python >= 3.12**
|
|
19
|
+
|
|
20
|
+
## Installing OpenCode
|
|
21
|
+
|
|
22
|
+
OpenCode is distributed as a standalone binary. Install via the official script:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
curl -fsSL https://opencode.ai/install | bash
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Verify the installation:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
opencode --version
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
For alternative install methods, see the [OpenCode documentation](https://opencode.ai/docs).
|
|
35
|
+
|
|
36
|
+
## Configuration
|
|
37
|
+
|
|
38
|
+
To select OpenCode as the runtime backend, set the following in your Ouroboros configuration:
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
orchestrator:
|
|
42
|
+
runtime_backend: opencode
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Or pass the backend on the command line:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
uv run ouroboros run workflow --runtime opencode ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Setup
|
|
52
|
+
|
|
53
|
+
Run the setup command to auto-configure:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
ouroboros setup --runtime opencode
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
This:
|
|
60
|
+
|
|
61
|
+
- Detects the `opencode` binary on your `PATH`
|
|
62
|
+
- Writes `orchestrator.runtime_backend: opencode` to `~/.ouroboros/config.yaml`
|
|
63
|
+
- Registers the Ouroboros MCP server in OpenCode's configuration
|
|
64
|
+
|
|
65
|
+
## How It Works
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
+-----------------+ +------------------+ +-----------------+
|
|
69
|
+
| Seed YAML | --> | Orchestrator | --> | OpenCode |
|
|
70
|
+
| (your task) | | (runtime_factory)| | (runtime) |
|
|
71
|
+
+-----------------+ +------------------+ +-----------------+
|
|
72
|
+
|
|
|
73
|
+
v
|
|
74
|
+
+------------------+
|
|
75
|
+
| Tools Available |
|
|
76
|
+
| - Read |
|
|
77
|
+
| - Write |
|
|
78
|
+
| - Edit |
|
|
79
|
+
| - Bash |
|
|
80
|
+
| - Glob |
|
|
81
|
+
| - Grep |
|
|
82
|
+
+------------------+
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The `OpenCodeRuntime` adapter launches `opencode run --format json` as a subprocess for each task execution. The orchestrator pipes the prompt via stdin and parses the structured JSON event stream from stdout.
|
|
86
|
+
|
|
87
|
+
> For a side-by-side comparison of all runtime backends, see the [runtime capability matrix](../runtime-capability-matrix.md).
|
|
88
|
+
|
|
89
|
+
## OpenCode-Specific Strengths
|
|
90
|
+
|
|
91
|
+
- **Multi-provider support** -- use Anthropic, OpenAI, Google, or other providers through a single runtime
|
|
92
|
+
- **Rich tool access** -- full suite of file, shell, and search tools (same surface as Claude Code)
|
|
93
|
+
- **Native MCP integration** -- OpenCode has built-in MCP server support
|
|
94
|
+
- **Open-source** -- fully open-source, allowing inspection and contribution
|
|
95
|
+
|
|
96
|
+
## CLI Options
|
|
97
|
+
|
|
98
|
+
### Workflow Commands
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Execute workflow (OpenCode runtime)
|
|
102
|
+
uv run ouroboros run workflow --runtime opencode ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
|
|
103
|
+
|
|
104
|
+
# Debug output (show logs and agent output)
|
|
105
|
+
uv run ouroboros run workflow --runtime opencode --debug ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
|
|
106
|
+
|
|
107
|
+
# Resume a previous session
|
|
108
|
+
uv run ouroboros run workflow --runtime opencode --resume <session_id> ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Known Limitations
|
|
112
|
+
|
|
113
|
+
### Session pollution
|
|
114
|
+
|
|
115
|
+
Each task execution via `opencode run` creates a visible session in OpenCode's session history. Long-running workflows with many orchestrator steps will accumulate sessions. A future phase will reparent these sessions under the caller to prevent polluting the session picker (see GitHub #164 Phase 2).
|
|
116
|
+
|
|
117
|
+
### No interactive mode
|
|
118
|
+
|
|
119
|
+
The adapter uses `opencode run --format json` (non-interactive). Features that require interactive OpenCode sessions (e.g., manual approval prompts) are not available during Ouroboros execution.
|
|
120
|
+
|
|
121
|
+
## Troubleshooting
|
|
122
|
+
|
|
123
|
+
### OpenCode not found
|
|
124
|
+
|
|
125
|
+
Ensure `opencode` is installed and available on your `PATH`:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
which opencode
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
If not installed:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
curl -fsSL https://opencode.ai/install | bash
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### API key errors
|
|
138
|
+
|
|
139
|
+
Verify your provider API key is set:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# For Anthropic
|
|
143
|
+
echo $ANTHROPIC_API_KEY
|
|
144
|
+
|
|
145
|
+
# For OpenAI
|
|
146
|
+
echo $OPENAI_API_KEY
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### "Providers: warning" in health check
|
|
150
|
+
|
|
151
|
+
This is normal when using the orchestrator runtime backends. The warning refers to LiteLLM providers, which are not used in orchestrator mode.
|
|
152
|
+
|
|
153
|
+
### "EventStore not initialized"
|
|
154
|
+
|
|
155
|
+
The database will be created automatically at `~/.ouroboros/ouroboros.db`.
|
|
156
|
+
|
|
157
|
+
## Cost
|
|
158
|
+
|
|
159
|
+
Using OpenCode as the runtime backend incurs API charges from your configured provider. Costs depend on:
|
|
160
|
+
|
|
161
|
+
- Provider and model selected in OpenCode configuration
|
|
162
|
+
- Task complexity and token usage
|
|
163
|
+
- Number of tool calls and iterations
|
|
164
|
+
|
|
165
|
+
Refer to your provider's pricing page for current rates.
|
|
@@ -246,7 +246,7 @@ A backup will be created: CLAUDE.md.bak
|
|
|
246
246
|
**If "Preview first", show:**
|
|
247
247
|
````markdown
|
|
248
248
|
<!-- ooo:START -->
|
|
249
|
-
<!-- ooo:VERSION:0.27.
|
|
249
|
+
<!-- ooo:VERSION:0.27.2 -->
|
|
250
250
|
# Ouroboros — Specification-First AI Development
|
|
251
251
|
|
|
252
252
|
> Before telling AI what to build, define what should be built.
|
|
@@ -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.27.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 27,
|
|
21
|
+
__version__ = version = '0.27.3.dev1'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 27, 3, 'dev1')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -50,6 +50,7 @@ class AgentRuntimeBackend(str, Enum): # noqa: UP042
|
|
|
50
50
|
|
|
51
51
|
CLAUDE = "claude"
|
|
52
52
|
CODEX = "codex"
|
|
53
|
+
OPENCODE = "opencode"
|
|
53
54
|
|
|
54
55
|
|
|
55
56
|
class LLMBackend(str, Enum): # noqa: UP042
|
|
@@ -58,6 +59,7 @@ class LLMBackend(str, Enum): # noqa: UP042
|
|
|
58
59
|
CLAUDE_CODE = "claude_code"
|
|
59
60
|
LITELLM = "litellm"
|
|
60
61
|
CODEX = "codex"
|
|
62
|
+
OPENCODE = "opencode"
|
|
61
63
|
|
|
62
64
|
|
|
63
65
|
class _DefaultStartGroup(typer.core.TyperGroup):
|
|
@@ -669,7 +671,7 @@ def start(
|
|
|
669
671
|
"--runtime",
|
|
670
672
|
help=(
|
|
671
673
|
"Agent runtime backend for the workflow execution step after seed generation "
|
|
672
|
-
"(claude or
|
|
674
|
+
"(claude, codex, or opencode)."
|
|
673
675
|
),
|
|
674
676
|
case_sensitive=False,
|
|
675
677
|
),
|
|
@@ -680,7 +682,7 @@ def start(
|
|
|
680
682
|
"--llm-backend",
|
|
681
683
|
help=(
|
|
682
684
|
"LLM backend for interview, ambiguity scoring, and seed generation "
|
|
683
|
-
"(claude_code, litellm, or
|
|
685
|
+
"(claude_code, litellm, codex, or opencode)."
|
|
684
686
|
),
|
|
685
687
|
case_sensitive=False,
|
|
686
688
|
),
|
|
@@ -29,6 +29,7 @@ class AgentRuntimeBackend(str, Enum): # noqa: UP042
|
|
|
29
29
|
|
|
30
30
|
CLAUDE = "claude"
|
|
31
31
|
CODEX = "codex"
|
|
32
|
+
OPENCODE = "opencode"
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
class LLMBackend(str, Enum): # noqa: UP042
|
|
@@ -37,6 +38,7 @@ class LLMBackend(str, Enum): # noqa: UP042
|
|
|
37
38
|
CLAUDE_CODE = "claude_code"
|
|
38
39
|
LITELLM = "litellm"
|
|
39
40
|
CODEX = "codex"
|
|
41
|
+
OPENCODE = "opencode"
|
|
40
42
|
|
|
41
43
|
|
|
42
44
|
def _write_pid_file() -> bool:
|
|
@@ -262,7 +264,7 @@ def serve(
|
|
|
262
264
|
AgentRuntimeBackend | None,
|
|
263
265
|
typer.Option(
|
|
264
266
|
"--runtime",
|
|
265
|
-
help="Agent runtime backend for orchestrator-driven tools (claude or
|
|
267
|
+
help="Agent runtime backend for orchestrator-driven tools (claude, codex, or opencode).",
|
|
266
268
|
case_sensitive=False,
|
|
267
269
|
),
|
|
268
270
|
] = None,
|
|
@@ -271,7 +273,7 @@ def serve(
|
|
|
271
273
|
typer.Option(
|
|
272
274
|
"--llm-backend",
|
|
273
275
|
help=(
|
|
274
|
-
"LLM backend for interview/seed/evaluation tools (claude_code, litellm, or
|
|
276
|
+
"LLM backend for interview/seed/evaluation tools (claude_code, litellm, codex, or opencode)."
|
|
275
277
|
),
|
|
276
278
|
case_sensitive=False,
|
|
277
279
|
),
|
|
@@ -296,8 +298,8 @@ def serve(
|
|
|
296
298
|
# Start with SSE transport on custom port
|
|
297
299
|
ouroboros mcp serve --transport sse --port 9000
|
|
298
300
|
|
|
299
|
-
# Start with
|
|
300
|
-
ouroboros mcp serve --runtime
|
|
301
|
+
# Start with OpenCode runtime
|
|
302
|
+
ouroboros mcp serve --runtime opencode
|
|
301
303
|
|
|
302
304
|
# Use Codex CLI for LLM-only tools as well
|
|
303
305
|
ouroboros mcp serve --runtime codex --llm-backend codex
|
|
@@ -349,7 +351,7 @@ def info(
|
|
|
349
351
|
AgentRuntimeBackend | None,
|
|
350
352
|
typer.Option(
|
|
351
353
|
"--runtime",
|
|
352
|
-
help="Agent runtime backend for orchestrator-driven tools (claude or
|
|
354
|
+
help="Agent runtime backend for orchestrator-driven tools (claude, codex, or opencode).",
|
|
353
355
|
case_sensitive=False,
|
|
354
356
|
),
|
|
355
357
|
] = None,
|
|
@@ -358,7 +360,7 @@ def info(
|
|
|
358
360
|
typer.Option(
|
|
359
361
|
"--llm-backend",
|
|
360
362
|
help=(
|
|
361
|
-
"LLM backend for interview/seed/evaluation tools (claude_code, litellm, or
|
|
363
|
+
"LLM backend for interview/seed/evaluation tools (claude_code, litellm, codex, or opencode)."
|
|
362
364
|
),
|
|
363
365
|
case_sensitive=False,
|
|
364
366
|
),
|
|
@@ -59,6 +59,7 @@ class AgentRuntimeBackend(str, Enum): # noqa: UP042
|
|
|
59
59
|
|
|
60
60
|
CLAUDE = "claude"
|
|
61
61
|
CODEX = "codex"
|
|
62
|
+
OPENCODE = "opencode"
|
|
62
63
|
|
|
63
64
|
|
|
64
65
|
def _derive_quality_bar(seed: "Seed") -> str:
|
|
@@ -418,7 +419,7 @@ def workflow(
|
|
|
418
419
|
AgentRuntimeBackend | None,
|
|
419
420
|
typer.Option(
|
|
420
421
|
"--runtime",
|
|
421
|
-
help="Agent runtime backend for orchestrator mode (claude or
|
|
422
|
+
help="Agent runtime backend for orchestrator mode (claude, codex, or opencode).",
|
|
422
423
|
case_sensitive=False,
|
|
423
424
|
),
|
|
424
425
|
] = None,
|