ouroboros-ai 0.28.1.dev2__tar.gz → 0.28.1.dev4__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.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/CONTRIBUTING.md +3 -3
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/PKG-INFO +3 -3
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/README.md +2 -2
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/config-reference.md +18 -1
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/findings-registry.md +3 -2
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/getting-started.md +3 -3
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/runtime-capability-matrix.md +1 -1
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/runtime-guides/codex.md +2 -2
- ouroboros_ai-0.28.1.dev4/docs/runtime-guides/opencode.md +284 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/_version.py +2 -2
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/mcp.py +60 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/server/adapter.py +3 -1
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/channel_workflow_handler.py +2 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/definitions.py +2 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/openclaw/store.py +1 -1
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/test_server_adapter.py +1 -1
- ouroboros_ai-0.28.1.dev2/docs/runtime-guides/opencode.md +0 -165
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.claude/settings.json +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.claude-plugin/.mcp.json +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.claude-plugin/marketplace.json +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.claude-plugin/plugin.json +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.env.example +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.gitignore +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.mcp.json +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.ouroboros/mechanical.toml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/.python-version +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/CLAUDE.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/CODE_OF_CONDUCT.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/HANDOFF.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/LICENSE +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/README.ko.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/SECURITY.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/UNINSTALL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/cancel.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/evolve.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/help.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/interview.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/ralph.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/run.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/seed.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/setup.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/status.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/commands/welcome.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/README.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/api/README.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/api/core.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/architecture.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/assets/openclaw-ooo.png +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/cli-reference.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/issue-quality-policy.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/openclaw-current-baseline.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/evaluation-pipeline.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/evolution-loop.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/mcp-bridge.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/openclaw-channel-workflow.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/seed-authoring.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/images/PLACEHOLDER_README.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/platform-support.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/runtime-guides/claude-code.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/examples/test_display.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/llms-full.txt +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/llms.txt +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/project-context.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/pyproject.toml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/install.sh +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/keyword-detector.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/mcp-serve.sh +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/sync-plugin-version.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/brownfield/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/help/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/openclaw/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/pm/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/publish/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/setup/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/update/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/breadth-keeper.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/seed-closer.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/ambiguity.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/brownfield.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/pm_completion.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/pm_document.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/pm_interview.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/pm_seed.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/question_classifier.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/init.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/pm.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/run.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/setup.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/commands/uninstall.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/prompting.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/jsonc.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/cli/main.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/codex/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/codex/artifacts.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/codex/ouroboros.md +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/codex_permissions.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/initial_context.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/json_utils.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/project_paths.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/retry.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/ttl_cache.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/core/worktree.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/loop.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/bridge/bridge.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/bridge/config.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/bridge/factory.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/openclaw/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/openclaw/responses.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/openclaw/runtime.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/openclaw/workflow.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/capabilities.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/control_plane.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/heartbeat.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/policy.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/runner.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/session.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/brownfield.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/event_store.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/pm/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/pm/handoff.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/pm/renderer.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/codex_cli_stream.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/factory.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/providers/opencode_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/screens/session_selector.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/conftest.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/test_cli_commands.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/conftest.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/test_codex_skill_fallback.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/test_codex_skill_smoke.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_ambiguity.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_brownfield.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_classifier_context.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_decide_later_items.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_interview_async_io.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_completion.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_interview.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_question_classifier.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/commands/test_tui_command.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_prompting.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_config.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_init_runtime.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_jsonc.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_main.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_brownfield.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_completion.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_overwrite.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_pm_select_repos.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_run_qa.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_setup.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/cli/test_uninstall.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/config/test_loader_env.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_context.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_file_lock.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_initial_context.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_lineage.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_retry.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_ttl_cache.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/core/test_worktree.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_json_utils.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_review_fixes.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/evolution/test_wonder_scope.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/test_bridge.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/test_config.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/test_factory.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/bridge/test_stability.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/conftest.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_channel_workflow_handler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_evaluation_handler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_interview_parallel_scoring.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_interview_scoring_guard.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_pm_handler_generate.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_qa_integration.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/mcp/tools/test_traceback_reporting.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/openclaw/test_workflow.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_capabilities.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_control_plane.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_policy.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_runner.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_session.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/test_brownfield_store.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/test_event_store.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/skills/test_keywords.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/pm/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/pm/test_renderer.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_factory.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_litellm_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/providers/test_opencode_adapter.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/scripts/test_session_start.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_artifact_collector.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_codex_artifacts.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_dependencies_configured.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_graceful_shutdown.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_session_selector_replay.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tools/sync_github_project.py +0 -0
- {ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/uv.lock +0 -0
|
@@ -551,7 +551,7 @@ Changes under `src/ouroboros/orchestrator/` affect runtime behavior documentatio
|
|
|
551
551
|
| `runtime_factory.py` | `docs/runtime-capability-matrix.md`, `docs/runtime-guides/claude-code.md`, `docs/runtime-guides/codex.md` — if a backend is added, removed, or changes its `NotImplementedError` status |
|
|
552
552
|
| `adapter.py` (`ClaudeAgentAdapter`) | `docs/runtime-guides/claude-code.md` — permission modes, session flow |
|
|
553
553
|
| `codex_cli_runtime.py` (`CodexCliRuntime`) | `docs/runtime-guides/codex.md` — permission modes, `--runtime codex` behavior |
|
|
554
|
-
| `opencode_runtime.py` (`OpenCodeRuntime`) | `docs/runtime-capability-matrix.md
|
|
554
|
+
| `opencode_runtime.py` (`OpenCodeRuntime`) | `docs/runtime-capability-matrix.md`, `docs/runtime-guides/opencode.md` — permission modes, `--runtime opencode` behavior |
|
|
555
555
|
| `runner.py` (`OrchestratorRunner`) | `docs/architecture.md` — orchestration lifecycle; `docs/getting-started.md` — session ID output, resume flow |
|
|
556
556
|
| `parallel_executor.py` | `docs/cli-reference.md` — `--sequential` flag behavior; `docs/architecture.md` — parallel execution strategy |
|
|
557
557
|
| `coordinator.py` (`LevelCoordinator`) | `docs/architecture.md` — inter-level conflict resolution and coordinator review gate |
|
|
@@ -563,7 +563,7 @@ Changes under `src/ouroboros/orchestrator/` affect runtime behavior documentatio
|
|
|
563
563
|
| `command_dispatcher.py` | `docs/architecture.md` — command dispatch model |
|
|
564
564
|
| `level_context.py` | `docs/architecture.md` — level context description |
|
|
565
565
|
|
|
566
|
-
**Runtime availability rule**: If `create_agent_runtime()` raises `NotImplementedError` for a backend, that backend **must not** appear in docs as a working option.
|
|
566
|
+
**Runtime availability rule**: If `create_agent_runtime()` raises `NotImplementedError` for a backend, that backend **must not** appear in docs as a working option. All three backends (`claude`, `codex`, `opencode`) are fully implemented and documented.
|
|
567
567
|
|
|
568
568
|
---
|
|
569
569
|
|
|
@@ -703,7 +703,7 @@ To catch doc drift during development, reviewers should check:
|
|
|
703
703
|
|
|
704
704
|
1. **Flag parity**: Run `ouroboros <cmd> --help` and compare every flag to `docs/cli-reference.md`. Any mismatch is a documentation bug.
|
|
705
705
|
2. **Placeholder honesty**: If a command's implementation body is `# Placeholder implementation`, the corresponding doc entry must say `[Placeholder — not yet implemented]`.
|
|
706
|
-
3. **Runtime parity**: `claude` and `
|
|
706
|
+
3. **Runtime parity**: `claude`, `codex`, and `opencode` are all fully-implemented backends. Any doc that lists a backend as available must have a corresponding runtime guide in `docs/runtime-guides/`.
|
|
707
707
|
4. **Config key drift**: After any change to `src/ouroboros/config/models.py`, grep for the changed key name across `docs/` to find stale references.
|
|
708
708
|
5. **TUI key bindings**: If `screens/*.py` `BINDINGS` arrays change, verify `docs/guides/tui-usage.md` reflects the new keys.
|
|
709
709
|
6. **Skills registry drift**: If a new `skills/*.yaml` file is added, check that `docs/runtime-guides/codex.md` or the relevant guide mentions it.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ouroboros-ai
|
|
3
|
-
Version: 0.28.1.
|
|
3
|
+
Version: 0.28.1.dev4
|
|
4
4
|
Summary: Specification-first workflow engine for AI coding agents. Works with Claude Code and Codex CLI.
|
|
5
5
|
Author-email: Q00 <jqyu.lee@gmail.com>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -119,7 +119,7 @@ curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.
|
|
|
119
119
|
> ooo interview "I want to build a task management CLI"
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
-
> Works with Claude Code
|
|
122
|
+
> Works with Claude Code, Codex CLI, and OpenCode. The installer detects Claude Code and Codex CLI automatically and registers the MCP server. For OpenCode, run `ouroboros setup --runtime opencode` after installation.
|
|
123
123
|
|
|
124
124
|
<details>
|
|
125
125
|
<summary><strong>Other install methods</strong></summary>
|
|
@@ -143,7 +143,7 @@ ouroboros setup # configure runtime
|
|
|
143
143
|
|
|
144
144
|
Legacy compatibility: `ouroboros-ai[dashboard]` is still accepted as a compatibility alias while extras migrate.
|
|
145
145
|
|
|
146
|
-
See runtime guides: [Claude Code](./docs/runtime-guides/claude-code.md) · [Codex CLI](./docs/runtime-guides/codex.md)
|
|
146
|
+
See runtime guides: [Claude Code](./docs/runtime-guides/claude-code.md) · [Codex CLI](./docs/runtime-guides/codex.md) · [OpenCode](./docs/runtime-guides/opencode.md)
|
|
147
147
|
|
|
148
148
|
Chat platform integration (OpenClaw / Slack / Discord):
|
|
149
149
|
```bash
|
|
@@ -80,7 +80,7 @@ curl -fsSL https://raw.githubusercontent.com/Q00/ouroboros/main/scripts/install.
|
|
|
80
80
|
> ooo interview "I want to build a task management CLI"
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
-
> Works with Claude Code
|
|
83
|
+
> Works with Claude Code, Codex CLI, and OpenCode. The installer detects Claude Code and Codex CLI automatically and registers the MCP server. For OpenCode, run `ouroboros setup --runtime opencode` after installation.
|
|
84
84
|
|
|
85
85
|
<details>
|
|
86
86
|
<summary><strong>Other install methods</strong></summary>
|
|
@@ -104,7 +104,7 @@ ouroboros setup # configure runtime
|
|
|
104
104
|
|
|
105
105
|
Legacy compatibility: `ouroboros-ai[dashboard]` is still accepted as a compatibility alias while extras migrate.
|
|
106
106
|
|
|
107
|
-
See runtime guides: [Claude Code](./docs/runtime-guides/claude-code.md) · [Codex CLI](./docs/runtime-guides/codex.md)
|
|
107
|
+
See runtime guides: [Claude Code](./docs/runtime-guides/claude-code.md) · [Codex CLI](./docs/runtime-guides/codex.md) · [OpenCode](./docs/runtime-guides/opencode.md)
|
|
108
108
|
|
|
109
109
|
Chat platform integration (OpenClaw / Slack / Discord):
|
|
110
110
|
```bash
|
|
@@ -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
|
# Configuration Reference
|
|
@@ -537,6 +537,23 @@ consensus:
|
|
|
537
537
|
|
|
538
538
|
This is the recommended Ouroboros-side pattern for Codex users. Keep `~/.codex/config.toml` limited to the MCP/env block created by setup.
|
|
539
539
|
|
|
540
|
+
### OpenCode Runtime
|
|
541
|
+
|
|
542
|
+
```yaml
|
|
543
|
+
# ~/.ouroboros/config.yaml
|
|
544
|
+
orchestrator:
|
|
545
|
+
runtime_backend: opencode
|
|
546
|
+
opencode_cli_path: /usr/local/bin/opencode # omit if opencode is already on PATH
|
|
547
|
+
|
|
548
|
+
llm:
|
|
549
|
+
backend: opencode
|
|
550
|
+
|
|
551
|
+
logging:
|
|
552
|
+
level: info
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
OpenCode supports multiple model providers (Anthropic, OpenAI, Google, and others). Model selection is configured in OpenCode itself (`~/.config/opencode/opencode.json`), not in `config.yaml`. The `orchestrator.opencode_permission_mode` defaults to `bypassPermissions` since OpenCode runs non-interactively via `opencode run --format json`. The `llm.opencode_permission_mode` defaults to `acceptEdits`, but the factory forces `bypassPermissions` for interview/seed use cases to avoid CLI sandbox blocking.
|
|
556
|
+
|
|
540
557
|
### Full Config Skeleton
|
|
541
558
|
|
|
542
559
|
```yaml
|
{ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/docs/contributing/findings-registry.md
RENAMED
|
@@ -630,7 +630,7 @@ findings:
|
|
|
630
630
|
- docs/guides/cli-usage.md
|
|
631
631
|
code_deps:
|
|
632
632
|
- src/ouroboros/cli/commands/setup.py
|
|
633
|
-
resolution_ref: "cli-audit-findings.md#F-12; fixed in this generation"
|
|
633
|
+
resolution_ref: "cli-audit-findings.md#F-12; fixed in this generation. OpenCode runtime fully implemented in PR #324."
|
|
634
634
|
|
|
635
635
|
- id: FIND-025
|
|
636
636
|
claim_id: CLM-025
|
|
@@ -870,7 +870,8 @@ findings:
|
|
|
870
870
|
resolution_ref: >-
|
|
871
871
|
runtime-capability-crosscheck.md#Sec2;
|
|
872
872
|
fix: "(opencode is in the CLI enum but out of scope)" note added to all
|
|
873
|
-
--runtime/--llm-backend option descriptions in cli-reference.md
|
|
873
|
+
--runtime/--llm-backend option descriptions in cli-reference.md.
|
|
874
|
+
OpenCode runtime fully implemented in PR #324 — out-of-scope notes no longer apply.
|
|
874
875
|
|
|
875
876
|
- id: FIND-040
|
|
876
877
|
claim_id: CLM-040
|
|
@@ -115,7 +115,7 @@ uv run ouroboros --version # verify CLI
|
|
|
115
115
|
| Claude Code (`ooo`) | Claude Code with plugin support |
|
|
116
116
|
| Standalone CLI (`ouroboros`) | Python >= 3.12, API key (Anthropic or OpenAI) |
|
|
117
117
|
| Codex CLI backend | Python >= 3.12, `npm install -g @openai/codex`, OpenAI API key with access to GPT-5.4 |
|
|
118
|
-
| OpenCode backend | Python >= 3.12, `opencode` on PATH,
|
|
118
|
+
| OpenCode backend | Python >= 3.12, `opencode` on PATH, provider configured in OpenCode |
|
|
119
119
|
|
|
120
120
|
---
|
|
121
121
|
|
|
@@ -198,7 +198,7 @@ Inside a Claude Code session:
|
|
|
198
198
|
ooo interview "I want to build a personal finance tracker"
|
|
199
199
|
```
|
|
200
200
|
|
|
201
|
-
> **CLI note:**
|
|
201
|
+
> **CLI note:** You can also run interviews from the terminal with `ouroboros init start --llm-backend <backend> "your idea"` (where `<backend>` is `claude_code`, `codex`, `opencode`, or `litellm`). For in-agent `ooo interview` usage: Claude Code works out-of-the-box; Codex CLI and OpenCode require `ouroboros setup --runtime <codex|opencode>` first to register the MCP server.
|
|
202
202
|
|
|
203
203
|
The Socratic Interviewer asks clarifying questions:
|
|
204
204
|
- "What platforms do you want to track?" (Bank accounts, credit cards, investments)
|
|
@@ -289,7 +289,7 @@ ooo interview "Add real-time notifications to the chat app"
|
|
|
289
289
|
ooo run
|
|
290
290
|
```
|
|
291
291
|
|
|
292
|
-
> **Terminal users:**
|
|
292
|
+
> **Terminal users:** Run interviews from the terminal with `ouroboros init start --llm-backend <backend> "your idea"`, then execute with `ouroboros run workflow <seed_file>`. (Separate from in-agent `ooo` usage; terminal flows don't require MCP registration.)
|
|
293
293
|
|
|
294
294
|
---
|
|
295
295
|
|
|
@@ -91,7 +91,7 @@ The runtime backend affects:
|
|
|
91
91
|
|
|
92
92
|
## Choosing a Runtime
|
|
93
93
|
|
|
94
|
-
The table below covers the
|
|
94
|
+
The table below covers the three currently shipped backends. Because Ouroboros uses a pluggable `AgentRuntime` protocol, teams can register additional backends without modifying the core engine.
|
|
95
95
|
|
|
96
96
|
| If you... | Consider |
|
|
97
97
|
|-----------|----------|
|
|
@@ -125,11 +125,11 @@ After running `ouroboros setup --runtime codex`, the bundled `ooo` skills are in
|
|
|
125
125
|
| `ooo interview` | Yes | `ouroboros init start --llm-backend codex "your idea"` |
|
|
126
126
|
| `ooo seed` | Yes | *(bundled in `ouroboros init start`)* |
|
|
127
127
|
| `ooo run` | Yes | `ouroboros run workflow --runtime codex seed.yaml` |
|
|
128
|
-
| `ooo status` | Yes | `ouroboros status execution <
|
|
128
|
+
| `ooo status` | Yes | `ouroboros status execution <execution_id>` |
|
|
129
129
|
| `ooo evaluate` | Yes | *(MCP only)* |
|
|
130
130
|
| `ooo evolve` | Yes | *(MCP only)* |
|
|
131
131
|
| `ooo ralph` | Yes | *(MCP only)* |
|
|
132
|
-
| `ooo cancel` | Yes | `ouroboros cancel execution <
|
|
132
|
+
| `ooo cancel` | Yes | `ouroboros cancel execution <execution_id>` |
|
|
133
133
|
| `ooo unstuck` | Yes | *(MCP only)* |
|
|
134
134
|
| `ooo tutorial` | Yes | *(MCP only)* |
|
|
135
135
|
| `ooo welcome` | Yes | *(MCP only)* |
|
|
@@ -0,0 +1,284 @@
|
|
|
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) through its own provider management. 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
|
+
> **Model recommendation:** OpenCode supports any model available through your configured provider. For best results with Ouroboros workflows, use a frontier-class model (Claude Opus, GPT-5.4, or equivalent) that handles multi-step agentic coding tasks well.
|
|
15
|
+
|
|
16
|
+
## Prerequisites
|
|
17
|
+
|
|
18
|
+
- **OpenCode** installed, configured, and on your `PATH` (see [install steps](#installing-opencode) below)
|
|
19
|
+
- A **provider configured in OpenCode** (run `opencode` and complete the first-run setup, or use `opencode providers auth <provider>`)
|
|
20
|
+
- **Python >= 3.12**
|
|
21
|
+
|
|
22
|
+
> **Note:** OpenCode manages its own provider authentication. You do not need to set `ANTHROPIC_API_KEY` or `OPENAI_API_KEY` environment variables for Ouroboros — OpenCode handles provider credentials internally via its own configuration at `~/.config/opencode/opencode.json`.
|
|
23
|
+
|
|
24
|
+
## Installing OpenCode
|
|
25
|
+
|
|
26
|
+
OpenCode is distributed as a standalone binary. Install via the official installer script or npm:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Recommended: official installer
|
|
30
|
+
curl -fsSL https://opencode.ai/install | bash
|
|
31
|
+
|
|
32
|
+
# Alternative: npm
|
|
33
|
+
npm i -g opencode-ai@latest
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Verify the installation:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
opencode --version
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
After install, run `opencode` once to complete first-run provider setup (select a provider and authenticate).
|
|
43
|
+
|
|
44
|
+
For alternative install methods, see the [OpenCode documentation](https://opencode.ai/docs).
|
|
45
|
+
|
|
46
|
+
## Installing Ouroboros
|
|
47
|
+
|
|
48
|
+
> For all installation options (pip, one-liner, from source) and first-run onboarding, see **[Getting Started](../getting-started.md)**.
|
|
49
|
+
> The base `ouroboros-ai` package includes the OpenCode runtime adapter — no extras are required.
|
|
50
|
+
|
|
51
|
+
## Platform Notes
|
|
52
|
+
|
|
53
|
+
The OpenCode runtime adapter has been developed and tested on Linux. Other platforms may work but have not been verified with the Ouroboros integration.
|
|
54
|
+
|
|
55
|
+
| Platform | Status | Notes |
|
|
56
|
+
|----------|--------|-------|
|
|
57
|
+
| Linux (x86_64/ARM64) | Tested | Primary development and testing platform |
|
|
58
|
+
| macOS (ARM/Intel) | Untested | Expected to work — OpenCode supports macOS natively |
|
|
59
|
+
| Windows (WSL 2) | Untested | Expected to work via WSL 2 — not verified with Ouroboros |
|
|
60
|
+
| Windows (native) | Untested | Not recommended — subprocess and path handling may have issues |
|
|
61
|
+
|
|
62
|
+
> If you test on macOS or Windows and encounter issues, please report them.
|
|
63
|
+
|
|
64
|
+
## Configuration
|
|
65
|
+
|
|
66
|
+
To select OpenCode as the runtime backend, set the following in your Ouroboros configuration:
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
orchestrator:
|
|
70
|
+
runtime_backend: opencode
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Or pass the backend on the command line:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
uv run ouroboros run workflow --runtime opencode ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Where OpenCode users configure what
|
|
80
|
+
|
|
81
|
+
Use `~/.ouroboros/config.yaml` for Ouroboros runtime settings (backend selection, permission mode, CLI path).
|
|
82
|
+
|
|
83
|
+
Use `~/.config/opencode/opencode.json` (OpenCode's own config) for provider/model selection, MCP servers, and tool permissions. `ouroboros setup --runtime opencode` writes the Ouroboros MCP server entry into this file automatically.
|
|
84
|
+
|
|
85
|
+
```yaml
|
|
86
|
+
# ~/.ouroboros/config.yaml
|
|
87
|
+
orchestrator:
|
|
88
|
+
runtime_backend: opencode
|
|
89
|
+
opencode_cli_path: /usr/local/bin/opencode # omit if opencode is already on PATH
|
|
90
|
+
|
|
91
|
+
llm:
|
|
92
|
+
backend: opencode
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Model selection for OpenCode-backed workflows is configured in OpenCode itself, not in `config.yaml`. The `orchestrator.opencode_permission_mode` defaults to `bypassPermissions` since OpenCode runs non-interactively via `opencode run --format json`.
|
|
96
|
+
|
|
97
|
+
### Setup
|
|
98
|
+
|
|
99
|
+
Run the setup command to auto-configure:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
ouroboros setup --runtime opencode
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
This:
|
|
106
|
+
|
|
107
|
+
- Detects the `opencode` binary on your `PATH` and records it as `orchestrator.opencode_cli_path`
|
|
108
|
+
- Writes `orchestrator.runtime_backend: opencode` and `llm.backend: opencode` to `~/.ouroboros/config.yaml`
|
|
109
|
+
- Registers the Ouroboros MCP server in OpenCode's configuration file (`~/.config/opencode/opencode.json`). Note: The setup process rewrites the file as plain JSON and removes comments (the file supports JSONC format initially, but setup normalizes to JSON for compatibility).
|
|
110
|
+
|
|
111
|
+
### `ooo` Skill Availability on OpenCode
|
|
112
|
+
|
|
113
|
+
After running `ouroboros setup --runtime opencode`, the Ouroboros MCP server is registered in OpenCode's config. The `ooo` skills are available via MCP tool dispatch within OpenCode sessions.
|
|
114
|
+
|
|
115
|
+
| `ooo` Skill | OpenCode session | CLI equivalent (Terminal) |
|
|
116
|
+
|-------------|------------------|--------------------------|
|
|
117
|
+
| `ooo interview` | Yes | `ouroboros init start --llm-backend opencode "your idea"` |
|
|
118
|
+
| `ooo seed` | Yes | *(bundled in `ouroboros init start`)* |
|
|
119
|
+
| `ooo run` | Yes | `ouroboros run workflow --runtime opencode seed.yaml` |
|
|
120
|
+
| `ooo status` | Yes | `ouroboros status execution <execution_id>` |
|
|
121
|
+
| `ooo evaluate` | Yes | *(MCP only)* |
|
|
122
|
+
| `ooo evolve` | Yes | *(MCP only)* |
|
|
123
|
+
| `ooo ralph` | Yes | *(MCP only)* |
|
|
124
|
+
| `ooo cancel` | Yes | `ouroboros cancel execution <execution_id>` |
|
|
125
|
+
| `ooo unstuck` | Yes | *(MCP only)* |
|
|
126
|
+
| `ooo tutorial` | Yes | *(MCP only)* |
|
|
127
|
+
| `ooo welcome` | Yes | *(MCP only)* |
|
|
128
|
+
| `ooo update` | Yes | `pip install --upgrade ouroboros-ai` |
|
|
129
|
+
| `ooo help` | Yes | `ouroboros --help` |
|
|
130
|
+
| `ooo qa` | Yes | *(MCP only)* |
|
|
131
|
+
| `ooo setup` | Yes | `ouroboros setup --runtime opencode` |
|
|
132
|
+
| `ooo publish` | Yes | *(no direct `ouroboros publish` subcommand; skill/runtime flow uses `gh` CLI)* |
|
|
133
|
+
|
|
134
|
+
> **Note on `ooo seed` vs `ooo interview`:** These are two distinct skills with separate roles. `ooo interview` runs a Socratic Q&A session and returns a `session_id`. `ooo seed` accepts that `session_id` and generates a structured Seed YAML (with ambiguity scoring). From the terminal, both steps are performed in a single `ouroboros init start` invocation.
|
|
135
|
+
|
|
136
|
+
## Quick Start
|
|
137
|
+
|
|
138
|
+
> For the full first-run onboarding flow (interview -> seed -> execute), see **[Getting Started](../getting-started.md)**.
|
|
139
|
+
|
|
140
|
+
### Verify Installation
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
opencode --version
|
|
144
|
+
ouroboros --help
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## How It Works
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
+-----------------+ +------------------+ +-----------------+
|
|
151
|
+
| Seed YAML | --> | Orchestrator | --> | OpenCode |
|
|
152
|
+
| (your task) | | (runtime_factory)| | (runtime) |
|
|
153
|
+
+-----------------+ +------------------+ +-----------------+
|
|
154
|
+
|
|
|
155
|
+
v
|
|
156
|
+
+------------------+
|
|
157
|
+
| Tools Available |
|
|
158
|
+
| - Read |
|
|
159
|
+
| - Write |
|
|
160
|
+
| - Edit |
|
|
161
|
+
| - Bash |
|
|
162
|
+
| - Glob |
|
|
163
|
+
| - Grep |
|
|
164
|
+
+------------------+
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
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.
|
|
168
|
+
|
|
169
|
+
> For a side-by-side comparison of all runtime backends, see the [runtime capability matrix](../runtime-capability-matrix.md).
|
|
170
|
+
|
|
171
|
+
## OpenCode-Specific Strengths
|
|
172
|
+
|
|
173
|
+
- **Multi-provider support** -- use Anthropic, OpenAI, Google, or other providers through a single runtime
|
|
174
|
+
- **Built-in provider management** -- OpenCode handles its own authentication and provider configuration, no env var setup required
|
|
175
|
+
- **Rich tool access** -- full suite of file, shell, and search tools (same surface as Claude Code)
|
|
176
|
+
- **Native MCP integration** -- OpenCode has built-in MCP server support
|
|
177
|
+
- **Open-source** -- fully open-source, allowing inspection and contribution
|
|
178
|
+
- **Session-aware runtime** -- Ouroboros preserves OpenCode session handles and resume state across workflow steps via `--session` flag
|
|
179
|
+
|
|
180
|
+
## Runtime Differences
|
|
181
|
+
|
|
182
|
+
OpenCode, Claude Code, and Codex CLI are independent runtime backends with different tool sets, permission models, and provider ecosystems. The same Seed file works with all three, but execution paths may differ.
|
|
183
|
+
|
|
184
|
+
| Aspect | OpenCode | Claude Code | Codex CLI |
|
|
185
|
+
|--------|----------|-------------|-----------|
|
|
186
|
+
| What it is | Ouroboros session runtime backed by OpenCode subprocess | Anthropic's agentic coding tool | Ouroboros session runtime backed by Codex CLI transport |
|
|
187
|
+
| Authentication | Managed by OpenCode (`opencode providers auth`) | Max Plan subscription | OpenAI API key |
|
|
188
|
+
| Model | Any model supported by configured provider | Claude (via claude-agent-sdk) | GPT-5.4 with medium reasoning effort (recommended) |
|
|
189
|
+
| Tool surface | Read, Write, Edit, Bash, Glob, Grep | Read, Write, Edit, Bash, Glob, Grep | Codex-native tools (file I/O, shell) |
|
|
190
|
+
| Session model | Session-aware via `--session` flag and runtime handles | Native Claude session context | Session-aware via runtime handles, resume IDs, and skill dispatch |
|
|
191
|
+
| Transport | Subprocess (`opencode run --format json`), prompt via stdin | Claude Agent SDK (direct API) | Subprocess (`codex` executable) |
|
|
192
|
+
| Cost model | Provider API usage charges | Included in Max Plan subscription | OpenAI API usage charges |
|
|
193
|
+
| Tested platforms | Linux | Linux, macOS | Linux, macOS |
|
|
194
|
+
|
|
195
|
+
> **Note:** The Ouroboros workflow model (Seed files, acceptance criteria, evaluation principles) is identical across runtimes. However, because OpenCode, Claude Code, and Codex CLI have different underlying agent capabilities, tool access, and provider ecosystems, they may produce different execution paths and results for the same Seed file.
|
|
196
|
+
|
|
197
|
+
## CLI Options
|
|
198
|
+
|
|
199
|
+
### Workflow Commands
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Execute workflow (OpenCode runtime)
|
|
203
|
+
# Seeds generated by ouroboros init are saved to ~/.ouroboros/seeds/seed_{id}.yaml
|
|
204
|
+
uv run ouroboros run workflow --runtime opencode ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
|
|
205
|
+
|
|
206
|
+
# Debug output (show logs and agent output)
|
|
207
|
+
uv run ouroboros run workflow --runtime opencode --debug ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
|
|
208
|
+
|
|
209
|
+
# Resume a previous session
|
|
210
|
+
uv run ouroboros run workflow --runtime opencode --resume <session_id> ~/.ouroboros/seeds/seed_abcd1234ef56.yaml
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Seed File Reference
|
|
214
|
+
|
|
215
|
+
| Field | Required | Description |
|
|
216
|
+
|-------|----------|-------------|
|
|
217
|
+
| `goal` | Yes | Primary objective |
|
|
218
|
+
| `task_type` | No | Execution strategy: `code` (default), `research`, or `analysis` |
|
|
219
|
+
| `constraints` | No | Hard constraints to satisfy |
|
|
220
|
+
| `acceptance_criteria` | No | Specific success criteria |
|
|
221
|
+
| `ontology_schema` | Yes | Output structure definition |
|
|
222
|
+
| `evaluation_principles` | No | Principles for evaluation |
|
|
223
|
+
| `exit_conditions` | No | Termination conditions |
|
|
224
|
+
| `metadata.ambiguity_score` | Yes | Must be <= 0.2 |
|
|
225
|
+
|
|
226
|
+
## Known Limitations
|
|
227
|
+
|
|
228
|
+
### Session pollution
|
|
229
|
+
|
|
230
|
+
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 [#331](https://github.com/Q00/ouroboros/issues/331)).
|
|
231
|
+
|
|
232
|
+
### No interactive mode
|
|
233
|
+
|
|
234
|
+
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.
|
|
235
|
+
|
|
236
|
+
### Permission mode not wired to CLI
|
|
237
|
+
|
|
238
|
+
OpenCode's `opencode run` command does not expose a `--permission-mode` flag. The `opencode_permission_mode` config value is stored for forward compatibility but is not currently passed to the subprocess. OpenCode runs non-interactively by default, so there is no approval dialogue to bypass.
|
|
239
|
+
|
|
240
|
+
## Troubleshooting
|
|
241
|
+
|
|
242
|
+
### OpenCode not found
|
|
243
|
+
|
|
244
|
+
Ensure `opencode` is installed and available on your `PATH`:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
which opencode
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
If not installed:
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
curl -fsSL https://opencode.ai/install | bash
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Provider not configured
|
|
257
|
+
|
|
258
|
+
If OpenCode reports a provider error, ensure you have completed first-run setup:
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
opencode # interactive first-run setup
|
|
262
|
+
# or
|
|
263
|
+
opencode providers auth anthropic # configure a specific provider
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
OpenCode manages its own provider credentials — you do not need to set `ANTHROPIC_API_KEY` or similar environment variables for the Ouroboros integration.
|
|
267
|
+
|
|
268
|
+
### "Providers: warning" in health check
|
|
269
|
+
|
|
270
|
+
This is normal when using the orchestrator runtime backends. The warning refers to LiteLLM providers, which are not used in orchestrator mode.
|
|
271
|
+
|
|
272
|
+
### "EventStore not initialized"
|
|
273
|
+
|
|
274
|
+
The database will be created automatically at `~/.ouroboros/ouroboros.db`.
|
|
275
|
+
|
|
276
|
+
## Cost
|
|
277
|
+
|
|
278
|
+
Using OpenCode as the runtime backend incurs API charges from your configured provider. Costs depend on:
|
|
279
|
+
|
|
280
|
+
- Provider and model selected in OpenCode's configuration
|
|
281
|
+
- Task complexity and token usage
|
|
282
|
+
- Number of tool calls and iterations
|
|
283
|
+
|
|
284
|
+
Refer to your provider's pricing page for current rates.
|
|
@@ -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.28.1.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 28, 1, '
|
|
21
|
+
__version__ = version = '0.28.1.dev4'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 28, 1, 'dev4')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -7,8 +7,11 @@ from __future__ import annotations
|
|
|
7
7
|
|
|
8
8
|
import asyncio
|
|
9
9
|
from enum import Enum
|
|
10
|
+
import json
|
|
10
11
|
import os
|
|
11
12
|
from pathlib import Path
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
12
15
|
from typing import Annotated
|
|
13
16
|
|
|
14
17
|
from rich.console import Console
|
|
@@ -98,6 +101,60 @@ def _check_stale_instance() -> bool:
|
|
|
98
101
|
return True
|
|
99
102
|
|
|
100
103
|
|
|
104
|
+
def _ensure_shell_env(*, timeout: float = 10.0) -> None:
|
|
105
|
+
"""Load login-shell environment when launched outside a login shell.
|
|
106
|
+
|
|
107
|
+
When a gateway process (e.g., OpenClaw) spawns ``ouroboros mcp serve``,
|
|
108
|
+
the child inherits only a minimal environment. This sources the user's
|
|
109
|
+
shell profile to recover PATH, ANTHROPIC_API_KEY, etc.
|
|
110
|
+
|
|
111
|
+
Uses JSON serialization to avoid multiline env value parsing issues.
|
|
112
|
+
Avoids the ``-i`` (interactive) flag which hangs on oh-my-zsh/p10k.
|
|
113
|
+
"""
|
|
114
|
+
# Fast path: if key indicators are already present, skip
|
|
115
|
+
if os.environ.get("ANTHROPIC_API_KEY"):
|
|
116
|
+
return
|
|
117
|
+
|
|
118
|
+
shell = os.environ.get("SHELL", "/bin/zsh" if sys.platform == "darwin" else "/bin/bash")
|
|
119
|
+
shell_name = Path(shell).name
|
|
120
|
+
|
|
121
|
+
# Dump env as JSON — unambiguous, handles multiline values
|
|
122
|
+
dump_cmd = 'python3 -c "import os,json,sys; json.dump(dict(os.environ), sys.stdout)"'
|
|
123
|
+
|
|
124
|
+
if shell_name == "zsh":
|
|
125
|
+
cmd = [shell, "-l", "-c", f"[[ -f ~/.zshrc ]] && source ~/.zshrc 2>/dev/null; {dump_cmd}"]
|
|
126
|
+
elif shell_name == "bash":
|
|
127
|
+
cmd = [shell, "-l", "-c", f"[[ -f ~/.bashrc ]] && source ~/.bashrc 2>/dev/null; {dump_cmd}"]
|
|
128
|
+
else:
|
|
129
|
+
cmd = [shell, "-l", "-c", dump_cmd]
|
|
130
|
+
|
|
131
|
+
try:
|
|
132
|
+
result = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
|
|
133
|
+
except (FileNotFoundError, subprocess.TimeoutExpired, OSError) as e:
|
|
134
|
+
_stderr_console.print(f"[yellow]Warning: shell env load failed: {e}[/yellow]")
|
|
135
|
+
return
|
|
136
|
+
|
|
137
|
+
if result.returncode != 0:
|
|
138
|
+
return
|
|
139
|
+
|
|
140
|
+
try:
|
|
141
|
+
env = json.loads(result.stdout)
|
|
142
|
+
except json.JSONDecodeError:
|
|
143
|
+
_stderr_console.print("[yellow]Warning: could not parse shell env output[/yellow]")
|
|
144
|
+
return
|
|
145
|
+
|
|
146
|
+
current_path_dirs = set(os.environ.get("PATH", "").split(os.pathsep))
|
|
147
|
+
for key, val in env.items():
|
|
148
|
+
if key == "PATH":
|
|
149
|
+
new_dirs = [d for d in val.split(os.pathsep) if d and d not in current_path_dirs]
|
|
150
|
+
if new_dirs:
|
|
151
|
+
os.environ["PATH"] = (
|
|
152
|
+
os.pathsep.join(new_dirs) + os.pathsep + os.environ.get("PATH", "")
|
|
153
|
+
)
|
|
154
|
+
elif key not in os.environ:
|
|
155
|
+
os.environ[key] = val
|
|
156
|
+
|
|
157
|
+
|
|
101
158
|
app = typer.Typer(
|
|
102
159
|
name="mcp",
|
|
103
160
|
help="MCP (Model Context Protocol) server commands.",
|
|
@@ -123,6 +180,9 @@ async def _run_mcp_server(
|
|
|
123
180
|
runtime_backend: Optional orchestrator runtime backend override.
|
|
124
181
|
llm_backend: Optional LLM-only backend override.
|
|
125
182
|
"""
|
|
183
|
+
# Ensure login-shell environment is available (critical for gateway-spawned processes)
|
|
184
|
+
_ensure_shell_env()
|
|
185
|
+
|
|
126
186
|
from ouroboros.mcp.server.adapter import create_ouroboros_server, validate_transport
|
|
127
187
|
from ouroboros.orchestrator.session import SessionRepository
|
|
128
188
|
from ouroboros.persistence.event_store import EventStore
|
|
@@ -1257,7 +1257,8 @@ def create_ouroboros_server(
|
|
|
1257
1257
|
validator=_evolution_validator,
|
|
1258
1258
|
)
|
|
1259
1259
|
job_manager = JobManager(event_store)
|
|
1260
|
-
|
|
1260
|
+
cwd = Path.cwd()
|
|
1261
|
+
openclaw_db_path = Path.home() / ".ouroboros" / "ouroboros.db"
|
|
1261
1262
|
workflow_manager = ChannelWorkflowManager(openclaw_db_path)
|
|
1262
1263
|
repo_registry = ChannelRepoRegistry(openclaw_db_path)
|
|
1263
1264
|
|
|
@@ -1327,6 +1328,7 @@ def create_ouroboros_server(
|
|
|
1327
1328
|
ChannelWorkflowHandler(
|
|
1328
1329
|
workflow_manager=workflow_manager,
|
|
1329
1330
|
repo_registry=repo_registry,
|
|
1331
|
+
default_repo=str(cwd) if str(cwd) != "/" else None,
|
|
1330
1332
|
interview_handler=InterviewHandler(
|
|
1331
1333
|
interview_engine=interview_engine,
|
|
1332
1334
|
event_store=event_store,
|
|
@@ -44,6 +44,7 @@ class ChannelWorkflowHandler:
|
|
|
44
44
|
job_status_handler: JobStatusHandler | None = field(default=None, repr=False)
|
|
45
45
|
job_wait_handler: JobWaitHandler | None = field(default=None, repr=False)
|
|
46
46
|
job_result_handler: JobResultHandler | None = field(default=None, repr=False)
|
|
47
|
+
default_repo: str | None = field(default=None, repr=False)
|
|
47
48
|
|
|
48
49
|
def __post_init__(self) -> None:
|
|
49
50
|
self._workflow_manager = self.workflow_manager or ChannelWorkflowManager()
|
|
@@ -348,6 +349,7 @@ class ChannelWorkflowHandler:
|
|
|
348
349
|
arguments.get("repo")
|
|
349
350
|
or self._repo_registry.get(channel)
|
|
350
351
|
or (active.repo if active else None)
|
|
352
|
+
or self.default_repo
|
|
351
353
|
)
|
|
352
354
|
if not isinstance(repo, str) or not repo.strip():
|
|
353
355
|
return Result.err(
|
{ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/src/ouroboros/mcp/tools/definitions.py
RENAMED
|
@@ -152,6 +152,7 @@ def channel_workflow_handler(
|
|
|
152
152
|
job_wait_handler: JobWaitHandler | None = None,
|
|
153
153
|
job_status_handler: JobStatusHandler | None = None,
|
|
154
154
|
job_result_handler: JobResultHandler | None = None,
|
|
155
|
+
default_repo: str | None = None,
|
|
155
156
|
) -> ChannelWorkflowHandler:
|
|
156
157
|
"""Create a ChannelWorkflowHandler instance.
|
|
157
158
|
|
|
@@ -171,6 +172,7 @@ def channel_workflow_handler(
|
|
|
171
172
|
job_wait_handler=job_wait_handler or JobWaitHandler(),
|
|
172
173
|
job_status_handler=job_status_handler or JobStatusHandler(),
|
|
173
174
|
job_result_handler=job_result_handler or JobResultHandler(),
|
|
175
|
+
default_repo=default_repo,
|
|
174
176
|
)
|
|
175
177
|
|
|
176
178
|
|
|
@@ -11,7 +11,7 @@ from typing import Any
|
|
|
11
11
|
|
|
12
12
|
def default_openclaw_db_path() -> Path:
|
|
13
13
|
"""Return the default SQLite database path for OpenClaw workflow state."""
|
|
14
|
-
return Path.
|
|
14
|
+
return Path.home() / ".ouroboros" / "ouroboros.db"
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class OpenClawStateStore:
|
{ouroboros_ai-0.28.1.dev2 → ouroboros_ai-0.28.1.dev4}/tests/integration/mcp/test_server_adapter.py
RENAMED
|
@@ -590,7 +590,7 @@ class TestCreateOuroborosServer:
|
|
|
590
590
|
assert status_result.is_ok
|
|
591
591
|
assert "Channel Workflow Summary" in status_result.value.text_content
|
|
592
592
|
assert str(tmp_path / "repo") in status_result.value.text_content
|
|
593
|
-
assert (
|
|
593
|
+
assert (Path.home() / ".ouroboros" / "ouroboros.db").exists()
|
|
594
594
|
|
|
595
595
|
|
|
596
596
|
class TestMCPServerAdapterConcurrency:
|