ouroboros-ai 0.31.2.dev13__tar.gz → 0.31.2.dev14__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.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/PKG-INFO +1 -1
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/cli-reference.md +19 -3
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/getting-started.md +1 -1
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-guides/codex.md +3 -3
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/_version.py +2 -2
- ouroboros_ai-0.31.2.dev14/src/ouroboros/cli/commands/codex.py +35 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/setup.py +67 -16
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/uninstall.py +30 -8
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/main.py +2 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/codex/__init__.py +4 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/codex/artifacts.py +25 -0
- ouroboros_ai-0.31.2.dev14/tests/unit/cli/test_codex_command.py +40 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_setup.py +76 -5
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_uninstall.py +31 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.claude/settings.json +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.claude-plugin/.mcp.json +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.claude-plugin/marketplace.json +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.claude-plugin/plugin.json +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.env.example +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/workflows/dev-publish.yml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/workflows/lint.yml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/workflows/release.yml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.github/workflows/test.yml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.gitignore +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.mcp.json +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.ouroboros/mechanical.toml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.ouroboros/seeds/seed_73827177a2a3.yaml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.ouroboros/seeds/seed_78c8e6e41813.yaml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.pre-commit-config.yaml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/.python-version +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/CHANGELOG.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/CLAUDE.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/CODE_OF_CONDUCT.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/CONTRIBUTING.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/Code-Review-Claude.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/Code-Review-Codex.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/HANDOFF.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/LICENSE +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/README.ko.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/README.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/SECURITY.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/UNINSTALL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/cancel.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/evaluate.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/evolve.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/help.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/interview.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/ralph.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/run.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/seed.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/setup.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/status.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/tutorial.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/unstuck.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/commands/welcome.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/.gitignore +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/Cargo.lock +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/Cargo.toml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/README.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/db.rs +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/main.rs +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/mock.rs +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/state.rs +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/dashboard.rs +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/execution.rs +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/lineage.rs +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/logs.rs +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/mod.rs +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/crates/ouroboros-tui/src/views/session_selector.rs +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/README.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/api/README.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/api/core.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/api/mcp.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/architecture.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/config-reference.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/agent-os-kernel-terminology.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/architecture-overview.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/findings-registry.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/issue-quality-policy.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/key-patterns.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/contributing/testing-guide.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/events.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/examples/mcp-config.yaml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/examples/workflows/design-code-verify.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/examples/workflows/research-to-deliverable.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/evaluation-pipeline.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/evolution-loop.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/issue-176-subagent-mcp-inheritance.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/mcp-best-practices.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/mcp-bridge.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/ooo-skill-dispatch-router.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/opencode-subagent-bridge.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/qa-backends.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/seed-authoring.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/guides/tui-usage.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/images/PLACEHOLDER_README.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/images/ouroboros.png +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/platform-support.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-capability-matrix.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-guides/claude-code.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-guides/gemini.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-guides/hermes.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/docs/runtime-guides/opencode.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/coordinator_test_seed.yaml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/dummy_seed.yaml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/parallel_subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/subac_test_seed.yaml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/README.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/__main__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/cli.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/models.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/task_manager/storage.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/examples/test_display.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/hooks/hooks.json +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/llms-full.txt +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/llms.txt +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/project-context.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/pyproject.toml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/drift-monitor.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/install.sh +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/keyword-detector.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/mcp-serve.sh +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/ralph-rewind.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/ralph.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/ralph.sh +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/session-start.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/sync-plugin-version.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/scripts/version-check.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/brownfield/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/cancel/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/evaluate/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/evolve/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/help/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/interview/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/pm/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/publish/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/qa/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/ralph/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/resume-session/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/run/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/seed/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/setup/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/status/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/tutorial/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/unstuck/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/update/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/skills/welcome/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/__main__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/advocate.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/analysis-agent.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/architect.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/breadth-keeper.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/code-executor.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/codebase-explorer.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/consensus-reviewer.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/contrarian.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/evaluator.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/hacker.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/judge.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/loader.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/ontologist.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/ontology-analyst.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/qa-judge.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/research-agent.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/researcher.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/seed-architect.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/seed-closer.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/semantic-evaluator.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/simplifier.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/agents/socratic-interviewer.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/ambiguity.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/brownfield.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/explore.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/interview.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/pm_completion.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/pm_document.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/pm_interview.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/pm_seed.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/question_classifier.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/bigbang/seed_generator.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/claude_permissions.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/cancel.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/config.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/detect.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/init.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/mcp.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/mcp_doctor.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/pm.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/resume.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/run.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/status.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/tui.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/panels.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/progress.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/prompting.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/tables.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/formatters/workflow_display.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/jsonc.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/opencode_config.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/codex/cli_policy.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/codex/ouroboros.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/codex_permissions.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/config/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/config/loader.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/config/models.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/ac_tree.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/context.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/directive.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/errors.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/file_lock.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/git_workflow.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/initial_context.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/json_utils.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/lineage.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/ontology_aspect.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/ontology_questions.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/project_paths.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/retry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/security.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/seed.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/seed_contract.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/seed_contract_prompt.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/text.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/ttl_cache.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/types.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/core/worktree.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/artifact_collector.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/checklist.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/consensus.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/detector.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/json_utils.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/languages.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/mechanical.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/models.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/pipeline.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/semantic.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/trigger.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evaluation/verification_artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/base.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/control.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/decomposition.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/evaluation.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/interview.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/lineage.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/events/ontology.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/convergence.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/loop.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/projector.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/reflect.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/regression.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/evolution/wonder.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/execution/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/execution/atomicity.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/execution/decomposition.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/execution/double_diamond.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/execution/subagent.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/hermes/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/hermes/artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/bridge/bridge.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/bridge/config.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/bridge/factory.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/client/adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/client/manager.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/client/protocol.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/errors.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/job_manager.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/resources/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/resources/handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/server/adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/server/protocol.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/server/security.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/ac_tree_hud_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/ac_tree_hud_render.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/authoring_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/bridge_mixin.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/brownfield_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/dashboard.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/definitions.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/evaluation_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/evolution_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/execution_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/job_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/pm_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/qa.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/query_handlers.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/registry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/tools/subagent.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/mcp/types.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/observability/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/observability/drift.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/observability/logging.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/observability/retrospective.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/opencode-plugin.d.ts +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/ouroboros-bridge.test.ts +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/ouroboros-bridge.ts +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/package.json +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/opencode/plugin/tsconfig.json +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/capabilities.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/command_dispatcher.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/control_plane.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/coordinator.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/dependency_analyzer.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/events.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/execution_strategy.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/gemini_cli_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/heartbeat.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/hermes_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/level_context.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/mcp_config.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/mcp_tools.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/opencode_event_normalizer.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/opencode_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/parallel_executor.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/parallel_executor_models.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/policy.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/rate_limit.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/runner.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/runtime_factory.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/runtime_message_projection.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/session.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/orchestrator/workflow_state.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/brownfield.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/checkpoint.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/event_store.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/migrations/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/migrations/runner.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/migrations/scripts/001_initial.sql +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/migrations/scripts/002_brownfield.sql +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/schema.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/persistence/uow.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/agents/pool.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/agents/registry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/orchestration/router.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/orchestration/scheduler.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/skills/docs.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/skills/executor.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/skills/keywords.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/plugin/skills/registry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/pm/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/pm/handoff.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/pm/renderer.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/anthropic_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/base.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/claude_code_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/codex_cli_stream.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/factory.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/gemini_cli_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/gemini_event_normalizer.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/litellm_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/providers/opencode_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/py.typed +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/resilience/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/resilience/lateral.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/resilience/recovery.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/resilience/stagnation.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/router/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/router/command_parser.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/router/dispatch.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/router/registry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/router/types.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/complexity.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/downgrade.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/escalation.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/router.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/routing/tiers.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/sandbox.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/secondary/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/secondary/scheduler.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/secondary/todo_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/skills/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/skills/artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/strategies/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/strategies/devil_advocate.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/app.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/components/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/components/agents_panel.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/components/event_log.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/components/progress.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/components/token_tracker.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/events.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/confirm_rewind.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/dashboard.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/dashboard_v2.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/dashboard_v3.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/debug.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/execution.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/hud_dashboard.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/lineage_detail.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/lineage_selector.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/logs.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/screens/session_selector.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/ac_progress.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/ac_tree.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/agent_activity.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/cost_tracker.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/drift_meter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/lineage_tree.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/parallel_graph.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/tui/widgets/phase_progress.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/verification/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/verification/extractor.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/verification/models.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/verification/verifier.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/mcp_bridge_test_config.yaml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/test_cli_commands.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/test_full_workflow.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/e2e/test_session_persistence.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/fixtures/router/skills/frontmatter-body/run/SKILL.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/fixtures/test_atomicity_seed.yml +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/bridge/test_bridge_server_to_server.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/test_client_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/test_client_manager.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/mcp/test_server_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/plugin/test_orchestration.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/test_cancel_subprocess_termination.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/test_codex_cli_passthrough_smoke.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/test_codex_skill_fallback.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/test_codex_skill_smoke.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/integration/test_entry_point.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/test-execution-plan.md +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/agents/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/agents/test_loader.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_ambiguity.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_brownfield.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_classifier_context.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_decide_later_items.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_explore.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_interview.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_interview_async_io.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_interview_no_web_search_hint.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_interview_research_prefix.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_completion.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_document_generator.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_document_writer.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_interview.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_interview_brownfield_db.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_seed_ac12.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_pm_seed_save.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_question_classifier.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/bigbang/test_seed_generator.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/commands/test_tui_command.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_console.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_panels.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_progress.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_prompting.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_tables.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/formatters/test_workflow_display.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_bridge_plugin_hardening.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_bridge_plugin_lifecycle.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_cancel.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_config.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_doc_commands.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_init_pm_seed_detection.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_init_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_jsonc.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_main.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_mcp_doctor.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_mcp_nested_guard.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_mcp_shell_env.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_mcp_startup_cleanup.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_mcp_validate_transport_stderr.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_opencode_config.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_brownfield.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_completion.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_interactive_logging.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_missing_litellm.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_overwrite.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_runtime_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_pm_select_repos.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_resume.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/cli/test_run_qa.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/codex/test_cli_policy.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/config/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/config/test_loader.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/config/test_loader_env.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/config/test_models.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_ac_tree.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_context.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_directive.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_errors.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_file_lock.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_git_workflow.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_initial_context.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_lineage.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_ontology_aspect.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_ontology_questions.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_retry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_security.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_seed.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_ttl_cache.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_types.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/core/test_worktree.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_artifact_collector_file_prefix.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_checklist.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_consensus.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_detector.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_json_utils.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_languages.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_mechanical.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_models.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_pipeline_stage1_reuse.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_pipeline_trigger_consensus.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_review_fixes.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_semantic.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_trigger.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_trigger_consensus.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evaluation/test_verification_artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/events/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/events/test_base.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/events/test_control_events.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/events/test_decomposition_events.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/evolution/test_wonder_scope.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/execution/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/execution/test_atomicity.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/execution/test_decomposition.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/execution/test_double_diamond.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/execution/test_subagent_isolation.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/hermes/test_artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/test_bridge.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/test_config.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/test_factory.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/test_handler_wiring.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/bridge/test_stability.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/client/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/client/test_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/client/test_adapter_transport_lifecycle.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/client/test_manager.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/server/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/server/test_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/server/test_security.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/test_errors.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/test_job_manager.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/test_types.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/conftest.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_footer.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler_completed.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler_cursor_changed.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler_invalid_session.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler_no_execution.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_handler_waiting.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_max_nodes.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth2.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_render_depth3.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_status_icons.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_ac_tree_hud_truncation.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_brownfield_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_checklist_verify.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_definitions.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_evaluate_multi_ac.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_handler_subagent_wiring.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_interview_done_streak.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_interview_reopen_seed_ready.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_lateral_think_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_mcp_manager_wiring.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_pm_handler.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_pm_handler_pending_reframe.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_qa_parser.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_round5_fixes.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/mcp/tools/test_subagent.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/observability/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/observability/test_drift.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/observability/test_logging.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/observability/test_retrospective.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_capabilities.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_codex_cli_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_codex_recursion_guard.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_command_dispatcher.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_control_plane.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_coordinator.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_dependency_analyzer.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_events.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_execution_runtime_scope.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_execution_strategy.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_gemini_cli_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_hermes_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_inflight_cancellation.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_level_context.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_mcp_config.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_mcp_tools.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_opencode_runtime.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_parallel_executor.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_parallel_executor_atomic_judgment.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_parallel_executor_recursive_depth.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_parallel_executor_retry_resume.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_policy.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_rate_limit.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_runner.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_runner_cancellation.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_runtime_factory.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_runtime_message_projection.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_sandbox_class.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_seed_prompt.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_session.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/orchestrator/test_workflow_state.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/test_brownfield_store.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/test_checkpoint.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/test_event_store.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/test_schema.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/persistence/test_uow.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/agents/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/agents/test_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/orchestration/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/orchestration/test_model_router.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/skills/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/skills/test_keywords.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/plugin/skills/test_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/pm/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/pm/test_renderer.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_base.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_claude_code_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_codex_cli_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_factory.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_gemini_cli_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_litellm_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/providers/test_opencode_adapter.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/resilience/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/resilience/test_lateral.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/resilience/test_recovery.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/resilience/test_stagnation.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_command_parser.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_dispatch.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_dispatch_result_shapes.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_extract_first_argument.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_invalid_dispatch_input_types.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_malformed_unknown_dispatch_errors.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_not_handled_resolution.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_repository_dispatch_guard.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_router_resolution_pipeline.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_typed_frontmatter_fields.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/router/test_valid_dispatch_normalization.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/test_complexity.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/test_downgrade.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/test_escalation.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/test_router.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/routing/test_tiers.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/scripts/test_keyword_detector.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/scripts/test_session_start.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/scripts/test_version_check.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/secondary/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/secondary/test_scheduler.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/secondary/test_todo_registry.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/skills/test_skill_artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_artifact_collector.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_codex_artifacts.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_convergence.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_dashboard.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_dependencies_configured.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_evolve_rewind.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_evolve_step.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_graceful_shutdown.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_main_entry_point.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_module_structure.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_project_initialization.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_projector_rewind.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_ralph_parser.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_ralph_rewind.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_regression.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_tooling_configuration.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/test_verification.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/__init__.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_app.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_cancelled_display.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_events.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_lineage_viewer.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_screens.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_session_selector_replay.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tests/unit/tui/test_widgets.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/tools/sync_github_project.py +0 -0
- {ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/uv.lock +0 -0
|
@@ -71,6 +71,7 @@ ouroboros setup [OPTIONS]
|
|
|
71
71
|
| `-r, --runtime TEXT` | Runtime backend to configure. Shipped values: `claude`, `codex`, `opencode`. Auto-detected if omitted |
|
|
72
72
|
| `--opencode-mode TEXT` | OpenCode integration mode: `plugin` (default, recommended — bridge plugin for interactive sessions) or `subprocess` (headless/CI). Mutually exclusive — see [OpenCode runtime guide](runtime-guides/opencode.md#configuration) |
|
|
73
73
|
| `--non-interactive` | Skip interactive prompts (for scripted installs) |
|
|
74
|
+
| `--mcp-mode TEXT` | Codex MCP config mode: `auto` (default), `preserve`, or `stdio` |
|
|
74
75
|
|
|
75
76
|
**Examples:**
|
|
76
77
|
|
|
@@ -97,11 +98,11 @@ ouroboros setup --non-interactive
|
|
|
97
98
|
- For Codex CLI: sets `orchestrator.codex_cli_path` and `llm.backend: codex` in `~/.ouroboros/config.yaml`
|
|
98
99
|
- For Codex CLI: installs managed Ouroboros rules into `~/.codex/rules/`
|
|
99
100
|
- For Codex CLI: installs managed Ouroboros skills into `~/.codex/skills/`
|
|
100
|
-
- For Codex CLI: registers the Ouroboros MCP/env block in `~/.codex/config.toml`
|
|
101
|
+
- For Codex CLI: registers the Ouroboros MCP/env block in `~/.codex/config.toml` when absent, refreshes setup-managed stdio blocks, and preserves user-managed URL/custom blocks by default
|
|
101
102
|
- For OpenCode: registers the Ouroboros MCP server in OpenCode's configuration
|
|
102
103
|
- For OpenCode (plugin mode): installs the bridge plugin into `<opencode_config_dir>/plugins/ouroboros-bridge/`
|
|
103
104
|
|
|
104
|
-
> **Codex config split:** put persistent Ouroboros per-role model overrides in `~/.ouroboros/config.yaml` (`clarification.default_model`, `llm.qa_model`, `evaluation.semantic_model`, `consensus.models`, `consensus.advocate_model`, `consensus.devil_model`, `consensus.judge_model`). `~/.codex/config.toml` is only the Codex MCP/env hookup file used by setup.
|
|
105
|
+
> **Codex config split:** put persistent Ouroboros per-role model overrides in `~/.ouroboros/config.yaml` (`clarification.default_model`, `llm.qa_model`, `evaluation.semantic_model`, `consensus.models`, `consensus.advocate_model`, `consensus.devil_model`, `consensus.judge_model`). `~/.codex/config.toml` is only the Codex MCP/env hookup file used by setup. If you run a long-lived URL-based Ouroboros MCP server, setup preserves that user-managed entry in the default `--mcp-mode auto`; use `--mcp-mode stdio` only when you intentionally want setup to replace it.
|
|
105
106
|
|
|
106
107
|
### Brownfield Subcommands
|
|
107
108
|
|
|
@@ -423,6 +424,21 @@ ouroboros config validate
|
|
|
423
424
|
|
|
424
425
|
---
|
|
425
426
|
|
|
427
|
+
|
|
428
|
+
## `ouroboros codex`
|
|
429
|
+
|
|
430
|
+
Manage Codex-specific Ouroboros integration artifacts.
|
|
431
|
+
|
|
432
|
+
### `codex refresh`
|
|
433
|
+
|
|
434
|
+
Refresh the packaged Codex-side Ouroboros rules and skills without changing MCP or Ouroboros config files.
|
|
435
|
+
|
|
436
|
+
```bash
|
|
437
|
+
ouroboros codex refresh
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
This command updates packaged `~/.codex/rules/ouroboros*.md` and `~/.codex/skills/ouroboros-*` artifacts. It does not modify `~/.codex/config.toml` or `~/.ouroboros/config.yaml`. It intentionally does not prune extra `ouroboros-*` files because prefix ownership can include user-managed artifacts.
|
|
441
|
+
|
|
426
442
|
## `ouroboros uninstall`
|
|
427
443
|
|
|
428
444
|
Cleanly remove all Ouroboros configuration from your system. Reverses everything `ouroboros setup` did.
|
|
@@ -459,7 +475,7 @@ ouroboros uninstall --keep-data
|
|
|
459
475
|
|
|
460
476
|
- `ouroboros` entry from `~/.claude/mcp.json`
|
|
461
477
|
- `[mcp_servers.ouroboros]` section from `~/.codex/config.toml`
|
|
462
|
-
- `~/.codex/rules/ouroboros
|
|
478
|
+
- `~/.codex/rules/ouroboros*.md` and `~/.codex/skills/ouroboros-*`
|
|
463
479
|
- `<!-- ooo:START -->` … `<!-- ooo:END -->` block from `CLAUDE.md`
|
|
464
480
|
- OpenCode bridge plugin (`<opencode_config_dir>/plugins/ouroboros-bridge/`) and its entry in `opencode.jsonc`
|
|
465
481
|
- `.ouroboros/` directory in the current project
|
|
@@ -172,7 +172,7 @@ consensus:
|
|
|
172
172
|
judge_model: gpt-5.4
|
|
173
173
|
```
|
|
174
174
|
|
|
175
|
-
`ouroboros setup --runtime codex` uses `~/.codex/config.toml` only for the Codex MCP/env hookup and installs managed Ouroboros rules/skills into `~/.codex/`.
|
|
175
|
+
`ouroboros setup --runtime codex` uses `~/.codex/config.toml` only for the Codex MCP/env hookup and installs managed Ouroboros rules/skills into `~/.codex/`. Existing URL/custom Ouroboros MCP entries are preserved by default; run `ouroboros codex refresh` when you only need to refresh `~/.codex/rules/ouroboros*.md` and `~/.codex/skills/ouroboros-*`.
|
|
176
176
|
|
|
177
177
|
### Environment Variables
|
|
178
178
|
|
|
@@ -112,13 +112,13 @@ Under the hood, `CodexCliRuntime` still talks to the local `codex` executable, b
|
|
|
112
112
|
- Records `orchestrator.codex_cli_path` when available
|
|
113
113
|
- Installs managed Ouroboros rules into `~/.codex/rules/`
|
|
114
114
|
- Installs managed Ouroboros skills into `~/.codex/skills/`
|
|
115
|
-
- Registers the Ouroboros MCP/env hookup in `~/.codex/config.toml`
|
|
115
|
+
- Registers the Ouroboros MCP/env hookup in `~/.codex/config.toml` when absent, refreshes setup-managed stdio blocks, and preserves user-managed URL/custom entries by default
|
|
116
116
|
|
|
117
|
-
`~/.codex/config.toml` is not where Ouroboros per-role model overrides belong. Keep `clarification`, `qa`, `semantic`, and `consensus` model settings in `~/.ouroboros/config.yaml`.
|
|
117
|
+
`~/.codex/config.toml` is not where Ouroboros per-role model overrides belong. Keep `clarification`, `qa`, `semantic`, and `consensus` model settings in `~/.ouroboros/config.yaml`. If you manage a long-running URL-based Ouroboros MCP server, keep that URL entry in `~/.codex/config.toml`; `ouroboros setup --runtime codex` preserves it by default. Use `--mcp-mode stdio` only when you intentionally want setup to replace the entry with the managed command-spawned server.
|
|
118
118
|
|
|
119
119
|
### `ooo` Skill Availability on Codex
|
|
120
120
|
|
|
121
|
-
After running `ouroboros setup --runtime codex`, the bundled `ooo` skills are installed into `~/.codex/skills
|
|
121
|
+
After running `ouroboros setup --runtime codex`, the bundled `ooo` skills are installed into `~/.codex/skills/ouroboros-*` and the routing rules into `~/.codex/rules/`. To refresh only those artifacts after upgrading Ouroboros, run `ouroboros codex refresh`; it does not modify `~/.codex/config.toml` or `~/.ouroboros/config.yaml`. The table below shows each skill and its CLI equivalent for terminal-only workflows.
|
|
122
122
|
|
|
123
123
|
| `ooo` Skill | Codex session | CLI equivalent (Terminal) |
|
|
124
124
|
|-------------|---------------|--------------------------|
|
|
@@ -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.31.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 31, 2, '
|
|
21
|
+
__version__ = version = '0.31.2.dev14'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 31, 2, 'dev14')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Codex CLI integration helper commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import typer
|
|
8
|
+
|
|
9
|
+
from ouroboros.cli.formatters.panels import print_error, print_success
|
|
10
|
+
from ouroboros.codex import install_codex_artifacts
|
|
11
|
+
|
|
12
|
+
app = typer.Typer(
|
|
13
|
+
name="codex",
|
|
14
|
+
help="Manage Ouroboros Codex CLI integration artifacts.",
|
|
15
|
+
no_args_is_help=True,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@app.callback()
|
|
20
|
+
def codex() -> None:
|
|
21
|
+
"""Manage Ouroboros Codex CLI integration artifacts."""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@app.command("refresh")
|
|
25
|
+
def refresh() -> None:
|
|
26
|
+
"""Refresh Codex rules and skills without changing MCP or Ouroboros config."""
|
|
27
|
+
codex_dir = Path.home() / ".codex"
|
|
28
|
+
try:
|
|
29
|
+
result = install_codex_artifacts(codex_dir=codex_dir, prune=False)
|
|
30
|
+
except FileNotFoundError as exc:
|
|
31
|
+
print_error(str(exc))
|
|
32
|
+
raise typer.Exit(1) from exc
|
|
33
|
+
|
|
34
|
+
print_success(f"Installed Codex rules → {result.rules_path}")
|
|
35
|
+
print_success(f"Installed {len(result.skill_paths)} Codex skills → {codex_dir / 'skills'}")
|
|
@@ -17,7 +17,7 @@ import json
|
|
|
17
17
|
import os
|
|
18
18
|
from pathlib import Path
|
|
19
19
|
import shutil
|
|
20
|
-
from typing import Annotated
|
|
20
|
+
from typing import Annotated, Literal
|
|
21
21
|
|
|
22
22
|
from rich.prompt import Prompt
|
|
23
23
|
from rich.table import Table
|
|
@@ -206,6 +206,43 @@ _CODEX_MCP_COMMENT_LINES = (
|
|
|
206
206
|
"# This file is only for the Codex MCP/env registration block.",
|
|
207
207
|
)
|
|
208
208
|
|
|
209
|
+
CodexMcpMode = Literal["auto", "preserve", "stdio"]
|
|
210
|
+
_CODEX_MCP_ARGS = ["--from", "ouroboros-ai[mcp]", "ouroboros", "mcp", "serve"]
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _normalize_codex_mcp_mode(value: str) -> CodexMcpMode:
|
|
214
|
+
"""Validate and normalize the Codex MCP setup mode."""
|
|
215
|
+
normalized = value.lower()
|
|
216
|
+
if normalized not in {"auto", "preserve", "stdio"}:
|
|
217
|
+
print_error("Unsupported Codex MCP mode. Use one of: auto, preserve, stdio.")
|
|
218
|
+
raise typer.Exit(1)
|
|
219
|
+
return normalized # type: ignore[return-value]
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def _codex_mcp_entry_from_toml(data: dict[str, object]) -> dict[str, object] | None:
|
|
223
|
+
"""Return the parsed Ouroboros Codex MCP entry, if present."""
|
|
224
|
+
mcp_servers = data.get("mcp_servers")
|
|
225
|
+
if not isinstance(mcp_servers, dict):
|
|
226
|
+
return None
|
|
227
|
+
entry = mcp_servers.get("ouroboros")
|
|
228
|
+
return entry if isinstance(entry, dict) else None
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def _is_setup_managed_codex_mcp_entry(entry: dict[str, object]) -> bool:
|
|
232
|
+
"""Return whether setup may safely replace this Codex MCP entry."""
|
|
233
|
+
if "url" in entry:
|
|
234
|
+
return False
|
|
235
|
+
|
|
236
|
+
command = entry.get("command")
|
|
237
|
+
args = entry.get("args")
|
|
238
|
+
if command != "uvx" or not isinstance(args, list):
|
|
239
|
+
return False
|
|
240
|
+
|
|
241
|
+
# Current setup-managed config and older setup-managed uvx configs both
|
|
242
|
+
# end by launching `ouroboros mcp serve`. Editable/worktree configs often
|
|
243
|
+
# use a direct command path and are intentionally treated as user-managed.
|
|
244
|
+
return len(args) >= 3 and args[-3:] == ["ouroboros", "mcp", "serve"]
|
|
245
|
+
|
|
209
246
|
|
|
210
247
|
def _is_codex_ouroboros_table_header(line: str) -> bool:
|
|
211
248
|
"""Return True when the line starts the managed Codex MCP table."""
|
|
@@ -270,21 +307,33 @@ def _upsert_codex_mcp_section(raw: str) -> tuple[str, bool]:
|
|
|
270
307
|
return "\n".join(output_lines).rstrip() + "\n", existed_before
|
|
271
308
|
|
|
272
309
|
|
|
273
|
-
def _register_codex_mcp_server() -> None:
|
|
310
|
+
def _register_codex_mcp_server(*, mode: CodexMcpMode = "auto") -> None:
|
|
274
311
|
"""Register the Ouroboros MCP/env hookup in ~/.codex/config.toml."""
|
|
275
312
|
import tomllib
|
|
276
313
|
|
|
314
|
+
if mode == "preserve":
|
|
315
|
+
print_info("Preserved Codex MCP config.")
|
|
316
|
+
return
|
|
317
|
+
|
|
277
318
|
codex_config = Path.home() / ".codex" / "config.toml"
|
|
278
319
|
codex_config.parent.mkdir(parents=True, exist_ok=True)
|
|
279
320
|
|
|
280
321
|
if codex_config.exists():
|
|
281
322
|
raw = codex_config.read_text(encoding="utf-8")
|
|
282
323
|
try:
|
|
283
|
-
tomllib.loads(raw)
|
|
324
|
+
parsed = tomllib.loads(raw)
|
|
284
325
|
except tomllib.TOMLDecodeError:
|
|
285
326
|
print_error(f"Could not parse {codex_config} — skipping MCP registration.")
|
|
286
327
|
return
|
|
287
328
|
|
|
329
|
+
entry = _codex_mcp_entry_from_toml(parsed)
|
|
330
|
+
if mode == "auto" and entry is not None and not _is_setup_managed_codex_mcp_entry(entry):
|
|
331
|
+
print_info(
|
|
332
|
+
"Preserved existing user-managed Ouroboros MCP config in "
|
|
333
|
+
f"{codex_config}. Use --mcp-mode stdio to replace it."
|
|
334
|
+
)
|
|
335
|
+
return
|
|
336
|
+
|
|
288
337
|
updated_raw, existed_before = _upsert_codex_mcp_section(raw)
|
|
289
338
|
if updated_raw == raw:
|
|
290
339
|
print_info("Codex MCP server already up to date.")
|
|
@@ -308,24 +357,19 @@ def _print_codex_config_guidance(config_path: Path) -> None:
|
|
|
308
357
|
|
|
309
358
|
def _install_codex_artifacts() -> None:
|
|
310
359
|
"""Install packaged Ouroboros rules and skills into ~/.codex/."""
|
|
311
|
-
from ouroboros.codex import
|
|
360
|
+
from ouroboros.codex import install_codex_artifacts
|
|
312
361
|
|
|
313
362
|
codex_dir = Path.home() / ".codex"
|
|
314
363
|
|
|
315
364
|
try:
|
|
316
|
-
|
|
317
|
-
print_success(f"Installed Codex rules → {rules_path}")
|
|
365
|
+
result = install_codex_artifacts(codex_dir=codex_dir, prune=True)
|
|
366
|
+
print_success(f"Installed Codex rules → {result.rules_path}")
|
|
367
|
+
print_success(f"Installed {len(result.skill_paths)} Codex skills → {codex_dir / 'skills'}")
|
|
318
368
|
except FileNotFoundError:
|
|
319
|
-
print_error("Could not locate packaged Codex rules.")
|
|
320
|
-
|
|
321
|
-
try:
|
|
322
|
-
skill_paths = install_codex_skills(codex_dir=codex_dir, prune=True)
|
|
323
|
-
print_success(f"Installed {len(skill_paths)} Codex skills → {codex_dir / 'skills'}")
|
|
324
|
-
except FileNotFoundError:
|
|
325
|
-
print_error("Could not locate packaged Codex skills.")
|
|
369
|
+
print_error("Could not locate packaged Codex rules or skills.")
|
|
326
370
|
|
|
327
371
|
|
|
328
|
-
def _setup_codex(codex_path: str) -> None:
|
|
372
|
+
def _setup_codex(codex_path: str, *, mcp_mode: CodexMcpMode = "auto") -> None:
|
|
329
373
|
"""Configure Ouroboros for the Codex runtime."""
|
|
330
374
|
from ouroboros.config.loader import create_default_config, ensure_config_dir
|
|
331
375
|
|
|
@@ -356,7 +400,7 @@ def _setup_codex(codex_path: str) -> None:
|
|
|
356
400
|
_install_codex_artifacts()
|
|
357
401
|
|
|
358
402
|
# Register MCP server in Codex config (~/.codex/config.toml)
|
|
359
|
-
_register_codex_mcp_server()
|
|
403
|
+
_register_codex_mcp_server(mode=mcp_mode)
|
|
360
404
|
_print_codex_config_guidance(config_path)
|
|
361
405
|
|
|
362
406
|
|
|
@@ -1264,6 +1308,13 @@ def setup(
|
|
|
1264
1308
|
help="OpenCode integration mode (mutually exclusive): plugin (default) or subprocess.",
|
|
1265
1309
|
),
|
|
1266
1310
|
] = "plugin",
|
|
1311
|
+
mcp_mode: Annotated[
|
|
1312
|
+
str,
|
|
1313
|
+
typer.Option(
|
|
1314
|
+
"--mcp-mode",
|
|
1315
|
+
help="Codex MCP config mode: auto preserves user-managed entries, preserve skips MCP changes, stdio replaces with the managed stdio entry.",
|
|
1316
|
+
),
|
|
1317
|
+
] = "auto",
|
|
1267
1318
|
) -> None:
|
|
1268
1319
|
"""Set up Ouroboros for your environment.
|
|
1269
1320
|
|
|
@@ -1357,7 +1408,7 @@ def setup(
|
|
|
1357
1408
|
if not codex_path:
|
|
1358
1409
|
print_error("Codex CLI not found in PATH.")
|
|
1359
1410
|
raise typer.Exit(1)
|
|
1360
|
-
_setup_codex(codex_path)
|
|
1411
|
+
_setup_codex(codex_path, mcp_mode=_normalize_codex_mcp_mode(mcp_mode))
|
|
1361
1412
|
elif selected in ("opencode", "opencode_cli"):
|
|
1362
1413
|
opencode_path = available.get("opencode")
|
|
1363
1414
|
if not opencode_path:
|
{ouroboros_ai-0.31.2.dev13 → ouroboros_ai-0.31.2.dev14}/src/ouroboros/cli/commands/uninstall.py
RENAMED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Cleanly reverses everything `ouroboros setup` did:
|
|
4
4
|
1. MCP server registration (~/.claude/mcp.json, ~/.codex/config.toml)
|
|
5
5
|
2. CLAUDE.md integration block (<!-- ooo:START --> … <!-- ooo:END -->)
|
|
6
|
-
3. Codex artifacts (
|
|
6
|
+
3. Codex artifacts (current packaged rules/skills plus legacy ~/.codex/skills/ouroboros/)
|
|
7
7
|
4. Data directory (~/.ouroboros/)
|
|
8
8
|
|
|
9
9
|
Does NOT remove:
|
|
@@ -33,6 +33,7 @@ from ouroboros.cli.opencode_config import (
|
|
|
33
33
|
is_bridge_plugin_entry,
|
|
34
34
|
opencode_config_dir,
|
|
35
35
|
)
|
|
36
|
+
from ouroboros.codex import CODEX_RULE_FILENAME, resolve_packaged_codex_assets
|
|
36
37
|
|
|
37
38
|
app = typer.Typer(
|
|
38
39
|
name="uninstall",
|
|
@@ -140,12 +141,28 @@ def _remove_codex_artifacts(dry_run: bool) -> bool:
|
|
|
140
141
|
Returns True only if ALL existing artifacts were removed successfully.
|
|
141
142
|
Returns False if any artifact could not be removed.
|
|
142
143
|
"""
|
|
143
|
-
|
|
144
|
-
|
|
144
|
+
codex_dir = Path.home() / ".codex"
|
|
145
|
+
try:
|
|
146
|
+
with resolve_packaged_codex_assets() as assets:
|
|
147
|
+
managed_relative_paths = set(assets.managed_relative_install_paths)
|
|
148
|
+
except FileNotFoundError:
|
|
149
|
+
managed_relative_paths = {Path("rules") / CODEX_RULE_FILENAME}
|
|
150
|
+
managed_relative_paths.add(Path("skills") / "ouroboros") # legacy setup path
|
|
151
|
+
|
|
152
|
+
rule_paths = [
|
|
153
|
+
codex_dir / relative_path
|
|
154
|
+
for relative_path in managed_relative_paths
|
|
155
|
+
if relative_path.parts[:1] == ("rules",) and (codex_dir / relative_path).exists()
|
|
156
|
+
]
|
|
157
|
+
skill_paths = [
|
|
158
|
+
codex_dir / relative_path
|
|
159
|
+
for relative_path in managed_relative_paths
|
|
160
|
+
if relative_path.parts[:1] == ("skills",) and (codex_dir / relative_path).exists()
|
|
161
|
+
]
|
|
145
162
|
had_work = False
|
|
146
163
|
all_ok = True
|
|
147
164
|
|
|
148
|
-
|
|
165
|
+
for rules_path in rule_paths:
|
|
149
166
|
had_work = True
|
|
150
167
|
if dry_run:
|
|
151
168
|
print_info(f"[dry-run] Would remove {rules_path}")
|
|
@@ -157,7 +174,7 @@ def _remove_codex_artifacts(dry_run: bool) -> bool:
|
|
|
157
174
|
print_warning(f"Could not remove {rules_path} — skipping.")
|
|
158
175
|
all_ok = False
|
|
159
176
|
|
|
160
|
-
|
|
177
|
+
for skills_path in skill_paths:
|
|
161
178
|
had_work = True
|
|
162
179
|
if dry_run:
|
|
163
180
|
print_info(f"[dry-run] Would remove {skills_path}/")
|
|
@@ -430,9 +447,14 @@ def uninstall(
|
|
|
430
447
|
except (json.JSONDecodeError, OSError):
|
|
431
448
|
targets.append(f"OpenCode MCP config ({opencode_config} — may be malformed)")
|
|
432
449
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
450
|
+
codex_dir = Path.home() / ".codex"
|
|
451
|
+
try:
|
|
452
|
+
with resolve_packaged_codex_assets() as assets:
|
|
453
|
+
managed_relative_paths = set(assets.managed_relative_install_paths)
|
|
454
|
+
except FileNotFoundError:
|
|
455
|
+
managed_relative_paths = {Path("rules") / CODEX_RULE_FILENAME}
|
|
456
|
+
managed_relative_paths.add(Path("skills") / "ouroboros")
|
|
457
|
+
if any((codex_dir / relative_path).exists() for relative_path in managed_relative_paths):
|
|
436
458
|
targets.append("Codex rules and skills (~/.codex/)")
|
|
437
459
|
|
|
438
460
|
cwd = Path.cwd()
|
|
@@ -16,6 +16,7 @@ import typer
|
|
|
16
16
|
from ouroboros import __version__
|
|
17
17
|
from ouroboros.cli.commands import (
|
|
18
18
|
cancel,
|
|
19
|
+
codex,
|
|
19
20
|
config,
|
|
20
21
|
detect,
|
|
21
22
|
init,
|
|
@@ -44,6 +45,7 @@ app.add_typer(run.app, name="run")
|
|
|
44
45
|
app.add_typer(config.app, name="config")
|
|
45
46
|
app.add_typer(status.app, name="status")
|
|
46
47
|
app.add_typer(cancel.app, name="cancel")
|
|
48
|
+
app.add_typer(codex.app, name="codex")
|
|
47
49
|
app.add_typer(mcp.app, name="mcp")
|
|
48
50
|
app.add_typer(setup.app, name="setup")
|
|
49
51
|
app.add_typer(detect.app, name="detect")
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
from ouroboros.codex.artifacts import (
|
|
4
4
|
CODEX_RULE_FILENAME,
|
|
5
5
|
CODEX_SKILL_NAMESPACE,
|
|
6
|
+
CodexArtifactInstallResult,
|
|
6
7
|
CodexManagedArtifact,
|
|
7
8
|
CodexPackagedAssets,
|
|
8
9
|
CodexPackagedSkill,
|
|
10
|
+
install_codex_artifacts,
|
|
9
11
|
install_codex_rules,
|
|
10
12
|
install_codex_skills,
|
|
11
13
|
load_packaged_codex_rules,
|
|
@@ -16,10 +18,12 @@ from ouroboros.codex.artifacts import (
|
|
|
16
18
|
|
|
17
19
|
__all__ = [
|
|
18
20
|
"CodexManagedArtifact",
|
|
21
|
+
"CodexArtifactInstallResult",
|
|
19
22
|
"CodexPackagedAssets",
|
|
20
23
|
"CodexPackagedSkill",
|
|
21
24
|
"CODEX_RULE_FILENAME",
|
|
22
25
|
"CODEX_SKILL_NAMESPACE",
|
|
26
|
+
"install_codex_artifacts",
|
|
23
27
|
"install_codex_rules",
|
|
24
28
|
"install_codex_skills",
|
|
25
29
|
"load_packaged_codex_skill",
|
|
@@ -45,6 +45,14 @@ class CodexManagedArtifact:
|
|
|
45
45
|
relative_install_path: Path
|
|
46
46
|
|
|
47
47
|
|
|
48
|
+
@dataclass(frozen=True, slots=True)
|
|
49
|
+
class CodexArtifactInstallResult:
|
|
50
|
+
"""Installed Codex artifact paths produced by an artifact refresh."""
|
|
51
|
+
|
|
52
|
+
rules_path: Path
|
|
53
|
+
skill_paths: tuple[Path, ...]
|
|
54
|
+
|
|
55
|
+
|
|
48
56
|
@dataclass(frozen=True, slots=True)
|
|
49
57
|
class CodexPackagedAssets:
|
|
50
58
|
"""Resolved packaged skills and the matching Codex rule assets."""
|
|
@@ -374,12 +382,29 @@ def install_codex_skills(
|
|
|
374
382
|
return tuple(installed_paths)
|
|
375
383
|
|
|
376
384
|
|
|
385
|
+
def install_codex_artifacts(
|
|
386
|
+
*,
|
|
387
|
+
codex_dir: str | Path | None = None,
|
|
388
|
+
prune: bool = True,
|
|
389
|
+
) -> CodexArtifactInstallResult:
|
|
390
|
+
"""Install or refresh all packaged Ouroboros Codex artifacts.
|
|
391
|
+
|
|
392
|
+
This intentionally only touches managed Codex rules and skills. It does
|
|
393
|
+
not read or write ``~/.codex/config.toml`` or ``~/.ouroboros/config.yaml``.
|
|
394
|
+
"""
|
|
395
|
+
rules_path = install_codex_rules(codex_dir=codex_dir, prune=prune)
|
|
396
|
+
skill_paths = install_codex_skills(codex_dir=codex_dir, prune=prune)
|
|
397
|
+
return CodexArtifactInstallResult(rules_path=rules_path, skill_paths=skill_paths)
|
|
398
|
+
|
|
399
|
+
|
|
377
400
|
__all__ = [
|
|
401
|
+
"CodexArtifactInstallResult",
|
|
378
402
|
"CodexManagedArtifact",
|
|
379
403
|
"CodexPackagedAssets",
|
|
380
404
|
"CodexPackagedSkill",
|
|
381
405
|
"CODEX_RULE_FILENAME",
|
|
382
406
|
"CODEX_SKILL_NAMESPACE",
|
|
407
|
+
"install_codex_artifacts",
|
|
383
408
|
"install_codex_rules",
|
|
384
409
|
"install_codex_skills",
|
|
385
410
|
"load_packaged_codex_skill",
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Unit tests for Codex integration helper commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from unittest.mock import patch
|
|
7
|
+
|
|
8
|
+
from typer.testing import CliRunner
|
|
9
|
+
|
|
10
|
+
from ouroboros.cli.commands.codex import app
|
|
11
|
+
from ouroboros.codex import CodexArtifactInstallResult
|
|
12
|
+
|
|
13
|
+
runner = CliRunner()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TestCodexRefresh:
|
|
17
|
+
"""Tests for `ouroboros codex refresh`."""
|
|
18
|
+
|
|
19
|
+
def test_refresh_installs_rules_and_skills_without_config_files(self, tmp_path: Path) -> None:
|
|
20
|
+
rules_path = tmp_path / ".codex" / "rules" / "ouroboros.md"
|
|
21
|
+
skill_paths = (
|
|
22
|
+
tmp_path / ".codex" / "skills" / "ouroboros-interview",
|
|
23
|
+
tmp_path / ".codex" / "skills" / "ouroboros-run",
|
|
24
|
+
)
|
|
25
|
+
result = CodexArtifactInstallResult(rules_path=rules_path, skill_paths=skill_paths)
|
|
26
|
+
|
|
27
|
+
with (
|
|
28
|
+
patch("pathlib.Path.home", return_value=tmp_path),
|
|
29
|
+
patch(
|
|
30
|
+
"ouroboros.cli.commands.codex.install_codex_artifacts", return_value=result
|
|
31
|
+
) as mock_install,
|
|
32
|
+
):
|
|
33
|
+
cli_result = runner.invoke(app, ["refresh"])
|
|
34
|
+
|
|
35
|
+
assert cli_result.exit_code == 0
|
|
36
|
+
mock_install.assert_called_once_with(codex_dir=tmp_path / ".codex", prune=False)
|
|
37
|
+
assert "Installed Codex rules" in cli_result.output
|
|
38
|
+
assert "Installed 2 Codex skills" in cli_result.output
|
|
39
|
+
assert not (tmp_path / ".codex" / "config.toml").exists()
|
|
40
|
+
assert not (tmp_path / ".ouroboros" / "config.yaml").exists()
|
|
@@ -21,6 +21,7 @@ from ouroboros.cli.commands.setup import (
|
|
|
21
21
|
_scan_and_register_repos,
|
|
22
22
|
_set_default_repo,
|
|
23
23
|
)
|
|
24
|
+
from ouroboros.codex import CodexArtifactInstallResult
|
|
24
25
|
|
|
25
26
|
# ── Codex setup tests ────────────────────────────────────────────
|
|
26
27
|
|
|
@@ -84,21 +85,91 @@ class TestCodexSetup:
|
|
|
84
85
|
assert 'OUROBOROS_LLM_BACKEND = "codex"' in contents
|
|
85
86
|
assert "tool_timeout_sec" not in contents
|
|
86
87
|
|
|
88
|
+
def test_register_codex_mcp_server_preserves_url_config_by_default(
|
|
89
|
+
self,
|
|
90
|
+
tmp_path: Path,
|
|
91
|
+
) -> None:
|
|
92
|
+
"""URL-based Codex MCP configs are user-managed and preserved in auto mode."""
|
|
93
|
+
codex_config = tmp_path / ".codex" / "config.toml"
|
|
94
|
+
codex_config.parent.mkdir(parents=True)
|
|
95
|
+
codex_config.write_text(
|
|
96
|
+
'[mcp_servers.ouroboros]\nurl = "http://127.0.0.1:12000/mcp"\n',
|
|
97
|
+
encoding="utf-8",
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
with patch("pathlib.Path.home", return_value=tmp_path):
|
|
101
|
+
setup_cmd._register_codex_mcp_server()
|
|
102
|
+
|
|
103
|
+
contents = codex_config.read_text(encoding="utf-8")
|
|
104
|
+
assert 'url = "http://127.0.0.1:12000/mcp"' in contents
|
|
105
|
+
assert 'command = "uvx"' not in contents
|
|
106
|
+
assert "[mcp_servers.ouroboros.env]" not in contents
|
|
107
|
+
|
|
108
|
+
def test_register_codex_mcp_server_preserves_custom_command_by_default(
|
|
109
|
+
self,
|
|
110
|
+
tmp_path: Path,
|
|
111
|
+
) -> None:
|
|
112
|
+
"""Custom command-based Codex MCP configs are preserved in auto mode."""
|
|
113
|
+
codex_config = tmp_path / ".codex" / "config.toml"
|
|
114
|
+
codex_config.parent.mkdir(parents=True)
|
|
115
|
+
codex_config.write_text(
|
|
116
|
+
"[mcp_servers.ouroboros]\n"
|
|
117
|
+
'command = "/tmp/ouroboros/.venv/bin/ouroboros"\n'
|
|
118
|
+
'args = ["mcp", "serve"]\n',
|
|
119
|
+
encoding="utf-8",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
with patch("pathlib.Path.home", return_value=tmp_path):
|
|
123
|
+
setup_cmd._register_codex_mcp_server()
|
|
124
|
+
|
|
125
|
+
contents = codex_config.read_text(encoding="utf-8")
|
|
126
|
+
assert 'command = "/tmp/ouroboros/.venv/bin/ouroboros"' in contents
|
|
127
|
+
assert 'command = "uvx"' not in contents
|
|
128
|
+
|
|
129
|
+
def test_register_codex_mcp_server_stdio_mode_replaces_url_config(
|
|
130
|
+
self,
|
|
131
|
+
tmp_path: Path,
|
|
132
|
+
) -> None:
|
|
133
|
+
"""Explicit stdio mode replaces a user-managed URL config."""
|
|
134
|
+
codex_config = tmp_path / ".codex" / "config.toml"
|
|
135
|
+
codex_config.parent.mkdir(parents=True)
|
|
136
|
+
codex_config.write_text(
|
|
137
|
+
'[mcp_servers.ouroboros]\nurl = "http://127.0.0.1:12000/mcp"\n',
|
|
138
|
+
encoding="utf-8",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
with patch("pathlib.Path.home", return_value=tmp_path):
|
|
142
|
+
setup_cmd._register_codex_mcp_server(mode="stdio")
|
|
143
|
+
|
|
144
|
+
contents = codex_config.read_text(encoding="utf-8")
|
|
145
|
+
assert 'url = "http://127.0.0.1:12000/mcp"' not in contents
|
|
146
|
+
assert 'command = "uvx"' in contents
|
|
147
|
+
assert "[mcp_servers.ouroboros.env]" in contents
|
|
148
|
+
|
|
149
|
+
def test_register_codex_mcp_server_preserve_mode_does_not_create_config(
|
|
150
|
+
self,
|
|
151
|
+
tmp_path: Path,
|
|
152
|
+
) -> None:
|
|
153
|
+
"""Preserve mode skips MCP config changes entirely."""
|
|
154
|
+
with patch("pathlib.Path.home", return_value=tmp_path):
|
|
155
|
+
setup_cmd._register_codex_mcp_server(mode="preserve")
|
|
156
|
+
|
|
157
|
+
assert not (tmp_path / ".codex" / "config.toml").exists()
|
|
158
|
+
|
|
87
159
|
def test_install_codex_artifacts_installs_rules_and_skills(self, tmp_path: Path) -> None:
|
|
88
160
|
"""Codex setup should install both managed rules and managed skills."""
|
|
89
161
|
rules_path = tmp_path / ".codex" / "rules"
|
|
90
162
|
skill_paths = [tmp_path / ".codex" / "skills" / "evaluate"]
|
|
163
|
+
result = CodexArtifactInstallResult(rules_path, tuple(skill_paths))
|
|
91
164
|
|
|
92
165
|
with (
|
|
93
166
|
patch("pathlib.Path.home", return_value=tmp_path),
|
|
94
|
-
patch("ouroboros.codex.
|
|
95
|
-
patch("ouroboros.codex.install_codex_skills", return_value=skill_paths) as mock_skills,
|
|
167
|
+
patch("ouroboros.codex.install_codex_artifacts", return_value=result) as mock_install,
|
|
96
168
|
patch("ouroboros.cli.commands.setup.print_success") as mock_success,
|
|
97
169
|
):
|
|
98
170
|
setup_cmd._install_codex_artifacts()
|
|
99
171
|
|
|
100
|
-
|
|
101
|
-
mock_skills.assert_called_once()
|
|
172
|
+
mock_install.assert_called_once()
|
|
102
173
|
success_messages = [call.args[0] for call in mock_success.call_args_list]
|
|
103
174
|
assert any("Installed Codex rules" in message for message in success_messages)
|
|
104
175
|
assert any("Installed 1 Codex skills" in message for message in success_messages)
|
|
@@ -128,7 +199,7 @@ class TestCodexSetup:
|
|
|
128
199
|
assert config_dict["orchestrator"]["codex_cli_path"] == "/usr/local/bin/codex"
|
|
129
200
|
assert config_dict["llm"]["backend"] == "codex"
|
|
130
201
|
mock_install.assert_called_once_with()
|
|
131
|
-
mock_register.assert_called_once_with()
|
|
202
|
+
mock_register.assert_called_once_with(mode="auto")
|
|
132
203
|
|
|
133
204
|
info_messages = [call.args[0] for call in mock_info.call_args_list]
|
|
134
205
|
assert any("Config saved to" in message for message in info_messages)
|
|
@@ -11,6 +11,7 @@ from typer.testing import CliRunner
|
|
|
11
11
|
from ouroboros.cli.commands.uninstall import (
|
|
12
12
|
_remove_claude_mcp,
|
|
13
13
|
_remove_claude_md_block,
|
|
14
|
+
_remove_codex_artifacts,
|
|
14
15
|
_remove_codex_mcp,
|
|
15
16
|
_remove_data_dir,
|
|
16
17
|
_remove_opencode_bridge_plugin,
|
|
@@ -192,6 +193,36 @@ class TestRemoveCodexMcp:
|
|
|
192
193
|
assert result is False
|
|
193
194
|
|
|
194
195
|
|
|
196
|
+
# ── _remove_codex_artifacts ──────────────────────────────────────
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class TestRemoveCodexArtifacts:
|
|
200
|
+
"""Tests for _remove_codex_artifacts helper."""
|
|
201
|
+
|
|
202
|
+
def test_removes_namespaced_codex_artifacts(self, tmp_path: Path) -> None:
|
|
203
|
+
rules_dir = tmp_path / ".codex" / "rules"
|
|
204
|
+
skills_dir = tmp_path / ".codex" / "skills"
|
|
205
|
+
rules_dir.mkdir(parents=True)
|
|
206
|
+
skills_dir.mkdir(parents=True)
|
|
207
|
+
(rules_dir / "ouroboros.md").write_text("rules", encoding="utf-8")
|
|
208
|
+
(rules_dir / "ouroboros-extra.md").write_text("extra", encoding="utf-8")
|
|
209
|
+
(rules_dir / "other.md").write_text("other", encoding="utf-8")
|
|
210
|
+
(skills_dir / "ouroboros-interview").mkdir()
|
|
211
|
+
(skills_dir / "ouroboros-run").mkdir()
|
|
212
|
+
(skills_dir / "other").mkdir()
|
|
213
|
+
|
|
214
|
+
with patch("pathlib.Path.home", return_value=tmp_path):
|
|
215
|
+
result = _remove_codex_artifacts(dry_run=False)
|
|
216
|
+
|
|
217
|
+
assert result is True
|
|
218
|
+
assert not (rules_dir / "ouroboros.md").exists()
|
|
219
|
+
assert (rules_dir / "ouroboros-extra.md").exists()
|
|
220
|
+
assert (rules_dir / "other.md").exists()
|
|
221
|
+
assert not (skills_dir / "ouroboros-interview").exists()
|
|
222
|
+
assert not (skills_dir / "ouroboros-run").exists()
|
|
223
|
+
assert (skills_dir / "other").exists()
|
|
224
|
+
|
|
225
|
+
|
|
195
226
|
# ── _remove_claude_md_block ──────────────────────────────────────
|
|
196
227
|
|
|
197
228
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|